Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[1.7.10] Stamina Bar Refils But stops refilling if I change the max value

Featured Replies

Posted
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

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

Important Information

By using this site, you agree to our Terms of Use.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.