From 881d648aa28956a606cc307e7dca15c27878c61c Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Sat, 21 Mar 2026 23:03:04 +0800 Subject: [PATCH 1/6] feat: add roll axis --- src/main/java/cam72cam/mod/entity/Entity.java | 40 ++++++++++++++++++- .../cam72cam/mod/entity/ModdedEntity.java | 30 ++++++++++++++ .../cam72cam/mod/render/EntityRenderer.java | 6 ++- 3 files changed, 72 insertions(+), 4 deletions(-) diff --git a/src/main/java/cam72cam/mod/entity/Entity.java b/src/main/java/cam72cam/mod/entity/Entity.java index 9e6f460dd..bbaabe584 100644 --- a/src/main/java/cam72cam/mod/entity/Entity.java +++ b/src/main/java/cam72cam/mod/entity/Entity.java @@ -7,9 +7,9 @@ import cam72cam.mod.world.World; import net.minecraft.entity.monster.EntityMob; import net.minecraft.entity.passive.EntityVillager; -import net.minecraft.util.DamageSource; +import net.minecraft.network.datasync.EntityDataManager; import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; import net.minecraft.world.Explosion; import java.util.List; @@ -26,6 +26,8 @@ public class Entity { /** The wrapped MC construct. Do not use directly */ public net.minecraft.entity.Entity internal; + private float rotationRoll; + /** Wrap a MC entity in UMC entity. Do not use directly. */ public Entity(net.minecraft.entity.Entity entity) { this.internal = entity; @@ -101,6 +103,33 @@ public void setRotationPitch(float pitch) { internal.rotationPitch = pitch; } + public float getRotationRoll() { + if (internal instanceof ModdedEntity) { + return internal.getDataManager().get(ModdedEntity.ROLL); + } + return 0f; + } + + public void setRotationRoll(float roll) { + if (internal instanceof ModdedEntity) { + EntityDataManager dataManager = internal.getDataManager(); + dataManager.set(ModdedEntity.PREV_ROLL, dataManager.get(ModdedEntity.ROLL)); + dataManager.set(ModdedEntity.ROLL, roll); + } + } + + public float getRotationYaw(float partialTicks) { + return (float) MathHelper.clampedLerp(internal.prevRotationYaw, internal.rotationYaw, partialTicks); + } + + public float getRotationPitch(float partialTicks) { + return (float) MathHelper.clampedLerp(internal.prevRotationPitch, internal.rotationPitch, partialTicks); + } + + public float getRotationRoll(float partialTicks) { + return (float) MathHelper.clampedLerp(getPrevRotationRoll(), getRotationRoll(), partialTicks); + } + public float getPrevRotationYaw() { return internal.prevRotationYaw; } @@ -109,6 +138,13 @@ public float getPrevRotationPitch() { return internal.prevRotationPitch; } + public float getPrevRotationRoll() { + if (internal instanceof ModdedEntity) { + return internal.getDataManager().get(ModdedEntity.PREV_ROLL); + } + return 0f; + } + Vec3d eyeCache; public Vec3d getPositionEyes() { if (eyeCache == null || ( diff --git a/src/main/java/cam72cam/mod/entity/ModdedEntity.java b/src/main/java/cam72cam/mod/entity/ModdedEntity.java index dfda57422..f493efb46 100644 --- a/src/main/java/cam72cam/mod/entity/ModdedEntity.java +++ b/src/main/java/cam72cam/mod/entity/ModdedEntity.java @@ -15,6 +15,9 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.datasync.DataParameter; +import net.minecraft.network.datasync.DataSerializers; +import net.minecraft.network.datasync.EntityDataManager; import net.minecraft.util.DamageSource; import net.minecraft.util.EnumHand; import net.minecraft.util.math.AxisAlignedBB; @@ -30,6 +33,9 @@ /** Internal class which extends MC's Entity. Do not use directly */ public class ModdedEntity extends Entity implements IEntityAdditionalSpawnData { + static final DataParameter PREV_ROLL = EntityDataManager.createKey(ModdedEntity.class, DataSerializers.FLOAT); + static final DataParameter ROLL = EntityDataManager.createKey(ModdedEntity.class, DataSerializers.FLOAT); + // Reference to the entity that this is representing private CustomEntity self; @@ -37,6 +43,11 @@ public class ModdedEntity extends Entity implements IEntityAdditionalSpawnData { @TagField(value = "passengers", mapper = PassengerMapper.class) private Map passengerPositions = new HashMap<>(); + @TagField + private float roll; + @TagField + private float prevRoll; + // All of the known seats attached to this entity private final List seats = new ArrayList<>(); @@ -70,6 +81,8 @@ public ModdedEntity(World world) { super(world); super.preventEntitySpawning = true; + this.dataManager.register(ROLL, 0f); + this.dataManager.register(PREV_ROLL, 0f); } @Override @@ -129,6 +142,11 @@ private void load(TagCompound data) { ModCore.catching(e, "Error during entity load: %s - %s", this, data); } + if (!this.world.isRemote) { + dataManager.set(ROLL, this.roll); + dataManager.set(PREV_ROLL, this.prevRoll); + } + TagCompound selfData = data.get("selfData"); if (selfData == null) { // Old style used to save everything in one giant NBT blob. New versions save self in a sub tag. @@ -162,6 +180,11 @@ protected final void writeEntityToNBT(NBTTagCompound compound) { */ private void save(TagCompound data) { data.setString("custom_mob_type", type); + if (!this.world.isRemote) { + this.roll = dataManager.get(ROLL); + this.prevRoll = dataManager.get(PREV_ROLL); + } + try { TagSerializer.serialize(data, this); } catch (SerializationException e) { @@ -226,6 +249,13 @@ public final void writeSpawnData(ByteBuf buffer) { @Override public final void onUpdate() { iTickable.onTick(); + + if (iTickable instanceof cam72cam.mod.entity.Entity) { + cam72cam.mod.entity.Entity moddedEntity = (cam72cam.mod.entity.Entity) iTickable; + moddedEntity.setRotationRoll(moddedEntity.getRotationRoll() + 10); + } + + this.dataManager.set(PREV_ROLL, this.dataManager.get(ROLL)); try { self.sync.send(); } catch (SerializationException e) { diff --git a/src/main/java/cam72cam/mod/render/EntityRenderer.java b/src/main/java/cam72cam/mod/render/EntityRenderer.java index 7ff9cc8c8..03a2f6f2c 100644 --- a/src/main/java/cam72cam/mod/render/EntityRenderer.java +++ b/src/main/java/cam72cam/mod/render/EntityRenderer.java @@ -102,7 +102,8 @@ public void doRender(ModdedEntity stock, double x, double y, double z, float ent RenderState state = new RenderState(); state.translate(x, y, z); state.rotate(180 - entityYaw, 0, 1, 0); - state.rotate(self.getRotationPitch(), 1, 0, 0); + state.rotate(self.getRotationPitch(partialTicks), 1, 0, 0); + state.rotate(self.getRotationRoll(partialTicks), 0, 0, 1); state.rotate(-90, 0, 1, 0); state.stage(RenderContext.Stage.ENTITY); renderers.get(self.getClass()).render(self, state, partialTicks); @@ -120,7 +121,8 @@ public void renderMultipass(ModdedEntity stock, double x, double y, double z, fl RenderState state = new RenderState(); state.translate(x, y, z); state.rotate(180 - entityYaw, 0, 1, 0); - state.rotate(self.getRotationPitch(), 1, 0, 0); + state.rotate(self.getRotationPitch(partialTicks), 1, 0, 0); + state.rotate(self.getRotationRoll(partialTicks), 0, 0, 1); state.rotate(-90, 0, 1, 0); state.stage(RenderContext.Stage.ENTITY); renderers.get(self.getClass()).postRender(self, state, partialTicks); From 8b2666cfe3820406a7deb62eda3ea77c3273acff Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Sun, 22 Mar 2026 14:08:07 +0800 Subject: [PATCH 2/6] remove testing code --- src/main/java/cam72cam/mod/entity/ModdedEntity.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/cam72cam/mod/entity/ModdedEntity.java b/src/main/java/cam72cam/mod/entity/ModdedEntity.java index f493efb46..f209c3f62 100644 --- a/src/main/java/cam72cam/mod/entity/ModdedEntity.java +++ b/src/main/java/cam72cam/mod/entity/ModdedEntity.java @@ -249,12 +249,6 @@ public final void writeSpawnData(ByteBuf buffer) { @Override public final void onUpdate() { iTickable.onTick(); - - if (iTickable instanceof cam72cam.mod.entity.Entity) { - cam72cam.mod.entity.Entity moddedEntity = (cam72cam.mod.entity.Entity) iTickable; - moddedEntity.setRotationRoll(moddedEntity.getRotationRoll() + 10); - } - this.dataManager.set(PREV_ROLL, this.dataManager.get(ROLL)); try { self.sync.send(); From a03a15c760c2df848ef977a4bf2ece6b7d2feb7d Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Sun, 22 Mar 2026 14:31:12 +0800 Subject: [PATCH 3/6] fix: restrict degrees range --- src/main/java/cam72cam/mod/entity/Entity.java | 32 ++++++++++++++----- .../cam72cam/mod/entity/ModdedEntity.java | 7 ++-- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/main/java/cam72cam/mod/entity/Entity.java b/src/main/java/cam72cam/mod/entity/Entity.java index bbaabe584..44bb6a97e 100644 --- a/src/main/java/cam72cam/mod/entity/Entity.java +++ b/src/main/java/cam72cam/mod/entity/Entity.java @@ -81,17 +81,15 @@ public float getRotationYaw() { public void setRotationYaw(float yaw) { internal.prevRotationYaw = internal.rotationYaw; internal.rotationYaw = yaw; - double d0 = internal.prevRotationYaw - yaw; - if (d0 < -180.0D) - { - internal.prevRotationYaw += 360.0F; - } - if (d0 >= 180.0D) + while (internal.rotationYaw - internal.prevRotationYaw < -180.0F) { internal.prevRotationYaw -= 360.0F; } - + while (internal.rotationYaw - internal.prevRotationYaw >= 180.0F) + { + internal.prevRotationYaw += 360.0F; + } } public float getRotationPitch() { @@ -101,6 +99,15 @@ public float getRotationPitch() { public void setRotationPitch(float pitch) { internal.prevRotationPitch = internal.rotationPitch; internal.rotationPitch = pitch; + + while (internal.rotationPitch - internal.prevRotationPitch < -180.0F) + { + internal.prevRotationPitch -= 360.0F; + } + while (internal.rotationPitch - internal.prevRotationPitch >= 180.0F) + { + internal.prevRotationPitch += 360.0F; + } } public float getRotationRoll() { @@ -113,7 +120,16 @@ public float getRotationRoll() { public void setRotationRoll(float roll) { if (internal instanceof ModdedEntity) { EntityDataManager dataManager = internal.getDataManager(); - dataManager.set(ModdedEntity.PREV_ROLL, dataManager.get(ModdedEntity.ROLL)); + float prevRoll = dataManager.get(ModdedEntity.PREV_ROLL); + while (roll - prevRoll < -180.0F) + { + prevRoll -= 360.0F; + } + while (roll - prevRoll >= 180.0F) + { + prevRoll += 360.0F; + } + dataManager.set(ModdedEntity.PREV_ROLL, prevRoll); dataManager.set(ModdedEntity.ROLL, roll); } } diff --git a/src/main/java/cam72cam/mod/entity/ModdedEntity.java b/src/main/java/cam72cam/mod/entity/ModdedEntity.java index f209c3f62..82ec9d193 100644 --- a/src/main/java/cam72cam/mod/entity/ModdedEntity.java +++ b/src/main/java/cam72cam/mod/entity/ModdedEntity.java @@ -33,9 +33,6 @@ /** Internal class which extends MC's Entity. Do not use directly */ public class ModdedEntity extends Entity implements IEntityAdditionalSpawnData { - static final DataParameter PREV_ROLL = EntityDataManager.createKey(ModdedEntity.class, DataSerializers.FLOAT); - static final DataParameter ROLL = EntityDataManager.createKey(ModdedEntity.class, DataSerializers.FLOAT); - // Reference to the entity that this is representing private CustomEntity self; @@ -43,6 +40,10 @@ public class ModdedEntity extends Entity implements IEntityAdditionalSpawnData { @TagField(value = "passengers", mapper = PassengerMapper.class) private Map passengerPositions = new HashMap<>(); + //For data sync + static final DataParameter PREV_ROLL = EntityDataManager.createKey(ModdedEntity.class, DataSerializers.FLOAT); + static final DataParameter ROLL = EntityDataManager.createKey(ModdedEntity.class, DataSerializers.FLOAT); + //For data storage @TagField private float roll; @TagField From bf8c5662f2217d34f856ad1f5e6e140da13d6ef3 Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Mon, 30 Mar 2026 20:14:18 +0800 Subject: [PATCH 4/6] ref: remove unnecessary side check --- src/main/java/cam72cam/mod/entity/ModdedEntity.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/cam72cam/mod/entity/ModdedEntity.java b/src/main/java/cam72cam/mod/entity/ModdedEntity.java index 82ec9d193..ef00f8c3b 100644 --- a/src/main/java/cam72cam/mod/entity/ModdedEntity.java +++ b/src/main/java/cam72cam/mod/entity/ModdedEntity.java @@ -181,10 +181,8 @@ protected final void writeEntityToNBT(NBTTagCompound compound) { */ private void save(TagCompound data) { data.setString("custom_mob_type", type); - if (!this.world.isRemote) { - this.roll = dataManager.get(ROLL); - this.prevRoll = dataManager.get(PREV_ROLL); - } + this.roll = dataManager.get(ROLL); + this.prevRoll = dataManager.get(PREV_ROLL); try { TagSerializer.serialize(data, this); From 953247aba04b640d695a92b65e28fbeecd037376 Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Thu, 16 Apr 2026 19:23:11 +0800 Subject: [PATCH 5/6] ref: roll implementation --- .../cam72cam/mod/entity/CustomEntity.java | 44 ++++++++++++- src/main/java/cam72cam/mod/entity/Entity.java | 66 +++++++------------ .../cam72cam/mod/entity/ModdedEntity.java | 22 +------ 3 files changed, 69 insertions(+), 63 deletions(-) diff --git a/src/main/java/cam72cam/mod/entity/CustomEntity.java b/src/main/java/cam72cam/mod/entity/CustomEntity.java index 9ed08d116..991c97e72 100644 --- a/src/main/java/cam72cam/mod/entity/CustomEntity.java +++ b/src/main/java/cam72cam/mod/entity/CustomEntity.java @@ -1,7 +1,9 @@ package cam72cam.mod.entity; import cam72cam.mod.entity.sync.EntitySync; -import cam72cam.mod.world.World; +import cam72cam.mod.entity.sync.TagSync; +import cam72cam.mod.serialization.TagField; +import net.minecraft.util.math.MathHelper; import java.util.List; @@ -17,6 +19,14 @@ public class CustomEntity extends Entity { /** Data that is automatically synchronized from server to client on tick */ public final EntitySync sync; + /** Internal roll implementation */ + @TagField + @TagSync + private float rotationRoll; + @TagField + @TagSync + private float prevRotationRoll; + /** Do not use directly. Construct via world on ModdedEntity load */ protected CustomEntity() { super(null); @@ -89,4 +99,36 @@ public List getPassengers() { return internal.getActualPassengers(); } + @Override + public float getRotationRoll() { + return rotationRoll; + } + + @Override + public void setRotationRoll(float roll) { + this.prevRotationRoll = this.rotationRoll; + this.rotationRoll = roll; + while (roll - prevRotationRoll < -180.0F) + { + prevRotationRoll -= 360.0F; + } + while (roll - prevRotationRoll >= 180.0F) + { + prevRotationRoll += 360.0F; + } + } + + @Override + public float getRotationRoll(float partialTicks) { + return (float) MathHelper.clampedLerp(prevRotationRoll, rotationRoll, partialTicks); + } + + @Override + public float getPrevRotationRoll() { + return prevRotationRoll; + } + + void tickRoll() { + this.prevRotationRoll = this.rotationRoll; + } } diff --git a/src/main/java/cam72cam/mod/entity/Entity.java b/src/main/java/cam72cam/mod/entity/Entity.java index 44bb6a97e..b8664c3fd 100644 --- a/src/main/java/cam72cam/mod/entity/Entity.java +++ b/src/main/java/cam72cam/mod/entity/Entity.java @@ -1,8 +1,10 @@ package cam72cam.mod.entity; import cam72cam.mod.entity.boundingbox.IBoundingBox; +import cam72cam.mod.entity.sync.TagSync; import cam72cam.mod.math.Vec3d; import cam72cam.mod.math.Vec3i; +import cam72cam.mod.serialization.TagField; import cam72cam.mod.util.SingleCache; import cam72cam.mod.world.World; import net.minecraft.entity.monster.EntityMob; @@ -26,8 +28,6 @@ public class Entity { /** The wrapped MC construct. Do not use directly */ public net.minecraft.entity.Entity internal; - private float rotationRoll; - /** Wrap a MC entity in UMC entity. Do not use directly. */ public Entity(net.minecraft.entity.Entity entity) { this.internal = entity; @@ -78,6 +78,26 @@ public float getRotationYaw() { return internal.rotationYaw; } + public float getRotationPitch() { + return internal.rotationPitch; + } + + public float getRotationRoll() { + return 0; + } + + public float getRotationYaw(float partialTicks) { + return (float) MathHelper.clampedLerp(internal.prevRotationYaw, internal.rotationYaw, partialTicks); + } + + public float getRotationPitch(float partialTicks) { + return (float) MathHelper.clampedLerp(internal.prevRotationPitch, internal.rotationPitch, partialTicks); + } + + public float getRotationRoll(float partialTicks) { + return 0; + } + public void setRotationYaw(float yaw) { internal.prevRotationYaw = internal.rotationYaw; internal.rotationYaw = yaw; @@ -92,10 +112,6 @@ public void setRotationYaw(float yaw) { } } - public float getRotationPitch() { - return internal.rotationPitch; - } - public void setRotationPitch(float pitch) { internal.prevRotationPitch = internal.rotationPitch; internal.rotationPitch = pitch; @@ -110,40 +126,7 @@ public void setRotationPitch(float pitch) { } } - public float getRotationRoll() { - if (internal instanceof ModdedEntity) { - return internal.getDataManager().get(ModdedEntity.ROLL); - } - return 0f; - } - public void setRotationRoll(float roll) { - if (internal instanceof ModdedEntity) { - EntityDataManager dataManager = internal.getDataManager(); - float prevRoll = dataManager.get(ModdedEntity.PREV_ROLL); - while (roll - prevRoll < -180.0F) - { - prevRoll -= 360.0F; - } - while (roll - prevRoll >= 180.0F) - { - prevRoll += 360.0F; - } - dataManager.set(ModdedEntity.PREV_ROLL, prevRoll); - dataManager.set(ModdedEntity.ROLL, roll); - } - } - - public float getRotationYaw(float partialTicks) { - return (float) MathHelper.clampedLerp(internal.prevRotationYaw, internal.rotationYaw, partialTicks); - } - - public float getRotationPitch(float partialTicks) { - return (float) MathHelper.clampedLerp(internal.prevRotationPitch, internal.rotationPitch, partialTicks); - } - - public float getRotationRoll(float partialTicks) { - return (float) MathHelper.clampedLerp(getPrevRotationRoll(), getRotationRoll(), partialTicks); } public float getPrevRotationYaw() { @@ -155,10 +138,7 @@ public float getPrevRotationPitch() { } public float getPrevRotationRoll() { - if (internal instanceof ModdedEntity) { - return internal.getDataManager().get(ModdedEntity.PREV_ROLL); - } - return 0f; + return 0; } Vec3d eyeCache; diff --git a/src/main/java/cam72cam/mod/entity/ModdedEntity.java b/src/main/java/cam72cam/mod/entity/ModdedEntity.java index ef00f8c3b..ec13df6c6 100644 --- a/src/main/java/cam72cam/mod/entity/ModdedEntity.java +++ b/src/main/java/cam72cam/mod/entity/ModdedEntity.java @@ -40,15 +40,6 @@ public class ModdedEntity extends Entity implements IEntityAdditionalSpawnData { @TagField(value = "passengers", mapper = PassengerMapper.class) private Map passengerPositions = new HashMap<>(); - //For data sync - static final DataParameter PREV_ROLL = EntityDataManager.createKey(ModdedEntity.class, DataSerializers.FLOAT); - static final DataParameter ROLL = EntityDataManager.createKey(ModdedEntity.class, DataSerializers.FLOAT); - //For data storage - @TagField - private float roll; - @TagField - private float prevRoll; - // All of the known seats attached to this entity private final List seats = new ArrayList<>(); @@ -82,8 +73,6 @@ public ModdedEntity(World world) { super(world); super.preventEntitySpawning = true; - this.dataManager.register(ROLL, 0f); - this.dataManager.register(PREV_ROLL, 0f); } @Override @@ -143,11 +132,6 @@ private void load(TagCompound data) { ModCore.catching(e, "Error during entity load: %s - %s", this, data); } - if (!this.world.isRemote) { - dataManager.set(ROLL, this.roll); - dataManager.set(PREV_ROLL, this.prevRoll); - } - TagCompound selfData = data.get("selfData"); if (selfData == null) { // Old style used to save everything in one giant NBT blob. New versions save self in a sub tag. @@ -181,8 +165,6 @@ protected final void writeEntityToNBT(NBTTagCompound compound) { */ private void save(TagCompound data) { data.setString("custom_mob_type", type); - this.roll = dataManager.get(ROLL); - this.prevRoll = dataManager.get(PREV_ROLL); try { TagSerializer.serialize(data, this); @@ -248,7 +230,9 @@ public final void writeSpawnData(ByteBuf buffer) { @Override public final void onUpdate() { iTickable.onTick(); - this.dataManager.set(PREV_ROLL, this.dataManager.get(ROLL)); + if (!this.world.isRemote) { + self.tickRoll(); + } try { self.sync.send(); } catch (SerializationException e) { From 29adb36ae973d0463f920f1e9187b3f1389c67e2 Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Thu, 16 Apr 2026 20:08:26 +0800 Subject: [PATCH 6/6] fix: sync roll separately --- src/main/java/cam72cam/mod/ModCore.java | 2 ++ .../cam72cam/mod/entity/CustomEntity.java | 36 ++++++++++++++++--- .../cam72cam/mod/entity/ModdedEntity.java | 2 ++ .../cam72cam/mod/entity/sync/EntitySync.java | 9 +++-- 4 files changed, 42 insertions(+), 7 deletions(-) diff --git a/src/main/java/cam72cam/mod/ModCore.java b/src/main/java/cam72cam/mod/ModCore.java index aceb15296..0b624ce0c 100644 --- a/src/main/java/cam72cam/mod/ModCore.java +++ b/src/main/java/cam72cam/mod/ModCore.java @@ -1,6 +1,7 @@ package cam72cam.mod; import cam72cam.mod.config.ConfigFile; +import cam72cam.mod.entity.CustomEntity; import cam72cam.mod.entity.ModdedEntity; import cam72cam.mod.entity.sync.EntitySync; import cam72cam.mod.event.ClientEvents; @@ -256,6 +257,7 @@ public void commonEvent(ModEvent event) { Packet.register(ModdedEntity.PassengerPositionsPacket::new, PacketDirection.ServerToClient); Packet.register(ModdedEntity.PassengerSeatPacket::new, PacketDirection.ServerToClient); Packet.register(Mouse.MousePressPacket::new, PacketDirection.ClientToServer); + Packet.register(CustomEntity.RollPacket::new, PacketDirection.ServerToClient); Command.register(new ModCoreCommand()); Light.register(); ConfigFile.sync(Config.class); diff --git a/src/main/java/cam72cam/mod/entity/CustomEntity.java b/src/main/java/cam72cam/mod/entity/CustomEntity.java index 991c97e72..409877780 100644 --- a/src/main/java/cam72cam/mod/entity/CustomEntity.java +++ b/src/main/java/cam72cam/mod/entity/CustomEntity.java @@ -2,10 +2,15 @@ import cam72cam.mod.entity.sync.EntitySync; import cam72cam.mod.entity.sync.TagSync; +import cam72cam.mod.math.Vec3d; +import cam72cam.mod.net.Packet; import cam72cam.mod.serialization.TagField; import net.minecraft.util.math.MathHelper; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.UUID; /** * Implement to create a custom modded entity @@ -21,10 +26,8 @@ public class CustomEntity extends Entity { /** Internal roll implementation */ @TagField - @TagSync private float rotationRoll; @TagField - @TagSync private float prevRotationRoll; /** Do not use directly. Construct via world on ModdedEntity load */ @@ -128,7 +131,32 @@ public float getPrevRotationRoll() { return prevRotationRoll; } - void tickRoll() { - this.prevRotationRoll = this.rotationRoll; + public void tickRoll() { + this.prevRotationRoll = rotationRoll; + } + + public static class RollPacket extends Packet { + @TagField("t") + private CustomEntity target; + @TagField("r") + private float roll; + @TagField("p") + private float prevRoll; + + public RollPacket() {} + + public RollPacket(CustomEntity entity) { + this.target = entity; + this.roll = entity.rotationRoll; + this.prevRoll = entity.prevRotationRoll; + } + + @Override + public void handle() { + if (target != null && target.internal instanceof ModdedEntity) { + target.rotationRoll = roll; + target.prevRotationRoll = prevRoll; + } + } } } diff --git a/src/main/java/cam72cam/mod/entity/ModdedEntity.java b/src/main/java/cam72cam/mod/entity/ModdedEntity.java index ec13df6c6..078ffa7f7 100644 --- a/src/main/java/cam72cam/mod/entity/ModdedEntity.java +++ b/src/main/java/cam72cam/mod/entity/ModdedEntity.java @@ -232,6 +232,8 @@ public final void onUpdate() { iTickable.onTick(); if (!this.world.isRemote) { self.tickRoll(); + self.setRotationRoll(self.getRotationRoll() + 5); + new CustomEntity.RollPacket(self).sendToObserving(self); } try { self.sync.send(); diff --git a/src/main/java/cam72cam/mod/entity/sync/EntitySync.java b/src/main/java/cam72cam/mod/entity/sync/EntitySync.java index 68af450ae..5aeea9b5f 100644 --- a/src/main/java/cam72cam/mod/entity/sync/EntitySync.java +++ b/src/main/java/cam72cam/mod/entity/sync/EntitySync.java @@ -63,13 +63,16 @@ public void send() throws SerializationException { .collect(Object2IntOpenHashMap::new, (m, f) -> { TagSync tag = f.getAnnotation(TagSync.class); - TagField tagField = f.getAnnotation(TagField.class); + String name = f.getAnnotation(TagField.class).value(); + if ("".equals(name)) { + name = f.getName(); + } Class type = f.getType(); if (type == float.class || type == Float.class) { - m.put(tagField.value(), Math.max(0, Math.min(tag.floatPrecision(), 8))); + m.put(name, Math.max(0, Math.min(tag.floatPrecision(), 8))); } else if (type == double.class || type == Double.class) { - m.put(tagField.value(), Math.max(0, Math.min(tag.doublePrecision(), 8))); + m.put(name, Math.max(0, Math.min(tag.doublePrecision(), 8))); } }, Object2IntOpenHashMap::putAll);