Fixes, add maximum-distance to aggro-start-battle

Ugly fix for still not found freeze bug in BattleUpdater.
Added maximum-distance for monsters initiating battle when targeting a
player or entity in battle.
Updated config version to 6.
This commit is contained in:
Stephen Seo 2018-10-18 16:26:09 +09:00
parent 00961768b3
commit d67fef2842
6 changed files with 78 additions and 11 deletions

View file

@ -95,7 +95,8 @@ public class AttackEventHandler
if(event.getEntity().world.isRemote if(event.getEntity().world.isRemote
|| config.isOldBattleBehaviorEnabled() || config.isOldBattleBehaviorEnabled()
|| (event.getEntity() != null && battleManager.isRecentlyLeftBattle(event.getEntity().getEntityId())) || (event.getEntity() != null && battleManager.isRecentlyLeftBattle(event.getEntity().getEntityId()))
|| (event.getTarget() != null && battleManager.isRecentlyLeftBattle(event.getTarget().getEntityId()))) || (event.getTarget() != null && battleManager.isRecentlyLeftBattle(event.getTarget().getEntityId()))
|| (event.getEntity() != null && event.getTarget() != null && Utility.distanceBetweenEntities(event.getEntity(), event.getTarget()) > (double)config.getAggroStartBattleDistance()))
{ {
return; return;
} }

View file

@ -839,17 +839,14 @@ public class Battle
Combatant target = null; Combatant target = null;
if(next.entity instanceof EntityPlayer) if(next.entity instanceof EntityPlayer)
{ {
if(next.isSideA) target = sideA.get(next.targetEntityID);
if(target == null)
{ {
target = sideB.get(next.targetEntityID); target = sideB.get(next.targetEntityID);
} }
else if(target == null || !target.entity.isEntityAlive() || target == next)
{ {
target = sideA.get(next.targetEntityID); continue;
}
if(target == null || !target.entity.isEntityAlive())
{
break;
} }
ItemStack heldItemStack = ((EntityPlayer)next.entity).getHeldItemMainhand(); ItemStack heldItemStack = ((EntityPlayer)next.entity).getHeldItemMainhand();
if(heldItemStack.getItem() instanceof ItemBow) if(heldItemStack.getItem() instanceof ItemBow)
@ -980,7 +977,7 @@ public class Battle
} }
} }
} }
if(target == null || !target.entity.isEntityAlive()) if(target == null || !target.entity.isEntityAlive() || target == next)
{ {
continue; continue;
} }

View file

@ -9,6 +9,35 @@ public class BattleUpdater implements Runnable
private BattleManager manager; private BattleManager manager;
private AtomicBoolean isRunning; private AtomicBoolean isRunning;
private class UpdateRunnable implements Runnable
{
private Battle battle;
private AtomicBoolean finished = new AtomicBoolean(false);
private AtomicBoolean battleFinished = new AtomicBoolean(false);
public UpdateRunnable(Battle battle)
{
this.battle = battle;
}
public boolean isFinished()
{
return finished.get();
}
public boolean isBattleFinished()
{
return battleFinished.get();
}
@Override
public void run()
{
battleFinished.set(battle.update());
finished.set(true);
}
}
public BattleUpdater(BattleManager manager) public BattleUpdater(BattleManager manager)
{ {
this.manager = manager; this.manager = manager;
@ -25,7 +54,20 @@ public class BattleUpdater implements Runnable
for(Iterator<Map.Entry<Integer, Battle>> iter = manager.battleMap.entrySet().iterator(); iter.hasNext();) for(Iterator<Map.Entry<Integer, Battle>> iter = manager.battleMap.entrySet().iterator(); iter.hasNext();)
{ {
Map.Entry<Integer, Battle> entry = iter.next(); Map.Entry<Integer, Battle> entry = iter.next();
if(entry.getValue().update()) UpdateRunnable updateRunnable = new UpdateRunnable(entry.getValue());
Thread updateThread = new Thread(updateRunnable);
updateThread.start();
try
{
updateThread.join(3000);
} catch(InterruptedException e){ /* exception ignored */ }
if(!updateRunnable.isFinished())
{
// TODO this is an ugly fix to a still-not-found freeze bug in Battle.update()
TurnBasedMinecraftMod.logger.error("Battle (" + entry.getValue().getId() + ") update timed out!");
updateThread.stop();
}
else if(updateRunnable.isBattleFinished())
{ {
iter.remove(); iter.remove();
} }

View file

@ -49,6 +49,7 @@ public class Config
private boolean battleDisabledForAll = false; private boolean battleDisabledForAll = false;
private boolean oldBattleBehaviorEnabled = false; private boolean oldBattleBehaviorEnabled = false;
private int leaveBattleCooldownSeconds = 5; private int leaveBattleCooldownSeconds = 5;
private int aggroStartBattleDistance = 8;
public Config(Logger logger) public Config(Logger logger)
{ {
@ -187,6 +188,18 @@ public class Config
leaveBattleCooldownSeconds = 10; leaveBattleCooldownSeconds = 10;
} }
} }
else if(xmlReader.getLocalName().equals("AggroStartBattleDistance"))
{
aggroStartBattleDistance = Integer.parseInt(xmlReader.getElementText());
if(aggroStartBattleDistance < 5)
{
aggroStartBattleDistance = 5;
}
else if(aggroStartBattleDistance > 50)
{
aggroStartBattleDistance = 50;
}
}
else if(xmlReader.getLocalName().equals("OldBattleBehavior")) else if(xmlReader.getLocalName().equals("OldBattleBehavior"))
{ {
if(xmlReader.getElementText().toLowerCase().equals("false")) if(xmlReader.getElementText().toLowerCase().equals("false"))
@ -656,4 +669,9 @@ public class Config
{ {
return (long)leaveBattleCooldownSeconds * 1000000000L; return (long)leaveBattleCooldownSeconds * 1000000000L;
} }
public int getAggroStartBattleDistance()
{
return aggroStartBattleDistance;
}
} }

View file

@ -1,5 +1,6 @@
package com.seodisparate.TurnBasedMinecraft.common; package com.seodisparate.TurnBasedMinecraft.common;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemArrow; import net.minecraft.item.ItemArrow;
@ -43,4 +44,9 @@ public class Utility
} }
return false; return false;
} }
public static double distanceBetweenEntities(Entity a, Entity b)
{
return Math.sqrt(Math.pow(a.posX - b.posX, 2.0) + Math.pow(a.posY - b.posY, 2.0) + Math.pow(a.posZ - b.posZ, 2.0));
}
} }

View file

@ -1,8 +1,11 @@
<TurnBasedMinecraftConfig> <TurnBasedMinecraftConfig>
<!-- If the mod has a newer version config, it will rename the existing config and place the new config --> <!-- If the mod has a newer version config, it will rename the existing config and place the new config -->
<Version>5</Version> <Version>6</Version>
<!-- Number of seconds that an entity cannot enter battle after having just left one. Minimum 1, maximum 10--> <!-- Number of seconds that an entity cannot enter battle after having just left one. Minimum 1, maximum 10-->
<LeaveBattleCooldown>5</LeaveBattleCooldown> <LeaveBattleCooldown>5</LeaveBattleCooldown>
<!-- Maximum distance for a monster to start battle by targeting a player or other entity in turn-based-battle.
Minimum 5, maximum 50. -->
<AggroStartBattleDistance>8</AggroStartBattleDistance>
<!-- If not "false", uses old battle behavior where battles only start on attack/hit. Otherwise, battles can <!-- If not "false", uses old battle behavior where battles only start on attack/hit. Otherwise, battles can
start when a hostile mob targets a player or another entity in battle. --> start when a hostile mob targets a player or another entity in battle. -->
<OldBattleBehavior>false</OldBattleBehavior> <OldBattleBehavior>false</OldBattleBehavior>