From d67fef284225969d9d996bff5c8e13097befca2d Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Thu, 18 Oct 2018 16:26:09 +0900 Subject: [PATCH] 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. --- .../common/AttackEventHandler.java | 3 +- .../TurnBasedMinecraft/common/Battle.java | 13 +++--- .../common/BattleUpdater.java | 44 ++++++++++++++++++- .../TurnBasedMinecraft/common/Config.java | 18 ++++++++ .../TurnBasedMinecraft/common/Utility.java | 6 +++ .../assets/TurnBasedMinecraft/TBM_Config.xml | 5 ++- 6 files changed, 78 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/seodisparate/TurnBasedMinecraft/common/AttackEventHandler.java b/src/main/java/com/seodisparate/TurnBasedMinecraft/common/AttackEventHandler.java index 014f81a..29f0883 100644 --- a/src/main/java/com/seodisparate/TurnBasedMinecraft/common/AttackEventHandler.java +++ b/src/main/java/com/seodisparate/TurnBasedMinecraft/common/AttackEventHandler.java @@ -95,7 +95,8 @@ public class AttackEventHandler if(event.getEntity().world.isRemote || config.isOldBattleBehaviorEnabled() || (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; } diff --git a/src/main/java/com/seodisparate/TurnBasedMinecraft/common/Battle.java b/src/main/java/com/seodisparate/TurnBasedMinecraft/common/Battle.java index 065bcf2..e406718 100644 --- a/src/main/java/com/seodisparate/TurnBasedMinecraft/common/Battle.java +++ b/src/main/java/com/seodisparate/TurnBasedMinecraft/common/Battle.java @@ -839,17 +839,14 @@ public class Battle Combatant target = null; if(next.entity instanceof EntityPlayer) { - if(next.isSideA) + target = sideA.get(next.targetEntityID); + if(target == null) { target = sideB.get(next.targetEntityID); } - else + if(target == null || !target.entity.isEntityAlive() || target == next) { - target = sideA.get(next.targetEntityID); - } - if(target == null || !target.entity.isEntityAlive()) - { - break; + continue; } ItemStack heldItemStack = ((EntityPlayer)next.entity).getHeldItemMainhand(); 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; } diff --git a/src/main/java/com/seodisparate/TurnBasedMinecraft/common/BattleUpdater.java b/src/main/java/com/seodisparate/TurnBasedMinecraft/common/BattleUpdater.java index 7cec495..6a497ec 100644 --- a/src/main/java/com/seodisparate/TurnBasedMinecraft/common/BattleUpdater.java +++ b/src/main/java/com/seodisparate/TurnBasedMinecraft/common/BattleUpdater.java @@ -9,6 +9,35 @@ public class BattleUpdater implements Runnable private BattleManager manager; 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) { this.manager = manager; @@ -25,7 +54,20 @@ public class BattleUpdater implements Runnable for(Iterator> iter = manager.battleMap.entrySet().iterator(); iter.hasNext();) { Map.Entry 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(); } diff --git a/src/main/java/com/seodisparate/TurnBasedMinecraft/common/Config.java b/src/main/java/com/seodisparate/TurnBasedMinecraft/common/Config.java index 143694b..057153d 100644 --- a/src/main/java/com/seodisparate/TurnBasedMinecraft/common/Config.java +++ b/src/main/java/com/seodisparate/TurnBasedMinecraft/common/Config.java @@ -49,6 +49,7 @@ public class Config private boolean battleDisabledForAll = false; private boolean oldBattleBehaviorEnabled = false; private int leaveBattleCooldownSeconds = 5; + private int aggroStartBattleDistance = 8; public Config(Logger logger) { @@ -187,6 +188,18 @@ public class Config 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")) { if(xmlReader.getElementText().toLowerCase().equals("false")) @@ -656,4 +669,9 @@ public class Config { return (long)leaveBattleCooldownSeconds * 1000000000L; } + + public int getAggroStartBattleDistance() + { + return aggroStartBattleDistance; + } } diff --git a/src/main/java/com/seodisparate/TurnBasedMinecraft/common/Utility.java b/src/main/java/com/seodisparate/TurnBasedMinecraft/common/Utility.java index 73a66d9..b54b853 100644 --- a/src/main/java/com/seodisparate/TurnBasedMinecraft/common/Utility.java +++ b/src/main/java/com/seodisparate/TurnBasedMinecraft/common/Utility.java @@ -1,5 +1,6 @@ package com.seodisparate.TurnBasedMinecraft.common; +import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemArrow; @@ -43,4 +44,9 @@ public class Utility } 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)); + } } diff --git a/src/main/resources/assets/TurnBasedMinecraft/TBM_Config.xml b/src/main/resources/assets/TurnBasedMinecraft/TBM_Config.xml index 17c0838..582c1c1 100644 --- a/src/main/resources/assets/TurnBasedMinecraft/TBM_Config.xml +++ b/src/main/resources/assets/TurnBasedMinecraft/TBM_Config.xml @@ -1,8 +1,11 @@ - 5 + 6 5 + + 8 false