Jump to content

How to set + get the slot in players inventory that the current ItemStack is in?


Recommended Posts

Posted

set and get the current slot that an itemstack is in

ItemStack doesn't know where it is. It just is.

 

If in inventory, inventory knows tho.

 

player.inventory.mainInventory - array of 36 player slots, you can iterate through them, check if there is an item and replace/move it.

 

Or are we talking about other inventories? IInventory has getStackInSlot(index) or you can return whole array if you want and do same as above.

  • Like 1

1.7.10 is no longer supported by forge, you are on your own.

Posted

Well the first thing I am trying to do is copy an item stack from one slot to another. I managed to copy it but I am not sure how to delete the original.

slot.inventory.setInventorySlotContents(itemstack.stackSize, itemstack);

BioWarfare Mod: http://goo.gl/BYWQty

Posted

Easiest way to do this is just give you my code.

package com.looke81.Tat.items;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Items;
import net.minecraft.inventory.Slot;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;

import com.looke81.Tat.Tat;

public class EnergyIngot extends Item {
public EnergyIngot() {
	this.setCreativeTab(Tat.TatTab);

}
private Random random = new Random();

public void onUpdate(ItemStack itemstack, World worldIn, Entity entity, int itemSlot, boolean isSelected) {
	EntityPlayer player= (EntityPlayer) entity;
	if(entity instanceof EntityPlayer){
		List stacks = player.inventoryContainer.inventoryItemStacks;
		List slots = player.inventoryContainer.inventorySlots;

		int index = random.nextInt(slots.size());
		Slot slot= (Slot) slots.get(index);
		ItemStack stack= (ItemStack) stacks.get(index);

		if(stack == null && slot != null){

			slot.inventory.setInventorySlotContents(slot.slotNumber, itemstack);

		}
	}
}

}

Yes I know this is kinda crazy but don't worry i'm not planning on doing it every tick this is just for test purposes. What I am trying to do is delete the old item that the new one was copied from. Thanks for your help so far.

BioWarfare Mod: http://goo.gl/BYWQty

Posted

EntityPlayer player= (EntityPlayer) entity;
if(entity instanceof EntityPlayer)

Rethink this code please.

oh so i guess:

EntityPlayer player= (EntityPlayer) entity;

already checks if the entity is an entityplayer i didn't know that thanks. Also

  • Don't use the Container, it will just be confusing (e.g. you are using slot.slotNumber as the inventory slot index, but that's not right).
  • What is this "old item", "new item" you are talking about? :o Please clarify.

right yea just use the original index course. The "old item" is the item that i have copied from and the new item is the new item made by:

slot.inventory.setInventorySlotContents(index, itemstack);

Edit: and I want to delete the old item to move the item.

BioWarfare Mod: http://goo.gl/BYWQty

Posted

already checks if the entity is an entityplayer

Nope. Its casting, not instanceof.

 

Rethink this code please.

You mean "rethink your life!" :D

 

player.inventory.mainInventory - array of 36 player slots, you can iterate through them, check if there is an item and replace/move it.

Why not?

 

public void onUpdate(ItemStack itemstack, World worldIn, Entity entity, int itemSlot, boolean isSelected)
{
if (entity instanceof EntityPlayer)
{
	EntityPlayer player = (EntityPlayer) entity;
	ItemStack old = itemstack;
	for (int i = 0; i < 36; ++i)
	{
		if (player.inventory.mainInventory[i] == itemstack) player.inventory.mainInventory[i] = null; // removes itemstack from inventory.
	}
	// At this point, your inventory doesn't have your itemstack anymore and "old" holds last reference to it.
	// What are you trying to do next is mystery to me.
}
}

 

Not if the item spawning the new item is in a different slot. I understand why your confused but I'm not sure how else to explain it.

WHAT EXACLY are your trying to do?

1.7.10 is no longer supported by forge, you are on your own.

Posted

WHAT EXACLY are your trying to do?

Probably should have opened with this but wanted to try on my own. Okay so i was trying to see if I could make an item "bounce around" the players inventory by making it move to random slots. I was going to do this by getting a random slot. If that slot had nothing in it (== null) I would copy the item into that slot (this is were we are). Then I would delete the item that was copied from. If the slot did have an item in it I was planning on switching the two items slots.

I hope this helps.

 

BioWarfare Mod: http://goo.gl/BYWQty

Posted

int rand = worldIn.rand.nextInt(36);
ItemStack someItem = player.inventory.mainInventory[rand];
player.inventory.mainInventory[rand] = itemstack;
player.inventory.mainInventory[itemSlot] = someItem;

 

I am learning for tomorrow exam - everything is (much) more fun than that ;_;

 

Idk how it will work in client/server manners.

 

EDIT

Btw. I just LOVE how everyone else is trying their best to help OP without shooting themselves in head :D Lolololol

 

EDIT

Ah, yes indeed (post below)

1.7.10 is no longer supported by forge, you are on your own.

Posted

Wow I feel like an entrepreneur on dragons den whose been offered deals from everyone (its a TV show if you don't get reference).

So il go for Failender first.

player.mainInventory.setStackInSlot(randomIndex, itemstack);
player.mainInventory.setStackInSlot(itemSlot, null);

yes but were do you suppose I get itemSlot from? As I only have the slot of the new item and itemstack will call them both.

(looking into other two solutions thankyou very much just give me some time)

BioWarfare Mod: http://goo.gl/BYWQty

Posted

yes but were do you suppose I get itemSlot from?

you dont need to search for the item, you get it passed as argument (int itemSlot)

 

int rand = worldIn.rand.nextInt(36);
ItemStack someItem = player.inventory.mainInventory[rand];
player.inventory.mainInventory[rand] = itemstack;
player.inventory.mainInventory[itemSlot] = someItem;

 

I think this is everybody here now: (no offense intended)

 

[Edit: Removed image. Sorry Ernio, but that was a step too far]

1.7.10 is no longer supported by forge, you are on your own.

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

    • Version 1.19 - Forge 41.0.63 I want to create a wolf entity that I can ride, so far it seems to be working, but the problem is that when I get on the wolf, I can’t control it. I then discovered that the issue is that the server doesn’t detect that I’m riding the wolf, so I’m struggling with synchronization. However, it seems to not be working properly. As I understand it, the server receives the packet but doesn’t register it correctly. I’m a bit new to Java, and I’ll try to provide all the relevant code and prints *The comments and prints are translated by chatgpt since they were originally in Spanish* Thank you very much in advance No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. MountableWolfEntity package com.vals.valscraft.entity; import com.vals.valscraft.network.MountSyncPacket; import com.vals.valscraft.network.NetworkHandler; import net.minecraft.client.Minecraft; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.animal.Wolf; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.Entity; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import net.minecraftforge.event.TickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.network.PacketDistributor; public class MountableWolfEntity extends Wolf { private boolean hasSaddle; private static final EntityDataAccessor<Byte> DATA_ID_FLAGS = SynchedEntityData.defineId(MountableWolfEntity.class, EntityDataSerializers.BYTE); public MountableWolfEntity(EntityType<? extends Wolf> type, Level level) { super(type, level); this.hasSaddle = false; } @Override protected void defineSynchedData() { super.defineSynchedData(); this.entityData.define(DATA_ID_FLAGS, (byte)0); } public static AttributeSupplier.Builder createAttributes() { return Wolf.createAttributes() .add(Attributes.MAX_HEALTH, 20.0) .add(Attributes.MOVEMENT_SPEED, 0.3); } @Override public InteractionResult mobInteract(Player player, InteractionHand hand) { ItemStack itemstack = player.getItemInHand(hand); if (itemstack.getItem() == Items.SADDLE && !this.hasSaddle()) { if (!player.isCreative()) { itemstack.shrink(1); } this.setSaddle(true); return InteractionResult.SUCCESS; } else if (!level.isClientSide && this.hasSaddle()) { player.startRiding(this); MountSyncPacket packet = new MountSyncPacket(true); // 'true' means the player is mounted NetworkHandler.CHANNEL.sendToServer(packet); // Ensure the server handles the packet return InteractionResult.SUCCESS; } return InteractionResult.PASS; } @Override public void travel(Vec3 travelVector) { if (this.isVehicle() && this.getControllingPassenger() instanceof Player) { System.out.println("The wolf has a passenger."); System.out.println("The passenger is a player."); Player player = (Player) this.getControllingPassenger(); // Ensure the player is the controller this.setYRot(player.getYRot()); this.yRotO = this.getYRot(); this.setXRot(player.getXRot() * 0.5F); this.setRot(this.getYRot(), this.getXRot()); this.yBodyRot = this.getYRot(); this.yHeadRot = this.yBodyRot; float forward = player.zza; float strafe = player.xxa; if (forward <= 0.0F) { forward *= 0.25F; } this.flyingSpeed = this.getSpeed() * 0.1F; this.setSpeed((float) this.getAttributeValue(Attributes.MOVEMENT_SPEED) * 1.5F); this.setDeltaMovement(new Vec3(strafe, travelVector.y, forward).scale(this.getSpeed())); this.calculateEntityAnimation(this, false); } else { // The wolf does not have a passenger or the passenger is not a player System.out.println("No player is mounted, or the passenger is not a player."); super.travel(travelVector); } } public boolean hasSaddle() { return this.hasSaddle; } public void setSaddle(boolean hasSaddle) { this.hasSaddle = hasSaddle; } @Override protected void dropEquipment() { super.dropEquipment(); if (this.hasSaddle()) { this.spawnAtLocation(Items.SADDLE); this.setSaddle(false); } } @SubscribeEvent public static void onServerTick(TickEvent.ServerTickEvent event) { if (event.phase == TickEvent.Phase.START) { MinecraftServer server = net.minecraftforge.server.ServerLifecycleHooks.getCurrentServer(); if (server != null) { for (ServerPlayer player : server.getPlayerList().getPlayers()) { if (player.isPassenger() && player.getVehicle() instanceof MountableWolfEntity) { MountableWolfEntity wolf = (MountableWolfEntity) player.getVehicle(); System.out.println("Tick: " + player.getName().getString() + " is correctly mounted on " + wolf); } } } } } private boolean lastMountedState = false; @Override public void tick() { super.tick(); if (!this.level.isClientSide) { // Only on the server boolean isMounted = this.isVehicle() && this.getControllingPassenger() instanceof Player; // Only print if the state changed if (isMounted != lastMountedState) { if (isMounted) { Player player = (Player) this.getControllingPassenger(); // Verify the passenger is a player System.out.println("Server: Player " + player.getName().getString() + " is now mounted."); } else { System.out.println("Server: The wolf no longer has a passenger."); } lastMountedState = isMounted; } } } @Override public void addPassenger(Entity passenger) { super.addPassenger(passenger); if (passenger instanceof Player) { Player player = (Player) passenger; if (!this.level.isClientSide && player instanceof ServerPlayer) { // Send the packet to the server to indicate the player is mounted NetworkHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new MountSyncPacket(true)); } } } @Override public void removePassenger(Entity passenger) { super.removePassenger(passenger); if (passenger instanceof Player) { Player player = (Player) passenger; if (!this.level.isClientSide && player instanceof ServerPlayer) { // Send the packet to the server to indicate the player is no longer mounted NetworkHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new MountSyncPacket(false)); } } } @Override public boolean isControlledByLocalInstance() { Entity entity = this.getControllingPassenger(); return entity instanceof Player; } @Override public void positionRider(Entity passenger) { if (this.hasPassenger(passenger)) { double xOffset = Math.cos(Math.toRadians(this.getYRot() + 90)) * 0.4; double zOffset = Math.sin(Math.toRadians(this.getYRot() + 90)) * 0.4; passenger.setPos(this.getX() + xOffset, this.getY() + this.getPassengersRidingOffset() + passenger.getMyRidingOffset(), this.getZ() + zOffset); } } } MountSyncPacket package com.vals.valscraft.network; import com.vals.valscraft.entity.MountableWolfEntity; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraftforge.network.NetworkEvent; import java.util.function.Supplier; public class MountSyncPacket { private final boolean isMounted; public MountSyncPacket(boolean isMounted) { this.isMounted = isMounted; } public void encode(FriendlyByteBuf buffer) { buffer.writeBoolean(isMounted); } public static MountSyncPacket decode(FriendlyByteBuf buffer) { return new MountSyncPacket(buffer.readBoolean()); } public void handle(NetworkEvent.Context context) { context.enqueueWork(() -> { ServerPlayer player = context.getSender(); // Get the player from the context if (player != null) { // Verifies if the player has dismounted if (!isMounted) { Entity vehicle = player.getVehicle(); if (vehicle instanceof MountableWolfEntity wolf) { // Logic to remove the player as a passenger wolf.removePassenger(player); System.out.println("Server: Player " + player.getName().getString() + " is no longer mounted."); } } } }); context.setPacketHandled(true); // Marks the packet as handled } } networkHandler package com.vals.valscraft.network; import com.vals.valscraft.valscraft; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.network.NetworkRegistry; import net.minecraftforge.network.simple.SimpleChannel; import net.minecraftforge.network.NetworkEvent; import java.util.function.Supplier; public class NetworkHandler { private static final String PROTOCOL_VERSION = "1"; public static final SimpleChannel CHANNEL = NetworkRegistry.newSimpleChannel( new ResourceLocation(valscraft.MODID, "main"), () -> PROTOCOL_VERSION, PROTOCOL_VERSION::equals, PROTOCOL_VERSION::equals ); public static void init() { int packetId = 0; // Register the mount synchronization packet CHANNEL.registerMessage( packetId++, MountSyncPacket.class, MountSyncPacket::encode, MountSyncPacket::decode, (msg, context) -> msg.handle(context.get()) // Get the context with context.get() ); } }  
    • Do you use features of inventory profiles next (ipnext) or is there a change without it?
    • Remove rubidium - you are already using embeddium, which is a fork of rubidium
  • Topics

×
×
  • Create New...

Important Information

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