Posted March 6, 20214 yr I'm trying to modify an entity's max health based on a stat, but either its not working or my client isn't acknowledging the change. The method for the change. Full class here. @Override public void modifyMaxHealth(LivingEntity entity) { if(entity == null) { return; } entity = getEntity(); final float newAmount = getMaxHealth(); final float oldAmount; final UUID MODIFIER_ID = UUID.fromString("d5d0d878-b3c2-469b-ba89-ac01c0635a9c"); final ModifiableAttributeInstance health = entity.getAttribute(Attributes.MAX_HEALTH); final AttributeModifier mod = new AttributeModifier(MODIFIER_ID, "Max Health", newAmount, AttributeModifier.Operation.ADDITION); final AttributeModifier oldMod = health.getModifier(MODIFIER_ID); if(oldMod != null) { health.removeModifier(oldMod); oldAmount = (float) oldMod.getAmount(); }else { oldAmount = 0; } health.applyPersistentModifier(mod); final float amountToHeal = newAmount - oldAmount; if(amountToHeal > 0) { entity.heal(amountToHeal); } } The sync method: @Override public void sync(ServerPlayerEntity player) { if(entity instanceof ServerPlayerEntity) { PacketHandler.sendTo(new SkillsPacket(serializeNBT()), player); if(!player.world.isRemote) { ModifiableAttributeInstance attribute = player.getAttribute(Attributes.MAX_HEALTH); SEntityPropertiesPacket packet = new SEntityPropertiesPacket(player.getEntityId(), Collections.singleton(attribute)); ((ServerWorld) player.getEntityWorld()).getChunkProvider().sendToTrackingAndSelf(player, packet); } } } My player event class: package lk1905.gielinorcraft.events; import lk1905.gielinorcraft.Gielinorcraft; import lk1905.gielinorcraft.api.skill.ISkills; import lk1905.gielinorcraft.capability.skill.SkillCapability; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerEvent.PlayerChangedDimensionEvent; import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent; import net.minecraftforge.event.entity.player.PlayerEvent.PlayerRespawnEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @Mod.EventBusSubscriber(modid = Gielinorcraft.MODID, bus = Mod.EventBusSubscriber.Bus.FORGE) public class PlayerEventHandler { @SubscribeEvent public static void onPlayerClone(PlayerEvent.Clone event) { if(!event.isWasDeath()) { return; } ISkills oldSkills = event.getOriginal().getCapability(SkillCapability.SKILL_CAP, null).orElse(null); ISkills newSkills = event.getPlayer().getCapability(SkillCapability.SKILL_CAP, null).orElse(null); if(oldSkills != null) { if(newSkills != null) { for(int i = 0; i < 26; i++) { newSkills.setXp(i, oldSkills.getXp(i)); newSkills.setStaticLevel(i, oldSkills.getStaticLevel(i)); newSkills.setLevel(i, oldSkills.getLevel(i)); } } } } @SubscribeEvent public static void onPlayerChangedDimensionEvent(PlayerChangedDimensionEvent event) { ServerPlayerEntity player = (ServerPlayerEntity) event.getPlayer(); if(!player.world.isRemote) { player.getCapability(SkillCapability.SKILL_CAP).ifPresent(c -> c.sync(player)); player.getCapability(SkillCapability.SKILL_CAP).ifPresent(c -> c.modifyMaxHealth(player)); } } @SubscribeEvent public static void onRespawnEvent(PlayerRespawnEvent event) { ServerPlayerEntity player = (ServerPlayerEntity) event.getPlayer(); if(!player.world.isRemote) { player.getCapability(SkillCapability.SKILL_CAP).ifPresent(c -> c.sync(player)); player.getCapability(SkillCapability.SKILL_CAP).ifPresent(c -> c.modifyMaxHealth(player)); } } @SubscribeEvent public static void onPlayerConnect(PlayerLoggedInEvent event) { ServerPlayerEntity player = (ServerPlayerEntity) event.getPlayer(); if(!player.world.isRemote) { player.getCapability(SkillCapability.SKILL_CAP).ifPresent(c -> c.sync(player)); player.getCapability(SkillCapability.SKILL_CAP).ifPresent(c -> c.modifyMaxHealth(player)); } } } Full repo here, if you need to look at anything else.
March 6, 20214 yr These lines seems pointless https://github.com/LK1905/GielinorCraft/blob/master/src/main/java/lk1905/gielinorcraft/api/skill/Skills.java#L383-L386 and the method should be called whenever the "max health skill" is changed, not just when they clone, respawn or something like that.
March 6, 20214 yr Author I solved the problem. The problem as that I didn't have the getMaxHealth() method saved within my serializeNBT() method, so the game still thought the value was zero. Saving that value fixed the problem.
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.