Jump to content

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


Thornack

Recommended Posts

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

Link to comment
Share on other sites

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...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

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