item slot refactor

This commit is contained in:
Sen 2025-08-01 18:19:14 +02:00
parent c3f9655338
commit 6fb9ded711
Signed by: sen
GPG key ID: 3AC50A6F47D1B722
90 changed files with 1177 additions and 1622 deletions

View file

@ -930,7 +930,7 @@ public final class Server implements IThreadListener, Executor {
conn.sendPacket(new SPacketServerConfig(vars));
conn.sendPacket(new SPacketDimensions(Dimensions.getDimensionData()));
conn.sendPacket(new SPacketJoinGame(player.getId(), world.dimension, UniverseRegistry.getName(world.dimension), EntityRegistry.getEntityID(player), tag == null));
conn.sendPacket(new SPacketHeldItemChange(player.inventory.currentItem));
conn.sendPacket(new SPacketHeldItemChange(player.getSelectedIndex()));
this.sendPacket(new SPacketPlayerListItem(false, conn));
world.spawnEntityInWorld(player);
@ -1206,7 +1206,7 @@ public final class Server implements IThreadListener, Executor {
public void syncPlayerInventory(EntityNPC player) {
player.connection.sendContainer(player.inventoryContainer, player.inventoryContainer.getInventory());
player.connection.setPlayerHealthUpdated();
player.connection.sendPacket(new SPacketHeldItemChange(player.inventory.currentItem));
player.connection.sendPacket(new SPacketHeldItemChange(player.getSelectedIndex()));
}
private void terminateEndpoint(String message) {

View file

@ -4,7 +4,6 @@ import java.util.List;
import common.entity.npc.EntityNPC;
import common.entity.types.EntityLiving;
import common.util.Equipment;
import server.command.Command;
import server.command.CommandEnvironment;
import server.command.Executor;
@ -21,16 +20,11 @@ public class CommandClear extends Command {
int done = 0;
for(EntityLiving entity : entities) {
if(entity instanceof EntityNPC) {
if(entity.isPlayer()) {
((EntityNPC)entity).inventory.clearItems();
}
else {
((EntityNPC)entity).getExtendedInventory().clear();
((EntityNPC)entity).clear();
if(entity.isPlayer())
((EntityNPC)entity).setMouseItem(null);
else
((EntityNPC)entity).setHeldItem(null);
for(Equipment slot : Equipment.ARMOR) {
((EntityNPC)entity).setArmor(slot, null);
}
}
exec.log("Inventar von %s gelöscht", entity.getCommandName());
done++;
}

View file

@ -45,7 +45,7 @@ public class CommandItem extends Command {
while(total > 0) {
int added = Math.min(total, stack.getMaxStackSize());
ItemStack st = stack.copy(added);
player.inventory.addItemStackToInventory(st);
player.addItemStackToInventory(st);
added -= st.getSize();
if(added <= 0)
break;

View file

@ -31,11 +31,8 @@ public class CommandMore extends Command {
for(EntityNPC player : players) {
int add = 0;
if(all) {
for(ItemStack item : player.inventory.mainInventory) {
if(item != null)
add += this.addItems(item);
}
for(ItemStack item : player.inventory.armorInventory) {
for(int z = 0; z < player.getSizeInventory(); z++) {
ItemStack item = player.getStackInSlot(z);
if(item != null)
add += this.addItems(item);
}

View file

@ -38,11 +38,8 @@ public class CommandRepair extends Command {
for(EntityNPC player : players) {
int rep = 0;
if(all) {
for(ItemStack item : player.inventory.mainInventory) {
if(item != null && this.fixItem(item))
rep++;
}
for(ItemStack item : player.inventory.armorInventory) {
for(int z = 0; z < player.getSizeInventory(); z++) {
ItemStack item = player.getStackInSlot(z);
if(item != null && this.fixItem(item))
rep++;
}

View file

@ -40,7 +40,6 @@ import common.inventory.ContainerMerchant;
import common.inventory.ContainerTile;
import common.inventory.IInventory;
import common.inventory.InventoryBasic;
import common.inventory.InventoryPlayer;
import common.inventory.Slot;
import common.inventory.SlotCrafting;
import common.item.Item;
@ -289,7 +288,15 @@ public class Player extends User implements Executor, IPlayer
if (!Vars.keepInventory && Vars.playerDrop)
{
this.entity.inventory.dropAllItems();
for (int i = 0; i < this.entity.getSizeInventory(); ++i)
{
ItemStack stack = this.entity.getStackInSlot(i);
if (stack != null)
{
this.entity.dropItem(stack, true, false);
this.entity.setInventorySlotContents(i, null);
}
}
}
if(Vars.skullDrop) {
ItemStack stack = new ItemStack(Items.skull);
@ -411,11 +418,11 @@ public class Player extends User implements Executor, IPlayer
this.currentFormId = this.currentFormId % 100 + 1;
}
public void updateHeldItem()
public void updateMouseItem()
{
if (!this.isChangingQuantityOnly)
{
this.sendPacket(new SPacketSetSlot(-1, -1, this.entity.inventory.getItemStack()));
this.sendPacket(new SPacketSetSlot(-1, -1, this.entity.getMouseItem()));
}
}
@ -447,8 +454,12 @@ public class Player extends User implements Executor, IPlayer
{
this.lastExperience = -1;
this.lastHealth = -1.0F;
if(Vars.keepInventory)
this.entity.inventory.copyInventory(oldPlayer.inventory);
if(Vars.keepInventory) {
for(int z = 0; z < this.entity.getSizeInventory(); z++) {
this.entity.setInventorySlotContents(z, ItemStack.copy(oldPlayer.getStackInSlot(z)));
}
this.entity.setSelectedIndex(oldPlayer.getSelectedIndex());
}
this.entity.experienceLevel = oldPlayer.experienceLevel;
this.entity.experienceTotal = oldPlayer.experienceTotal;
this.entity.experience = oldPlayer.experience;
@ -665,19 +676,19 @@ public class Player extends User implements Executor, IPlayer
this.sendPacket(new SPacketSignEditorOpen(sign.getPos()));
return;
}
else if(object instanceof EntityNPC npc) {
else if(object instanceof EntityNPC npc && !npc.isPlayer()) {
this.getNextWindowId();
this.entity.openContainer = new ContainerMerchant(this.entity.inventory, npc, this.entity.worldObj);
this.entity.openContainer = new ContainerMerchant(this.entity, npc, this.entity.worldObj);
}
else if(object instanceof Entity entity) {
else if(object instanceof Entity entity && !entity.isPlayer()) {
InventoryBasic inv = entity.getEntityInventory();
this.sendPacket(new SPacketOpenWindow(this.getNextWindowId(), entity.getId(), inv.getSizeInventory()));
this.entity.openContainer = new ContainerEntityInventory(this.entity.inventory, inv, entity, this.entity);
this.entity.openContainer = new ContainerEntityInventory(this.entity, inv, entity);
}
else if (object instanceof Device device)
{
this.sendPacket(new SPacketOpenWindow(this.getNextWindowId(), device.getPos(), device.getSizeInventory()));
this.entity.openContainer = new ContainerTile(this.entity.inventory, device, device, this.entity);
this.entity.openContainer = new ContainerTile(this.entity, device, device);
}
else if (object instanceof TileEntityChest chest)
{
@ -688,17 +699,17 @@ public class Player extends User implements Executor, IPlayer
return;
}
this.sendPacket(new SPacketOpenWindow(this.getNextWindowId(), chest.getBlockType(), chest.getSizeInventory()));
this.entity.openContainer = new ContainerChest(this.entity.inventory, chest, this.entity);
this.entity.openContainer = new ContainerChest(this.entity, chest);
}
else if (object instanceof TileEntityInventory tile)
{
this.sendPacket(new SPacketOpenWindow(this.getNextWindowId(), tile.getBlockType(), tile.getSizeInventory()));
this.entity.openContainer = tile.createContainer(this.entity.inventory, this.entity);
this.entity.openContainer = tile.createContainer(this.entity);
}
else if (object instanceof InteractionObject obj)
{
this.sendPacket(new SPacketOpenWindow(this.getNextWindowId(), obj.getBlock(), 0));
this.entity.openContainer = obj.createContainer(this.entity.inventory, this.entity);
this.entity.openContainer = obj.createContainer(this.entity);
}
else {
return;
@ -707,7 +718,7 @@ public class Player extends User implements Executor, IPlayer
this.entity.openContainer.windowId = this.currentWindowId;
this.entity.openContainer.onCraftGuiOpened(this);
if(object instanceof EntityNPC npc) {
if(object instanceof EntityNPC npc && !npc.isPlayer()) {
IInventory merchant = ((ContainerMerchant)this.entity.openContainer).getMerchantInventory();
this.sendPacket(new SPacketOpenWindow(this.currentWindowId, npc.getId(), merchant.getSizeInventory()));
MerchantRecipeList trades = npc.getTrades(this.entity);
@ -807,7 +818,7 @@ public class Player extends User implements Executor, IPlayer
public void sendContainer(Container container, List<ItemStack> items)
{
this.sendPacket(new SPacketWindowItems(container.windowId, items));
this.sendPacket(new SPacketSetSlot(-1, -1, this.entity.inventory.getItemStack()));
this.sendPacket(new SPacketSetSlot(-1, -1, this.entity.getMouseItem()));
}
public void sendProperty(Container container, int variable, int value)
@ -959,7 +970,6 @@ public class Player extends User implements Executor, IPlayer
this.entity.openContainer.detectAndSendChanges();
// if(!this.worldObj.client)
this.entity.inventoryContainer.detectAttributeChanges();
if (/* !this.worldObj.client && */ !this.entity.openContainer.canInteractWith(this.entity))
{
@ -1102,7 +1112,7 @@ public class Player extends User implements Executor, IPlayer
if(this.onPlayerInteract(true, pos)) {
this.sendPacket(new SPacketBlockChange(this.entity.worldObj, pos));
if(this.entity.getHeldItem() != null && this.entity.getHeldItem().isEmpty())
this.entity.inventory.mainInventory[this.entity.inventory.currentItem] = null;
this.entity.setHeldItem(null);
this.entity.openContainer.detectAndSendChanges();
return;
}
@ -1220,7 +1230,7 @@ public class Player extends User implements Executor, IPlayer
if (itemstack1.isEmpty())
{
this.entity.destroyCurrentEquippedItem();
this.entity.setHeldItem(null);
}
}
@ -1245,11 +1255,11 @@ public class Player extends User implements Executor, IPlayer
if (itemstack != stack || itemstack != null && (itemstack.getSize() != i || itemstack.getMaxItemUseDuration() > 0 || itemstack.getItemDamage() != j))
{
this.entity.inventory.mainInventory[this.entity.inventory.currentItem] = itemstack;
this.entity.setHeldItem(itemstack);
if (itemstack.isEmpty())
{
this.entity.inventory.mainInventory[this.entity.inventory.currentItem] = null;
this.entity.setHeldItem(null);
}
if (!this.entity.isUsingItem())
@ -1265,7 +1275,7 @@ public class Player extends User implements Executor, IPlayer
this.sendPacket(new SPacketBlockChange(this.entity.worldObj, pos));
stack.getItem().onItemUse(stack, this.entity, this.entity.worldObj, pos, side, offsetX, offsetY, offsetZ);
if(stack.isEmpty())
this.entity.inventory.mainInventory[this.entity.inventory.currentItem] = null;
this.entity.setHeldItem(null);
this.entity.openContainer.detectAndSendChanges();
return false;
}
@ -1948,7 +1958,7 @@ public class Player extends User implements Executor, IPlayer
if(msg.length() > 30)
throw new IllegalArgumentException("Ungültiger Name");
if(packetIn.getArg() == -1)
this.entity.inventoryContainer.renameItem(36 + this.entity.inventory.currentItem, msg);
this.entity.inventoryContainer.renameItem(36 + this.entity.getSelectedIndex(), msg);
else
this.entity.openContainer.renameItem(packetIn.getArg(), msg);
this.entity.openContainer.detectAndSendChanges();
@ -2320,7 +2330,7 @@ public class Player extends User implements Executor, IPlayer
if(this.charEditor)
return;
WorldServer worldserver = this.getEntityWorld(); // this.serverController.getWorld(this.playerEntity.dimension);
ItemStack itemstack = this.entity.inventory.getCurrentItem();
ItemStack itemstack = this.entity.getHeldItem();
boolean flag = false;
BlockPos blockpos = packetIn.getPosition();
Facing enumfacing = Facing.getFront(packetIn.getPlacedBlockDirection());
@ -2361,25 +2371,25 @@ public class Player extends User implements Executor, IPlayer
this.entity.connection.sendPacket(new SPacketBlockChange(worldserver, blockpos.offset(enumfacing)));
}
itemstack = this.entity.inventory.getCurrentItem();
itemstack = this.entity.getHeldItem();
if (itemstack != null && itemstack.isEmpty())
{
this.entity.inventory.mainInventory[this.entity.inventory.currentItem] = null;
this.entity.setHeldItem(null);
itemstack = null;
}
if (itemstack == null || itemstack.getMaxItemUseDuration() == 0)
{
this.isChangingQuantityOnly = true;
this.entity.inventory.mainInventory[this.entity.inventory.currentItem] = ItemStack.copy(this.entity.inventory.mainInventory[this.entity.inventory.currentItem]);
Slot slot = this.entity.openContainer.getSlotFromInventory(this.entity.inventory, this.entity.inventory.currentItem);
this.entity.setHeldItem(ItemStack.copy(this.entity.getHeldItem()));
Slot slot = this.entity.openContainer.getSlotFromInventory(this.entity, this.entity.getSelectedIndex());
this.entity.openContainer.detectAndSendChanges();
this.isChangingQuantityOnly = false;
if (!ItemStack.allEquals(this.entity.inventory.getCurrentItem(), packetIn.getStack()))
if (!ItemStack.allEquals(this.entity.getHeldItem(), packetIn.getStack()))
{
this.sendPacket(new SPacketSetSlot(this.entity.openContainer.windowId, slot.slotNumber, this.entity.inventory.getCurrentItem()));
this.sendPacket(new SPacketSetSlot(this.entity.openContainer.windowId, slot.slotNumber, this.entity.getHeldItem()));
}
}
}
@ -2590,10 +2600,10 @@ public class Player extends User implements Executor, IPlayer
break;
case SET_ITEMSLOT:
if(packetIn.getAuxData() >= 0 && packetIn.getAuxData() < InventoryPlayer.getHotbarSize()) {
if(packetIn.getAuxData() != this.entity.inventory.currentItem)
if(packetIn.getAuxData() >= 0 && packetIn.getAuxData() < 9) {
if(packetIn.getAuxData() != this.entity.getSelectedIndex())
this.itemUseCooldown = 0;
this.entity.inventory.currentItem = packetIn.getAuxData();
this.entity.setSelectedIndex(packetIn.getAuxData());
}
// else
// Log.warn(this.user + " versuchte, einen ungültigen Slot zu wählen");
@ -2639,7 +2649,7 @@ public class Player extends User implements Executor, IPlayer
item.getItem().onAction(item, this.entity, this.entity.worldObj,
ItemControl.values()[packetIn.getAuxData() % ItemControl.values().length], null);
if(item.isEmpty())
this.entity.inventory.mainInventory[this.entity.inventory.currentItem] = null;
this.entity.setHeldItem(null);
this.entity.openContainer.detectAndSendChanges();
}
break;
@ -2686,15 +2696,8 @@ public class Player extends User implements Executor, IPlayer
case REPAIR:
if(this.isAdmin()) {
if(packetIn.getAuxData() != 0) {
for(ItemStack stack : this.entity.inventory.mainInventory) {
if(stack != null) {
stack.setSize(stack.getMaxStackSize());
stack.setRepairCost(0);
if(stack.getItem().getMaxDamage() > 0)
stack.setItemDamage(0);
}
}
for(ItemStack stack : this.entity.inventory.armorInventory) {
for(int z = 0; z < this.entity.getSizeInventory(); z++) {
ItemStack stack = this.entity.getStackInSlot(z);
if(stack != null) {
stack.setSize(stack.getMaxStackSize());
stack.setRepairCost(0);
@ -2796,15 +2799,15 @@ public class Player extends User implements Executor, IPlayer
break;
case CRAFT_ITEM: {
if(this.entity.inventory.getItemStack() == null) {
if(this.entity.getMouseItem() == null) {
Slot slot = this.entity.openContainer.getSlot(packetIn.getAuxData());
if(slot != null && slot.canCheatItem() && slot.getHasStack()) {
ItemStack stack = this.entity.inventoryContainer.getSingleRecipe(slot.getStack());
if(stack != null) {
slot.putStack(this.entity.inventoryContainer.craftSingleRecipe(slot.getStack()));
this.entity.inventory.setItemStack(stack);
this.entity.setMouseItem(stack);
this.entity.openContainer.detectAndSendChanges();
this.updateHeldItem();
this.updateMouseItem();
}
}
}
@ -2852,7 +2855,7 @@ public class Player extends User implements Executor, IPlayer
this.entity.connection.sendPacket(new SPacketConfirmTransaction(packetIn.getWindowId(), packetIn.getActionNumber(), true));
this.isChangingQuantityOnly = true;
this.entity.openContainer.detectAndSendChanges();
this.updateHeldItem();
this.updateMouseItem();
this.isChangingQuantityOnly = false;
}
else
@ -2886,7 +2889,7 @@ public class Player extends User implements Executor, IPlayer
if(amount <= 0)
return;
if(packet.getSlot() == -1) {
this.entity.inventory.addItemStackToInventory(stack);
this.entity.addItemStackToInventory(stack);
amount -= stack.getSize();
if(amount <= 0)
return;