Jump to content

[1.8] Inventory store a little sub inventory inside an item NBTTag


perromercenary00

Recommended Posts

little help  i need whit this 

 

 

i have a lot of guns in mi mod in this case just speak about the SCARH, and i been working in make entityes capable of use this gun , i alredy have that

the trouble is than the gun run out from ammo,   

wel now i wanna give to this entity more spare munition just by rigth clicking it whith loaded magazine

 

i think lets make a little  inventory inside the gun itself (fusil-SCARH)  and set some more magazines for the later use of the mob

im planing to make an animation of the mob changin magazine when it gets empty

 

so i make this code based on the code from the entityLivingBase to store the 4 default armour slots

 

 

magazine55645.class

public boolean itemInteractionForEntity(ItemStack stack, EntityPlayer playerIn, EntityLivingBase target) {


	//get the gun from the entity
	ItemStack gun = target.getHeldItem(); 



	System.out.println("\n\n\n\n");

	if (gun != null & !playerIn.worldObj.isRemote) {

		ArrayList<ItemStack> inventario = new ArrayList<ItemStack>(0);

		NBTTagCompound tagCompund = gun.getTagCompound();

		NBTTagList nbttaglist = tagCompund.getTagList("Inventory", 6);

		System.out.println("In nbttaglist.tagCount()=" + nbttaglist.tagCount());

		for (int i = 0; i < nbttaglist.tagCount(); ++i) {
			ItemStack itemstack = ItemStack.loadItemStackFromNBT(nbttaglist.getCompoundTagAt(i));

			if (itemstack != null) {
				System.out.println("downSLot=" + i + " itemName=" + itemstack.getUnlocalizedName());
				inventario.add(itemstack);
			}

		}

		System.out.println("\n\n");

		inventario.add(magazine);
		System.out.println("inventario.size()=" + inventario.size());

		System.out.println("\n\n");

		nbttaglist = new NBTTagList();

		for (int i = 0; i < inventario.size(); ++i) {
			ItemStack itemstack = inventario.get(i);

			NBTTagCompound temp0 = new NBTTagCompound();

			if (itemstack != null) {

				System.out.println("upSLot=" + i + " itemName=" + itemstack.getUnlocalizedName());

				itemstack.writeToNBT(temp0);

				nbttaglist.appendTag(temp0);

			}
		}

		System.out.println("Out nbttaglist.tagCount()=" + nbttaglist.tagCount());

		tagCompund.setTag("Inventory", nbttaglist);

		gun.setTagCompound(tagCompund);


		int hand = playerIn.inventory.currentItem;
		//playerIn.replaceItemInInventory(hand, null);


	}

	return false;
}

// ####################################################################################3

 

 

what this does is first take the gun from the entity, read the nbttags an get the inventory from the gun, add this magazine  store back  the nbttags to the gun

the trouble is that when i read again the inventory from the gun, is empty, there is no magazines but i alredy store some magazines, and this code is not trowing any error

 

theories ??

 

thanks fro reading

 

 

console out put



//first try
[19:45:21] [server thread/INFO] [sTDOUT]: [mercenarymod.items.armasdefuego.cargador55645.cargador55645:itemInteractionForEntity:529]: 




[19:45:21] [server thread/INFO] [sTDOUT]: [mercenarymod.items.armasdefuego.cargador55645.cargador55645:itemInteractionForEntity:539]: In nbttaglist.tagCount()=0
[19:45:21] [server thread/INFO] [sTDOUT]: [mercenarymod.items.armasdefuego.cargador55645.cargador55645:itemInteractionForEntity:551]: 


[19:45:21] [server thread/INFO] [sTDOUT]: [mercenarymod.items.armasdefuego.cargador55645.cargador55645:itemInteractionForEntity:554]: inventario.size()=1
[19:45:21] [server thread/INFO] [sTDOUT]: [mercenarymod.items.armasdefuego.cargador55645.cargador55645:itemInteractionForEntity:556]: 


[19:45:21] [server thread/INFO] [sTDOUT]: [mercenarymod.items.armasdefuego.cargador55645.cargador55645:itemInteractionForEntity:567]: upSLot=0 itemName=cargador55645_Standar
[19:45:21] [server thread/INFO] [sTDOUT]: [mercenarymod.items.armasdefuego.cargador55645.cargador55645:itemInteractionForEntity:576]: Out nbttaglist.tagCount()=1
[19:45:23] [Client thread/INFO] [sTDOUT]: [mercenarymod.items.armasdefuego.cargador55645.cargador55645:itemInteractionForEntity:529]: 



//second try
[19:45:23] [server thread/INFO] [sTDOUT]: [mercenarymod.items.armasdefuego.cargador55645.cargador55645:itemInteractionForEntity:529]: 




[19:45:23] [server thread/INFO] [sTDOUT]: [mercenarymod.items.armasdefuego.cargador55645.cargador55645:itemInteractionForEntity:539]: In nbttaglist.tagCount()=0
[19:45:23] [server thread/INFO] [sTDOUT]: [mercenarymod.items.armasdefuego.cargador55645.cargador55645:itemInteractionForEntity:551]: 


[19:45:23] [server thread/INFO] [sTDOUT]: [mercenarymod.items.armasdefuego.cargador55645.cargador55645:itemInteractionForEntity:554]: inventario.size()=1
[19:45:23] [server thread/INFO] [sTDOUT]: [mercenarymod.items.armasdefuego.cargador55645.cargador55645:itemInteractionForEntity:556]: 


[19:45:23] [server thread/INFO] [sTDOUT]: [mercenarymod.items.armasdefuego.cargador55645.cargador55645:itemInteractionForEntity:567]: upSLot=0 itemName=cargador55645_Standar
[19:45:23] [server thread/INFO] [sTDOUT]: [mercenarymod.items.armasdefuego.cargador55645.cargador55645:itemInteractionForEntity:576]: Out nbttaglist.tagCount()=1
[19:45:24] [Client thread/INFO] [sTDOUT]: [mercenarymod.items.armasdefuego.cargador55645.cargador55645:itemInteractionForEntity:529]: 



//third  try   the inventory in the gun is still enmpty
[19:45:24] [server thread/INFO] [sTDOUT]: [mercenarymod.items.armasdefuego.cargador55645.cargador55645:itemInteractionForEntity:529]: 




[19:45:24] [server thread/INFO] [sTDOUT]: [mercenarymod.items.armasdefuego.cargador55645.cargador55645:itemInteractionForEntity:539]: In nbttaglist.tagCount()=0
[19:45:24] [server thread/INFO] [sTDOUT]: [mercenarymod.items.armasdefuego.cargador55645.cargador55645:itemInteractionForEntity:551]: 


[19:45:24] [server thread/INFO] [sTDOUT]: [mercenarymod.items.armasdefuego.cargador55645.cargador55645:itemInteractionForEntity:554]: inventario.size()=1
[19:45:24] [server thread/INFO] [sTDOUT]: [mercenarymod.items.armasdefuego.cargador55645.cargador55645:itemInteractionForEntity:556]: 


[19:45:24] [server thread/INFO] [sTDOUT]: [mercenarymod.items.armasdefuego.cargador55645.cargador55645:itemInteractionForEntity:567]: upSLot=0 itemName=cargador55645_Standar
[19:45:24] [server thread/INFO] [sTDOUT]: [mercenarymod.items.armasdefuego.cargador55645.cargador55645:itemInteractionForEntity:576]: Out nbttaglist.tagCount()=1
[19:45:24] [Client thread/INFO] [sTDOUT]: [mercenarymod.items.armasdefuego.cargador55645.cargador55645:itemInteractionForEntity:529]: 




[19:45:24] [server thread/INFO] [sTDOUT]: [mercenarymod.items.armasdefuego.cargador55645.cargador55645:itemInteractionForEntity:529]: 

Link to comment
Share on other sites

Why are you trying to store the inventory in the gun itself, rather than on the entity? Wouldn't it make more sense for the entity to have extra inventory slots to hold the ammo, so you can give it ammo at any time? Then, if it somehow loses the gun, it would still have the extra ammo.

 

As to your problem, you should use the Constants.NBT utility class provided by Forge when retrieving tags, and understand that when retrieving an NBTTagList, the type you pass in is the type of object stored in the list, not the list type itself.

// 6 = TAG_DOUBLE, are you storing a list of doubles? No.
NBTTagList nbttaglist = tagCompund.getTagList("Inventory", 6);

// you are storing a list of NBTTagCompounds, so use the appropriate type
NBTTagList nbttaglist = tagCompund.getTagList("Inventory", Constants.NBT.TAG_COMPOUND);

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

    • Hi, I want to make a client-only mod, everything is ok, but when I use shaders, none of the textures rendered in RenderLevelStageEvent nor the crow entity model are rendered, I want them to be visible, because it's a horror themed mod Here is how i render the crow model in the CrowEntityRenderer<CrowEntity>, by the time i use this method, i know is not the right method but i don't think this is the cause of the problem, the renderType i'm using is entityCutout @Override public void render(CrowEntity p_entity, float entityYaw, float partialTick, PoseStack poseStack, MultiBufferSource bufferSource, int packedLight) { super.render(p_entity, entityYaw, partialTick, poseStack, bufferSource, packedLight); ClientEventHandler.getClient().crow.renderToBuffer(poseStack, bufferSource.getBuffer(ClientEventHandler.getClient().crow .renderType(TEXTURE)), packedLight, OverlayTexture.NO_OVERLAY, Utils.rgb(255, 255, 255)); } Here renderLevelStage @Override public void renderWorld(RenderLevelStageEvent e) { horrorEvents.draw(e); } Here is how i render every event public void draw(RenderLevelStageEvent e) { for (HorrorEvent event : currentHorrorEvents) { event.tick(e.getPartialTick()); event.draw(e); } } Here is how i render the crow model on the event @Override public void draw(RenderLevelStageEvent e) { if(e.getStage() == RenderLevelStageEvent.Stage.AFTER_ENTITIES) { float arcProgress = getArcProgress(0.25f); int alpha = (int) Mth.lerp(arcProgress, 0, 255); int packedLight = LevelRenderer.getLightColor(Minecraft.getInstance().level, blockPos); VertexConsumer builder = ClientEventHandler.bufferSource.getBuffer(crow); Crow<CreepyBirdHorrorEvent> model = ClientEventHandler .getClient().crow; model.setupAnim(this); RenderHelper.renderModelInWorld(model, position, offset, e.getCamera(), e.getPoseStack(), builder, packedLight, OverlayTexture.NO_OVERLAY, alpha); builder = ClientEventHandler.bufferSource.getBuffer(eyes); RenderHelper.renderModelInWorld(model, position, offset, e.getCamera(), e.getPoseStack(), builder, 15728880, OverlayTexture.NO_OVERLAY, alpha); } } How i render the model public static void renderModelInWorld(Model model, Vector3f pos, Vector3f offset, Camera camera, PoseStack matrix, VertexConsumer builder, int light, int overlay, int alpha) { matrix.pushPose(); Vec3 cameraPos = camera.getPosition(); double finalX = pos.x - cameraPos.x + offset.x; double finalY = pos.y - cameraPos.y + offset.y; double finalZ = pos.z - cameraPos.z + offset.z; matrix.pushPose(); matrix.translate(finalX, finalY, finalZ); matrix.mulPose(Axis.XP.rotationDegrees(180f)); model.renderToBuffer(matrix, builder, light, overlay, Utils .rgba(255, 255, 255, alpha)); matrix.popPose(); matrix.popPose(); } Thanks in advance
    • Here's the link: https://mclo.gs/7L5FibL Here's the link: https://mclo.gs/7L5FibL
    • Also the mod "Connector Extras" modifies Reach-entity-attributes and can cause fatal errors when combined with ValkrienSkies mod. Disable this mod and continue to use Syntra without it.
    • Hi everyone. I was trying modify the vanilla loot of the "short_grass" block, I would like it drops seeds and vegetal fiber (new item of my mod), but I don't found any guide or tutorial on internet. Somebody can help me?
    • On 1.20.1 use ValkrienSkies mod version 2.3.0 Beta 1. I had the same issues as you and it turns out the newer beta versions have tons of unresolved incompatibilities. If you change the version you will not be required to change the versions of eureka or any other additions unless prompted at startup. This will resolve Reach-entity-attributes error sound related error and cowardly errors.
  • Topics

×
×
  • Create New...

Important Information

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