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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • I'm using Modrinth as a launcher for a forge modpack on 1.20.1, and can't diagnose the issue on the crash log myself. Have tried repairing the Minecraft instillation as well as removing a few mods that have been problematic for me in the past to no avail. Crash log is below, if any further information is necessary let me know. Thank you! https://paste.ee/p/k6xnS
    • Hey folks. I am working on a custom "Mecha" entity (extended from LivingEntity) that the player builds up from blocks that should get modular stats depending on the used blocks. e.g. depending on what will be used for the legs, the entity will have a different jump strength. However, something unexpected is happening when trying to override a few of LivingEntity's functions and using my new own "Mecha" specific fields: instead of their actual instance-specific value, the default value is used (0f for a float, null for an object...) This is especially strange as when executing with the same entity from a point in the code specific to the mecha entity, the correct value is used. Here are some code snippets to better illustrate what I mean: /* The main Mecha class, cut down for brevity */ public class Mecha extends LivingEntity { protected float jumpMultiplier; //somewhere later during the code when spawning the entity, jumpMultiplier is set to something like 1.5f //changing the access to public didn't help @Override //Overridden from LivingEntity, this function is only used in the jumpFromGround() function, used in the aiStep() function, used in the LivingEntity tick() function protected float getJumpPower() { //something is wrong with this function //for some reason I can't correctly access the fields and methods from the instanciated entity when I am in one of those overridden protected functions. this is very annoying LogUtils.getLogger().info(String.valueOf(this.jumpMultiplier))) //will print 0f return this.jumpMultiplier * super.getJumpPower(); } //The code above does not operate properly. Written as is, the entity will not jump, and adding debug logs shows that when executing the code, the value of this.jumpMultiplier is 0f //in contrast, it will be the correct value when done here: @Override public void tick() { super.tick(); //inherited LivingEntity logic //Custom logic LogUtils.getLogger().info(String.valueOf(this.jumpMultiplier))) //will print 1.5f } } My actual code is slightly different, as the jumpMuliplier is stored in another object (so I am calling "this.legModule.getJumpPower()" instead of the float), but even using a simple float exactly like in the code above didn't help. When running my usual code, the object I try to use is found to be null instead, leading to a crash from a nullPointerException. Here is the stacktrace of said crash: The full code can be viewed here. I have found a workaround in the case of jump strength, but have already found the same problem for another parameter I want to do, and I do not understand why the code is behaving as such, and I would very much like to be able to override those methods as intended - they seemed to work just fine like that for vanilla mobs... Any clues as to what may be happening here?
    • Please delete post. Had not noticed the newest edition for 1.20.6 which resolves the issue.
    • https://paste.ee/p/GTgAV Here's my debug log, I'm on 1.18.2 with forge 40.2.4 and I just want to get it to work!! I cant find any mod names in the error part and I would like some help from the pros!! I have 203 mods at the moment.
  • Topics

×
×
  • Create New...

Important Information

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