Jump to content

Problem with my mountable entity


Jammy780

Recommended Posts

Hi there, I'm having some problems and I think its forge related because when I used an older version of Forge it worked without error. This is my problem: ib9k3r.png That white block never came up before, but now every chair I sit on it comes up with this. Note: this works fine in SSP, the problem is only in SMP! Please could somebody offer some help? these are the codes I'm using:

 

Mod file code SSP/SMP:

MinecraftForge.registerEntity(EntityMountableBlock.class, mod_JammyFurniture.instance, 5, 5, 160, true);

 

BlockMountable.java in SSP/SMP

package net.minecraft.src.JAMMY780.util;

import java.util.List;

import net.minecraft.src.AxisAlignedBB;
import net.minecraft.src.Block;
import net.minecraft.src.EntityPlayer;
import net.minecraft.src.Material;
import net.minecraft.src.World;

/*ITOS: MP client version.
*This class is for your convenience. It is not necessary for your block to be a subclass of this class. 
*As long as your block has and/or calls the methods specified here it can use the EntityMountableBlock 
*class. If your class is a subclass to this class you don't have to do anything to be able to mount it, 
*just make sure that the blockActivated methods are not overridden.
*/

public class BlockMountable extends Block
{

//This constructor just pass thing on.
public BlockMountable(int x, Material material)
{
	super(x, material);
}

//This constructor just pass thing on.
public BlockMountable(int x, int y, Material material)
{
	super(x, y, material);
}

//This method use the main blockActivated with the default mounting position.
public boolean blockActivated(World world, int i, int j, int k, EntityPlayer entityplayer)
    {
	return blockActivated(world, i, j, k, entityplayer, 0.5F, 1.0F, 0.5F, 0, 0, 0, 0);
    }

//This method use the main blockActivated with a custom mounting height.
public static boolean blockActivated(World world, int i, int j, int k, EntityPlayer entityplayer, float y)
    {
	return blockActivated(world, i, j, k, entityplayer, 0.5F, y, 0.5F, 0, 0, 0, 0);
    }
    
//This is the main blockActivated method that specifies what happens when a player interact with the block.
public static boolean blockActivated(World world, int i, int j, int k, EntityPlayer entityplayer, float x, float y, float z, int north, int south, int east, int west)
    {
	if (!world.isRemote)
	{
		//Looks for EMBs up to 1 block away from the activated block. Hopefully you didn't set the mounting position further away than this.
		List<EntityMountableBlock> list = world.getEntitiesWithinAABB(EntityMountableBlock.class, AxisAlignedBB.getBoundingBoxFromPool(i, j, k, i + 1.0D, j + 1.0D, k + 1.0D).expand(1D, 1D, 1D));
    	for (EntityMountableBlock entitytocheck : list)
    	{
    		//Looks for an EMB created by this block.
    		if (entitytocheck.orgBlockPosX == i && entitytocheck.orgBlockPosY == j && entitytocheck.orgBlockPosZ == k)
    		{
    			//Player wants to get off the block.
    			if (entitytocheck.riddenByEntity == entityplayer)
    			{
    				entitytocheck.interact(entityplayer);
    				return true;
    			}
    			//EMB is used by someone else.
    			if (entitytocheck.riddenByEntity != entityplayer && entitytocheck.riddenByEntity != null)
    			{
    				return true;
    			}
    			//EMB exist but no-one is sitting on it (bug).
    			entitytocheck.setDead();
    			break;
    		}
    	}
		//Sets coordinates for mounting a north oriented block.
		float mountingX = i + x;
		float mountingY = j + y;
		float mountingZ = k + z;
		//Changes coordinates for mounting to compensate for none-north block orientation.
		if(north != south) 
		{
			int md = world.getBlockMetadata(i, j, k);
			if (md == east) 
			{
				mountingX = i + 1 - z; 
				mountingZ = k + x; 
			}
			else if (md == south) 
			{
				mountingX = i + 1 - x; 
				mountingZ = k + 1 - z; 
			}
			else if (md == west) 
			{
				mountingX = i + z; 
				mountingZ = k + 1 - x; 
			}
		}
    	//Creates a new EMB if none had been created already or if the old one was bugged.
    	EntityMountableBlock nemb = new EntityMountableBlock(world, entityplayer, i, j, k, mountingX, mountingY, mountingZ);
    	world.spawnEntityInWorld(nemb);
    	nemb.interact(entityplayer);
    	return true;
	}
	return true;
    }

}

 

EntityMountableBlock.java - SSP

package net.minecraft.src.JAMMY780.util;

import net.minecraft.src.Entity;
import net.minecraft.src.EntityPlayer;
import net.minecraft.src.NBTTagCompound;
import net.minecraft.src.Profiler;
import net.minecraft.src.World;
import net.minecraft.src.forge.IEntityInteractHandler;

/*ITOS: MP client version.
*This class acts as a bridge between the mountable block and the player.
*This entity is what the player actually mounts instead of the block.
*An entity of this class is created by the mountable block upon activation
*and is killed when it's no longer used.
*/

public class EntityMountableBlock extends Entity
{

//These variables keep track of the block that created the entity. A bit backwards, I know.
public int orgBlockPosX;
public int orgBlockPosY;
public int orgBlockPosZ;
public int orgBlockID;

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

//This constructor seems to be required by ModLoaderMp.
public EntityMountableBlock (World world, double d, double d1, double d2)
{
        super(world);
        noClip = true;
        preventEntitySpawning = true;
        width = 0.0F;
        height = 0.0F;
        setPosition(d, d1, d2);
}

//This constructor is called by the mountable block.
public EntityMountableBlock (World world, EntityPlayer entityplayer, int i, int j, int k, float mountingX, float mountingY, float mountingZ)
{
	super(world);
        noClip = true;
        preventEntitySpawning = true;
        width = 0.0F;
        height = 0.0F;
        
    	orgBlockPosX = i;
    	orgBlockPosY = j;
    	orgBlockPosZ = k;
    	orgBlockID = world.getBlockId(i, j, k);
    	
        setPosition(mountingX, mountingY, mountingZ);
}

//This method handles mounting and dismounting.
    public boolean interact(EntityPlayer entityplayer)
    {
        if (!super.interact(entityplayer))
        {
            if (!worldObj.isRemote && (riddenByEntity == null || riddenByEntity == entityplayer))
            {
                entityplayer.mountEntity(this);
                return true;
            }
            else
            {
                return false;
            }
        }
        else
        {
            return true;
        }
    }
    
//The following methods are for most parts redundant, simplified versions of those in Entity but they also delete unused EMBs.
public void onUpdate()
{
	onEntityUpdate();
}

    public void onEntityUpdate()
    {
        Profiler.startSection("entityBaseTick");
        if(riddenByEntity == null || riddenByEntity.isDead)
        {
		setDead();
        }
        else if(worldObj.getBlockId(orgBlockPosX, orgBlockPosY, orgBlockPosZ) != orgBlockID)
	{
        	interact((EntityPlayer) riddenByEntity);
	}
        ticksExisted++;
        Profiler.endSection();
    }
    
    //The following methods are required by the Entity class but I don't know what they are for.
    public void entityInit() {}
    
    public void readEntityFromNBT(NBTTagCompound nbttagcompound) {}

    public void writeEntityToNBT(NBTTagCompound nbttagcompound) {}
}

 

EntityMountableBlock.java - SMP

package net.minecraft.src.JAMMY780.util;

import net.minecraft.src.Entity;
import net.minecraft.src.EntityPlayer;
import net.minecraft.src.EntityPlayerMP;
import net.minecraft.src.ModLoader;
import net.minecraft.src.NBTTagCompound;
import net.minecraft.src.Packet39AttachEntity;
import net.minecraft.src.Profiler;
import net.minecraft.src.World;
import net.minecraft.src.forge.IEntityInteractHandler;

/*ITOS: MP server version.
*This class acts as a bridge between the mountable block and the player.
*This entity is what the player actually mounts instead of the block.
*An entity of this class is created by the mountable block upon activation
*and is killed when it's no longer used.
*/

public class EntityMountableBlock extends Entity
{

//These variables keep track of the block that created the entity. A bit backwards, I know.
public int orgBlockPosX;
public int orgBlockPosY;
public int orgBlockPosZ;
public int orgBlockID;

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

//This constructor seems to be required by ModLoaderMp.
public EntityMountableBlock (World world, double d, double d1, double d2)
{
        super(world);
        noClip = true;
        preventEntitySpawning = true;
        width = 0.0F;
        height = 0.0F;
        setPosition(d, d1, d2);
}

//This constructor is called by the mountable block.
public EntityMountableBlock (World world, EntityPlayer entityplayer, int i, int j, int k, float mountingX, float mountingY, float mountingZ)
{
	super(world);
        noClip = true;
        preventEntitySpawning = true;
        width = 0.0F;
        height = 0.0F;
        
    	orgBlockPosX = i;
    	orgBlockPosY = j;
    	orgBlockPosZ = k;
    	orgBlockID = world.getBlockId(i, j, k);
    	
        setPosition(mountingX, mountingY, mountingZ);
}

//This method handles mounting and dismounting.
    public boolean interact(EntityPlayer entityplayer)
    {
        if (!super.interact(entityplayer))
        {
            if (!worldObj.isRemote && (riddenByEntity == null || riddenByEntity == entityplayer))
            {
                entityplayer.mountEntity(this);
                Packet39AttachEntity packet = new Packet39AttachEntity(entityplayer, this);
                for(Object entity : ModLoader.getMinecraftServerInstance().configManager.playerEntities)
                {
                	EntityPlayerMP player = (EntityPlayerMP)entity;
                	if(entityplayer.entityId == player.entityId)
                		continue;
                	player.playerNetServerHandler.sendPacket(packet);
                }
                return true;
            }
            else
            {
                return false;
            }
        }
        else
        {
            return true;
        }
    }
    
//The following methods are for most parts redundant, simplified versions of those in Entity but they also delete unused EMBs.
public void onUpdate()
{
	onEntityUpdate();
}

    public void onEntityUpdate()
    {
        Profiler.startSection("entityBaseTick");
        if(riddenByEntity == null || riddenByEntity.isDead)
        {
		setDead();
        }
        else if(worldObj.getBlockId(orgBlockPosX, orgBlockPosY, orgBlockPosZ) != orgBlockID)
	{
		interact((EntityPlayer) riddenByEntity);
	}
        ticksExisted++;
        Profiler.endSection();
    }
    
    //The following methods are required by the Entity class but I don't know what they are for.
    public void entityInit() {}
    
public void readEntityFromNBT(NBTTagCompound nbttagcompound) {}

public void writeEntityToNBT(NBTTagCompound nbttagcompound) {}

}

 

BlockActivated from both of my chairs - SSP/SMP

public boolean blockActivated(World world, int i, int j, int k, EntityPlayer entityplayer)
    {
    	int l = world.getBlockMetadata(i, j, k);
    	if(entityplayer.getCurrentEquippedItem() != null && entityplayer.getCurrentEquippedItem().getItem() instanceof ItemSign)
    	{
    		return false;
    	} 
    	else 
    	{
    		l %= 4;
            if(l == 0)
            {
                entityplayer.rotationYaw = 180F;
            }
            if(l == 1)
            {
                entityplayer.rotationYaw = -90F;
            }
            if(l == 2)
            {
                entityplayer.rotationYaw = 0F;
            }
            if(l == 3)
            {
                entityplayer.rotationYaw = 90F;
            }
    		float x = 0, y = 0, z = 0;
    		if(l == 0)
    		{
    			x = 0.5F;
    			y = 0.5F;
    			z = 0.5F;
    		}
    		if(l == 1)
    		{
    			x = 0.5F;
    			y = 0.5F;
    			z = 0.5F;
    		}
    		if(l == 2)
    		{
    			x = 0.5F;
    			y = 0.5F;
    			z = 0.5F;
    		}
    		if(l == 3)
    		{
    			x = 0.5F;
    			y = 0.5F;
    			z = 0.5F;
    		}
    		return BlockMountable.blockActivated(world, i, j, k, entityplayer, x, y, z, 0, 2, 1, 3);
    	}
    }

Link to comment
Share on other sites

Interesting, this seems to be similiar to this: http://imgur.com/5yS6K,GYMbq#1

Which is caused by someone using FML.

Best guess is its trying to render the player's bounding box.

Perhaps try debugging and see what is rendering that rectangle.

I do Forge for free, however the servers to run it arn't free, so anything is appreciated.
Consider supporting the team on Patreon

Link to comment
Share on other sites

Thank you for your help so far but I have no idea where I'd start to debug it, maybe I'm thinking about it wrong but nothing I seem to do changes the white column. It's really annoying :( Anymore ideas what might be causing it? I've tried adding a render file but it still shows up.

Link to comment
Share on other sites

So I need to make a blank render file? Like I would for a normal entity just don't include anything to actually render anything?

 

i don't think you use a blank render file, i do think there need to be a few things in there. maybe a call to do the actual render of the the entity.

 

Also may i ask is your entity an entity like a mob that just doesn't move or is it a TileEntity because if it is a tileEntity this might help

http://www.minecraftforum.net/topic/1154044-12520412-duckys-modding-tutorials-make-your-blocks-nice-now-with-cables-api/page__hl__render

 

 

Link to comment
Share on other sites

I'VE FIXED IT!! WOOHOOOOOOO! HOWEVER it does mean I have to use a modified version of Forge now :(. It seems to be the changes in this build: http://lexmanos.no-ip.org:8080/job/Forge/83/changes#detail0 I copied an older build of the code (build 72 and the two files were PacketEntitySpawn.java and PacketHandlerClient.java) all I had to do was fix a couple of problems (extend PacketHandlerBase, add unimplemented methods and change one bit of code (check below)) and it works like a charm now. Not sure why this problem happens, could a forge god explain why please? :D

 

change:

                if (networkmod.toString().equals(entry.getValue()))
                {
                    ForgeHooks.networkMods.put(entry.getKey(), networkmod);
                }

 

to:

                if (networkmod.toString().equals(entry.getValue()))
                {
                    ForgeHooks.networkMods.put((Integer) entry.getKey(), networkmod);
                }

Link to comment
Share on other sites

I haven't been bothering to look at this, whats the issue and why are you using a old version?

The revisions you mentioned would have nothing to do with your rendering if you did things properly.

As for that typecast, that does nothing, as that type is already a Integer.

I do Forge for free, however the servers to run it arn't free, so anything is appreciated.
Consider supporting the team on Patreon

Link to comment
Share on other sites

This issue only happened in SMP. I would sit down but be in a position like in the image in the main post. It only happens after I updated from build 72. I'm not using the whole old version, I'm only using two files from build 72. I'm not actually supposed to render anything, it only happens when I sit down which is supposed to be an invisible entity for the player to sit down on.

Link to comment
Share on other sites

You ALWAYS rendering SOMETHING for every entity.

And really the only functional change in 72 was to use the (World) constructor instead of the (World, double, double, double) one.

So I dont think thats the actual issue.

Move the crap you do in the double ctr into the world ctr.

I do Forge for free, however the servers to run it arn't free, so anything is appreciated.
Consider supporting the team on Patreon

Link to comment
Share on other sites

You ALWAYS rendering SOMETHING for every entity.

And really the only functional change in 72 was to use the (World) constructor instead of the (World, double, double, double) one.

So I dont think thats the actual issue.

Move the crap you do in the double ctr into the world ctr.

 

I'm sure I did that already! :) it worked, thank you so much! :)

Link to comment
Share on other sites

How come you don't add this code saves you importing every class file you need :) though I would post and try and be a tiny bit helpful xD

 

import net.minecraft.src.*;

I am pretty sure it is possible

 

Most IDE's will auto bring in the specific things you need, which is indeed better as it (barely) reduces linking and JIT time for that file.

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
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
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.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • https://pastebin.com/VwpAW6PX My game crashes upon launch when trying to implement the Oculus mod to this mod compilation, above is the crash report, I do not know where to begin to attempt to fix this issue and require assistance.
    • https://youtube.com/shorts/gqLTSMymgUg?si=5QOeSvA4TTs-bL46
    • CubeHaven is a SMP server with unique features that can't be found on the majority of other servers! Java: MC.CUBEHAVEN.NET Bedrock: MC.CUBEHAVEN.NET:19132 3 different stores: - CubeHaven Store: Our store to purchase using real money. - Bitcoin Store: Store for Bitcoin. Bitcoin can be earned from playing the server. Giving options for players if they want to spend real money or grind to obtain exclusive packages. - Black Market: A hidden store for trading that operates outside our traditional stores, like custom enchantments, exclusive items and more. Some of our features include: Rank Up: Progress through different ranks to unlock new privileges and perks. 📈 Skills: RPG-style skill system that enhances your gaming experience! 🎮 Leaderboards: Compete and shine! Top players are rewarded weekly! 🏆 Random Teleporter: Travel instantly across different worlds with a click! 🌐 Custom World Generation: Beautifully generated world. 🌍 Dungeons: Explore challenging and rewarding dungeons filled with treasures and monsters. 🏰 Kits: Unlock ranks and gain access to various kits. 🛠️ Fishing Tournament: Compete in a friendly fishing tournament! 🎣 Chat Games: Enjoy games right within the chat! 🎲 Minions: Get some help from your loyal minions. 👥 Piñata Party: Enjoy a festive party with Piñatas! 🎉 Quests: Over 1000 quests that you can complete! 📜 Bounty Hunter: Set a bounty on a player's head. 💰 Tags: Displayed on nametags, in the tab list, and in chat. 🏷️ Coinflip: Bet with other players on coin toss outcomes, victory, or defeat! 🟢 Invisible & Glowing Frames: Hide your frames for a cleaner look or apply a glow to it for a beautiful look. 🔲✨[ Player Warp: Set your own warp points for other players to teleport to. 🌟 Display Shop: Create your own shop and sell to other players! 🛒 Item Skins: Customize your items with unique skins. 🎨 Pets: Your cute loyal companion to follow you wherever you go! 🐾 Cosmetics: Enhance the look of your character with beautiful cosmetics! 💄 XP-Bottle: Store your exp safely in a bottle for later use! 🍶 Chest & Inventory Sorting: Keep your items neatly sorted in your inventory or chest! 📦 Glowing: Stand out from other players with a colorful glow! ✨ Player Particles: Over 100 unique particle effects to show off. 🎇 Portable Inventories: Over virtual inventories with ease. 🧳 And a lot more! Become part of our growing community today! Discord: https://cubehaven.net/discord Java: MC.CUBEHAVEN.NET Bedrock: MC.CUBEHAVEN.NET:19132
    • # Problematic frame: # C [libopenal.so+0x9fb4d] It is always the same issue - this refers to the Linux OS - so your system may prevent Java from working   I am not familiar with Linux - check for similar/related issues  
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.