From ff23276f8f343b98e81fa3a8cd4411a2ab932267 Mon Sep 17 00:00:00 2001 From: Sotr Date: Sat, 9 Jun 2018 17:28:16 +0800 Subject: [PATCH] Cached tameable owner --- .../mixin/core/MixinEntityHorseAbstract.java | 44 +++++++++++++++++++ .../mixin/core/MixinEntityTameableAnimal.java | 44 +++++++++++++++++++ .../mixin/core/MixinMinecraftServer.java | 2 + .../main/resources/mixins.akarin.core.json | 2 + 4 files changed, 92 insertions(+) create mode 100644 sources/src/main/java/io/akarin/server/mixin/core/MixinEntityHorseAbstract.java create mode 100644 sources/src/main/java/io/akarin/server/mixin/core/MixinEntityTameableAnimal.java diff --git a/sources/src/main/java/io/akarin/server/mixin/core/MixinEntityHorseAbstract.java b/sources/src/main/java/io/akarin/server/mixin/core/MixinEntityHorseAbstract.java new file mode 100644 index 000000000..21f17bc15 --- /dev/null +++ b/sources/src/main/java/io/akarin/server/mixin/core/MixinEntityHorseAbstract.java @@ -0,0 +1,44 @@ +package io.akarin.server.mixin.core; + +import java.util.UUID; + +import javax.annotation.Nullable; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import com.google.common.base.Optional; + +import net.minecraft.server.DataWatcherObject; +import net.minecraft.server.Entity; +import net.minecraft.server.EntityHorseAbstract; +import net.minecraft.server.World; + +@Mixin(value = EntityHorseAbstract.class, remap = false) +public abstract class MixinEntityHorseAbstract extends Entity { + @Shadow @Final private static DataWatcherObject> bJ; + + @Nullable private Optional cachedOwnerId; + + @Overwrite + @Nullable public UUID getOwnerUUID() { + if (cachedOwnerId == null) cachedOwnerId = datawatcher.get(bJ); + return cachedOwnerId.orNull(); + } + + @Overwrite + public void setOwnerUUID(@Nullable UUID uuid) { + cachedOwnerId = Optional.fromNullable(uuid); + datawatcher.set(bJ, cachedOwnerId); + } + + /** + * Extends from superclass + * @param world + */ + public MixinEntityHorseAbstract(World world) { + super(world); + } +} diff --git a/sources/src/main/java/io/akarin/server/mixin/core/MixinEntityTameableAnimal.java b/sources/src/main/java/io/akarin/server/mixin/core/MixinEntityTameableAnimal.java new file mode 100644 index 000000000..b33847cee --- /dev/null +++ b/sources/src/main/java/io/akarin/server/mixin/core/MixinEntityTameableAnimal.java @@ -0,0 +1,44 @@ +package io.akarin.server.mixin.core; + +import java.util.UUID; + +import javax.annotation.Nullable; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import com.google.common.base.Optional; + +import net.minecraft.server.DataWatcherObject; +import net.minecraft.server.Entity; +import net.minecraft.server.EntityTameableAnimal; +import net.minecraft.server.World; + +@Mixin(value = EntityTameableAnimal.class, remap = false) +public abstract class MixinEntityTameableAnimal extends Entity { + @Shadow @Final protected static DataWatcherObject> by; + + @Nullable private Optional cachedOwnerId; + + @Overwrite + @Nullable public UUID getOwnerUUID() { + if (cachedOwnerId == null) cachedOwnerId = datawatcher.get(by); + return cachedOwnerId.orNull(); + } + + @Overwrite + public void setOwnerUUID(@Nullable UUID uuid) { + cachedOwnerId = Optional.fromNullable(uuid); + datawatcher.set(by, cachedOwnerId); + } + + /** + * Extends from superclass + * @param world + */ + public MixinEntityTameableAnimal(World world) { + super(world); + } +} diff --git a/sources/src/main/java/io/akarin/server/mixin/core/MixinMinecraftServer.java b/sources/src/main/java/io/akarin/server/mixin/core/MixinMinecraftServer.java index d203248f1..e1d459a09 100644 --- a/sources/src/main/java/io/akarin/server/mixin/core/MixinMinecraftServer.java +++ b/sources/src/main/java/io/akarin/server/mixin/core/MixinMinecraftServer.java @@ -21,6 +21,8 @@ import io.akarin.server.core.AkarinGlobalConfig; import io.akarin.server.core.AkarinSlackScheduler; import net.minecraft.server.CrashReport; import net.minecraft.server.CustomFunctionData; +import net.minecraft.server.Entity; +import net.minecraft.server.EntityTameableAnimal; import net.minecraft.server.ITickable; import net.minecraft.server.MinecraftServer; import net.minecraft.server.MojangStatisticsGenerator; diff --git a/sources/src/main/resources/mixins.akarin.core.json b/sources/src/main/resources/mixins.akarin.core.json index 528a83d83..652375697 100644 --- a/sources/src/main/resources/mixins.akarin.core.json +++ b/sources/src/main/resources/mixins.akarin.core.json @@ -18,6 +18,8 @@ "core.MixinVersionCommand", "core.MixinMinecraftServer", "core.MixinChunkIOExecutor", + "core.MixinEntityHorseAbstract", + "core.MixinEntityTameableAnimal", "core.MixinTileEntityEnchantTable", "nsc.MixinPlayerConnection",