
SoBiohazardous
Members-
Posts
44 -
Joined
-
Last visited
Everything posted by SoBiohazardous
-
So i have a furnace. However, the recipe doesn't work. I have tried outputting canSmelt() to console, and it seems to be printing true when necessary. TileEntity package crzyguitardude.crazyfoods.gui; import cpw.mods.fml.common.registry.GameRegistry; import crzyguitardude.crazyfoods.MicrowaveRecipes; import crzyguitardude.crazyfoods.block.BlockMicrowave; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemHoe; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemSword; import net.minecraft.item.ItemTool; import net.minecraft.item.crafting.FurnaceRecipes; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; public class TileEntityMicrowave extends TileEntity implements IInventory { private ItemStack[] inv; public int furnaceBurnTime = 0; public int currentItemBurnTime = 0; /** The number of ticks that the current item has been cooking for */ public int furnaceCookTime = 0; public TileEntityMicrowave() { inv = new ItemStack[4]; } @Override public int getSizeInventory() { return inv.length; } @Override public ItemStack getStackInSlot(int slot) { return inv[slot]; } @Override public void setInventorySlotContents(int slot, ItemStack stack) { inv[slot] = stack; if (stack != null && stack.stackSize > getInventoryStackLimit()) { stack.stackSize = getInventoryStackLimit(); } } @Override public ItemStack decrStackSize(int slot, int amt) { ItemStack stack = getStackInSlot(slot); if (stack != null) { if (stack.stackSize <= amt) { setInventorySlotContents(slot, null); } else { stack = stack.splitStack(amt); if (stack.stackSize == 0) { setInventorySlotContents(slot, null); } } } return stack; } @Override public ItemStack getStackInSlotOnClosing(int slot) { ItemStack stack = getStackInSlot(slot); if (stack != null) { setInventorySlotContents(slot, null); } return stack; } @Override public int getInventoryStackLimit() { return 64; } @Override public boolean isUseableByPlayer(EntityPlayer player) { return worldObj.getBlockTileEntity(xCoord, yCoord, zCoord) == this && player.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 64; } @Override public void openChest() {} @Override public void closeChest() {} @Override public void readFromNBT(NBTTagCompound tagCompound) { super.readFromNBT(tagCompound); NBTTagList tagList = tagCompound.getTagList("Inventory"); for (int i = 0; i < tagList.tagCount(); i++) { NBTTagCompound tag = (NBTTagCompound) tagList.tagAt(i); byte slot = tag.getByte("Slot"); if (slot >= 0 && slot < inv.length) { inv[slot] = ItemStack.loadItemStackFromNBT(tag); } } } @Override public void writeToNBT(NBTTagCompound tagCompound) { super.writeToNBT(tagCompound); NBTTagList itemList = new NBTTagList(); for (int i = 0; i < inv.length; i++) { ItemStack stack = inv[i]; if (stack != null) { NBTTagCompound tag = new NBTTagCompound(); tag.setByte("Slot", (byte) i); stack.writeToNBT(tag); itemList.appendTag(tag); } } tagCompound.setTag("Inventory", itemList); } public int getCookProgressScaled(int par1) { return this.furnaceCookTime * par1 / 200; } public int getBurnTimeRemainingScaled(int par1) { if (this.currentItemBurnTime == 0) { this.currentItemBurnTime = 200; } return this.furnaceBurnTime * par1 / this.currentItemBurnTime; } public boolean isBurning() { return this.furnaceBurnTime > 0; } public void updateEntity() { boolean flag = this.furnaceBurnTime > 0; boolean flag1 = false; if (this.furnaceBurnTime > 0) { --this.furnaceBurnTime; } if (!this.worldObj.isRemote) { if (this.furnaceBurnTime == 0 && this.canSmelt()) { this.currentItemBurnTime = this.furnaceBurnTime = getItemBurnTime(this.inv[1]); if (this.furnaceBurnTime > 0) { flag1 = true; if (this.inv[1] != null && this.inv[3] != null) { --this.inv[1].stackSize; --this.inv[3].stackSize; if (this.inv[1].stackSize == 0 && this.inv[3].stackSize == 0) { this.inv[1] = this.inv[1].getItem().getContainerItemStack(inv[1]); this.inv[3] = this.inv[3].getItem().getContainerItemStack(inv[3]); } } } } if (this.isBurning() && this.canSmelt()) { ++this.furnaceCookTime; if (this.furnaceCookTime == 200) { this.furnaceCookTime = 0; this.smeltItem(); flag1 = true; } } else { this.furnaceCookTime = 0; } if (flag != this.furnaceBurnTime > 0) { flag1 = true; BlockMicrowave.updateFurnaceBlockState(this.furnaceBurnTime > 0, this.worldObj, this.xCoord, this.yCoord, this.zCoord); } } if (flag1) { this.onInventoryChanged(); } System.out.println(this.canSmelt()); } /** * Returns true if the furnace can smelt an item, i.e. has a source item, destination stack isn't full, etc. */ private boolean canSmelt() { if (this.inv[0] == null) { return false; } else { if(this.inv[1] != null && this.inv[3] != null) { ItemStack itemstack = MicrowaveRecipes.cooking().getCookingResult(this.inv[1].getItem().itemID, this.inv[3].getItem().itemID); if (itemstack == null) return false; if (this.inv[2] == null) return true; if (!this.inv[2].isItemEqual(itemstack)) return false; int result = inv[2].stackSize + itemstack.stackSize; return (result <= getInventoryStackLimit() && result <= itemstack.getMaxStackSize()); } return false; } } /** * Turn one item from the furnace source stack into the appropriate smelted item in the furnace result stack */ public void smeltItem() { if (this.canSmelt()) { ItemStack itemstack = MicrowaveRecipes.cooking().getCookingResult(this.inv[1].getItem().itemID, this.inv[3].getItem().itemID); if (this.inv[2] == null) { this.inv[2] = itemstack.copy(); } else if (this.inv[2].isItemEqual(itemstack)) { inv[2].stackSize += itemstack.stackSize; } --this.inv[0].stackSize; if (this.inv[0].stackSize <= 0) { this.inv[0] = null; } } } /** * Returns the number of ticks that the supplied fuel item will keep the furnace burning, or 0 if the item isn't * fuel */ public static int getItemBurnTime(ItemStack itemstack) { if(itemstack == null) { return 0; } int i = itemstack.getItem().itemID; if (i == Item.redstone.itemID) { return 400; } else { return 0; } } /** * Return true if item is a fuel source (getItemBurnTime() > 0). */ public static boolean isItemFuel(ItemStack par0ItemStack) { return getItemBurnTime(par0ItemStack) > 0; } @Override public String getInvName() { return "crazyfoods.tileentitymicrowave"; } @Override public boolean isInvNameLocalized() { return false; } @Override public boolean isStackValidForSlot(int i, ItemStack itemstack) { return false; } } Container package crzyguitardude.crazyfoods.gui; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.Slot; import net.minecraft.inventory.SlotFurnace; import net.minecraft.item.ItemStack; public class ContainerMicrowave extends Container { protected TileEntityMicrowave tileEntity; public ContainerMicrowave (InventoryPlayer par1InventoryPlayer, TileEntityMicrowave te) { tileEntity = te; //right = positive, down = positive //fuel addSlotToContainer(new Slot(te, 0, 46, 53)); //right input addSlotToContainer(new Slot(te, 1, 56, 17)); //left input addSlotToContainer(new Slot(te, 3, 37, 17)); //output addSlotToContainer(new SlotMicrowave(par1InventoryPlayer.player, te, 2, 116, 35)); //commonly used vanilla code that adds the player's inventory bindPlayerInventory(par1InventoryPlayer); } @Override public boolean canInteractWith(EntityPlayer player) { return tileEntity.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, 8 + j * 18, 84 + i * 18)); } } for (int i = 0; i < 9; i++) { addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 142)); } } @Override public ItemStack transferStackInSlot(EntityPlayer player, int slot) { ItemStack stack = null; Slot slotObject = (Slot) inventorySlots.get(slot); //null checks and checks if the item can be stacked (maxStackSize > 1) if (slotObject != null && slotObject.getHasStack()) { ItemStack stackInSlot = slotObject.getStack(); stack = stackInSlot.copy(); //merges the item into player inventory since its in the tileEntity if (slot < 9) { if (!this.mergeItemStack(stackInSlot, 9, 45, true)) { return null; } } //places it into the tileEntity is possible since its in the player inventory else if (!this.mergeItemStack(stackInSlot, 0, 9, false)) { return null; } if (stackInSlot.stackSize == 0) { slotObject.putStack(null); } else { slotObject.onSlotChanged(); } if (stackInSlot.stackSize == stack.stackSize) { return null; } slotObject.onPickupFromSlot(player, stackInSlot); } return stack; } } MicrowaveRecipes // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://www.kpdus.com/jad.html // Decompiler options: packimports(3) braces deadcode package crzyguitardude.crazyfoods; import java.util.HashMap; import java.util.Map; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; // Referenced classes of package net.minecraft.src: // Block, ItemStack, Item public class MicrowaveRecipes { public static final MicrowaveRecipes cooking() { return cookingBase; } private MicrowaveRecipes() { cookingList = new HashMap(); addCooking(Item.bucketMilk.itemID, Item.bucketEmpty.itemID, new ItemStack(Block.blockDiamond)); } public void addCooking(int input1, int input2, ItemStack output) { // StringBuffer to create the unique key StringBuffer sb= new StringBuffer(32); // create a String in case of the stone-gras->diamond recipe it would be 1_2 // note: (addInfusingRecipe(1,2,new ItemStack (Item.diamond)))==(addInfusingRecipe(2,1,new ItemStack (Item.diamond))) // so you don`t have to worry about the order of the 1st and 2nd input sb.append(Math.min(input1,input2)).append("_").append(Math.max(input1,input2)); cookingList.put(sb.toString(), output); } public ItemStack getCookingResult(int input1, int input2) { StringBuffer sb= new StringBuffer(32); // gets the resulting ItemStack of the recipe sb.append(Math.min(input1,input2)).append("_").append(Math.max(input1,input2)); return (ItemStack) cookingList.get(sb.toString()); } public Map getCookingList() { return cookingList; } private static final MicrowaveRecipes cookingBase = new MicrowaveRecipes(); private Map cookingList; } Any help is appreciated.
-
[Solved]KeyHandler crashes server, works in SSP
SoBiohazardous replied to Senitiel's topic in Modder Support
Change TickType.CLIENT to TickType.SERVER -
What are the last two parameters for the onUpdate method? public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) They are named confusing so I was wondering what they are.
-
[Unsolved]Explosive Block Not rendering
SoBiohazardous replied to SoBiohazardous's topic in Modder Support
No, thanks for help but it didn't work. -
Hello, So I have a nuke block that's works as intended. However when i light it, the block will turn white for a quick second then disappear. Here is my code: Registry in @Init method: EntityRegistry.registerModEntity(EntityNukePrimed.class, "NukePrimed", 3, this, 350, 5, false); RenderingRegistry.registerEntityRenderingHandler(EntityNukePrimed.class, new RenderNukePrimed()); EntityNukePrimed: package crzyguitardude.extracraft.extraores.entity; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; public class EntityNukePrimed extends Entity { /** How long the fuse is */ public int fuse; private EntityLiving tntPlacedBy; private String texture; public EntityNukePrimed(World par1World) { super(par1World); this.fuse = 0; this.preventEntitySpawning = true; this.setSize(0.98F, 0.98F); this.yOffset = this.height / 2.0F; } public EntityNukePrimed(World par1World, double par2, double par4, double par6, EntityLiving par8EntityLiving) { this(par1World); this.setPosition(par2, par4, par6); float f = (float)(Math.random() * Math.PI * 2.0D); this.motionX = (double)(-((float)Math.sin((double)f)) * 0.02F); this.motionY = 0.20000000298023224D; this.motionZ = (double)(-((float)Math.cos((double)f)) * 0.02F); this.fuse = 120; this.prevPosX = par2; this.prevPosY = par4; this.prevPosZ = par6; this.tntPlacedBy = par8EntityLiving; } protected void entityInit() {} /** * returns if this entity triggers Block.onEntityWalking on the blocks they walk on. used for spiders and wolves to * prevent them from trampling crops */ protected boolean canTriggerWalking() { return false; } /** * Returns true if other Entities should be prevented from moving through this Entity. */ public boolean canBeCollidedWith() { return !this.isDead; } /** * Called to update the entity's position/logic. */ public void onUpdate() { this.prevPosX = this.posX; this.prevPosY = this.posY; this.prevPosZ = this.posZ; this.motionY -= 0.03999999910593033D; this.moveEntity(this.motionX, this.motionY, this.motionZ); this.motionX *= 0.9800000190734863D; this.motionY *= 0.9800000190734863D; this.motionZ *= 0.9800000190734863D; if (this.onGround) { this.motionX *= 0.699999988079071D; this.motionZ *= 0.699999988079071D; this.motionY *= -0.5D; } if (this.fuse-- <= 0) { this.setDead(); if (!this.worldObj.isRemote) { this.explode(); } } else { this.worldObj.spawnParticle("smoke", this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, 0.0D); } } private void explode() { float f = 4.0F * 4; this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, f, true); } /** * (abstract) Protected helper method to write subclass entity data to NBT. */ protected void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) { par1NBTTagCompound.setByte("Fuse", (byte)this.fuse); } /** * (abstract) Protected helper method to read subclass entity data from NBT. */ protected void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) { this.fuse = par1NBTTagCompound.getByte("Fuse"); } @SideOnly(Side.CLIENT) public float getShadowSize() { return 0.0F; } public EntityLiving func_94083_c() { return this.tntPlacedBy; } public String getTexture() { return "/mods/extraores/textures/blocks/block_NukeSide.png"; } } RenderNukePrimed: package crzyguitardude.extracraft.extraores.entity; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import crzyguitardude.extracraft.extraores.ExtraOres; import crzyguitardude.extracraft.extraores.block.BlockNuke; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.entity.Render; import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityTNTPrimed; import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) public class RenderNukePrimed extends Render { private RenderBlocks blockRenderer = new RenderBlocks(); public RenderNukePrimed() { this.shadowSize = 0.5F; } public void renderPrimedTNT(EntityNukePrimed par1EntityTNTPrimed, double par2, double par4, double par6, float par8, float par9) { GL11.glPushMatrix(); GL11.glTranslatef((float)par2, (float)par4, (float)par6); float f2; if ((float)par1EntityTNTPrimed.fuse - par9 + 1.0F < 10.0F) { f2 = 1.0F - ((float)par1EntityTNTPrimed.fuse - par9 + 1.0F) / 10.0F; if (f2 < 0.0F) { f2 = 0.0F; } if (f2 > 1.0F) { f2 = 1.0F; } f2 *= f2; f2 *= f2; float f3 = 1.0F + f2 * 0.3F; GL11.glScalef(f3, f3, f3); } f2 = (1.0F - ((float)par1EntityTNTPrimed.fuse - par9 + 1.0F) / 100.0F) * 0.8F; this.loadTexture("/mods/extraores/textures/blocks/block_NukeSide.png"); this.blockRenderer.renderBlockAsItem(ExtraOres.nuke, 0, par1EntityTNTPrimed.getBrightness(par9)); if (par1EntityTNTPrimed.fuse / 5 % 2 == 0) { GL11.glDisable(GL11.GL_TEXTURE_2D); GL11.glDisable(GL11.GL_LIGHTING); GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_DST_ALPHA); GL11.glColor4f(1.0F, 1.0F, 1.0F, f2); this.blockRenderer.renderBlockAsItem(ExtraOres.nuke, 0, 1.0F); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); GL11.glDisable(GL11.GL_BLEND); GL11.glEnable(GL11.GL_LIGHTING); GL11.glEnable(GL11.GL_TEXTURE_2D); } GL11.glPopMatrix(); } /** * Actually renders the given argument. This is a synthetic bridge method, always casting down its argument and then * handing it off to a worker function which does the actual work. In all probabilty, the class Render is generic * (Render<T extends Entity) and this method has signature public void doRender(T entity, double d, double d1, * double d2, float f, float f1). But JAD is pre 1.5 so doesn't do that. */ public void doRender(Entity par1Entity, double par2, double par4, double par6, float par8, float par9) { this.renderPrimedTNT((EntityNukePrimed)par1Entity, par2, par4, par6, par8, par9); } protected void loadTexture(String par1Str) { this.renderManager.renderEngine.bindTexture(par1Str); } } Any help is appreciated.
-
[Unsolved]Custom Block Rendering Problem.
SoBiohazardous replied to SoBiohazardous's topic in Modder Support
I'm not setting to render type 9 because it is casted to block rail. So i made my own, and called it as shown. Anyone else can help me? -
[Unsolved]Custom Block Rendering Problem.
SoBiohazardous replied to SoBiohazardous's topic in Modder Support
I don't have a model class. Here is plate logic: package crzyguitardude.extracraft.extraores.plate; import java.util.ArrayList; import java.util.List; import net.minecraft.src.*; import net.minecraft.world.ChunkPosition; import net.minecraft.world.World; class PlateLogic { private World worldObj; private int trackX; private int trackY; private int trackZ; private List connectedTracks; final TinPlate tinplate; public PlateLogic(TinPlate par1BlockRail, World par2World, int par3, int par4, int par5) { tinplate = par1BlockRail; connectedTracks = new ArrayList(); worldObj = par2World; trackX = par3; trackY = par4; trackZ = par5; int i = par2World.getBlockId(par3, par4, par5); int j = par2World.getBlockMetadata(par3, par4, par5); } private void setConnections(int par1) { connectedTracks.clear(); if (par1 == 0) { connectedTracks.add(new ChunkPosition(trackX, trackY, trackZ - 1)); connectedTracks.add(new ChunkPosition(trackX, trackY, trackZ + 1)); } else if (par1 == 1) { connectedTracks.add(new ChunkPosition(trackX - 1, trackY, trackZ)); connectedTracks.add(new ChunkPosition(trackX + 1, trackY, trackZ)); } else if (par1 == 2) { connectedTracks.add(new ChunkPosition(trackX - 1, trackY, trackZ)); connectedTracks.add(new ChunkPosition(trackX + 1, trackY + 1, trackZ)); } else if (par1 == 3) { connectedTracks.add(new ChunkPosition(trackX - 1, trackY + 1, trackZ)); connectedTracks.add(new ChunkPosition(trackX + 1, trackY, trackZ)); } else if (par1 == 4) { connectedTracks.add(new ChunkPosition(trackX, trackY + 1, trackZ - 1)); connectedTracks.add(new ChunkPosition(trackX, trackY, trackZ + 1)); } else if (par1 == 5) { connectedTracks.add(new ChunkPosition(trackX, trackY, trackZ - 1)); connectedTracks.add(new ChunkPosition(trackX, trackY + 1, trackZ + 1)); } else if (par1 == 6) { connectedTracks.add(new ChunkPosition(trackX + 1, trackY, trackZ)); connectedTracks.add(new ChunkPosition(trackX, trackY, trackZ + 1)); } else if (par1 == 7) { connectedTracks.add(new ChunkPosition(trackX - 1, trackY, trackZ)); connectedTracks.add(new ChunkPosition(trackX, trackY, trackZ + 1)); } else if (par1 == { connectedTracks.add(new ChunkPosition(trackX - 1, trackY, trackZ)); connectedTracks.add(new ChunkPosition(trackX, trackY, trackZ - 1)); } else if (par1 == 9) { connectedTracks.add(new ChunkPosition(trackX + 1, trackY, trackZ)); connectedTracks.add(new ChunkPosition(trackX, trackY, trackZ - 1)); } } /** * Neighboring tracks have potentially been broken, so prune the connected track list */ private void refreshConnectedTracks() { for (int i = 0; i < connectedTracks.size(); i++) { PlateLogic raillogic = getMinecartTrackLogic((ChunkPosition)connectedTracks.get(i)); if (raillogic == null || !raillogic.isConnectedTo(this)) { connectedTracks.remove(i--); } else { connectedTracks.set(i, new ChunkPosition(raillogic.trackX, raillogic.trackY, raillogic.trackZ)); } } } private boolean isMinecartTrack(int par1, int par2, int par3) { if (TinPlate.isRailBlockAt(worldObj, par1, par2, par3)) { return true; } if (TinPlate.isRailBlockAt(worldObj, par1, par2 + 1, par3)) { return true; } return TinPlate.isRailBlockAt(worldObj, par1, par2 - 1, par3); } private PlateLogic getMinecartTrackLogic(ChunkPosition par1ChunkPosition) { if (TinPlate.isRailBlockAt(worldObj, par1ChunkPosition.x, par1ChunkPosition.y, par1ChunkPosition.z)) { return new PlateLogic(tinplate, worldObj, par1ChunkPosition.x, par1ChunkPosition.y, par1ChunkPosition.z); } if (TinPlate.isRailBlockAt(worldObj, par1ChunkPosition.x, par1ChunkPosition.y + 1, par1ChunkPosition.z)) { return new PlateLogic(tinplate, worldObj, par1ChunkPosition.x, par1ChunkPosition.y + 1, par1ChunkPosition.z); } if (TinPlate.isRailBlockAt(worldObj, par1ChunkPosition.x, par1ChunkPosition.y - 1, par1ChunkPosition.z)) { return new PlateLogic(tinplate, worldObj, par1ChunkPosition.x, par1ChunkPosition.y - 1, par1ChunkPosition.z); } else { return null; } } private boolean isConnectedTo(PlateLogic par1RailLogic) { for (int i = 0; i < connectedTracks.size(); i++) { ChunkPosition chunkposition = (ChunkPosition)connectedTracks.get(i); if (chunkposition.x == par1RailLogic.trackX && chunkposition.z == par1RailLogic.trackZ) { return true; } } return false; } /** * Returns true if the specified block is in the same railway. */ private boolean isInTrack(int par1, int par2, int par3) { for (int i = 0; i < connectedTracks.size(); i++) { ChunkPosition chunkposition = (ChunkPosition)connectedTracks.get(i); if (chunkposition.x == par1 && chunkposition.z == par3) { return true; } } return false; } private int getAdjacentTracks() { int i = 0; if (isMinecartTrack(trackX, trackY, trackZ - 1)) { i++; } if (isMinecartTrack(trackX, trackY, trackZ + 1)) { i++; } if (isMinecartTrack(trackX - 1, trackY, trackZ)) { i++; } if (isMinecartTrack(trackX + 1, trackY, trackZ)) { i++; } return i; } /** * Determines whether or not the track can bend to meet the specified rail */ private boolean canConnectTo(PlateLogic par1RailLogic) { if (isConnectedTo(par1RailLogic)) { return true; } if (connectedTracks.size() == 2) { return false; } if (connectedTracks.size() == 0) { return true; } ChunkPosition chunkposition = (ChunkPosition)connectedTracks.get(0); return par1RailLogic.trackY != trackY || chunkposition.y != trackY ? true : true; } /** * The specified neighbor has just formed a new connection, so update accordingly */ private void connectToNeighbor(PlateLogic par1RailLogic) { connectedTracks.add(new ChunkPosition(par1RailLogic.trackX, par1RailLogic.trackY, par1RailLogic.trackZ)); boolean flag = isInTrack(trackX, trackY, trackZ - 1); boolean flag1 = isInTrack(trackX, trackY, trackZ + 1); boolean flag2 = isInTrack(trackX - 1, trackY, trackZ); boolean flag3 = isInTrack(trackX + 1, trackY, trackZ); byte byte0 = -1; if (flag || flag1) { byte0 = 0; } if (flag2 || flag3) { byte0 = 1; } if (byte0 == 0) { if (TinPlate.isRailBlockAt(worldObj, trackX, trackY + 1, trackZ - 1)) { byte0 = 4; } if (TinPlate.isRailBlockAt(worldObj, trackX, trackY + 1, trackZ + 1)) { byte0 = 5; } } if (byte0 == 1) { if (TinPlate.isRailBlockAt(worldObj, trackX + 1, trackY + 1, trackZ)) { byte0 = 2; } if (TinPlate.isRailBlockAt(worldObj, trackX - 1, trackY + 1, trackZ)) { byte0 = 3; } } if (byte0 < 0) { byte0 = 0; } int i = byte0; worldObj.setBlockMetadataWithNotify(trackX, trackY, trackZ, i); } /** * Determines whether or not the target rail can connect to this rail */ private boolean canConnectFrom(int par1, int par2, int par3) { PlateLogic raillogic = getMinecartTrackLogic(new ChunkPosition(par1, par2, par3)); if (raillogic == null) { return false; } else { raillogic.refreshConnectedTracks(); return raillogic.canConnectTo(this); } } /** * Completely recalculates the track shape based on neighboring tracks and power state */ public void refreshTrackShape(boolean par1, boolean par2) { boolean flag = canConnectFrom(trackX, trackY, trackZ - 1); boolean flag1 = canConnectFrom(trackX, trackY, trackZ + 1); boolean flag2 = canConnectFrom(trackX - 1, trackY, trackZ); boolean flag3 = canConnectFrom(trackX + 1, trackY, trackZ); byte byte0 = -1; if ((flag || flag1) && !flag2 && !flag3) { byte0 = 0; } if ((flag2 || flag3) && !flag && !flag1) { byte0 = 1; } if (byte0 == -1) { if (flag || flag1) { byte0 = 0; } if (flag2 || flag3) { byte0 = 1; } else { if (flag && flag2) { byte0 = 8; } if (flag3 && flag) { byte0 = 9; } if (flag2 && flag1) { byte0 = 7; } if (flag1 && flag3) { byte0 = 6; } } } if (byte0 == 0) { if (TinPlate.isRailBlockAt(worldObj, trackX, trackY + 1, trackZ - 1)) { byte0 = 4; } if (TinPlate.isRailBlockAt(worldObj, trackX, trackY + 1, trackZ + 1)) { byte0 = 5; } } if (byte0 == 1) { if (TinPlate.isRailBlockAt(worldObj, trackX + 1, trackY + 1, trackZ)) { byte0 = 2; } if (TinPlate.isRailBlockAt(worldObj, trackX - 1, trackY + 1, trackZ)) { byte0 = 3; } } if (byte0 < 0) { byte0 = 0; } setConnections(byte0); int i = byte0; if (par2 || worldObj.getBlockMetadata(trackX, trackY, trackZ) != i) { worldObj.setBlockMetadataWithNotify(trackX, trackY, trackZ, i); for (int j = 0; j < connectedTracks.size(); j++) { PlateLogic raillogic = getMinecartTrackLogic((ChunkPosition)connectedTracks.get(j)); if (raillogic == null) { continue; } raillogic.refreshConnectedTracks(); if (raillogic.canConnectTo(this)) { raillogic.connectToNeighbor(this); } } } } /** * get number of adjacent tracks */ static int getNAdjacentTracks(PlateLogic par0RailLogic) { return par0RailLogic.getAdjacentTracks(); } } -
[Unsolved]Custom Block Rendering Problem.
SoBiohazardous replied to SoBiohazardous's topic in Modder Support
Well, I am attempting to render it exactly like a minecart track. However, when i place it is flat, and when it's sloped it looks like a half block. -
Hello, So I have a problem rendering my custom block. The block is in game and works, however it is not rendered correctly. It is visible, unlike other's problems on the forum. TinPlate package crzyguitardude.extracraft.extraores.plate; import java.util.Random; import crzyguitardude.extracraft.extraores.ExtraOres; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.src.*; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; public class TinPlate extends Block { public TinPlate(int par1, int par2) { super(par1, Material.circuits); blockIndexInTexture = par2; setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F); } public String getTextureFile() { return "/crzyguitardude/EOTerrain.png"; } public static final boolean isRailBlockAt(World par0World, int par1, int par2, int par3) { int i = par0World.getBlockId(par1, par2, par3); return i == ExtraOres.TinPlate.blockID; } public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int i) { return null; } public boolean isOpaqueCube() { return false; } /** * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc) */ public boolean renderAsNormalBlock() { return false; } public MovingObjectPosition collisionRayTrace(World par1World, int par2, int par3, int par4, Vec3 par5Vec3, Vec3 par6Vec3) { this.setBlockBoundsBasedOnState(par1World, par2, par3, par4); return super.collisionRayTrace(par1World, par2, par3, par4, par5Vec3, par6Vec3); } public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) { int i = par1IBlockAccess.getBlockMetadata(par2, par3, par4); if (i >= 2 && i <= 5) { setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.625F, 1.0F); } else { setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F); } } public int getBlockTextureFromSideAndMetadata(int par1, int par2) { return blockIndexInTexture; } public int getRenderType() { return IPlateRenderingHandler.TinPlateRenderID; } public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4) { return par1World.isBlockNormalCube(par2, par3 - 1, par4); } public void onBlockAdded(World par1World, int par2, int par3, int par4) { if (!par1World.isRemote) { refreshTrackShape(par1World, par2, par3, par4, true); } } public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5) { if (par1World.isRemote) { return; } int i = par1World.getBlockMetadata(par2, par3, par4); int j = i; boolean flag = false; if (!par1World.isBlockNormalCube(par2, par3 - 1, par4)) { flag = true; } if (j == 2 && !par1World.isBlockNormalCube(par2 + 1, par3, par4)) { flag = true; } if (j == 3 && !par1World.isBlockNormalCube(par2 - 1, par3, par4)) { flag = true; } if (j == 4 && !par1World.isBlockNormalCube(par2, par3, par4 - 1)) { flag = true; } if (j == 5 && !par1World.isBlockNormalCube(par2, par3, par4 + 1)) { flag = true; } if (flag) { dropBlockAsItem(par1World, par2, par3, par4, par1World.getBlockMetadata(par2, par3, par4), 0); par1World.setBlockWithNotify(par2, par3, par4, 0); } } private void refreshTrackShape(World par1World, int par2, int par3, int par4, boolean par5) { if (par1World.isRemote) { return; } else { (new PlateLogic(this, par1World, par2, par3, par4)).refreshTrackShape(par1World.isBlockIndirectlyGettingPowered(par2, par3, par4), par5); return; } } } IPlateRenderingHandler package crzyguitardude.extracraft.extraores.plate; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; import net.minecraft.world.IBlockAccess; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import crzyguitardude.extracraft.extraores.ExtraOres; public class IPlateRenderingHandler implements ISimpleBlockRenderingHandler { public static int TinPlateRenderID; public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) { } public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { if (modelId == TinPlateRenderID) { return renderTinPlate((TinPlate)block, renderer, world, x, y, z, block, modelId); } return false; } public boolean shouldRender3DInInventory() { return false; } public int getRenderId() { return this.TinPlateRenderID; } public boolean renderTinPlate(TinPlate par1BlockRail, RenderBlocks renderblocks, IBlockAccess iblockaccess, int par2, int par3, int par4, Block block, int modelId) { Tessellator tessellator = Tessellator.instance; int i = renderblocks.blockAccess.getBlockMetadata(par2, par3, par4); int j = par1BlockRail.getBlockTextureFromSideAndMetadata(0, i); if (renderblocks.overrideBlockTexture >= 0) { j = renderblocks.overrideBlockTexture; } tessellator.setBrightness(par1BlockRail.getMixedBrightnessForBlock(renderblocks.blockAccess, par2, par3, par4)); tessellator.setColorOpaque_F(1.0F, 1.0F, 1.0F); int k = (j & 0xf) << 4; int l1 = j & 0xf0; double d = (float)k / 256F; double d1 = ((float)k + 15.99F) / 256F; double d2 = (float)l1 / 256F; double d3 = ((float)l1 + 15.99F) / 256F; double d4 = 0.0625D; double d5 = par2 + 1; double d6 = par2 + 1; double d7 = par2 + 0; double d8 = par2 + 0; double d9 = par4 + 0; double d10 = par4 + 1; double d11 = par4 + 1; double d12 = par4 + 0; double d13 = (double)par3 + d4; double d14 = (double)par3 + d4; double d15 = (double)par3 + d4; double d16 = (double)par3 + d4; if (i != 1 && i != 2 && i != 3 && i != 7) { if (i == { d5 = d6 = par2 + 0; d7 = d8 = par2 + 1; d9 = d12 = par4 + 1; d10 = d11 = par4 + 0; } else if (i == 9) { d5 = d8 = par2 + 0; d6 = d7 = par2 + 1; d9 = d10 = par4 + 0; d11 = d12 = par4 + 1; } } else { d5 = d8 = par2 + 1; d6 = d7 = par2 + 0; d9 = d10 = par4 + 1; d11 = d12 = par4 + 0; } if (i != 2 && i != 4) { if (i == 3 || i == 5) { d14++; d15++; } } else { d13++; d16++; } tessellator.addVertexWithUV(d5, d13, d9, d1, d2); tessellator.addVertexWithUV(d6, d14, d10, d1, d3); tessellator.addVertexWithUV(d7, d15, d11, d, d3); tessellator.addVertexWithUV(d8, d16, d12, d, d2); tessellator.addVertexWithUV(d8, d16, d12, d, d2); tessellator.addVertexWithUV(d7, d15, d11, d, d3); tessellator.addVertexWithUV(d6, d14, d10, d1, d3); tessellator.addVertexWithUV(d5, d13, d9, d1, d2); return true; } } ClientProxy package crzyguitardude.extracraft.extraores.proxy; import net.minecraft.src.ModLoader; import net.minecraftforge.client.MinecraftForgeClient; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.common.registry.GameRegistry; import crzyguitardude.extracraft.extraores.ExtraOres; import crzyguitardude.extracraft.extraores.plate.IPlateRenderingHandler; public class ClientProxy extends CommonProxy { /* * Anything you've put in CommonProxy, you can override here to implement it differently on Clients. * Obvious applications include Rendering and Sound effects * Hint: Client has access to Classes and Methods a Server doesn't know */ @Override public void registerRenderThings() { /* Register Renderers for Blocks, Entities ... etc * use RenderingRegistry.registerEntityRenderingHandler for entities * look at RenderingRegistry for more */ MinecraftForgeClient.preloadTexture("/crzyguitardude/EOTerrain.png"); MinecraftForgeClient.preloadTexture("/crzyguitardude/EOItems.png"); RenderingRegistry.instance().registerBlockHandler(new IPlateRenderingHandler()); ModLoader.registerBlock(ExtraOres.TinPlate); } } Any other code needed i will give.
-
Moved http://www.minecraftforge.net/forum/index.php/topic,5773.0.html
-
So i have a question, Its probably nooby so i'm sorry. But can the mods folder load zip files that contain files that override files in the minecraft.jar? I hope that makes sense, its hard to explain.
-
requiresSelfNotify not working?
SoBiohazardous replied to SoBiohazardous's topic in General Discussion
Were could I have screwed up? -
Ok, so i'm not sure this is a bug or not, but I had a great working mod, with a older version of forge. Then, I transferred over my source to Forge v 3.2.5.303, And now any block that uses the .requiresSelfNotify is not able to place (cakes, and crops). Is it me or it is a bug? My code looks like it works fine.
-
I already tried that as well, and still nothing
-
Ok, so I test my mod, and it works fine. I then recompile and reobf, and install forge and my reobf data in my minecraft.jar. I run and get this error: java.lang.NullPointerException at cpw.mods.fml.common.FMLModContainer.getName(FMLModContainer.java:106) at cpw.mods.fml.common.Loader.sortModList(Loader.java:236) at cpw.mods.fml.common.Loader.loadMods(Loader.java:416) at cpw.mods.fml.client.FMLClientHandler.beginMinecraftLoading(FMLClientHandler.java:192) at net.minecraft.client.Minecraft.a(Minecraft.java:402) at net.minecraft.client.Minecraft.run(Minecraft.java:734) at java.lang.Thread.run(Unknown Source) I then realized I had to make a mcmod.info file, and so I did. I called it mcmod.info, and put it in my minecraft.jar. Here is what it said: [ { "modid": "BakedGoods", "name": "BakedGoods", "description": "Adds Plenty of food, Some with special effects.", "version": "V3.0", "mcversion": "1.3.2", "url": "http://www.minecraftforum.net/topic/1240619-125smpbaked-goods-mod-beta/", "updateUrl": "", "authors": [ "Crzyguitardude" ], "credits": "crzyguitardude, Crazy_Leen, DylPickle373", "logoFile": "/bg_logo.png", "screenshots": [ ], "parent":"", "dependencies": [ "" ] } ] And now i dont get a crash, but it doesn't load my mod, it just loads forge. Here is the annotion in my mod file: @Mod ( modid = "BakedGoods", name="BakedGoods", version="V3.0") If you need any further information, I will say it. Thanks.
-
How do I generate blocks using new FML?
SoBiohazardous replied to SoBiohazardous's topic in General Discussion
Thanks! -
I know how to generate blocks using the old modloader, but with the new FML changes, the generateSurface method no longer applies. What do I do? Is there a new Method? Please help, Thanks.