From ec7676a69cf1e721621de76040553ae5d64b405c Mon Sep 17 00:00:00 2001 From: WayofTime Date: Wed, 13 Jan 2016 19:59:28 -0500 Subject: [PATCH] Potential fix for a bunch of stuff that required the use of UUID -> username lookup on servers. This fix adds an extra tag to the NBT of items so that it caches the username of the owner. The UUID is still stored on items, but is not used client-side. --- changelog.txt | 1 + .../WayofTime/bloodmagic/api/Constants.java | 1 + .../api/util/helper/BindableHelper.java | 31 ++++++++++++------- .../api/util/helper/PlayerHelper.java | 9 ++++-- .../item/sigil/ItemSigilDivination.java | 4 --- .../bloodmagic/item/sigil/ItemSigilSeer.java | 4 --- 6 files changed, 28 insertions(+), 22 deletions(-) diff --git a/changelog.txt b/changelog.txt index 476f96db..38b4827b 100644 --- a/changelog.txt +++ b/changelog.txt @@ -4,6 +4,7 @@ Version 2.0.0-5 - Tweaked Sentient Sword's will drop rate - No longer 1.8.8 compatible - Cleaned some clutter from JEI +- Added a potential fix to some server mod issues. ------------------------------------------------------ diff --git a/src/main/java/WayofTime/bloodmagic/api/Constants.java b/src/main/java/WayofTime/bloodmagic/api/Constants.java index 8a476262..d8f1bd52 100644 --- a/src/main/java/WayofTime/bloodmagic/api/Constants.java +++ b/src/main/java/WayofTime/bloodmagic/api/Constants.java @@ -9,6 +9,7 @@ public class Constants public static class NBT { public static final String OWNER_UUID = "ownerUUID"; + public static final String OWNER_NAME = "ownerNAME"; public static final String USES = "uses"; public static final String UNUSABLE = "unusable"; public static final String SACRIFICE = "sacrifice"; diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/BindableHelper.java b/src/main/java/WayofTime/bloodmagic/api/util/helper/BindableHelper.java index e001b807..f863159d 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/BindableHelper.java +++ b/src/main/java/WayofTime/bloodmagic/api/util/helper/BindableHelper.java @@ -1,14 +1,13 @@ package WayofTime.bloodmagic.api.util.helper; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.api.event.ItemBindEvent; -import WayofTime.bloodmagic.api.iface.IBindable; -import com.google.common.base.Strings; +import java.util.UUID; + import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraftforge.common.MinecraftForge; - -import java.util.UUID; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.event.ItemBindEvent; +import WayofTime.bloodmagic.api.iface.IBindable; public class BindableHelper { @@ -26,7 +25,7 @@ public class BindableHelper */ public static boolean checkAndSetItemOwner(ItemStack stack, EntityPlayer player) { - return !PlayerHelper.isFakePlayer(player) && checkAndSetItemOwner(stack, PlayerHelper.getUUIDFromPlayer(player)); + return !PlayerHelper.isFakePlayer(player) && checkAndSetItemOwner(stack, PlayerHelper.getUUIDFromPlayer(player), player.getName()); } /** @@ -41,22 +40,30 @@ public class BindableHelper * - The ItemStack to bind * @param uuid * - The username to bind the ItemStack to + * @param currentUsername + * - The current name of the player. * * @return - Whether the binding was successful */ - public static boolean checkAndSetItemOwner(ItemStack stack, String uuid) + public static boolean checkAndSetItemOwner(ItemStack stack, String uuid, String currentUsername) { stack = NBTHelper.checkNBT(stack); if (!(stack.getItem() instanceof IBindable)) return false; - if (Strings.isNullOrEmpty(stack.getTagCompound().getString(Constants.NBT.OWNER_UUID))) + String currentOwner = stack.getTagCompound().getString(Constants.NBT.OWNER_UUID); + + if (currentOwner == "") //The player has not been set yet, so set everything. { MinecraftForge.EVENT_BUS.post(new ItemBindEvent(PlayerHelper.getPlayerFromUUID(uuid), uuid, stack)); ((IBindable) stack.getItem()).onBind(PlayerHelper.getPlayerFromUUID(uuid), stack); stack.getTagCompound().setString(Constants.NBT.OWNER_UUID, uuid); + stack.getTagCompound().setString(Constants.NBT.OWNER_NAME, currentUsername); return true; + } else if (currentOwner.equals(uuid)) //The player has been set, so this will simply update the display name + { + stack.getTagCompound().setString(Constants.NBT.OWNER_NAME, currentUsername); } return true; @@ -69,10 +76,12 @@ public class BindableHelper * - ItemStack to check * @param uuid * - UUID of the Player + * @param currentUsername + * - The current name of the player. */ - public static boolean checkAndSetItemOwner(ItemStack stack, UUID uuid) + public static boolean checkAndSetItemOwner(ItemStack stack, UUID uuid, String currentUsername) { - return checkAndSetItemOwner(stack, uuid.toString()); + return checkAndSetItemOwner(stack, uuid.toString(), currentUsername); } /** diff --git a/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerHelper.java b/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerHelper.java index 2b1450bd..3422233a 100644 --- a/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerHelper.java +++ b/src/main/java/WayofTime/bloodmagic/api/util/helper/PlayerHelper.java @@ -23,7 +23,7 @@ public class PlayerHelper public static String getUsernameFromPlayer(EntityPlayer player) { - return UsernameCache.getLastKnownUsername(getUUIDFromPlayer(player)); + return player.worldObj.isRemote ? "" : UsernameCache.getLastKnownUsername(getUUIDFromPlayer(player)); } public static EntityPlayer getPlayerFromUsername(String username) @@ -63,16 +63,19 @@ public class PlayerHelper { stack = NBTHelper.checkNBT(stack); - return PlayerHelper.getUsernameFromUUID(stack.getTagCompound().getString(Constants.NBT.OWNER_UUID)); + return stack.getTagCompound().getString(Constants.NBT.OWNER_NAME); } public static boolean isFakePlayer(EntityPlayer player) { - return player != null && player instanceof FakePlayer || FAKE_PLAYER_PATTERN.matcher(getUsernameFromPlayer(player)).matches(); + return player != null && (player instanceof FakePlayer || FAKE_PLAYER_PATTERN.matcher(getUsernameFromPlayer(player)).matches()); } public static void causeNauseaToPlayer(ItemStack stack) { + if (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) + return; + stack = NBTHelper.checkNBT(stack); if (!Strings.isNullOrEmpty(stack.getTagCompound().getString(Constants.NBT.OWNER_UUID))) diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java index c6b4c675..2b258fe7 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilDivination.java @@ -24,10 +24,6 @@ public class ItemSigilDivination extends ItemSigilBase implements IAltarReader @Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { - - if (PlayerHelper.isFakePlayer(player)) - return stack; - super.onItemRightClick(stack, world, player); if (!world.isRemote) diff --git a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java index 881b75d4..023f8b7b 100644 --- a/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java +++ b/src/main/java/WayofTime/bloodmagic/item/sigil/ItemSigilSeer.java @@ -25,10 +25,6 @@ public class ItemSigilSeer extends ItemSigilBase implements IAltarReader @Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { - - if (PlayerHelper.isFakePlayer(player)) - return stack; - super.onItemRightClick(stack, world, player); if (!world.isRemote)