From e8472e3a69097a88e081490f133a3e82bb4842b8 Mon Sep 17 00:00:00 2001 From: kirillsaint Date: Wed, 1 May 2024 04:10:37 +0600 Subject: [PATCH] (improve) improved player search in the world --- .../java/net/silentclient/client/Client.java | 8 +++++++ .../client/emotes/EmoteManager.java | 20 +++++------------ .../mixins/NetHandlerPlayClientMixin.java | 2 ++ .../client/mixin/mixins/WorldMixin.java | 12 +++++++--- .../client/utils/WorldListener.java | 22 +++++++++++++++++++ 5 files changed, 46 insertions(+), 18 deletions(-) create mode 100644 src/main/java/net/silentclient/client/utils/WorldListener.java diff --git a/src/main/java/net/silentclient/client/Client.java b/src/main/java/net/silentclient/client/Client.java index 323558c..3718cca 100644 --- a/src/main/java/net/silentclient/client/Client.java +++ b/src/main/java/net/silentclient/client/Client.java @@ -8,6 +8,7 @@ import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.multiplayer.ServerList; import net.minecraft.client.resources.data.IMetadataSerializer; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; import net.minecraft.util.Session; import net.silentclient.client.config.ConfigManager; @@ -595,6 +596,13 @@ public class Client { EmotesMod.onClick(event); } + @EventTarget + public void onJoinToWorld(EntityJoinLevelEvent event) { + if(event.getEntity() instanceof EntityPlayer) { + WorldListener.onPlayerJoin((EntityPlayer) event.getEntity()); + } + } + // Instances public String getApiUrl() { return "http://localhost:" + getUserData().server_port; diff --git a/src/main/java/net/silentclient/client/emotes/EmoteManager.java b/src/main/java/net/silentclient/client/emotes/EmoteManager.java index 0a6bbbf..40879af 100644 --- a/src/main/java/net/silentclient/client/emotes/EmoteManager.java +++ b/src/main/java/net/silentclient/client/emotes/EmoteManager.java @@ -2,8 +2,8 @@ package net.silentclient.client.emotes; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.world.World; import net.silentclient.client.emotes.emoticons.Emote; +import net.silentclient.client.utils.WorldListener; public class EmoteManager { public static void sendEmote(String name, int i) { @@ -13,7 +13,7 @@ public class EmoteManager { public static void play(String name, int i) { if (Minecraft.getMinecraft().theWorld != null) { String s = PlayerModelManager.get().map.get(i); - EntityPlayer entityPlayer = EmoteManager.getPlayerEntityByName(Minecraft.getMinecraft().theWorld, name); + EntityPlayer entityPlayer = EmoteManager.getPlayerEntityByName(name); if (entityPlayer != null && s != null) { Emote emote = PlayerModelManager.get().registry.get(s); if (EmoteControllerManager.controllers.get(entityPlayer.getName()) != null) { @@ -25,7 +25,7 @@ public class EmoteManager { public static void stop(String name) { if (Minecraft.getMinecraft().theWorld != null) { - EntityPlayer entityPlayer = EmoteManager.getPlayerEntityByName(Minecraft.getMinecraft().theWorld, name); + EntityPlayer entityPlayer = EmoteManager.getPlayerEntityByName(name); if (entityPlayer != null) { if (EmoteControllerManager.controllers.get(entityPlayer.getName()) != null) { EmoteControllerManager.controllers.get(entityPlayer.getName()).resetEmote(); @@ -34,18 +34,8 @@ public class EmoteManager { } } - public static EntityPlayer getPlayerEntityByName(World world, String name) + public static EntityPlayer getPlayerEntityByName(String name) { - for (int i = 0; i < world.playerEntities.size(); ++i) - { - EntityPlayer entityplayer = (EntityPlayer)world.playerEntities.get(i); - - if (name.equalsIgnoreCase(entityplayer.getName())) - { - return entityplayer; - } - } - - return null; + return WorldListener.players.get(name.toLowerCase()); } } diff --git a/src/main/java/net/silentclient/client/mixin/mixins/NetHandlerPlayClientMixin.java b/src/main/java/net/silentclient/client/mixin/mixins/NetHandlerPlayClientMixin.java index 34a4e49..3bee7e3 100644 --- a/src/main/java/net/silentclient/client/mixin/mixins/NetHandlerPlayClientMixin.java +++ b/src/main/java/net/silentclient/client/mixin/mixins/NetHandlerPlayClientMixin.java @@ -13,6 +13,7 @@ import net.minecraft.util.IChatComponent; import net.silentclient.client.event.impl.EntityDamageEvent; import net.silentclient.client.hooks.NetHandlerPlayClientHook; import net.silentclient.client.utils.Players; +import net.silentclient.client.utils.WorldListener; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.*; @@ -60,6 +61,7 @@ public abstract class NetHandlerPlayClientMixin { @Inject(method = "handleJoinGame", at = @At(value = "RETURN")) public void resetPlayers(S01PacketJoinGame packetIn, CallbackInfo ci) { Players.reload(); + WorldListener.onWorldSwitch(); } //#if MC==10809 diff --git a/src/main/java/net/silentclient/client/mixin/mixins/WorldMixin.java b/src/main/java/net/silentclient/client/mixin/mixins/WorldMixin.java index 5136b12..bfd1dca 100644 --- a/src/main/java/net/silentclient/client/mixin/mixins/WorldMixin.java +++ b/src/main/java/net/silentclient/client/mixin/mixins/WorldMixin.java @@ -6,19 +6,18 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityFallingBlock; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.item.EntityTNTPrimed; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; -import net.minecraft.world.WorldProvider; import net.silentclient.client.Client; import net.silentclient.client.event.impl.EntityJoinLevelEvent; +import net.silentclient.client.utils.WorldListener; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyVariable; -import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @@ -58,6 +57,13 @@ public class WorldMixin { } } + @Inject(method = {"removeEntity", "removePlayerEntityDangerously"}, at = @At("HEAD"), cancellable = true) + public void removeEntityFromWorldListener(Entity entityIn, CallbackInfo ci) { + if(entityIn instanceof EntityPlayer) { + WorldListener.onPlayerLeave((EntityPlayer) entityIn); + } + } + @Inject(method = "joinEntityInSurroundings", at = @At("HEAD"), cancellable = true) public void callEntityJoinLevelEvent2(Entity entityIn, CallbackInfo ci) { EntityJoinLevelEvent event = new EntityJoinLevelEvent(entityIn); diff --git a/src/main/java/net/silentclient/client/utils/WorldListener.java b/src/main/java/net/silentclient/client/utils/WorldListener.java new file mode 100644 index 0000000..a48a7b9 --- /dev/null +++ b/src/main/java/net/silentclient/client/utils/WorldListener.java @@ -0,0 +1,22 @@ +package net.silentclient.client.utils; + +import net.minecraft.entity.player.EntityPlayer; + +import java.util.HashMap; + +public class WorldListener { + public static HashMap players = new HashMap<>(); + + public static void onPlayerJoin(EntityPlayer entityPlayer) { + onPlayerLeave(entityPlayer); + players.put(entityPlayer.getName().toLowerCase(), entityPlayer); + } + + public static void onPlayerLeave(EntityPlayer entityPlayer) { + players.remove(entityPlayer.getName().toLowerCase()); + } + + public static void onWorldSwitch() { + players.clear(); + } +}