Posted August 5, 20169 yr I cant seem to get a solution for this, but every time I open my custom container; my ability to craft in the 2x2 completely disappears, and I have to relog into the world just to fix this. Help? "you seem to be THE best modder I've seen imo." ~spynathan ლ(́◉◞౪◟◉‵ლ
August 5, 20169 yr Code, and screenshot please. VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect. Forge and vanilla BlockState generator.
August 5, 20169 yr Author HovercraftControllerBlock (Opens the GUI) public class BlockHovercraftController extends Block implements ITileEntityProvider{ public BlockHovercraftController(Material materialIn){ super(materialIn); } @Override public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) { PhysicsWrapperEntity wrapper = ValkyrienWarfareMod.physicsManager.getObjectManagingPos(worldIn, pos); if(heldItem!=null&&heldItem.getItem() instanceof ItemSystemLinker){ return false; } if(wrapper!=null){ if(!worldIn.isRemote){ playerIn.openGui(ValkyrienWarfareControlMod.instance, ControlGUIEnum.HoverCraftController.ordinal(), worldIn, pos.getX(), pos.getY(), pos.getZ()); } return true; } return false; } @Override public TileEntity createNewTileEntity(World worldIn, int meta){ return new TileEntityHoverController(); } } Container for the Block public class HovercraftControllerContainer extends Container{ public TileEntityHoverController tile; public HovercraftControllerContainer(){} public HovercraftControllerContainer(TileEntityHoverController tileEntity){ tile = tileEntity; } @Override public boolean canInteractWith(EntityPlayer playerIn){ return true; } @Override public void onContainerClosed(EntityPlayer playerIn) { super.onContainerClosed(playerIn); } } The GUI code for the block public class HovercraftControllerGUI extends GuiContainer{ private static ResourceLocation background = new ResourceLocation(ValkyrienWarfareControlMod.MODID.toLowerCase(), "textures/gui/ControlSystemGUI.png"); public TileEntityHoverController tileEnt; public ArrayList<GuiTextField> textFields = new ArrayList<GuiTextField>(); public HovercraftControllerGUI(EntityPlayer player,TileEntityHoverController entity){ super(player.inventoryContainer); mc = Minecraft.getMinecraft(); tileEnt = entity; } public void updateTextFields(){ textFields.get(0).setText(tileEnt.idealHeight+""); //TOP textFields.get(1).setText(Math.round(tileEnt.stabilityBias*100D)/100D+""); //MID textFields.get(2).setText(tileEnt.linearVelocityBias+""); //BOT } @Override protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException{ // super.mouseClicked(mouseX,mouseY,mouseButton); boolean prevFocused = false; boolean postFocused = false; for(GuiTextField text:textFields){ prevFocused = text.isFocused()||prevFocused; text.mouseClicked(mouseX, mouseY, mouseButton); postFocused = text.isFocused()||postFocused; } if(prevFocused&&!postFocused){ updateServer(); } } public void updateServer(){ if(tileEnt==null){ return; } HovercraftControllerGUIInputMessage toSend = new HovercraftControllerGUIInputMessage(this); ValkyrienWarfareControlMod.controlNetwork.sendToServer(toSend); } @Override protected void keyTyped(char typedChar, int keyCode) throws IOException{ boolean typed = false; for(GuiTextField text:textFields){ typed = typed||text.textboxKeyTyped(typedChar, keyCode); } if(!typed){ updateServer(); super.keyTyped(typedChar, keyCode); } } @Override public void updateScreen() { super.updateScreen(); for(GuiTextField text:textFields){ text.updateCursorCounter(); } } @Override public void initGui(){ textFields.clear(); int fieldWidth = 40; int fieldHeight = 20; GuiTextField top = new GuiTextField(0, fontRendererObj,(width-fieldWidth)/2-59, (height-fieldHeight)/2-77, fieldWidth, fieldHeight); GuiTextField mid = new GuiTextField(0, fontRendererObj,(width-fieldWidth)/2-59, (height-fieldHeight)/2-49, fieldWidth, fieldHeight); GuiTextField bot = new GuiTextField(0, fontRendererObj,(width-fieldWidth)/2-59, (height-fieldHeight)/2-20, fieldWidth, fieldHeight); top.setEnableBackgroundDrawing(false); mid.setEnableBackgroundDrawing(false); bot.setEnableBackgroundDrawing(false); textFields.add(top); textFields.add(mid); textFields.add(bot); updateTextFields(); // buttonList.add(new GuiButton(1, width/2-100, height/2-24, "Bastard button")); } @Override public void onGuiClosed(){ updateServer(); super.onGuiClosed(); // Keyboard.enableRepeatEvents(false); // this.inventorySlots.removeCraftingFromCrafters(this); } @Override public void drawScreen(int par1, int par2, float par3){ // super.drawScreen(par1, par2, par3); // drawBackground(par1); drawGuiContainerBackgroundLayer(par3,par1,par2); for (int i = 0; i < this.buttonList.size(); ++i) { ((GuiButton)this.buttonList.get(i)).drawButton(this.mc, par1, par2); } for (int j = 0; j < this.labelList.size(); ++j) { ((GuiLabel)this.labelList.get(j)).drawLabel(this.mc, par1, par2); } for(GuiTextField text:textFields){ text.drawTextBox(); } } @Override public boolean doesGuiPauseGame(){ return false; } @Override protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { // GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); mc.getTextureManager().bindTexture(background); int textureX = 7; int textureY = 7; int textureWidth = 239; int textureHeight = 232; drawTexturedModalRect((width-textureWidth)/2, (height-textureHeight)/2, textureX, textureY, textureWidth, textureHeight); } @Override public void drawBackground(int tint) { GlStateManager.disableLighting(); GlStateManager.disableFog(); Tessellator tessellator = Tessellator.getInstance(); VertexBuffer worldrenderer = tessellator.getBuffer(); this.mc.getTextureManager().bindTexture(background); GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); float f = 32.0F; worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR); worldrenderer.pos(0.0D, (double)this.height, 0.0D).tex(0.0D, (double)((float)this.height / 32.0F + (float)tint)).color(64, 64, 64, 255).endVertex(); worldrenderer.pos((double)this.width, (double)this.height, 0.0D).tex((double)((float)this.width / 32.0F), (double)((float)this.height / 32.0F + (float)tint)).color(64, 64, 64, 255).endVertex(); worldrenderer.pos((double)this.width, 0.0D, 0.0D).tex((double)((float)this.width / 32.0F), (double)tint).color(64, 64, 64, 255).endVertex(); worldrenderer.pos(0.0D, 0.0D, 0.0D).tex(0.0D, (double)tint).color(64, 64, 64, 255).endVertex(); tessellator.draw(); } } And the GUIHandler public class ControlGUIHandler implements IGuiHandler{ @Override public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { if(ID == ControlGUIEnum.HoverCraftController.ordinal()){ TileEntity tileEnt = world.getTileEntity(new BlockPos(x,y,z)); if(!(tileEnt instanceof TileEntityHoverController)){ return null; } TileEntityHoverController tile = (TileEntityHoverController) tileEnt; ((EntityPlayerMP)player).connection.sendPacket(tile.getUpdatePacket()); return new HovercraftControllerContainer(tile); } return null; } @Override public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { if(ID == ControlGUIEnum.HoverCraftController.ordinal()){ return new HovercraftControllerGUI(player,(TileEntityHoverController) world.getTileEntity(new BlockPos(x,y,z))); } return null; } } Also the TileEntityHoverController public class TileEntityHoverController extends TileEntity{ public ArrayList<BlockPos> enginePositions = new ArrayList<BlockPos>(); public double idealHeight = 16D; public double stabilityBias = .3D; public double linearVelocityBias = 1D; public double angularVelocityBias = 20D; public Vector normalVector = new Vector(0D,1D,0D); public double angularConstant = 100000000D; public double linearConstant = 1000000D; public boolean autoStabalizerControl = true; public TileEntityHoverController(){ // validate(); } /* * Returns the Force Vector the engine will send to the Physics Engine */ public Vector getForceForEngine(AntiGravEngineTileEntity engine,World world, BlockPos enginePos, IBlockState state, PhysicsObject physObj, double secondsToApply){ // physObj.physicsProcessor.convertTorqueToVelocity(); // secondsToApply*=5D; // idealHeight = 100D; if(autoStabalizerControl){ setAutoStabilizationValue(physObj); } double linearDist = -getControllerDistFromIdealY(physObj); double angularDist = -getEngineDistFromIdealAngular(enginePos,physObj,secondsToApply); engine.angularThrust.Y -= (angularConstant*secondsToApply)*angularDist; engine.linearThrust.Y -= (linearConstant*secondsToApply)*linearDist; engine.angularThrust.Y = Math.max(engine.angularThrust.Y, 0D); engine.linearThrust.Y = Math.max(engine.linearThrust.Y, 0D); engine.angularThrust.Y = Math.min(engine.angularThrust.Y, engine.maxThrust*stabilityBias); engine.linearThrust.Y = Math.min(engine.linearThrust.Y, engine.maxThrust*(1D-stabilityBias)); Vector aggregateForce = engine.linearThrust.getAddition(engine.angularThrust); aggregateForce.multiply(secondsToApply); // System.out.println(aggregateForce); return aggregateForce; } public double getEngineDistFromIdealAngular(BlockPos enginePos,PhysicsObject physObj,double secondsToApply){ Vector controllerPos = new Vector(pos.getX()+.5D,pos.getY()+.5D,pos.getZ()+.5D); Vector enginePosVec = new Vector(enginePos.getX()+.5D,enginePos.getY()+.5D,enginePos.getZ()+.5D); controllerPos.subtract(physObj.physicsProcessor.centerOfMass); enginePosVec.subtract(physObj.physicsProcessor.centerOfMass); Vector unOrientedPosDif = new Vector(enginePosVec.X-controllerPos.X,enginePosVec.Y-controllerPos.Y,enginePosVec.Z-controllerPos.Z); double idealYDif = unOrientedPosDif.dot(normalVector); RotationMatrices.doRotationOnly(physObj.coordTransform.lToWRotation, controllerPos); RotationMatrices.doRotationOnly(physObj.coordTransform.lToWRotation, enginePosVec); double inWorldYDif = enginePosVec.Y-controllerPos.Y; Vector angularVelocityAtPoint = physObj.physicsProcessor.angularVelocity.cross(enginePosVec); angularVelocityAtPoint.multiply(secondsToApply); return idealYDif-(inWorldYDif+angularVelocityAtPoint.Y*angularVelocityBias); } public double getControllerDistFromIdealY(PhysicsObject physObj){ Vector controllerPos = new Vector(pos.getX()+.5D,pos.getY()+.5D,pos.getZ()+.5D); physObj.coordTransform.fromLocalToGlobal(controllerPos); return idealHeight-(controllerPos.Y+(physObj.physicsProcessor.linearMomentum.Y*physObj.physicsProcessor.invMass*linearVelocityBias)); } public void handleGUIInput(HovercraftControllerGUIInputMessage message, MessageContext ctx){ idealHeight = message.newIdealHeight; if(message.newStablitiyBias<0||message.newStablitiyBias>1D){ //Out of bounds, set to auto autoStabalizerControl = true; }else{ double stabilityDif = Math.abs(stabilityBias-message.newStablitiyBias); // if(stabilityDif>.05D){ stabilityBias = message.newStablitiyBias; autoStabalizerControl = false; // } } linearVelocityBias = message.newLinearVelocityBias; markDirty(); } private void setAutoStabilizationValue(PhysicsObject physObj){ // double epsilon = 5D; // double biasChange = .00005D; // // Vector controllerPos = new Vector(pos.getX()+.5D,pos.getY()+.5D,pos.getZ()+.5D); // physObj.coordTransform.fromLocalToGlobal(controllerPos); // // double controllerDist = idealHeight-controllerPos.Y; // // double yVelocity = physObj.physicsProcessor.linearMomentum.Y*physObj.physicsProcessor.invMass*linearVelocityBias; // // if(Math.abs(controllerDist)>epsilon){ // if(Math.signum(controllerDist)!=Math.signum(yVelocity)){ // stabilityBias+=(biasChange*controllerDist); // }else{ // stabilityBias-=(biasChange*controllerDist); // } // } // //Limit bias to between 0 and 1 // stabilityBias = Math.max(Math.min(stabilityBias, 1D), 0D); } @Override public SPacketUpdateTileEntity getUpdatePacket() { SPacketUpdateTileEntity packet = new SPacketUpdateTileEntity(pos,0,writeToNBT(new NBTTagCompound())); return packet; } @Override public void onDataPacket(net.minecraft.network.NetworkManager net, net.minecraft.network.play.server.SPacketUpdateTileEntity pkt) { readFromNBT(pkt.getNbtCompound()); } @Override public void readFromNBT(NBTTagCompound compound){ enginePositions = NBTUtils.readBlockPosArrayListFromNBT("enginePositions", compound); normalVector = NBTUtils.readVectorFromNBT("normalVector", compound); if(normalVector.isZero()){ normalVector = new Vector(0,1,0); } idealHeight = compound.getDouble("idealHeight"); stabilityBias = compound.getDouble("stabilityBias"); linearVelocityBias = compound.getDouble("linearVelocityBias"); angularVelocityBias = compound.getDouble("angularVelocityBias"); autoStabalizerControl = compound.getBoolean("autoStabalizerControl"); super.readFromNBT(compound); } @Override public NBTTagCompound writeToNBT(NBTTagCompound compound){ NBTUtils.writeBlockPosArrayListToNBT("enginePositions", enginePositions, compound); NBTUtils.writeVectorToNBT("normalVector", normalVector, compound); compound.setDouble("idealHeight", idealHeight); compound.setDouble("stabilityBias", stabilityBias); compound.setDouble("linearVelocityBias", linearVelocityBias); compound.setDouble("angularVelocityBias", angularVelocityBias); compound.setBoolean("autoStabalizerControl", autoStabalizerControl); return super.writeToNBT(compound); } } "you seem to be THE best modder I've seen imo." ~spynathan ლ(́◉◞౪◟◉‵ლ
August 5, 20169 yr Your GuiHander is not your gui handler you didn't copy the right code. Also TileEntity code. VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect. Forge and vanilla BlockState generator.
August 5, 20169 yr Author Alright, I've posted all the relevant code and I cannot possibly see a reason as to why the player loses the ability to craft after simply opening a GUI! "you seem to be THE best modder I've seen imo." ~spynathan ლ(́◉◞౪◟◉‵ლ
August 5, 20169 yr Author Well, it basically grabs some numbers from the client TileEntity and sends them to the server to update the information to what the player typed in. public class HovercraftControllerGUIInputMessage implements IMessage{ public BlockPos tilePos; public int physEntId; public double newIdealHeight; public double newStablitiyBias; public double newLinearVelocityBias; public HovercraftControllerGUIInputMessage(){} public HovercraftControllerGUIInputMessage(HovercraftControllerGUI guiIn){ tilePos = guiIn.tileEnt.getPos(); physEntId = ValkyrienWarfareMod.physicsManager.getObjectManagingPos(guiIn.mc.theWorld, tilePos).getEntityId(); try{ newIdealHeight = Double.parseDouble(guiIn.textFields.get(0).getText()); newStablitiyBias = Double.parseDouble(guiIn.textFields.get(1).getText()); newLinearVelocityBias = Double.parseDouble(guiIn.textFields.get(2).getText()); }catch(Exception e){ guiIn.updateTextFields(); } } @Override public void fromBytes(ByteBuf buf) { tilePos = new BlockPos(buf.readInt(),buf.readInt(),buf.readInt()); physEntId = buf.readInt(); newIdealHeight = buf.readDouble(); newStablitiyBias = buf.readDouble(); newLinearVelocityBias = buf.readDouble(); } @Override public void toBytes(ByteBuf buf) { buf.writeInt(tilePos.getX()); buf.writeInt(tilePos.getY()); buf.writeInt(tilePos.getZ()); buf.writeInt(physEntId); buf.writeDouble(newIdealHeight); buf.writeDouble(newStablitiyBias); buf.writeDouble(newLinearVelocityBias); } } Nothing that could affect the GUI though, all this does is move numbers around "you seem to be THE best modder I've seen imo." ~spynathan ლ(́◉◞౪◟◉‵ლ
August 5, 20169 yr Author Oh sorry, this too public class HovercraftControllerGUIInputHandler implements IMessageHandler<HovercraftControllerGUIInputMessage, IMessage>{ @Override public IMessage onMessage(final HovercraftControllerGUIInputMessage message, final MessageContext ctx) { IThreadListener mainThread = ctx.getServerHandler().serverController; mainThread.addScheduledTask(new Runnable(){ @Override public void run(){ PhysicsWrapperEntity wrapper = ValkyrienWarfareMod.physicsManager.getObjectManagingPos(ctx.getServerHandler().playerEntity.worldObj, message.tilePos); TileEntity tileEnt = wrapper.wrapping.VKChunkCache.getTileEntity(message.tilePos); if(tileEnt!=null){ if(tileEnt instanceof TileEntityHoverController){ ((TileEntityHoverController)tileEnt).handleGUIInput(message, ctx); } }else{ System.out.println("Player: "+ctx.getServerHandler().playerEntity.getName()+" sent a broken packet"); } } }); return null; } } "you seem to be THE best modder I've seen imo." ~spynathan ლ(́◉◞౪◟◉‵ლ
August 5, 20169 yr That can be checked by using player.openContainer and a place to run that/print out. VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect. Forge and vanilla BlockState generator.
August 5, 20169 yr Author Hmm yeah, after adding this to my BlockHovercraftController inventory works again; only problem is now I cant use the inventory of the controller because it never opened server side @Override public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) { PhysicsWrapperEntity wrapper = ValkyrienWarfareMod.physicsManager.getObjectManagingPos(worldIn, pos); if(heldItem!=null&&heldItem.getItem() instanceof ItemSystemLinker){ return false; } if(wrapper!=null){ if(!worldIn.isRemote){ playerIn.openGui(ValkyrienWarfareControlMod.instance, ControlGUIEnum.HoverCraftController.ordinal(), worldIn, pos.getX(), pos.getY(), pos.getZ()); playerIn.openContainer = playerIn.inventoryContainer; } return true; } return false; } "you seem to be THE best modder I've seen imo." ~spynathan ლ(́◉◞౪◟◉‵ლ
August 5, 20169 yr Does your container still work after that? VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect. Forge and vanilla BlockState generator.
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.