From 98ed17fe21bc7ce3d9f56f225f6f8a7e0f275b41 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Sun, 10 Jul 2016 15:27:26 -0400 Subject: [PATCH] Updated the Demon Aura hud by allowing it to actually see the Aura in the chunk - refresh rate is 50 ticks. --- .../client/hud/HUDElementDemonWillAura.java | 21 +++++- .../demonAura/WorldDemonWillHandler.java | 11 +++ .../bloodmagic/item/soul/ItemSoulGem.java | 4 +- .../network/BloodMagicPacketHandler.java | 5 +- .../network/DemonAuraPacketProcessor.java | 70 ++++++++++++++++++ .../bloodmagic/proxy/ClientProxy.java | 3 + .../bloodmagic/tile/TileDemonCrucible.java | 3 +- .../util/handler/event/GenericHandler.java | 35 +++++++++ .../bloodmagic/textures/gui/demonWillBar.png | Bin 3596 -> 3590 bytes 9 files changed, 144 insertions(+), 8 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/network/DemonAuraPacketProcessor.java diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java index b7ec0050..bb74688d 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementDemonWillAura.java @@ -10,10 +10,12 @@ import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.VertexBuffer; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.event.RenderGameOverlayEvent; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.soul.EnumDemonWillType; +import WayofTime.bloodmagic.proxy.ClientProxy; public class HUDElementDemonWillAura extends HUDElement { @@ -34,6 +36,7 @@ public class HUDElementDemonWillAura extends HUDElement @Override public void render(Minecraft minecraft, ScaledResolution resolution, float partialTicks) { + EntityPlayer player = minecraft.thePlayer; // ItemStack sigilHolding = minecraft.thePlayer.getHeldItemMainhand(); // // TODO - Clean this mess // // Check mainhand for Sigil of Holding @@ -61,9 +64,10 @@ public class HUDElementDemonWillAura extends HUDElement for (EnumDemonWillType type : EnumDemonWillType.values()) { + GlStateManager.color(1.0F, 1.0F, 1.0F); minecraft.getTextureManager().bindTexture(crystalTextures.get(type)); - double amount = 10 + type.ordinal() * 15; + double amount = ClientProxy.currentAura == null ? 0 : ClientProxy.currentAura.getWill(type); double ratio = Math.max(Math.min(amount / maxAmount, 1), 0); double x = getXOffset() + 8 + type.ordinal() * 6; @@ -73,10 +77,21 @@ public class HUDElementDemonWillAura extends HUDElement vertexBuffer.begin(7, DefaultVertexFormats.POSITION_TEX); vertexBuffer.pos((double) (x), (double) (y + height), 0).tex(0, 1).endVertex(); - vertexBuffer.pos((double) (x + width), (double) (y + height), 0).tex(1d / 8d, 1).endVertex(); - vertexBuffer.pos((double) (x + width), (double) (y), 0).tex(1d / 8d, 1 - ratio).endVertex(); + vertexBuffer.pos((double) (x + width), (double) (y + height), 0).tex(5d / 16d, 1).endVertex(); + vertexBuffer.pos((double) (x + width), (double) (y), 0).tex(5d / 16d, 1 - ratio).endVertex(); vertexBuffer.pos((double) (x), (double) (y), 0).tex(0, 1 - ratio).endVertex(); tessellator.draw(); + + if (player.isSneaking()) + { + GlStateManager.pushMatrix(); + String value = "" + (int) amount; + GlStateManager.translate(x, (y + height + 4 + value.length() * 3), 0); + GlStateManager.scale(0.5, 0.5, 1); + GlStateManager.rotate(-90, 0, 0, 1); + minecraft.fontRendererObj.drawStringWithShadow("" + (int) amount, 0, 2, 0xffffff); + GlStateManager.popMatrix(); + } } minecraft.getTextureManager().bindTexture(new ResourceLocation(Constants.Mod.MODID, "textures/gui/demonWillBar.png")); diff --git a/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java b/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java index 5caee62e..1dd17e37 100644 --- a/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java +++ b/src/main/java/WayofTime/bloodmagic/demonAura/WorldDemonWillHandler.java @@ -15,6 +15,17 @@ public class WorldDemonWillHandler static ConcurrentHashMap containedWills = new ConcurrentHashMap(); public static ConcurrentHashMap> dirtyChunks = new ConcurrentHashMap>(); + public static DemonWillHolder getWillHolder(int dim, int x, int y) + { + WillChunk chunk = getWillChunk(dim, x, y); + if (chunk != null) + { + return chunk.getCurrentWill(); + } + + return null; + } + public static WillWorld getWillWorld(int dim) { return containedWills.get(dim); diff --git a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java index 9e25e1c8..d4d3afbf 100644 --- a/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java +++ b/src/main/java/WayofTime/bloodmagic/item/soul/ItemSoulGem.java @@ -207,7 +207,7 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I double soulsDrained = Math.min(drainAmount, souls); - if (!doDrain) + if (doDrain) { setWill(type, soulGemStack, souls - soulsDrained); } @@ -287,7 +287,7 @@ public class ItemSoulGem extends Item implements IDemonWillGem, IMeshProvider, I double filled = Math.min(fillAmount, maxWill - current); - if (filled > 0 && doFill) + if (doFill) { this.setWill(type, stack, filled + current); } diff --git a/src/main/java/WayofTime/bloodmagic/network/BloodMagicPacketHandler.java b/src/main/java/WayofTime/bloodmagic/network/BloodMagicPacketHandler.java index 286b34a9..4b7a6b91 100644 --- a/src/main/java/WayofTime/bloodmagic/network/BloodMagicPacketHandler.java +++ b/src/main/java/WayofTime/bloodmagic/network/BloodMagicPacketHandler.java @@ -1,13 +1,13 @@ package WayofTime.bloodmagic.network; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.util.ChatUtil; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.fml.common.network.NetworkRegistry; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper; import net.minecraftforge.fml.relauncher.Side; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.util.ChatUtil; public class BloodMagicPacketHandler { @@ -21,6 +21,7 @@ public class BloodMagicPacketHandler INSTANCE.registerMessage(PlayerFallDistancePacketProcessor.class, PlayerFallDistancePacketProcessor.class, 3, Side.SERVER); INSTANCE.registerMessage(SigilHoldingPacketProcessor.class, SigilHoldingPacketProcessor.class, 4, Side.SERVER); INSTANCE.registerMessage(KeyProcessor.class, KeyProcessor.class, 5, Side.SERVER); + INSTANCE.registerMessage(DemonAuraPacketProcessor.class, DemonAuraPacketProcessor.class, 6, Side.CLIENT); } public static void sendToAllAround(IMessage message, TileEntity te, int range) diff --git a/src/main/java/WayofTime/bloodmagic/network/DemonAuraPacketProcessor.java b/src/main/java/WayofTime/bloodmagic/network/DemonAuraPacketProcessor.java new file mode 100644 index 00000000..05b88ecb --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/network/DemonAuraPacketProcessor.java @@ -0,0 +1,70 @@ +package WayofTime.bloodmagic.network; + +import io.netty.buffer.ByteBuf; + +import java.io.IOException; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import WayofTime.bloodmagic.api.soul.DemonWillHolder; +import WayofTime.bloodmagic.proxy.ClientProxy; + +public class DemonAuraPacketProcessor implements IMessage, IMessageHandler +{ + public DemonWillHolder currentWill = new DemonWillHolder(); + + public DemonAuraPacketProcessor() + { + + } + + public DemonAuraPacketProcessor(DemonWillHolder holder) + { + this.currentWill = holder; + } + + @Override + public void fromBytes(ByteBuf buffer) + { + PacketBuffer buff = new PacketBuffer(buffer); + try + { + NBTTagCompound tag = buff.readNBTTagCompoundFromBuffer(); + currentWill.readFromNBT(tag, "Aura"); + } catch (IOException e) + { + e.printStackTrace(); + } + } + + @Override + public void toBytes(ByteBuf buffer) + { + PacketBuffer buff = new PacketBuffer(buffer); + NBTTagCompound tag = new NBTTagCompound(); + currentWill.writeToNBT(tag, "Aura"); + buff.writeNBTTagCompoundToBuffer(tag); + } + + @Override + public IMessage onMessage(DemonAuraPacketProcessor message, MessageContext ctx) + { + if (ctx.side == Side.CLIENT) + { + message.onMessageFromServer(); + } + return null; + } + + @SideOnly(Side.CLIENT) + public void onMessageFromServer() + { + ClientProxy.currentAura = currentWill; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java index 72795412..50eedc4e 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java @@ -21,6 +21,7 @@ import org.apache.commons.lang3.tuple.Pair; import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.soul.DemonWillHolder; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.client.helper.ShaderHelper; @@ -48,6 +49,8 @@ import WayofTime.bloodmagic.util.helper.InventoryRenderHelperV2; public class ClientProxy extends CommonProxy { + public static DemonWillHolder currentAura = new DemonWillHolder(); + private InventoryRenderHelper renderHelper; private InventoryRenderHelperV2 renderHelperV2; diff --git a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java index 0af7a64e..31b0a61b 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java +++ b/src/main/java/WayofTime/bloodmagic/tile/TileDemonCrucible.java @@ -80,9 +80,10 @@ public class TileDemonCrucible extends TileInventory implements ITickable, IDemo double currentAmount = WorldDemonWillHandler.getCurrentWill(worldObj, pos, type); double drainAmount = Math.min(maxWill - currentAmount, gemDrainRate); double filled = WorldDemonWillHandler.fillWillToMaximum(worldObj, pos, type, drainAmount, maxWill, false); - filled = gemItem.drainWill(type, stack, filled, true); + filled = gemItem.drainWill(type, stack, filled, false); if (filled > 0) { + filled = gemItem.drainWill(type, stack, filled, true); WorldDemonWillHandler.fillWillToMaximum(worldObj, pos, type, filled, maxWill, true); } } diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java index 249d5106..f73d575b 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/event/GenericHandler.java @@ -13,8 +13,10 @@ import net.minecraft.init.Enchantments; import net.minecraft.inventory.EntityEquipmentSlot; import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; +import net.minecraft.util.math.BlockPos; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.living.LivingDropsEvent; +import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; import net.minecraftforge.event.entity.living.LivingHurtEvent; import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; @@ -33,12 +35,14 @@ import WayofTime.bloodmagic.api.iface.IBindable; import WayofTime.bloodmagic.api.livingArmour.LivingArmourUpgrade; import WayofTime.bloodmagic.api.orb.IBloodOrb; import WayofTime.bloodmagic.api.saving.SoulNetwork; +import WayofTime.bloodmagic.api.soul.DemonWillHolder; import WayofTime.bloodmagic.api.util.helper.BindableHelper; import WayofTime.bloodmagic.api.util.helper.ItemHelper; import WayofTime.bloodmagic.api.util.helper.NBTHelper; import WayofTime.bloodmagic.api.util.helper.NetworkHelper; import WayofTime.bloodmagic.api.util.helper.PlayerHelper; import WayofTime.bloodmagic.block.BlockAltar; +import WayofTime.bloodmagic.demonAura.WorldDemonWillHandler; import WayofTime.bloodmagic.item.ItemAltarMaker; import WayofTime.bloodmagic.item.ItemExperienceBook; import WayofTime.bloodmagic.item.armour.ItemLivingArmour; @@ -46,6 +50,8 @@ import WayofTime.bloodmagic.item.gear.ItemPackSacrifice; import WayofTime.bloodmagic.livingArmour.LivingArmour; import WayofTime.bloodmagic.livingArmour.tracker.StatTrackerSelfSacrifice; import WayofTime.bloodmagic.livingArmour.upgrade.LivingArmourUpgradeSelfSacrifice; +import WayofTime.bloodmagic.network.BloodMagicPacketHandler; +import WayofTime.bloodmagic.network.DemonAuraPacketProcessor; import WayofTime.bloodmagic.registry.ModItems; import WayofTime.bloodmagic.util.ChatUtil; import WayofTime.bloodmagic.util.helper.TextHelper; @@ -79,6 +85,35 @@ public class GenericHandler } } + // Handles sending the client the Demon Will Aura updates + @SubscribeEvent + public void onLivingUpdate(LivingUpdateEvent event) + { + if (!event.getEntityLiving().worldObj.isRemote) + { + EntityLivingBase entity = event.getEntityLiving(); + if (entity instanceof EntityPlayer && entity.worldObj.getTotalWorldTime() % 50 == 0) //TODO: Change to an incremental counter + { + sendPlayerDemonWillAura((EntityPlayer) entity); + } + return; + } + } + +// @SideOnly(Side.SERVER) + public void sendPlayerDemonWillAura(EntityPlayer player) + { + if (player instanceof EntityPlayerMP) + { + BlockPos pos = player.getPosition(); + DemonWillHolder holder = WorldDemonWillHandler.getWillHolder(player.worldObj.provider.getDimension(), pos.getX() >> 4, pos.getZ() >> 4); + if (holder != null) + { + BloodMagicPacketHandler.sendTo(new DemonAuraPacketProcessor(holder), (EntityPlayerMP) player); + } + } + } + // Handles destroying altar @SubscribeEvent public void harvestEvent(PlayerEvent.HarvestCheck event) diff --git a/src/main/resources/assets/bloodmagic/textures/gui/demonWillBar.png b/src/main/resources/assets/bloodmagic/textures/gui/demonWillBar.png index 90748c6abd763f89a455b99b69fe149e322238d1..a9559f8047f64f03b10757d93f4329eae2281c4d 100644 GIT binary patch delta 3219 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

;_ zRb`%cPHeM!`|9bbgLK1~(QY}O@tpNm$LVOarWK9z6C{=QOVq>Rj`fAXDAuG_F*(sj1N;zQ21 ztFFFSHOC|L$)eD;7Zx872* zB;Av>(e1glOJ=CHpo7P4Ty^!uO6l9fczg9)(;jO`)`dc)yQ;Kv$qbvXSV`KldAlSn zm!w7S>@*xRf4?L#`y*14?1Ml(!v=TIkc_v|hRFRSQ`CylwotbBE}dX2-FwunFM*W( z!vta9;^V*0eFiI>Kp)Y$`ydOD+3#=9RN!J01N;C7ytmA9s@v9Qc_6U0Z;(|2%$(x zS~7ExekQ+A>i2j+=*s>?#bAF zW!1*Xd<5>X34PphIX&lVE(xXr01&nnz$^buHBlS|GoF!KA*XBz5cB(Jhzv-E^V3Fz-9604e|gVOas(I(NOXc$#%f z=^JnQy(Hc`a0vK*;kms#QMwS!aP0}9QFf%Bu#u`vmr_5i4&$I-7@};Chyph6V|@@ z&Km0mCGDHxf$u7P;U-Da;;GiB^qe^k;2<7!o6RU#m8q4vtIdYSddlUa9QZiZB>>j} z04<;bc;x#Wb71#N9RD_kM+}s-+?1sFe>0<+tYhC6?v*6P#alNAy?D`5QX1zZCV(aE| zUY>Px(D!Qdow@wS`ID#yr~m+jWd*Qq+b3H0>HBVtB|ll;Mc0%Sz(M;LX~a2Zf6*77 zupV@3t&zHN?TWXuEW4)5CudymBIbcfC$PLZ+f|ZZ1{g3nUtedSn^_({(xS+DHxa6SOBl(Qea>q3ct6Qe&e$wsH@qKk}LTisXKG)ASpS*LR8EmY-TuvIE zZ05XI!XUsB0F6BmxcwgbQe&lecwl~Q@7w5z;YyUMH8s+Ek#@(P=D&&_$a#K?KK z#3-*gsPc+~+F4euon_TJe_dyPpXLAa1*)6l$MOpGSYDyu*s0It*L!__J@BjX^MS+0 zspgW|ACb+i!@j;2>-7f*@`?ft9RTJo-|BTH2=(XwecTT~lJxAlUCzGMU0XLNbC(DI zeSV{-ylAAP)cuDg22LJ{EAj}5<1_9tVe;fc#*U#%S2moPP z0Wb&v3;+xQz$x;19l*K``z2jxD=a?bY`f~}iJ8E>Txk^7B1 z_N^Fg8swC-xIyXn@ z)yukfK-{H8Qg(``*tB3{0V)813P4(r(cf{6tucMkSANd{)Etk{CyPSY?#VR!-E5wC zbGzaDoP}pK$0I`8?$3e@>#NpW^Bd?nfDQTE%>^0#HGR=ne}+pwf<6ZjNG=g313>oV ze&&T2cD8nwg1x4FM>VD|`pWAPAZo>E+XXi+O&gMw6q0t=C4ggRjg5DLmH<(ao^Nl~Sna-KPwpp2j_VEt{+0ksXQY~!^ywnkfx7&sN+UKdT7z$Uut7_J zhU5|~0RXi0e+nQoYm>2X(nY2u4IbP_lJwDsUz-p8^>G>;4dW&0M6IDSW3Btv{d~Z> zp=G-^(SA2jP+ZkyiF|+KexJ{K%kkF#&e6tP>#fDHb5^;<-1|rCMxu!wqrJu2Tw>Ge z#M(|Jm!JXw(83v#G%qd1l%%AjSV>ZGX{98ob7C8n|9nuA^h;$;$UD?bL^Pg zw%bNWnZd>en@fbz65#MLtBkCyvQ833+u!Oc-TjMdjyT@-GK^=|>~IFA4?j^U*0000aN&g3AaBc3^^OO<*0000< KMNUMnLSTZ^+k9yN