Fix max health not working properly, implement proper cracked support for iron golem. Fixes #549
This commit is contained in:
		| @@ -282,6 +282,10 @@ public class FlagWatcher { | ||||
|                 } | ||||
|  | ||||
|                 value = entityValues.get(id); | ||||
|  | ||||
|                 if (id == MetaIndex.LIVING_HEALTH.getIndex() && (float) watch.getRawValue() <= 0) { | ||||
|                     value = watch.getRawValue(); | ||||
|                 } | ||||
|             } else if (backupEntityValues.containsKey(id)) { | ||||
|                 if (backupEntityValues.get(id) == null) { | ||||
|                     continue; | ||||
|   | ||||
| @@ -0,0 +1,11 @@ | ||||
| package me.libraryaddict.disguise.disguisetypes; | ||||
|  | ||||
| /** | ||||
|  * Created by libraryaddict on 24/04/2021. | ||||
|  */ | ||||
| public enum GolemCrack { | ||||
|     HEALTH_100, | ||||
|     HEALTH_75, | ||||
|     HEALTH_50, | ||||
|     HEALTH_25 | ||||
| } | ||||
| @@ -1,9 +1,57 @@ | ||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | ||||
|  | ||||
| import lombok.Getter; | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.GolemCrack; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
|  | ||||
| public class IronGolemWatcher extends InsentientWatcher { | ||||
|     private GolemCrack cracks; | ||||
|  | ||||
|     public IronGolemWatcher(Disguise disguise) { | ||||
|         super(disguise); | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(NmsVersion.v1_16) | ||||
|     public GolemCrack getCracks() { | ||||
|         return cracks; | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(NmsVersion.v1_16) | ||||
|     public void setCracks(GolemCrack cracks) { | ||||
|         if (cracks == getCracks() || cracks == null) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         this.cracks = cracks; | ||||
|  | ||||
|         switch (cracks) { | ||||
|             case HEALTH_25: | ||||
|                 setHealth(24); | ||||
|                 break; | ||||
|             case HEALTH_50: | ||||
|                 setHealth(49); | ||||
|                 break; | ||||
|             case HEALTH_75: | ||||
|                 setHealth(74); | ||||
|                 break; | ||||
|             case HEALTH_100: | ||||
|                 setHealth(100); | ||||
|                 break; | ||||
|         } | ||||
|  | ||||
|         if (!isMaxHealthSet() || getMaxHealth() != 100) { | ||||
|             setMaxHealth(100); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public IronGolemWatcher clone(Disguise disguise) { | ||||
|         IronGolemWatcher watcher = (IronGolemWatcher) super.clone(disguise); | ||||
|  | ||||
|         watcher.setCracks(getCracks()); | ||||
|  | ||||
|         return watcher; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -11,6 +11,7 @@ import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||
| import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
| import org.bukkit.Color; | ||||
| @@ -129,7 +130,7 @@ public class LivingWatcher extends FlagWatcher { | ||||
|  | ||||
|             Builder builder; | ||||
|             builder = WrappedAttribute.newBuilder(); | ||||
|             builder.attributeKey("generic.maxHealth"); | ||||
|             builder.attributeKey(NmsVersion.v1_16.isSupported() ? "generic.max_health" : "generic.maxHealth"); | ||||
|             builder.baseValue(getMaxHealth()); | ||||
|             builder.packet(packet); | ||||
|  | ||||
| @@ -142,9 +143,14 @@ public class LivingWatcher extends FlagWatcher { | ||||
|  | ||||
|             for (Player player : DisguiseUtilities.getPerverts(getDisguise())) { | ||||
|                 try { | ||||
|                     ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet, false); | ||||
|                 } | ||||
|                 catch (InvocationTargetException e) { | ||||
|                     if (player == getDisguise().getEntity()) { | ||||
|                         PacketContainer p = packet.shallowClone(); | ||||
|                         p.getIntegers().write(0, DisguiseAPI.getSelfDisguiseId()); | ||||
|                         ProtocolLibrary.getProtocolManager().sendServerPacket(player, p, false); | ||||
|                     } else { | ||||
|                         ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet, false); | ||||
|                     } | ||||
|                 } catch (InvocationTargetException e) { | ||||
|                     e.printStackTrace(); | ||||
|                 } | ||||
|             } | ||||
|   | ||||
| @@ -23,16 +23,14 @@ import java.util.List; | ||||
|  * Created by libraryaddict on 3/01/2019. | ||||
|  */ | ||||
| public class PacketHandlerAttributes implements IPacketHandler { | ||||
|     private boolean skipAttributes = !NmsVersion.v1_14.isSupported() && | ||||
|             ProtocolLibrary.getPlugin().getDescription().getVersion().equals("4.5.0"); | ||||
|     private boolean skipAttributes = !NmsVersion.v1_14.isSupported() && ProtocolLibrary.getPlugin().getDescription().getVersion().equals("4.5.0"); | ||||
|  | ||||
|     public PacketHandlerAttributes() { | ||||
|         if (!skipAttributes) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         DisguiseUtilities.getLogger() | ||||
|                 .info("You are running ProtocolLib 4.5.0, attributes will not be handled; Update if you can."); | ||||
|         DisguiseUtilities.getLogger().info("You are running ProtocolLib 4.5.0, attributes will not be handled; Update if you can."); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
| @@ -41,8 +39,7 @@ public class PacketHandlerAttributes implements IPacketHandler { | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void handle(Disguise disguise, PacketContainer sentPacket, LibsPackets packets, Player observer, | ||||
|             Entity entity) { | ||||
|     public void handle(Disguise disguise, PacketContainer sentPacket, LibsPackets packets, Player observer, Entity entity) { | ||||
|         packets.clear(); | ||||
|  | ||||
|         // Skip due to a bug in ProtocolLib | ||||
| @@ -58,27 +55,25 @@ public class PacketHandlerAttributes implements IPacketHandler { | ||||
|         PacketContainer updateAttributes = new PacketContainer(PacketType.Play.Server.UPDATE_ATTRIBUTES); | ||||
|  | ||||
|         for (WrappedAttribute attribute : sentPacket.getAttributeCollectionModifier().read(0)) { | ||||
|             if (attribute.getAttributeKey().equals("generic.maxHealth")) { | ||||
|             if (attribute.getAttributeKey().equals(NmsVersion.v1_16.isSupported() ? "generic.max_health" : "generic.maxHealth")) { | ||||
|                 WrappedAttribute.Builder builder; | ||||
|  | ||||
|                 if (disguise.getWatcher() instanceof LivingWatcher && | ||||
|                         ((LivingWatcher) disguise.getWatcher()).isMaxHealthSet()) { | ||||
|                 if (disguise.getWatcher() instanceof LivingWatcher && ((LivingWatcher) disguise.getWatcher()).isMaxHealthSet()) { | ||||
|                     builder = WrappedAttribute.newBuilder(); | ||||
|                     builder.attributeKey("generic.maxHealth"); | ||||
|                     builder.attributeKey(attribute.getAttributeKey()); | ||||
|                     builder.baseValue(((LivingWatcher) disguise.getWatcher()).getMaxHealth()); | ||||
|                 } else if (DisguiseConfig.isMaxHealthDeterminedByDisguisedEntity()) { | ||||
|                     builder = WrappedAttribute.newBuilder(attribute); | ||||
|                 } else { | ||||
|                     builder = WrappedAttribute.newBuilder(); | ||||
|                     builder.attributeKey("generic.maxHealth"); | ||||
|                     builder.attributeKey(attribute.getAttributeKey()); | ||||
|                     builder.baseValue(DisguiseValues.getDisguiseValues(disguise.getType()).getMaxHealth()); | ||||
|                 } | ||||
|  | ||||
|                 builder.packet(updateAttributes); | ||||
|  | ||||
|                 attributes.add(builder.build()); | ||||
|             } else if (attribute.getAttributeKey().equals("generic.movementSpeed") && | ||||
|                     disguise.getWatcher() instanceof AbstractHorseWatcher) { | ||||
|             } else if (attribute.getAttributeKey().equals(NmsVersion.v1_16.isSupported() ? "generic.movement_speed" : "generic.movementSpeed") && disguise.getWatcher() instanceof AbstractHorseWatcher) { | ||||
|                 WrappedAttribute.Builder builder = WrappedAttribute.newBuilder(attribute); | ||||
|                 builder.packet(updateAttributes); | ||||
|  | ||||
|   | ||||
| @@ -71,33 +71,6 @@ public class PacketHandlerSpawn implements IPacketHandler { | ||||
|         Disguise disguise = packets.getDisguise(); | ||||
|         boolean sendArmor = true; | ||||
|  | ||||
|         if (DisguiseConfig.isMiscDisguisesForLivingEnabled()) { | ||||
|             if (disguise.getWatcher() instanceof LivingWatcher) { | ||||
|                 ArrayList<WrappedAttribute> attributes = new ArrayList<>(); | ||||
|  | ||||
|                 WrappedAttribute.Builder builder = WrappedAttribute.newBuilder().attributeKey("generic.maxHealth"); | ||||
|  | ||||
|                 if (((LivingWatcher) disguise.getWatcher()).isMaxHealthSet()) { | ||||
|                     builder.baseValue(((LivingWatcher) disguise.getWatcher()).getMaxHealth()); | ||||
|                 } else if (DisguiseConfig.isMaxHealthDeterminedByDisguisedEntity() && disguisedEntity instanceof Damageable) { | ||||
|                     builder.baseValue(((Damageable) disguisedEntity).getMaxHealth()); | ||||
|                 } else { | ||||
|                     builder.baseValue(DisguiseValues.getDisguiseValues(disguise.getType()).getMaxHealth()); | ||||
|                 } | ||||
|  | ||||
|                 PacketContainer packet = new PacketContainer(PacketType.Play.Server.UPDATE_ATTRIBUTES); | ||||
|  | ||||
|                 builder.packet(packet); | ||||
|  | ||||
|                 attributes.add(builder.build()); | ||||
|  | ||||
|                 packet.getIntegers().write(0, disguisedEntity.getEntityId()); | ||||
|                 packet.getAttributeCollectionModifier().write(0, attributes); | ||||
|  | ||||
|                 packets.addPacket(packet); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         Location loc = disguisedEntity.getLocation().clone().add(0, DisguiseUtilities.getYModifier(disguise) + disguise.getWatcher().getYModifier(), 0); | ||||
|  | ||||
|         Float pitchLock = DisguiseConfig.isMovementPacketsEnabled() ? disguise.getWatcher().getPitchLock() : null; | ||||
| @@ -174,7 +147,7 @@ public class PacketHandlerSpawn implements IPacketHandler { | ||||
|                 sendTab.getModifier().write(0, ReflectionManager.getEnumPlayerInfoAction(0)); | ||||
|  | ||||
|                 List playerList = Collections.singletonList(ReflectionManager.getPlayerInfoData(sendTab.getHandle(), ReflectionManager | ||||
|                     .getGameProfileWithThisSkin(playerDisguise.getUUID(), playerDisguise.getProfileName(), playerDisguise.getGameProfile()))); | ||||
|                         .getGameProfileWithThisSkin(playerDisguise.getUUID(), playerDisguise.getProfileName(), playerDisguise.getGameProfile()))); | ||||
|                 sendTab.getModifier().write(1, playerList); | ||||
|  | ||||
|                 packets.addPacket(sendTab); | ||||
| @@ -356,9 +329,8 @@ public class PacketHandlerSpawn implements IPacketHandler { | ||||
|                     entityType = ReflectionManager.getEntityType(disguise.getType().getEntityType()); | ||||
|                 } | ||||
|  | ||||
|                 Object[] params = | ||||
|                         new Object[]{disguisedEntity.getEntityId(), disguise.getUUID(), x, y, z, loc.getPitch(), loc.getYaw(), entityType, data, | ||||
|                                 ReflectionManager.getVec3D(disguisedEntity.getVelocity())}; | ||||
|                 Object[] params = new Object[]{disguisedEntity.getEntityId(), disguise.getUUID(), x, y, z, loc.getPitch(), loc.getYaw(), entityType, data, | ||||
|                         ReflectionManager.getVec3D(disguisedEntity.getVelocity())}; | ||||
|  | ||||
|                 spawnEntity = ProtocolLibrary.getProtocolManager().createPacketConstructor(PacketType.Play.Server.SPAWN_ENTITY, params).createPacket(params); | ||||
|             } else { | ||||
| @@ -430,6 +402,34 @@ public class PacketHandlerSpawn implements IPacketHandler { | ||||
|             packets.addPacket(newPacket); | ||||
|         } | ||||
|  | ||||
|         if (DisguiseConfig.isMiscDisguisesForLivingEnabled()) { | ||||
|             if (disguise.getWatcher() instanceof LivingWatcher) { | ||||
|                 ArrayList<WrappedAttribute> attributes = new ArrayList<>(); | ||||
|  | ||||
|                 WrappedAttribute.Builder builder = | ||||
|                         WrappedAttribute.newBuilder().attributeKey(NmsVersion.v1_16.isSupported() ? "generic.max_health" : "generic.maxHealth"); | ||||
|  | ||||
|                 if (((LivingWatcher) disguise.getWatcher()).isMaxHealthSet()) { | ||||
|                     builder.baseValue(((LivingWatcher) disguise.getWatcher()).getMaxHealth()); | ||||
|                 } else if (DisguiseConfig.isMaxHealthDeterminedByDisguisedEntity() && disguisedEntity instanceof Damageable) { | ||||
|                     builder.baseValue(((Damageable) disguisedEntity).getMaxHealth()); | ||||
|                 } else { | ||||
|                     builder.baseValue(DisguiseValues.getDisguiseValues(disguise.getType()).getMaxHealth()); | ||||
|                 } | ||||
|  | ||||
|                 PacketContainer packet = new PacketContainer(PacketType.Play.Server.UPDATE_ATTRIBUTES); | ||||
|  | ||||
|                 builder.packet(packet); | ||||
|  | ||||
|                 attributes.add(builder.build()); | ||||
|  | ||||
|                 packet.getIntegers().write(0, disguisedEntity.getEntityId()); | ||||
|                 packet.getAttributeCollectionModifier().write(0, attributes); | ||||
|  | ||||
|                 packets.addPacket(packet); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (!disguise.isPlayerDisguise() || normalPlayerDisguise) { | ||||
|             DisguiseUtilities.getNamePackets(disguise, new String[0]).forEach(packets::addPacket); | ||||
|         } | ||||
|   | ||||
| @@ -5,6 +5,7 @@ import com.comphenix.protocol.wrappers.WrappedGameProfile; | ||||
| import com.comphenix.protocol.wrappers.WrappedParticle; | ||||
| import me.libraryaddict.disguise.DisguiseConfig; | ||||
| import me.libraryaddict.disguise.disguisetypes.EntityPose; | ||||
| import me.libraryaddict.disguise.disguisetypes.GolemCrack; | ||||
| import me.libraryaddict.disguise.disguisetypes.RabbitType; | ||||
| import me.libraryaddict.disguise.utilities.params.types.ParamInfoEnum; | ||||
| import me.libraryaddict.disguise.utilities.params.types.base.*; | ||||
| @@ -129,6 +130,7 @@ public class ParamInfoTypes { | ||||
|                         "etc. 30m20secs = 30 minutes, 20 seconds")); | ||||
|  | ||||
|         paramInfos.add(new ParamInfoEnum(ChatColor.class, "ChatColor", "A chat color")); | ||||
|         paramInfos.add(new ParamInfoEnum(GolemCrack.class, "Golem Cracked", "The stage a golem has been cracked")); | ||||
|  | ||||
|         // Register base types | ||||
|         Map<String, Object> booleanMap = new HashMap<>(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user