Résolu OnItemRightClick sur une entity.
-
private Map <entityplayer, itemstack="">itemsToKeep = new HashMap<entityplayer, itemstack="">(); @SubscribeEvent public void onDead(LivingDeathEvent event) { if(event.entityLiving instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)event.entityLiving; for(int i = 0; i < player.inventory.getSizeInventory(); i++) { ItemStack stack = player.inventory.getStackInSlot(i); if(stack != null && stack.getItem() == Item.getItemFromBlock(Blocks.dirt)) { itemsToKeep.put(player, stack); player.inventory.setInventorySlotContents(i, null); } } } } @SubscribeEvent public void onRespawn(PlayerRespawnEvent event) { if(itemsToKeep.containsKey(event.player)) { event.player.inventory.addItemStackToInventory(itemsToKeep.get(event.player)); itemsToKeep.remove(event.player); } } ```</entityplayer,></entityplayer,>
-
Merci , mais tu n’as pas vraiment compris fin c’est presque sa je veux simplement faire l’inverse en gros l’item de terre je veux que il soit sauvegarder a chaque fois que on meurt et les autres que l’on a dans l’inventaire a la poubelle . et est-ce-que c’est possible de garder l’item en gros de faire un keepiventory mais juste sur l’item de terre en gros lorsque on respawn il revient directement dans l’inventaire mais que se soit le même item et pas un item give lors du respawn.
“C’est un peu complexe et mal expliqué désolé :/”
-
C’est le même stack, qui est d’abord enlevé lors de la mort puis remis dans l’inventaire du joueur lors du respawn.
-
Quand je respawn j’ai rien dans l’inventaire c’est pas normal si ?
-
Si tu as plusieurs stack il risque s’il y avoir un problème dans le code de Robin4002, par contre.
-
Mon test à fonctionné exactement comme tu veux. J’avais du bois et un bloc de terre sur moi. Je suis mort, puis quand j’ai respawn le bloc de terre est revenu dans mon inventaire (je prend l’instance de l’itemstack donc même quantité et même tab nbt si présent).
Tu as mit quoi dans la condition ?
(en effet mon code ne fonctionne que avec un stack). -
Moi marche pas comme ça en gros:
Alors j’ai 1 stack de bois comme toi et 1 stack de terre, je me /kill je respawn lors du respawn j’ai plus rien dans mon inventaire et quand je vais sur le lieux ou je suis mort je retrouve le stack de bois mais pas le stack de terre et moi se que je veux c’est que le stack de bois disparaisse et le stack de terre revienne dans mon inventaire.
Et comme code j’ai ça:
private Map <entityplayer, itemstack="">itemsToKeep = new HashMap<entityplayer, itemstack="">(); @SubscribeEvent public void onDead(LivingDeathEvent event) { if(event.entityLiving instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)event.entityLiving; for(int i = 0; i < player.inventory.getSizeInventory(); i++) { ItemStack stack = player.inventory.getStackInSlot(i); if(stack != null && stack.getItem() == Item.getItemFromBlock(Blocks.dirt)) { itemsToKeep.put(player, stack); player.inventory.setInventorySlotContents(i, null); } } } } @SubscribeEvent public void onRespawn(PlayerRespawnEvent event) { if(itemsToKeep.containsKey(event.player)) { event.player.inventory.addItemStackToInventory(itemsToKeep.get(event.player)); itemsToKeep.remove(event.player); } } } ```</entityplayer,></entityplayer,>
-
1 - Tu devrais utiliser les UUID plutôt que l’instance du joueur
2 - Ta HashMap devrait avoir une liste d’ItemStack car s’il y a plusieurs slots contenant de la dirt, seulement le dernier sera gardé
3 - Vérifie que l’inventaire du joueur n’est pas clear après l’appelle de l’événement -
Pour le 2 c’est pas garve car je vais changer par la suite je vais mettre un item de mon mod qui se stack par 1 et que le joueur aura qu’une fois pour la 3 l’inventaire n’est pas clear il me semble.
-
PlayerRespawnEvent est un event FML. As-tu enregistré ton GuiHandler dans le FMLEventBus ?
-
J’ai ça chez moi:
@EventHandler public void init(FMLInitializationEvent event) { proxy.init(event); NetworkRegistry.INSTANCE.registerGuiHandler(INSTANCE, proxy); MinecraftForge.EVENT_BUS.register(new EntityEvent()); FMLCommonHandler.instance().bus().register(new EntityEvent()); }
PS: EntityEvent = la class avec onRespawn et onDead.
-
Ça devrait être bon, alors.
-
Non, ce ne sont que des event Forge.
Je vais regarder de mon côté. Il faut clear pour chaque item si tu ne veux que rien reste.
Et en effet scarex, mon code est perfectible (uuid et tableau comme tu as dit). Ce qu’il faudrait aussi faire c’est sauvegarder la HashMap dans la save au cas le joueur se déconnecte au lieu de respawn tout de suite et que le serveur est coupé entre temps. -
D’acc ^^ j’attend ton retour, merci à vous
-
Pourtant le package de PlayerRespawnEvent indique FML…
-
Ah oui autant pour moi. Je suis en 1.8.9 donc tout passe par l’event bus de Forge.
EDIT : ahhh c’est pour ça que ça ne fonctionne pas chez floriangabet.
Dans ta classe principale mets :EntityEvent entityEvent = new EntityEvent(); FMLCommonHandler.instance().bus().register(entityEvent ); MinecraftForge.EVENT_BUS.register(entityEvent);
Sinon tu aura deux instances différentes de EntityEvent, donc deux maps différentes.
-
Je venais d’y penser…
Sinon, tu peux aussi mettre la variable static. -
Oui, ça fonctionne aussi.
Bon code modifier :private Map <uuid, itemstack[]="">itemsToKeep = new HashMap<uuid, itemstack[]="">(); @SubscribeEvent public void onDead(LivingDeathEvent event) { if(event.entityLiving instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)event.entityLiving; ItemStack[] stackToKeep = new ItemStack[player.inventory.getSizeInventory()]; for(int i = 0; i < player.inventory.getSizeInventory(); i++) { ItemStack stack = player.inventory.getStackInSlot(i); if(stack != null) { if(stack.getItem() == Items.diamond_sword) { stackToKeep* = stack; } player.inventory.setInventorySlotContents(i, null); } } itemsToKeep.put(player.getGameProfile().getId(), stackToKeep); } } @SubscribeEvent public void onRespawn(PlayerRespawnEvent event) { if(itemsToKeep.containsKey(event.player.getGameProfile().getId())) { ItemStack[] stackToKeep = itemsToKeep.get(event.player.getGameProfile().getId()); for(int i = 0; i < event.player.inventory.getSizeInventory(); i++) { event.player.inventory.setInventorySlotContents(i, stackToKeep*); } itemsToKeep.remove(event.player.getGameProfile().getId()); } }
UUID + tableau d’item stack.
Donc prend en charge plusieurs items. Et supprimes les autres items. J’ai mit une épée en diamant, c’était pour m’assurer que les enchantements étaient gardé y comprit le nom custom.</uuid,></uuid,> -
Wow magnifique merci !
-
Dernier petit soucis! l’item que je met a la place de l’épée est un item GUI et lorsque je met un item dans l’item Gui et que je le referme l’item dedans disparaît ^^ .