private BattleManager battleManager;
+ public String debugLog; // TODO remove after freeze bug has been found
+
public enum State
{
DECISION(0),
continue;
}
+ debugLog = next.entity.getName();
+
next.remainingDefenses = 0;
switch(next.decision)
{
case UNDECIDED:
+ debugLog += " undecided";
sendMessageToAllPlayers(PacketBattleMessage.MessageType.DID_NOTHING, next.entity.getEntityId(), 0, 0);
break;
case ATTACK:
+ debugLog += " attack";
Combatant target = null;
if(next.entity instanceof EntityPlayer)
{
+ debugLog += " as player";
target = sideA.get(next.targetEntityID);
if(target == null)
{
ItemStack heldItemStack = ((EntityPlayer)next.entity).getHeldItemMainhand();
if(heldItemStack.getItem() instanceof ItemBow)
{
+ debugLog += " with bow";
if(Utility.doesPlayerHaveArrows((EntityPlayer)next.entity))
{
final Entity nextEntity = next.entity;
}
continue;
}
+ debugLog += " without bow";
int hitChance = TurnBasedMinecraftMod.proxy.getConfig().getPlayerAttackProbability();
if(target.entity instanceof EntityPlayer)
{
{
if(target.remainingDefenses <= 0)
{
+ debugLog += " hit success";
// attack
final Entity nextEntity = next.entity;
final Entity targetEntity = target.entity;
}
else
{
+ debugLog += " hit blocked";
// blocked
--target.remainingDefenses;
sendMessageToAllPlayers(PacketBattleMessage.MessageType.DEFEND, target.entity.getEntityId(), next.entity.getEntityId(), 0);
}
else
{
+ debugLog += " hit missed";
// miss
sendMessageToAllPlayers(PacketBattleMessage.MessageType.MISS, next.entity.getEntityId(), target.entity.getEntityId(), 0);
}
}
else
{
+ debugLog += " as mob";
EntityLivingBase attackTarget = ((EntityLiving)next.entity).getAttackTarget();
if(attackTarget != null && hasCombatant(attackTarget.getEntityId()))
{
+ debugLog += " to targeted";
target = getCombatantByID(attackTarget.getEntityId());
}
else
{
+ debugLog += " to random other side";
if(next.isSideA)
{
int randomTargetIndex = (int)(Math.random() * sideB.size());
{
if(target.remainingDefenses <= 0)
{
+ debugLog += " hit success";
DamageSource damageSource = DamageSource.causeMobDamage((EntityLivingBase)next.entity);
int damageAmount = next.entityInfo.attackPower;
if(next.entityInfo.attackVariance > 0)
final Entity targetEntity = target.entity;
final EntityInfo targetEntityInfo = target.entityInfo;
final int finalDamageAmount = damageAmount;
+ debugLog += " adding task...";
next.entity.getServer().addScheduledTask(() -> {
TurnBasedMinecraftMod.proxy.setAttackingEntity(nextEntity);
targetEntity.attackEntityFrom(damageSource, finalDamageAmount);
}
}
});
+ debugLog += "...task added";
}
else
{
+ debugLog += " hit blocked";
// blocked
--target.remainingDefenses;
sendMessageToAllPlayers(PacketBattleMessage.MessageType.DEFEND, target.entity.getEntityId(), next.entity.getEntityId(), 0);
}
else
{
+ debugLog += " hit missed";
// miss
sendMessageToAllPlayers(PacketBattleMessage.MessageType.MISS, next.entity.getEntityId(), target.entity.getEntityId(), 0);
}
}
break;
case DEFEND:
+ debugLog += " defend";
next.remainingDefenses = TurnBasedMinecraftMod.proxy.getConfig().getDefenseDuration();
sendMessageToAllPlayers(PacketBattleMessage.MessageType.DEFENDING, next.entity.getEntityId(), 0, 0);
break;
case FLEE:
+ debugLog += " flee";
int fastestEnemySpeed = 0;
if(next.isSideA)
{
}
if((int)(Math.random() * 100) < fleeProbability)
{
+ debugLog += " success";
// flee success
combatantsChanged = true;
String fleeingCategory = new String();
}
else
{
+ debugLog += " fail";
// flee fail
sendMessageToAllPlayers(PacketBattleMessage.MessageType.FLEE, next.entity.getEntityId(), 0, 0);
}
break;
case USE_ITEM:
+ debugLog += " use item";
if(next.itemToUse < 0 || next.itemToUse > 8)
{
+ debugLog += " invalid";
sendMessageToAllPlayers(PacketBattleMessage.MessageType.USED_ITEM, next.entity.getEntityId(), 0, PacketBattleMessage.UsedItemAction.USED_INVALID.getValue());
break;
}
Item targetItem = targetItemStack.getItem();
if(targetItem == null)
{
+ debugLog += " null";
sendMessageToAllPlayers(PacketBattleMessage.MessageType.USED_ITEM, next.entity.getEntityId(), 0, PacketBattleMessage.UsedItemAction.USED_NOTHING.getValue());
break;
}
if(targetItem instanceof ItemFood)
{
+ debugLog += " food";
sendMessageToAllPlayers(PacketBattleMessage.MessageType.USED_ITEM, next.entity.getEntityId(), 0, PacketBattleMessage.UsedItemAction.USED_FOOD.getValue(), targetItemStack.getDisplayName());
final Entity nextEntity = next.entity;
+ final int nextItemToUse = next.itemToUse;
next.entity.getServer().addScheduledTask(() -> {
- ((ItemFood)targetItem).onItemUseFinish(targetItemStack, nextEntity.world, (EntityLivingBase)nextEntity);
+ ((EntityPlayer)nextEntity).inventory.setInventorySlotContents(nextItemToUse, targetItem.onItemUseFinish(targetItemStack, nextEntity.world, (EntityLivingBase)nextEntity));
});
}
else if(targetItem instanceof ItemPotion && !(targetItem instanceof ItemSplashPotion) && !(targetItem instanceof ItemLingeringPotion))
{
+ debugLog += " potion";
sendMessageToAllPlayers(PacketBattleMessage.MessageType.USED_ITEM, next.entity.getEntityId(), 0, PacketBattleMessage.UsedItemAction.USED_POTION.getValue(), targetItemStack.getDisplayName());
final Entity nextEntity = next.entity;
final int nextItemToUse = next.itemToUse;
next.entity.getServer().addScheduledTask(() -> {
- ((ItemPotion)targetItem).onItemUseFinish(targetItemStack, nextEntity.world, (EntityLivingBase)nextEntity);
- ((EntityPlayer)nextEntity).inventory.setInventorySlotContents(nextItemToUse, new ItemStack(Items.GLASS_BOTTLE));
+ ((EntityPlayer)nextEntity).inventory.setInventorySlotContents(nextItemToUse, targetItem.onItemUseFinish(targetItemStack, nextEntity.world, (EntityLivingBase)nextEntity));
});
}
else
{
+ debugLog += " non-consumable";
sendMessageToAllPlayers(PacketBattleMessage.MessageType.USED_ITEM, next.entity.getEntityId(), 0, PacketBattleMessage.UsedItemAction.USED_INVALID.getValue(), targetItemStack.getDisplayName());
}
break;
case SWITCH_ITEM:
+ debugLog += " switch item";
if(next.itemToUse < 0 || next.itemToUse > 8)
{
sendMessageToAllPlayers(PacketBattleMessage.MessageType.SWITCHED_ITEM, next.entity.getEntityId(), 0, 0);
break;
}
}
+ debugLog = "Actions end";
for(Combatant c : sideA.values())
{
c.decision = Decision.UNDECIDED;