So im making a sidemod for pixelmon and i need to ban some bag items that will otherwise pose a problem.
My approach has been confiscating them like this.
package suprorel.nuzlocke;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import com.pixelmonmod.pixelmon.api.events.BattleStartedEvent;
import com.pixelmonmod.pixelmon.api.events.battles.BattleEndEvent;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.util.text.TextComponentString;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
public class BagBans
{
public List<String> bans;
private Map<EntityPlayerMP, Queue> conspicated;
public BagBans(List<String> bans)
{
this.bans = bans;
conspicated = new HashMap<EntityPlayerMP, Queue>();
}
@SubscribeEvent
public void onEnd(BattleEndEvent event)
{
ArrayList<EntityPlayerMP> arr = event.getPlayers();
for(int i = 0; i < arr.size(); i++)
{
EntityPlayerMP player = arr.get(i);
Queue cons = conspicated.get(player);
if(cons != null)
{
while(!cons.isEmpty())
{
ItemStack con = (ItemStack) cons.poll();
player.inventory.addItemStackToInventory(con);
}
}
}
}
@SubscribeEvent
public void onStart(BattleStartedEvent event)
{
EntityLivingBase participant = event.participant1[0].getEntity();
if(participant instanceof EntityPlayerMP)
{
confiscate((EntityPlayerMP)participant);
}
}
private void confiscate(EntityPlayerMP player)
{
int size = player.inventory.getSizeInventory();
for(int i = 0; i < size; i++)
{
ItemStack item = player.inventory.getStackInSlot(i);
if(item != null)
{
String name = item.getItem().getRegistryName().getResourcePath();
for(int x = 0; x < bans.size(); x++)
{
String ban = bans.get(x);
if(name.equals(ban))
{
Queue cons = conspicated.get(player);
if(cons == null)
{
cons = new LinkedList();
conspicated.put(player, cons);
}
cons.add(item);
player.inventory.deleteStack(item);
break;
}
}
}
}
}
}
Problom is when i delete the stack it dosent sync in with other threads and i dont really know what to do. Maybe i need to send an event to the EVENT_BUS? i can calll player.inventory.notify which fixes it but it also breaks out of my code.
Could there maybe be a way to unregister the items from the bag menu instead?
if youre wondering why i want to do something quite specific i made a nuzlocke mod and im just trying to ban the revive items