Jump to content

[1.10.2] TileEntitys Data synchronisation and updating Containers


Roxane

Recommended Posts

I'm trying to update my mod from 1.9 to 1.10.2 (forge version 12.16.1.1887 to 12.18.2.2098).

 

Most of my mods work just fine, but with my AccessControl I'm having a little bit of a problem. The access panels can have different colors and some other properties, but on loading a world they all have the default properties on the client side. It seems that on the server side they have correct properties because they are behaving as they should, although looking differently. As soon as they are activated once the clientside gets the correct data and now they are looking as they should.

 

This is my code of the BlockAccessPanel.java

 

package net.roxa.accessControl;

import java.util.List;
import java.util.Random;

import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.MapColor;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyBool;
import net.minecraft.block.properties.PropertyDirection;
import net.minecraft.block.properties.PropertyEnum;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Items;
import net.minecraft.init.SoundEvents;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.scoreboard.Team;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockRenderLayer;
import net.minecraft.util.EnumBlockRenderType;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.IStringSerializable;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class BlockAccessPanel extends BlockContainer
{
//TileEntityAccessPanel tileEntity;

    public static final PropertyBool POWERED = PropertyBool.create("powered");
    public static final PropertyDirection FACING = PropertyDirection.create("facing");
    public static final PropertyEnum COLOR = PropertyEnum.create("color", EnumColor.class);

public BlockAccessPanel() {
	super(Material.CIRCUITS);
	this.setDefaultState(this.blockState.getBaseState().withProperty(POWERED, Boolean.valueOf(false)).withProperty(COLOR, EnumColor.WHITE).withProperty(FACING, EnumFacing.UP));
	this.setUnlocalizedName("accessPanel");
	this.setRegistryName("accessPanel");
	this.setCreativeTab(CreativeTabs.REDSTONE);
	this.setSoundType(SoundType.METAL);
	this.setHardness(0.5F);
	this.setResistance(1F);
	//this.useNeighborBrightness = true;

	//tileEntity = new TileEntityAccessPanel();
}

@SideOnly(Side.CLIENT)
public BlockRenderLayer getBlockLayer()
{
	return BlockRenderLayer.CUTOUT_MIPPED;
}

@Override
public boolean isOpaqueCube(IBlockState state)
{
	return false;
}

@Override
public boolean isFullCube(IBlockState state)
{
	return false;
}

@Override
public EnumBlockRenderType getRenderType(IBlockState state)
{
	return EnumBlockRenderType.MODEL;
}

/*
@Override
public void setBlockBoundsForItemRender()
    {
        float f = 0.1875F;
        float f1 = 0.125F;
        float f2 = 0.125F;
        this.setBlockBounds(0.5F - f, 0.5F - f1, 0.5F - f2, 0.5F + f, 0.5F + f1, 0.5F + f2);
    }
    */

@Override
public boolean canPlaceBlockOnSide(World worldIn, BlockPos pos, EnumFacing side)
    {
        return worldIn.isSideSolid(pos.offset(side.getOpposite()), side, true);
    }

@Override
public boolean canPlaceBlockAt(World worldIn, BlockPos pos)
    {
        EnumFacing[] aenumfacing = EnumFacing.values();
        int i = aenumfacing.length;

        for (int j = 0; j < i; ++j)
        {
            EnumFacing enumfacing = aenumfacing[j];

            if (worldIn.isSideSolid(pos.offset(enumfacing), enumfacing.getOpposite(), true))
            {
                return true;
            }
        }

        return false;
    }

@Override
public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer)
    {
        return worldIn.isSideSolid(pos.offset(facing.getOpposite()), facing, true) ? this.getDefaultState().withProperty(FACING, facing).withProperty(POWERED, Boolean.valueOf(false)) : this.getDefaultState().withProperty(FACING, EnumFacing.DOWN).withProperty(POWERED, Boolean.valueOf(false));
    }

@Override
public void neighborChanged(IBlockState state, World worldIn, BlockPos pos, Block neighborBlock)
    {
        if (this.checkForDrop(worldIn, pos, state))
        {
            EnumFacing enumfacing = (EnumFacing)state.getValue(FACING);

            if (!worldIn.isSideSolid(pos.offset(enumfacing.getOpposite()), enumfacing, true))
            {
                this.dropBlockAsItem(worldIn, pos, state, 0);
                worldIn.setBlockToAir(pos);
            }
        }
    }

    private boolean checkForDrop(World worldIn, BlockPos pos, IBlockState state)
    {
        if (!this.canPlaceBlockAt(worldIn, pos))
        {
            this.dropBlockAsItem(worldIn, pos, state, 0);
            worldIn.setBlockToAir(pos);
            return false;
        }
        else
        {
            return true;
        }
    }
    
    @Override
    //public void setBlockBoundsBasedOnState(IBlockAccess worldIn, BlockPos pos)
    public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos)
    {
        return this.updateBlockBounds(source.getBlockState(pos));
    }

    private AxisAlignedBB updateBlockBounds(IBlockState state)
    {
    	if (state.getBlock() instanceof BlockAccessPanel)
    	{
    	AxisAlignedBB axis;
        EnumFacing enumfacing = (EnumFacing)state.getValue(FACING);
        float f = 0.25F;
        float f1 = 0.375F;
        float f2 = 1 / 16.0F;
        float f3 = 0.1875F;
        float f4 = 1 - 0.1875F;

        switch (BlockAccessPanel.SwitchEnumFacing.FACING_LOOKUP[enumfacing.ordinal()])
        {
            case 1:
            	axis = new AxisAlignedBB(0.0F, f3, f3, f2, f4, f4);
                break;
            case 2:
            	axis = new AxisAlignedBB(1.0F - f2, f3, f3, 1.0F, f4, f4);
                break;
            case 3:
            	axis = new AxisAlignedBB(f3, f3, 0.0F, f4, f4, f2);
                break;
            case 4:
            	axis = new AxisAlignedBB(f3, f3, 1.0F - f2, f4, f4, 1.0F);
                break;
            case 5:
            	axis = new AxisAlignedBB(f3, 0.0F, f3, f4, 0.0F + f2, f4);
                break;
            default:
            	axis = new AxisAlignedBB(f3, 1.0F - f2, f3, f4, 1.0F, f4);
        }
        return axis;
    	}
    	else return null;
    }
    
    /*
    @Override
    public AxisAlignedBB getCollisionBoundingBox(World worldIn, BlockPos pos, IBlockState state)
    {
        return null;
    }
    */

@Override
public void breakBlock(World worldIn, BlockPos pos, IBlockState state)
    {
        if (((Boolean)state.getValue(POWERED)).booleanValue())
        {
            this.notifyNeighbors(worldIn, pos, (EnumFacing)state.getValue(FACING));
        }

        super.breakBlock(worldIn, pos, state);
    }

@Override
public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ)
    {
	boolean activated = false;
	boolean canAccess = false;
    	//ItemStack itemStackHold = playerIn.getHeldItem();
    	Item item;
    	if (heldItem != null) item = heldItem.getItem();
    	else item = null;
    	if (item == RoxaAccessControlMod.accessCard && !playerIn.isSneaking())
    	{
    		TileEntity tileEntity = worldIn.getTileEntity(pos);
    		TileEntityAccessPanel entityAccessPanel = null;
    		if (tileEntity instanceof TileEntityAccessPanel) entityAccessPanel = (TileEntityAccessPanel)tileEntity;
    		ItemAccessCard card = (ItemAccessCard) item;
    		
    		//Testing for the right color
            if (card.canAccess(heldItem, (entityAccessPanel.getColor())))
            {
            	//activated = activateBlock(worldIn, state, pos);
            	canAccess = true;
            	//System.out.println("Access because of color saved on Card");
            }
            //Testing for Panels on Card or Player on Panel
            else if (entityAccessPanel != null)
    		{
    			String[] playerNames = null;
    			playerNames = entityAccessPanel.getPlayerNames();
    			String playerName = playerIn.getDisplayNameString();
    			if (playerNames != null)
    			{
    				for (int i = 0; i < playerNames.length; i++)
                    {
        				if (playerNames[i].equals(playerName))
                    	{
                    		//activated = activateBlock(worldIn, state, pos);
        					canAccess = true;
                    		//System.out.println("Access because of player saved in Panel");
                    	}
        				if (playerNames[i].equals(""))
                    	{
                    		canAccess = true;
                    		//System.out.println("Access because everybody has Access");
                    	}
                    }
    			}
    			
    			if (!canAccess && card.getPanels(heldItem) != null)
    			{
    				String[] panels = card.getPanels(heldItem);
    				String panelName = entityAccessPanel.getPanelName();
    				for (int i = 0; i < panels.length; i++)
                    {
    					if (panels[i].equals(panelName))
    					{
    						canAccess = true;
    						//activated = activateBlock(worldIn, state, pos);
    						//System.out.println("Access because of panel name is on Card");
    					}
                    }
    			}
    			
    			if (!canAccess)
    			{
    				worldIn.playSound(null, pos, RoxaAccessControlMod.soundDenied, SoundCategory.BLOCKS, 0.6F, 1.0F);
    			}
    		}
    		
    		if (((Boolean)state.getValue(POWERED)).booleanValue())
            {
    			if(!entityAccessPanel.isToggle()) activated = true;
    			else if (canAccess)
    			{
    				deactivateBlock(worldIn, state, pos);
    				entityAccessPanel.incCounter();
        			activateOtherPanels(worldIn, pos, entityAccessPanel, false);
    				worldIn.playSound(null, pos, RoxaAccessControlMod.soundGranted, SoundCategory.BLOCKS, 0.4F, 1.0F);
    			}
            }
    		else if (canAccess)
    		{
			activateBlock(worldIn, state, pos, entityAccessPanel.isToggle());
    			entityAccessPanel.incCounter();
    			activateOtherPanels(worldIn, pos, entityAccessPanel, true);
    			worldIn.playSound(null, pos, RoxaAccessControlMod.soundGranted, SoundCategory.BLOCKS, 0.6F, 1.0F);
    		}
    	}
    	else
    	{
    		//Do nothing
    	}
    	return activated;
    }

private boolean activateBlock(World worldIn, IBlockState state, BlockPos pos, boolean toggle)
{
	worldIn.setBlockState(pos, state.withProperty(POWERED, Boolean.valueOf(true)), 3);
        worldIn.markBlockRangeForRenderUpdate(pos, pos);
        worldIn.playSound(null, pos, SoundEvents.BLOCK_STONE_BUTTON_CLICK_ON, SoundCategory.BLOCKS, 0.3F, 0.6F);
        this.notifyNeighbors(worldIn, pos, (EnumFacing)state.getValue(FACING));
        if(!toggle) worldIn.scheduleUpdate(pos, this, 40);
        return true;
}

public void deactivateBlock(World worldIn, IBlockState state, BlockPos pos)
{
	if (!worldIn.isRemote)
        {
            if (((Boolean)state.getValue(POWERED)).booleanValue())
            {
                worldIn.setBlockState(pos, state.withProperty(POWERED, Boolean.valueOf(false)));
                this.notifyNeighbors(worldIn, pos, (EnumFacing)state.getValue(FACING));
                worldIn.playSound(null, pos, SoundEvents.BLOCK_STONE_BUTTON_CLICK_OFF, SoundCategory.BLOCKS, 0.3F, 0.5F);
                worldIn.markBlockRangeForRenderUpdate(pos, pos);
            }
        }
}

public void activateOtherPanels(World worldIn, BlockPos pos, TileEntityAccessPanel entityAccessPanel, boolean activate)
{
	String panelName = entityAccessPanel.getPanelName();
	if (!panelName.isEmpty())
	{
		for(int i = -5; i <= 5; i++)
		{
			for(int j = -5; j <= 5; j++)
			{
				BlockPos posOther = pos.add(i, 0, j);
				Block blockOther = worldIn.getBlockState(posOther).getBlock();
				if(blockOther == RoxaAccessControlMod.accessPanel && (i != 0 | j != 0))
				{
					TileEntity tileEntityOther = worldIn.getTileEntity(posOther);
		    		TileEntityAccessPanel entityAccessPanelOther = null;
		    		if (tileEntityOther instanceof TileEntityAccessPanel) entityAccessPanelOther = (TileEntityAccessPanel)tileEntityOther;
		    		String panelNameOther = entityAccessPanelOther.getPanelName();
		    		if(panelName.equals(panelNameOther))
		    		{
		    			BlockAccessPanel blockPanel = (BlockAccessPanel) blockOther;
		    			if(activate)
		    			{
		    				blockPanel.activateBlock(worldIn, worldIn.getBlockState(posOther), posOther, entityAccessPanelOther.isToggle());
		    				//System.out.println("Activating Access Panel at " + i + " " + j + " with same name");
		    				//System.out.println("Counter is: " + entityAccessPanel.getCounter());
	    				}
		    			else 
		    			{
		    				blockPanel.deactivateBlock(worldIn, worldIn.getBlockState(posOther), posOther);
		    				//System.out.println("Deaktivating Access Panel at " + i + " " + j + " with same name");
		    				//System.out.println("Counter is: " + entityAccessPanel.getCounter());
		    			}
		    			if (entityAccessPanel.getCounter() != entityAccessPanelOther.getCounter())
		    			{
		    				entityAccessPanelOther.setCounter(entityAccessPanel.getCounter());
		    				activateOtherPanels(worldIn, posOther, entityAccessPanelOther, activate);
		    			}
		    		}
				}
			}
		}
		for(int x = -3; x <= 3; x++)
		{
			for(int y = -3; y <= 3; y++)
			{
				if (y!=0)
				{
					for(int z = -3; z <= 3; z++)
					{
						BlockPos posOther = pos.add(x, y, z);
						Block blockOther = worldIn.getBlockState(posOther).getBlock();
						if(blockOther == RoxaAccessControlMod.accessPanel)
						{
							TileEntity tileEntityOther = worldIn.getTileEntity(posOther);
				    		TileEntityAccessPanel entityAccessPanelOther = null;
				    		if (tileEntityOther instanceof TileEntityAccessPanel) entityAccessPanelOther = (TileEntityAccessPanel)tileEntityOther;
				    		String panelNameOther = entityAccessPanelOther.getPanelName();
				    		if(panelName.equals(panelNameOther))
				    		{
				    			BlockAccessPanel blockPanel = (BlockAccessPanel) blockOther;
				    			if(activate)
				    			{
				    				blockPanel.activateBlock(worldIn, worldIn.getBlockState(posOther), posOther, entityAccessPanelOther.isToggle());
				    				//System.out.println("Activating Access Panel at " + i + " " + j + " with same name");
				    				//System.out.println("Counter is: " + entityAccessPanel.getCounter());
			    				}
				    			else 
				    			{
				    				blockPanel.deactivateBlock(worldIn, worldIn.getBlockState(posOther), posOther);
				    				//System.out.println("Deaktivating Access Panel at " + i + " " + j + " with same name");
				    				//System.out.println("Counter is: " + entityAccessPanel.getCounter());
				    			}
				    			if (entityAccessPanel.getCounter() != entityAccessPanelOther.getCounter())
				    			{
				    				entityAccessPanelOther.setCounter(entityAccessPanel.getCounter());
				    				activateOtherPanels(worldIn, posOther, entityAccessPanelOther, activate);
				    			}
				    		}
						}
					}
				}
			}
		}
	}
}

@Override
public void updateTick(World worldIn, BlockPos pos, IBlockState state, Random rand)
    {
        this.deactivateBlock(worldIn, state, pos);
        TileEntityAccessPanel entityAccessPanel = (TileEntityAccessPanel) worldIn.getTileEntity(pos);
        entityAccessPanel.incCounter();
        activateOtherPanels(worldIn, pos, entityAccessPanel, false);
    }

public int isProvidingWeakPower(IBlockAccess worldIn, BlockPos pos, IBlockState state, EnumFacing side)
    {
        return ((Boolean)state.getValue(POWERED)).booleanValue() ? 15 : 0;
    }

@Override
    public int getStrongPower(IBlockState state, IBlockAccess worldIn, BlockPos pos, EnumFacing side)
    {
	return !((Boolean)state.getValue(POWERED)).booleanValue() ? 0 : (state.getValue(FACING) == side ? 15 : 0);
    }

@Override
    public boolean canProvidePower(IBlockState state)
    {
	return true;
    }
    
    private void notifyNeighbors(World worldIn, BlockPos pos, EnumFacing facing)
    {
        worldIn.notifyNeighborsOfStateChange(pos, this);
        worldIn.notifyNeighborsOfStateChange(pos.offset(facing.getOpposite()), this);
    }
    
    public IBlockState getStateFromMeta(int meta)
    {
        EnumFacing enumfacing;

        switch (meta & 7)
        {
            case 0:
                enumfacing = EnumFacing.DOWN;
                break;
            case 1:
                enumfacing = EnumFacing.EAST;
                break;
            case 2:
                enumfacing = EnumFacing.WEST;
                break;
            case 3:
                enumfacing = EnumFacing.SOUTH;
                break;
            case 4:
                enumfacing = EnumFacing.NORTH;
                break;
            case 5:
            default:
                enumfacing = EnumFacing.UP;
        }
        return this.getDefaultState().withProperty(FACING, enumfacing).withProperty(POWERED, Boolean.valueOf((meta &  > 0));
    }

    public int getMetaFromState(IBlockState state)
    {
        int i;

        switch (BlockAccessPanel.SwitchEnumFacing.FACING_LOOKUP[((EnumFacing)state.getValue(FACING)).ordinal()])
        {
            case 1:
                i = 1;
                break;
            case 2:
                i = 2;
                break;
            case 3:
                i = 3;
                break;
            case 4:
                i = 4;
                break;
            case 5:
            default:
                i = 5;
                break;
            case 6:
                i = 0;
        }

        if (((Boolean)state.getValue(POWERED)).booleanValue())
        {
            i |= 8;
        }

        return i;
    }
    
    @Override
    public IBlockState getActualState(IBlockState state, IBlockAccess worldIn, BlockPos pos)
    {
    	TileEntityAccessPanel teap = (TileEntityAccessPanel) worldIn.getTileEntity(pos);
    	return worldIn.getBlockState(pos).withProperty(COLOR, this.getPanelColor(teap.getColor()));
    }
    
    @Override
    protected BlockStateContainer createBlockState()
    {
    	return new BlockStateContainer(this, new IProperty[] {POWERED, FACING, COLOR});
    }

@Override
public TileEntity createNewTileEntity(World worldIn, int meta)
{
	return new TileEntityAccessPanel();
}

public EnumColor getPanelColor(int colorIn)
{
	EnumColor color = null;
	switch (colorIn) 
	{
	case 0:
		color = EnumColor.WHITE;
		break;
	case 1:
		color = EnumColor.YELLOW;
		break;
	case 2:
		color = EnumColor.ORANGE;
		break;
	case 3:
		color = EnumColor.RED;
		break;
	case 4:
		color = EnumColor.PURPLE;
		break;
	case 5:
		color = EnumColor.BLUE;
		break;
	case 6:
		color = EnumColor.GREEN;
		break;
	case 7:
		color = EnumColor.BLACK;
		break;
	case 8:
		color = EnumColor.GREY;
		break;
	case 9:
		color = EnumColor.LIGHT_GREY;
		break;
	case 10:
		color = EnumColor.PINK;
		break;
	case 11:
		color = EnumColor.MAGENTA;
		break;
	case 12:
		color = EnumColor.LIGHT_BLUE;
		break;
	case 13:
		color = EnumColor.CYAN;
		break;
	case 14:
		color = EnumColor.LIME;
		break;
	case 15:
		color = EnumColor.BROWN;
		break;
	}
	return color;
}

public void setPanelColor(World worldIn, BlockPos posIn, int colorIn)
{
	TileEntityAccessPanel teap = (TileEntityAccessPanel) worldIn.getTileEntity(posIn);
	teap.setColor(colorIn);
	IBlockState state = worldIn.getBlockState(posIn);
	switch (colorIn) 
	{
	case 0:
		worldIn.setBlockState(posIn, state.withProperty(COLOR, EnumColor.WHITE));
		break;
	case 1:
		worldIn.setBlockState(posIn, state.withProperty(COLOR, EnumColor.YELLOW));
		break;
	case 2:
		worldIn.setBlockState(posIn, state.withProperty(COLOR, EnumColor.ORANGE));
		break;
	case 3:
		worldIn.setBlockState(posIn, state.withProperty(COLOR, EnumColor.RED));
		break;
	case 4:
		worldIn.setBlockState(posIn, state.withProperty(COLOR, EnumColor.PURPLE));
		break;
	case 5:
		worldIn.setBlockState(posIn, state.withProperty(COLOR, EnumColor.BLUE));
		break;
	case 6:
		worldIn.setBlockState(posIn, state.withProperty(COLOR, EnumColor.GREEN));
		break;
	case 7:
		worldIn.setBlockState(posIn, state.withProperty(COLOR, EnumColor.BLACK));
		break;
	case 8:
		worldIn.setBlockState(posIn, state.withProperty(COLOR, EnumColor.GREY));
		break;
	case 9:
		worldIn.setBlockState(posIn, state.withProperty(COLOR, EnumColor.LIGHT_GREY));
		break;
	case 10:
		worldIn.setBlockState(posIn, state.withProperty(COLOR, EnumColor.PINK));
		break;
	case 11:
		worldIn.setBlockState(posIn, state.withProperty(COLOR, EnumColor.MAGENTA));
		break;
	case 12:
		worldIn.setBlockState(posIn, state.withProperty(COLOR, EnumColor.LIGHT_BLUE));
		break;
	case 13:
		worldIn.setBlockState(posIn, state.withProperty(COLOR, EnumColor.CYAN));
		break;
	case 14:
		worldIn.setBlockState(posIn, state.withProperty(COLOR, EnumColor.LIME));
		break;
	case 15:
		worldIn.setBlockState(posIn, state.withProperty(COLOR, EnumColor.BROWN));
		break;
	}
	//System.out.println(worldIn.getBlockState(posIn));
	//TODO Mit Mehrspieler testen: Tut das hier das, was es soll?
	//worldIn.markBlockForUpdate(posIn);
	worldIn.markBlockRangeForRenderUpdate(posIn, posIn);
}

static final class SwitchEnumFacing
    {
        static final int[] FACING_LOOKUP = new int[EnumFacing.values().length];
        private static final String __OBFID = "CL_00002131";

        static
        {
            try
            {
                FACING_LOOKUP[EnumFacing.EAST.ordinal()] = 1;
            }
            catch (NoSuchFieldError var6)
            {
                ;
            }

            try
            {
                FACING_LOOKUP[EnumFacing.WEST.ordinal()] = 2;
            }
            catch (NoSuchFieldError var5)
            {
                ;
            }

            try
            {
                FACING_LOOKUP[EnumFacing.SOUTH.ordinal()] = 3;
            }
            catch (NoSuchFieldError var4)
            {
                ;
            }

            try
            {
                FACING_LOOKUP[EnumFacing.NORTH.ordinal()] = 4;
            }
            catch (NoSuchFieldError var3)
            {
                ;
            }

            try
            {
                FACING_LOOKUP[EnumFacing.UP.ordinal()] = 5;
            }
            catch (NoSuchFieldError var2)
            {
                ;
            }

            try
            {
                FACING_LOOKUP[EnumFacing.DOWN.ordinal()] = 6;
            }
            catch (NoSuchFieldError var1)
            {
                ;
            }
        }
    }
}

and this is the TileEntityAccessPanel.java

 

package net.roxa.accessControl;

import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagByte;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagInt;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.nbt.NBTTagString;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.Packet;
import net.minecraft.network.play.server.SPacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class TileEntityAccessPanel extends TileEntity
{
String name = "";
boolean toggleMode;
String players[];
int color = 0;
private int counter = 0;

public TileEntityAccessPanel()
{

}

@Override
public void readFromNBT(NBTTagCompound tagCompound)
{
	super.readFromNBT(tagCompound);

	name = tagCompound.getString("Name");
	if (name == null) name = "";

	toggleMode = tagCompound.getBoolean("Toggle");

	color = tagCompound.getInteger("Color");

	NBTTagCompound tag = tagCompound.getCompoundTag("Player");
  		
  		if (tag != null)
  		{
  			int playerAmount = 0;
  	  		for (int i = 0; tag.hasKey("Player" + i); i++)
  			{
  	  		playerAmount++;
  			}
  	  		
  	  		players = new String[playerAmount];
  	  		
  	  		for (int i = 0; i < players.length; i++)
  			{
  	  		players[i] = tag.getString("Player" + i);
  			}

  	  		if (playerAmount == 0) players = null;
  		}
  		else
  		{
  			players = null;
  		}
}

@Override
public NBTTagCompound writeToNBT(NBTTagCompound tagCompound)
{
	super.writeToNBT(tagCompound);

	tagCompound.setString("Name", name);

	tagCompound.setBoolean("Toggle", toggleMode);

	tagCompound.setInteger("Color", color);

	NBTTagCompound tag = new NBTTagCompound();
    	
    	if (players != null)
    	{
    		NBTTagString string = new NBTTagString();
    		for (int i = 0; i < players.length; i++)
    		{
    			string = new NBTTagString(players[i]);
    			tag.setTag("Player" + i, string);
    		}
    		tagCompound.setTag("Player", tag);
    	}
    	else tagCompound.setTag("Player", tag);
	return tagCompound;

}

@Override
public SPacketUpdateTileEntity getUpdatePacket()
{
	NBTTagCompound syncData = new NBTTagCompound();
	this.writeToNBT(syncData);
	return new SPacketUpdateTileEntity(pos, 0, syncData);
}

@Override
public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt)
{
	this.readFromNBT(pkt.getNbtCompound());
	RoxaAccessControlMod.network.sendToServer(new MessageInt(MessageInt.requestTileEntityForPanel, pos));
}

public void addPlayer(String nameIn)
  	{
  		int newLength;
  		if (players == null)
  		{
  			//System.out.println("Read no Players from NBT. Creating new String[]");
  			newLength = 1;
  			players = new String[newLength];
  			players[0] = nameIn;
  		}
  		else 
  		{
  			//System.out.println("Read some Players from NBT");
  			newLength = players.length + 1;
  			String[] old = players;
  			players = new String[newLength];
  			for (int i = 0; i < old.length; i++)
  			{
  				players[i] = old[i];
  				//System.out.println("Player[" + i + "] is now: " + players[i]);
  			}
  			players[newLength - 1] = nameIn;
  		}
  	}

public boolean doesPlayerExist(String nameIn)
{
	boolean exists = false;
	for (int i = 0; players != null && i < players.length; i++)
	{
		if (nameIn.equals(players[i])) exists = true;
	}
	return exists;
}

public void deletePlayer(int index)
{
	String[] old = players;

	RoxaAccessControlMod.network.sendToServer(new MessageInt(MessageInt.deletePlayerFromPanel, index));

	if (players != null && players.length > 1)
  		{
		players = new String[old.length - 1];
  			for (int i = 0; i < index; i++)
  			{
  				players[i] = old[i];
  			}
  			for (int i = players.length - 1; i >= index; i--)
  			{
  				players[i] = old[i+1];
  			}
  		}
  		else
  		{
  			players = null;
  		}
}

public boolean isToggle()
{
	return toggleMode;
}

public void setToggle(boolean toggleMode)
{
	this.toggleMode = toggleMode;

}

public void setToggleOtherPanels(World worldIn, BlockPos pos, boolean toggle)
{
	if (!name.isEmpty())
	{
		for(int i = -5; i <= 5; i++)
		{
			for(int j = -5; j <= 5; j++)
			{
				BlockPos posOther = pos.add(i, 0, j);
				Block blockOther = worldIn.getBlockState(posOther).getBlock();
				if(blockOther == RoxaAccessControlMod.accessPanel && (i != 0 | j != 0))
				{
					TileEntity tileEntityOther = worldIn.getTileEntity(posOther);
		    		TileEntityAccessPanel entityAccessPanelOther = null;
		    		if (tileEntityOther instanceof TileEntityAccessPanel) entityAccessPanelOther = (TileEntityAccessPanel)tileEntityOther;
		    		String panelNameOther = entityAccessPanelOther.getPanelName();
		    		if(name.equals(panelNameOther))
		    		{
		    			//System.out.println("Setting Toggle Mode to " + toggle + " at " + i + " " + j);
		    			entityAccessPanelOther.setToggle(toggle);
		    			
		    			TileEntity tileEntity = worldIn.getTileEntity(pos);
			    		TileEntityAccessPanel entityAccessPanel = null;
			    		if (tileEntity instanceof TileEntityAccessPanel) entityAccessPanel = (TileEntityAccessPanel)tileEntity;
			    		//System.out.println("Counter is: " + entityAccessPanel.getCounter());
		    			if (entityAccessPanel.getCounter() != entityAccessPanelOther.getCounter())
		    			{
		    				entityAccessPanelOther.setCounter(entityAccessPanel.getCounter());
		    				setToggleOtherPanels(worldIn, posOther, toggle);
		    			}
		    		}
				}
			}
		}
		for(int x = -3; x <= 3; x++)
		{
			for(int y = -3; y <= 3; y++)
			{
				if (y!=0)
				{
					for(int z = -3; z <= 3; z++)
					{
						BlockPos posOther = pos.add(x, y, z);
						Block blockOther = worldIn.getBlockState(posOther).getBlock();
						if(blockOther == RoxaAccessControlMod.accessPanel)
						{
							TileEntity tileEntityOther = worldIn.getTileEntity(posOther);
				    		TileEntityAccessPanel entityAccessPanelOther = null;
				    		if (tileEntityOther instanceof TileEntityAccessPanel) entityAccessPanelOther = (TileEntityAccessPanel)tileEntityOther;
				    		String panelNameOther = entityAccessPanelOther.getPanelName();
				    		if(name.equals(panelNameOther))
				    		{
				    			System.out.println("Setting Toggle Mode to " + toggle + " at " + x + " " + y + " " + z);
				    			entityAccessPanelOther.setToggle(toggle);
				    			
				    			TileEntity tileEntity = worldIn.getTileEntity(pos);
					    		TileEntityAccessPanel entityAccessPanel = null;
					    		if (tileEntity instanceof TileEntityAccessPanel) entityAccessPanel = (TileEntityAccessPanel)tileEntity;
					    		System.out.println("Counter is: " + entityAccessPanel.getCounter());
				    			if (entityAccessPanel.getCounter() != entityAccessPanelOther.getCounter())
				    			{
				    				entityAccessPanelOther.setCounter(entityAccessPanel.getCounter());
				    				setToggleOtherPanels(worldIn, posOther, toggle);
				    			}
				    		}
						}
					}
				}
			}
		}
	}
}

public int getColor()
{
	return this.color;
}

public void setColor(int colorIn)
{
	color = colorIn;
}

public String[] getPlayerNames()
{
	return this.players;
}

public void setPlayers(String[] playerIn)
{
	players = playerIn;
}

public void setPanelName(String nameIn)
{
	name = nameIn;
}

public String getPanelName()
{
	return name;
}

public String getName()
{
	return "tileEntity.accessPanel";
}

public int getCounter()
{
	return counter;
}

public void setCounter(int counterIn)
{
	counter = counterIn;
}

public void incCounter()
{
	counter++;
}


@Override
public boolean shouldRefresh(World world, BlockPos pos, IBlockState oldState, IBlockState newSate)
    {
        return (oldState.getBlock() != newSate.getBlock());
    }
}

 

 

and I can't seem to find a correct way to update this line

((ICrafting)this.crafters.get(j)).sendSlotContents(this, i, itemstack1);

in public void detectAndSendChanges() in the container...

ContainerAccessAdministrator.java:

 

package net.roxa.accessControl;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.ContainerWorkbench;
import net.minecraft.inventory.IContainerListener;
//import net.minecraft.inventory.ICrafting;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.InventoryCraftResult;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.inventory.Slot;
import net.minecraft.inventory.SlotCrafting;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.CraftingManager;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;

public class ContainerAccessAdministrator extends Container
{
public IInventory cardSlot;// = new InventoryCrafting(this, 1, 1); 
protected TileEntityAccessAdministrator tileEntity;

    private World worldObj;
    private BlockPos pos;
    private EntityPlayer player;

    public ContainerAccessAdministrator(EntityPlayer playerIn, InventoryPlayer playerInventory, World worldIn, BlockPos posIn, TileEntityAccessAdministrator te)
    {
        this.worldObj = worldIn;
        this.pos = posIn;
        this.player = playerIn;
        this.tileEntity = te;
        cardSlot = te;
        int i;
        int j;
        
        this.addSlotToContainer(new Slot(this.cardSlot, 0, 14, );//22, 25)); //Slot 0 of custom "Inventory"
        
        for (i = 0; i < 3; ++i)
        {
            for (j = 0; j < 9; ++j)
            {
                this.addSlotToContainer(new Slot(playerInventory, j + i * 9 + 9, 48 + j * 18, 121 + i * 18)); //Slot (9 to 35) or (10 to 36)
            }
        }
        
        for (i = 0; i < 9; ++i)
        {
            this.addSlotToContainer(new Slot(playerInventory, i, 48 + i * 18, 179)); //Slot (0 to  or (1 to 9)
        }
        EntityPlayer player = playerInventory.player;
        if (!worldIn.isRemote)
        {
        	//System.out.println("Casting");
        	if (RoxaAccessControlMod.network != null) 
        	{
        		ItemStack stack = cardSlot.getStackInSlot(0);
        		if (stack != null && stack.getItem() == RoxaAccessControlMod.accessCard) 
        		{
        			ItemAccessCard card = (ItemAccessCard) stack.getItem();
        			String[] panels = card.getPanels(stack);
        			int length = 0;
        			if (panels != null) length = panels.length;
        			RoxaAccessControlMod.network.sendTo(new MessageInt(MessageInt.colorsToAdministratorGui, card.getColor(stack)), (EntityPlayerMP) player);//worldIn.getPlayerEntityByUUID(playerInventory.player.getUniqueID()));
        			RoxaAccessControlMod.network.sendTo(new MessageStringArray(MessageStringArray.panelsToAdministratorGui, panels, length), (EntityPlayerMP) player);
        		}
            	else 
            	{
            		RoxaAccessControlMod.network.sendTo(new MessageInt(MessageInt.colorsToAdministratorGui, 0), (EntityPlayerMP) player);//worldIn.getPlayerEntityByUUID(playerInventory.player.getUniqueID()));
            		RoxaAccessControlMod.network.sendTo(new MessageStringArray(MessageStringArray.panelsToAdministratorGui, null, 0), (EntityPlayerMP) player);
            	}
        	}
        }
    }
    
    @Override
    public boolean canInteractWith(EntityPlayer playerIn)
    {
        return playerIn.getDistanceSq((double)this.pos.getX() + 0.5D, (double)this.pos.getY() + 0.5D, (double)this.pos.getZ() + 0.5D) <= 64.0D;
    }
    
    @Override
    public ItemStack transferStackInSlot(EntityPlayer playerIn, int index)
    {
    	ItemStack itemstack = null;
    	Slot slot = (Slot)this.inventorySlots.get(index);
    	if (slot != null && slot.getHasStack())
    	{
    		ItemStack itemstack1 = slot.getStack();
    		itemstack = itemstack1.copy();
    		// If itemstack is in Output stack
    		if (index == 0)
    		{
    			// try to place in player inventory / action bar; add 36+1 because mergeItemStack uses < index,
    			// so the last slot in the inventory won't get checked if you don't add 1
    			if (!this.mergeItemStack(itemstack1, 0+1, 0+36+1, true))
    			{
    				return null;
    			}
    			slot.onSlotChange(itemstack1, itemstack);
    		}
    		// itemstack is in player inventory, try to place in appropriate furnace slot
    		else if (index != 0)
    		{
    			//if it is an access Card, place it in the access card slot
    			if (itemstack1.getItem() == RoxaAccessControlMod.accessCard)
    			{
    				if (!this.mergeItemStack(itemstack1, 0, 0+1, false))
    				{
    					return null;
    				}
    			}
    			//item in player's inventory, but not in action bar
    			else if (index >= 0+1 && index < 0+28)
    			{
    				//place in action bar
    				if (!this.mergeItemStack(itemstack1, 0+28, 0+37, false))
    				{
    					return null;
    				}
    			}
    			//item in action bar - place in player inventory
    			else if (index >= 0+28 && index < 0+37 && !this.mergeItemStack(itemstack1, 0+1, 0+28, false))
    			{
    				return null;
    			}
    		}
    		//In one of the infuser slots; try to place in player inventory / action bar
    		else if (!this.mergeItemStack(itemstack1, 0+1, 0+37, false))
    		{
    			return null;
    		}
    		
    		if (itemstack1.stackSize == 0)
    		{
    			slot.putStack((ItemStack)null);
    		}
    		else
    		{
    			slot.onSlotChanged();
    		}
    		
    		if (itemstack1.stackSize == itemstack.stackSize)
    		{
    			return null;
    		}
    		
    		slot.onPickupFromSlot(playerIn, itemstack1);
    	}
    	return itemstack;
   	}
    
    @Override
    public void detectAndSendChanges()
    {
    	for (int i = 0; i < this.inventorySlots.size(); ++i)
        {
            ItemStack stack = ((Slot)this.inventorySlots.get(i)).getStack();
            ItemStack itemstack1 = (ItemStack)this.inventoryItemStacks.get(i);

            if (!ItemStack.areItemStacksEqual(itemstack1, stack))
            {
                itemstack1 = stack == null ? null : stack.copy();
                this.inventoryItemStacks.set(i, itemstack1);

                for (int j = 0; j < this.inventorySlots.size(); ++j)
                {
                	((ICrafting)this.crafters.get(j)).sendSlotContents(this, i, itemstack1);
                }
                if (!worldObj.isRemote && stack == cardSlot.getStackInSlot(0))
                {
                	//System.out.println("Casting");
                	if (stack != null && stack.getItem() == RoxaAccessControlMod.accessCard) 
                	{
                		ItemAccessCard card = (ItemAccessCard) stack.getItem();
            			String[] panels = card.getPanels(stack);
            			int length = 0;
            			if (panels != null) length = panels.length;
            			RoxaAccessControlMod.network.sendTo(new MessageInt(MessageInt.colorsToAdministratorGui, card.getColor(stack)), (EntityPlayerMP) player);//worldIn.getPlayerEntityByUUID(playerInventory.player.getUniqueID()));
            			RoxaAccessControlMod.network.sendTo(new MessageStringArray(MessageStringArray.panelsToAdministratorGui, panels, length), (EntityPlayerMP) player);
                	}
                	else 
                	{
                		RoxaAccessControlMod.network.sendTo(new MessageInt(MessageInt.colorsToAdministratorGui, 0), (EntityPlayerMP) player);//worldIn.getPlayerEntityByUUID(playerInventory.player.getUniqueID()));
                		RoxaAccessControlMod.network.sendTo(new MessageStringArray(MessageStringArray.panelsToAdministratorGui, null, 0), (EntityPlayerMP) player);
                	}
                }
            }
        }
    	if (cardSlot.getStackInSlot(0) == null || cardSlot.getStackInSlot(0).getItem() != RoxaAccessControlMod.accessCard) 
    	{
    		RoxaAccessControlMod.network.sendTo(new MessageInt(MessageInt.colorsToAdministratorGui, 0), (EntityPlayerMP) player);//worldIn.getPlayerEntityByUUID(playerInventory.player.getUniqueID()));
    		RoxaAccessControlMod.network.sendTo(new MessageStringArray(MessageStringArray.panelsToAdministratorGui, null, 0), (EntityPlayerMP) player);
    	}
    }
}

 

 

Edit: The solution was to update the line to:

this.listeners.get(0).sendSlotContents(this, i, itemstack1);

The whole code can be found here:

GitHub Repo

Link to comment
Share on other sites

1.9.4 changed

TileEntity

syncing a bit, the initial chunk data sent to the client now includes the update tag (

TileEntity#getUpdateTag

) of every

TileEntity

in the chunk; the update packet (

TileEntity#getUpdatePacket

) is only sent afterwards. This document by williewillus explains the changes in more detail.

 

ICrafting

was renamed to

IContainerListener

.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Link to comment
Share on other sites

1.9.4 changed

TileEntity

syncing a bit, the initial chunk data sent to the client now includes the update tag (

TileEntity#getUpdateTag

) of every

TileEntity

in the chunk; the update packet (

TileEntity#getUpdatePacket

) is only sent afterwards. This document by williewillus explains the changes in more detail.

Thanks a lot! This solved it. Good explanation too :)

 

ICrafting

was renamed to

IContainerListener

.

When I chage

((ICrafting)this.crafters.get(j)).sendSlotContents(this, i, itemstack1);

to

((IContainerListener)this.inventorySlots.get(j)).sendSlotContents(this, i, itemstack1);

(as this.craftes does not seem to exist any more) it does compile but crashes as soon as I open the Gui with a "Cannot be cast" Exception. Is there anythin else but crafters and inventorySlots that I can use there? I didn't find it...

Link to comment
Share on other sites

Container#listeners

contains the

Container

's

IContainerListener

s.

 

Since generics were added to the vanilla codebase in 1.8.9 (or more accurately no longer stripped by Mojang's obfuscation process), you don't need to cast values when retrieving them from collections; the returned values are already the appropriate type. Only cast values when it's required and you already know that the value is of the type you're casting to.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Link to comment
Share on other sites

I know about Generics, I just can't see what that got to do with my problem?

 

Maybe I should be asking differently:

How do I get the client side of the Gui to immediatly display a change made to an item in one of the containers slots on the server side?

Right now the item updates client side (shows the correct tool tip) as soon as I take it out of the slot. How can I update the item so I see the correct tool tip even if I only hover it?

Link to comment
Share on other sites

On that one I can't follow you...

 

Right at the moment I'm delaying the problem by simply commenting out the line, but I haven't found a proper solution yet.

 

The basic gist of what I was saying is don't cast unless you have a reason to and you know that the value you're casting is actually an instance of the type you're casting to.

 

Container#inventorySlots

is a

List<Slot>

.

Slot

is completely unrelated to

IContainerListener

, so don't try to cast a

Slot

to

IContainerListener

.

 

Container#listeners

is a

List<IContainerListener>

. You don't need to cast values from this to

IContainerListener

because they're already that type.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

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

    • I'm using Modrinth as a launcher for a forge modpack on 1.20.1, and can't diagnose the issue on the crash log myself. Have tried repairing the Minecraft instillation as well as removing a few mods that have been problematic for me in the past to no avail. Crash log is below, if any further information is necessary let me know. Thank you! https://paste.ee/p/k6xnS
    • Hey folks. I am working on a custom "Mecha" entity (extended from LivingEntity) that the player builds up from blocks that should get modular stats depending on the used blocks. e.g. depending on what will be used for the legs, the entity will have a different jump strength. However, something unexpected is happening when trying to override a few of LivingEntity's functions and using my new own "Mecha" specific fields: instead of their actual instance-specific value, the default value is used (0f for a float, null for an object...) This is especially strange as when executing with the same entity from a point in the code specific to the mecha entity, the correct value is used. Here are some code snippets to better illustrate what I mean: /* The main Mecha class, cut down for brevity */ public class Mecha extends LivingEntity { protected float jumpMultiplier; //somewhere later during the code when spawning the entity, jumpMultiplier is set to something like 1.5f //changing the access to public didn't help @Override //Overridden from LivingEntity, this function is only used in the jumpFromGround() function, used in the aiStep() function, used in the LivingEntity tick() function protected float getJumpPower() { //something is wrong with this function //for some reason I can't correctly access the fields and methods from the instanciated entity when I am in one of those overridden protected functions. this is very annoying LogUtils.getLogger().info(String.valueOf(this.jumpMultiplier))) //will print 0f return this.jumpMultiplier * super.getJumpPower(); } //The code above does not operate properly. Written as is, the entity will not jump, and adding debug logs shows that when executing the code, the value of this.jumpMultiplier is 0f //in contrast, it will be the correct value when done here: @Override public void tick() { super.tick(); //inherited LivingEntity logic //Custom logic LogUtils.getLogger().info(String.valueOf(this.jumpMultiplier))) //will print 1.5f } } My actual code is slightly different, as the jumpMuliplier is stored in another object (so I am calling "this.legModule.getJumpPower()" instead of the float), but even using a simple float exactly like in the code above didn't help. When running my usual code, the object I try to use is found to be null instead, leading to a crash from a nullPointerException. Here is the stacktrace of said crash: The full code can be viewed here. I have found a workaround in the case of jump strength, but have already found the same problem for another parameter I want to do, and I do not understand why the code is behaving as such, and I would very much like to be able to override those methods as intended - they seemed to work just fine like that for vanilla mobs... Any clues as to what may be happening here?
    • Please delete post. Had not noticed the newest edition for 1.20.6 which resolves the issue.
    • https://paste.ee/p/GTgAV Here's my debug log, I'm on 1.18.2 with forge 40.2.4 and I just want to get it to work!! I cant find any mod names in the error part and I would like some help from the pros!! I have 203 mods at the moment.
  • Topics

×
×
  • Create New...

Important Information

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