Résolu Tag remove sur une entité
-
Bonjour bonjour bon je suis entrain de coder … un genre de pokéball ? ( pour faire plus simple niveau représentation )
Mon code est très simple, je copie une entité qui est stocker dans mon objet directement puis je la supprime du monde et lorsque je clique sur un bloque je suis censé la faire spawn ( la copie ), sauf que mon code a l’air de bien fonctionner mais l’entité sauvegarder garde le tag “remove” du serveur.private EntityLivingBase soul; @Override public boolean hitEntity( ItemStack stack, EntityLivingBase target, EntityLivingBase attacker ) { if( this == Main.soulKeeper ) itemSoulKeeperCatch( stack, target, attacker ); return false; } @Override public EnumActionResult onItemUse( EntityPlayer player, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ ) { if( this == Main.soulKeeper ) itemSoulKeeperRelease( player, worldIn, pos ); return EnumActionResult.PASS; } private void itemSoulKeeperCatch( ItemStack stack, EntityLivingBase target, EntityLivingBase attacker ) { if( !attacker.world.isRemote ) { soul = target; attacker.world.removeEntity( target ); System.out.println( "debug catch !remote" ); } System.out.println( "debug catch remote" ); } private void itemSoulKeeperRelease( EntityPlayer player, World worldIn, BlockPos pos ) { if( !worldIn.isRemote ) { if( soul != null ) { worldIn.spawnEntity( soul ); } } }
[13:39:41] [Server thread/WARN] [minecraft/WorldServer]: Tried to add entity minecraft:pig but it was marked as removed already
La question est : est-il possible d’enlever ce marqueur sur mon entité ?
Le but de mon objets étant de pouvoir “catch” n’importe quel entité ( pour le moment sans vérification de la dite entité mais seul les pnj, entité neutre et tame seront "capturable ), donc incluant les chevaux avec armure ou mule avec leur coffre, c’est pourquoi je copie l’entité directement plutôt que d’utiliser les tag. -
Ok bon j’ai modifier mon code, déjà pour qu’il inclue correctement le type d’entité etc etc, de plus je ne stock plus l’entité dans la classe ( euht oui forcément car sinon elle est disponible pour tous les objets … ) mais avec setTagInfo, bon tout ça c’est fait :
private void itemSoulKeeperCatch( ItemStack stack, EntityLivingBase target, EntityLivingBase attacker ) { if( !attacker.world.isRemote ) { if( !stack.hasTagCompound() || !stack.getTagCompound().hasKey( "entity" )) { if( target instanceof EntityAnimal ) { stack.setTagInfo( "entity", target.serializeNBT() ); attacker.world.removeEntity( target ); } else System.out.println( "impossible to catch this entity" ); } else System.out.println( "entity already catched in" ); } } private void itemSoulKeeperRelease( EntityPlayer player, World worldIn, BlockPos pos, EnumHand hand ) { if( !worldIn.isRemote ) { if( player.getHeldItemMainhand().getTagCompound().hasKey( "entity" ) ) { System.out.println( player.getHeldItemMainhand().getTagCompound().getTag( "entity" ).toString() ); /*worldIn.loadedEntityList.add( soul ); if( worldIn.spawnEntity( soul )) soul = null;*/ } } }
Ce qui me donne :
[16:24:49] [Server thread/INFO] [STDOUT]: [com.kporal.mcplus.items.ItemCommon:itemSoulKeeperRelease:132]: {HurtByTimestamp:76,Attributes:[{Base:10.0d,Name:"generic.maxHealth"},{Base:0.0d,Name:"generic.knockbackResistance"},{Base:0.25d,Name:"generic.movementSpeed"},{Base:0.0d,Name:"generic.armor"},{Base:0.0d,Name:"generic.armorToughness"},{Base:1.0d,Name:"forge.swimSpeed"},{Base:16.0d,Modifiers:[{UUIDMost:-3767210348468942745L,UUIDLeast:-8549574576135384709L,Amount:0.05729859799098095d,Operation:1,Name:"Random spawn bonus"}],Name:"generic.followRange"}],Invulnerable:0b,FallFlying:0b,ForcedAge:0,PortalCooldown:0,AbsorptionAmount:0.0f,Saddle:0b,FallDistance:0.0f,InLove:0,DeathTime:0s,HandDropChances:[0.085f,0.085f],PersistenceRequired:0b,id:"minecraft:pig",Age:0,Motion:[0.37202734342408367d,0.36080000519752503d,0.14695459620472426d],Leashed:0b,UUIDLeast:-8781769650059372032L,Health:8.0f,LeftHanded:0b,Air:300s,OnGround:1b,Dimension:0,Rotation:[268.56763f,-25.462656f],UpdateBlocked:0b,HandItems:[{},{}],ArmorDropChances:[0.085f,0.085f,0.085f,0.085f],UUIDMost:6078610636027022462L,Pos:[-142.82333969618202d,74.0d,-253.47759529984046d],Fire:-1s,ArmorItems:[{},{},{},{}],CanPickUpLoot:0b,HurtTime:10s}
#AntiVomitif!
Me reste plus qu’à la faire spawn avec une copy des tag nbt ? à voir … -
Bon j’ai une solution ou du moins un début, mais :
NBTBase i = player.getHeldItemMainhand().getTagCompound().getTag( "entity" ); Pattern pattern = Pattern.compile( "id:\"(.*)\"" ); Matcher matcher = pattern.matcher( i.toString() );
A savoir que je recherche id:“minecraft:pig” mais je m’en sort pas si quelqu’un peux m’aider avec la regex ?
-
Pffff je suis naze …
private void itemSoulKeeperRelease( EntityPlayer player, World worldIn, BlockPos pos, EnumHand hand ) { if( !worldIn.isRemote ) { if( player.getHeldItemMainhand().getTagCompound().hasKey( "entity" ) ) { NBTBase nbt = player.getHeldItemMainhand().getTagCompound().getTag( "entity" ); NBTTagCompound nbtc = (NBTTagCompound) nbt; Entity entity = AnvilChunkLoader.readWorldEntityPos( nbtc, worldIn, player.getPosition().getX(), player.getPosition().getY(), player.getPosition().getZ(), true); player.getHeldItemMainhand().getTagCompound().removeTag( "entity" ); } } }
Problème résolu ( tester avec cheval, selle et armure, mais aussi avec mule selle et coffre tout est bien recréer )