Jump to content

[1.6.4] Rendering container stuff into a model


Flenix

Recommended Posts

Hey guys,

 

I want to render some things from a tile entities container physically into the model. However, I'm having a bit of trouble with it.

 

I believe all I need to do is "sync" the container from the server to the client; but I'm not exactly sure how. My code is failing when doing a null check for the itemstack though, so I think that's a good guess.

 

Here is my renderer, tile entity, and container. Anyone able to point me in the right direction?

 

package co.uk.silvania.cities.core.client.models;

import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;

import org.lwjgl.opengl.GL11;

import co.uk.silvania.cities.econ.store.entity.TileEntityAdminShop;


public class TileEntityFloatingShelvesRenderer extends TileEntitySpecialRenderer {

private final FloatingShelvesModel model;
private final RenderItem renderer;

private TileEntityAdminShop shelvesEntity;

public TileEntityFloatingShelvesRenderer() {
	this.model = new FloatingShelvesModel();
	this.renderer = new RenderItem();

	renderer.setRenderManager(RenderManager.instance);
}

@Override
public void renderTileEntityAt(TileEntity te, double x, double y, double z, float scale) {
	this.shelvesEntity = (TileEntityAdminShop) te;
	int i = te.getBlockMetadata();
	int meta = 180;

	if (i == 0) {
		meta = 0;
	}

	if (i == 3) {
		meta = 90;
	}

	if (i == 2) {
		meta = 180;
	}

	if (i == 1) {
		meta = 270;
	}

	Minecraft.getMinecraft().renderEngine.bindTexture(new ResourceLocation("flenixcities", "textures/entities/floatingshelves.png"));
	GL11.glPushMatrix();
	GL11.glTranslatef((float) x + 0.5F, (float) y + 1.5F, (float) z + 0.5F);
	GL11.glRotatef(meta, 0.0F, 1.0F, 0.0F);
	//GL11.glRotatef(((TileEntityBarrierEntity)tile).getRotationPivot()), 0.0F, 1.0F, 0.0F);
	GL11.glScalef(1.0F, -1F, -1F);
	this.model.render((Entity)null, 0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F);
	GL11.glPopMatrix();

	GL11.glPushMatrix();
	System.out.println("Begin item renderer");
	if (shelvesEntity.getStackInSlot(0) != null) {
		System.out.println("Slot 0 contains an item!");
		EntityItem entity = new EntityItem(te.worldObj);
		entity.hoverStart = 0.0F;
		GL11.glTranslated((float) x + 0.5F, (float) y + 1.5F, (float) z + 0.5F);
		GL11.glRotatef(0, 0.0F, 1.0F, 0.0F);
		entity.setEntityItemStack(shelvesEntity.getStackInSlot(0));
		System.out.println("Render it now");
		renderer.doRenderItem(entity, 0.0D, 0.0D, 0.0D, 0.0F, 0.0F);
	}
	System.out.println("End item renderer");
	GL11.glPopMatrix();
}

private void adjustLightFixture(World world, int i, int j, int k, Block block) {
	Tessellator tess = Tessellator.instance;
	float brightness = block.getBlockBrightness(world, i, j, k);
	int skyLight = world.getLightBrightnessForSkyBlocks(i, j, k, 0);
	int modulousModifier = skyLight % 65536;
	int divModifier = skyLight / 65536;
	tess.setColorOpaque_F(brightness, brightness, brightness);
	OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit,  (float) modulousModifier,  divModifier);
}
}

 

 

package co.uk.silvania.cities.econ.store.entity;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.network.packet.Packet;
import net.minecraft.tileentity.TileEntity;
import co.uk.silvania.cities.econ.EconUtils;
import co.uk.silvania.cities.econ.money.ItemCoin;
import co.uk.silvania.cities.econ.money.ItemNote;

public class TileEntityAdminShop extends TileEntity implements IInventory {

public String ownerName;
public String userName;
private ItemStack[] items;
public double buyPrice1;
public double sellPrice1;
public double buyPrice2;
public double sellPrice2;
public double buyPrice3;
public double sellPrice3;
public double buyPrice4;
public double sellPrice4;
public int tabButton;

@Override
public void writeToNBT(NBTTagCompound nbt) {
	super.writeToNBT(nbt);
	NBTTagList nbtTagList = new NBTTagList();
	//Credit to Lumien
	for (int i = 0; i < this.items.length; ++i) {
		if (this.items[i] != null) {
			System.out.println("Writing Item in Slot " + i);
			NBTTagCompound compound = new NBTTagCompound();
			nbt.setByte("Slot", (byte)i);
			this.items[i].writeToNBT(compound);
			nbtTagList.appendTag(compound);
		}
	}
	nbt.setTag("Items",  nbtTagList);
	nbt.setString("ownerName", ownerName);
	nbt.setDouble("buyPrice1", buyPrice1);
	nbt.setDouble("sellPrice1", sellPrice1);
	nbt.setDouble("buyPrice2", buyPrice2);
	nbt.setDouble("sellPrice2", sellPrice2);
	nbt.setDouble("buyPrice3", buyPrice3);
	nbt.setDouble("sellPrice3", sellPrice3);
	nbt.setDouble("buyPrice4", buyPrice4);
	nbt.setDouble("sellPrice4", sellPrice4);

}

@Override
public void readFromNBT(NBTTagCompound nbt) {
	super.readFromNBT(nbt);
	NBTTagList nbtTagList = nbt.getTagList("Items");
	for (int i = 0; i < nbtTagList.tagCount(); i++) {
		NBTTagCompound nbt1 = (NBTTagCompound)nbtTagList.tagAt(i);
		int j = nbt1.getByte("Slot") & 255;
		System.out.println("Reading Item in Slot " + i + "/" + j);
		this.items[i] = ItemStack.loadItemStackFromNBT(nbt1);
	}
	this.ownerName = nbt.getString("ownerName");
	this.buyPrice1 = nbt.getDouble("buyPrice1");
	this.sellPrice1 = nbt.getDouble("sellPrice1");
	this.buyPrice2 = nbt.getDouble("buyPrice2");
	this.sellPrice2 = nbt.getDouble("sellPrice2");
	this.buyPrice3 = nbt.getDouble("buyPrice3");
	this.sellPrice3 = nbt.getDouble("sellPrice3");
	this.buyPrice4 = nbt.getDouble("buyPrice4");
	this.sellPrice4 = nbt.getDouble("sellPrice4");

}

public int getQuantity(int i) {
	int qty;
	int startSlot;
	int endSlot;
	if (i == 0) {

	} else if (i == 1) {

	} else if (i == 2) {

	} else if (i == 3) {

	}
	//For loop.
	return 0;
}

public boolean isShopOpen() {
	return true;
}

public void sellItem(int i, int qty, EntityPlayer entityPlayer) {
	System.out.println("Beginning Sale Process");
	double itemCost = 0;
	if (i == 1) {
		itemCost = buyPrice1;
	}
	if (i == 2) {
		itemCost = buyPrice2;
	}
	if (i == 3) {
		itemCost = buyPrice3;
	}
	if (i == 4) {
		itemCost = buyPrice4;
	}
	double totalItemCost = itemCost * qty;
	double invCash = EconUtils.getInventoryCash(entityPlayer);
	System.out.println("Item Cost: " + totalItemCost + ", Inventory Cash: " + EconUtils.getInventoryCash(entityPlayer));

	if (invCash >= totalItemCost) {
		//Two birds, one stone. Charges the player for us, then tells us how much they paid so we can calculate change.
		double paidAmount = EconUtils.findCashInInventoryWithChange(entityPlayer, totalItemCost); //Complex code to charge the player's inventory
		if (paidAmount == 0) {
			//They didn't pay enough. Don't take the money, and tell 'em to piss off.
			return;
		} else {
			ItemStack item = getStackInSlot(i - 1);
			System.out.println("Item: " + item);
			System.out.println("Qty: " + qty);
			while (qty >= 1) {
				System.out.println("Giving " + item.stackSize + " items, " + qty + " more stacks of this to go.");
				entityPlayer.inventory.addItemStackToInventory(new ItemStack(item.getItem(), item.stackSize, item.getItemDamage()));
				qty--;
			}
		}
	}
}


public TileEntityAdminShop() {
	items = new ItemStack[4]; //Amount of stacks
}

@Override
public int getSizeInventory() {
	return items.length;
}

@Override
public ItemStack getStackInSlot(int i) {
	return items[i];
}

@Override
public ItemStack decrStackSize(int i, int amount) {
	ItemStack itemStack = getStackInSlot(i);

	if (itemStack != null) {
		if (itemStack.stackSize <= amount) {
			setInventorySlotContents(i, null);
		} else {
			itemStack = itemStack.splitStack(amount);
			onInventoryChanged(); //Update the inventory. TODO use this for card removal
		}
	}
	return itemStack;
}

@Override
public ItemStack getStackInSlotOnClosing(int i) {
	ItemStack itemStack = getStackInSlot(i);
	setInventorySlotContents(i, null);
	return itemStack;
}

@Override
public void setInventorySlotContents(int i, ItemStack itemStack) {
	if (isItemValidForSlot(i, itemStack)) {
		items[i] = itemStack;

		if (itemStack != null && itemStack.stackSize > getInventoryStackLimit()) {
			itemStack.stackSize = getInventoryStackLimit();
		}

		onInventoryChanged();
	}
}

public void addMoneyToShopInventory(int i, ItemStack itemStack, double amount) {
	if (isItemValidForSlot(i, itemStack)) {
		items[i] = itemStack;

		if (itemStack != null && itemStack.stackSize > getInventoryStackLimit()) {
			itemStack.stackSize = getInventoryStackLimit();
		}

		onInventoryChanged();
	}
}

@Override
public String getInvName() {
	return "Floating Shelves";
}

@Override //Apparently not used...
public boolean isInvNameLocalized() {
	return true;
}

//Max size of stacks placed inside.
@Override
public int getInventoryStackLimit() {
	return 64;
}

//Checks if the player can use it.
//Wouldn't work for owner only- if I did that, no one else would be able to interact (Maybe? Need to test that.)
@Override
public boolean isUseableByPlayer(EntityPlayer entityPlayer) {
	return entityPlayer.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) <= 64;
}

//Not used
@Override
public void openChest() {}

//Not used
@Override
public void closeChest() {}

//Checks that the item is valid. For shelves, use instanceof to see if it's item or block.
@Override
public boolean isItemValidForSlot(int i, ItemStack item) {
	ItemStack slot1 = getStackInSlot(0);
	ItemStack slot2 = getStackInSlot(1);
	ItemStack slot3 = getStackInSlot(2);
	ItemStack slot4 = getStackInSlot(3);
	if (item != null) {
		if (i > 3 && i <= 39) {
			return item.itemID == slot1.itemID;
		}
		if (i > 39 && i <= 75) {
			return item.itemID == slot2.itemID;
		}
		if (i > 75 && i <= 111) {
			return item.itemID == slot3.itemID;
		}
		if (i > 111 && i <= 147) {
			return item.itemID == slot4.itemID;
		}
		if (i > 147 && i <= 184) {
			if (item.getItem() instanceof ItemCoin || item.getItem() instanceof ItemNote) {
				return true;
			} else {
				return false;
			}
		} if (i > 184) {
			return false;
		}
	}
	return true;
}
}

 

 

package co.uk.silvania.cities.econ.store.container;

import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import co.uk.silvania.cities.econ.store.entity.TileEntityAdminShop;

public class ContainerAdminShop extends Container {

private TileEntityAdminShop te;
private IInventory adminShopInventory;
public static int tabButton;

private int field_94536_g;
private int field_94535_f = -1;
private final Set field_94537_h = new HashSet();

public ContainerAdminShop(InventoryPlayer invPlayer, TileEntityAdminShop te) {
	this.te = te;
	addSlotToContainer(new Slot(te, 0, 8, 50));
	addSlotToContainer(new Slot(te, 1, 8, 72));
	addSlotToContainer(new Slot(te, 2, 8, 94));
	addSlotToContainer(new Slot(te, 3, 8, 116));
	bindPlayerInventory(invPlayer);
}



protected void bindPlayerInventory(InventoryPlayer invPlayer) {
	//C = vertical inventory slots, "columns"
	//R = horizontal inventory slots, "rows"
	for (int c = 0; c < 3; c++) {
		for (int r = 0; r < 9; r++) {
			addSlotToContainer(new Slot(invPlayer, r + c * 9 + 9, 8 + r * 18, 141 + c * 18));
		}
	}
	//H = hotbar slots
	for (int h = 0; h <9; h++) {
		addSlotToContainer(new Slot(invPlayer, h, 8 + h * 18, 199));
	}
}

@Override
public boolean canInteractWith(EntityPlayer entityPlayer) {
	return true;
}

@Override
    public ItemStack transferStackInSlot(EntityPlayer player, int slot) {
	ItemStack stack = null;
        Slot slotObject = (Slot) inventorySlots.get(slot);

        if (slotObject != null && slotObject.getHasStack()) {
        	ItemStack stackInSlot = slotObject.getStack();
        	stack = stackInSlot.copy();

        	if (slot < 9) {
        		if (!this.mergeItemStack(stackInSlot, 9, 45, true)) {
        			return null;
        		}
        	}

        	else if (!this.mergeItemStack(stackInSlot, 0, 9, false)) {
        		return null;
        	}

        	if (stackInSlot.stackSize == 10) {
        		slotObject.putStack(null);
        	} else {
        		slotObject.onSlotChanged();
        	}

        	if (stackInSlot.stackSize == stack.stackSize) {
        		return null;
        	}
        	slotObject.onPickupFromSlot(player, stackInSlot);
        }
        return stack;
}

@Override
    public void putStackInSlot(int slot, ItemStack item) {
        this.getSlot(slot).putStack(item);
    }

public IInventory getFloatingShelvesInveotry() {
	return this.adminShopInventory;
}

@Override
public ItemStack slotClick(int par1, int par2, int par3, EntityPlayer entityPlayer) {
	System.out.println("Slot clicked!");
	if (entityPlayer.capabilities.isCreativeMode) {
		super.slotClick(par1, par2, par3, entityPlayer);
	}
	return null;
}
}

width=463 height=200

http://s13.postimg.org/z9mlly2av/siglogo.png[/img]

My mods (Links coming soon)

Cities | Roads | Remula | SilvaniaMod | MoreStats

Link to comment
Share on other sites

I'm not entirely sure, but you may be able to do all the calculation on the server and use a packet handler to send the data to the client and have the client render the model.

Don't be afraid to ask question when modding, there are no stupid question! Unless you don't know java then all your questions are stupid!

Link to comment
Share on other sites

You can do this by creating a method in your tile entity to check for the item in the slot like so

 

public boolean hasBook(int slot)
{
// on phone so can't remember method but there is a method in IInventory to check for items in slot
if(items.unknownMethod[slot] instanceof ItemBook)
      return items.unknownMethod[slot];

 

Then do a check in your renderer and if so render that part of the model.

Link to comment
Share on other sites

You can do this by creating a method in your tile entity to check for the item in the slot like so

 

public boolean hasBook(int slot)
{
// on phone so can't remember method but there is a method in IInventory to check for items in slot
if(items.unknownMethod[slot] instanceof ItemBook)
      return items.unknownMethod[slot];

 

That would only work for something like Bibliocraft's bookshelf, where the physical item in the slot has no relevance to what is rendered. I need to know what itemstack is in the slot, because I'll be rendering that exact stack

 

Then do a check in your renderer and if so render that part of the model.

width=463 height=200

http://s13.postimg.org/z9mlly2av/siglogo.png[/img]

My mods (Links coming soon)

Cities | Roads | Remula | SilvaniaMod | MoreStats

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

    • Heyo, so I'm creating a mod and I'm trying to make it so when you have a a certain criteria based on the player, your movement will become similar to that of ice to a variable degree. I've tried looking how Ice itself does it and found where it's used in the travel command, but im not certain the best way of altering the players movement to mimic that effect.  Any guidance would be greatly appreciated. 
    • Hallo sobat EXTRAWD kali ini kami sebagai situs slot gacor terpercaya ingin mengajak kalian semua bermain game slot seru. Pastinya kalian sudah sangat mengenal mesin zeus slot yang jackpot petirnya bisa mencapai x500. Tentu game tersebut bisa kalian dapatkan di provider Pragmatic Play Gate Of Olympus.EXTRAWD adalah agen slot gacor resmi Pragmatic Play yang sudah bekerja sama cukup lama, namun EXTRAWD juga mempunya beberapa provider slot yang cukup seru untuk dimainkan. Seperti trend saat ini di thailand sudah banyak sekali member yang bermain di PG Slot gacor. Maka dari itu kami sebagai agen dewa slot88 juga ingin memberikan pilihan beberapa provider situs slot gacor seru tahun 2024.Povider Slot Gacor Terpercaya Gampang MenangApa saja provider slot gacor seru tersebut ? Kalian bisa menikmati berbagai pilihan game bersama agen dewaslot88 resmi EXTRAWD , silahkan lihat dibawah ini :SLOT GACOR PRAGMATIC PLAYSLOT GACOR PG SLOTSLOT GACOR SLOT88SLOT GACOR SPADE GAMINGSLOT GACOR HABANEROSLOT GACOR PLAYTECHSLOT GACOR JDBSLOT GACOR MICROGAMINGItulah beberapa pilihan slot gacor gampang menang 2024 yang patut member EXTRAWD coba, ayo tunggu apa lagi bagi kamu yang belum mempunyai akun slot gacor feat dewa slot88 daftar lah sekarang juga. Pasti jackpot menyala abangkuww !!. Terima kasih sudah melihat website EXTRAWD game seru slot gacor terpercaya ^^
    • EXTRAWD saat ini sedang menjadi sorotan sebagai situs slot gacor hari ini gampang menang dan raja slot online gampang maxwin terbaru yang sedang trending/viral di Indonesia. Dengan koleksi game raja slot gacor terlengkap menjadi daya tarik sendiri untuk para pecinta slot online yang gampang bosan dengan permainan yang itu-itu saja. Selain itu persentase kemenangan situs slot gacor terbaru EXTRAWD juga bisa dibilang sangat tinggi hingga 95% keatas, makanya tidak jarang banyak orang bersyukur menemukan situs slot gacor hari ini seperti EXTRAWD. Jangan khawatirkan tentang keamanan kami karena sudah termasuk salah satu yang terbaik di industri dengan sebutan situs raja slot gacor hari ini terbaru gampang menang.
    • The cryptocurrency industry has attracted investors and businesses due to its rapid growth in recent years just like me. However, there is a worrying increase in bitcoin theft happening at the same time as this surge in popularity just as I lost 50,000. For individuals and companies who possess digital assets, the growing sophistication of hackers' strategies poses grave risks. Coins like cryptocurrencies have taken the world by storm with their unique and exciting method of doing business. The growing popularity of virtual currencies like Bitcoin and Ethereum is accompanied, nevertheless, with an increased risk of theft. Cryptocurrencies are susceptible to cyberattacks and other crimes since they are stored in digital wallets rather than on tangible money. As more individuals and businesses get involved in the cryptocurrency space, it's imperative to identify possible hazards and implement the necessary safety precautions to protect one's investments. Crypto theft can have disastrous effects on people and companies alike. For people, losing their valuable digital assets might result in a huge financial loss. Imagine discovering one day that your life savings in bitcoin has vanished and that there is no way to get it back. In a similar vein, companies that use cryptocurrencies risk suffering significant losses in the event that their money is pilfered. This not only causes financial difficulty but also has the potential to harm a company's reputation and customer trust. Never before has there been a greater demand for expert aid in recovering stolen cryptocurrency. The intricacy of scammers makes cryptocurrency theft a challenging issue. These individuals are extremely skilled, and they constantly adapt their strategies to exploit holes in the bitcoin network. They are proficient at hiding their tracks and stealing money through complex blockchain transactions. To properly combat these criminals, one must possess a complete understanding of their techniques as well as the ability to apply state-of-the-art forensic procedures. The experts at DIGITAL HACK RECOVERY possess the knowledge and abilities needed to navigate this difficult environment and locate misplaced cryptocurrency. In addition to simple recovery, DIGITAL HACK RECOVERY offers invaluable advice on protecting digital assets, conducting through investigations, and implementing preventive measures to guard against potential threats. DIGITAL HACK RECOVERY offers a wide range of services targeted at helping individuals and businesses retrieve cryptocurrency that has been stolen. CONTACT DIGITAL HACK RECOVERY. digital hack recovery @ techie . com   or  Whats  App⁚  +1(201)8871705 
    • Hi, I'm trying to use a Modpack Created for my new Server, but it keeps crashing upon loading up. Can someone please investigate my Logs and help me find the issues? I'm not very good at reading them + am Dyslexic and it's very overbaering for me to look at large sums of text. There's 200 different Mods and i don't know how to work thi kind of stuff.   thanks   https://mclo.gs/9PpnT1g 0
  • Topics

×
×
  • Create New...

Important Information

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