Aller au contenu
Liock

inactif ✖ (Aide) Annulation d'événements en cas de déconnexion

Messages recommandés

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é

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
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é par Liock

Partager ce message


Lien à poster
Partager sur d’autres sites
Invité
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
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é par Liock

Partager ce message


Lien à poster
Partager sur d’autres sites
Invité

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
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é
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é
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
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é
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

Ç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é
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

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é
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é par Invité

Partager ce message


Lien à poster
Partager sur d’autres sites
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. 

2020-04-02_23.48.57.png

2020-04-02_23.49.01.png

 

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é par Liock

Partager ce message


Lien à poster
Partager sur d’autres sites
Invité

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
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é
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

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é
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

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
Invité
Ce sujet ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.