Здравствуйте, товарищи мододелы! Пытаюсь сделать кастом печку на 1.7.10, в процессе чего возникла проблема. При нажатии ПКМ на нужный мне блок идёт краш с NullPointException. Причём как позже выяснилось, краш возникает тогда, когда я в своём GuiHandler`е пытаюсь вызвать getTileEntity(как я понял, он вернул null). Причём если вызвать этот самый getTileEntity внутри класса с блоком, то он работает. Из-за этого мне напрашивается вывод, что в GuiHandler`е ему передаются не те х, у и z. Но я не понимаю как такое может быть! Я изучал кучу разных гайдов и делал, как мне казалось, аналогичные действия. Свой TileEntity я регистрировал, функционал его ещё не добавлял, пробовал ещё со стандартным майновым TileEntityFurnace, тоже не вышло. Собственно, хочу спросить, что я упустил в коде, может, мне надо добавить что-либо? Или где я ошибся?
GuiHandler:
BlockElFur(мой блок печки):
Краш-лог:
Регистрация TileEntity и сведения о моде(я знаю, что можно и даже нужно как modid + "", мне лень):
GuiHandler:
Код:
package com.Pedrael.lootingnigger;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityFurnace;
import net.minecraft.world.World;
import cpw.mods.fml.common.network.IGuiHandler;
public class GuiHandler implements IGuiHandler {
@Override
public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
switch(ID){
case 1:
//TileEntityElFur t_e = (TileEntityElFur)world.getTileEntity(x, y, z);
return new ContainerElFur(player);
default:
return null;
}
}
@Override
public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
switch(ID){
case 1:
//TileEntityElFur t_e = (TileEntityElFur)world.getTileEntity(x, y, z);
return new GuiElFur(player);
default:
return null;
}
}
}
BlockElFur(мой блок печки):
Код:
package com.Pedrael.lootingnigger;
import java.util.Random;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Slot;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityFurnace;
import net.minecraft.util.IIcon;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
public class BlockElFur extends BlockContainer {
@SideOnly(Side.CLIENT)
private IIcon top;
@SideOnly(Side.CLIENT)
private IIcon face;
private static boolean isBurning;
private final boolean isBurning2;
private final Random random = new Random();
protected BlockElFur(boolean isActive) {
super(Material.rock);
this.setBlockName("ElFur");
this.setHardness(6F);
this.setResistance(4F);
this.setHarvestLevel("pickaxe",2);
this.setLightLevel(0F);
isBurning2 = isActive;
}
@SideOnly(Side.CLIENT)
public IIcon getIcon(int side, int meta)
{
return side == 1 ? this.top : (side == 0 ? this.top : (meta == 2 && side == 2 ? this.face: (meta == 3 && side == 5 ? this.face : (meta == 0 && side == 3 ? this.face : (meta == 1 && side == 4 ? this.face : this.blockIcon)))));
}
public void onBlockPlacedBy(World w, int x, int y, int z, EntityLivingBase ent, ItemStack stack)
{
int l = MathHelper.floor_double((double)(ent.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3;
w.setBlockMetadataWithNotify(x, y, z, l, 2);
}
public void registerBlockIcons(IIconRegister i)
{
this.face = i.registerIcon(this.isBurning2 ? "victor:case_mouth" : "victor:case_mouth");
this.top = i.registerIcon("victor:case_front");
this.blockIcon = i.registerIcon("victor:case");
}
@Override public boolean onBlockActivated (World w, int x, int y, int z, EntityPlayer ent, int a6, float a7, float a8, float a9)
{
if(w.isRemote) return true;
else
{
TileEntity t_e = w.getTileEntity(x,y,z);
if (t_e instanceof TileEntityElFur)
ent.openGui(MainClass.instance, 1, null, 1, 1, 1);
return true;
}
}
@Override public TileEntity createNewTileEntity(World w, int hz) {
return new TileEntityElFur();
}
public Item getItemDropped(int par1, Random random, int par3) {
return Item.getItemFromBlock(MainClass.ElFurOFF);
}
public Item getItem(World world, int par2, int par3, int par4) {
return Item.getItemFromBlock(MainClass.ElFurOFF);
}
public static void updateBlockState(boolean burning, World world, int x, int y, int z) {
int direction = world.getBlockMetadata(x, y, z);
TileEntity tileentity = world.getTileEntity(x, y, z);
isBurning = true;
if (burning) {
world.setBlock(x, y, z, MainClass.ElFurON);
} else {
world.setBlock(x, y, z, MainClass.ElFurOFF);
}
isBurning = false;
world.setBlockMetadataWithNotify(x, y, z, direction, 2);
if (tileentity != null) {
tileentity.validate();
world.setTileEntity(x, y, z, tileentity);
}
}
Краш-лог:
Код:
---- Minecraft Crash Report ----
// There are four lights!
Time: 26.02.15 19:47
Description: Ticking memory connection
java.lang.NullPointerException: Ticking memory connection
at com.Pedrael.lootingnigger.GuiHandler.getServerGuiElement(GuiHandler.java:15)
at cpw.mods.fml.common.network.NetworkRegistry.getRemoteGuiContainer(NetworkRegistry.java:241)
at cpw.mods.fml.common.network.internal.FMLNetworkHandler.openGui(FMLNetworkHandler.java:75)
at net.minecraft.entity.player.EntityPlayer.openGui(EntityPlayer.java:2501)
at com.Pedrael.lootingnigger.BlockElFur.onBlockActivated(BlockElFur.java:73)
at net.minecraft.server.management.ItemInWorldManager.activateBlockOrUseItem(ItemInWorldManager.java:409)
at net.minecraft.network.NetHandlerPlayServer.processPlayerBlockPlacement(NetHandlerPlayServer.java:593)
at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:74)
at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:122)
at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241)
at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182)
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726)
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614)
at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485)
at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752)
A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------
-- Head --
Stacktrace:
at com.Pedrael.lootingnigger.GuiHandler.getServerGuiElement(GuiHandler.java:15)
at cpw.mods.fml.common.network.NetworkRegistry.getRemoteGuiContainer(NetworkRegistry.java:241)
at cpw.mods.fml.common.network.internal.FMLNetworkHandler.openGui(FMLNetworkHandler.java:75)
at net.minecraft.entity.player.EntityPlayer.openGui(EntityPlayer.java:2501)
at com.Pedrael.lootingnigger.BlockElFur.onBlockActivated(BlockElFur.java:73)
at net.minecraft.server.management.ItemInWorldManager.activateBlockOrUseItem(ItemInWorldManager.java:409)
at net.minecraft.network.NetHandlerPlayServer.processPlayerBlockPlacement(NetHandlerPlayServer.java:593)
at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:74)
at net.minecraft.network.play.client.C08PacketPlayerBlockPlacement.processPacket(C08PacketPlayerBlockPlacement.java:122)
at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241)
-- Ticking connection --
Details:
Connection: net.minecraft.network.NetworkManager@1f9b213
Stacktrace:
at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182)
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726)
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614)
at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485)
at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752)
Регистрация TileEntity и сведения о моде(я знаю, что можно и даже нужно как modid + "", мне лень):
Код:
@Mod (modid = "victor", name = "Glorious evolution", version = "1.0")
@EventHandler
public static void load(FMLInitializationEvent Event){
NetworkRegistry.INSTANCE.registerGuiHandler(instance, new GuiHandler());
GameRegistry.registerTileEntity(TileEntityElFur.class, "victor.TE_ElFur");
}