Optimisation de l'Interaction entre Plugins : Reconnaître l'Action du Joueur dans les Quêtes Minecraft

LaPensine.

Bucheron
15 Novembre 2022
26
0
13
43
Bonjour,

Actuellement, notre équipe travaille sur le développement d’un serveur Minecraft, mais nous avons été confrontés à un énième problème, cette fois-ci nous ne trouvons pas la solution. Je fais donc appel à la communauté Minecraftienne, du moins à ce forum, afin que certains prennent le temps de répondre ou de le lire. Et je vous en remercie. Mais bon, trêve de bla-bla-bla. Tout d’abord, ce problème réside, à mon avis, plus du côté des développements.

Notre serveur bénéficie d’un plugin de sortilège que nous avons développé. Le joueur saisit l'objet permettant de lancer les sortilèges, sélectionne celui qu’il veut, et clique droit pour lancer le sort sur sa cible, pouvant être un zombie par exemple. Notre plugin va donc faire subir au zombie ce que devait faire le sort, par exemple le tuer dans ce cas présent.

Cependant, nous utilisons un autre plugin pour gérer les quêtes nommé BetonQuest. BetonQuest permet donc la création des quêtes via du script YAML. Une quête pourrait être de tuer 1 zombie. Le joueur va donc, dans notre cas, prendre son sort pour tuer le zombie. Celui-ci va mourir comme prévu, mais pour BetonQuest, le joueur n’a pas tué de zombie. La raison en est simple : le plugin de sortilège a tué le zombie par le serveur, parce que le joueur l’a demandé en touchant une cible avec son sort. Pour Minecraft, cela reviendrait à ce que le zombie soit tué par le serveur ou la console. Pour que BetonQuest détecte donc que le joueur a tué un zombie, il faut qu’il le fasse par lui-même avec une épée, des poings, une flèche, etc.

La question est donc la suivante : comment régler ce problème ? Faut-il faire comprendre à BetonQuest que c’est le joueur qui a donné l’ordre de tuer et donc qu'il est le tueur, ou bien faut-il modifier directement le plugin de sortilège pour faire passer les dégâts comme si le joueur les infligeait à sa cible ? Cela pourrait-il être réalisé en utilisant une API ou d'autres moyens ?

Merci de votre compréhension. En espérant que vous nous apporterez une réponse explicite sur la manière de procéder, si possible.
 
Bonsoir,

Les fonctions de dégât ont toujours une surcharge qui prend une source en paramètre ;
Java:
public static void instakill(LivingEntity entity, Entity source) {
    // Utiliser `Double.MAX_VALUE` s'il veut une valeur finie,
    // On peut éventuellement choisir `DamageType.INDIRECT_MAGIC`
    // et/ou rajouter `withDamageLocation()` si l'instakill est une AoE (ça permet de faire un anti-instadeath en fonction de la distance par-rapport au centre du sort !)
    entity.damage(Double.POSITIVE_INFINITY, DamageSource.builder(DamageType.GENERIC_KILL).withCausingEntity(source).build());
}

Cordialement,
ShE3py
 
Merci pour votre réponse, ShE3py,

Notre équipe de développement a approuvé cette brillante idée, et nous ne tarderons pas à l'essayer. En passant, nous avons également une piste pour faire de même, cette fois-ci avec un sort qui ne tue pas directement, mais qui inflige des dégâts. Comme votre code ci-dessus ne permet que de tuer directement, le fonctionnement sera différent : le joueur pourrait éliminer le zombie en lui lançant plusieurs coups de sort. Notre équipe a une idée différente de la manière de procéder pour ce cas particulier. Mais sans vouloir abuser de votre temps, nous aimerions savoir comment vous auriez procédé dans cette autre situation.

Merci pour votre compréhension.

Amicalement, ;)
Uzuki
 
Bonjour,

Je vous recontacte très tardivement, et je vous en suis sincèrement désolé. Ce n'est pas dans mes habitudes de répondre aussi tardivement, mais je comptais vous envoyer un message une fois que notre équipe aurait effectué les tests. Malheureusement, le test a été retardé et j'ai partiellement oublié cette affaire au fil du temps. Le problème n'ayant toujours pas été testé, je vous écris tout d'abord pour m'excuser de cette réponse tardive. Je vous renverrai tout de même un message une fois les tests effectués.

Merci pour votre compréhension et bonne soirée.

Amicalement,
Uzuki