Jump to content

[1.8] More than 1 texture for item [Solved]


xwerswoodx

Recommended Posts

I have two questions;

 

First:

When I create an item named blockchecker, it's texture works well, but when I give model like blockchecker_activated, it isn't work. When I create a new item named blockchecker_activated, it's texture works well and when I give a blockchecker_activated render to blockchecker item it works as well. So I understand this, when I create an item same name with json file, minecraft render item, but when I don't give, it isn't render. So how can I fix this without create casting item, like fishing rod, I found something in ModelBakery.java but it is very long way to do this, is there any way to do this?

 

Secondly:

I have onPlayerTick event. It works fine, but when a player tick I want to upload my blockchecker item I did it, but here it updates all of the blockcheckers in server, doesn't it? So how can I do this for an item which is in player's inventory.

 

	@SubscribeEvent
 public void onPlayerTick(TickEvent.PlayerTickEvent event) {
	EntityPlayer player = event.player;
	InventoryPlayer inventory = player.inventory;

	 if (inventory.hasItem(itemref.blockChecker)) {
		 ((addmeter)itemref.blockChecker).initProps();
	 }
}

 

I did something like this but I am not sure it is work or not;

 

	 for (int x = 0; x < inventory.getSizeInventory(); x++) {
		 if (inventory.getStackInSlot(x).getItem().equals(itemref.blockChecker)) {
			 ((addmeter)inventory.getStackInSlot(x).getItem()).initProps();
		 }
	 }

Link to comment
Share on other sites

Ok I try to explain;

 

When I try to register blockChecker icon, I use that way;

		String name = ref.uid + ":" + (item.getUnlocalizedName().substring(5));
	ModelResourceLocation location = new ModelResourceLocation(name, "inventory");
	Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(item, 0, location);

 

blockChecker unlocalized name is blockchecker_0 and when I create blockchecker_0.json, texture works in game, but when I try it to blockchecker_1.json, (I also have blockchecker_1.json) texture doesn't work in game.

 

	public void setRender(Item item, int level) {
	if (level < 0) { level = 0; }
	String name = ref.uid + ":" + item.getUnlocalizedName().substring(5).split("_")[0] + "_" + level;
	ModelResourceLocation location = new ModelResourceLocation(name, "inventory");
	String loc = name;
	Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(item, 0, location);
}

 

This is my setRender void in Item Class, and onPlayerTick event I used that way to setting render;

 

	 public void onPlayerTick(TickEvent.PlayerTickEvent event) {
	EntityPlayer player = event.player;
	InventoryPlayer inventory = player.inventory;

	if (inventory.hasItem(itemref.blockChecker)) {
		 ((addmeter)itemref.blockChecker).initProps();
    }
        }

 

initProps calculate distance between player and block, and settingRender with distance, for example, if he far away blockchecker_0, if he far 8 squire blockchecker_1 if he is in 1 radius return blockchecker_4.

 

@SideOnly(Side.CLIENT)
public void update(Minecraft mc) {

	if (new Date().getTime() <= lastUpdate.longValue() + millisPerUpdate.longValue()) {
		return ;
	}
	lastUpdate = Long.valueOf(new Date().getTime());

	found.clear();
	distanceShortest = -1;

	EntityPlayer player = mc.thePlayer;
	World world = mc.theWorld;

	if ((player == null) || (world == null)) {
		return;
	}

	double cur_x = player.posX;
	double cur_y = player.posY;
	double cur_z = player.posZ;

	int min_x = (int)cur_x - distanceMax - 1;
	int min_y = (int)cur_y - distanceMax;
	int min_z = (int)cur_z - distanceMax;

	int max_x = (int)cur_x + distanceMax;
	int max_y = (int)cur_y + distanceMax;
	int max_z = (int)cur_z + distanceMax + 1;

	for (int z1 = min_z; z1 < max_z; z1++) {
		for (int x1 = min_x; x1 < max_x; x1++) {
			for (int y1 = min_y; y1 < max_y; y1++) {
				BlockPos pos1 = new BlockPos(x1, y1, z1);
				if (world.getBlockState(pos1).getBlock() == this.search) {
					found.add(new int[] { x1, y1, z1 });
				}
			}
		}
	}

	for (int i = 0; i < found.size(); i++) {
		int[] block = (int[])found.get(i);

		double distanceX = block[0] - cur_x;
		double distanceY = block[1] - cur_y + 1.0D;
		double distanceZ = block[2] - cur_z;

		distanceX += (distanceX > 0.0D ? 1.0D : 0.0D);
		distanceZ += (distanceZ > 0.0D ? 1.0D : 0.0D);

		double distance2D = Math.sqrt(Math.pow(distanceX, 2.0D) + Math.pow(distanceZ, 2.0D));
		double distance3D = Math.sqrt(Math.pow(distance2D, 2.0D) + Math.pow(distanceY, 2.0D));

		if ((int)distance3D > distanceMax) {
			found.remove(i);
			i--;
		} else if ((distanceShortest > distance3D) || (distanceShortest == -1)) {
			distanceShortest = (int)distance3D;
			vectorShortest = new int[] { block[0], block[1], block[2] };
		}
	}

    distancePerLevel = distanceMax / 4;
    if (distancePerLevel < 1) {
      distancePerLevel = 1;
    }
    
	if (distanceShortest > -1) {
		int level = (distanceMax - distanceShortest + 1) / distancePerLevel;
		if (distanceMax < 4) {
			level +=4 - distanceMax;
		}
		this.setRender(this, level);;
	} else {
		this.setRender(this, 0);
	}
}

 

But I have an item named blockchecker_0 and texture work when I far away, but when I get closer, and model resource change to blockchecker_1 it doesn't work, on the other hand, when I add for items without creativetabs, as an unlocalizedname blockchecker_1, blockchecker_2, blockchecker_3 and blockchecker_4, all the textures works well. But I have to create a new item for every texture. Or maybe I am doing something wrong somewhere.

 

Also I have a trouble with ticking a specific item. When player get closer to block, this code update all of the blockChecker items in server, I just want to update items which is in player inventory.

 

 

Link to comment
Share on other sites

String name = ref.uid + ":" + (item.getUnlocalizedName().substring(5));
ModelResourceLocation location = new ModelResourceLocation(name, "inventory");

 

You...don't understand how ModelResourceLocation works, do you?

 

The first parameter is the MODID, the second parameter is the filename.  You're adding the item's unlocalized name to the wrong part.  Also,

setTextureName()

and

getTextureName()

are things.  No need to substring the unlocalized name.  I blame Pahmir.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

String name = ref.uid + ":" + (item.getUnlocalizedName().substring(5));

 

Ah this line is means ref.uid is my modid and (item.getUnlocalizedName().substring(5)) is json file name, for 1.8.0 setTextureName isn't exists anymore, before I can do it with IIcon but now I can't register more than 1 textures for item.

 

For 1.7.10 I can use like this;

private IIcon[] iconIndexes = new IIcon[5];

@SideOnly(Side.CLIENT)
@Override
public void registerIcons(IIconRegister reg) {
	for (int x=0; x < 5; x++) {
		iconIndexes[x] = reg.registerIcon(ref.uid + ":" + (this.getUnlocalizedName().substring(5)) + "_" + x);
	}
	this.itemIcon = iconIndexes[0];
}

 

And use like this;

@SideOnly(Side.CLIENT)
public void update(Minecraft mc) {

	if (new Date().getTime() <= lastUpdate.longValue() + millisPerUpdate.longValue()) {
		return ;
	}
	lastUpdate = Long.valueOf(new Date().getTime());

	found.clear();
	distanceShortest = -1;

	EntityPlayer player = mc.thePlayer;
	World world = mc.theWorld;

	if ((player == null) || (world == null)) {
		return;
	}

	double cur_x = player.posX;
	double cur_y = player.posY;
	double cur_z = player.posZ;

	int min_x = (int)cur_x - distanceMax - 1;
	int min_y = (int)cur_y - distanceMax;
	int min_z = (int)cur_z - distanceMax;

	int max_x = (int)cur_x + distanceMax;
	int max_y = (int)cur_y + distanceMax;
	int max_z = (int)cur_z + distanceMax + 1;

	for (int z1 = min_z; z1 < max_z; z1++) {
		for (int x1 = min_x; x1 < max_x; x1++) {
			for (int y1 = min_y; y1 < max_y; y1++) {
				if (world.getBlock(x1, y1, z1) == this.search) {
					found.add(new int[] { x1, y1, z1 });
				}
			}
		}
	}

	for (int i = 0; i < found.size(); i++) {
		int[] block = (int[])found.get(i);

		double distanceX = block[0] - cur_x;
		double distanceY = block[1] - cur_y + 1.0D;
		double distanceZ = block[2] - cur_z;

		distanceX += (distanceX > 0.0D ? 1.0D : 0.0D);
		distanceZ += (distanceZ > 0.0D ? 1.0D : 0.0D);

		double distance2D = Math.sqrt(Math.pow(distanceX, 2.0D) + Math.pow(distanceZ, 2.0D));
		double distance3D = Math.sqrt(Math.pow(distance2D, 2.0D) + Math.pow(distanceY, 2.0D));

		if ((int)distance3D > distanceMax) {
			found.remove(i);
			i--;
		} else if ((distanceShortest > distance3D) || (distanceShortest == -1)) {
			distanceShortest = (int)distance3D;
			vectorShortest = new int[] { block[0], block[1], block[2] };
		}
	}

    distancePerLevel = distanceMax / 4;
    if (distancePerLevel < 1) {
      distancePerLevel = 1;
    }
    
	if (distanceShortest > -1) {
		int level = (distanceMax - distanceShortest + 1) / distancePerLevel;
		if (distanceMax < 4) {
			level +=4 - distanceMax;
		}
		this.itemIcon = iconIndexes[level];
	} else {
		this.itemIcon = iconIndexes[0];
	}
}

 

So I can't do with modelresourcelocation, because I cant register models without create new item.

Link to comment
Share on other sites

Then don't use item.getUnlocalizedName().substring(5). There is no reason for using that.

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Link to comment
Share on other sites

Ok I did what did you say

 

Change my code to:

		ModelResourceLocation location = new ModelResourceLocation(ref.uid, "inventory");
	Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(itemref.ironX, 0, location);

 

texture isn't work.

 

I changed it

 

		ModelResourceLocation location = new ModelResourceLocation(ref.uid + ":ironx", "inventory");
	Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(itemref.ironX, 0, location);

 

Texture works.

 

I changed it to;

		ModelResourceLocation location = new ModelResourceLocation(ref.uid + ":irony", "inventory");
	Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(itemref.ironX, 0, location);

 

Texture doesn't work. (I have ironx.json and irony.json files and both is tested and work)

 

Where did I do mistake? I can't caught it, I remove unlocalizedname.substring(5) and it isn't work. When I type my json file name for "inventory" section, it isn't work. Maybe I don't understand what do you mean, if you can explain it to me with a code I can understand clearly.

Link to comment
Share on other sites

Ah, @Draco18s already said what you have to do. Use Item#setTextureName(String) and Item#getTextureName() instead of item.getUnlocalizedName().substring(5).

And, you should use something like ISmartModel for changing model.

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Link to comment
Share on other sites

@Abastro as of 1.8 Item#getTextureName() and Item#setTextureName() don't exist in the item class or anywhere, the only reference to them is in the forge_at.cfg therefore what you are saying doesn't work the only way to set the texture of items in 1.8 that I know of is using the ItemModelMesher and to ask a question to @xwerswoodx have you registered the variant names cause otherwise the items aren't distinguished and the item doesn't know it is looking for multiple textures. To do this Register to the Model Bakery with

ModelBakery.addVariantName(youritem,name)

this needs to be done for every sub-Item that you have. than what you have will work

Did you really need to know?

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • javatogel situs judi slot bank bsi terjamin aman Javatogel: Situs judi slot dengan layanan pembayaran melalui Bank BSI yang terjamin aman. Temukan pengalaman berjudi slot yang terpercaya dan aman dengan Javatogel. Daftar sekarang untuk mengakses beragam permainan slot yang menarik dan nikmati kemudahan pembayaran melalui Bank BSI. Bergabunglah dengan Javatogel untuk merasakan sensasi taruhan yang tak terlupakan dengan jaminan keamanan yang tinggi ❱❱❱❱❱ DAFTAR DI SINI ❰❰❰❰❰ ❱❱❱❱❱ DAFTAR DI SINI ❰❰❰❰❰
    • LADANGTOTO: Agen BO Terpercaya, Anti Sedot WC, 100% Real, Gampang Menang Dalam dunia perjudian online, menemukan agen yang dapat dipercaya adalah langkah penting untuk pen galaman berjudi yang aman dan menguntungkan. Salah satu agen yang mendapat kepercayaan tinggi dari para pemain adalah Javatogel. Mari kita telusuri lebih dalam mengenai apa yang membuat Javatogel menjadi pilihan utama bagi para pecinta togel. LADANGTOTO: Agen BO Terpercaya                                    
    • Keunggulan SLOT-QRIS📞 SLOT-QRIS📞 memiliki sejumlah keunggulan yang membuatnya menjadi pilihan menarik bagi para pemain judi online: 1. Alternatif Situs BALON168 Sebagai alternatif dari BALON168, SLOT-QRIS📞 menawarkan pengalaman bermain yang serupa namun dengan sentuhan yang berbeda. Dengan koleksi permainan yang beragam dan peluang kemenangan yang menarik, pemain dapat menikmati sensasi berjudi yang tak terlupakan. 2. Peluang Kemenangan Terbesar Malam Ini SLOT-QRIS📞 menawarkan peluang kemenangan terbesar, khususnya malam ini. Dengan RTP yang tinggi dan jackpot yang menggiurkan, pemain memiliki kesempatan besar untuk meraih kemenangan yang besar dalam setiap putaran permainan.
    • 188BET adalah pilihan terbaik bagi Anda yang mencari pengalaman bermain slot gacor dengan transaksi mudah menggunakan Bank Mayora. Berikut adalah beberapa alasan mengapa Anda harus memilih 188BET: Slot Gacor Terbaik Kami menyajikan koleksi slot gacor terbaik yang menawarkan kesenangan bermain dan peluang kemenangan besar. Dengan fitur-fitur unggulan dan tema-tema menarik, setiap putaran permainan akan memberikan Anda pengalaman yang tak terlupakan. Transaksi Mudah dengan Bank Mayora Kami menyediakan layanan transaksi mudah melalui Bank Mayora untuk kenyamanan dan keamanan Anda. Dengan proses yang cepat dan efisien, Anda dapat melakukan deposit dan penarikan dana dengan lancar dan tanpa hambatan. Pengalaman Bermain AKUN PRO USA 188BET menawarkan pengalaman bermain AKUN PRO USA yang eksklusif dan menarik. Dengan berbagai fitur dan promosi yang ditawarkan, setiap pemain dapat merasakan sensasi bermain yang luar biasa.
    • AGENSLOT77 dikenal sebagai salah satu situs judi slot gacor terpercaya. Istilah "gacor" merujuk pada mesin slot yang sering memberikan kemenangan kepada pemainnya. Dengan koleksi permainan slot yang beragam dan canggih, AGENSLOT77 memberikan kesempatan besar bagi para pemain untuk meraih kemenangan yang menggiurkan. 2. Slot88 Terpercaya Slot88 merupakan salah satu permainan slot paling populer di AGENSLOT77. Dengan desain yang menawan dan pembayaran yang besar, Slot88 menjadi favorit di antara pemain judi online. Malam ini, para pemain dapat menikmati berbagai permainan Slot88 yang menarik dan menguntungkan di AGENSLOT77. 3. Peluang Maxwin Malam Ini AGENSLOT77 menawarkan peluang Maxwin yang menarik, terutama malam ini. Dengan fitur yang mudah dimengerti dan diakses, pemain memiliki kesempatan besar untuk meraih kemenangan maksimum dalam setiap permainan yang mereka mainkan. Jadi, jangan lewatkan kesempatan untuk memenangkan hadiah besar di AGENSLOT77 malam ini!   ❱❱❱❱❱ DAFTAR DI SINI ❰❰❰❰❰  
  • Topics

×
×
  • Create New...

Important Information

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