blueblasterz Posté(e) le 22 décembre 2016 Posté(e) le 22 décembre 2016 Bonjour, Aujourd'hui un code pas du tout opti, pas pratique à utiliser et qui spamme à mort la console, MAIS qui permet de tracer des cercles parfaits (dans la limite de minecraft hein ;) ). Ce code se sert en fait du joueur comme d'un compas: - le joueur se place PILE au centre d'un bloc (à l'aide d'un tp avec des coordonnées précises) - il lance une commande avec pas mal d'arguments , et après avoir trouvé automatiquement l'angle de vue correspondant à un rayon donné, le skript fait tourner le joueur sur lui même et change les blocs qu'il regarde pour former un cercle [spoiler=Mes recherches/ problèmes pour ce skript :3 + explications un peu plus détaillées] - c'est mieux expliqué dans les commentaires du skript, voici un schéma qui représente mes recherches, au propre : [ATTACH=full]4207[/ATTACH] Au début, facile ! Je me dit qu'il suffit de calculer cet angle de vue, comme ça on fait en sorte que le joueur ai cet angle de vue, on le fait tourner sur lui même, et puis finis. SEULEMENT, pour calculer cet angle il faut utiliser la fonction arctangente, ou tangente-1. Elle est présente dans skQuery, mais d'une part le défi c'est de le faire sans addons, et d'autre par... ELLE MARCHE PAS D': (en tout cas chez moi). Donc j'ai réfléchis, intensément, et finalement j'ai trouvé la solution: Au début de la commande, le joueur regarde ses pieds, et puis lentement il se redresse. à chaque fois qu'il se redresse un peu, on regarde la position du bloc qu'il observe. On la compare à celle d'un bloc qui devra être sur le cercle. Si la distance entre ces deux positions est inférieure à 1, ça veux dire que ce sont les mêmes, donc que le joueur regarde bien le cercle, donc magnifique, on a trouvé cet angle de vue :D (Merci à ceux qui auront lu toutes ces explications un peu nulles jusqu'au bout x) ) A partir de ça j'ai rajouté plusieurs arguments à la commande, qui sont expliqués dans les commentaires du skript, pour faciliter (et raccourcir) la tâche aux joueurs, et voilà :D On a des résultats plutôt bien réussis, quelques bugs parfois quand le rayon est trop grand (les chunks sont pas générés/trop petite render distance). D'ailleurs si vous comptez faire des cercles de plus (ou égal) de 100 blocs, il faut modifier la config de skript, car par défaut les "targeted block" ne fonctionnent que pour moins de 100 blocs. [spoiler=Résultats avec un rayon de 50 et de 100][ATTACH=full]4208[/ATTACH] J'espère que ça avait pas déjà été fait, mais je crois pas (en tout cas pas sur skript-mc.fr), surtout que je n'ai utilisé au final que skript et aucun autre addon. Dites moi dans les commentaires si vous avez des conseils pour optimiser ou rendre plus utile mon code, si vous avez des questions etc... Voilà voilà :p [spoiler=Le code] # Créer un cerle en cubes avec RIEN QUE SKRIPT (et peut être skQuery, si c'est pas précisé dans le topic :3)[/color][/color] [color=#000066][color=#808080]# # by blueblasterz function targetPos(p: text , w: world , i: text) :: location: execute console command "tp @e[type=Player] ~ ~ ~ ~ ~-%{_i}%" execute console command "gettarget %{_p}%" return {cercle.pos} on rightclick with stick: # juste pour vérifier la distance entre centre et une extremité. Je laisse pour que vous puissiez aussi if name of player's tool is "Distance": cancel event set {dist.pos1} to location of clicked block message "" message "&61ere position => &a%location of clicked block%" message "&6Distance : &a%distance between {dist.pos1} and {dist.pos2}%" on leftclick with stick: if name of player's tool is "Distance": cancel event set {dist.pos2} to location of clicked block message "" message "&62eme position => &a%location of clicked block%" message "&6Distance : &a%distance between {dist.pos1} and {dist.pos2}%" command /gettarget <player>: trigger: # message "gettarget" set {cercle.pos} to location of arg's targeted block command /cercle points = <integer> rayon = <number> bloc = <material> [force yaw = <number>] [base yaw = <number>] [yaw increment = <text>]: trigger: execute console command "tp @e[type=Player] ~ ~ ~ 0 90" set {_pts} to arg 1 set {_yaw} to 360/arg 1 set {_rayon} to arg 2 # set {_x} to ({_rayon}/1.62) # faites un dessin, si vous connaissez un minimum sin/cos/tan/arcsin... et leurs applications dans un triangle rectangle, vous comprendrez # message "x = %{_x}%" # en gros 1.62 c'est la distance sol/oeil du joueur. rayon c'est le rayon donné. et pour finir le triangle rectangle, l'hypoténuse c'est le segment entre: les yeux du joueur et le bout d'un segment d'un longueur {_rayon} partant des pieds du joueur # set {_atnX} to arc tan {_x} # et avec cette formule normalement on calcul l'angle avec lequel le joueur regarde le sol. Et comme le joueur est bien placé AU CENTRE du bloc, si il tourne sur lui même il regarde toujours le cercle # message "atn x = %{_atnX}%" # en fait on se sert du joueur comme d'un compas # MALHEUREUSEMENT, la fonction arc tan {_x} de SkQuery ne fonctionne pas, ou alors je m'en sert mal (dites moi en coms si vous voyez une erreur) # DU COUP, le code après c'est du bidouillage, en gros au début le joueur regarde ses pieds, puis il se redresse TRES LENTEMENT, # et dès que le bloc qu'il regarde est à une distance 0 du bloc censé représenter le bout du segment dont on a parlé plus haut, # ça veut dire que le joueur regarde pile le cercle # après on le fait simplement tourner sur lui même pour remplacer tout les blocs qu'il regarde par un certain bloc # c'est très basique, ça ne prend pas en compte les reliefs du terrain, ou si on veut le construire dans les aires etc... # mais à mon goût l'essentiel est là. # points = le nombre de fois qu'on s'arrete pour changer le bloc observé pendant que le joueur tourne sur lui même. Sachant qu'il tourne presque instantanement, je met toujours de très grandes valeurs (1000/2000 pas plus tout de même) # rayon = le rayon du cercle, même si il arrive (mais pas toujours) qu'il soit de 1 plus grand # bloc = le bloc à utiliser # force yaw = à mettre que si on ne veux pas que le joueur se redresse lentement mais observe directement un certain bloc # base yaw = à mettre si on veut que le joueur se redresse lentement mais à partir en s'étant déjà un peu relevé : utile pour les grands rayons (sinon c'est trèèèès long :3) # yaw increment = par défaut 0.0035, c'est la vitesse avec laquelle le joueur se redresse. Cette valeur DOIT être baissée si le rayon est grand, pour plus de précision (sinon la boucle while de redressement peut sauter LE bloc où il fallait qu'il s'arrete, donc crash) # # ... je me rend compte que je devrai remplacer presque tout les yaw par pitch, car yaw c'est horizontal, mais j'ai la flemme :D set {_pos} to location of player set {_pos1} to location at x-pos of {_pos}, y-pos of {_pos}, z-pos of {_pos}+arg 2 + 2 in player's world set {_pos2} to location of targeted block # message "distance %round distance between {_pos2} and {_pos1}% is? equal to rayon %{_rayon}%" if arg 5 is set: execute console command "tp @e[type=Player] ~ ~ ~ 0 %arg 5%" # base yaw if arg 4 is not set: while round distance between {_pos2} and {_pos1} is not equal to 1: # et pas 0, car la pos du joueur est 1 au dessus du sol tandis que le bloc visé est DANS le sol # message "distance between target block and rayon +2 - %round distance between {_pos2} and {_pos1}% - is not equal to 1" if arg 6 is set: set {_pos2} to targetPos("%player%", player's world, arg 6) # obligé de recourir à des fonctions+commandes, car sinon la "target block" du joueur reste le même MEME quand le joueur bouge (merci skript... :3) else: set {_pos2} to targetPos("%player%", player's world, "0.0035") #au dessus c'etait avec yaw increment qui était set, ici c'est la valeur par défaut add 1 to {_i} if {_i} is greater than 90000: # bon ça c'est utopique, et de toutes façon on s'en rend bien compte quand ça a foiré, et perso j'ai souvent la flemme d'attendre, je préfere relancer le serveur :3 message "trop de test : {_i} = %{_i}%" stop else: execute console command "tp @e[type=Player] ~ ~ ~ 0 %arg 4%" # force yaw est set loop {_pts} times: # on loop le nombre de points execute console command "tp @e[type=Player] ~ ~ ~ ~%{_yaw}% ~" # on fait tourner lentement le joueur sur lui même (seule bonne utilisation du mot "yaw") execute player command "/settargetblock %arg 3%" # obligé de passer par commandes, blablabla target bloc change pas, blablabla wait 0.1 tick # pour éviter un trop gros lag (et puis c'est plus stylé que de tourner d'un coup sec et moche) command /settargetblock <material>: trigger: set target block to arg #blablabla [spoiler=Le code] 2
Buttkill Posté(e) le 23 décembre 2016 Posté(e) le 23 décembre 2016 Très bon skript mais pour se qui son en 1.7.10 sa ne marchera pas
Anarchick Posté(e) le 4 mai 2017 Posté(e) le 4 mai 2017 et si tu t'inspirai de ça ... command /particle_circle <number=1> <number=1>: usage: /particle_circle [division] [diametre] trigger: set {_var1} to 0 loop 1+ 360/arg-1 times: set {_px1} to arg-2*cos ({_var1}*3.14/180) set {_pz1} to arg-2*sin ({_var1}*3.14/180) execute console command "/execute @a[name=%player%] ~ ~ ~ /particle fireworksSpark ~%{_px1}% ~1.62 ~%{_pz1}% 0 0 0 1 0 force" add arg-1 to {_var1} #wait a tick
blueblasterz Posté(e) le 7 mai 2017 Auteur Posté(e) le 7 mai 2017 et si tu t'inspirai de ça ... command /particle_circle <number=1> <number=1>: usage: /particle_circle [division] [diametre] trigger: set {_var1} to 0 loop 1+ 360/arg-1 times: set {_px1} to arg-2*cos ({_var1}*3.14/180) set {_pz1} to arg-2*sin ({_var1}*3.14/180) execute console command "/execute @a[name=%player%] ~ ~ ~ /particle fireworksSpark ~%{_px1}% ~1.62 ~%{_pz1}% 0 0 0 1 0 force" add arg-1 to {_var1} #wait a tick Le but principal de mon code est de faire un cercle sans aucun addon en plus de Skript. Je ne cherchais donc pas à faire quelque chose d'optimisé, mais bien à montrer qu'il est possible de faire plein de choses via Skript, sans aucun addon. Ton code est donc intéressent (et bien plus opti que le miens) mais ne correspond pas à ce que je cherchais à faire ;)
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant