From 9659650a754abc613b08750fd2313d42b79c0370 Mon Sep 17 00:00:00 2001 From: somehussar <148253652+somehussar@users.noreply.github.com> Date: Thu, 22 Aug 2024 21:26:54 +0200 Subject: [PATCH] Fix player-specific invisibility --- src/main/java/noppes/npcs/DataDisplay.java | 52 +++++++++++++++++-- .../npcs/entity/EntityNPCInterface.java | 9 +++- 2 files changed, 57 insertions(+), 4 deletions(-) diff --git a/src/main/java/noppes/npcs/DataDisplay.java b/src/main/java/noppes/npcs/DataDisplay.java index 897514080..9eacfe171 100644 --- a/src/main/java/noppes/npcs/DataDisplay.java +++ b/src/main/java/noppes/npcs/DataDisplay.java @@ -3,6 +3,13 @@ package noppes.npcs; import com.google.common.collect.Iterables; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.LoaderState; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.nbt.NBTTagString; @@ -18,9 +25,7 @@ import noppes.npcs.entity.EntityNPCInterface; import noppes.npcs.entity.data.DataSkinOverlays; import noppes.npcs.util.ValueUtil; -import java.util.ArrayList; -import java.util.Random; -import java.util.UUID; +import java.util.*; public class DataDisplay { public EntityNPCInterface npc; @@ -58,6 +63,11 @@ public class DataDisplay { public ArrayList invisibleToList = new ArrayList<>(); + @SideOnly(Side.CLIENT) + public boolean isInvisibleToMe; + @SideOnly(Side.CLIENT) + public HashSet tempInvisIds; + public DataDisplay(EntityNPCInterface npc){ this.npc = npc; markovGeneratorId = new Random().nextInt(CustomNpcs.MARKOV_GENERATOR.length-1); @@ -106,11 +116,24 @@ public class DataDisplay { nbttagcompound.setBoolean("NoLivingAnimation", disableLivingAnimation); nbttagcompound.setByte("BossBar", showBossBar); + boolean saveNonPersistendIDs = Loader.instance().isInState(LoaderState.SERVER_STARTED); + ArrayList nonPersistedIDs = new ArrayList<>(); + NBTTagList list = new NBTTagList(); for(UUID uuid : invisibleToList){ + if(saveNonPersistendIDs){ + EntityPlayer p = NoppesUtilServer.getPlayer(uuid); + if(p != null) + nonPersistedIDs.add(p.getEntityId()); + } list.appendTag(new NBTTagString(uuid.toString())); } + if(!nonPersistedIDs.isEmpty()) { + int[] tempIDArr = nonPersistedIDs.stream().filter(Objects::nonNull).mapToInt(i -> i).toArray(); + nbttagcompound.setIntArray("InvisibleToNonPersistentID", tempIDArr); + } + nbttagcompound.setTag("InvisibleToList", list); return nbttagcompound; } @@ -190,6 +213,24 @@ public class DataDisplay { invisibleToList = new ArrayList<>(); } + if(FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT){ + + if(tempInvisIds == null){ + tempInvisIds = new HashSet<>(); + } else { + tempInvisIds.clear(); + } + + int[] tempEntityIDList = nbttagcompound.getIntArray("InvisibleToNonPersistentID"); + final int playerID = Minecraft.getMinecraft().thePlayer.getEntityId(); + for(int i : tempEntityIDList){ + if(i == playerID){ + isInvisibleToMe = true; + } + tempInvisIds.add(i); + } + } + if(prevSkinType != skinType || !texture.equals(prevTexture)|| !url.equals(prevUrl)) npc.textureLocation = null; npc.updateHitbox(); @@ -262,4 +303,9 @@ public class DataDisplay { return; this.markovGeneratorId = ValueUtil.clamp(id, 0, CustomNpcs.MARKOV_GENERATOR.length-1); } + + @SideOnly(Side.CLIENT) + public boolean getTempScriptInvisible(int entityId) { + return tempInvisIds.contains(entityId); + } } diff --git a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java index 1e426583e..dda846f1a 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java @@ -1,11 +1,14 @@ package noppes.npcs.entity; +import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData; +import cpw.mods.fml.relauncher.Side; import io.netty.buffer.ByteBuf; import kamkeel.addon.DBCAddon; import kamkeel.addon.client.DBCClient; import net.minecraft.block.Block; import net.minecraft.block.material.Material; +import net.minecraft.client.Minecraft; import net.minecraft.command.ICommandSender; import net.minecraft.command.IEntitySelector; import net.minecraft.entity.*; @@ -1869,7 +1872,11 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti } public boolean scriptInvisibleToPlayer(EntityPlayer player){ - return display.invisibleToList != null && display.invisibleToList.contains(player.getPersistentID()); + if(FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT){ + return (player == Minecraft.getMinecraft().thePlayer ? display.isInvisibleToMe : display.getTempScriptInvisible(player.getEntityId())); + }else { + return display.invisibleToList != null && display.invisibleToList.contains(player.getPersistentID()); + } } @Override