MultiMote
Forge Modder-
Posts
257 -
Joined
-
Last visited
Everything posted by MultiMote
-
(IInventory variable).getStackInSlot(number) ?
-
How to move items towards the player?
MultiMote replied to Toastrackenigma's topic in Modder Support
I think you can select all EntityItems near the player (world.getEntitiesWithinAABBExcludingEntity) and move them. Take look at handleMaterialAcceleration function in the EntityItem class. -
Slots in container numerated from 0 to inventory_size - 1 Let's look at your code. for (int i = 0; i < 3; i++) { for (int j = 0; j < 2; j++) { addSlotToContainer(new Slot(c, j + i * 2, (loot_x + j * 18), (loot_y + i * 18))); } This code adds slots: 0, 1, 2, 3, 4, 5 for (int j = 0; j < 2; j++) { addSlotToContainer(new SlotUpgrade(c, j * 2, (loot_x + j * 18), (loot_y + j + 4 * 18))); } This code adds slots: 0 (again), and 5 (again) I think you should edit second part to this: for (int j = 0; j < 2; j++) { addSlotToContainer(new SlotUpgrade(c, 6 + j, (loot_x + j * 18), (loot_y + j + 4 * 18))); } And it will add slots 6 and 7 instead of 0 and 5
-
Post your container code
-
[1.7.10] Editing Bed Behavior without Base Edits
MultiMote replied to zombiepig333's topic in Modder Support
@SubscribeEvent public void onSleep(PlayerSleepInBedEvent event) { if(event.result == EntityPlayer.EnumStatus.OK) event.entityPlayer.worldObj.playSoundEffect(event.entityPlayer.posX, event.entityPlayer.posY, event.entityPlayer.posZ, "random.successful_hit", 1.0F, 0.1F); } -
SketchUp & Blender models in Minecraft possible?
MultiMote replied to adusut's topic in Modder Support
MinecraftForgeClient.registerItemRenderer(ModClass.youritem, new YourItemRenderer()); YourItemRenderer must implement IItemRenderer. @Override public void renderItem(ItemRenderType type, ItemStack item, Object... data) { switch (type) { case EQUIPPED: //render code break; case EQUIPPED_FIRST_PERSON: //render code break; case ENTITY: //render code break; case INVENTORY: //render code break; default: break; } } @Override public boolean handleRenderType(ItemStack item, ItemRenderType type) { return true; //render all variants } -
SketchUp & Blender models in Minecraft possible?
MultiMote replied to adusut's topic in Modder Support
http://www.minecraftforge.net/wiki/Using_wavefront_model -
Where is mcmod.info?
-
[1.7.2] Buttons in GUI spam when clicked once.
MultiMote replied to Zer0HD2's topic in Modder Support
You add buttons in drawScreen which called 20 times per second. You must add buttons in initGui(). -
Create class with methods @SubscribeEvent public void onLogout(PlayerEvent.PlayerLoggedOutEvent event) {} @SubscribeEvent public void onLogin(PlayerEvent.PlayerLoggedInEvent event) {} And register it with FMLCommonHandler.instance().bus().register(new YourClass());
-
[1.7.2] Custom GUI and Implementing IInventory
MultiMote replied to loawkise's topic in Modder Support
I created and tested pig with inventory for you MyEntity: public class MyEntity extends EntityPig implements IInvBasic { public MyInventory gear; public MyEntity(World world) { super(world); this.setupGear(); this.gear.setInventorySlotContents(0, new ItemStack(Items.apple)); this.gear.setInventorySlotContents(1, new ItemStack(Items.carrot)); } public int howManySlots() { return 8; } private void setupGear() { MyInventory gear1 = this.gear; this.gear = new MyInventory("MyInventory", howManySlots()); this.gear.func_110133_a(this.getCommandSenderName()); if (gear1 != null) { gear1.func_110132_b(this); int i = Math.min(gear1.getSizeInventory(), this.gear.getSizeInventory()); for (int j = 0; j < i; ++j) { ItemStack itemstack = gear1.getStackInSlot(j); if (itemstack != null) { this.gear.setInventorySlotContents(j, itemstack.copy()); } } gear1 = null; } this.gear.func_110134_a(this); } public void onDeath(DamageSource ds) { super.onDeath(ds); if (gear != null && !this.worldObj.isRemote) { for (int i = 0; i < gear.getSizeInventory(); ++i) { ItemStack itemstack = gear.getStackInSlot(i); if (itemstack != null) { this.entityDropItem(itemstack, 0.0F); } } } } public void writeEntityToNBT(NBTTagCompound com) { NBTTagList nbttaglist = new NBTTagList(); for (int i = 0; i < this.gear.getSizeInventory(); ++i) { ItemStack itemstack = this.gear.getStackInSlot(i); if (itemstack != null) { NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setByte("Slot", (byte) i); itemstack.writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); } com.setTag("Items", nbttaglist); } } public void readEntityFromNBT(NBTTagCompound com) { NBTTagList nbttaglist = com.getTagList("Items", 10); this.setupGear(); for (int i = 0; i < nbttaglist.tagCount(); ++i) { NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(i); int j = nbttagcompound1.getByte("Slot") & 255; if (j >= 0 && j < this.gear.getSizeInventory()) { this.gear.setInventorySlotContents(j, ItemStack.loadItemStackFromNBT(nbttagcompound1)); } } } @Override public boolean interact(EntityPlayer player) { super.interact(player); if(!player.worldObj.isRemote)player.openGui(Core.instance, 5, this.worldObj, this.getEntityId(), 0, 0); //we will use x coord for sending entityId return true; } public void onInventoryChanged(InventoryBasic inv) {} } MyInventory: public class MyInventory extends InventoryBasic { public MyInventory(String name, int slots) { super(name, false, slots); } } MyContainer: public class MyContainer extends Container { protected IInventory gear; private int player_inventory_x = 70; private int player_inventory_y = 8; private int loot_x = 8; private int loot_y = 10; public MyContainer (InventoryPlayer inventoryPlayer, IInventory c){ gear = c; { int isize = c.getSizeInventory(); for (int i = 0; i < 4; i++) { for (int j = 0; j < 2; j++) { addSlotToContainer(new Slot(c, j + i * 2, (loot_x + j * 18), (loot_y + i * 18))); } } } bindPlayerInventory(inventoryPlayer); } public boolean canInteractWith(EntityPlayer player) { return gear.isUseableByPlayer(player); } protected void bindPlayerInventory(InventoryPlayer inventoryPlayer) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 9; j++) { addSlotToContainer(new Slot(inventoryPlayer, j + i * 9 + 9, player_inventory_x + j * 18, player_inventory_y + i * 18)); } } for (int i = 0; i < 9; i++) { addSlotToContainer(new Slot(inventoryPlayer, i, player_inventory_x + i * 18, player_inventory_y + 54 + 4)); } } public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2) { ItemStack itemstack = null; Slot slot = (Slot)this.inventorySlots.get(par2); if (slot != null && slot.getHasStack()) { ItemStack itemstack1 = slot.getStack(); itemstack = itemstack1.copy(); int s = gear.getSizeInventory(); if (par2 < s) { if (!this.mergeItemStack(itemstack1, s, this.inventorySlots.size(), true)) { return null; } } else if (!this.mergeItemStack(itemstack1, 0, s, false)) { return null; } if (itemstack1.stackSize == 0) { slot.putStack(null); } else { slot.onSlotChanged(); } } return itemstack; } public void onContainerClosed(EntityPlayer par1EntityPlayer) { super.onContainerClosed(par1EntityPlayer); this.gear.closeInventory(); } } MyEntityGui: public class MyEntityGui extends GuiContainer { private static final ResourceLocation txtr = new ResourceLocation(your ModID in Assets:path/to/testgui.png); private int invW = 176; private int invH = 90; private int lootH = 90; private int lootW = 50; public MyEntityGui(InventoryPlayer inventoryPlayer, MyInventory inv) { super(new MyContainer(inventoryPlayer, inv)); this.xSize=300; this.ySize=90; } protected void drawGuiContainerForegroundLayer(int param1, int param2) {} protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.mc.renderEngine.bindTexture(txtr); int x = (width - invW) / 2; int y = (height - invH) / 2; this.drawTexturedModalRect(x, y, 0, 0, invW, invH); x = (width/ 2)-150; y = (height - lootH) / 2; this.drawTexturedModalRect(x, y, 176, 0, lootW, lootH); } } GuiHandler: public class GuiHandler implements IGuiHandler { @Override public Object getServerGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) { if(id==5){ Entity ent = world.getEntityByID(x); if(ent!=null && ent instanceof MyEntity){ return new MyContainer(player.inventory, ((MyEntity)ent).gear); }} return null; } @Override public Object getClientGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) { if(id==5){ Entity ent = world.getEntityByID(x); if(ent!=null && ent instanceof MyEntity){ return new MyEntityGui(player.inventory, new MyInventory("MyInventory", ((MyEntity) ent).howManySlots())); }} return null; } } And add this to your main mod class: @EventHandler public void load(FMLInitializationEvent event) { EntityRegistry.registerGlobalEntityID(MyEntity.class, "MyEntity", 151, 52, 89); //creates dark-blue egg to spawn entity EntityRegistry.registerModEntity(MyEntity.class, "MyEntity", 151, this, 64, 1, true); NetworkRegistry.INSTANCE.registerGuiHandler(this, new GuiHandler()); } testgui.png: screens: -
[1.7.2] Custom GUI and Implementing IInventory
MultiMote replied to loawkise's topic in Modder Support
Also you can use InventoryBasic. MyInventory.java public class MyInventory extends InventoryBasic { public MyInventory(String name, int slots) { super(name, false, slots); } } MyEntity.java public class MyEntity extends EntityLiving implements IInvBasic { public MyInventory gear; public MyEntity(World world) { super(world); //other inits setupInventory(); this.gear.setInventorySlotContents(0, new ItemStack(Items.apple)); this.gear.setInventorySlotContents(1, new ItemStack(Items.carrot)); } private void setupInventory() { MyInventory gear1 = this.gear; this.gear = new MyInventory("MyInventory", howManySlots()); this.gear.func_110133_a(this.getCommandSenderName()); if (gear1 != null) { gear1.func_110132_b(this); int i = Math.min(gear1.getSizeInventory(), this.gear.getSizeInventory()); for (int j = 0; j < i; ++j) { ItemStack itemstack = gear1.getStackInSlot(j); if (itemstack != null) { this.gear.setInventorySlotContents(j, itemstack.copy()); } } gear1 = null; } this.gear.func_110134_a(this); } public int howManySlots() { return this.getType() == 10; } public void onDeath(DamageSource ds) { super.onDeath(ds); if (gear != null && !this.worldObj.isRemote) { //drop all items for (int i = 0; i < gear.getSizeInventory(); ++i) { ItemStack itemstack = gear.getStackInSlot(i); if (itemstack != null) { this.entityDropItem(itemstack, 0.0F); } } } } public void writeEntityToNBT(NBTTagCompound com) { NBTTagList nbttaglist = new NBTTagList(); for (int i = 0; i < this.gear.getSizeInventory(); ++i) { ItemStack itemstack = this.gear.getStackInSlot(i); if (itemstack != null) { NBTTagCompound nbttagcompound1 = new NBTTagCompound(); nbttagcompound1.setByte("Slot", (byte) i); itemstack.writeToNBT(nbttagcompound1); nbttaglist.appendTag(nbttagcompound1); } com.setTag("Items", nbttaglist); } } public void readEntityFromNBT(NBTTagCompound com) { NBTTagList nbttaglist = com.getTagList("Items", 10); this.setupGear(); for (int i = 0; i < nbttaglist.tagCount(); ++i) { NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(i); int j = nbttagcompound1.getByte("Slot") & 255; if (j >= 0 && j < this.gear.getSizeInventory()) { this.gear.setInventorySlotContents(j, ItemStack.loadItemStackFromNBT(nbttagcompound1)); } } } public void onInventoryChanged(InventoryBasic inv) {} //and other methods } This is entity inventory part. -
It's from forge changelog. Comment in NetworkCheckHandler: /** * A method annotated with this will be called when a remote network connection is offered. * The method should have two parameters, of types {@link Map<String,String>} and {@link Side}. It should return a boolean * true indicating that the remote party is acceptable, or false if not. * * <p> * When the method is invoked, the map will contain String keys and values listing all mods and their versions present. * The side represents the side of the remote party. So if you're on the server, it'll be CLIENT, and vice versa. * * <p> * This method will be invoked both when querying the status of the remote server, and when connecting to the remote server. * * <p> * <strong>NOTE: the server will not be setup at any point when this method is called. Do not try and interact with the server * or the client in any way, except to accept or reject the list of mods.</strong> * * @author cpw * */
-
I only found this: But... I don't know how to use it.
-
Methods can be client-side only (with @SideOnly(Side.CLIENT) annotation).
-
In 1.7: Handler class: package yourpackage; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.PlayerEvent; import net.minecraft.util.ChatComponentText; public class PlayerLoginHandler { @SubscribeEvent public void onLogin(PlayerEvent.PlayerLoggedInEvent event){ event.player.addChatMessage(new ChatComponentText("Hello!")); } @SubscribeEvent public void onLogout(PlayerEvent.PlayerLoggedOutEvent event){ //something else } } Register event in mod class: @EventHandler public void load(FMLInitializationEvent event) { FMLCommonHandler.instance().bus().register(new PlayerLoginHandler()); }
-
world.markBlockForUpdate(x, y, z)
-
public void drawTexturedRect(int x, int y, int u, int v, int width, int height, int textureWidth, int textureHeight) { float f = 1F / (float)textureWidth; float f1 = 1F / (float)textureHeight; Tessellator tessellator = Tessellator.instance; tessellator.startDrawingQuads(); tessellator.addVertexWithUV((double)(x), (double)(y + height), 0, (double)((float)(u) * f), (double)((float)(v + height) * f1)); tessellator.addVertexWithUV((double)(x + width), (double)(y + height), 0, (double)((float)(u + width) * f), (double)((float)(v + height) * f1)); tessellator.addVertexWithUV((double)(x + width), (double)(y), 0, (double)((float)(u + width) * f), (double)((float)(v) * f1)); tessellator.addVertexWithUV((double)(x), (double)(y), 0, (double)((float)(u) * f), (double)((float)(v) * f1)); tessellator.draw(); }