- 1
- 0
Всем привет.
Я пишу мод, в котором мне необходимо создать что-то вроде голограммы сущности(именно LivingEntity). Т.е взять рендер ванильной/модовой сущности и перенести его на свою.
С этим проблем нет, но дело в том, что если эта сущность будет находится далеко от голограммы, то клиенту не будут слаться пакеты синхронизации.
Такой вопрос, как сделать так, чтобы помимо ванильной синхронизации сущности с клиентом на позицию где она находится, пакеты синхронизации слались и на позицию голограммы.
Если что, позиция на которой должна находиться голограмма просто хранится в капе самой сущности.
Вот код самой сущности-голограммы:
Я пишу мод, в котором мне необходимо создать что-то вроде голограммы сущности(именно LivingEntity). Т.е взять рендер ванильной/модовой сущности и перенести его на свою.
С этим проблем нет, но дело в том, что если эта сущность будет находится далеко от голограммы, то клиенту не будут слаться пакеты синхронизации.
Такой вопрос, как сделать так, чтобы помимо ванильной синхронизации сущности с клиентом на позицию где она находится, пакеты синхронизации слались и на позицию голограммы.
Если что, позиция на которой должна находиться голограмма просто хранится в капе самой сущности.
Вот код самой сущности-голограммы:
Java:
public class EntityHologram extends LivingEntity
{
private static final DataParameter<Optional<UUID>> UUID = EntityDataManager.defineId(EntityHologram.class, DataSerializers.OPTIONAL_UUID);
private final NonNullList<ItemStack> handItems = NonNullList.withSize(2, ItemStack.EMPTY);
private final NonNullList<ItemStack> armorItems = NonNullList.withSize(4, ItemStack.EMPTY);
public EntityHologram(EntityType<? extends LivingEntity> type, World level)
{
super(type, level);
}
@Override
public boolean attackable() {
return false;
}
@Override
protected void defineSynchedData()
{
super.defineSynchedData();
this.entityData.define(UUID, Optional.empty());
}
public static AttributeModifierMap.MutableAttribute createAttributes()
{
return LivingEntity.createLivingAttributes()
.add(Attributes.ATTACK_DAMAGE, 1.0D)
.add(Attributes.MOVEMENT_SPEED, 0.1F).add(Attributes.ATTACK_SPEED)
.add(Attributes.LUCK)
.add(net.minecraftforge.common.ForgeMod.REACH_DISTANCE.get())
.add(Attributes.ATTACK_KNOCKBACK)
.add(Attributes.MAX_HEALTH, 20f);
}
@Override
public void knockback(float p_233627_1_, double p_233627_2_, double p_233627_4_) {}
@Override
public PushReaction getPistonPushReaction()
{
return PushReaction.IGNORE;
}
@Override
public float getEyeHeightAccess(Pose pose, EntitySize size)
{
return size.height*0.35F;
}
@Override
public Iterable<ItemStack> getArmorSlots()
{
return this.armorItems;
}
@Override
public boolean canChangeDimensions() {
return false;
}
@Override
public boolean isPushable() {
return false;
}
@Override
public void push(double p_70024_1_, double p_70024_3_, double p_70024_5_) {}
@Override
public boolean isPushedByFluid() {
return false;
}
@Override
public void readAdditionalSaveData(CompoundNBT nbt)
{
super.readAdditionalSaveData(nbt);
if (nbt.contains("HandItems", 9))
{
ListNBT nbtList = nbt.getList("HandItems", 10);
for(int j = 0; j < this.handItems.size(); ++j) this.handItems.set(j, ItemStack.of(nbtList.getCompound(j)));
}
if (nbt.contains("ArmorItems", 9))
{
ListNBT nbtList = nbt.getList("ArmorItems", 10);
for(int i = 0; i < this.armorItems.size(); ++i) this.armorItems.set(i, ItemStack.of(nbtList.getCompound(i)));
}
}
@Override
public void addAdditionalSaveData(CompoundNBT nbt)
{
super.addAdditionalSaveData(nbt);
ListNBT listnbt = new ListNBT();
for(ItemStack itemstack : this.armorItems) {
CompoundNBT compoundnbt = new CompoundNBT();
if (!itemstack.isEmpty()) itemstack.save(compoundnbt);
listnbt.add(compoundnbt);
}
nbt.put("ArmorItems", listnbt);
ListNBT listnbt1 = new ListNBT();
for(ItemStack itemstack1 : this.handItems) {
CompoundNBT compoundnbt1 = new CompoundNBT();
if (!itemstack1.isEmpty()) itemstack1.save(compoundnbt1);
listnbt1.add(compoundnbt1);
}
}
@Override
protected boolean canRide(Entity entity)
{
return false;
}
@Override
public ItemStack getItemBySlot(EquipmentSlotType type)
{
switch(type.getType())
{
case HAND:
return this.handItems.get(type.getIndex());
case ARMOR:
return this.armorItems.get(type.getIndex());
default:
return ItemStack.EMPTY;
}
}
@Override
public void setItemSlot(EquipmentSlotType type, ItemStack stack)
{
switch(type.getType()) {
case HAND:
this.handItems.set(type.getIndex(), stack);
break;
case ARMOR:
this.armorItems.set(type.getIndex(), stack);
}
}
@Override
public HandSide getMainArm() {
return HandSide.RIGHT;
}
}