Résolu Grief et setblocktoair
-
Bonjour,
Alors je vous explique j’ai fais que quand on tape une entity elle soit enfermé dans une cage en bloc de verre mais le problème et que si l’entity se situe a côté d’un bloc se bloc et remplacer par celui en verre et donc grief la map…
Possibilité de faire en sorte que sa ne le remplace pas? (pas de grief).Autre chose aussi:
Je cherche a faire par exemple une fois l’entity enfermé après 10 secondes les bloc de verre sont remplacer par des blocs d’air.
Je connais le code pour remplacer les bloc de verre par des bloc d’air mais le soucis c’est que le faire disparaître au bout de 10s je sais pas faire. (Avec un onUpdate j’ai essayer ça marche pas!)CODE:
public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) { if(stack.getTagCompound().getInteger("timer2") >= 20 * 20){ // Orientation: EST attacker.worldObj.setBlock((int)target.posX, (int)target.posY, (int)target.posZ, Blocks.glass); //devant attacker.worldObj.setBlock((int)target.posX - 1, (int)target.posY, (int)target.posZ - 1, Blocks.glass); //gauche attacker.worldObj.setBlock((int)target.posX - 2, (int)target.posY, (int)target.posZ, Blocks.glass); // droite attacker.worldObj.setBlock((int)target.posX - 1, (int)target.posY, (int)target.posZ + 1, Blocks.glass); // dérrière attacker.worldObj.setBlock((int)target.posX - 1, (int)target.posY + 2, (int)target.posZ, Blocks.glass); //haut stack.getTagCompound().setInteger("timer2", 0); //Ici j'ai essayer de mettre un second timer mais ça marcher pas. // attacker.worldObj.setBlockToAir((int)target.posX, (int)target.posY, (int)target.posZ); //devant // attacker.worldObj.setBlockToAir((int)target.posX - 1, (int)target.posY, (int)target.posZ - 1); //gauche // attacker.worldObj.setBlockToAir((int)target.posX - 2, (int)target.posY, (int)target.posZ); // droite // attacker.worldObj.setBlockToAir((int)target.posX - 1, (int)target.posY, (int)target.posZ + 1); // dérrière // attacker.worldObj.setBlockToAir((int)target.posX - 1, (int)target.posY + 2, (int)target.posZ); //haut } return true; }
Merci d’avance!
-
Je crois qu’il y a un event pour la pose de block, suffit juste de check si le block posé correspond à ton block de verre, et si d’autres aux alentours ont été posés, et si ton entity se trouve à côté. Si tout cela renvoit true, alors tu peux enregistrer un timer (un short suffira), dans les tags de l’entity qui s’incrémentera dans l’event LivingUpdateEvent, et si ce timer est arrivé à 10*20, toujours dans l’event LivingUpdateEvent, alors tu setBlockToAir tous tes blocks de verre. Compris ?
Pour ton premier problème, si un block existant de la map est transformé par ton block de verre et que tu trouves ça gênant, suffit juste de check si il n’y a aucun block (en gro, si c’est de l’air), aux coords du futur block à poser. C’est juste une toute petite condition à rajouter, en te servant de World#getBlock(int coordX, int coordY, int coordZ)
-
Ok d’acc pour le second , mais le premier je vais essayer si je coince je reviens vers vous merci
edit:
j’ai réussis pour le grief merci!
Par contre l’event que quand on pose un bloc j’ai pas trouvé. -
@‘floriangabet’:
Ok d’acc pour le second , mais le premier je vais essayer si je coince je reviens vers vous merci
edit:
j’ai réussis pour le grief merci!
Par contre l’event que quand on pose un bloc j’ai pas trouvé.BlockEvent.PlaceEvent
-
Merci,
Alors j’ai fais ça j’ai oublier pas mal de chose je sais pas comment savoir si mon entity est a côté et faire le timer dans la class event.
J’ai un problème aussi avec le setblocktoair pour les coords je fais comment je serrai dans le onplaceblock j’aurai fait event.x , event.y … mais dans living je procède comment merci.@SubscribeEvent public void onPlaceBlock(BlockEvent.PlaceEvent event){ EntityLivingBase target = event.player.getAITarget(); World world = event.world; if(event.placedBlock == Blocks.glass && ?)//entity à côté comment faire ?? && [font=Ubuntu, sans-serifd'autres aux alentours ont été posés ? -> je vois pas trop comment peut-etre avec le boundsblock] { System.out.println("bloc de verre placer"); } } @SubscribeEvent public void onLiving(LivingUpdateEvent event){ EntityLivingBase target = event.entityLiving; World world = target.worldObj; if(timer) // ?? world.setBlockToAir(p_147468_1_, p_147468_2_, p_147468_3_); }
En tout cas merci
-
J’ai pas compris ce que tu voulais faire
-
Pour le timer il faut pas faire comme ça, regarde par ici : https://github.com/MFFbrokenSwing/FactionMod/blob/master/src/main/java/fr/mff/facmod/core/Homes.java#L110
Tu ne peux pas faire de copier/coller, essai de comprendre -
Ah oui mais je viens d’y penser, je pense qu’utiliser l’event BlockEvent.PlaceEvent ne conviendra pas car il est fired uniquement lorsqu’il s’agit d’un joueur qui place le block. Seulement là on place les blocks grâce à du World#setBlock pas grâce au clic droit qu’aurait fait un joueur. Donc essaie de voir mais je pense que l’event n’est pas déclenché…
Ensuite pour get ton entity à partir des coord’s de ta “prison de blocks de verre”, t’aurais pu te servir des AABB avec la méthode World#getEntitiesWithinAABB, qui t’aurais retourné une liste des entity se trouvant dans ta prison, mais comme logiquement il n’y en aurait qu’une seule, une boucle for ne t’aurait pas servi (un simple taList.get(0) aurait suffi).
Sinon encore une autre alternative aurait été de parcourir la liste World#loadedEntityList, afin de voir si à chaque tour l’entity a pour même coords que celle de ta prison. -
Non il se déclenche pas… pas bien grave j’ai une idée c’est possible de faire en sorte que l’osque le monde “serveur” démarre tout les bloc de vitre du la map soit remplacer par des blocs d’air ?
Logiquement oui mais pour get tout les blocs en verre je fais comment ? -
@‘floriangabet’:
démarre** tout les bloc de vitre** du la map
Sa c’est juste impossible à faire. Le seul moyen aurait été d’avoir accès au constructeur de la classe du block de vitre, et qu’à chaque nouvelle instance, on l’ajoute à une liste, qu’on aurait ensuite parcouru pour ce que tu souhaites faire, mais comme on peut pas modif les .class…
-
@‘Plaigon’:
@‘floriangabet’:
démarre** tout les bloc de vitre** du la map
Sa c’est juste impossible à faire. Le seul moyen aurait été d’avoir accès au constructeur de la classe du block de vitre, et qu’à chaque nouvelle instance, on l’ajoute à une liste, qu’on aurait ensuite parcouru pour ce que tu souhaites faire, mais comme on peut pas modif les .class…
Je me suis tromper je voulais dire block d’air c’est quand même impossible ?
-
Sa ne change pas grand chose, même problème.
Après je n’ai pas pris le temps de chercher dans ma workspace 1.7x, mais de toutes manières je pense que c’est difficilement réalisable sans utiliser la réflexion, ou sans avoir à portée de main un PC gamer à 2000 balles -
Et en les changeant au fûr et à mesure du chargement des chunks, ça ne le ferai pas ?
Avec l’event ChunkEvent.Load (je crois) tu parcours les blocs du chunk (16 x 16 x 256) et si un bloc est une vitre, on le remplace par le l’air -
@‘BrokenSwing’:
Et en les changeant au fûr et à mesure du chargement des chunks, ça ne le ferai pas ?
Avec l’event ChunkEvent.Load (je crois) tu parcours les blocs du chunk (16 x 16 x 256) et si un bloc est une vitre, on le remplace par le l’airAu pire c’est bon vous inquiétez pas je vais changer de sort pour mon mod merci en tout cas les copains