Reach ring rewrite (#67)

Co-authored-by: Shadow1590 <>
Co-authored-by: Maya <10861407+serenibyss@users.noreply.github.com>
This commit is contained in:
Shadow1590Shadow1590Maya
authored and GitHub committed 2025-01-14 23:50:10 -06:00
1 parent e8fb04df37
commit 36dfeea862
10 files changed
+88 -10

No files matched your search

@@ -0,0 +1,22 @@
package vazkii.botania.common.core.handler;
import net.minecraft.client.Minecraft;
import vazkii.botania.common.item.equipment.bauble.ItemBauble;
import cpw.mods.fml.common.gameevent.PlayerEvent;
import cpw.mods.fml.common.network.FMLNetworkEvent;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
public class ItemBaubleHandler {
@SubscribeEvent
public void disconnectFromServer(FMLNetworkEvent.ClientDisconnectionFromServerEvent event) {
if(Minecraft.getMinecraft().thePlayer != null) {
ItemBauble.removePlayer(Minecraft.getMinecraft().thePlayer.getUniqueID());
}
}
@SubscribeEvent
public void playerDisconnect(PlayerEvent.PlayerLoggedOutEvent event) {
ItemBauble.removePlayer(event.player.getUniqueID());
}
}
@@ -50,6 +50,7 @@ import vazkii.botania.common.core.handler.ChestGenHandler;
import vazkii.botania.common.core.handler.CommonTickHandler;
import vazkii.botania.common.core.handler.ConfigHandler;
import vazkii.botania.common.core.handler.InternalMethodHandler;
import vazkii.botania.common.core.handler.ItemBaubleHandler;
import vazkii.botania.common.core.handler.ManaNetworkHandler;
import vazkii.botania.common.core.handler.PixieHandler;
import vazkii.botania.common.core.handler.SheddingHandler;
@@ -145,6 +146,7 @@ public class CommonProxy {
MinecraftForge.EVENT_BUS.register(new SkyblockWorldEvents());
FMLCommonHandler.instance().bus().register(new CommonTickHandler());
FMLCommonHandler.instance().bus().register(new ItemBaubleHandler());
FMLInterModComms.sendMessage("ProjectE", "interdictionblacklist", EntityManaBurst.class.getCanonicalName());
@@ -10,6 +10,8 @@
*/
package vazkii.botania.common.item.equipment.bauble;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.UUID;
@@ -38,13 +40,15 @@ import cpw.mods.fml.relauncher.SideOnly;
@Optional.Interface(modid = "Thaumcraft", iface = "thaumcraft.api.IRunicArmor")
public abstract class ItemBauble extends ItemMod implements IBauble, ICosmeticAttachable, IPhantomInkable, IRunicArmor {
private static final String TAG_HASHCODE = "playerHashcode";
private static final String TAG_HASHCODE_CLIENT = "playerHashcodeClient";
private static final String TAG_BAUBLE_UUID_MOST = "baubleUUIDMost";
private static final String TAG_BAUBLE_UUID_LEAST = "baubleUUIDLeast";
private static final String TAG_COSMETIC_ITEM = "cosmeticItem";
private static final String TAG_PHANTOM_INK = "phantomInk";
private static final HashMap<UUID, UUID> itemToPlayerRemote = new HashMap<>();
private static final HashMap<UUID, UUID> itemToPlayer = new HashMap<>();
private static final HashSet<UUID> toRemoveItems = new HashSet<>();
public ItemBauble(String name) {
super();
setMaxStackSize(1);
@@ -123,9 +127,17 @@ public abstract class ItemBauble extends ItemMod implements IBauble, ICosmeticAt
@Override
public void onWornTick(ItemStack stack, EntityLivingBase player) {
if(getLastPlayerHashcode(stack, player.worldObj.isRemote) != player.hashCode()) {
UUID itemUUID = getBaubleUUID(stack);
if(toRemoveItems.contains(itemUUID)) {
// this is done like this because on server worn tick gets called after unequip
// so it would get reapplied
unapplyItem(itemUUID, player.worldObj.isRemote);
toRemoveItems.remove(itemUUID);
return;
}
if(!wasPlayerApplied(itemUUID, player.getUniqueID(), player.worldObj.isRemote)) {
onEquippedOrLoadedIntoWorld(stack, player);
setLastPlayerHashcode(stack, player.hashCode(), player.worldObj.isRemote);
applyToPlayer(itemUUID, player.getUniqueID(), player.worldObj.isRemote);
}
}
@@ -139,7 +151,7 @@ public abstract class ItemBauble extends ItemMod implements IBauble, ICosmeticAt
((EntityPlayer) player).addStat(ModAchievements.baubleWear, 1);
onEquippedOrLoadedIntoWorld(stack, player);
setLastPlayerHashcode(stack, player.hashCode(), player.worldObj.isRemote);
applyToPlayer(getBaubleUUID(stack), player.getUniqueID(), player.worldObj.isRemote);
}
}
@@ -149,7 +161,7 @@ public abstract class ItemBauble extends ItemMod implements IBauble, ICosmeticAt
@Override
public void onUnequipped(ItemStack stack, EntityLivingBase player) {
// NO-OP
toRemoveItems.add(getBaubleUUID(stack));
}
@Override
@@ -196,12 +208,37 @@ public abstract class ItemBauble extends ItemMod implements IBauble, ICosmeticAt
return new UUID(most, least);
}
public static int getLastPlayerHashcode(ItemStack stack, boolean remote) {
return ItemNBTHelper.getInt(stack, remote ? TAG_HASHCODE_CLIENT : TAG_HASHCODE, 0);
public static boolean wasPlayerApplied(UUID itemUUID, UUID playerUUID, boolean remote) {
return playerUUID.equals(remote ? itemToPlayerRemote.get(itemUUID) : itemToPlayer.get(itemUUID));
}
public static void setLastPlayerHashcode(ItemStack stack, int hash, boolean remote) {
ItemNBTHelper.setInt(stack, remote ? TAG_HASHCODE_CLIENT : TAG_HASHCODE, hash);
public static void applyToPlayer(UUID itemUUID, UUID playerUUID, boolean remote) {
if(remote) {
itemToPlayerRemote.put(itemUUID, playerUUID);
} else {
itemToPlayer.put(itemUUID, playerUUID);
}
}
public static void unapplyItem(UUID itemUUID, boolean remote) {
if(remote) {
itemToPlayerRemote.remove(itemUUID);
} else {
itemToPlayer.remove(itemUUID);
}
}
public static void removePlayer(UUID playerUUID) {
for(UUID item : itemToPlayerRemote.keySet().toArray(new UUID[0])) {
if(playerUUID.equals(itemToPlayerRemote.get(item))) {
itemToPlayerRemote.remove(item);
}
}
for(UUID item : itemToPlayer.keySet().toArray(new UUID[0])) {
if(playerUUID.equals(itemToPlayer.get(item))) {
itemToPlayer.remove(item);
}
}
}
@Override
@@ -12,6 +12,8 @@ package vazkii.botania.common.item.equipment.bauble;
import java.util.List;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ItemRenderer;
import net.minecraft.client.renderer.Tessellator;
@@ -53,6 +55,7 @@ public class ItemBaubleCosmetic extends ItemBauble implements ICosmeticBauble {
}
@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister par1IconRegister) {
icons = new IIcon[SUBTYPES];
for(int i = 0; i < SUBTYPES; i++)
@@ -13,6 +13,8 @@ package vazkii.botania.common.item.equipment.bauble;
import java.awt.Color;
import java.util.List;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ItemRenderer;
import net.minecraft.client.renderer.OpenGlHelper;
@@ -68,6 +70,7 @@ public class ItemBloodPendant extends ItemBauble implements IBrewContainer, IBre
}
@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister par1IconRegister) {
icons = new IIcon[4];
for(int i = 0; i < 4; i++)
@@ -15,6 +15,8 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.material.Material;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ItemRenderer;
@@ -53,6 +55,7 @@ public class ItemIcePendant extends ItemBauble implements IBaubleRender {
}
@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister par1IconRegister) {
super.registerIcons(par1IconRegister);
gemIcon = IconHelper.forItem(par1IconRegister, this, "Gem");
@@ -62,6 +62,7 @@ public class ItemItemFinder extends ItemBauble implements IBaubleRender {
}
@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister par1IconRegister) {
super.registerIcons(par1IconRegister);
gemIcon = IconHelper.forItem(par1IconRegister, this, "Gem");
@@ -10,6 +10,8 @@
*/
package vazkii.botania.common.item.equipment.bauble;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ItemRenderer;
import net.minecraft.client.renderer.Tessellator;
@@ -47,6 +49,7 @@ public class ItemLavaPendant extends ItemBauble implements IBaubleRender {
}
@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister par1IconRegister) {
super.registerIcons(par1IconRegister);
gemIcon = IconHelper.forItem(par1IconRegister, this, "Gem");
@@ -30,6 +30,7 @@ public class ItemReachRing extends ItemBauble {
@Override
public void onUnequipped(ItemStack stack, EntityLivingBase player) {
Botania.proxy.setExtraReach(player, -3.5F);
super.onUnequipped(stack, player);
}
@Override
@@ -10,6 +10,8 @@
*/
package vazkii.botania.common.item.equipment.bauble;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ItemRenderer;
import net.minecraft.client.renderer.Tessellator;
@@ -58,6 +60,7 @@ public class ItemSuperLavaPendant extends ItemBauble implements IBaubleRender {
}
@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister par1IconRegister) {
super.registerIcons(par1IconRegister);
gemIcon = IconHelper.forItem(par1IconRegister, this, "Gem");