- 83
- 4
- 23
Мне необходимо переделать систему рук и брони моим существам. Для этого у меня есть классы инвентаря и самой сущности
Броня не отображается, и судя по всему даже не надевается на моба:
В чем проблема?
Java:
public class HumanInventory extends SimpleInventory {
private final DefaultedList<ItemStack> armor;
private final DefaultedList<ItemStack> hands;
public HumanInventory() {
super(56);
armor = DefaultedList.ofSize(4, ItemStack.EMPTY);
hands = DefaultedList.ofSize(2, ItemStack.EMPTY);
}
/*
* 3 - HELMET
* 2 - CHEST
* 1 - LEGS
* 0 - BOOTS
*/
public DefaultedList<ItemStack> getArmor() {
return armor;
}
public ItemStack getMainHandItemStack() {
return hands.get(0);
}
public ItemStack getOffHandItemStack() {
return hands.get(1);
}
public Hand getEmptyHand() {
if (getMainHandItemStack() == ItemStack.EMPTY) {
return Hand.MAIN_HAND;
} else if (getOffHandItemStack() == ItemStack.EMPTY) {
return Hand.OFF_HAND;
}
return null;
}
public void setMainHandItemStack(ItemStack stack) {
hands.set(0, stack);
}
public void setOffHandItemStack(ItemStack stack) {
hands.set(1, stack);
}
}
Java:
public class HumanEntity extends PassiveEntity {
private HumanInventory inventory;
public HumanEntity(World world) {
super(ModEntityType.HUMAN, world);
}
public HumanEntity(EntityType<Entity> entityEntityType, World world) {
super(ModEntityType.HUMAN, world);
inventory = new HumanInventory();
}
@Override
public Iterable<ItemStack> getArmorItems() {
return inventory.getArmor();
}
@Override
public ItemStack getMainHandStack() {
return inventory.getMainHandItemStack();
}
@Override
public ItemStack getOffHandStack() {
return inventory.getOffHandItemStack();
}
@Override
public ItemStack getStackInHand(Hand hand) {
return hand == Hand.OFF_HAND ? getOffHandStack() : getMainHandStack();
}
@Override
public Iterable<ItemStack> getItemsHand() {
return inventory.getHands();
}
@Override
public void setStackInHand(Hand hand, ItemStack stack) {
switch (hand) {
case OFF_HAND:
inventory.setOffHandItemStack(stack);
break;
case MAIN_HAND:
inventory.setMainHandItemStack(stack);
break;
}
}
@Override
public boolean canPickUpLoot() {
return true;
}
@Override
protected void equipLootStack(EquipmentSlot slot, ItemStack stack) {
if (stack.getItem() instanceof ArmorItem) {
equip(slot.getEntitySlotId(), stack);
} else {
Hand empty;
if (inventory.canInsert(stack)) {
inventory.addStack(stack);
} else if ((empty = inventory.getEmptyHand()) != null) {
setStackInHand(empty, stack);
}
}
}
@Override
public boolean equip(int slot, ItemStack item) {
DefaultedList<ItemStack> armor = inventory.getArmor();
if (slot == 5) {
inventory.setMainHandItemStack(item);
} else if (slot == 6) {
inventory.setOffHandItemStack(item);
} else if (slot == 0 || slot == 1 || slot == 2 || slot == 3) {
dropStack(armor.get(slot));
armor.set(slot, item);
} else {
return false;
}
return true;
}
@Override
public void onDeath(DamageSource source) {
for (ItemStack item: inventory.clearToList()) {
if (!world.isClient()) {
world.spawnEntity(new ItemEntity(world, getX(), getY(), getZ(), item));
}
}
for (ItemStack armor: inventory.getArmor()) {
if (!world.isClient()) {
world.spawnEntity(new ItemEntity(world, getX(), getY(), getZ(), armor));
}
}
dropStack(getMainHandStack());
dropStack(getOffHandStack());
super.onDeath(source);
}
@Nullable
@Override
public PassiveEntity createChild(ServerWorld world, PassiveEntity entity) {
return null;
}
}
Броня не отображается, и судя по всему даже не надевается на моба:
Java:
// Entity.class
public Iterable<ItemStack> getItemsEquipped() {
return Iterables.concat(this.getItemsHand(), this.getArmorItems());
}
// LivingEntity.class
public float getArmorVisibility() {
Iterable<ItemStack> iterable = this.getArmorItems();
int i = 0;
int j = 0;
for(Iterator var4 = iterable.iterator(); var4.hasNext(); ++i) {
ItemStack itemStack = (ItemStack)var4.next();
if (!itemStack.isEmpty()) {
++j;
}
}
return i > 0 ? (float)j / (float)i : 0.0F;
}