Liock 3 Posté : 31 mars 2020 Version de Minecraft : 1.15.2 Version de Skript : 2.4.1 Addons utilisés: Skelett & SkQuery Type du skript : Script de commandes successives avec annulation d'événements en cas de déconnexion du joueur cible. Description du script : Bonjour, Étant actuellement au développement d'un serveur jeu de rôle Minecraft, je me permets aujourd'hui de solliciter de l'aide sur ce forum en ce qui concerne la réalisation d'un script, sur lequel je rencontre un souci en particulier. Je m'explique. Ce script a pour objectif de faire s'exécuter plusieurs commandes pour notamment emprisonner le joueur cible (défini tel que « arg-1 »), ainsi que de lui affecter plusieurs effets de potion, textes... Ayant effectué plusieurs essais - notamment avec quelques cobayes car je suis un peu sadique - je me suis aperçu par la suite que les commandes s'exécutaient même après la déconnexion du joueur. Ainsi, lorsque ce dernier revient sur le serveur, les événements reliés à la commande s'affectent toujours sur ce dernier. À l'issue de nombreuses recherche effectuées, et plusieurs tests orchestrés, je constate malencontreusement que malgré tous mes essais, je ne parviens pas à empêcher ces mêmes commandes de s'exécuter après déco / reco. Voici le script en question : Contenu masqué Réagissez ou répondez à ce message afin de consulter le contenu masqué. Ici, j'ai voulu tenter d'assigner la donnée {malus.%arg 1%} en true si le joueur ne se déconnecte pas, ce qui permet aux commandes suivantes d'avoir lieu. Si le joueur se déconnecte, et revient lors de « on join », je souhaiterai alors que la donnée en question puisse me permettre de faire s'exécuter les commandes présentes à partir de « execute console command "/mv tp %player% world" » pour faire cesser le /malus. Je précise au passage que j'ai débuté Skript il y a de cela quelques jours seulement. J'émets ici cette requête du fait simple que je risque d'avoir à me servir de ce type de commande de manière assez régulière, et afin d'empêcher tout abus ou bug de la part des joueurs, il me faudrait être en mesure de corriger ce code. Je remercie d'avance toute personne pouvant éventuellement m'assister dans cette démarche. Partager ce message Lien à poster Partager sur d’autres sites
Invité Répondu : 31 mars 2020 Utilise on quit pour enlever tout ses malus peut-être ? Genre il se déco, tu enlèves ses malus, tu lui set une variable (car si je comprend tu veux le tp à sa déconnexion) là où il déco et tu le retp au on join Partager ce message Lien à poster Partager sur d’autres sites
Liock 3 Répondu : 31 mars 2020 (modifié) il y a 32 minutes, KneaXy a dit : Utilise on quit pour enlever tout ses malus peut-être ? Genre il se déco, tu enlèves ses malus, tu lui set une variable (car si je comprend tu veux le tp à sa déconnexion) là où il déco et tu le retp au on join Il me semble que c'est ce que j'ai fait, ou du moins ce que j'ai voulu faire pour le coup ^^ Sauf si je ne comprends pas dans ce cas-là, sinon oui c'est très exactement ce que je souhaite. Il faut juste que je parvienne à trouver le moyen d'annuler les malus en cas de déconnexion, chose que je ne parviens toujours pas à faire. J'ai tenté plusieurs combinaisons de variables pour faire fonctionner ce système, en vain. Si j'ai bien tout compris, mon {malus.%arg-1%} sur la commande /malus "prison" "joueur" se transforme en {malus.%player%} sur le "on quit:", du fait qu'il soit impossible de mettre %arg-1% à la place (ce que j'avais d'ailleurs essayé de faire hier par plusieurs moyens, là aussi sans succès). Lorsque qu'actuellement je tape la commande, les variables {malus...} ne semblent pas s'appliquer, ou du moins, je dois justement ne pas les avoir configurées correctement étant donné qu'en revenant sur le serveur suite à ma déconnexion (ou celle d'un cobaye), je subit encore les effets de potion, les éclairs et la téléportation en prison. Modifié 31 mars 2020 par Liock Partager ce message Lien à poster Partager sur d’autres sites
Invité Répondu : 31 mars 2020 il y a 55 minutes, Liock a dit : Il me semble que c'est ce que j'ai fait, ou du moins ce que j'ai voulu faire pour le coup ^^ Sauf si je ne comprends pas dans ce cas-là, sinon oui c'est très exactement ce que je souhaite. Il faut juste que je parvienne à trouver le moyen d'annuler les malus en cas de déconnexion, chose que je ne parviens toujours pas à faire. J'ai tenté plusieurs combinaisons de variables pour faire fonctionner ce système, en vain. Si j'ai bien tout compris, mon {malus.%arg-1%} sur la commande /malus "prison" "joueur" se transforme en {malus.%player%} sur le "on quit:", du fait qu'il soit impossible de mettre %arg-1% à la place (ce que j'avais d'ailleurs essayé de faire hier par plusieurs moyens, là aussi sans succès). Lorsque qu'actuellement je tape la commande, les variables {malus...} ne semblent pas s'appliquer, ou du moins, je dois justement ne pas les avoir configurées correctement étant donné qu'en revenant sur le serveur suite à ma déconnexion (ou celle d'un cobaye), je subit encore les effets de potion, les éclairs et la téléportation en prison. T'sais quoi Explique-moi un malus que tu veux faire, et je verrai avec toi pour le recoder Partager ce message Lien à poster Partager sur d’autres sites
Liock 3 Répondu : 31 mars 2020 (modifié) il y a 57 minutes, KneaXy a dit : T'sais quoi Explique-moi un malus que tu veux faire, et je verrai avec toi pour le recoder C'est sympa, merci pour dédier de ton temps pour aider Quand j'exécute la commande /malus prison, le joueur subit des textes et jusqu'à là tout va bien, se téléporte en prison. J'avais trouvé un moyen d'assigner un code qui permettait de sauvegarder l'inventaire du joueur sélectionné, avant de le lui enlever lorsqu'il se fait téléporter en prison (prison qui se trouve dans un autre monde, du nom de « parcelle », je l'indique juste au cas où ça puisse avoir une quelconque importance pour permettre à mon code d'être achevé). En faisant tester le code à un joueur qui s'est déconnecté, je me suis aperçu que si ce dernier se déconnectait avant que l'inventaire lui soit enlevé, ce dernier apparaît dans la cellule avec celui-ci. Et j'ai bien peur (même si je n'en suis pas encore sûr, il faudra que je teste) que des risques de perte d'inventaire définitive soient présents si le joueur en question se déconnecte après que son inventaire lui ait été supprimé. Pour éviter tout ce mélange confus, et quand-bien même pour éviter à ce que le joueur perdre des « parties du scénario », donc des textes qui, comme on peut le voir se jouent au bout de quelques ticks de manière successive. Ce que je nomme « malus », c'est en fait cette succession de commandes, sur cette partie là tout fonctionne à merveille, c'est vrai que je me suis sans-doute mal exprimé, j'aurais pu appeler la commande « /script » ou « /scenario ». Je ne sais pas exactement si nous sommes sur la même longueur d'ondes, car il est vrai qu'il est possible que mes explications puissent prêter à confusion. Contenu masqué Réagissez ou répondez à ce message afin de consulter le contenu masqué. J'ai un peu modifié le code pour ajouter des indicateurs "(Test)" En ce qui concerne la commande en elle-même (sachant que je ne me base actuellement que sur le « prison » et non pas sur l'autre commande « danger »). Contenu masqué Réagissez ou répondez à ce message afin de consulter le contenu masqué. Je vais essayer de traficoter encore le code, je suis allé revoir d'autre forums qui parlaient de sujets d'annuler des commandes / actions en cas de mouvement du joueur, moi, c'est juste en cas de déconnexion que ça gêne. Si ça peut aider, je peux plus ou moins comparer ce que je souhaite faire à un mini-jeu dans lequel un joueur serait plongé via une commande qu'on exécuterait "/minijeu prison (joueur)", les effets de potion & textes étant le jeu (un peu sadique comme jeu quand-même), et si le joueur s'en va en pleine partie, il est de nouveau téléporté à son monde d'origine et le mini-jeu s'annule comme si rien ne s'était produit. Navré si je ne suis plus très clair, si tu n'as pas compris certaines choses je pourrais tenter de réexpliquer ça plus simplement. Mais en l'état actuel ça va faire deux jours que je dédie pas mal de temps à tenter de trouver réponse à ce code, et j'ai le sentiment que mon erreur est toute bête, et qu'il ne me manque plus que quelques éclaircissements pour parvenir à le terminer et semer la terreur sur le serveur, ahah. Modifié 31 mars 2020 par Liock Partager ce message Lien à poster Partager sur d’autres sites
Invité Répondu : 31 mars 2020 Tout ce que tu veux en gros » Sauvegarder / position du joueur avant emprisonnements » TP le joueur en prison » Re TP le joueur a sa position précédente et faire revenir son inventaire (sortie de prison) C'est ça ? En gros gros gros xD Partager ce message Lien à poster Partager sur d’autres sites
Liock 3 Répondu : 31 mars 2020 il y a 45 minutes, KneaXy a dit : Tout ce que tu veux en gros » Sauvegarder / position du joueur avant emprisonnements » TP le joueur en prison » Re TP le joueur a sa position précédente et faire revenir son inventaire (sortie de prison) C'est ça ? En gros gros gros xD Oui, et tout ce code fonctionne à merveille. Et du coup j'aimerais faire en sorte d'annuler tout ça si le joueur ciblé se déconnecte pendant que ça a lieu, de téléporter le joueur dans un autre endroit (le monde « world ») et d'empêcher toutes ces commandes de s'exécuter. À chaque fois que moi ou un cobaye (ah, oui, j'aime les cobayes !) se reconnecte, ça continue, et je souhaite justement éviter ça. Partager ce message Lien à poster Partager sur d’autres sites
Invité Répondu : 31 mars 2020 il y a 57 minutes, Liock a dit : Oui, et tout ce code fonctionne à merveille. Et du coup j'aimerais faire en sorte d'annuler tout ça si le joueur ciblé se déconnecte pendant que ça a lieu, de téléporter le joueur dans un autre endroit (le monde « world ») et d'empêcher toutes ces commandes de s'exécuter. À chaque fois que moi ou un cobaye (ah, oui, j'aime les cobayes !) se reconnecte, ça continue, et je souhaite justement éviter ça. Ok j'ai juste à faire un code qui fonctionne comme si le joueur est en prison lors d'un déco/reco même s'il ne sera pas en prison... Au pire tu le retp en prison tkt demain enfin ajd jte fais un code et ça c'est mashallah Partager ce message Lien à poster Partager sur d’autres sites
Invité Répondu : 1 avril 2020 command /prison [<offline player>]: permission: cquetuveux.sk permission message: encore ce que tu veux trigger: arg-1 is set: arg-1 is online: set {inventory::%arg-1%} to serialized arg-1's inventory set {xp::%player%} to player's level set {helmet::%arg-1%} to arg-1's helmet #Fais pareil avec chestplate, leggings et boots set {position::%arg-1%} to arg-1's position teleport arg-1 to {variablePrison} clear the inventory of player send "&cTu as été mis en prison petit cobaye...!" if {prison::%arg-1%} doesn't exist: set {prison::%arg-1%} to true else: delete {prison::%arg-1%} teleport arg-1 to {variablePosition} set arg-1's helmet to {helmet::%arg-1%} #Fais pareil avec chestplate, leggings et boots restore inventory of arg-1 from {Inventaire::%arg-1%} set player's level to {xp::%player%} else: send "%arg-1% est déconnecté!" else: send "Entrez le pseudo d'un joueur connecté." on join: {prison::%player%} is set: wait a tick teleport player to {variablePrison} send "&cPetit malin... Tu pensais pouvoir t'échapper ?!" Mais si tu veux tout annuler on join: {prison::%player%} is set: wait a tick delete {prison::%arg-1%} teleport player to {Position::%player%} set player's helmet to {helmet::%arg-1%} #Fais pareil avec chestplate, leggings et boots restore inventory of player from {Inventaire::%player%} send "&cPetit malin... Tu as échappé à mon test...! Bravo petit cobaye" cc c'est moi J'espère que c'est ce que tu cherchais! Partager ce message Lien à poster Partager sur d’autres sites
Liock 3 Répondu : 1 avril 2020 il y a 58 minutes, KneaXy a dit : Contenu masqué Réagissez ou répondez à ce message afin de consulter le contenu masqué. cc c'est moi J'espère que c'est ce que tu cherchais! Re, Navré de la réponse tardive, j'ai été assez occupé aujourd'hui. C'est très sympa de ta part de t'être dévoué à refaire un code. Je vais le compléter de suite et voir si ça fonctionne pour voir si le sujet peut être ensuite mis en résolu. Encore merci ! Partager ce message Lien à poster Partager sur d’autres sites
Invité Répondu : 1 avril 2020 il y a 26 minutes, Liock a dit : Re, Navré de la réponse tardive, j'ai été assez occupé aujourd'hui. C'est très sympa de ta part de t'être dévoué à refaire un code. Je vais le compléter de suite et voir si ça fonctionne pour voir si le sujet peut être ensuite mis en résolu. Encore merci ! J'espère surtout que c'est le genre que tu recherches J'ai fais au plus court ^^ Je n'ai concentré que l'essentiel, tout le reste tu sauras faire je pense. Reviens quand tu veux si tu as encore besoin d'aide ! Partager ce message Lien à poster Partager sur d’autres sites
Liock 3 Répondu : 1 avril 2020 Ça semble fonctionner à merveille après plusieurs essais. Pour ceux qui seraient dans le même cas que moi je vais prendre le temps de mettre en ligne le code demain avec les explications qui vont avec : - ) Partager ce message Lien à poster Partager sur d’autres sites
Invité Répondu : 1 avril 2020 il y a 4 minutes, Liock a dit : Ça semble fonctionner à merveille après plusieurs essais. Pour ceux qui seraient dans le même cas que moi je vais prendre le temps de mettre en ligne le code demain avec les explications qui vont avec : - ) Nice fais un tuto au pire Partager ce message Lien à poster Partager sur d’autres sites
Liock 3 Répondu : 2 avril 2020 Je vais peut-être mettre un peu plus de temps avant de publier le code terminé, même si j'ai déjà eu quelques éclaircissements à ne pas ignorer avec ton code qui m'a été très utile. Je bloque juste sur la phase « annuler les événements présents dans une variable », car je cumule plusieurs commandes mais je pense bientôt pouvoir achever ce code. Et oui, j'en ferais sûrement un tutoriel une fois que cela sera terminé. Je ne vais pas te déranger plus longtemps et voir ce que je peux faire de mon côté. Merci encore. PS : Je n'ai malencontreusement pas vraiment de « code concret » à mettre en ligne pour l'heure qu'il est. Si quelqu'un rencontre le même souci que moi je ne peux que recommander le code de @KneaXy qui permet tout de même d'être plutôt bien avancé sur le problème. Partager ce message Lien à poster Partager sur d’autres sites
Invité Répondu : 2 avril 2020 (modifié) Il y a 3 heures, Liock a dit : Je vais peut-être mettre un peu plus de temps avant de publier le code terminé, même si j'ai déjà eu quelques éclaircissements à ne pas ignorer avec ton code qui m'a été très utile. Je bloque juste sur la phase « annuler les événements présents dans une variable », car je cumule plusieurs commandes mais je pense bientôt pouvoir achever ce code. Et oui, j'en ferais sûrement un tutoriel une fois que cela sera terminé. Je ne vais pas te déranger plus longtemps et voir ce que je peux faire de mon côté. Merci encore. PS : Je n'ai malencontreusement pas vraiment de « code concret » à mettre en ligne pour l'heure qu'il est. Si quelqu'un rencontre le même souci que moi je ne peux que recommander le code de @KneaXy qui permet tout de même d'être plutôt bien avancé sur le problème. Je suis là pour t'aider Sur quoi tu bloques ? A chaque reconnexion, tu fais vérifier la variable et après t'en fais ce que tu veux, je ne comprend pas ce que tu souhaites faire Mais dis ton problème plus précisemment, je t'aiderai! EDIT: tu peux utiliser une boucle infinie (while {var::%player%} is set), mais attention à ne pas faire lagger le Serveur, les whiles sont très susceptible de faire lag Modifié 2 avril 2020 par Invité Partager ce message Lien à poster Partager sur d’autres sites
Liock 3 Répondu : 2 avril 2020 (modifié) il y a une heure, KneaXy a dit : EDIT: tu peux utiliser une boucle infinie (while {var::%player%} is set), mais attention à ne pas faire lagger le Serveur, les whiles sont très susceptible de faire lag J'en ai entendu parler. Néanmoins j'aimerais éviter, du fait que beaucoup de mes codes vont devoir arborer la même mécanique, et qu'en vue d'une ouverture prochaine de mon serveur au grand public, je risque effectivement d'avoir des risques concernant les performances assez conséquents ^^ Déjà, la bonne nouvelle est qu'on semble se rapprocher d'une solution. Je vais parler du code qui semble fonctionner en ce qui concerne la mécanique de déco/reco en elle-même. Lorsque le joueur se déconnecte alors que le code /malus prison (joueur) est lancé, ce dernier est téléporté de nouveau dans le monde « world ». Le message « Petit malin... Tu as échappé à mon test...! Bravo petit cobaye » s'affiche. Le 01/04/2020 à 23:40, Liock a dit : Ça semble fonctionner à merveille après plusieurs essais Semi coup de tête de ma part, il était tard et effectivement j'ai constaté que cela fonctionnait. Le fait est, que le code fonctionne car le joueur se fait directement téléporter en prison, et que plus rien n'arrive après, les événements s'achèvent net. Il y a peu de commandes et j'ai effectivement manqué d'attention sur ce coup. Lorsque j'ai rajouté d'autres effets et événements, il s'est avéré que ces derniers survenaient même après la reconnexion du joueur, et se mélangeaient alors aux autres commandes qui elles avaient pour but de se lancer pour libérer le joueur et envoyer le message de libération (cf. ci-dessus) lorsqu'il se reconnecte. Pour être plus clair, voici la version du code-test : Contenu masqué Réagissez ou répondez à ce message afin de consulter le contenu masqué. Maintenant, si j'ajoute d'autres effets : Contenu masqué Réagissez ou répondez à ce message afin de consulter le contenu masqué. Sauf si cela gêne, je peux les supprimer, mais j'ai illustré mon propos avec quelques screens avant / après : Ce qui me frustre, c'est que je suis persuadé d'être à deux doigts de réussir à terminer ce code, que je fais une erreur toute bête (j'ai au moins 5-7 variations de ce code, certaines qui fonctionnent, d'autres non, mais le code que je t'ai envoyé ici est le plus fonctionnel de tous). Je ne sais pas s'il existe véritablement un moyen de faire ce que je souhaite, mais dans le doute je me dis qu'il vaut mieux que je puisse encore tenter. Je ne sais pas si j'ai été très clair dans mes explications, si c'est le cas n'hésites pas à me redemander, même si je pense pouvoir à demi-moitié tenter de trouver des pistes dans le futur, même si ça risque encore d'être une rude tâche. Modifié 2 avril 2020 par Liock Partager ce message Lien à poster Partager sur d’autres sites
Invité Répondu : 2 avril 2020 Dans ce cas, je ne vois plus d'autre solution. Foutre des "if player is online" partout xD S'il est tjr connecté, ok. S'il se déconnecte : stop (donc la commande s'arrête) Après t'as juste à faire le nécessaire à partir du joueur déconnecté Partager ce message Lien à poster Partager sur d’autres sites
Liock 3 Répondu : 3 avril 2020 Il y a 20 heures, KneaXy a dit : Dans ce cas, je ne vois plus d'autre solution. Foutre des "if player is online" partout xD S'il est tjr connecté, ok. S'il se déconnecte : stop (donc la commande s'arrête) Après t'as juste à faire le nécessaire à partir du joueur déconnecté Oui, peut-être que c'est une solution, même si j'avais cru comprendre qu'on pouvait stocker des éléments dans une variable, j'avais pensé alors qu'il était possible de l'annuler mais après je ne vais pas me plaindre si cette technique là fonctionne. Je vais soumettre ceci à essai et voir ce que ça donne. Partager ce message Lien à poster Partager sur d’autres sites
Invité Répondu : 3 avril 2020 Il y a 3 heures, Liock a dit : Oui, peut-être que c'est une solution, même si j'avais cru comprendre qu'on pouvait stocker des éléments dans une variable, j'avais pensé alors qu'il était possible de l'annuler mais après je ne vais pas me plaindre si cette technique là fonctionne. Je vais soumettre ceci à essai et voir ce que ça donne. Au pire tu fais, si ça marche on va optimiser ensemble Partager ce message Lien à poster Partager sur d’autres sites
Liock 3 Répondu : 5 avril 2020 Je n'ai pas l'impression que le if répété fonctionne, je vais faire un dernier essai et tenter le loop, si ça ne fonctionne pas je laisserai le code tel qu'il est en attendant de trouver une solution alternative dans le futur : - ) Partager ce message Lien à poster Partager sur d’autres sites
Invité Répondu : 5 avril 2020 il y a 56 minutes, Liock a dit : Je n'ai pas l'impression que le if répété fonctionne, je vais faire un dernier essai et tenter le loop, si ça ne fonctionne pas je laisserai le code tel qu'il est en attendant de trouver une solution alternative dans le futur : - ) while {var::%player%} is set; ....... wait a minute C'est optimisé en soi Partager ce message Lien à poster Partager sur d’autres sites
Liock 3 Répondu : 9 avril 2020 Re, Finalement, je suppose que le code que tu m'avais envoyé en réponse est la meilleure chose que je puisse utiliser pour l'instant. Je vais commencer à manquer de temps (ce qui explique ma réponse tardive, d'ailleurs, et je m'en excuse). Merci pour l'aide apportée encore une fois. Partager ce message Lien à poster Partager sur d’autres sites
Rush2Fer 105 Répondu : 29 avril 2020 Le sujet n'a pas reçu de réponse pouvant le résoudre. Il a donc été verrouillé. Cordialement, l'équipe. Partager ce message Lien à poster Partager sur d’autres sites