diff --git a/common/src/main/java/vice/sol_valheim/accessors/PlayerEntityMixinDataAccessor.java b/common/src/main/java/vice/sol_valheim/accessors/PlayerEntityMixinDataAccessor.java index a1e3589..fea243f 100644 --- a/common/src/main/java/vice/sol_valheim/accessors/PlayerEntityMixinDataAccessor.java +++ b/common/src/main/java/vice/sol_valheim/accessors/PlayerEntityMixinDataAccessor.java @@ -1,12 +1,7 @@ package vice.sol_valheim.accessors; -import com.mojang.authlib.minecraft.client.MinecraftClient; -import net.minecraft.world.entity.player.Player; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; import vice.sol_valheim.ValheimFoodData; -public interface PlayerEntityMixinDataAccessor -{ +public interface PlayerEntityMixinDataAccessor { ValheimFoodData sol_valheim$getFoodData(); } diff --git a/common/src/main/java/vice/sol_valheim/extenders/SynchedEntityDataExtender.java b/common/src/main/java/vice/sol_valheim/extenders/SynchedEntityDataExtender.java new file mode 100644 index 0000000..7318bf7 --- /dev/null +++ b/common/src/main/java/vice/sol_valheim/extenders/SynchedEntityDataExtender.java @@ -0,0 +1,7 @@ +package vice.sol_valheim.extenders; + +import net.minecraft.network.syncher.EntityDataAccessor; + +public interface SynchedEntityDataExtender { + void set(EntityDataAccessor key, T value, boolean force); +} diff --git a/common/src/main/java/vice/sol_valheim/mixin/PlayerEntityMixin.java b/common/src/main/java/vice/sol_valheim/mixin/PlayerEntityMixin.java index 201bf12..67228a6 100644 --- a/common/src/main/java/vice/sol_valheim/mixin/PlayerEntityMixin.java +++ b/common/src/main/java/vice/sol_valheim/mixin/PlayerEntityMixin.java @@ -23,6 +23,7 @@ import vice.sol_valheim.accessors.FoodDataPlayerAccessor; import vice.sol_valheim.accessors.PlayerEntityMixinDataAccessor; import vice.sol_valheim.ValheimFoodData; +import vice.sol_valheim.extenders.SynchedEntityDataExtender; import java.util.ArrayList; import java.util.stream.Collectors; @@ -166,7 +167,7 @@ private void onReadCustomData(CompoundTag nbt, CallbackInfo info) { private void sol_valheim$trackData() { #if PRE_CURRENT_MC_1_19_2 - this.entityData.set(sol_valheim$DATA_ACCESSOR, sol_valheim$food_data); + ((SynchedEntityDataExtender) this.entityData).set(sol_valheim$DATA_ACCESSOR, sol_valheim$food_data, true); #elif POST_CURRENT_MC_1_20_1 this.entityData.set(sol_valheim$DATA_ACCESSOR, sol_valheim$food_data, true); #endif diff --git a/common/src/main/java/vice/sol_valheim/mixin/SynchedEntityDataMixin.java b/common/src/main/java/vice/sol_valheim/mixin/SynchedEntityDataMixin.java new file mode 100644 index 0000000..784d2cb --- /dev/null +++ b/common/src/main/java/vice/sol_valheim/mixin/SynchedEntityDataMixin.java @@ -0,0 +1,26 @@ +package vice.sol_valheim.mixin; + +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.SynchedEntityData; +import org.apache.commons.lang3.ObjectUtils; +import org.spongepowered.asm.mixin.Mixin; +import vice.sol_valheim.extenders.SynchedEntityDataExtender; + +@Mixin(SynchedEntityData.class) +public abstract class SynchedEntityDataMixin implements SynchedEntityDataExtender { + #if PRE_CURRENT_MC_1_19_2 + + @Override + public void set(EntityDataAccessor key, T value, boolean force) { + SynchedEntityData thisObject = (SynchedEntityData)(Object)this; + + SynchedEntityData.DataItem dataItem = thisObject.getItem(key); + if (force || ObjectUtils.notEqual(value, dataItem.getValue())) { + dataItem.setValue(value); + thisObject.entity.onSyncedDataUpdated(key); + dataItem.setDirty(true); + thisObject.isDirty = true; + } + } + #endif +} diff --git a/common/src/main/resources/1_19_2.sol_valheim.aw b/common/src/main/resources/1_19_2.sol_valheim.aw index 13268c3..7992518 100644 --- a/common/src/main/resources/1_19_2.sol_valheim.aw +++ b/common/src/main/resources/1_19_2.sol_valheim.aw @@ -1 +1,4 @@ -accessWidener v2 named \ No newline at end of file +accessWidener v2 named +accessible method net/minecraft/network/syncher/SynchedEntityData getItem (Lnet/minecraft/network/syncher/EntityDataAccessor;)Lnet/minecraft/network/syncher/SynchedEntityData$DataItem; +accessible field net/minecraft/network/syncher/SynchedEntityData entity Lnet/minecraft/world/entity/Entity; +accessible field net/minecraft/network/syncher/SynchedEntityData isDirty Z diff --git a/common/src/main/resources/sol_valheim-common.mixins.json b/common/src/main/resources/sol_valheim-common.mixins.json index 8dc2694..725b775 100644 --- a/common/src/main/resources/sol_valheim-common.mixins.json +++ b/common/src/main/resources/sol_valheim-common.mixins.json @@ -10,7 +10,8 @@ "LivingEntityDamageAccessor", "PlayerEntityMixin", "ServerLevelMixin", - "ServerPlayerMixin" + "ServerPlayerMixin", + "SynchedEntityDataMixin" ], "client": [ "LocalPlayerMixin" diff --git a/common/src/main/resources/sol_valheim.accesswidener b/common/src/main/resources/sol_valheim.accesswidener index 0bc60e7..1d67ba3 100644 --- a/common/src/main/resources/sol_valheim.accesswidener +++ b/common/src/main/resources/sol_valheim.accesswidener @@ -1,3 +1,7 @@ -accessWidener v2 named +accessWidener v2 named +accessible method net/minecraft/network/syncher/SynchedEntityData getItem (Lnet/minecraft/network/syncher/EntityDataAccessor;)Lnet/minecraft/network/syncher/SynchedEntityData$DataItem; +accessible field net/minecraft/network/syncher/SynchedEntityData entity Lnet/minecraft/world/entity/Entity; +accessible field net/minecraft/network/syncher/SynchedEntityData isDirty Z + # DO NOT EDIT -# Generated by the build script. Edit 1_20_1.sol_valheim.aw instead! \ No newline at end of file +# Generated by the build script. Edit 1_19_2.sol_valheim.aw instead! \ No newline at end of file