Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

[Unsolved][1.12.2] Problem on spawning one-per-player-entity spawned by item


_Cruelar_
 Share

Recommended Posts

Hello guys, I'm relative new to Minecraft Modding and Java coding in general. I've tried to make a clawshot out of The Legend of Zelda: Twilight Princess (and plan a double clawshot). On use it shoots an Clawshot_Head and "drags" the player to the place where it hits a block, or "drags" enemies it hits to the player. For this it has a maximum range for all this. The normal clawshot shoots max. 1 head so if you try to use it while you hang somewhere you fall down.

 

So that was the theory.

 

Here's what it actually does. The clawshot does nothing. And if I spawn with /summon the head it's simply a 1 block tall and 0.5 block wide box colored White. The code of the Head is mostly based on the Fishing hook. I know you all Always struggle with that, so I tell you what I think the problem is and hope somebody can confirm this or at least say me that I  forgot something important:  

So what I found out is that there's no registration of the fishinghook. As I use the same concept but don't know how to registrate this could cause the problem.

 

My Clawshot.class:

import com.cruelar.cruelars_triforcemod.Cruelars_Triforcemod_Core;
import com.cruelar.cruelars_triforcemod.entities.projectiles.Clawshot_Head;
import com.cruelar.cruelars_triforcemod.inventory.cruelars_triforcemod;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.IItemPropertyGetter;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ActionResult;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumHand;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

import javax.annotation.Nullable;
import java.util.Objects;

public class Clawshot_TP extends Item {

    public Clawshot_TP(){
        this.setCreativeTab(cruelars_triforcemod.CRUELARS_TRIFORCEMOD);
        this.setRegistryName("clawshot_tp");
        this.setUnlocalizedName(Cruelars_Triforcemod_Core.MODID+".clawshot_tp");
        this.addPropertyOverride(new ResourceLocation("cast"), new IItemPropertyGetter() {
            @SideOnly(Side.CLIENT)
            public float apply(ItemStack p_apply_1_, @Nullable World p_apply_2_, @Nullable EntityLivingBase p_apply_3_) {
                if (p_apply_3_ == null) {
                    return 0.0F;
                } else {
                    boolean lvt_4_1_ = p_apply_3_.getHeldItemMainhand() == p_apply_1_;
                    boolean lvt_5_1_ = p_apply_3_.getHeldItemOffhand() == p_apply_1_;
                    if (p_apply_3_.getHeldItemMainhand().getItem() instanceof Clawshot_TP) {
                        lvt_5_1_ = false;
                    }

                    return (lvt_4_1_ || lvt_5_1_) && p_apply_3_ instanceof EntityPlayer && ((EntityPlayer)p_apply_3_).fishEntity != null ? 1.0F : 0.0F;
                }
            }
        });
    }

    @Override
    public ActionResult<ItemStack> onItemRightClick(World world, EntityPlayer entityPlayer, EnumHand enumHand) {
        ItemStack itemStack = entityPlayer.getHeldItem(EnumHand.MAIN_HAND);
        Item item = entityPlayer.getHeldItemMainhand().getItem();
        if (item == this) {
            if (!world.isRemote) {
                    Clawshot_Head clawshot_head = new Clawshot_Head(world,entityPlayer);
                    world.spawnEntity(clawshot_head);
            }
        }
        return new ActionResult(EnumActionResult.SUCCESS,itemStack);
    }

    @SideOnly(Side.CLIENT)
    public void initModel(){
        ModelLoader.setCustomModelResourceLocation(this, 0, new ModelResourceLocation(Objects.requireNonNull(getRegistryName()), "inventory"));
    }
}

 

And his head (Clawshot_Head.class):

import net.minecraft.entity.Entity;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.projectile.EntityFishHook;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.datasync.DataParameter;
import net.minecraft.network.datasync.DataSerializers;
import net.minecraft.network.datasync.EntityDataManager;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

import java.util.Iterator;
import java.util.List;

public class Clawshot_Head extends Entity{
    private EntityPlayer entityPlayer;
    public Entity caughtEntity;
    public Clawshot_Head.State currentState;
    private static final DataParameter<Integer> DATA_HOOKED_ENTITY;
    private boolean inGround;
    private int ticksInAir;
    public static ResourceLocation RESOURCE_LOCATION=new ResourceLocation("cruelars_triforcemod:textures/entity/projectiles/clawshot_head.png");

    public Clawshot_Head(World world){
        super(world);
        this.shoot((EntityPlayer)null);

    }

    public Clawshot_Head(World world, EntityPlayer entityPlayer){
        super(world);
        this.init(entityPlayer);
        this.currentState = Clawshot_Head.State.FLYING;
        this.setPosition((double)entityPlayer.posX,(double)entityPlayer.posY+entityPlayer.getEyeHeight(),(double)entityPlayer.posX);
        this.shoot(entityPlayer);
    }

    @SideOnly(Side.CLIENT)
    public Clawshot_Head(World world, EntityPlayer entityPlayer, double posX, double posY, double posZ) {
        super(world);
        this.init(entityPlayer);
        this.setPosition(posX,posY,posZ);
        this.prevPosX = this.posX;
        this.prevPosY = this.posY;
        this.prevPosZ = this.posZ;
    }

    public void notifyDataManagerChange(DataParameter<?> p_notifyDataManagerChange_1_) {
        if (DATA_HOOKED_ENTITY.equals(p_notifyDataManagerChange_1_)) {
            int i = (Integer)this.getDataManager().get(DATA_HOOKED_ENTITY);
            this.caughtEntity = i > 0 ? this.world.getEntityByID(i - 1) : null;
        }

        super.notifyDataManagerChange(p_notifyDataManagerChange_1_);
    }

    public void shoot(Entity entity){

        this.motionX=0.6D*entity.getLookVec().x;
        this.motionY=0.6D*entity.getLookVec().y;
        this.motionZ=0.6D*entity.getLookVec().z;

    }

    public void shoot(double p_shoot_1_, double p_shoot_3_, double p_shoot_5_, float p_shoot_7_, float p_shoot_8_){}

    private void init(EntityPlayer p_init_1_) {
        this.setSize(0.25F, 0.25F);
        this.ignoreFrustumCheck = true;
        this.entityPlayer = p_init_1_;
    }

    private void checkCollision() {
        Vec3d vec3d = new Vec3d(this.posX, this.posY, this.posZ);
        Vec3d vec3d1 = new Vec3d(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
        RayTraceResult raytraceresult = this.world.rayTraceBlocks(vec3d, vec3d1, false, true, false);
        vec3d = new Vec3d(this.posX, this.posY, this.posZ);
        vec3d1 = new Vec3d(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
        if (raytraceresult != null) {
            vec3d1 = new Vec3d(raytraceresult.hitVec.x, raytraceresult.hitVec.y, raytraceresult.hitVec.z);
            entityPlayer.posX=this.posX;
            entityPlayer.posY=this.posY;
            entityPlayer.posZ=this.posZ;
        }

        Entity entity = null;
        List<Entity> list = this.world.getEntitiesWithinAABBExcludingEntity(this, this.getEntityBoundingBox().expand(this.motionX, this.motionY, this.motionZ).grow(1.0D));
        double d0 = 0.0D;
        Iterator var8 = list.iterator();

        while(true) {
            Entity entity1;
            double d1;
            do {
                RayTraceResult raytraceresult1;
                do {
                    do {
                        do {
                            if (!var8.hasNext()) {
                                if (entity != null) {
                                    raytraceresult = new RayTraceResult(entity);
                                }

                                if (raytraceresult != null && raytraceresult.typeOfHit != RayTraceResult.Type.MISS) {
                                    if (raytraceresult.typeOfHit == RayTraceResult.Type.ENTITY) {
                                        this.caughtEntity = raytraceresult.entityHit;
                                        this.setHookedEntity();
                                    } else {
                                        this.inGround = true;
                                    }
                                }

                                return;
                            }

                            entity1 = (Entity)var8.next();
                        } while(!this.canBeHooked(entity1));
                    } while(entity1 == this.entityPlayer && this.ticksInAir < 5);

                    AxisAlignedBB axisalignedbb = entity1.getEntityBoundingBox().grow(0.30000001192092896D);
                    raytraceresult1 = axisalignedbb.calculateIntercept(vec3d, vec3d1);
                } while(raytraceresult1 == null);

                d1 = vec3d.squareDistanceTo(raytraceresult1.hitVec);
            } while(d1 >= d0 && d0 != 0.0D);

            entity = entity1;
            d0 = d1;
        }
    }

    private void setHookedEntity() {
        this.getDataManager().set(DATA_HOOKED_ENTITY, this.caughtEntity.getEntityId() + 1);
    }

    protected boolean canBeHooked(Entity p_canBeHooked_1_) {
        return p_canBeHooked_1_.canBeCollidedWith() || p_canBeHooked_1_ instanceof EntityItem;
    }

    protected void entityInit() {
        this.getDataManager().register(DATA_HOOKED_ENTITY, 0);
    }

    @Override
    protected void readEntityFromNBT(NBTTagCompound nbtTagCompound) {

    }

    @Override
    protected void writeEntityToNBT(NBTTagCompound nbtTagCompound) {

    }

    static {
        DATA_HOOKED_ENTITY = EntityDataManager.createKey(EntityFishHook.class, DataSerializers.VARINT);
    }

    static enum State {
        FLYING,
        HOOKED_IN_ENTITY;

        private State() {
        }
    }
}

 

For Registration:

In ModItems:

import com.cruelar.cruelars_triforcemod.Cruelars_Triforcemod_Core;
import com.cruelar.cruelars_triforcemod.items.*;
import net.minecraft.client.renderer.ItemMeshDefinition;
import net.minecraft.client.renderer.ItemModelMesher;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.client.resources.IReloadableResourceManager;
import net.minecraft.client.resources.IResourceManagerReloadListener;
import net.minecraft.init.Items;
import net.minecraft.init.SoundEvents;
import net.minecraft.item.Item;
import net.minecraft.item.ItemArmor;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumHand;
import net.minecraftforge.common.util.EnumHelper;
import net.minecraftforge.fml.common.Optional;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class ModItems  {

				...

    @GameRegistry.ObjectHolder("cruelars_triforcemod:clawshot_tp")
    public static Clawshot_TP clawshot_tp;

				...

    @SideOnly(Side.CLIENT)
    public static void initModels(){
        		...
        clawshot_tp.initModel();
				...
    }
}

 

In CommonProxy:

import com.cruelar.cruelars_triforcemod.*;
import com.cruelar.cruelars_triforcemod.init.ModArmor;
import com.cruelar.cruelars_triforcemod.init.ModBlocks;
import com.cruelar.cruelars_triforcemod.init.ModEntities;
import com.cruelar.cruelars_triforcemod.init.ModItems;
import com.cruelar.cruelars_triforcemod.blocks.*;
import com.cruelar.cruelars_triforcemod.items.*;
import com.cruelar.cruelars_triforcemod.tileentity.False_Block_TileEntity;
import com.cruelar.cruelars_triforcemod.tileentity.Hidden_Block_TileEntity;
import com.cruelar.cruelars_triforcemod.tileentity.Pedestal_Of_Time_TileEntity;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.potion.PotionType;
import net.minecraft.world.storage.loot.LootTableList;
import net.minecraftforge.common.config.Configuration;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Optional;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.network.NetworkRegistry;
import net.minecraftforge.fml.common.registry.GameRegistry;

import java.io.File;
import java.util.Objects;

import static com.cruelar.cruelars_triforcemod.Cruelars_Triforcemod_Core.instance;

@Mod.EventBusSubscriber(modid = Cruelars_Triforcemod_Core.MODID)
public class CommonProxy {
    public static Configuration config;


    public void preInit(FMLPreInitializationEvent event) {
        File directory = event.getModConfigurationDirectory();
        config = new Configuration(new File(directory.getPath(),"cruelars_triforcemod.cfg"));
        Config.readConfig();
        ModEntities.init();

    }
    
			...

    @SubscribeEvent
    public static void registerItems(RegistryEvent.Register<Item> event){
      		...
        event.getRegistry().register(new Clawshot_TP());
      		...
        }

}

In Mod Entities:

import com.cruelar.cruelars_triforcemod.Cruelars_Triforcemod_Core;
import com.cruelar.cruelars_triforcemod.entities.EntityBombPrimed;
import com.cruelar.cruelars_triforcemod.entities.boss.*;
import com.cruelar.cruelars_triforcemod.entities.monster.*;
import com.cruelar.cruelars_triforcemod.entities.passive.Fairy;
import com.cruelar.cruelars_triforcemod.entities.projectiles.*;
import com.cruelar.cruelars_triforcemod.renderer.*;
import net.minecraft.entity.EnumCreatureType;
import net.minecraft.init.Biomes;
import net.minecraft.world.storage.loot.LootTableList;
import net.minecraftforge.fml.client.registry.RenderingRegistry;
import net.minecraftforge.fml.common.registry.EntityRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class ModEntities {

    public static void init(){
        int id = 1;
        	... // current id is 14
        EntityRegistry.registerModEntity(Clawshot_Head.RESOURCE_LOCATION,Clawshot_Head.class,"cruelars_triforcemod:clawshot_head",id++,Cruelars_Triforcemod_Core.instance,64,3,true);
        		...

    }

    @SideOnly(Side.CLIENT)
    public static void initModels(){
				...
        RenderingRegistry.registerEntityRenderingHandler(Clawshot_Head.class,RenderClawshot.FACTORY);
        		...
    }
}

 

Rendering of the Head:

import com.cruelar.cruelars_triforcemod.entities.projectiles.Clawshot_Head;
import net.minecraft.client.renderer.entity.Render;
import net.minecraft.client.renderer.entity.RenderEntity;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fml.client.registry.IRenderFactory;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

@SideOnly(Side.CLIENT)
public class RenderClawshot extends RenderEntity {
    public static final ResourceLocation RES_ARROW = new ResourceLocation("textures/entity/projectiles/arrow.png");
    public static final ResourceLocation RES_Bomb_ARROW = new ResourceLocation("textures/entity/projectiles/clawshot_head.png");
    public static final Factory FACTORY = new Factory();

    public RenderClawshot(RenderManager p_i46547_1_) {
        super(p_i46547_1_);
    }

    protected ResourceLocation getEntityTexture() {
        return Clawshot_Head.RESOURCE_LOCATION;
    }

    public static class Factory implements IRenderFactory<Clawshot_Head> {

        @Override
        public Render<? super Clawshot_Head> createRenderFor(RenderManager manager){
            return new RenderClawshot(manager);
        }
    }
}

 

Any advise on creating topics is also helpful, because I'm german and new to this.

Edited by _Cruelar_
Better Topictitle

My Projects:

Cruelars Triforcemod (1.12 release; 1.14 alpha soon coming)

 

Important:

As my mod is on at least 10 different third party sites without my permission, I want to warn you about that with a link to StopModReposts

Link to comment
Share on other sites

  • 3 weeks later...
  • Replies 87
  • Created
  • Last Reply

Top Posters In This Topic

Looking at it briefly, the fishhook along with other "entity objects" like minecart are spawned on the client side based on a packet called SPacketSpawnObject. You can see the processing of that received packet in NetHandlerPlayClient#handleSpawnObject() method. Basically the vanilla objects are hard-coded to a number of values (fishhook is 90).

 

So you won't be able to use the same packet, but you may have to try to replicate the same system. At the time you spawn the fishhook on the server side you probably need to send a custom packet that then spawns on client similarly.

 

However, it may be possible to be simpler than that. In your onItemRightClick() you're specifically checking for server side before spawning. What happens if you just allow it to spawn on both sides? I think the problem though is for other players -- even if this works for singleplayer I'm not sure that other people would see it without packets. 

 

I also think that doing a registered entity approach could work, but not entirely sure what modifications would be needed.

 

In any case, the most obvious way of copying the fishhook is to send a spawn packet from server. So check out how the SPacketSpawnObject is sent for fishhook and then send a similar custom packet for your claw.. 

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Link to comment
Share on other sites

3 hours ago, diesieben07 said:

No need for a custom packet. This is the reason IEntityAdditionalSpawnData exists.

So how would I use this?

Also I've found an error while trying to use it (doesn't breaks the game)

[13:02:45] [main/FATAL]: Error executing task
java.util.concurrent.ExecutionException: java.lang.RuntimeException: A severe problem occurred during the spawning of an entity at (194.78415135238228, 74.54834158954293, 194.78415135238228)
	at java.util.concurrent.FutureTask.report(FutureTask.java:122) ~[?:1.8.0_152]
	at java.util.concurrent.FutureTask.get(FutureTask.java:192) ~[?:1.8.0_152]
	at net.minecraft.util.Util.runTask(SourceFile:47) [Util.class:?]
	at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1086) [Minecraft.class:?]
	at net.minecraft.client.Minecraft.run(Minecraft.java:397) [Minecraft.class:?]
	at net.minecraft.client.main.Main.main(SourceFile:123) [Main.class:?]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_152]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_152]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_152]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_152]
	at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?]
	at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_152]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_152]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_152]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_152]
	at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?]
	at GradleStart.main(GradleStart.java:26) [start/:?]
Caused by: java.lang.RuntimeException: A severe problem occurred during the spawning of an entity at (194.78415135238228, 74.54834158954293, 194.78415135238228)
	at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.spawnEntity(EntitySpawnHandler.java:136) ~[EntitySpawnHandler.class:?]
	at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.process(EntitySpawnHandler.java:64) ~[EntitySpawnHandler.class:?]
	at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.lambda$channelRead0$0(EntitySpawnHandler.java:55) ~[EntitySpawnHandler.class:?]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[?:1.8.0_152]
	at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_152]
	at net.minecraft.util.Util.runTask(SourceFile:46) ~[Util.class:?]
	... 15 more
Caused by: java.lang.reflect.InvocationTargetException
	at sun.reflect.GeneratedConstructorAccessor60.newInstance(Unknown Source) ~[?:?]
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_152]
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[?:1.8.0_152]
	at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.spawnEntity(EntitySpawnHandler.java:88) ~[EntitySpawnHandler.class:?]
	at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.process(EntitySpawnHandler.java:64) ~[EntitySpawnHandler.class:?]
	at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.lambda$channelRead0$0(EntitySpawnHandler.java:55) ~[EntitySpawnHandler.class:?]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[?:1.8.0_152]
	at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_152]
	at net.minecraft.util.Util.runTask(SourceFile:46) ~[Util.class:?]
	... 15 more
Caused by: java.lang.NullPointerException
	at com.cruelar.cruelars_triforcemod.entities.projectiles.Clawshot_Head.shoot(Clawshot_Head.java:89) ~[Clawshot_Head.class:?]
	at com.cruelar.cruelars_triforcemod.entities.projectiles.Clawshot_Head.<init>(Clawshot_Head.java:33) ~[Clawshot_Head.class:?]
	at sun.reflect.GeneratedConstructorAccessor60.newInstance(Unknown Source) ~[?:?]
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_152]
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[?:1.8.0_152]
	at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.spawnEntity(EntitySpawnHandler.java:88) ~[EntitySpawnHandler.class:?]
	at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.process(EntitySpawnHandler.java:64) ~[EntitySpawnHandler.class:?]
	at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.lambda$channelRead0$0(EntitySpawnHandler.java:55) ~[EntitySpawnHandler.class:?]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[?:1.8.0_152]
	at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_152]
	at net.minecraft.util.Util.runTask(SourceFile:46) ~[Util.class:?]
	... 15 more

 

14 hours ago, jabelar said:

However, it may be possible to be simpler than that. In your onItemRightClick() you're specifically checking for server side before spawning. What happens if you just allow it to spawn on both sides?

Doesn't change anything.

My Projects:

Cruelars Triforcemod (1.12 release; 1.14 alpha soon coming)

 

Important:

As my mod is on at least 10 different third party sites without my permission, I want to warn you about that with a link to StopModReposts

Link to comment
Share on other sites

8 minutes ago, diesieben07 said:

You did not even show your code...

I've haven't changed anything so far (except trying once with out the if(world!=remote)) because I don't have any idea what to do

for example should my Entity implement the interface or the Renderer?

If the Entity should: what I'm supposed to write into the methods of the interface?

Same for the case the Renderer should implement it.

 

Some example code could really help me.

Edited by _Cruelar_

My Projects:

Cruelars Triforcemod (1.12 release; 1.14 alpha soon coming)

 

Important:

As my mod is on at least 10 different third party sites without my permission, I want to warn you about that with a link to StopModReposts

Link to comment
Share on other sites

1 hour ago, _Cruelar_ said:

for example should my Entity implement the interface or the Renderer?

Please read the javadocs for the interface, they explain this.

 

1 hour ago, _Cruelar_ said:

If the Entity should: what I'm supposed to write into the methods of the interface?

You need to serialize and deserialize any additional information that is needed on the client when the entity is spawned.

Link to comment
Share on other sites

6 hours ago, diesieben07 said:

No need for a custom packet. This is the reason IEntityAdditionalSpawnData exists.

 

He's not actually trying to send additional data though, he's trying to get the client-side entity to spawn in the first place. For the vanilla fish hook there is a dedicated packet type for this SServerSpawnObject that is distinct from other entities.

 

Now ultimately I asume he can rely on a regular registered entity type of spawn mechanism, but just that if the approach is to copy the fishhook approach it might be a bit different..

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Link to comment
Share on other sites

Could anyone please tell me if the Problem results in the NPE in the error above and how to fix that. Cause I'm lost in Forge Javadoc and now completely confused. I've no idea what you mean with all this.

I copied from Fishing hook as I thought the fishingrod Fishinghook relation is quite similar to the Clawshot clawshot_head relation. But I see this is quite complicated so what should I do.

My Projects:

Cruelars Triforcemod (1.12 release; 1.14 alpha soon coming)

 

Important:

As my mod is on at least 10 different third party sites without my permission, I want to warn you about that with a link to StopModReposts

Link to comment
Share on other sites

31 minutes ago, jabelar said:

Now ultimately I asume he can rely on a regular registered entity type of spawn mechanism, but just that if the approach is to copy the fishhook approach it might be a bit different..

Vanilla uses different packets to send additional spawn data. With Forge that is not needed.

Link to comment
Share on other sites

@diesieben07

That may is right but it doesn't help me. I don't understand HOW this works, I don't want to know WHY this or the other thing is better. I've found something what might be the result of the Problem(see my post above) and hope that you guys can tell me how to solve this. Soory to be such an idiot that I don't understand what you mean with the posts above but I'm still quite new to forge and don't know much about networking. I simply tried to copy something from Vanilla and adapt to my needs what in the most cases works well.

Edited by _Cruelar_

My Projects:

Cruelars Triforcemod (1.12 release; 1.14 alpha soon coming)

 

Important:

As my mod is on at least 10 different third party sites without my permission, I want to warn you about that with a link to StopModReposts

Link to comment
Share on other sites

So with classic System.out.println(entity) i got this

[11:07:49] [Server thread/INFO] [STDOUT]: [com.cruelar.cruelars_triforcemod.entities.projectiles.Clawshot_Head:shoot:89]: EntityPlayerMP['Player87'/318, l='Triforce Test', x=227.66, y=95.00, z=265.97]
[11:07:49] [main/INFO] [STDOUT]: [com.cruelar.cruelars_triforcemod.entities.projectiles.Clawshot_Head:shoot:89]: null

This means the code finds the Player on Serverside but not on Client, I think

 

On 7/19/2018 at 10:17 PM, jabelar said:

However, it may be possible to be simpler than that. In your onItemRightClick() you're specifically checking for server side before spawning. What happens if you just allow it to spawn on both sides?

Then I get this

[11:13:10] [main/INFO] [STDOUT]: [com.cruelar.cruelars_triforcemod.entities.projectiles.Clawshot_Head:shoot:89]: EntityPlayerSP['Player636'/318, l='MpServer', x=227.66, y=95.00, z=265.97]
[11:13:10] [Server thread/INFO] [STDOUT]: [com.cruelar.cruelars_triforcemod.entities.projectiles.Clawshot_Head:shoot:89]: EntityPlayerMP['Player636'/318, l='Triforce Test', x=227.66, y=95.00, z=265.97]
[11:13:10] [main/INFO] [STDOUT]: [com.cruelar.cruelars_triforcemod.entities.projectiles.Clawshot_Head:shoot:89]: null

He seems to have touble to get the normal Player.

 

My Projects:

Cruelars Triforcemod (1.12 release; 1.14 alpha soon coming)

 

Important:

As my mod is on at least 10 different third party sites without my permission, I want to warn you about that with a link to StopModReposts

Link to comment
Share on other sites

Now I understand what you mean, but what should I write into writeSpawnData? I think I have to add the Player somehow to the ByteBuf but how would I write an EntityPlayer to it?

package com.cruelar.cruelars_triforcemod.entities.projectiles;

import io.netty.buffer.ByteBuf;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.projectile.EntityFishHook;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.datasync.DataParameter;
import net.minecraft.network.datasync.DataSerializers;
import net.minecraft.network.datasync.EntityDataManager;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

import java.util.Iterator;
import java.util.List;

public class Clawshot_Head extends Entity implements IEntityAdditionalSpawnData{
    private EntityPlayer entityPlayer;
    public Entity caughtEntity;
    public Clawshot_Head.State currentState;
    private static final DataParameter<Integer> DATA_HOOKED_ENTITY;
    private boolean inGround;
    private int ticksInAir;
    public static ResourceLocation RESOURCE_LOCATION=new ResourceLocation("cruelars_triforcemod:textures/entity/projectiles/clawshot_head.png");

    public Clawshot_Head(World world){
        super(world);
    }

    public Clawshot_Head(World world, EntityPlayer entityPlayer){
        super(world);
        this.init(entityPlayer);
        this.currentState = Clawshot_Head.State.FLYING;
        this.setPosition((double)entityPlayer.posX,(double)entityPlayer.posY+entityPlayer.getEyeHeight(),(double)entityPlayer.posX);
        this.shoot(entityPlayer);
    }

    @SideOnly(Side.CLIENT)
    public Clawshot_Head(World world, EntityPlayer entityPlayer, double posX, double posY, double posZ) {
        super(world);
        this.init(entityPlayer);
        this.setPosition(posX,posY,posZ);
        this.prevPosX = this.posX;
        this.prevPosY = this.posY;
        this.prevPosZ = this.posZ;
    }

    public void notifyDataManagerChange(DataParameter<?> p_notifyDataManagerChange_1_) {
        if (DATA_HOOKED_ENTITY.equals(p_notifyDataManagerChange_1_)) {
            int i = (Integer)this.getDataManager().get(DATA_HOOKED_ENTITY);
            this.caughtEntity = i > 0 ? this.world.getEntityByID(i - 1) : null;
        }

        super.notifyDataManagerChange(p_notifyDataManagerChange_1_);
    }

    public void shoot(Entity entity) {
        System.out.println(entity);
        this.motionX=0.6D*entity.getLookVec().x;
        this.motionY=0.6D*entity.getLookVec().y;
        this.motionZ=0.6D*entity.getLookVec().z;

    }

    public void shoot(double p_shoot_1_, double p_shoot_3_, double p_shoot_5_, float p_shoot_7_, float p_shoot_8_){}

    private void init(EntityPlayer p_init_1_) {
        this.setSize(0.25F, 0.25F);
        this.ignoreFrustumCheck = true;
        this.entityPlayer = p_init_1_;
    }

    private void checkCollision() {
        Vec3d vec3d = new Vec3d(this.posX, this.posY, this.posZ);
        Vec3d vec3d1 = new Vec3d(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
        RayTraceResult raytraceresult = this.world.rayTraceBlocks(vec3d, vec3d1, false, true, false);
        vec3d = new Vec3d(this.posX, this.posY, this.posZ);
        vec3d1 = new Vec3d(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
        if (raytraceresult != null) {
            vec3d1 = new Vec3d(raytraceresult.hitVec.x, raytraceresult.hitVec.y, raytraceresult.hitVec.z);
            entityPlayer.posX=this.posX;
            entityPlayer.posY=this.posY;
            entityPlayer.posZ=this.posZ;
        }

        Entity entity = null;
        List<Entity> list = this.world.getEntitiesWithinAABBExcludingEntity(this, this.getEntityBoundingBox().expand(this.motionX, this.motionY, this.motionZ).grow(1.0D));
        double d0 = 0.0D;
        Iterator var8 = list.iterator();

        while(true) {
            Entity entity1;
            double d1;
            do {
                RayTraceResult raytraceresult1;
                do {
                    do {
                        do {
                            if (!var8.hasNext()) {
                                if (entity != null) {
                                    raytraceresult = new RayTraceResult(entity);
                                }

                                if (raytraceresult != null && raytraceresult.typeOfHit != RayTraceResult.Type.MISS) {
                                    if (raytraceresult.typeOfHit == RayTraceResult.Type.ENTITY) {
                                        this.caughtEntity = raytraceresult.entityHit;
                                        this.setHookedEntity();
                                    } else {
                                        this.inGround = true;
                                    }
                                }

                                return;
                            }

                            entity1 = (Entity)var8.next();
                        } while(!this.canBeHooked(entity1));
                    } while(entity1 == this.entityPlayer && this.ticksInAir < 5);

                    AxisAlignedBB axisalignedbb = entity1.getEntityBoundingBox().grow(0.30000001192092896D);
                    raytraceresult1 = axisalignedbb.calculateIntercept(vec3d, vec3d1);
                } while(raytraceresult1 == null);

                d1 = vec3d.squareDistanceTo(raytraceresult1.hitVec);
            } while(d1 >= d0 && d0 != 0.0D);

            entity = entity1;
            d0 = d1;
        }
    }

    private void setHookedEntity() {
        this.getDataManager().set(DATA_HOOKED_ENTITY, this.caughtEntity.getEntityId() + 1);
    }

    protected boolean canBeHooked(Entity p_canBeHooked_1_) {
        return p_canBeHooked_1_.canBeCollidedWith() || p_canBeHooked_1_ instanceof EntityItem;
    }

    protected void entityInit() {
        this.getDataManager().register(DATA_HOOKED_ENTITY, 0);
    }

    @Override
    protected void readEntityFromNBT(NBTTagCompound nbtTagCompound) {

    }

    @Override
    protected void writeEntityToNBT(NBTTagCompound nbtTagCompound) {

    }

    static {
        DATA_HOOKED_ENTITY = EntityDataManager.createKey(EntityFishHook.class, DataSerializers.VARINT);
    }

    @Override
    public void writeSpawnData(ByteBuf buffer) {
    }

    @Override
    public void readSpawnData(ByteBuf additionalData) {

    }

    static enum State {
        FLYING,
        HOOKED_IN_ENTITY;

        private State() {
        }
    }
}

 

My Projects:

Cruelars Triforcemod (1.12 release; 1.14 alpha soon coming)

 

Important:

As my mod is on at least 10 different third party sites without my permission, I want to warn you about that with a link to StopModReposts

Link to comment
Share on other sites

Still doesn't work. What is wrong?

package com.cruelar.cruelars_triforcemod.entities.projectiles;

import io.netty.buffer.ByteBuf;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.projectile.EntityFishHook;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.datasync.DataParameter;
import net.minecraft.network.datasync.DataSerializers;
import net.minecraft.network.datasync.EntityDataManager;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

import java.util.Iterator;
import java.util.List;

public class Clawshot_Head extends Entity implements IEntityAdditionalSpawnData{
    private EntityPlayer entityPlayer;
    public Entity caughtEntity;
    public Clawshot_Head.State currentState;
    private static final DataParameter<Integer> DATA_HOOKED_ENTITY;
    private boolean inGround;
    private int ticksInAir;
    public static ResourceLocation RESOURCE_LOCATION=new ResourceLocation("cruelars_triforcemod:textures/entity/projectiles/clawshot_head.png");

    public Clawshot_Head(World world){
        super(world);
        this.shoot(entityPlayer);
    }

    public Clawshot_Head(World world, EntityPlayer entityPlayer){
        super(world);
        this.init(entityPlayer);
        this.currentState = Clawshot_Head.State.FLYING;
        this.setPosition((double)entityPlayer.posX,(double)entityPlayer.posY+entityPlayer.getEyeHeight(),(double)entityPlayer.posX);
        this.shoot(entityPlayer);
    }

    @SideOnly(Side.CLIENT)
    public Clawshot_Head(World world, EntityPlayer entityPlayer, double posX, double posY, double posZ) {
        super(world);
        this.init(entityPlayer);
        this.setPosition(posX,posY,posZ);
        this.prevPosX = this.posX;
        this.prevPosY = this.posY;
        this.prevPosZ = this.posZ;
    }

    public void notifyDataManagerChange(DataParameter<?> p_notifyDataManagerChange_1_) {
        if (DATA_HOOKED_ENTITY.equals(p_notifyDataManagerChange_1_)) {
            int i = (Integer)this.getDataManager().get(DATA_HOOKED_ENTITY);
            this.caughtEntity = i > 0 ? this.world.getEntityByID(i - 1) : null;
        }

        super.notifyDataManagerChange(p_notifyDataManagerChange_1_);
    }

    public void shoot(Entity entity) {
        System.out.println(entity);
        this.motionX=0.6D*entity.getLookVec().x;
        this.motionY=0.6D*entity.getLookVec().y;
        this.motionZ=0.6D*entity.getLookVec().z;

    }

    public void shoot(double p_shoot_1_, double p_shoot_3_, double p_shoot_5_, float p_shoot_7_, float p_shoot_8_){}

    private void init(EntityPlayer p_init_1_) {
        this.setSize(0.25F, 0.25F);
        this.ignoreFrustumCheck = true;
        this.entityPlayer = p_init_1_;
    }

    private void checkCollision() {
        Vec3d vec3d = new Vec3d(this.posX, this.posY, this.posZ);
        Vec3d vec3d1 = new Vec3d(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
        RayTraceResult raytraceresult = this.world.rayTraceBlocks(vec3d, vec3d1, false, true, false);
        vec3d = new Vec3d(this.posX, this.posY, this.posZ);
        vec3d1 = new Vec3d(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
        if (raytraceresult != null) {
            vec3d1 = new Vec3d(raytraceresult.hitVec.x, raytraceresult.hitVec.y, raytraceresult.hitVec.z);
            entityPlayer.posX=this.posX;
            entityPlayer.posY=this.posY;
            entityPlayer.posZ=this.posZ;
        }

        Entity entity = null;
        List<Entity> list = this.world.getEntitiesWithinAABBExcludingEntity(this, this.getEntityBoundingBox().expand(this.motionX, this.motionY, this.motionZ).grow(1.0D));
        double d0 = 0.0D;
        Iterator var8 = list.iterator();

        while(true) {
            Entity entity1;
            double d1;
            do {
                RayTraceResult raytraceresult1;
                do {
                    do {
                        do {
                            if (!var8.hasNext()) {
                                if (entity != null) {
                                    raytraceresult = new RayTraceResult(entity);
                                }

                                if (raytraceresult != null && raytraceresult.typeOfHit != RayTraceResult.Type.MISS) {
                                    if (raytraceresult.typeOfHit == RayTraceResult.Type.ENTITY) {
                                        this.caughtEntity = raytraceresult.entityHit;
                                        this.setHookedEntity();
                                    } else {
                                        this.inGround = true;
                                    }
                                }

                                return;
                            }

                            entity1 = (Entity)var8.next();
                        } while(!this.canBeHooked(entity1));
                    } while(entity1 == this.entityPlayer && this.ticksInAir < 5);

                    AxisAlignedBB axisalignedbb = entity1.getEntityBoundingBox().grow(0.30000001192092896D);
                    raytraceresult1 = axisalignedbb.calculateIntercept(vec3d, vec3d1);
                } while(raytraceresult1 == null);

                d1 = vec3d.squareDistanceTo(raytraceresult1.hitVec);
            } while(d1 >= d0 && d0 != 0.0D);

            entity = entity1;
            d0 = d1;
        }
    }

    private void setHookedEntity() {
        this.getDataManager().set(DATA_HOOKED_ENTITY, this.caughtEntity.getEntityId() + 1);
    }

    protected boolean canBeHooked(Entity p_canBeHooked_1_) {
        return p_canBeHooked_1_.canBeCollidedWith() || p_canBeHooked_1_ instanceof EntityItem;
    }

    protected void entityInit() {
        this.getDataManager().register(DATA_HOOKED_ENTITY, 0);
    }

    @Override
    protected void readEntityFromNBT(NBTTagCompound nbtTagCompound) {

    }

    @Override
    protected void writeEntityToNBT(NBTTagCompound nbtTagCompound) {

    }

    static {
        DATA_HOOKED_ENTITY = EntityDataManager.createKey(EntityFishHook.class, DataSerializers.VARINT);
    }

    @Override
    public void writeSpawnData(ByteBuf buffer) {
        if (entityPlayer!=null) {
            buffer.writeInt(entityPlayer.getEntityId());
        }
    }

    @Override
    public void readSpawnData(ByteBuf additionalData) {
        entityPlayer=(EntityPlayer) world.getEntityByID(additionalData.readInt());
    }

    static enum State {
        FLYING,
        HOOKED_IN_ENTITY;

        private State() {
        }
    }
}

 

My Projects:

Cruelars Triforcemod (1.12 release; 1.14 alpha soon coming)

 

Important:

As my mod is on at least 10 different third party sites without my permission, I want to warn you about that with a link to StopModReposts

Link to comment
Share on other sites

This means nothing has changed. Here the log:

Spoiler

[18:32:07] [Server thread/INFO] [STDOUT]: [com.cruelar.cruelars_triforcemod.entities.projectiles.Clawshot_Head:shoot:90]: EntityPlayerMP['Player671'/344, l='Triforce Test', x=237.23, y=97.87, z=265.72]
[18:32:07] [main/INFO] [STDOUT]: [com.cruelar.cruelars_triforcemod.entities.projectiles.Clawshot_Head:shoot:90]: null
[18:32:07] [main/FATAL] [net.minecraft.client.Minecraft]: Error executing task
java.util.concurrent.ExecutionException: java.lang.RuntimeException: A severe problem occurred during the spawning of an entity at (237.23063243784554, 99.48859856618026, 237.23063243784554)
    at java.util.concurrent.FutureTask.report(FutureTask.java:122) ~[?:1.8.0_152]
    at java.util.concurrent.FutureTask.get(FutureTask.java:192) ~[?:1.8.0_152]
    at net.minecraft.util.Util.runTask(Util.java:54) [Util.class:?]
    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1176) [Minecraft.class:?]
    at net.minecraft.client.Minecraft.run(Minecraft.java:441) [Minecraft.class:?]
    at net.minecraft.client.main.Main.main(Main.java:118) [Main.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_152]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_152]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_152]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_152]
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?]
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_152]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_152]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_152]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_152]
    at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?]
    at GradleStart.main(GradleStart.java:25) [start/:?]
Caused by: java.lang.RuntimeException: A severe problem occurred during the spawning of an entity at (237.23063243784554, 99.48859856618026, 237.23063243784554)
    at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.spawnEntity(EntitySpawnHandler.java:136) ~[EntitySpawnHandler.class:?]
    at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.process(EntitySpawnHandler.java:64) ~[EntitySpawnHandler.class:?]
    at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.lambda$channelRead0$0(EntitySpawnHandler.java:55) ~[EntitySpawnHandler.class:?]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[?:1.8.0_152]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_152]
    at net.minecraft.util.Util.runTask(Util.java:53) ~[Util.class:?]
    ... 15 more
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_152]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[?:1.8.0_152]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_152]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[?:1.8.0_152]
    at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.spawnEntity(EntitySpawnHandler.java:88) ~[EntitySpawnHandler.class:?]
    at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.process(EntitySpawnHandler.java:64) ~[EntitySpawnHandler.class:?]
    at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.lambda$channelRead0$0(EntitySpawnHandler.java:55) ~[EntitySpawnHandler.class:?]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[?:1.8.0_152]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_152]
    at net.minecraft.util.Util.runTask(Util.java:53) ~[Util.class:?]
    ... 15 more
Caused by: java.lang.NullPointerException
    at com.cruelar.cruelars_triforcemod.entities.projectiles.Clawshot_Head.shoot(Clawshot_Head.java:91) ~[Clawshot_Head.class:?]
    at com.cruelar.cruelars_triforcemod.entities.projectiles.Clawshot_Head.<init>(Clawshot_Head.java:35) ~[Clawshot_Head.class:?]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_152]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[?:1.8.0_152]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_152]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[?:1.8.0_152]
    at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.spawnEntity(EntitySpawnHandler.java:88) ~[EntitySpawnHandler.class:?]
    at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.process(EntitySpawnHandler.java:64) ~[EntitySpawnHandler.class:?]
    at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.lambda$channelRead0$0(EntitySpawnHandler.java:55) ~[EntitySpawnHandler.class:?]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[?:1.8.0_152]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_152]
    at net.minecraft.util.Util.runTask(Util.java:53) ~[Util.class:?]
    ... 15 more

 

My Projects:

Cruelars Triforcemod (1.12 release; 1.14 alpha soon coming)

 

Important:

As my mod is on at least 10 different third party sites without my permission, I want to warn you about that with a link to StopModReposts

Link to comment
Share on other sites

5 minutes ago, diesieben07 said:

Also, your writeSpawnData and readSpawnData are not symmetrical. You must write exactly the same data you read.

Why that? I use the Player to write his id and I get the Player by reading his Id.

7 minutes ago, diesieben07 said:

You are calling shoot in the constructor. readSpawnData will be called afterwards.

So where should I call it? in onItemRightClick?

My Projects:

Cruelars Triforcemod (1.12 release; 1.14 alpha soon coming)

 

Important:

As my mod is on at least 10 different third party sites without my permission, I want to warn you about that with a link to StopModReposts

Link to comment
Share on other sites

Just now, _Cruelar_ said:

I use the Player to write his id and I get the Player by reading his Id.

Not correct. You only sometimes write the ID, but always read it.

 

1 minute ago, _Cruelar_ said:

So where should I call it? in onItemRightClick?

On the client it would be after the spawn data was read.

Link to comment
Share on other sites

11 minutes ago, diesieben07 said:

Not correct. You only sometimes write the ID, but always read it.

Is this better or would always write and always read be better?

@Override
    public void writeSpawnData(ByteBuf buffer) {
        if (entityPlayer!=null) {
            buffer.writeInt(entityPlayer.getEntityId());
        }
    }

    @Override
    public void readSpawnData(ByteBuf additionalData) {
        EntityPlayer entityByID=(EntityPlayer) world.getEntityByID(additionalData.readInt());
        if (entityByID!=null){
            entityPlayer=entityByID;
        }
        if (world.isRemote){
            this.shoot(entityPlayer);
        }
    }

 

Also I'm still not sure where shoot would be best. I've tried in onItemRightClick what resulted in this:

Spoiler

[19:13:37] [main/FATAL] [net.minecraft.client.Minecraft]: Error executing task
java.util.concurrent.ExecutionException: java.lang.RuntimeException: A severe problem occurred during the spawning of an entity at (237.23063243784554, 99.48859856618026, 237.23063243784554)
    at java.util.concurrent.FutureTask.report(FutureTask.java:122) ~[?:1.8.0_152]
    at java.util.concurrent.FutureTask.get(FutureTask.java:192) ~[?:1.8.0_152]
    at net.minecraft.util.Util.runTask(Util.java:54) [Util.class:?]
    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1176) [Minecraft.class:?]
    at net.minecraft.client.Minecraft.run(Minecraft.java:441) [Minecraft.class:?]
    at net.minecraft.client.main.Main.main(Main.java:118) [Main.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_152]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_152]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_152]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_152]
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?]
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_152]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_152]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_152]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_152]
    at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?]
    at GradleStart.main(GradleStart.java:25) [start/:?]
Caused by: java.lang.RuntimeException: A severe problem occurred during the spawning of an entity at (237.23063243784554, 99.48859856618026, 237.23063243784554)
    at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.spawnEntity(EntitySpawnHandler.java:136) ~[EntitySpawnHandler.class:?]
    at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.process(EntitySpawnHandler.java:64) ~[EntitySpawnHandler.class:?]
    at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.lambda$channelRead0$0(EntitySpawnHandler.java:55) ~[EntitySpawnHandler.class:?]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[?:1.8.0_152]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_152]
    at net.minecraft.util.Util.runTask(Util.java:53) ~[Util.class:?]
    ... 15 more
Caused by: java.lang.IndexOutOfBoundsException: readerIndex(99) + length(4) exceeds writerIndex(99): UnpooledSlicedByteBuf(ridx: 99, widx: 99, cap: 99/99, unwrapped: UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf(ridx: 0, widx: 100, cap: 256))
    at io.netty.buffer.AbstractByteBuf.checkReadableBytes0(AbstractByteBuf.java:1396) ~[AbstractByteBuf.class:4.1.9.Final]
    at io.netty.buffer.AbstractByteBuf.readInt(AbstractByteBuf.java:766) ~[AbstractByteBuf.class:4.1.9.Final]
    at com.cruelar.cruelars_triforcemod.entities.projectiles.Clawshot_Head.readSpawnData(Clawshot_Head.java:198) ~[Clawshot_Head.class:?]
    at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.spawnEntity(EntitySpawnHandler.java:130) ~[EntitySpawnHandler.class:?]
    at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.process(EntitySpawnHandler.java:64) ~[EntitySpawnHandler.class:?]
    at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.lambda$channelRead0$0(EntitySpawnHandler.java:55) ~[EntitySpawnHandler.class:?]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[?:1.8.0_152]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_152]
    at net.minecraft.util.Util.runTask(Util.java:53) ~[Util.class:?]
    ... 15 more
[19:13:38] [main/INFO] [net.minecraft.client.gui.GuiNewChat]: [CHAT] §eJourneyMap:§f Press [§bJ§f]
[19:13:40] [main/INFO] [STDOUT]: [com.cruelar.cruelars_triforcemod.entities.projectiles.Clawshot_Head:shoot:89]: EntityPlayerSP['Player394'/317, l='MpServer', x=237.23, y=97.87, z=265.72]
[19:13:40] [main/INFO] [STDOUT]: [com.cruelar.cruelars_triforcemod.entities.projectiles.Clawshot_Head:shoot:89]: EntityPlayerSP['Player394'/317, l='MpServer', x=237.23, y=97.87, z=265.72]
[19:13:40] [Server thread/INFO] [STDOUT]: [com.cruelar.cruelars_triforcemod.entities.projectiles.Clawshot_Head:shoot:89]: EntityPlayerMP['Player394'/317, l='Triforce Test', x=237.23, y=97.87, z=265.72]
[19:13:40] [main/INFO] [STDOUT]: [com.cruelar.cruelars_triforcemod.entities.projectiles.Clawshot_Head:shoot:89]: EntityPlayerSP['Player394'/317, l='MpServer', x=237.23, y=97.87, z=265.72]

 

My Projects:

Cruelars Triforcemod (1.12 release; 1.14 alpha soon coming)

 

Important:

As my mod is on at least 10 different third party sites without my permission, I want to warn you about that with a link to StopModReposts

Link to comment
Share on other sites

You are still only sometimes writing an int but always reading an int.

 

1 minute ago, _Cruelar_ said:

Also I'm still not sure where shoot would be best.

I already told you were and you implemented it, although there is no need to check that you are on the client in readSpawnData, it will always be true.

 

2 minutes ago, _Cruelar_ said:

I've tried in onItemRightClick what resulted in this

This is the error you get if you write different data than you try to read. See above.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share




×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.