From 848f6ef66d48cff9fc53191dd236786f130c4630 Mon Sep 17 00:00:00 2001 From: Sollace Date: Fri, 29 May 2020 20:13:10 +0200 Subject: [PATCH] Fixed players data being lost when you respawn --- .../unicopia/entity/EntityPhysics.java | 9 ++++++- .../entity/player/PlayerPageStats.java | 10 ++++++-- .../unicopia/entity/player/Pony.java | 5 +++- .../mixin/MixinServerPlayerEntity.java | 24 +++++++++++++++++++ .../unicopia/util/Copieable.java | 5 ++++ src/main/resources/unicopia.mixin.json | 1 + 6 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/mixin/MixinServerPlayerEntity.java create mode 100644 src/main/java/com/minelittlepony/unicopia/util/Copieable.java diff --git a/src/main/java/com/minelittlepony/unicopia/entity/EntityPhysics.java b/src/main/java/com/minelittlepony/unicopia/entity/EntityPhysics.java index 45b8e918..e354bc79 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/EntityPhysics.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/EntityPhysics.java @@ -1,5 +1,7 @@ package com.minelittlepony.unicopia.entity; +import com.minelittlepony.unicopia.util.Copieable; + import net.minecraft.block.Block; import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockState; @@ -13,7 +15,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; -public class EntityPhysics & Owned> implements Physics { +public class EntityPhysics & Owned> implements Physics, Copieable> { private float gravity = 1; @@ -84,6 +86,11 @@ public class EntityPhysics & Owned> impl return gravity; } + @Override + public void copyFrom(EntityPhysics other) { + gravity = other.gravity; + } + @Override public void toNBT(CompoundTag compound) { if (gravity != 0) { diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPageStats.java b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPageStats.java index edf56e86..48ce6796 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPageStats.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPageStats.java @@ -5,12 +5,13 @@ import java.util.Map; import com.minelittlepony.unicopia.enchanting.PageOwner; import com.minelittlepony.unicopia.enchanting.PageState; +import com.minelittlepony.unicopia.util.Copieable; import com.minelittlepony.unicopia.util.NbtSerialisable; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.Identifier; -public class PlayerPageStats implements NbtSerialisable, PageOwner { +public class PlayerPageStats implements NbtSerialisable, Copieable, PageOwner { private final Map pageStates = new HashMap<>(); private final Pony pony; @@ -29,6 +30,12 @@ public class PlayerPageStats implements NbtSerialisable, PageOwner { pony.sendCapabilities(full); } + @Override + public void copyFrom(PlayerPageStats other) { + pageStates.clear(); + pageStates.putAll(other.pageStates); + } + @Override public void toNBT(CompoundTag compound) { if (!pageStates.isEmpty()) { @@ -63,5 +70,4 @@ public class PlayerPageStats implements NbtSerialisable, PageOwner { }); } } - } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java index 1a4c3853..71a62ae9 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -24,6 +24,7 @@ import com.minelittlepony.unicopia.network.MsgPlayerCapabilities; import com.minelittlepony.unicopia.network.Transmittable; import com.minelittlepony.unicopia.toxin.Toxicity; import com.minelittlepony.unicopia.toxin.Toxin; +import com.minelittlepony.unicopia.util.Copieable; import com.minelittlepony.util.BasicEasingInterpolator; import com.minelittlepony.util.IInterpolator; import com.mojang.authlib.GameProfile; @@ -47,7 +48,7 @@ import net.minecraft.util.Unit; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; -public class Pony implements Caster, Ponylike, Transmittable { +public class Pony implements Caster, Ponylike, Transmittable, Copieable { private static final TrackedData RACE = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.INTEGER); static final TrackedData ENERGY = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.FLOAT); @@ -363,9 +364,11 @@ public class Pony implements Caster, Ponylike, Trans pageStates.fromNBT(compound); } + @Override public void copyFrom(Pony oldPlayer) { setSpell(oldPlayer.getSpell()); setSpecies(oldPlayer.getSpecies()); + pageStates.copyFrom(oldPlayer.pageStates); setDirty(); } diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinServerPlayerEntity.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinServerPlayerEntity.java new file mode 100644 index 00000000..b9207af5 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinServerPlayerEntity.java @@ -0,0 +1,24 @@ +package com.minelittlepony.unicopia.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.minelittlepony.unicopia.ducks.PonyContainer; +import com.minelittlepony.unicopia.entity.player.Pony; + +import net.minecraft.container.ContainerListener; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.server.network.ServerPlayerEntity; + +@Mixin(ServerPlayerEntity.class) +abstract class MixinServerPlayerEntity extends PlayerEntity implements ContainerListener, PonyContainer { + MixinServerPlayerEntity() {super(null, null);} + + @SuppressWarnings("unchecked") + @Inject(method = "copyFrom(Lnet/minecraft/server/network/ServerPlayerEntity;Z)V", at = @At("HEAD")) + private void onCopyFrom(ServerPlayerEntity oldPlayer, boolean alive, CallbackInfo info) { + get().copyFrom(((PonyContainer)oldPlayer).get()); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/util/Copieable.java b/src/main/java/com/minelittlepony/unicopia/util/Copieable.java new file mode 100644 index 00000000..d91b5a26 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/util/Copieable.java @@ -0,0 +1,5 @@ +package com.minelittlepony.unicopia.util; + +public interface Copieable> { + void copyFrom(T other); +} diff --git a/src/main/resources/unicopia.mixin.json b/src/main/resources/unicopia.mixin.json index 91159bd5..ad24e9f9 100644 --- a/src/main/resources/unicopia.mixin.json +++ b/src/main/resources/unicopia.mixin.json @@ -17,6 +17,7 @@ "MixinLivingEntity", "MixinPlayerEntity", "MixinProjectileEntity", + "MixinServerPlayerEntity", "Walker" ], "client": [