]> git.seodisparate.com - TurnBasedMinecraftMod/commitdiff
Fix bow attack, config, add freeze enemies option
authorStephen Seo <seo.disparate@gmail.com>
Tue, 18 Sep 2018 06:56:06 +0000 (15:56 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Tue, 18 Sep 2018 06:56:06 +0000 (15:56 +0900)
Fix bug where bow attack hit announcement was made multiple times.
Fix config format for Entities.
Add feature to freeze combatants when battle starts, option to enable in
config.

src/main/java/com/seodisparate/TurnBasedMinecraft/common/AttackEventHandler.java
src/main/java/com/seodisparate/TurnBasedMinecraft/common/Battle.java
src/main/java/com/seodisparate/TurnBasedMinecraft/common/Combatant.java
src/main/java/com/seodisparate/TurnBasedMinecraft/common/Config.java
src/main/resources/assets/TurnBasedMinecraft/TBM_Config.xml

index 01ac49ea24b636b473970f57f2586c63ba8c3f8b..1fc14383006cf0ce84900fdf482b5d866d424ee3 100644 (file)
@@ -36,19 +36,20 @@ public class AttackEventHandler
                     else if(event.getSource().getTrueSource().equals(attacker.entity) && event.getSource().isProjectile())
                     {
                         removeQueue.add(attacker);
-                        isValid = true;
-                        Battle b = TurnBasedMinecraftMod.battleManager.getBattleByID(attacker.battleID);
-                        if(b != null)
+                        if(!isValid)
                         {
-                            b.sendMessageToAllPlayers(PacketBattleMessage.MessageType.ARROW_HIT, attacker.entity.getEntityId(), event.getEntity().getEntityId(), 0);
+                            Battle b = TurnBasedMinecraftMod.battleManager.getBattleByID(attacker.battleID);
+                            if(b != null)
+                            {
+                                b.sendMessageToAllPlayers(PacketBattleMessage.MessageType.ARROW_HIT, attacker.entity.getEntityId(), event.getEntity().getEntityId(), 0);
+                            }
+                            isValid = true;
                         }
                     }
                 }
-                AttackerViaBow next = removeQueue.poll();
-                while(next != null)
+                for(AttackerViaBow next = removeQueue.poll(); next != null; next = removeQueue.poll())
                 {
                     TurnBasedMinecraftMod.attackerViaBow.remove(next);
-                    next = removeQueue.poll();
                 }
             }
             return isValid;
index ee2e2b46c2dc35d004eeb1e13bda7e09fa6463a8..4e8057b946bdd1e34a6ebfaf16eeeee032a2a740 100644 (file)
@@ -144,6 +144,14 @@ public class Battle
                     playerCount.incrementAndGet();
                     players.put(e.getEntityId(), newCombatant);
                 }
+                if(TurnBasedMinecraftMod.config.isFreezeCombatantsEnabled())
+                {
+                    newCombatant.x = e.posX;
+                    newCombatant.y = e.posY;
+                    newCombatant.z = e.posZ;
+                    newCombatant.yaw = e.rotationYaw;
+                    newCombatant.pitch = e.rotationPitch;
+                }
             }
         }
         if(sideB != null)
@@ -165,6 +173,14 @@ public class Battle
                     playerCount.incrementAndGet();
                     players.put(e.getEntityId(), newCombatant);
                 }
+                if(TurnBasedMinecraftMod.config.isFreezeCombatantsEnabled())
+                {
+                    newCombatant.x = e.posX;
+                    newCombatant.y = e.posY;
+                    newCombatant.z = e.posZ;
+                    newCombatant.yaw = e.rotationYaw;
+                    newCombatant.pitch = e.rotationPitch;
+                }
             }
         }
         
@@ -251,6 +267,14 @@ public class Battle
                 undecidedCount.incrementAndGet();
             }
         }
+        if(TurnBasedMinecraftMod.config.isFreezeCombatantsEnabled())
+        {
+            newCombatant.x = e.posX;
+            newCombatant.y = e.posY;
+            newCombatant.z = e.posZ;
+            newCombatant.yaw = e.rotationYaw;
+            newCombatant.pitch = e.rotationPitch;
+        }
         if(newCombatant.entityInfo != null)
         {
             sendMessageToAllPlayers(PacketBattleMessage.MessageType.ENTERED, newCombatant.entity.getEntityId(), 0, id, newCombatant.entityInfo.category);
@@ -283,6 +307,14 @@ public class Battle
                 undecidedCount.incrementAndGet();
             }
         }
+        if(TurnBasedMinecraftMod.config.isFreezeCombatantsEnabled())
+        {
+            newCombatant.x = e.posX;
+            newCombatant.y = e.posY;
+            newCombatant.z = e.posZ;
+            newCombatant.yaw = e.rotationYaw;
+            newCombatant.pitch = e.rotationPitch;
+        }
         if(newCombatant.entityInfo != null)
         {
             sendMessageToAllPlayers(PacketBattleMessage.MessageType.ENTERED, newCombatant.entity.getEntityId(), 0, id, newCombatant.entityInfo.category);
@@ -516,6 +548,18 @@ public class Battle
         }
     }
     
+    private void enforceFreezePositions()
+    {
+        for(Combatant c : sideA.values())
+        {
+            c.entity.setPositionAndRotation(c.x, c.y, c.z, c.yaw, c.pitch);
+        }
+        for(Combatant c : sideB.values())
+        {
+            c.entity.setPositionAndRotation(c.x, c.y, c.z, c.yaw, c.pitch);
+        }
+    }
+    
     /**
      * @return True if battle has ended
      */
@@ -537,6 +581,10 @@ public class Battle
         {
             return true;
         }
+        if(TurnBasedMinecraftMod.config.isFreezeCombatantsEnabled())
+        {
+            enforceFreezePositions();
+        }
         switch(state)
         {
         case DECISION:
@@ -604,12 +652,10 @@ public class Battle
             break;
         case ACTION:
             {
-                Combatant next = turnOrderQueue.poll();
-                while(next != null)
+                for(Combatant next = turnOrderQueue.poll(); next != null; next = turnOrderQueue.poll())
                 {
                     if(!next.entity.isEntityAlive())
                     {
-                        next = turnOrderQueue.poll();
                         continue;
                     }
                     
@@ -643,9 +689,16 @@ public class Battle
                                 {
                                     final Entity nextEntity = next.entity;
                                     final Entity targetEntity = target.entity;
+                                    final float yawDirection = Utility.yawDirection(next.entity.posX, next.entity.posZ, target.entity.posX, target.entity.posZ);
+                                    final float pitchDirection = Utility.pitchDirection(next.entity.posX, next.entity.posY, next.entity.posZ, target.entity.posX, target.entity.posY, target.entity.posZ);
+                                    if(TurnBasedMinecraftMod.config.isFreezeCombatantsEnabled())
+                                    {
+                                        next.yaw = yawDirection;
+                                        next.pitch = pitchDirection;
+                                    }
                                     next.entity.getServer().addScheduledTask(() -> {
                                         // have player look at attack target
-                                        ((EntityPlayerMP)nextEntity).connection.setPlayerLocation(nextEntity.posX, nextEntity.posY, nextEntity.posZ, Utility.yawDirection(nextEntity.posX, nextEntity.posZ, targetEntity.posX, targetEntity.posZ), Utility.pitchDirection(nextEntity.posX, nextEntity.posY, nextEntity.posZ, targetEntity.posX, targetEntity.posY, targetEntity.posZ));
+                                        ((EntityPlayerMP)nextEntity).connection.setPlayerLocation(nextEntity.posX, nextEntity.posY, nextEntity.posZ, yawDirection, pitchDirection);
                                         ItemBow itemBow = (ItemBow)heldItemStack.getItem();
                                         synchronized(TurnBasedMinecraftMod.attackerViaBow)
                                         {
@@ -659,7 +712,6 @@ public class Battle
                                 {
                                     sendMessageToAllPlayers(PacketBattleMessage.MessageType.BOW_NO_AMMO, next.entity.getEntityId(), 0, 0);
                                 }
-                                next = turnOrderQueue.poll();
                                 continue;
                             }
                             int hitChance = TurnBasedMinecraftMod.config.getPlayerAttackProbability();
@@ -683,9 +735,16 @@ public class Battle
                                     final Entity nextEntity = next.entity;
                                     final Entity targetEntity = target.entity;
                                     final EntityInfo targetEntityInfo = target.entityInfo;
+                                    final float yawDirection = Utility.yawDirection(next.entity.posX, next.entity.posZ, target.entity.posX, target.entity.posZ);
+                                    final float pitchDirection = Utility.pitchDirection(next.entity.posX, next.entity.posY, next.entity.posZ, target.entity.posX, target.entity.posY, target.entity.posZ);
+                                    if(TurnBasedMinecraftMod.config.isFreezeCombatantsEnabled())
+                                    {
+                                        next.yaw = yawDirection;
+                                        next.pitch = pitchDirection;
+                                    }
                                     next.entity.getServer().addScheduledTask(() -> {
                                         // have player look at attack target
-                                        ((EntityPlayerMP)nextEntity).connection.setPlayerLocation(nextEntity.posX, nextEntity.posY, nextEntity.posZ, Utility.yawDirection(nextEntity.posX, nextEntity.posZ, targetEntity.posX, targetEntity.posZ), Utility.pitchDirection(nextEntity.posX, nextEntity.posY, nextEntity.posZ, targetEntity.posX, targetEntity.posY, targetEntity.posZ));
+                                        ((EntityPlayerMP)nextEntity).connection.setPlayerLocation(nextEntity.posX, nextEntity.posY, nextEntity.posZ, yawDirection, pitchDirection);
                                         TurnBasedMinecraftMod.attackingEntity = nextEntity;
                                         TurnBasedMinecraftMod.attackingDamage = 0;
                                         ((EntityPlayer)nextEntity).attackTargetEntityWithCurrentItem(targetEntity);
@@ -746,7 +805,6 @@ public class Battle
                             }
                             if(target == null || !target.entity.isEntityAlive())
                             {
-                                next = turnOrderQueue.poll();
                                 continue;
                             }
                             int hitChance = next.entityInfo.attackProbability;
@@ -965,7 +1023,6 @@ public class Battle
                         sendMessageToAllPlayers(PacketBattleMessage.MessageType.SWITCHED_ITEM, next.entity.getEntityId(), 0, 1);
                         break;
                     }
-                    next = turnOrderQueue.poll();
                 }
                 for(Combatant c : sideA.values())
                 {
index 80f2c1ff4e05153204e508252cc7bc4b81ed56ba..d2ac975eed59629a29cd358792beeb70bf30d20e 100644 (file)
@@ -19,6 +19,11 @@ public class Combatant
     public boolean isSideA;
     public int remainingDefenses;
     public int battleID;
+    public double x;
+    public double y;
+    public double z;
+    public float yaw;
+    public float pitch;
     
     public Combatant()
     {
index b27e43fd065a0a454fa43dd929761efc026f3a6e..3a752c54b90807d7a2a394ba4bb3165d0ec30d8b 100644 (file)
@@ -37,6 +37,7 @@ public class Config
     private int maxInBattle = 8;
     private Set<String> musicBattleTypes;
     private Set<String> musicSillyTypes;
+    private boolean freezeCombatantsInBattle = false;
     
     public Config(Logger logger)
     {
@@ -163,6 +164,10 @@ public class Config
                 {
                     maxInBattle = Integer.parseInt(xmlReader.getElementText());
                 }
+                else if(xmlReader.getLocalName().equals("FreezeBattleCombatants"))
+                {
+                    freezeCombatantsInBattle = !xmlReader.getElementText().toLowerCase().equals("false");
+                }
                 else if(xmlReader.getLocalName().equals("IgnoreBattleTypes"))
                 {
                     do
@@ -263,103 +268,108 @@ public class Config
                         xmlReader.next();
                         if(xmlReader.isStartElement())
                         {
-                            String classType = xmlReader.getLocalName();
-                            EntityInfo eInfo = new EntityInfo();
-                            try
+                            if(xmlReader.getLocalName().equals("Entry"))
                             {
-                                eInfo.classType = Class.forName(classType);
-                            } catch (ClassNotFoundException e)
-                            {
-                                logger.error("Failed to get class of name " + classType);
-                            }
-                            do
-                            {
-                                xmlReader.next();
-                                if(xmlReader.isStartElement())
+                                EntityInfo eInfo = new EntityInfo();
+                                do
                                 {
-                                    if(xmlReader.getLocalName().equals("AttackPower"))
+                                    xmlReader.next();
+                                    if(xmlReader.isStartElement())
                                     {
-                                        for(int i = 0; i < xmlReader.getAttributeCount(); ++i)
+                                        if(xmlReader.getLocalName().equals("Name"))
                                         {
-                                            if(xmlReader.getAttributeLocalName(i).equals("Probability"))
+                                            try
                                             {
-                                                eInfo.attackProbability = Integer.parseInt(xmlReader.getAttributeValue(i));
-                                            }
-                                            else if(xmlReader.getAttributeLocalName(i).equals("Variance"))
+                                                eInfo.classType = Class.forName(xmlReader.getElementText());
+                                            } catch (ClassNotFoundException e)
                                             {
-                                                eInfo.attackVariance = Integer.parseInt(xmlReader.getAttributeValue(i));
+                                                logger.error("Failed to get class of name " + xmlReader.getElementText());
                                             }
                                         }
-                                        eInfo.attackPower = Integer.parseInt(xmlReader.getElementText());
-                                    }
-                                    else if(xmlReader.getLocalName().equals("AttackEffect"))
-                                    {
-                                        for(int i = 0; i < xmlReader.getAttributeCount(); ++i)
+                                        else if(xmlReader.getLocalName().equals("AttackPower"))
                                         {
-                                            if(xmlReader.getAttributeLocalName(i).equals("Probability"))
+                                            for(int i = 0; i < xmlReader.getAttributeCount(); ++i)
                                             {
-                                                eInfo.attackEffectProbability = Integer.parseInt(xmlReader.getAttributeValue(i));
+                                                if(xmlReader.getAttributeLocalName(i).equals("Probability"))
+                                                {
+                                                    eInfo.attackProbability = Integer.parseInt(xmlReader.getAttributeValue(i));
+                                                }
+                                                else if(xmlReader.getAttributeLocalName(i).equals("Variance"))
+                                                {
+                                                    eInfo.attackVariance = Integer.parseInt(xmlReader.getAttributeValue(i));
+                                                }
                                             }
+                                            eInfo.attackPower = Integer.parseInt(xmlReader.getElementText());
                                         }
-                                        eInfo.attackEffect = EntityInfo.Effect.fromString(xmlReader.getElementText());
-                                    }
-                                    else if(xmlReader.getLocalName().equals("Evasion"))
-                                    {
-                                        eInfo.evasion = Integer.parseInt(xmlReader.getElementText());
-                                    }
-                                    else if(xmlReader.getLocalName().equals("DefenseDamage"))
-                                    {
-                                        for(int i = 0; i < xmlReader.getAttributeCount(); ++i)
+                                        else if(xmlReader.getLocalName().equals("AttackEffect"))
                                         {
-                                            if(xmlReader.getAttributeLocalName(i).equals("Probability"))
+                                            for(int i = 0; i < xmlReader.getAttributeCount(); ++i)
                                             {
-                                                eInfo.defenseDamageProbability = Integer.parseInt(xmlReader.getAttributeValue(i));
+                                                if(xmlReader.getAttributeLocalName(i).equals("Probability"))
+                                                {
+                                                    eInfo.attackEffectProbability = Integer.parseInt(xmlReader.getAttributeValue(i));
+                                                }
                                             }
+                                            eInfo.attackEffect = EntityInfo.Effect.fromString(xmlReader.getElementText());
                                         }
-                                        eInfo.defenseDamage = Integer.parseInt(xmlReader.getElementText());
-                                    }
-                                    else if(xmlReader.getLocalName().equals("Category"))
-                                    {
-                                        eInfo.category = xmlReader.getElementText().toLowerCase();
-                                    }
-                                    else if(xmlReader.getLocalName().equals("IgnoreBattle"))
-                                    {
-                                        if(xmlReader.getElementText().toLowerCase().equals("true"))
+                                        else if(xmlReader.getLocalName().equals("Evasion"))
                                         {
-                                            eInfo.ignoreBattle = true;
+                                            eInfo.evasion = Integer.parseInt(xmlReader.getElementText());
                                         }
-                                    }
-                                    else if(xmlReader.getLocalName().equals("Speed"))
-                                    {
-                                        eInfo.speed = Integer.parseInt(xmlReader.getElementText());
-                                    }
-                                    else if(xmlReader.getLocalName().equals("Decision"))
-                                    {
-                                        do
+                                        else if(xmlReader.getLocalName().equals("DefenseDamage"))
                                         {
-                                            xmlReader.next();
-                                            if(xmlReader.isStartElement())
+                                            for(int i = 0; i < xmlReader.getAttributeCount(); ++i)
                                             {
-                                                if(xmlReader.getLocalName().equals("Attack"))
+                                                if(xmlReader.getAttributeLocalName(i).equals("Probability"))
                                                 {
-                                                    eInfo.decisionAttack = Integer.parseInt(xmlReader.getElementText());
+                                                    eInfo.defenseDamageProbability = Integer.parseInt(xmlReader.getAttributeValue(i));
                                                 }
-                                                else if(xmlReader.getLocalName().equals("Defend"))
-                                                {
-                                                    eInfo.decisionDefend = Integer.parseInt(xmlReader.getElementText());
-                                                }
-                                                else if(xmlReader.getLocalName().equals("Flee"))
+                                            }
+                                            eInfo.defenseDamage = Integer.parseInt(xmlReader.getElementText());
+                                        }
+                                        else if(xmlReader.getLocalName().equals("Category"))
+                                        {
+                                            eInfo.category = xmlReader.getElementText().toLowerCase();
+                                        }
+                                        else if(xmlReader.getLocalName().equals("IgnoreBattle"))
+                                        {
+                                            if(xmlReader.getElementText().toLowerCase().equals("true"))
+                                            {
+                                                eInfo.ignoreBattle = true;
+                                            }
+                                        }
+                                        else if(xmlReader.getLocalName().equals("Speed"))
+                                        {
+                                            eInfo.speed = Integer.parseInt(xmlReader.getElementText());
+                                        }
+                                        else if(xmlReader.getLocalName().equals("Decision"))
+                                        {
+                                            do
+                                            {
+                                                xmlReader.next();
+                                                if(xmlReader.isStartElement())
                                                 {
-                                                    eInfo.decisionFlee = Integer.parseInt(xmlReader.getElementText());
+                                                    if(xmlReader.getLocalName().equals("Attack"))
+                                                    {
+                                                        eInfo.decisionAttack = Integer.parseInt(xmlReader.getElementText());
+                                                    }
+                                                    else if(xmlReader.getLocalName().equals("Defend"))
+                                                    {
+                                                        eInfo.decisionDefend = Integer.parseInt(xmlReader.getElementText());
+                                                    }
+                                                    else if(xmlReader.getLocalName().equals("Flee"))
+                                                    {
+                                                        eInfo.decisionFlee = Integer.parseInt(xmlReader.getElementText());
+                                                    }
                                                 }
-                                            }
-                                        } while(!(xmlReader.isEndElement() && xmlReader.getLocalName().equals("Decision")));
+                                            } while(!(xmlReader.isEndElement() && xmlReader.getLocalName().equals("Decision")));
+                                        }
                                     }
+                                } while(!(xmlReader.isEndElement() && xmlReader.getLocalName().equals("Entry")));
+                                if(eInfo.classType != null)
+                                {
+                                    entityInfoMap.put(eInfo.classType.getName(), eInfo);
                                 }
-                            } while(!(xmlReader.isEndElement() && xmlReader.getLocalName().equals(classType)));
-                            if(eInfo.classType != null)
-                            {
-                                entityInfoMap.put(eInfo.classType.getName(), eInfo);
                             }
                         }
                     } while(!(xmlReader.isEndElement() && xmlReader.getLocalName().equals("EntityStats")));
@@ -500,4 +510,9 @@ public class Config
     {
         return musicSillyTypes.contains(type.toLowerCase());
     }
+    
+    public boolean isFreezeCombatantsEnabled()
+    {
+        return freezeCombatantsInBattle;
+    }
 }
index 952bd985bfe024a284027c3e705a934f38224939..294cff4933ac35799f969e899536cc9a2c762e82 100644 (file)
@@ -1,8 +1,10 @@
 <TurnBasedMinecraftConfig>
        <!-- If the mod has a newer version config, it will rename the existing config and place the new config -->
-       <Version>2</Version>
+       <Version>3</Version>
        <!-- If there are "MaxInBattle" amount of entities in battle, other entities cannot join until combatants leave battle. -->
        <MaxInBattle>8</MaxInBattle>
+       <!-- If not set to "false", then when battle starts all combatants will remain in their starting position. -->
+       <FreezeBattleCombatants>false</FreezeBattleCombatants>
        <!-- Types that will not initiate battle with player. They are listed as "Category" per EntiytStats entity.
                 Note that items listed in "IgnoreBattleTypes" and "Category" are converted to lowercase before being compared. -->
        <IgnoreBattleTypes>
@@ -37,6 +39,7 @@
        <MinimumHitPercentage>4</MinimumHitPercentage>
        <!-- Battle stats for entities should be specified here. If an entity is not listed it cannot enter battle. -->
        <EntityStats>
+               <!-- Name: The full class name of an entity. -->
                <!-- AttackPower: How much damage an entity does per attack. Usually has a "Probability" attribute between 0 and 100. Also may have a "Variance" attribute that varies the attack power by the specified amount randomly. -->
                <!-- AttackEffect: (Optional) Applies effect to target entity with "Probability" success rate. -->
                <!-- DefenseDamage: (Optional) Applies damage to an attacker when attacked with "Probability" success rate. -->
@@ -46,7 +49,8 @@
                <!-- IgnoreBattle: (Optional) Per entity setting to not enter turn-based-battle if value is "true". If "true" these stats will not apply to the entity as they are only used in turn-based-battle. -->
                <!-- Category: Sets the type of the entity, used by "IgnoreBattleTypes" to determine what types ignore battle. -->
                <!-- Decision: Lists percentages of what action taken by the entity, one of Attack, Defend, or Flee. If the sum is less than 100, the mob has a chance to do nothing with the remaining percentage -->
-               <net.minecraft.entity.monster.EntityBlaze>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntityBlaze</Name>
                        <AttackPower Probability="50">5</AttackPower>
                        <AttackEffect Probability="75">fire</AttackEffect>
                        <Evasion>5</Evasion>
@@ -57,8 +61,9 @@
                                <Defend>0</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntityBlaze>
-               <net.minecraft.entity.monster.EntityCaveSpider>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntityCaveSpider</Name>
                        <AttackPower Probability="75">2</AttackPower>
                        <AttackEffect Probability="90">poison</AttackEffect>
                        <Evasion>35</Evasion>
@@ -69,8 +74,9 @@
                                <Defend>0</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntityCaveSpider>
-               <net.minecraft.entity.monster.EntityCreeper>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntityCreeper</Name>
                        <IgnoreBattle>true</IgnoreBattle>
                        <AttackPower Probability="17" Variance="7">15</AttackPower>
                        <Evasion>5</Evasion>
@@ -81,8 +87,9 @@
                                <Defend>0</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntityCreeper>
-               <net.minecraft.entity.monster.EntityElderGuardian>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntityElderGuardian</Name>
                        <AttackPower Probability="65">8</AttackPower>
                        <DefenseDamage Probability="35">2</DefenseDamage>
                        <Evasion>25</Evasion>
                                <Defend>20</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntityElderGuardian>
-               <net.minecraft.entity.monster.EntityEnderman>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntityEnderman</Name>
                        <AttackPower Probability="80">7</AttackPower>
                        <Evasion>40</Evasion>
                        <Category>monster</Category>
                                <Defend>0</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntityEnderman>
-               <net.minecraft.entity.monster.EntityEndermite>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntityEndermite</Name>
                        <AttackPower Probability="80">2</AttackPower>
                        <Evasion>40</Evasion>
                        <Category>monster</Category>
                                <Defend>0</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntityEndermite>
-               <net.minecraft.entity.monster.EntityEvoker>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntityEvoker</Name>
                        <AttackPower Probability="60">6</AttackPower>
                        <Evasion>35</Evasion>
                        <Category>monster</Category>
                                <Defend>0</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntityEvoker>
-               <net.minecraft.entity.monster.EntityGhast>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntityGhast</Name>
                        <IgnoreBattle>true</IgnoreBattle>
                        <AttackPower Probability="20">13</AttackPower>
                        <Evasion>35</Evasion>
                                <Defend>0</Defend>
                                <Flee>25</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntityGhast>
-               <net.minecraft.entity.monster.EntityGiantZombie>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntityGiantZombie</Name>
                        <AttackPower Probability="35">11</AttackPower>
                        <Evasion>2</Evasion>
                        <Category>monster</Category>
                                <Defend>0</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntityGiantZombie>
-               <net.minecraft.entity.monster.EntityGuardian>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntityGuardian</Name>
                        <AttackPower Probability="55">6</AttackPower>
                        <DefenseDamage Probability="30">2</DefenseDamage>
                        <Evasion>25</Evasion>
                                <Defend>20</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntityGuardian>
-               <net.minecraft.entity.monster.EntityHusk>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntityHusk</Name>
                        <AttackPower Probability="70">3</AttackPower>
                        <AttackEffect Probability="95">hunger</AttackEffect>
                        <Evasion>5</Evasion>
                                <Defend>0</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntityHusk>
-               <net.minecraft.entity.monster.EntityIronGolem>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntityIronGolem</Name>
                        <AttackPower Probability="85" Variance="7">14</AttackPower>
                        <Evasion>5</Evasion>
                        <Category>monster</Category>
                                <Defend>0</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntityIronGolem>
-               <net.minecraft.entity.monster.EntityMagmaCube>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntityMagmaCube</Name>
                        <AttackPower Probability="35">3</AttackPower>
                        <Evasion>12</Evasion>
                        <Category>monster</Category>
                                <Defend>0</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntityMagmaCube>
-               <net.minecraft.entity.monster.EntityPigZombie>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntityPigZombie</Name>
                        <AttackPower Probability="70">8</AttackPower>
                        <Evasion>10</Evasion>
                        <Category>monster</Category>
                                <Defend>0</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntityPigZombie>
-               <net.minecraft.entity.monster.EntityPolarBear>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntityPolarBear</Name>
                        <AttackPower Probability="67">6</AttackPower>
                        <Evasion>5</Evasion>
                        <Category>animal</Category>
                                <Defend>0</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntityPolarBear>
-               <net.minecraft.entity.monster.EntityShulker>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntityShulker</Name>
                        <AttackPower Probability="80">4</AttackPower>
                        <Evasion>15</Evasion>
                        <Category>monster</Category>
                                <Defend>0</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntityShulker>
-               <net.minecraft.entity.monster.EntitySilverfish>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntitySilverfish</Name>
                        <AttackPower Probability="85">1</AttackPower>
                        <Evasion>37</Evasion>
                        <Category>monster</Category>
                                <Defend>0</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntitySilverfish>
-               <net.minecraft.entity.monster.EntitySkeleton>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntitySkeleton</Name>
                        <AttackPower Probability="75" Variance="1">3</AttackPower>
                        <Evasion>13</Evasion>
                        <Category>monster</Category>
                                <Defend>0</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntitySkeleton>
-               <net.minecraft.entity.monster.EntitySlime>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntitySlime</Name>
                        <AttackPower Probability="35">2</AttackPower>
                        <Evasion>10</Evasion>
                        <Category>monster</Category>
                                <Defend>0</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntitySlime>
-               <net.minecraft.entity.monster.EntitySnowman>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntitySnowman</Name>
                        <AttackPower Probability="80">0</AttackPower>
                        <Evasion>5</Evasion>
                        <Category>passive</Category>
                                <Defend>0</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntitySnowman>
-               <net.minecraft.entity.monster.EntitySpider>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntitySpider</Name>
                        <AttackPower Probability="70">2</AttackPower>
                        <Evasion>25</Evasion>
                        <Category>monster</Category>
                                <Defend>0</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntitySpider>
-               <net.minecraft.entity.monster.EntityStray>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntityStray</Name>
                        <AttackPower Probability="75" Variance="1">3</AttackPower>
                        <AttackEffect Probability="90">slow</AttackEffect>
                        <Evasion>13</Evasion>
                                <Defend>0</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntityStray>
-               <net.minecraft.entity.monster.EntityVex>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntityVex</Name>
                        <AttackPower Probability="65">9</AttackPower>
                        <Evasion>30</Evasion>
                        <Category>monster</Category>
                                <Defend>0</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntityVex>
-               <net.minecraft.entity.monster.EntityVindicator>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntityVindicator</Name>
                        <AttackPower Probability="70">13</AttackPower>
                        <Evasion>10</Evasion>
                        <Category>monster</Category>
                                <Defend>0</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntityVindicator>
-               <net.minecraft.entity.monster.EntityWitch>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntityWitch</Name>
                        <AttackPower Probability="75" Variance="1">5</AttackPower>
                        <Evasion>8</Evasion>
                        <Category>monster</Category>
                                <Defend>0</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntityWitch>
-               <net.minecraft.entity.monster.EntityWitherSkeleton>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntityWitherSkeleton</Name>
                        <AttackPower Probability="70">8</AttackPower>
                        <AttackEffect Probability="90">wither</AttackEffect>
                        <Evasion>7</Evasion>
                                <Defend>0</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntityWitherSkeleton>
-               <net.minecraft.entity.monster.EntityZombie>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntityZombie</Name>
                        <AttackPower Probability="70">3</AttackPower>
                        <Evasion>5</Evasion>
                        <Category>monster</Category>
                                <Defend>0</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntityZombie>
-               <net.minecraft.entity.monster.EntityZombieVillager>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.monster.EntityZombieVillager</Name>
                        <AttackPower Probability="70">3</AttackPower>
                        <Evasion>5</Evasion>
                        <Category>monster</Category>
                                <Defend>0</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.monster.EntityZombieVillager>
-               <net.minecraft.entity.passive.EntityBat>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.passive.EntityBat</Name>
                        <AttackPower Probability="70">0</AttackPower>
                        <Evasion>35</Evasion>
                        <Category>passive</Category>
                                <Defend>0</Defend>
                                <Flee>90</Flee>
                        </Decision>
-               </net.minecraft.entity.passive.EntityBat>
-               <net.minecraft.entity.passive.EntityChicken>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.passive.EntityChicken</Name>
                        <AttackPower Probability="70">0</AttackPower>
                        <Evasion>10</Evasion>
                        <Category>passive</Category>
                                <Defend>0</Defend>
                                <Flee>90</Flee>
                        </Decision>
-               </net.minecraft.entity.passive.EntityChicken>
-               <net.minecraft.entity.passive.EntityCow>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.passive.EntityCow</Name>
                        <AttackPower Probability="50">0</AttackPower>
                        <Evasion>1</Evasion>
                        <Category>passive</Category>
                                <Defend>10</Defend>
                                <Flee>80</Flee>
                        </Decision>
-               </net.minecraft.entity.passive.EntityCow>
-               <net.minecraft.entity.passive.EntityDonkey>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.passive.EntityDonkey</Name>
                        <AttackPower Probability="70">0</AttackPower>
                        <Evasion>10</Evasion>
                        <Category>passive</Category>
                                <Defend>0</Defend>
                                <Flee>90</Flee>
                        </Decision>
-               </net.minecraft.entity.passive.EntityDonkey>
-               <net.minecraft.entity.passive.EntityHorse>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.passive.EntityHorse</Name>
                        <AttackPower Probability="70">0</AttackPower>
                        <Evasion>10</Evasion>
                        <Category>passive</Category>
                                <Defend>0</Defend>
                                <Flee>90</Flee>
                        </Decision>
-               </net.minecraft.entity.passive.EntityHorse>
-               <net.minecraft.entity.passive.EntityLlama>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.passive.EntityLlama</Name>
                        <AttackPower Probability="70">1</AttackPower>
                        <Evasion>10</Evasion>
                        <Category>passive</Category>
                                <Defend>0</Defend>
                                <Flee>25</Flee>
                        </Decision>
-               </net.minecraft.entity.passive.EntityLlama>
-               <net.minecraft.entity.passive.EntityMooshroom>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.passive.EntityMooshroom</Name>
                        <AttackPower Probability="70">0</AttackPower>
                        <Evasion>1</Evasion>
                        <Category>passive</Category>
                                <Defend>10</Defend>
                                <Flee>80</Flee>
                        </Decision>
-               </net.minecraft.entity.passive.EntityMooshroom>
-               <net.minecraft.entity.passive.EntityMule>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.passive.EntityMule</Name>
                        <AttackPower Probability="70">0</AttackPower>
                        <Evasion>10</Evasion>
                        <Category>passive</Category>
                                <Defend>0</Defend>
                                <Flee>90</Flee>
                        </Decision>
-               </net.minecraft.entity.passive.EntityMule>
-               <net.minecraft.entity.passive.EntityOcelot>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.passive.EntityOcelot</Name>
                        <AttackPower Probability="70" Variance="1">1</AttackPower>
                        <Evasion>10</Evasion>
                        <Category>passive</Category>
                                <Defend>0</Defend>
                                <Flee>90</Flee>
                        </Decision>
-               </net.minecraft.entity.passive.EntityOcelot>
-               <net.minecraft.entity.passive.EntityParrot>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.passive.EntityParrot</Name>
                        <AttackPower Probability="70">0</AttackPower>
                        <Evasion>35</Evasion>
                        <Category>passive</Category>
                                <Defend>0</Defend>
                                <Flee>90</Flee>
                        </Decision>
-               </net.minecraft.entity.passive.EntityParrot>
-               <net.minecraft.entity.passive.EntityPig>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.passive.EntityPig</Name>
                        <AttackPower Probability="70">0</AttackPower>
                        <Evasion>10</Evasion>
                        <Category>passive</Category>
                                <Defend>5</Defend>
                                <Flee>85</Flee>
                        </Decision>
-               </net.minecraft.entity.passive.EntityPig>
-               <net.minecraft.entity.passive.EntityRabbit>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.passive.EntityRabbit</Name>
                        <AttackPower Probability="70">0</AttackPower>
                        <Evasion>40</Evasion>
                        <Category>passive</Category>
                                <Defend>0</Defend>
                                <Flee>100</Flee>
                        </Decision>
-               </net.minecraft.entity.passive.EntityRabbit>
-               <net.minecraft.entity.passive.EntitySheep>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.passive.EntitySheep</Name>
                        <AttackPower Probability="70">0</AttackPower>
                        <Evasion>5</Evasion>
                        <Category>passive</Category>
                                <Defend>0</Defend>
                                <Flee>90</Flee>
                        </Decision>
-               </net.minecraft.entity.passive.EntitySheep>
-               <net.minecraft.entity.passive.EntitySkeletonHorse>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.passive.EntitySkeletonHorse</Name>
                        <AttackPower Probability="70">0</AttackPower>
                        <Evasion>5</Evasion>
                        <Category>passive</Category>
                                <Defend>0</Defend>
                                <Flee>90</Flee>
                        </Decision>
-               </net.minecraft.entity.passive.EntitySkeletonHorse>
-               <net.minecraft.entity.passive.EntitySquid>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.passive.EntitySquid</Name>
                        <AttackPower Probability="70">0</AttackPower>
                        <Evasion>15</Evasion>
                        <Category>passive</Category>
                                <Defend>0</Defend>
                                <Flee>90</Flee>
                        </Decision>
-               </net.minecraft.entity.passive.EntitySquid>
-               <net.minecraft.entity.passive.EntityVillager>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.passive.EntityVillager</Name>
                        <AttackPower Probability="70">0</AttackPower>
                        <Evasion>5</Evasion>
                        <Category>passive</Category>
                                <Defend>10</Defend>
                                <Flee>80</Flee>
                        </Decision>
-               </net.minecraft.entity.passive.EntityVillager>
-               <net.minecraft.entity.passive.EntityWolf>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.passive.EntityWolf</Name>
                        <AttackPower Probability="70">4</AttackPower>
                        <Evasion>20</Evasion>
                        <Category>animal</Category>
                                <Defend>15</Defend>
                                <Flee>5</Flee>
                        </Decision>
-               </net.minecraft.entity.passive.EntityWolf>
-               <net.minecraft.entity.passive.EntityZombieHorse>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.passive.EntityZombieHorse</Name>
                        <AttackPower Probability="70">0</AttackPower>
                        <Evasion>8</Evasion>
                        <Category>passive</Category>
                                <Defend>0</Defend>
                                <Flee>90</Flee>
                        </Decision>
-               </net.minecraft.entity.passive.EntityZombieHorse>
-               <net.minecraft.entity.boss.EntityDragon>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.boss.EntityDragon</Name>
                        <AttackPower Probability="70" Variance="2">10</AttackPower>
                        <Evasion>27</Evasion>
                        <Category>boss</Category>
                                <Defend>0</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.boss.EntityDragon>
-               <net.minecraft.entity.boss.EntityWither>
+               </Entry>
+               <Entry>
+                       <Name>net.minecraft.entity.boss.EntityWither</Name>
                        <AttackPower Probability="70">8</AttackPower>
                        <Evasion>20</Evasion>
                        <AttackEffect Probability="90">wither</AttackEffect>
                                <Defend>0</Defend>
                                <Flee>0</Flee>
                        </Decision>
-               </net.minecraft.entity.boss.EntityWither>
+               </Entry>
        </EntityStats>
 </TurnBasedMinecraftConfig>
\ No newline at end of file