Posted February 24, 201510 yr comment_145533 Hi everyone I have made a stamina bar that regenerates every tick. But when I change its max value from 100 to 300 lets say the bar displays the 300 as the max value but stops refilling once it reaches 100. anyone know why? This is the code for the Extended Player Class, PacketSyncPlayerStamina class, and the Stamina GUI class. Note in the Extended Player Properties class I want the maxStamina variable to change while the player is logged in based on some condition (I am implementing a level up system which I want to use to change the value of maxStamina so that the player gets more stamina the higher their level.) currently the max stamina value changes but the current stamina value does not recognize that it changed unless you create a new world. - Anyone know why?? The Extended Player class where If I change the maxStamina variable the max value updates but the current value does not public class BattlePlayerProperties implements IExtendedEntityProperties { private final EntityPlayer player; public int maxStamina; public static final int Stamina_Watcher = 30; public BattlePlayerProperties(EntityPlayer player) { this.player = player; this.maxStamina = 100; this.player.getDataWatcher().addObject(Stamina_Watcher, maxStamina); } /** * Used to register these extended properties for the player during EntityConstructing event */ public static final void register(EntityPlayer player) { player.registerExtendedProperties("BattleMobExtendedPlayerHelper", new BattlePlayerProperties(player)); } /** * Returns BattleMobExtendedPlayerHelper properties for player */ public static final BattlePlayerProperties get(EntityPlayer player) { return (BattlePlayerProperties) player.getExtendedProperties("BattleMobExtendedPlayerHelper"); } /** * Copies additional player data from the given BattleMobExtendedPlayerHelper instance * Avoids NBT disk I/O overhead when cloning a player after respawn */ public void copy(BattlePlayerProperties props) { player.getDataWatcher().updateObject(Stamina_Watcher, props.getCurrentStamina()); maxStamina = props.maxStamina; } @Override public final void saveNBTData(NBTTagCompound compound) { NBTTagCompound properties = new NBTTagCompound(); properties.setInteger("CurrentStamina", player.getDataWatcher().getWatchableObjectInt(Stamina_Watcher)); properties.setInteger("MaxStamina", maxStamina); compound.setTag("BattleMobExtendedPlayerHelper", properties); } @Override public final void loadNBTData(NBTTagCompound compound) { NBTTagCompound properties = (NBTTagCompound) compound.getTag("BattleMobExtendedPlayerHelper"); player.getDataWatcher().updateObject(Stamina_Watcher, properties.getInteger("CurrentStamina")); maxStamina = properties.getInteger("MaxStamina"); } @Override public void init(Entity entity, World world) {} public final void regenStamina(int amount) { setCurrentStamina(getCurrentStamina() + amount); } /** * Returns true if the amount of Stamina was consumed or false * if the player's current Stamina was insufficient */ public void drainStamina(int amount) { if (amount <= getCurrentStamina()){ setCurrentStamina(getCurrentStamina() - amount); } } /** * This sets the current Stamina equal to max Stamina */ public final void replenishStamina() { this.player.getDataWatcher().updateObject(Stamina_Watcher, this.maxStamina); } /** * Returns current Stamina amount */ public final int getCurrentStamina() { return player.getDataWatcher().getWatchableObjectInt(Stamina_Watcher); } /** * Sets current Stamina to amount or maxStamina, whichever is lesser */ public final void setCurrentStamina(int amount) { player.getDataWatcher().updateObject(Stamina_Watcher, amount > 0 ? (amount < maxStamina ? amount : maxStamina) : 0); } /** * Returns max Stamina amount */ public final int getMaxStamina() { return maxStamina; } /** * Sets max Stamina to amount or 0 if amount is less than 0 */ public final void setMaxStamina(int amount) { maxStamina = (amount > 0 ? amount : 0); PacketOverlord.sendTo(new PacketSyncPlayerStamina(player), (EntityPlayerMP) player); } } PacketSyncPlayerStamina public class PacketSyncPlayerStamina extends AbstractClientMessage<PacketSyncPlayerStamina> { // this stores the BattleMobExtendedPlayerHelper data, allowing us to easily read and write private NBTTagCompound data; public PacketSyncPlayerStamina() {} public PacketSyncPlayerStamina(EntityPlayer player) { data = new NBTTagCompound(); BattlePlayerProperties.get(player).saveNBTData(data); } @Override protected void read(PacketBuffer buffer) throws IOException { data = buffer.readNBTTagCompoundFromBuffer(); } @Override protected void write(PacketBuffer buffer) throws IOException { buffer.writeNBTTagCompoundToBuffer(data); } @Override public void process(EntityPlayer player, Side side) { BattlePlayerProperties.get(player).loadNBTData(data); } } The GUI for the stamina Bar where I cancel the food bar event only and then replace it with my stamina bar @SideOnly(Side.CLIENT) public class GUIStaminaBar extends Gui { private Minecraft mc; private static final ResourceLocation texture = new ResourceLocation("staminamod:textures/gui/StaminaBar.png"); public GUIStaminaBar(Minecraft mc) { super(); this.mc = mc; } @SubscribeEvent(priority=EventPriority.NORMAL) public void onRenderFoodBar(RenderGameOverlayEvent.Pre event) { if (event.type == ElementType.FOOD) { event.setCanceled(true); return; } if (event.type != ElementType.FOOD) { return; } } @SubscribeEvent(priority=EventPriority.NORMAL) public void onRenderExperienceBar(RenderGameOverlayEvent.Post event) { if (event.type != ElementType.EXPERIENCE) { return; } BattlePlayerProperties staminaBar = BattlePlayerProperties.get(this.mc.thePlayer); if (staminaBar == null || staminaBar.getMaxStamina() == 0) { return; } if (!this.mc.thePlayer.capabilities.isCreativeMode) { int width = event.resolution.getScaledWidth(); int height = event.resolution.getScaledHeight(); this.mc.getTextureManager().bindTexture(texture); GL11.glEnable(GL11.GL_BLEND); GL11.glDisable(GL11.GL_DEPTH_TEST); GL11.glDepthMask(false); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); GL11.glDisable(GL11.GL_ALPHA_TEST); int staminaBarWidth = (int)(((float) staminaBar.getCurrentStamina() / staminaBar.getMaxStamina()) * 71); drawTexturedModalRect(width/2 + 15, height- 40, 0, 0, 77, 9); drawTexturedModalRect(width/2 + 15 + 2, height- 40 + 1, 0, 9, staminaBarWidth, 5); String staminaTally = "Stamina " + staminaBar.getCurrentStamina() + "/" + staminaBar.getMaxStamina(); height += -10; int xPosition = 13; this.mc.fontRenderer.drawString(staminaTally, width/2 + xPosition + 1, height- 40, 0); this.mc.fontRenderer.drawString(staminaTally, width/2 + xPosition - 1, height- 40, 0); this.mc.fontRenderer.drawString(staminaTally, width/2 + xPosition, height- 40 + 1, 0); this.mc.fontRenderer.drawString(staminaTally, width/2 + xPosition, height- 40 - 1, 0); this.mc.fontRenderer.drawString(staminaTally, width/2 + xPosition, height- 40, 9529416); GL11.glDisable(GL11.GL_BLEND); GL11.glEnable(GL11.GL_DEPTH_TEST); GL11.glDepthMask(true); }} } I use the PlayerTickEvent to increment the stamina bar every x number of ticks to allow stamina regen let me know if this is necessary to solve the issue but I doubt it I think it has to do with DataWatchers/packets and my limited understanding with how they work
February 25, 201510 yr comment_145573 What method are you using when you change the max value? I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP) II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.