MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    Tag remove sur une entité

    Planifier Épinglé Verrouillé Déplacé Résolu 1.12.x
    1.12.2
    4 Messages 1 Publieurs 192 Vues 1 Watching
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • KporalK Hors-ligne
      Kporal
      dernière édition par

      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.

      Check out my mod : https://www.curseforge.com/minecraft/mc-mods/eygo

      1 réponse Dernière réponse Répondre Citer 0
      • KporalK Hors-ligne
        Kporal
        dernière édition par

        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 …

        Check out my mod : https://www.curseforge.com/minecraft/mc-mods/eygo

        1 réponse Dernière réponse Répondre Citer 0
        • KporalK Hors-ligne
          Kporal
          dernière édition par

          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 ?

          Check out my mod : https://www.curseforge.com/minecraft/mc-mods/eygo

          1 réponse Dernière réponse Répondre Citer 0
          • KporalK Hors-ligne
            Kporal
            dernière édition par

            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 )

            Check out my mod : https://www.curseforge.com/minecraft/mc-mods/eygo

            1 réponse Dernière réponse Répondre Citer 0
            • 1 / 1
            • Premier message
              Dernier message
            Design by Woryk
            ContactMentions Légales

            MINECRAFT FORGE FRANCE © 2024

            Powered by NodeBB