Aller au contenu
TheBestMines

résolu ✔ Empêcher la pose d'un bloc quelconque ayant un certain lore

Messages recommandés

Version de Minecraft : 1.16.3
Version de Skript : 2.4.1

Addons utilisés: SkQuery-Lime 4.1.3, skript-yaml 1.3.2, skUtilities 0.9.2

 

Je travaille sur la mise en place d'un système de stockage, permettant de compresser des objets en un seul (des blocs notamment). Cela en échangeant, par exemple, un coffre de roche pour une roche enchantée, avec un certain nom et un lore, qui représenterai donc ce coffre de roche, mais en un seul objet dans un seul emplacement d'inventaire.

Mais le problème, en particulier pour les blocs, est que si le joueur pose un bloc enchanté, qui est donc au final un coffre de ce type de bloc, lors de la récupération, le bloc récupèrera ses valeurs par défaut (nom, aucun lore, etc...) et ainsi le coffre ne pourra plus être obtenu au niveau de l'échangeur.

J'aurais donc aimé savoir s'il était possible de faire un skript, qui détecterai sur l'objet compressé (dans l'inventaire du joueur) un certain lore (exemple: "Ceci ne peut être posé."), et que dans le cas où ce lore est détecté, le joueur au moment de vouloir poser le bloc ne pourrait pas le poser et recevrai un message tel que "Vous ne pouvez pas poser ceci.". En simple, l'événement de poser le bloc serait donc annulé dès le moment où le lore voulu est détecté sur l'objet avant/pendant l'événement de pose.

J'ai essayé de faire quelques recherches et de commencer à écrire ce skript, qui ne fonctionne pas. Il n'y a aucune erreur lors d'un /skript reload scripts et je ne trouve où est le problème. En sachant que je n'ai jamais vraiment écrit des scripts de ce type.

Citation

on place:
    if line 3 of lore of event-block is "Ceci ne peut être posé.":
        cancel event
        send "Vous ne pouvez pas poser ceci." to player

Quelqu'un peut-il m'aider à réaliser un skript répondant à cette problématique, si cela est possible ?

 

Je vous remercie d'avance 🙂

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut,

Ta demande me semble largement réalisable.

Tout d'abord, pour palier au problème que tu as cité, tu peux mettre en place une liste contenant les blocs enchantés posés (contenant les inventaires). Cela te permettra de savoir lorsqu'un joueur mine un bloc s'il appartient à la liste précédemment définie, donc s'il est un bloc enchanté contenant un inventaire dont le contenu aura été préalablement enregistré dans une liste ou une sous-liste.

Voilà, résumé en 2 phrases ce que tu peux faire afin de résoudre ton problème ! 😄

Cela constitue une solution. Une éventuelle autre solution serait de faire usage des NBT.
J'espère avoir été assez clair, si tu as besoin d'amples précisions, n'hésite pas !

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut deventoncar,

Merci pour ta réponse 🙂 

Je n'ai pas tout compris sur la mise en place d'une liste. Ce serait de lister dans un script tous les blocs enchantés que je viendrais à créer, pour qu'il soit reconnus lors du minage (s'il y a eu la pose de l'un d'eux) et qu'il puissent redevenir comme avant la pose ?
Autrement, comment je pourrais faire avec des NBT ? 🙂 

De plus, j'ajoute quelques images et un gif pour illustrer le principe et donc donner plus de détails par rapport à ce que j'aimerai faire.

Je prends à nouveau l'exemple de la roche. Sur l'image "trade 1", on a le coffre de roche, que le joueur aura avant l'échange avec le panneau. Sur l'image "trade 2", on a la roche enchantée, qui sera donnée au joueur après l'échange depuis le panneau, et ayant le lore "Ceci ne peut être posé" en 3e ligne.

Sur le Gif, on peut voir l'échange complet:
1. J'ai, dans mon inventaire, les 1728 roches
2. Je clique sur le panneau pour avoir la super roche et ainsi gagner de la place dans mon stockage, car je pourrais compresser un coffre complet en un seul objet.
3. Je pose, sans faire exprès, la super roche. Problème, la pose s'est faite. Si je la casse, je récupère une pierre... , Quand je vais vouloir faire l'échange dans le sens contraire, le panneau me retournera que je n'ai donc pas de super roche dans mon inventaire. Résultat, j'ai perdu mon coffre de roche à cause d'un simple clic...

Le but, serait que l'étape 3 soit supprimée. Qu'au moment où l'on cliquerait pour poser le bloc, que l'événement de pose (on place je crois) serait donc annulé, car il y aura eu détection du lore que l'on voit sur la super roche sur l'image "trade 2" et sur le gif "trade 3" (ou par la détection d'autre chose qui donnerait le même résultat). A la place, un message serait envoyé au joueur, disant que la pose de ce super bloc est impossible, me permettant de garder mon super bloc intact et de faire l'échange dans le sens contraire à tout moment. Ainsi, le joueur ne devrait pas avoir à miner le super bloc, puisqu'il ne pourra jamais le poser.

trade_3.gif

trade 2.png

trade 1.png

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a une heure, WIKILI2003 a dit :

Rien de plus simple

Contenu masqué

    Réagissez ou répondez à ce message afin de consulter le contenu masqué.

 

Salut,

Merci pour ta réponse. J'étais donc sur la bonne voie avec mon script initial, sur mon premier message. Je vais tester celui-ci.

Si au lieu du nom du bloc, je voudrais plutôt détecter ce qui est écrit sur la ligne 3 du lore de la super roche; "Ceci ne peut être posé", le script suivant serait bon ?

Citation

on place:
  
if the line 3 of the lore of event-block is "&4&lCeci ne peut être posé":
    cancel event

    send "&c&lVous ne pouvez pas poser ceci." to player

Merci d'avance.

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 9 minutes, WIKILI2003 a dit :

Ou sinon tu fais directement ça, ça evite d'utiliser un addon supplémentaire.

 

Contenu masqué

    Réagissez ou répondez à ce message afin de consulter le contenu masqué.

 

Ok, je vais tester tout cela. Je donnerai le résultat ici 🙂 

Il faut un addon en plus si l'on veut prendre en compte une ligne spécifique du lore ? Lequel ?

Merci

Modifié par TheBestMines

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 18 heures, TheBestMines a dit :

Salut deventoncar,

Merci pour ta réponse 🙂 

Je n'ai pas tout compris sur la mise en place d'une liste. Ce serait de lister dans un script tous les blocs enchantés que je viendrais à créer, pour qu'il soit reconnus lors du minage (s'il y a eu la pose de l'un d'eux) et qu'il puissent redevenir comme avant la pose ?
Autrement, comment je pourrais faire avec des NBT ? 🙂 

De plus, j'ajoute quelques images et un gif pour illustrer le principe et donc donner plus de détails par rapport à ce que j'aimerai faire.

Je prends à nouveau l'exemple de la roche. Sur l'image "trade 1", on a le coffre de roche, que le joueur aura avant l'échange avec le panneau. Sur l'image "trade 2", on a la roche enchantée, qui sera donnée au joueur après l'échange depuis le panneau, et ayant le lore "Ceci ne peut être posé" en 3e ligne.

Sur le Gif, on peut voir l'échange complet:
1. J'ai, dans mon inventaire, les 1728 roches
2. Je clique sur le panneau pour avoir la super roche et ainsi gagner de la place dans mon stockage, car je pourrais compresser un coffre complet en un seul objet.
3. Je pose, sans faire exprès, la super roche. Problème, la pose s'est faite. Si je la casse, je récupère une pierre... , Quand je vais vouloir faire l'échange dans le sens contraire, le panneau me retournera que je n'ai donc pas de super roche dans mon inventaire. Résultat, j'ai perdu mon coffre de roche à cause d'un simple clic...

Le but, serait que l'étape 3 soit supprimée. Qu'au moment où l'on cliquerait pour poser le bloc, que l'événement de pose (on place je crois) serait donc annulé, car il y aura eu détection du lore que l'on voit sur la super roche sur l'image "trade 2" et sur le gif "trade 3" (ou par la détection d'autre chose qui donnerait le même résultat). A la place, un message serait envoyé au joueur, disant que la pose de ce super bloc est impossible, me permettant de garder mon super bloc intact et de faire l'échange dans le sens contraire à tout moment. Ainsi, le joueur ne devrait pas avoir à miner le super bloc, puisqu'il ne pourra jamais le poser.

trade_3.gif

trade 2.png

trade 1.png

La solution que je t'ai proposé intervient dans le cas où tu ne veuille pas annuler la pose de ta super roche mais plutôt dans le cas où tu veuilles récupérer ta super roche (l'item) en cassant le bloc que t'as posé.

Si ta demande était tout autre, je m'en excuse, je l'avais mal comprise. Si ce n'est pas le cas, ma solution fonctionnera très bien et sans addons 🙂 

Modifié par deventoncar

Partager ce message


Lien à poster
Partager sur d’autres sites

Re,

Pour te répondre deventoncar, la demande serait vraiment d'annuler la pose 🙂 

J'ai essayé ces deux scripts du coup:

Citation

on place:
  if name of event-block is "&3&lSuper Roche":
    cancel event
    send "&c&lVous ne pouvez pas poser ceci." to player

Citation

on place:
  if lore of event-block contains "&4&lCeci ne peut être posé":
    cancel event
    send "&c&lVous ne pouvez pas poser ceci." to player

Ils ne fonctionnent pas, même après m'être retiré les droits d'op, redémarrer le serveur, checké et rechargé la config par défaut de Skript, comme pour les scripts actifs.

En sachant que je suis sur Paper, y'a t-il quelque chose à activer ? Me manquerait-il un addon ?

Et je n'ai aucun message d'erreur. Même en activant le debug...

Partager ce message


Lien à poster
Partager sur d’autres sites
Le 23/07/2021 à 00:38, TheBestMines a dit :

Re,

Pour te répondre deventoncar, la demande serait vraiment d'annuler la pose 🙂 

J'ai essayé ces deux scripts du coup:

Ils ne fonctionnent pas, même après m'être retiré les droits d'op, redémarrer le serveur, checké et rechargé la config par défaut de Skript, comme pour les scripts actifs.

En sachant que je suis sur Paper, y'a t-il quelque chose à activer ? Me manquerait-il un addon ?

Et je n'ai aucun message d'erreur. Même en activant le debug...

Tu n'es pas loin de la solution, tu t'y prends juste mal. Ce n'est pas event-block dont il faut récupérer le lore mais plutôt l'item que le joueur a en main.
En effet, event-block est le bloc déjà placé, il ne dispose donc plus des mêmes informations que l'item en main (name, lore, nbt etc...).

Je te suggère la solution suivante qui devrait résoudre ton problème :

Contenu masqué

    Réagissez ou répondez à ce message afin de consulter le contenu masqué.

J'espère t'avoir suffisamment aidé, si tu as d'autres questions, n'hésite pas ! 🙂 

  • J'aime 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut deventoncar,

 

Avec "player's held item", mon script fonctionne ! Merci !

Sinon, dans le même principe, pour pouvoir empêcher l'utilisation d'une flèche, avec un arc et/ou une arbalète, dont le lore contient "&4&lCeci ne peut pas être utilisé en tant que projectile.". Ce serait un script du style ? Celui-ci ne fonctionne pas et je trouve pas la bonne syntaxe dans la documentation... Un peu comme la "super roche", le but serait d'empêcher le joueur de mettre la fèche sur son arc/arbalète (pour l'empêcher de tirer).

Citation

on shoot:
  if event-projectile is an arrow:
    if the lore of event-projectile contains "&4&lCeci ne peut pas être utilisé en tant que projectile.":
      cancel event
      send "&c&lCeci est un super objet, créé pour le stockage massif. Vous ne pouvez pas l'utiliser comme projectile pour éviter sa perte." to shooter


 

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 18 heures, TheBestMines a dit :

Avec "player's held item", mon script fonctionne ! Merci !

C'est toujours un plaisir d'aider 😇

Il y a 18 heures, TheBestMines a dit :

Sinon, dans le même principe, pour pouvoir empêcher l'utilisation d'une flèche, avec un arc et/ou une arbalète, dont le lore contient "&4&lCeci ne peut pas être utilisé en tant que projectile.". Ce serait un script du style ? Celui-ci ne fonctionne pas et je trouve pas la bonne syntaxe dans la documentation... Un peu comme la "super roche", le but serait d'empêcher le joueur de mettre la fèche sur son arc/arbalète (pour l'empêcher de tirer).

Citation

on shoot:
  if event-projectile is an arrow:
    if the lore of event-projectile contains "&4&lCeci ne peut pas être utilisé en tant que projectile.":
      cancel event
      send "&c&lCeci est un super objet, créé pour le stockage massif. Vous ne pouvez pas l'utiliser comme projectile pour éviter sa perte." to shooter

Concernant ta nouvelle demande, c'est un peu plus technique et compliqué que ça...

Comme je te l'ai indiqué au-dessus pour le event-block, event-projectile ne correspond qu'au projectile lorsqu'il est tiré, en tant qu'entité et ne contient donc plus les informations de l'item (name, lors, nbt etc...). Pour palier à ce problème il te faut récupérer l'ensemble des flèches dans l'inventaire du joueur, notamment ceux dans un slot le plus petit (cf. image ci-dessous).

image.png.1f0c200ab7cebb79846b9a8875d72e27.png

Pourquoi ? Car ce sont ceux qui vont être utiliser en premier lorsque tu vas tirer et notamment lorsque tu as plusieurs stacks de différents types de flèches dans ton inventaire. Une fois que tu auras réussi à déterminer quel stack va être utilisé il te suffira de récupérer le lore des flèches et de déterminer si le joueur peut l'utiliser ou non. Il faudra aussi prévoir un cas de figure : lorsque le joueur possédera plusieurs stacks de flèches dans son inventaire, une contient le fameux lore et l'autre non. Il faudra vérifier que l'autre stack peut être utilisé et tiré... 

C'est théoriquement ce qu'il faut faire, tu as ta ligne directrice ! Il faut maintenant appliquer cette théorie et tester différentes méthodes. Une fois que tu auras essayé quelque chose, reviens vers moi pour qu'on puisse voir ce que ça donne.

Si tu as des d'autres questions, n'hésite pas ! 🙂 

Modifié par deventoncar

Partager ce message


Lien à poster
Partager sur d’autres sites

Comment pourrais-je récupérer le slot le plus petit, afin de contrôler s'il contient une flèche ne devant pas être utilisée (contenant donc un lore) ? Avec un loop ? 
J'ai un peu de mal à trouver comme faire cela dans la doc... J'ai trouvé comment voir si l'inventaire du joueur contient l'objet en question (player's inventory contains ?), mais pas pour ce qui concerne le slot le plus petit.

A côté, j'ai déjà essayé d'écrire cela pour tester si ça pouvait annuler l'événement, après avoir installé l'addon Skript-paper. Sans vraiment de surprise, ça ne fonctionne pas.

Citation

On player ready arrow:
  if the line 3 of the lore of arrow contains "&4&lCeci ne peut pas être utilisé en tant que projectile.":
    cancel event

 

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a une heure, TheBestMines a dit :

Comment pourrais-je récupérer le slot le plus petit, afin de contrôler s'il contient une flèche ne devant pas être utilisée (contenant donc un lore) ? Avec un loop ? 
J'ai un peu de mal à trouver comme faire cela dans la doc... J'ai trouvé comment voir si l'inventaire du joueur contient l'objet en question (player's inventory contains ?), mais pas pour ce qui concerne le slot le plus petit.

A côté, j'ai déjà essayé d'écrire cela pour tester si ça pouvait annuler l'événement, après avoir installé l'addon Skript-paper. Sans vraiment de surprise, ça ne fonctionne pas.

 

Avant de te dévoiler la solution, je vais te laisser chercher un peu.

Premièrement, un conseil que je peux te donner est de toujours de debugger ton code. Comment ? Simplement en envoyer des messages dans le chat de ce que les différents objets que tu manipule retournent. Cela constitue le meilleur moyen de te débloquer d'une situation compliqué.

Dans ton cas, tu peux envoyer un debug au joueur qui utilise l'arc contenant le lore de la flèche. Cela te permettra de vérifier s'il contient bel et bien quelque chose et de savoir si tu peux employer cette méthode pour poursuivre dans ton code. Mais comme je te l'ai dit plus haut, à partir du moment ou la flèche devient une entité, tu ne peux plus récupérer ses informations-là. Il faut donc agir plus tôt i.e. récupérer l'info à partir de l'inventaire du joueur.

Pour résumer, avant de penser à résoudre ton problème, il te faut mettre tout en oeuvre pour t'assurer que le chemin que t'as décidé de prendre fonctionne. Aussi simple que ça. Une fois que tu as compris cette notion, tu pourras aller plus loin et comprendre pourquoi certaines choses ne fonctionnent pas.

Si tu veux savoir pourquoi, voici une petite explication et au passage une très bonne application d'un debug.

Dans le premier screen, je montre le NBT d'une flèche dans mon inventaire dont j'ai modifié quelques attributs comme le nom, la couleur et auquel j'ai rajouté un tag "Type" égal à "BlaBla[...]Bla" histoire qu'il soit très visible.

image.thumb.png.2f1c35015b9e21983326d963bac63562.png

Dans ce second screen, tu vois le NBT de cette même flèche une fois planté dans un bloc. De nouveaux tags sont apparus (spécifiques à Paper ou à ton soft) et d'autres ont complètement disparus dont ceux qui nous intéressaient : name, color, lore et le type.

1195569904_Capturedcran2021-07-2717_03_55.thumb.png.4d53f8788b104420cde7f6807869467d.png

Du coup, pour pallier à ce problème, plusieurs solutions sont possibles. Celle que je t'ai proposé me paraît la plus simple à mettre en oeuvre.

 

il y a une heure, TheBestMines a dit :

Comment pourrais-je récupérer le slot le plus petit, afin de contrôler s'il contient une flèche ne devant pas être utilisée (contenant donc un lore) ? Avec un loop ? 

C'est tout à fait ça : tu récupères toutes les flèches de l'inventaire du joueur ainsi que leur position (item's slot) via un loop et tu détermines lequel est le plus petit et vérifie si celui-ci contient le fameux lore. Si c'est le cas, tu bloques l'évènement.

 

EDIT : Je viens de voir que tu as utilisé skript-paper et l'event on player ready arrow, ce qui te facilite grandement la tâche !

D'après la documentation (

Contenu masqué

    Réagissez ou répondez à ce message afin de consulter le contenu masqué.
), tu peux récupérer event-player, event-itemtype et event-world. Ici, c'est event-itemtype qui nous intéresse et permet de résoudre le problème. Ce que tu as écris est correct et fonctionne de mon côté !

 

Modifié par deventoncar
  • J'aime 1

Partager ce message


Lien à poster
Partager sur d’autres sites
Citation

D'après la documentation (

Contenu masqué

    Réagissez ou répondez à ce message afin de consulter le contenu masqué.
), tu peux récupérer event-player, event-itemtype et event-world. Ici, c'est event-itemtype qui nous intéresse et permet de résoudre le problème. Ce que tu as écris est correct et fonctionne de mon côté !

 

L'événement du chargement de l'arc s'annule de ton côté avec ce script ?

Citation

On player ready arrow:
  if the line 3 of the lore of event-itemtype contains "&4&lCeci ne peut pas être utilisé en tant que projectile.":
    cancel event
    send "&c&lla flèche que vous utilisez pour charger votre arc est une super flèche, créée pour le stockage massif. Vous ne pouvez pas l'utiliser comme projectile pour éviter sa perte." to player

Même avec la ligne cancel event, l'arc reste chargé et si on relâche le clic droit, la flèche est tout de même tirée. Par contre, je reçois bien le message écrit juste en dessous.

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 23 minutes, TheBestMines a dit :

 

L'événement du chargement de l'arc s'annule de ton côté avec ce script ?

Même avec la ligne cancel event, l'arc reste chargé et si on relâche le clic droit, la flèche est tout de même tirée. Par contre, je reçois bien le message écrit juste en dessous.

Fausse alerte 😉 Je pensais que l'événement ne s'annulait pas, mais en fait ça prenait juste une flèche d'un autre stack sans le lore, dans mon inventaire.

 

Tout est donc fonctionnel ! Merci pour l'aide apportée 😄

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 26 minutes, TheBestMines a dit :

Fausse alerte 😉 Je pensais que l'événement ne s'annulait pas, mais en fait ça prenait juste une flèche d'un autre stack sans le lore, dans mon inventaire.

 

Tout est donc fonctionnel ! Merci pour l'aide apportée 😄

Tant mieux ! Toujours un plaisir 🙂 

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.