diff --git a/options.cfg b/options.cfg index 5ea9e0ab..2e096467 100644 --- a/options.cfg +++ b/options.cfg @@ -4,4 +4,4 @@ LOAD.BUILDOUT_OBJECTS=1 LOAD.RESOURCE.SYSTEM=0 # Misc -CLEAN.ODB.FOLDERS=0 +CLEAN.ODB.FOLDERS=1 diff --git a/scripts/buffs/banner_buff_bounty_hunter.py b/scripts/buffs/banner_buff_bounty_hunter.py new file mode 100644 index 00000000..3ceeb3b3 --- /dev/null +++ b/scripts/buffs/banner_buff_bounty_hunter.py @@ -0,0 +1,14 @@ +import sys + +def setup(core, actor, buff): + + return + +def add(core, actor, buff): + core.skillModService.addSkillMod(actor, 'expertise_critical_niche_all', 5) + return + +def remove(core, actor, buff): + core.skillModService.deductSkillMod(actor, 'expertise_critical_niche_all', 5) + return + \ No newline at end of file diff --git a/scripts/buffs/banner_buff_commando.py b/scripts/buffs/banner_buff_commando.py new file mode 100644 index 00000000..c51d7521 --- /dev/null +++ b/scripts/buffs/banner_buff_commando.py @@ -0,0 +1,14 @@ +import sys + +def setup(core, actor, buff): + + return + +def add(core, actor, buff): + core.skillModService.addSkillMod(actor, 'proc_buff', 1) + return + +def remove(core, actor, buff): + core.skillModService.deductSkillMod(actor, 'proc_buff', 1) + return + \ No newline at end of file diff --git a/scripts/buffs/banner_buff_entertainer.py b/scripts/buffs/banner_buff_entertainer.py new file mode 100644 index 00000000..624cbcde --- /dev/null +++ b/scripts/buffs/banner_buff_entertainer.py @@ -0,0 +1,14 @@ +import sys + +def setup(core, actor, buff): + + return + +def add(core, actor, buff): + core.skillModService.addSkillMod(actor, 'expertise_dodge', 2) + return + +def remove(core, actor, buff): + core.skillModService.deductSkillMod(actor, 'expertise_dodge', 2) + return + \ No newline at end of file diff --git a/scripts/buffs/banner_buff_force_sensitive.py b/scripts/buffs/banner_buff_force_sensitive.py new file mode 100644 index 00000000..c0a1286f --- /dev/null +++ b/scripts/buffs/banner_buff_force_sensitive.py @@ -0,0 +1,14 @@ +import sys + +def setup(core, actor, buff): + + return + +def add(core, actor, buff): + core.skillModService.addSkillMod(actor, 'strength_modified', 100) + return + +def remove(core, actor, buff): + core.skillModService.deductSkillMod(actor, 'strength_modified', 100) + return + \ No newline at end of file diff --git a/scripts/buffs/banner_buff_medic.py b/scripts/buffs/banner_buff_medic.py new file mode 100644 index 00000000..e01d7147 --- /dev/null +++ b/scripts/buffs/banner_buff_medic.py @@ -0,0 +1,14 @@ +import sys + +def setup(core, actor, buff): + + return + +def add(core, actor, buff): + core.skillModService.addSkillMod(actor, 'constitution_modified', 100) + return + +def remove(core, actor, buff): + core.skillModService.deductSkillMod(actor, 'constitution_modified', 100) + return + \ No newline at end of file diff --git a/scripts/buffs/banner_buff_officer.py b/scripts/buffs/banner_buff_officer.py new file mode 100644 index 00000000..3adb49d7 --- /dev/null +++ b/scripts/buffs/banner_buff_officer.py @@ -0,0 +1,14 @@ +import sys + +def setup(core, actor, buff): + + return + +def add(core, actor, buff): + core.skillModService.addSkillMod(actor, 'precision_modified', 100) + return + +def remove(core, actor, buff): + core.skillModService.deductSkillMod(actor, 'precision_modified', 100) + return + \ No newline at end of file diff --git a/scripts/buffs/banner_buff_smuggler.py b/scripts/buffs/banner_buff_smuggler.py new file mode 100644 index 00000000..694c9c9a --- /dev/null +++ b/scripts/buffs/banner_buff_smuggler.py @@ -0,0 +1,14 @@ +import sys + +def setup(core, actor, buff): + + return + +def add(core, actor, buff): + core.skillModService.addSkillMod(actor, 'luck_modified', 100) + return + +def remove(core, actor, buff): + core.skillModService.deductSkillMod(actor, 'luck_modified', 100) + return + \ No newline at end of file diff --git a/scripts/buffs/banner_buff_spy.py b/scripts/buffs/banner_buff_spy.py new file mode 100644 index 00000000..4500cd97 --- /dev/null +++ b/scripts/buffs/banner_buff_spy.py @@ -0,0 +1,14 @@ +import sys + +def setup(core, actor, buff): + + return + +def add(core, actor, buff): + core.skillModService.addSkillMod(actor, 'agility_modified', 100) + return + +def remove(core, actor, buff): + core.skillModService.deductSkillMod(actor, 'agility_modified', 100) + return + \ No newline at end of file diff --git a/scripts/buffs/banner_buff_trader.py b/scripts/buffs/banner_buff_trader.py new file mode 100644 index 00000000..ff5f0868 --- /dev/null +++ b/scripts/buffs/banner_buff_trader.py @@ -0,0 +1,14 @@ +import sys + +def setup(core, actor, buff): + + return + +def add(core, actor, buff): + core.skillModService.addSkillMod(actor, 'expertise_glancing_blow_all', 100) + return + +def remove(core, actor, buff): + core.skillModService.deductSkillMod(actor, 'expertise_glancing_blow_all', 100) + return + \ No newline at end of file diff --git a/scripts/object/tangible/gcw/pvp_rank_rewards/imperial_battle_banner.py b/scripts/object/tangible/gcw/pvp_rank_rewards/imperial_battle_banner.py index ccad8904..0a4b00e0 100644 --- a/scripts/object/tangible/gcw/pvp_rank_rewards/imperial_battle_banner.py +++ b/scripts/object/tangible/gcw/pvp_rank_rewards/imperial_battle_banner.py @@ -1,4 +1,5 @@ import sys def setup(core, object): + object.setAttachment('radial_filename', 'item/gcwbanner') return \ No newline at end of file diff --git a/scripts/object/tangible/gcw/pvp_rank_rewards/rebel_battle_banner.py b/scripts/object/tangible/gcw/pvp_rank_rewards/rebel_battle_banner.py index ccad8904..0a4b00e0 100644 --- a/scripts/object/tangible/gcw/pvp_rank_rewards/rebel_battle_banner.py +++ b/scripts/object/tangible/gcw/pvp_rank_rewards/rebel_battle_banner.py @@ -1,4 +1,5 @@ import sys def setup(core, object): + object.setAttachment('radial_filename', 'item/gcwbanner') return \ No newline at end of file diff --git a/scripts/radial/item/gcwbanner.py b/scripts/radial/item/gcwbanner.py new file mode 100644 index 00000000..abcee8c7 --- /dev/null +++ b/scripts/radial/item/gcwbanner.py @@ -0,0 +1,49 @@ +from resources.common import RadialOptions +import sys + +def createRadial(core, owner, target, radials): + radials.add(RadialOptions(0, 21, 1, '')) + radials.add(RadialOptions(0, 7, 1, '')) + radials.add(RadialOptions(0, 15, 1, '')) + return + +def handleSelection(core, owner, target, option): + if option == 21 and target: + handleBanner(core, owner, target, option) + if option == 15 and target: + core.objectService.destroyObject(target) + return + +def handleBanner(core, owner, bannerinventoryobject, option): + + # check if faction alignment matches + if len(owner.getFaction()) == 0: + owner.sendSystemMessage('You are not aligned appropriately to use this banner' , 0) + return + if bannerinventoryobject.getTemplate().find(owner.getFaction()) == -1: + owner.sendSystemMessage('You are not aligned appropriately to use this banner' , 0) + return + + # check if banner object is not already spawned + #if bannerinventoryobject.getAttachment('BannerSpawned'): + #owner.sendSystemMessage('Banner already spawned' , 0) + #return + + # spawn banner object + stcSvc = core.staticService + banner = stcSvc.spawnObject(bannerinventoryobject.getTemplate(), owner.getPlanet().getName(), long(0), owner.getWorldPosition().x + 1, owner.getWorldPosition().y, owner.getWorldPosition().z, owner.getOrientation().w, owner.getOrientation().x, owner.getOrientation().y, owner.getOrientation().z) + if len(bannerinventoryobject.getStfFilename())>0: + banner.setStfFilename(bannerinventoryobject.getStfFilename()) + if len(bannerinventoryobject.getStfName())>0: + banner.setStfName(bannerinventoryobject.getStfName()) + if len(bannerinventoryobject.getDetailFilename())>0: + banner.setDetailFilename(bannerinventoryobject.getDetailFilename()) + if len(bannerinventoryobject.getDetailName())>0: + #banner.setDetailDescription(bannerinventoryobject.getBaseline(6).get("detailedDescription").getString()) + banner.setDetailName(bannerinventoryobject.getDetailName()) + bannerinventoryobject.setAttachment('BannerSpawned', True) + + # start buffing process + core.buffService.initiateBannerBuffProcess(owner, banner) + + return \ No newline at end of file diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index b3a41960..4949b3d5 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -540,6 +540,9 @@ public class CreatureObject extends TangibleObject implements Serializable { if (companion != null) { companion.setFaction(faction); } + + if (this.getCalledPet()!=null) + this.getCalledPet().setFaction(faction); } public void setFactionStatus(int factionStatus) { @@ -550,6 +553,8 @@ public class CreatureObject extends TangibleObject implements Serializable { if (companion != null) { companion.setFactionStatus(factionStatus); } + if (this.getCalledPet()!=null) + this.getCalledPet().setFactionStatus(factionStatus); } public float getHeight() { diff --git a/src/resources/objects/tangible/TangibleObject.java b/src/resources/objects/tangible/TangibleObject.java index f49dca44..52bc4cb0 100644 --- a/src/resources/objects/tangible/TangibleObject.java +++ b/src/resources/objects/tangible/TangibleObject.java @@ -24,6 +24,7 @@ package resources.objects.tangible; import java.io.ByteArrayOutputStream; import java.io.Serializable; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -324,11 +325,19 @@ public class TangibleObject extends SWGObject implements Serializable { // All objects can be in combat (terminal mission flag bases, tutorial target box) public List getDefendersList() { - synchronized(objectMutex) { + synchronized(defendersList) { return defendersList; } } + public List getDefendersListClone() { + synchronized(objectMutex) { + List returnList = new Vector(); + Collections.copy(returnList, defendersList); + return returnList; + } + } + public void addDefender(TangibleObject defender) { if (this instanceof CreatureObject){ if (((CreatureObject)this).getOwnerId()>0){ @@ -337,7 +346,9 @@ public class TangibleObject extends SWGObject implements Serializable { } } } - defendersList.add(defender); + synchronized(defendersList) { + defendersList.add(defender); + } if (!isInCombat()) { setInCombat(true); @@ -345,7 +356,7 @@ public class TangibleObject extends SWGObject implements Serializable { } public void removeDefender(TangibleObject defender) { - synchronized(objectMutex) { + synchronized(defendersList) { defendersList.remove(defender); if (defendersList.isEmpty() && isInCombat()) { @@ -353,7 +364,7 @@ public class TangibleObject extends SWGObject implements Serializable { } } } - + public int getPvpBitmask() { synchronized(objectMutex) { return pvpBitmask; diff --git a/src/services/BuffService.java b/src/services/BuffService.java index 993c25bb..a5458831 100644 --- a/src/services/BuffService.java +++ b/src/services/BuffService.java @@ -21,9 +21,13 @@ ******************************************************************************/ package services; +import java.util.List; import java.util.Map; +import java.util.Random; +import java.util.Vector; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; +import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; @@ -34,14 +38,25 @@ import org.python.core.PyObject; import resources.buffs.Buff; import resources.buffs.DamageOverTime; import resources.common.FileUtilities; +import resources.common.OutOfBand; +import resources.datatables.DisplayType; +import resources.datatables.Options; +import resources.datatables.Posture; import resources.objects.creature.CreatureObject; import resources.objects.group.GroupObject; import resources.objects.player.PlayerObject; +import resources.objects.weapon.WeaponObject; +import services.ai.AIActor; +import services.ai.states.FollowState; +import services.command.CombatCommand; +import tools.DevLog; import main.NGECore; import engine.clientdata.ClientFileManager; import engine.clientdata.visitors.DatatableVisitor; import engine.resources.common.CRC; import engine.resources.objects.SWGObject; +import engine.resources.scene.Planet; +import engine.resources.scene.Point3D; import engine.resources.service.INetworkDispatch; import engine.resources.service.INetworkRemoteEvent; @@ -51,6 +66,22 @@ public class BuffService implements INetworkDispatch { private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); private ConcurrentHashMap buffMap = new ConcurrentHashMap(); + private static Map bannerBuffMapping = new ConcurrentHashMap(); + static{ + bannerBuffMapping.put("trader_0a", "banner_buff_trader"); + bannerBuffMapping.put("trader_0b", "banner_buff_trader"); + bannerBuffMapping.put("trader_0c", "banner_buff_trader"); + bannerBuffMapping.put("trader_0d", "banner_buff_trader"); + bannerBuffMapping.put("entertainer_1a", "banner_buff_entertainer"); + bannerBuffMapping.put("medic_1a", "banner_buff_medic"); + bannerBuffMapping.put("officer_1a", "banner_buff_officer"); + bannerBuffMapping.put("bounty_hunter_1a", "banner_buff_bounty_hunter"); + bannerBuffMapping.put("smuggler_1a", "banner_buff_smuggler"); + bannerBuffMapping.put("commando_1a", "banner_buff_commando"); + bannerBuffMapping.put("spy_1a", "banner_buff_spy"); + bannerBuffMapping.put("force_sensitive_1a", "banner_buff_force_sensitive"); + } + public BuffService(NGECore core) { this.core = core; core.commandService.registerCommand("removeBuff"); @@ -349,6 +380,56 @@ public class BuffService implements INetworkDispatch { } + public void applyGCWBuff(String buffName, String factionName, SWGObject center) { + Vector inRangeObjects = core.simulationService.getAllNearSameFactionCreatures(10, center.getWorldPosition(), center.getPlanet(), factionName); + for(SWGObject obj : inRangeObjects) { + if(!(obj instanceof CreatureObject)) + continue; + if(obj instanceof CreatureObject && (((CreatureObject) obj).getPosture() == Posture.Dead)) + continue; + CreatureObject buffed = (CreatureObject) obj; + if (! buffed.hasBuff(buffName)) + addBuffToCreature(buffed, buffName, buffed); + } + } + + public void initiateBannerBuffProcess(CreatureObject buffer, SWGObject banner){ + + String factionName = buffer.getFaction(); + String professionName = buffer.getPlayerObject().getProfession(); + String buffName = bannerBuffMapping.get(professionName); + applyGCWBuff(buffName, factionName, banner); + + final Future[] fut = {null}; + fut[0] = scheduler.scheduleAtFixedRate(new Runnable() { + @Override public void run() { + try { + if (NGECore.getInstance().objectService.getObject(banner.getObjectID())==null){ + Thread.yield(); + fut[0].cancel(false); + } + + applyGCWBuff(buffName, factionName, banner); + + if (! buffer.isInQuadtree()){ + NGECore.getInstance().objectService.destroyObject(banner.getObjectID()); + Thread.yield(); + fut[0].cancel(false); + } + + if (buffer.getWorldPosition().getDistance2D(banner.getWorldPosition())>1000 || buffer.getPlanetId()!=banner.getPlanetId()){ + NGECore.getInstance().objectService.destroyObject(banner.getObjectID()); + Thread.yield(); + fut[0].cancel(false); + } + + } catch (Exception e) { + System.err.println("Exception in GCW Banner thread " + e.getMessage()); + } + } + }, 0, 2, TimeUnit.SECONDS); + } + private void loadBuffs() { try { DatatableVisitor visitor = ClientFileManager.loadFile("datatables/buff/buff.iff", DatatableVisitor.class); diff --git a/src/services/DevService.java b/src/services/DevService.java index 01d457a8..7d958e88 100644 --- a/src/services/DevService.java +++ b/src/services/DevService.java @@ -119,6 +119,7 @@ public class DevService implements INetworkDispatch { if(creature.getPlayerObject().getProfession().equals("trader_0a") || creature.getPlayerObject().getProfession().equals("trader_0b") || creature.getPlayerObject().getProfession().equals("trader_0c") || creature.getPlayerObject().getProfession().equals("trader_0d")) suiOptions.put((long) 177, "REing"); } + suiOptions.put((long) 127, "GCW Banners"); break; case 3: // [Items] Weapons @@ -232,7 +233,7 @@ public class DevService implements INetworkDispatch { case 6: // Locations -890,4, -2994 475,6,-3019 //core.simulationService.transferToPlanet(player, core.terrainService.getPlanetByName("talus"), new Point3D(475,6,-3019), player.getOrientation(), null); - core.simulationService.transferToPlanet(player, core.terrainService.getPlanetByName("talus"), new Point3D(618, 4, -2963), player.getOrientation(), null); + core.simulationService.transferToPlanet(player, core.terrainService.getPlanetByName("talus"), new Point3D(264, 4, -2950), player.getOrientation(), null); //core.simulationService.transferToPlanet(player, core.terrainService.getPlanetByName("talus"), new Point3D(-930,9, -2994), player.getOrientation(), null); //core.invasionService.testPylons(); @@ -1312,6 +1313,21 @@ public class DevService implements INetworkDispatch { core.simulationService.transferToPlanet(player, core.terrainService.getPlanetByName("tatooine"), new Point3D(3521,4,-4800), player.getOrientation(), null); return; + case 127: + TangibleObject gcwBanner1 = (TangibleObject) core.objectService.createObject("object/tangible/gcw/pvp_rank_rewards/shared_rebel_battle_banner.iff", planet); + gcwBanner1.setStfFilename("static_item_n"); + gcwBanner1.setStfName("item_pvp_captain_battle_banner_rebel_reward_04_01"); + gcwBanner1.setDetailFilename("static_item_d"); + gcwBanner1.setDetailName("item_pvp_captain_battle_banner_rebel_reward_04_01"); + inventory.add(gcwBanner1); + TangibleObject gcwBanner2 = (TangibleObject) core.objectService.createObject("object/tangible/gcw/pvp_rank_rewards/shared_imperial_battle_banner.iff", planet); + gcwBanner2.setStfFilename("static_item_n"); + gcwBanner2.setStfName("item_pvp_captain_battle_banner_imperial_reward_04_01"); + gcwBanner2.setDetailFilename("static_item_d"); + gcwBanner2.setDetailName("item_pvp_captain_battle_banner_imperial_reward_04_01"); + inventory.add(gcwBanner2); + return; + case 164: core.simulationService.transferToPlanet(player, core.terrainService.getPlanetByName("dantooine"), new Point3D(-284,18,2853), player.getOrientation(), null); return; diff --git a/src/services/SimulationService.java b/src/services/SimulationService.java index 7dfc05b2..710f1080 100644 --- a/src/services/SimulationService.java +++ b/src/services/SimulationService.java @@ -363,6 +363,17 @@ public class SimulationService implements INetworkDispatch { return foundCreatures; } + public Vector getAllNearSameFactionCreatures(int distance, Point3D centerPos, Planet planet, String factionName){ + Vector foundCreatures = new Vector(); + core.simulationService.get(planet, centerPos.x, centerPos.z, distance).stream().forEach((objecta) -> { + if (factionName.length()>0 && objecta instanceof CreatureObject){ + if (NGECore.getInstance().factionService.isFactionAlly(((CreatureObject) objecta).getFaction(),factionName)) + foundCreatures.add((CreatureObject)objecta); + } + }); + return foundCreatures; + } + public Vector getAllNearTANOs(int distance, SWGObject value ){ Vector foundTANOs = new Vector(); core.simulationService.get(value.getPlanet(), value.getWorldPosition().x, value.getWorldPosition().z, distance).stream().forEach((objecta) -> { diff --git a/src/services/ai/states/AIState.java b/src/services/ai/states/AIState.java index 5ba3ca2b..b65bad65 100644 --- a/src/services/ai/states/AIState.java +++ b/src/services/ai/states/AIState.java @@ -622,6 +622,9 @@ public abstract class AIState { } TangibleObject target = actor.getFollowObject(); float speed = (float) creature.getRunSpeed(); + if (creature.getAttachment("IsSlowVehicle")!=null){ + speed = (float) creature.getWalkSpeed(); + } float maxDistance = 6; if(creature.getWeaponId() != 0) { WeaponObject weapon = (WeaponObject) core.objectService.getObject(creature.getWeaponId()); diff --git a/src/services/gcw/GCWSpawner.java b/src/services/gcw/GCWSpawner.java index 458fc224..29a017ed 100644 --- a/src/services/gcw/GCWSpawner.java +++ b/src/services/gcw/GCWSpawner.java @@ -151,7 +151,7 @@ public class GCWSpawner extends TangibleObject{ System.err.println("Exception in SoldierPatrolPylon->scheduleAtFixedRate->spawnSoldier() " + e.getMessage()); } } - }, 10, 600, TimeUnit.SECONDS); + }, 120, 600, TimeUnit.SECONDS); } } @@ -275,7 +275,8 @@ public class GCWSpawner extends TangibleObject{ } String vehicleTemplate = vehicleTemplates[new Random().nextInt(vehicleTemplates.length)]; CreatureObject vehicle = (CreatureObject)NGECore.getInstance().spawnService.spawnCreature(vehicleTemplate, this.getPlanet().getName(), 0L, this.getPosition().x, this.getPosition().y, this.getPosition().z, this.getOrientation().w, this.getOrientation().x, this.getOrientation().y,this.getOrientation().z,-1); - + vehicle.setAttachment("IsSlowVehicle",true); + NGECore.getInstance().aiService.setPatrol(vehicle, patrolRoute); NGECore.getInstance().aiService.setPatrolLoop(vehicle,false); NGECore.getInstance().invasionService.registerInvader(vehicle); diff --git a/src/services/gcw/InvasionService.java b/src/services/gcw/InvasionService.java index 19a3f0ec..22ca6802 100644 --- a/src/services/gcw/InvasionService.java +++ b/src/services/gcw/InvasionService.java @@ -131,7 +131,7 @@ public class InvasionService implements INetworkDispatch { setInvasionLocationCenter(); - if (invasionPhase==2 && System.currentTimeMillis()>temptimestartreference + 90000 && ! message1sent){ + if (invasionPhase==2 && System.currentTimeMillis()>temptimestartreference + 140000 && ! message1sent){ sendDefenderMessage1(); message1sent = true; System.out.println("Defender msg1 sent "); @@ -556,7 +556,7 @@ public class InvasionService implements INetworkDispatch { fut[0].cancel(false); } - Vector nearAllies = NGECore.getInstance().simulationService.getAllNearSameFactionNPCs(5, barricade); + Vector nearAllies = NGECore.getInstance().simulationService.getAllNearSameFactionCreatures(7,barricade.getWorldPosition(),barricade.getPlanet(),getFactionName(defendingFaction)); for (CreatureObject ally : nearAllies){ if (! ally.hasBuff("barricade_defender")){ core.buffService.addBuffToCreature(ally, "barricade_defender", ally); @@ -700,9 +700,9 @@ public class InvasionService implements INetworkDispatch { public void sendDefenderMessage1(){ String message = ""; if (defendingFaction==Factions.Imperial) - message = "@gcw:gcw_announcement_rally_for_invasion_imperial_talus_dearic"; + message = "@gcw:gcw_announcement_man_defenses_imperial_talus_dearic"; if (defendingFaction==Factions.Rebel) - message = "@gcw:gcw_announcement_rally_for_invasion_rebel_talus_dearic"; + message = "@gcw:gcw_announcement_man_defenses_rebel_talus_dearic"; ConcurrentHashMap clients = NGECore.getInstance().getActiveConnectionsMap(); for (Map.Entry entry : clients.entrySet()) { Client client = entry.getValue(); @@ -717,6 +717,7 @@ public class InvasionService implements INetworkDispatch { } } + public void sendInvaderMessage2(){ String message = ""; if (invadingFaction==Factions.Imperial) @@ -898,6 +899,8 @@ public class InvasionService implements INetworkDispatch { public void makeDefensiveGeneralDefenderForNPCs(){ Vector enemies = core.simulationService.getAllNearNonSameFactionNPCs(50, defendingGeneral); + if (defendingGeneral==null) + return; for (CreatureObject enemy : enemies) { AIActor actor = (AIActor)enemy.getAttachment("AI"); actor.addDefender(defendingGeneral); diff --git a/src/tools/DevLogQueuer.java b/src/tools/DevLogQueuer.java index 205eb8cc..58a08f18 100644 --- a/src/tools/DevLogQueuer.java +++ b/src/tools/DevLogQueuer.java @@ -84,7 +84,7 @@ public class DevLogQueuer extends Thread { DevLog.appendToLog(str, path); } catch (Exception iex) { Thread.currentThread().interrupt(); - throw new RuntimeException("Unexpected interruption"); + throw new RuntimeException("Unexpected interruption -> Don't worry about it"); } }