I'm trying to store the players inventory so that they will keep it after dying if they are holding a specific item, I made a capability extending IItemHandler and ItemStackHandler to hold it which I attached to the players and I've been testing it's functions and it seems to store everything correctly, but no matter what I try, after respawing it's back to being empty and no items were copied
Here's my most resent try:
@Mod.EventBusSubscriber(modid = ExtraTotems.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE)
public class CommonEvents {
@SubscribeEvent
public static void onEntityDeath(LivingDeathEvent event){
LivingEntity entity = event.getEntityLiving();
if(entity instanceof Player player && !event.getSource().isBypassInvul() && checkTotemInventoryProtection(event)){ //last function checks if the totem was in one of the players hands
player.getCapability(Capabilities.EXTRA_ITEM_HANDLER_CAPABILITY).resolve().ifPresent(deathInventory ->
deathInventory.copyInventory(player.getInventory())); //copies the inventory before death to the capability
}
//... some extra unrelated stuff
}
//...
@SubscribeEvent
public static void onPlayerClone(PlayerEvent.Clone event){
if(event.isWasDeath()) {
Player originalPlayer = event.getOriginal();
Player newPlayer = event.getPlayer();
int MAIN_HAND = originalPlayer.getInventory().selected;
int OFF_HAND = 40;
originalPlayer.getCapability(Capabilities.EXTRA_ITEM_HANDLER_CAPABILITY).resolve().ifPresent(deathInventory ->
newPlayer.getCapability(Capabilities.EXTRA_ITEM_HANDLER_CAPABILITY).resolve().ifPresent(newInventory -> {
int totemSlot = (deathInventory.getStackInSlot(MAIN_HAND).is(ModItems.TOTEM_OF_KEEPING) ? MAIN_HAND : OFF_HAND); //saves the slot number where the item was held
Inventory inv = new Inventory(newPlayer);
for (int i = 0; i < 41; ++i) {
if (i == totemSlot) continue; //avoids copying the item to have it destroyed
inv.setItem(i, deathInventory.getStackInSlot(i));
}
newInventory.copyInventory(inv); //before I was doing a method where I was trying to directly copy what's in deathInventory to newInventory (not creating an actual inventory in the middle) but it wasn't working
})
);
}
}
@SubscribeEvent
public static void onPlayerRespawn(PlayerEvent.PlayerRespawnEvent event){
if(!event.isEndConquered()){
Player player = event.getPlayer();
player.getCapability(Capabilities.EXTRA_ITEM_HANDLER_CAPABILITY).resolve().ifPresent(deathInventory -> {
for (int i = 0; i < 41; i++){
player.getInventory().setItem(i, deathInventory.getStackInSlot(i));
}
});
} //also tried just doing this directly on onPlayerClone instead of copying the capability (the idea being the new copy wouldn't get a copy of the capability, just get the inventory), neither seem to work
}
//...
}
Am I missing something obvious?