- 170
- 2
- 53
Делаю мод на костюмы и столкнулся с такой проблемой, в мультиплеере игроки не видят костюмы других игроков. Костюм храниться в отдельном инвентаре, в собственной ячейке. Как я понял, нужно запросить у сервера предмет с этой ячейки у игрока, но я совершенно не понимаю как это сделать. Подскажите, как реализовать?
Код:
public class MainHandRenderHandler
{
private static class CachedInventory
{
NonNullList<ItemStack> stacks;
int state;
CachedInventory(int size)
{
stacks = NonNullList.withSize(size, ItemStack.EMPTY);
state = 0;
}
}
public static boolean HideCosArmor = false;
private static final boolean isBaublesLoaded = Loader.isModLoaded("baubles");
private final LoadingCache<EntityPlayer, CachedInventory> cache = CacheBuilder.newBuilder().expireAfterAccess(60, TimeUnit.SECONDS).build(new CacheLoader<EntityPlayer, CachedInventory>()
{
@Override
public CachedInventory load(EntityPlayer owner) throws Exception
{
return new CachedInventory(owner.inventory.mainInventory.size());
}
});
@SubscribeEvent(priority = EventPriority.LOWEST, receiveCanceled = true)
public void handleCanceledEvent(RenderPlayerEvent.Pre event)
{
if (!event.isCanceled())
return;
CachedInventory cachedInv = cache.getUnchecked(event.getEntityPlayer());
NonNullList<ItemStack> cachedArmor = cachedInv.stacks;
NonNullList<ItemStack> armor = event.getEntityPlayer().inventory.mainInventory;
if (armor.size() > cachedArmor.size())
{
cache.invalidate(event.getEntityPlayer());
return;
}
if (cachedInv.state != 0)
{
for (int i = 0; i < armor.size(); i++)
armor.set(i, cachedArmor.get(i));
if (isBaublesLoaded)
{
try
{
IBaublesItemHandler bh = BaublesApi.getBaublesHandler(event.getEntityPlayer());
boolean block = bh.isEventBlocked();
bh.setEventBlock(true);
for (int i = 0; i < bh.getSlots(); i++)
bh.setStackInSlot(i, cachedArmor.get(9 + i));
bh.setEventBlock(block);
}
catch (Throwable ignored)
{
}
}
cachedInv.state = 0;
}
}
@SubscribeEvent(priority = EventPriority.HIGH)
public void handleEvent(RenderPlayerEvent.Post event)
{
CachedInventory cachedInv = cache.getUnchecked(event.getEntityPlayer());
NonNullList<ItemStack> cachedArmor = cachedInv.stacks;
NonNullList<ItemStack> armor = event.getEntityPlayer().inventory.mainInventory;
if (armor.size() > cachedArmor.size())
{
cache.invalidate(event.getEntityPlayer());
return;
}
if (cachedInv.state != 0)
{
for (int i = 0; i < armor.size(); i++)
armor.set(i, cachedArmor.get(i));
if (isBaublesLoaded)
{
try
{
IBaublesItemHandler bh = BaublesApi.getBaublesHandler(event.getEntityPlayer());
boolean block = bh.isEventBlocked();
bh.setEventBlock(true);
for (int i = 0; i < bh.getSlots(); i++)
bh.setStackInSlot(i, cachedArmor.get(9 + i));
bh.setEventBlock(block);
}
catch (Throwable ignored)
{
}
}
cachedInv.state = 0;
}
}
@SubscribeEvent(priority = EventPriority.HIGH, receiveCanceled = true)
public void handleEvent(RenderPlayerEvent.Pre event)
{
CachedInventory cachedInv = cache.getUnchecked(event.getEntityPlayer());
NonNullList<ItemStack> cachedArmor = cachedInv.stacks;
EntityPlayer player = event.getEntityPlayer(); // ВОТ ТУТ ВОТ Я БЕРУ ИГРОКА И ПОЛУЧАЮ ЕГО ИНВЕНТАРЬ
ICAPCustomInventory cap = player.getCapability(CAPCustomInventoryProvider.INVENTORY_CAP, null);
CustomInventory cosArmor = cap.getInventory();
NonNullList<ItemStack> armor = event.getEntityPlayer().inventory.mainInventory;
if (armor.size() > cachedArmor.size())
{
cache.invalidate(event.getEntityPlayer());
return;
}
if (cachedInv.state != 0)
{
for (int i = 0; i < armor.size(); i++)
armor.set(i, cachedArmor.get(i));
if (isBaublesLoaded)
{
try
{
IBaublesItemHandler bh = BaublesApi.getBaublesHandler(event.getEntityPlayer());
boolean block = bh.isEventBlocked();
bh.setEventBlock(true);
for (int i = 0; i < bh.getSlots(); i++)
bh.setStackInSlot(i, cachedArmor.get(9 + i));
bh.setEventBlock(block);
}
catch (Throwable ignored)
{
}
}
cachedInv.state = 0;
}
for (int i = 0; i < armor.size(); i++)
cachedArmor.set(i, armor.get(i));
cachedInv.state = 1;
if (HideCosArmor)
return;
for (int i = 0; i < armor.size(); i++)
{
if (i < 9)
{
if (!cosArmor.getStackInSlot(7).isEmpty()) {
armor.set(player.inventory.currentItem, cosArmor.getStackInSlot(7)); //тут указываю предмет который нужно рендерить.
}
}
}
if (isBaublesLoaded)
{
try
{
IBaublesItemHandler bh = BaublesApi.getBaublesHandler(event.getEntityPlayer());
boolean block = bh.isEventBlocked();
bh.setEventBlock(true);
for (int i = 0; i < bh.getSlots(); i++)
{
if (!cosArmor.getStackInSlot(7).isEmpty()) {
bh.setStackInSlot(player.inventory.currentItem, cosArmor.getStackInSlot(i));
}
else
bh.setStackInSlot(player.inventory.currentItem, ItemStack.EMPTY);
}
bh.setEventBlock(block);
}
catch (Throwable ignored)
{
}
}
}
}