Fix bow attack, config, add freeze enemies option

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.
This commit is contained in:
Stephen Seo 2018-09-18 15:56:06 +09:00
parent 9778c6a7d5
commit efa65da721
5 changed files with 321 additions and 192 deletions

View 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;

View 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())
{

View 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()
{

View 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));
}
}
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)
{
if(xmlReader.getAttributeLocalName(i).equals("Probability"))
{
eInfo.defenseDamageProbability = Integer.parseInt(xmlReader.getAttributeValue(i));
}
}
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())
{
if(xmlReader.getLocalName().equals("Attack"))
if(xmlReader.getAttributeLocalName(i).equals("Probability"))
{
eInfo.decisionAttack = Integer.parseInt(xmlReader.getElementText());
eInfo.attackProbability = Integer.parseInt(xmlReader.getAttributeValue(i));
}
else if(xmlReader.getLocalName().equals("Defend"))
else if(xmlReader.getAttributeLocalName(i).equals("Variance"))
{
eInfo.decisionDefend = Integer.parseInt(xmlReader.getElementText());
}
else if(xmlReader.getLocalName().equals("Flee"))
{
eInfo.decisionFlee = Integer.parseInt(xmlReader.getElementText());
eInfo.attackVariance = Integer.parseInt(xmlReader.getAttributeValue(i));
}
}
} while(!(xmlReader.isEndElement() && xmlReader.getLocalName().equals("Decision")));
eInfo.attackPower = Integer.parseInt(xmlReader.getElementText());
}
else if(xmlReader.getLocalName().equals("AttackEffect"))
{
for(int i = 0; i < xmlReader.getAttributeCount(); ++i)
{
if(xmlReader.getAttributeLocalName(i).equals("Probability"))
{
eInfo.attackEffectProbability = Integer.parseInt(xmlReader.getAttributeValue(i));
}
}
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)
{
if(xmlReader.getAttributeLocalName(i).equals("Probability"))
{
eInfo.defenseDamageProbability = Integer.parseInt(xmlReader.getAttributeValue(i));
}
}
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())
{
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("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;
}
}

View 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>
@ -93,8 +100,9 @@
<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>
@ -104,8 +112,9 @@
<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>
@ -115,8 +124,9 @@
<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>
@ -126,8 +136,9 @@
<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>
@ -138,8 +149,9 @@
<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>
@ -149,8 +161,9 @@
<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>
@ -161,8 +174,9 @@
<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>
@ -173,8 +187,9 @@
<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>
@ -184,8 +199,9 @@
<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>
@ -195,8 +211,9 @@
<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>
@ -206,8 +223,9 @@
<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>
@ -217,8 +235,9 @@
<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>
@ -228,8 +247,9 @@
<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>
@ -239,8 +259,9 @@
<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>
@ -250,8 +271,9 @@
<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>
@ -261,8 +283,9 @@
<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>
@ -272,8 +295,9 @@
<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>
@ -283,8 +307,9 @@
<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>
@ -295,8 +320,9 @@
<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>
@ -306,8 +332,9 @@
<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>
@ -317,8 +344,9 @@
<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>
@ -328,8 +356,9 @@
<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>
@ -340,8 +369,9 @@
<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>
@ -351,8 +381,9 @@
<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>
@ -362,8 +393,9 @@
<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>
@ -373,8 +405,9 @@
<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>
@ -384,8 +417,9 @@
<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>
@ -395,8 +429,9 @@
<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>
@ -406,8 +441,9 @@
<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>
@ -417,8 +453,9 @@
<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>
@ -428,8 +465,9 @@
<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>
@ -439,8 +477,9 @@
<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>
@ -450,8 +489,9 @@
<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>
@ -461,8 +501,9 @@
<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>
@ -472,8 +513,9 @@
<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>
@ -483,8 +525,9 @@
<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>
@ -494,8 +537,9 @@
<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>
@ -505,8 +549,9 @@
<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>
@ -516,8 +561,9 @@
<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>
@ -527,8 +573,9 @@
<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>
@ -538,8 +585,9 @@
<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>
@ -549,8 +597,9 @@
<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>
@ -560,8 +609,9 @@
<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>
@ -571,8 +621,9 @@
<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>
@ -583,6 +634,6 @@
<Defend>0</Defend>
<Flee>0</Flee>
</Decision>
</net.minecraft.entity.boss.EntityWither>
</Entry>
</EntityStats>
</TurnBasedMinecraftConfig>