diff --git a/scripts/character_builder_terminal.py b/scripts/character_builder_terminal.py index d58927ff..41d0f827 100644 --- a/scripts/character_builder_terminal.py +++ b/scripts/character_builder_terminal.py @@ -142,8 +142,9 @@ def travelHandler(owner): window.addHandler(0, '', Trigger.TRIGGER_OK, returnList, travelHandlerCallback) window.addListBoxMenuItem('Tatooine, Mos Eisley', 0) window.addListBoxMenuItem('Dantooine, Jedi Ruins', 1) - window.addListBoxMenuItem('Blank', 2) - window.addListBoxMenuItem('Blank', 3) + window.addListBoxMenuItem('Talus, Dearic Starport', 2) + window.addListBoxMenuItem('Naboo, Keren Starport', 3) + window.addListBoxMenuItem('Tatooine, Bestine Starport', 4) core.suiService.openSUIWindow(window); def travelHandlerCallback(owner, window, eventType, returnList): @@ -158,6 +159,15 @@ def travelHandlerCallback(owner, window, eventType, returnList): if returnList.get(0)=='1': jediRuinsTravel(owner) return + if returnList.get(0)=='2': + GCWDearicTravel(owner) + return + if returnList.get(0)=='3': + GCWKerenTravel(owner) + return + if returnList.get(0)=='4': + GCWBestineTravel(owner) + return return @@ -307,6 +317,8 @@ def miscHandler(owner): window.addListBoxMenuItem('Heroism Jewelry Set', 1) window.addListBoxMenuItem('Belt of Master Bodo Baas', 2) window.addListBoxMenuItem('Starter Equipment Box', 3) + window.addListBoxMenuItem('GCW Banners', 4) + core.suiService.openSUIWindow(window); def miscHandlerCallback(owner, window, eventType, returnList): @@ -327,6 +339,10 @@ def miscHandlerCallback(owner, window, eventType, returnList): if returnList.get(0)=='3': starterEquipmentBox(owner, inventory) return + if returnList.get(0)=='4': + GCWBanners(owner, inventory) + return + return def combatLevel(owner): @@ -652,6 +668,21 @@ def jediRuinsTravel(owner): core.simulationService.transferToPlanet(owner, core.terrainService.getPlanetByName("dantooine"), position, owner.getOrientation(), None) return +def GCWDearicTravel(owner): + position = Point3D(264, 4, -2950) + core.simulationService.transferToPlanet(owner, core.terrainService.getPlanetByName("talus"), position, owner.getOrientation(), None) + return + +def GCWKerenTravel(owner): + position = Point3D(1366, 13, 2747) + core.simulationService.transferToPlanet(owner, core.terrainService.getPlanetByName("naboo"), position, owner.getOrientation(), None) + return + +def GCWBestineTravel(owner): + position = Point3D(-1385,12, -3597) + core.simulationService.transferToPlanet(owner, core.terrainService.getPlanetByName("tatooine"), position, owner.getOrientation(), None) + return + def surveyDevices(owner, inventory): mineralSurveyTool = core.objectService.createObject("object/tangible/survey_tool/shared_survey_tool_mineral.iff", owner.getPlanet()) chemicalSurveyTool = core.objectService.createObject("object/tangible/survey_tool/shared_survey_tool_inorganic.iff", owner.getPlanet()) @@ -668,4 +699,20 @@ def surveyDevices(owner, inventory): inventory.add(windSurveyTool) inventory.add(solarSurveyTool) return + +def GCWBanners(owner, inventory): + + gcwBanner1 = core.objectService.createObject('object/tangible/gcw/pvp_rank_rewards/shared_rebel_battle_banner.iff', owner.getPlanet()) + 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) + gcwBanner2 = core.objectService.createObject('object/tangible/gcw/pvp_rank_rewards/shared_imperial_battle_banner.iff', owner.getPlanet()) + 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 \ No newline at end of file diff --git a/scripts/commands/setgodmode.py b/scripts/commands/setgodmode.py index ef487412..49f3cf40 100644 --- a/scripts/commands/setgodmode.py +++ b/scripts/commands/setgodmode.py @@ -2,13 +2,13 @@ import sys from engine.resources.scene import Point3D from protocol.swg import ObjControllerMessage from protocol.swg import UnknownAbilityPacket +from protocol.swg import PlayClientEffectLocMessage from engine.resources.objects import SWGObject from java.awt.datatransfer import StringSelection from java.awt.datatransfer import Clipboard from java.awt import Toolkit from resources.datatables import GcwRank from services.gcw import GCWService -import time def setup(): @@ -154,12 +154,6 @@ def run(core, actor, target, commandString): print ('Position.y : %s' % pos.y, 0) actor.sendSystemMessage('Position.z : %s' % pos.z, 0) print ('Position.z : %s' % pos.z, 0) -<<<<<<< HEAD - actor.sendSystemMessage('Orientation.y : %s' % ori.y, 0) - print ('Orientation.y : %s' % ori.y, 0) - actor.sendSystemMessage('Orientation.w : %s' % ori.w, 0) - print ('Orientation.w : %s' % ori.w, 0) -======= actor.sendSystemMessage('Orientation.w : %s' % ori.w, 0) print ('Orientation.x : %s' % ori.w, 0) actor.sendSystemMessage('Orientation.x : %s' % ori.x, 0) @@ -168,7 +162,6 @@ def run(core, actor, target, commandString): print ('Orientation.y : %s' % ori.y, 0) actor.sendSystemMessage('Orientation.z : %s' % ori.z, 0) print ('Orientation.z : %s' % ori.z, 0) ->>>>>>> origin/master if (actor.getContainer()): building_id = actor.getGrandparent().getObjectID() cid = actor.getContainer().getCellNumber() @@ -243,46 +236,6 @@ def run(core, actor, target, commandString): latargetID = long(actor.getIntendedTarget()) latarget = core.objectService.getObject(latargetID) actor.sendSystemMessage('Optionsbitmask for unit ' + latarget.getCustomName() + ' is %s' % latarget.getOptionsBitmask(), 0) - - elif command == 'nextupd': - latargetID = long(actor.getIntendedTarget()) - latarget = core.objectService.getObject(latargetID) - player = actor.getSlottedObject("ghost") - #player.setNextUpdateTime(1324005720) #84000 60*60*24 86400 - # 1324005720 is 2:06 AM to set to zero! - - player.setNextUpdateTime(452783) #84000 60*60*24 86400 83980800 140400 21*60=1260 83840400 6*60+55 - - elif command == 'epoch': - core.gcwService.sendServerNowEpochTime(actor) - - elif command == 'pushGCW': - player = actor.getSlottedObject("ghost") - player.setCurrentRank(1); - player.setGcwPoints(player.getGcwPoints()+1000) - - elif command == 'suitest': - window = core.suiService.createSUIWindow('Script.CountdownTimerBar', actor, None, 5) - window.setProperty('modifySlot', 'modifySlot') - window.setProperty('comp.text:Text', '@gcw:pylon_construction_prompt') - window.setProperty('bg.caption.lblTitle:Text', 'quest_countdown_timer') - window.addDataItem('countdownTimerTimeValue', 'this') - core.suiService.openTimerSUIWindow(window, 18) - time.sleep(18) - core.suiService.closeSUIWindow(window.getOwner(),window.getWindowId()) - - elif command == 'suitest2': - window = core.suiService.createSUIWindow('Script.CountdownTimerBar', actor, None, 5) - # Packet43 - #window.setProperty('text:Text', '10') - #window.setProperty('bar.value:Page', '10') - window.setProperty('comp.text:Text', '@gcw:pylon_construction_prompt') - window.setProperty('bg.caption.lblTitle:Text', 'quest_countdown_timer') - window.addDataItem('countdownTimerTimeValue', 'this') - #window.addDataItem('bar.value', '10') - core.suiService.openSUIWindow(window) - time.sleep(5) - core.suiService.closeSUIWindow(window.getOwner(),window.getWindowId()) elif command == 'spawninst': @@ -303,8 +256,23 @@ def run(core, actor, target, commandString): actor.sendSystemMessage('Line of sight between player and target', 0) else: actor.sendSystemMessage('NO Line of sight between player and target', 0) - - elif command == 'unknownAbilityPacket' and arg1: + + elif command == 'playfx': + effectFile = arg1 + cEffMsg = PlayClientEffectLocMessage(effectFile, actor.getPlanet().getName(), actor.getPosition()) + actor.getClient().getSession().write(cEffMsg.serialize()) + + elif command == 'toinvasion': + invasionplanet = core.invasionService.getInvasionPlanetName() + position = Point3D(float(1366), float(13), float(2747)) + if invasionplanet == 'talus': + position = Point3D(float(264), float(4), float(-2950)) + if invasionplanet == 'tatooine': + position = Point3D(float(-1385), float(12), float(-3597)) + + core.simulationService.transferToPlanet(actor, core.terrainService.getPlanetByName(invasionplanet), position, actor.getOrientation(), None) + + elif command == 'unknownAbilityPacket' and arg1: packet = UnknownAbilityPacket(arg1) actor.getClient().getSession().write(packet.serialize()) actor.sendSystemMessage('Sent UnknownAbilityPacket for ability ' + arg1, 0) @@ -326,4 +294,4 @@ def run(core, actor, target, commandString): return return - + \ No newline at end of file diff --git a/scripts/mobiles/generic/faction/imperial/imp_invasion_disabled_atst.py b/scripts/mobiles/generic/faction/imperial/imp_invasion_disabled_atst.py index 62d01f40..9b9040b8 100644 --- a/scripts/mobiles/generic/faction/imperial/imp_invasion_disabled_atst.py +++ b/scripts/mobiles/generic/faction/imperial/imp_invasion_disabled_atst.py @@ -41,5 +41,5 @@ def addTemplate(core): mobileTemplate.setDefaultAttack('gcw_atst_attack_tower') #gcw_atst_attack_tower #rangedShot mobileTemplate.setAttacks(attacks) - core.spawnService.addMobileTemplate('imp_invasion_at_st', mobileTemplate) + core.spawnService.addMobileTemplate('imp_invasion_disabled_atst', mobileTemplate) return \ No newline at end of file diff --git a/scripts/mobiles/tatooine/delrice_depresse.py b/scripts/mobiles/tatooine/delrice_depresse.py index df627a22..b47bee77 100644 --- a/scripts/mobiles/tatooine/delrice_depresse.py +++ b/scripts/mobiles/tatooine/delrice_depresse.py @@ -32,10 +32,7 @@ def addTemplate(core): attacks = Vector() mobileTemplate.setDefaultAttack('creatureMeleeAttack') -<<<<<<< HEAD -======= mobileTemplate.setDefaultAttack('MeleeAttack') ->>>>>>> origin/master mobileTemplate.setAttacks(attacks) core.spawnService.addMobileTemplate('jabbas_palace_delrice_capreese', mobileTemplate) diff --git a/scripts/mobiles/tatooine/fighting_romo_vax.py b/scripts/mobiles/tatooine/fighting_romo_vax.py index fa646904..d5acb62e 100644 --- a/scripts/mobiles/tatooine/fighting_romo_vax.py +++ b/scripts/mobiles/tatooine/fighting_romo_vax.py @@ -25,11 +25,7 @@ def addTemplate(core): templates = Vector() -<<<<<<< HEAD - templates.add('object/mobile/shared_dressed_trader_thug_male_human_01.iff') #need to find correct template -======= templates.add('object/mobile/shared_dressed_cobral_thief_human_male_01.iff') ->>>>>>> origin/master mobileTemplate.setTemplates(templates) weaponTemplates = Vector() diff --git a/scripts/mobiles/tatooine/mos_eisley_police_officer.py b/scripts/mobiles/tatooine/mos_eisley_police_officer.py index 2e7a335f..99bec986 100644 --- a/scripts/mobiles/tatooine/mos_eisley_police_officer.py +++ b/scripts/mobiles/tatooine/mos_eisley_police_officer.py @@ -19,6 +19,7 @@ def addTemplate(core): mobileTemplate.setAssistRange(0) mobileTemplate.setStalker(True) mobileTemplate.setOptionsBitmask(Options.ATTACKABLE) + mobileTemplate.setRespawnTime(5) templates = Vector() templates.add('object/mobile/shared_dressed_eisley_officer_aqualish_female_01.iff') diff --git a/scripts/mobiles/tatooine/mos_eisley_police_sergeant.py b/scripts/mobiles/tatooine/mos_eisley_police_sergeant.py index ad35c65e..f92baa28 100644 --- a/scripts/mobiles/tatooine/mos_eisley_police_sergeant.py +++ b/scripts/mobiles/tatooine/mos_eisley_police_sergeant.py @@ -19,6 +19,7 @@ def addTemplate(core): mobileTemplate.setAssistRange(0) mobileTemplate.setStalker(True) mobileTemplate.setOptionsBitmask(Options.ATTACKABLE) + mobileTemplate.setRespawnTime(5) templates = Vector() templates.add('object/mobile/shared_dressed_eisley_officer_bothan_female_01.iff') diff --git a/scripts/mobiles/tatooine/romovax_henchman.py b/scripts/mobiles/tatooine/romovax_henchman.py index 205476e4..8c844dca 100644 --- a/scripts/mobiles/tatooine/romovax_henchman.py +++ b/scripts/mobiles/tatooine/romovax_henchman.py @@ -23,23 +23,12 @@ def addTemplate(core): mobileTemplate.setStalker(False) mobileTemplate.setOptionsBitmask(Options.AGGRESSIVE | Options.ATTACKABLE) -<<<<<<< HEAD - templates = Vector() #need to find correct template - templates.add('object/mobile/shared_dressed_trader_thug_female_human_01.iff') - templates.add('object/mobile/shared_dressed_trader_thug_female_human_02.iff') - templates.add('object/mobile/shared_dressed_trader_thug_female_human_03.iff') - templates.add('object/mobile/shared_dressed_trader_thug_female_twk_01.iff') - templates.add('object/mobile/shared_dressed_trader_thug_female_twk_02.iff') - templates.add('object/mobile/shared_dressed_trader_thug_male_human_02.iff') - templates.add('object/mobile/shared_dressed_trader_thug_male_human_03.iff') -======= templates = Vector() templates.add('object/mobile/shared_dressed_cobral_hooligan_bith_female_01.iff') templates.add('object/mobile/shared_dressed_cobral_hitman_human_female_01.iff') templates.add('object/mobile/shared_dressed_cobral_overlord_human_male_01.iff') templates.add('object/mobile/shared_dressed_cobral_boss_twk_female_01.iff') templates.add('object/mobile/shared_dressed_cobral_assassin_twk_female_01.iff') ->>>>>>> origin/master mobileTemplate.setTemplates(templates) weaponTemplates = Vector() diff --git a/scripts/static_spawns/tatooine/jabba_tp_romo_vax_bunker.py b/scripts/static_spawns/tatooine/jabba_tp_romo_vax_bunker.py index 9b484dbc..4361ff33 100644 --- a/scripts/static_spawns/tatooine/jabba_tp_romo_vax_bunker.py +++ b/scripts/static_spawns/tatooine/jabba_tp_romo_vax_bunker.py @@ -43,10 +43,6 @@ def addPlanetSpawns(core, planet): stcSvc.spawnObject('romovax_henchman', 'tatooine', bunker.getCellByCellNumber(7), float(-19.9), float(-16), float(78.8), float(0), float(0), float(0), float(0), 45) stcSvc.spawnObject('romovax_henchman', 'tatooine', bunker.getCellByCellNumber(9), float(32.4), float(-14), float(78.7), float(0), float(0), float(0), float(0), 45) -<<<<<<< HEAD - stcSvc.spawnObject('fighting_romo_vax', 'tatooine', bunker.getCellByCellNumber(9), float(-42.7), float(-14), float(-79.1), float(0), float(0), float(0), float(0), 45) -======= stcSvc.spawnObject('fighting_romo_vax', 'tatooine', bunker.getCellByCellNumber(9), float(-43.5), float(-14), float(-78.9), float(0), float(0), float(0), float(0), 45) ->>>>>>> origin/master return diff --git a/src/main/NGECore.java b/src/main/NGECore.java index 44c59f72..2ff36549 100644 --- a/src/main/NGECore.java +++ b/src/main/NGECore.java @@ -92,7 +92,6 @@ import services.equipment.EquipmentService; import services.gcw.FactionService; import services.gcw.GCWService; import services.gcw.InvasionService; -import services.gcw.InvasionService3; import services.GuildService; import services.LoginService; import services.map.MapService; @@ -155,6 +154,7 @@ public class NGECore { private String motd = ""; private volatile boolean isShuttingDown = false; private long galacticTime = System.currentTimeMillis(); + private int galaxyStatus = -1; private ConcurrentHashMap clients = new ConcurrentHashMap(); @@ -558,7 +558,6 @@ public class NGECore { browserService = new BrowserService(this); //battlefieldService = new BattlefieldService(this); - devService = new DevService(this); DevLogQueuer devLogQueuer = new DevLogQueuer(); @@ -644,6 +643,7 @@ public class NGECore { public void setGalaxyStatus(int statusId) { + galaxyStatus = statusId; int galaxyId = config.getInt("GALAXY_ID"); try { @@ -657,6 +657,10 @@ public class NGECore { } + public int getGalaxyStatus() { + return galaxyStatus; + } + /* * ---------- Getter methods for NGECore ---------- */ diff --git a/src/resources/objects/tangible/TangibleObject.java b/src/resources/objects/tangible/TangibleObject.java index 27152df1..0a5c86e0 100644 --- a/src/resources/objects/tangible/TangibleObject.java +++ b/src/resources/objects/tangible/TangibleObject.java @@ -49,11 +49,6 @@ import resources.objects.ObjectMessageBuilder; import resources.objects.SWGList; import resources.objects.SWGSet; import resources.objects.creature.CreatureObject; -<<<<<<< HEAD -import resources.objects.installation.InstallationObject; -import tools.DevLog; -======= ->>>>>>> origin/master import engine.clientdata.ClientFileManager; import engine.clientdata.visitors.IDManagerVisitor; import engine.clients.Client; diff --git a/src/resources/objects/weapon/WeaponObject.java b/src/resources/objects/weapon/WeaponObject.java index 4a05ab89..4f7402b6 100644 --- a/src/resources/objects/weapon/WeaponObject.java +++ b/src/resources/objects/weapon/WeaponObject.java @@ -203,55 +203,10 @@ public class WeaponObject extends TangibleObject implements Serializable { return (int) (((getMaxDamage() + getElementalDamage() + getMinDamage() + getElementalDamage()) / 2 + getElementalDamage()) * (1 / getAttackSpeed())); } else { return (int) (((getMaxDamage() + getMinDamage()) / 2 ) * (1 / getAttackSpeed())); -<<<<<<< HEAD - } else - return 0; - } - - public int getWeaponType() { - if (getStringAttribute("cat_wpn_damage.wpn_category") == null) { - System.err.println("Error: Weapon Type not defined for " + getTemplate()); - return 6; - } - - return Integer.parseInt(getStringAttribute("cat_wpn_damage.wpn_category").replace("@obj_attr_n:wpn_category_", "")); - } - - public void setWeaponType(int weaponType) { - setStringAttribute("cat_wpn_damage.wpn_category", "@obj_attr_n:wpn_category_" + weaponType); - } - - @Override - public void sendBaselines(Client destination) { - - if(destination == null || destination.getSession() == null) - return; - - destination.getSession().write(messageBuilder.buildBaseline3()); - destination.getSession().write(messageBuilder.buildBaseline6()); - destination.getSession().write(messageBuilder.buildBaseline8()); - destination.getSession().write(messageBuilder.buildBaseline9()); - - - } - - public float getAttackSpeed() { - return getFloatAttribute("cat_wpn_damage.wpn_attack_speed"); - } - - public void setAttackSpeed(float attackSpeed) { - if((int) attackSpeed != attackSpeed) - setFloatAttribute("cat_wpn_damage.wpn_attack_speed", attackSpeed); - else - setIntAttribute("cat_wpn_damage.wpn_attack_speed", (int) attackSpeed); - - setIntAttribute("cat_wpn_damage.dps", getDamagePerSecond()); -======= } } else { return 0; } ->>>>>>> origin/master } public boolean isMelee() { diff --git a/src/services/BuffService.java b/src/services/BuffService.java index a5944f18..c68b1432 100644 --- a/src/services/BuffService.java +++ b/src/services/BuffService.java @@ -21,9 +21,7 @@ ******************************************************************************/ 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; @@ -38,26 +36,15 @@ 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 resources.skills.SkillMod; -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; @@ -199,16 +186,8 @@ public class BuffService implements INetworkDispatch { if (buff.getDuration() != -1.0) if (otherBuff.getRemainingDuration() > buff.getDuration() && otherBuff.getStacks() >= otherBuff.getMaxStacks()) return null; -<<<<<<< HEAD - } -// else { -// removeBuffFromCreature(target, otherBuff); // Seems more logical ToDo: Verify!!! -// } - removeBuffFromCreature(target, otherBuff); // Moved to else, otherwise buff will not stack -======= } removeBuffFromCreature(target, otherBuff); ->>>>>>> origin/master break; } else { @@ -225,13 +204,13 @@ public class BuffService implements INetworkDispatch { if(buff.getEffect3Name().length() > 0) core.skillModService.addSkillMod(target, buff.getEffect3Name(), (int) buff.getEffect3Value()); if(buff.getEffect4Name().length() > 0) core.skillModService.addSkillMod(target, buff.getEffect4Name(), (int) buff.getEffect4Value()); if(buff.getEffect5Name().length() > 0) core.skillModService.addSkillMod(target, buff.getEffect5Name(), (int) buff.getEffect5Value()); - - if (buffName.equals("gcw_fatigue")){ - if (FileUtilities.doesFileExist("scripts/buffs/" + buffName + ".py")) { - core.scriptService.callScript("scripts/buffs/", buffName, "add", core, buffer, buff); - } - } // } + + if (buffName.equals("gcw_fatigue")){ + if (FileUtilities.doesFileExist("scripts/buffs/" + buffName + ".py")) { + core.scriptService.callScript("scripts/buffs/", buffName, "add", core, buffer, buff); + } + } target.addBuff(buff); @@ -304,21 +283,6 @@ public class BuffService implements INetworkDispatch { /* if(FileUtilities.doesFileExist("scripts/buffs/" + buff.getBuffName() + ".py")) core.scriptService.callScript("scripts/buffs/", buff.getBuffName(), "remove", core, creature, buff); else {*/ -<<<<<<< HEAD - if(buff.getEffect1Name().length() > 0) core.skillModService.deductSkillMod(creature, buff.getEffect1Name(), (int) buff.getEffect1Value()); - if(buff.getEffect2Name().length() > 0) core.skillModService.deductSkillMod(creature, buff.getEffect2Name(), (int) buff.getEffect2Value()); - if(buff.getEffect1Name().length() > 0) core.skillModService.deductSkillMod(creature, buff.getEffect3Name(), (int) buff.getEffect3Value()); - if(buff.getEffect1Name().length() > 0) core.skillModService.deductSkillMod(creature, buff.getEffect4Name(), (int) buff.getEffect4Value()); - if(buff.getEffect1Name().length() > 0) core.skillModService.deductSkillMod(creature, buff.getEffect5Name(), (int) buff.getEffect5Value()); - - if (buff.getBuffName().equals("gcw_fatigue")){ - if (FileUtilities.doesFileExist("scripts/buffs/" + buff.getBuffName() + ".py")) { - core.scriptService.callScript("scripts/buffs/", buff.getBuffName(), "remove", core, creature, buff); - } - } - // } -======= ->>>>>>> origin/master if(buff.getEffect1Name().length() > 0) { diff --git a/src/services/ai/AIActor.java b/src/services/ai/AIActor.java index df744641..20bc635b 100644 --- a/src/services/ai/AIActor.java +++ b/src/services/ai/AIActor.java @@ -83,10 +83,9 @@ public class AIActor { private long waitStartTime = 0L; private AIState intendedPrimaryAIState; private Point3D lastPositionBeforeStateChange; -<<<<<<< HEAD - private ScheduledFuture movementFuture; - private ScheduledFuture recoveryFuture; - private ScheduledFuture despawnFuture; + private ScheduledFuture movementFuture; + private ScheduledFuture recoveryFuture; + private ScheduledFuture despawnFuture; private boolean patrolLoop = true; // default private TangibleObject lastTarget = null; private Point3D repositionLocation; @@ -96,11 +95,6 @@ public class AIActor { private boolean actorAlive = true; private int progressionMarker = 0; private boolean AIactive = true; -======= - private ScheduledFuture movementFuture; - private ScheduledFuture recoveryFuture; - private ScheduledFuture despawnFuture; ->>>>>>> origin/master public AIActor(CreatureObject creature, Point3D spawnPosition, ScheduledExecutorService scheduler) { actorID = autoActorID++; @@ -383,10 +377,12 @@ public class AIActor { destroyActor(); return; } - if (caughtAIState.getClass().equals(currentState.getClass())) - doStateAction(caughtAIState.move(AIActor.this)); + if (caughtAIState!=null && currentState!=null){ + if (caughtAIState.getClass().equals(currentState.getClass())) + doStateAction(caughtAIState.move(AIActor.this)); + } } catch (Exception e) { - System.out.println("Exception in scheduleMovement"); + //System.out.println("Exception in scheduleMovement"); e.printStackTrace(); } }, 500, TimeUnit.MILLISECONDS); @@ -534,13 +530,13 @@ public class AIActor { try { damageMap.clear(); followObject = null; - creature.setAttachment("AI", null); - NGECore.getInstance().objectService.destroyObject(creature); + NGECore.getInstance().objectService.destroyObject(creature); } catch (Exception e) { e.printStackTrace(); } } - }, 2, TimeUnit.MINUTES); + //}, 2, TimeUnit.MINUTES); + }, 10, TimeUnit.SECONDS); } public void destroyActor(){ @@ -778,4 +774,27 @@ public class AIActor { actorAlive = false; // stop moving AIactive = false; // stop reacting to attacks } + + public void cloneActor(AIActor oldActor) { + AIactive = oldActor.isAIactive(); + isStalking = oldActor.isStalking(); + patrolPoints = oldActor.getPatrolPoints(); + loiterDestType = oldActor.getLoiterDestType(); + loiterDestination = oldActor.getLoiterDestination(); + minLoiterDist = oldActor.getMinLoiterDist(); + maxLoiterDist = oldActor.getMaxLoiterDist(); + waitState = oldActor.getWaitState(); + waitStartTime = oldActor.getWaitStartTime(); + patrolLoop =oldActor.isPatrolLoop(); + intendedPrimaryAIState = oldActor.getIntendedPrimaryAIState(); + try { + setCurrentState(intendedPrimaryAIState.getClass().newInstance()); + } catch (InstantiationException e) { + System.out.println("Aiactor cloning failed InstantiationException"); + e.printStackTrace(); + } catch (IllegalAccessException e) { + System.out.println("Aiactor cloning failed IllegalAccessException"); + e.printStackTrace(); + } + } } diff --git a/src/services/ai/AIService.java b/src/services/ai/AIService.java index 064748ac..162b09b1 100644 --- a/src/services/ai/AIService.java +++ b/src/services/ai/AIService.java @@ -244,7 +244,7 @@ public class AIService { return (p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y) + (p2.z - p1.z) * (p2.z - p1.z); } - public void waitForEvent(AIActor actor, INetworkDispatch service, String serviceMethodName, boolean expectedValue, Class nextStateClass){ + public void waitForEvent(AIActor actor, INetworkDispatch service, String serviceMethodName, boolean expectedValue, Class nextStateClass){ final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); final Future[] wfe = {null}; @@ -268,7 +268,7 @@ public class AIService { }, 10, 3000, TimeUnit.MILLISECONDS); } - public void waitForEvent(AIActor actor, INetworkDispatch service, String serviceMethodName, int expectedValue, Class nextStateClass){ + public void waitForEvent(AIActor actor, INetworkDispatch service, String serviceMethodName, int expectedValue, Class nextStateClass){ final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); final Future[] wfe = {null}; wfe[0] = scheduler.scheduleAtFixedRate(new Runnable() { @@ -300,7 +300,6 @@ public class AIService { public void run() { try { boolean condition = true; - Object[] params; //The parameters for my method Class noParams[] = {}; Method m = service.getClass().getMethod(serviceMethodName, noParams); m.invoke(service); diff --git a/src/services/ai/states/AIState.java b/src/services/ai/states/AIState.java index 15065eff..f9d04e2d 100644 --- a/src/services/ai/states/AIState.java +++ b/src/services/ai/states/AIState.java @@ -789,7 +789,7 @@ public abstract class AIState { if (NGECore.getInstance().simulationService.getAllNearSameFactionNPCs(7, creature).size()>=4 && NGECore.getInstance().invasionService.getInvasionPhase()!=3){ actor.setAIactive(false); // switch off auto-target-recognition to counter lag actor.setCurrentState(new IdleState()); - System.out.println("AI switched off!"); + //System.out.println("AI switched off!"); return; } diff --git a/src/services/ai/states/AttackState.java b/src/services/ai/states/AttackState.java index 2a8cd23e..203b490b 100644 --- a/src/services/ai/states/AttackState.java +++ b/src/services/ai/states/AttackState.java @@ -39,6 +39,8 @@ public class AttackState extends AIState { DevLog.debugoutai(actor, "Charon", "AI Attack State", "onEnter"); CreatureObject creature = actor.getCreature(); + if (creature == null || actor==null) + return StateResult.DEAD; DevLog.debugoutai(actor, "Charon", "AI Attack State", "creature.isInCombat() " + creature.isInCombat()); DevLog.debugoutai(actor, "Charon", "AI Attack State", "creature.getDefendersList().size() == 0 " + (creature.getDefendersList().size() == 0)); DevLog.debugoutai(actor, "Charon", "AI Attack State", "actor.getFollowObject() == null " + (actor.getFollowObject() == null)); @@ -152,23 +154,9 @@ public class AttackState extends AIState { NGECore core = NGECore.getInstance(); if(creature.getPosture() == 14) return StateResult.DEAD; -<<<<<<< HEAD TangibleObject target = actor.getFollowObject(); -======= - if(!creature.isInCombat() || creature.getDefendersList().size() == 0 || actor.getFollowObject() == null) - { - if (creature.getLookAtTarget() != 0) - creature.setLookAtTarget(0); - if (creature.getIntendedTarget() != 0) - creature.setIntendedTarget(0); - actor.setFollowObject(null); - actor.setCurrentState(new RetreatState()); - return StateResult.FINISHED; - } - CreatureObject target = actor.getFollowObject(); ->>>>>>> origin/master if(target != actor.getHighestDamageDealer() && actor.getHighestDamageDealer() != null) { actor.setFollowObject(actor.getHighestDamageDealer()); target = actor.getFollowObject(); @@ -178,7 +166,6 @@ public class AttackState extends AIState { actor.scheduleRecovery(); return StateResult.UNFINISHED; } -<<<<<<< HEAD // If AI has no LOS to target, reposition it if (!core.simulationService.checkLineOfSight(target,creature)){ @@ -198,22 +185,9 @@ public class AttackState extends AIState { creature.setIntendedTarget(0); actor.setFollowObject(null); if (actor.getIntendedPrimaryAIState().getClass().equals(PatrolState.class)) - actor.setCurrentState(new RetreatState()); // Should be Patrol state + actor.setCurrentState(new RetreatState()); else { - actor.setCurrentState(new RetreatState()); // Should be Patrol state -======= - if(target.getPosture() == 13 || target.getPosture() == 14 || target.isInStealth()) { - - actor.setFollowObject(actor.getHighestDamageDealer()); - target = actor.getFollowObject(); - if(target == null) - { - if (creature.getLookAtTarget() != 0) - creature.setLookAtTarget(0); - if (creature.getIntendedTarget() != 0) - creature.setIntendedTarget(0); - ->>>>>>> origin/master + actor.setCurrentState(new RetreatState()); } return StateResult.FINISHED; } @@ -235,9 +209,9 @@ public class AttackState extends AIState { actor.removeDefender(target); if (actor.getIntendedPrimaryAIState().getClass().equals(PatrolState.class)) - actor.setCurrentState(new RetreatState()); // Should be Patrol state + actor.setCurrentState(new RetreatState()); else { - actor.setCurrentState(new RetreatState()); // Should be Patrol state + actor.setCurrentState(new RetreatState()); } return StateResult.FINISHED; } @@ -262,13 +236,12 @@ public class AttackState extends AIState { actor.removeDefender(target); if (actor.getIntendedPrimaryAIState().getClass().equals(PatrolState.class)) - actor.setCurrentState(new RetreatState()); // Should be Patrol state + actor.setCurrentState(new RetreatState()); else { - actor.setCurrentState(new RetreatState()); // Should be Patrol state + actor.setCurrentState(new RetreatState()); } return StateResult.FINISHED; - } - + } } if(target.getWorldPosition().getDistance(creature.getWorldPosition()) > maxDistance) { @@ -282,10 +255,9 @@ public class AttackState extends AIState { // Pet // if (creature.getOwnerId()>0) // attacks = creature.getSpecialAttacks(); - if (creature.getLookAtTarget() != target.getObjectId()) - creature.setLookAtTarget(target.getObjectId()); - if (creature.getIntendedTarget() != target.getObjectId()) - creature.setIntendedTarget(target.getObjectId()); + + creature.setLookAtTarget(target.getObjectId()); + creature.setIntendedTarget(target.getObjectId()); if (attacks==null) { //if(attacks.size() == 0) { diff --git a/src/services/ai/states/PatrolState.java b/src/services/ai/states/PatrolState.java index ee61d713..72cb9b27 100644 --- a/src/services/ai/states/PatrolState.java +++ b/src/services/ai/states/PatrolState.java @@ -21,10 +21,8 @@ ******************************************************************************/ package services.ai.states; -import main.NGECore; import resources.objects.creature.CreatureObject; import services.ai.AIActor; -import services.ai.states.AIState.StateResult; import tools.DevLog; public class PatrolState extends AIState { diff --git a/src/services/ai/states/RepositionState.java b/src/services/ai/states/RepositionState.java index ce7dce90..f2452abc 100644 --- a/src/services/ai/states/RepositionState.java +++ b/src/services/ai/states/RepositionState.java @@ -5,7 +5,6 @@ import engine.resources.scene.Point3D; import resources.objects.creature.CreatureObject; import resources.objects.tangible.TangibleObject; import services.ai.AIActor; -import services.ai.states.AIState.StateResult; import tools.DevLog; /** diff --git a/src/services/ai/states/TurretAIState.java b/src/services/ai/states/TurretAIState.java index 7d99664c..2c6e89c7 100644 --- a/src/services/ai/states/TurretAIState.java +++ b/src/services/ai/states/TurretAIState.java @@ -23,15 +23,10 @@ package services.ai.states; import java.util.NoSuchElementException; import java.util.Vector; - import main.NGECore; import engine.resources.scene.Point3D; -import engine.resources.scene.Quaternion; -import resources.common.SpawnPoint; import resources.objects.cell.CellObject; -import resources.objects.creature.CreatureObject; import resources.objects.tangible.TangibleObject; -import resources.objects.weapon.WeaponObject; import services.ai.TurretAIActor; public abstract class TurretAIState { @@ -69,7 +64,7 @@ public abstract class TurretAIState { boolean finished = false; float dx, dz, newX = 0, newY = 0, newZ = 0; Vector movementPoints = actor.getMovementPoints(); - Vector patrolPoints = actor.getPatrolPoints(); + //Vector patrolPoints = actor.getPatrolPoints(); CellObject cell = null; //while(!finished && movementPoints.size() != 0) { @@ -187,7 +182,7 @@ public abstract class TurretAIState { float maxDistance = stopDistance; boolean finished = false; float dx, dz, newX = 0, newY = 0, newZ = 0; - Vector movementPoints = actor.getMovementPoints(); + //Vector movementPoints = actor.getMovementPoints(); CellObject cell = null; targetPosition = actor.getLoiterDestination(); diff --git a/src/services/ai/states/TurretAttackState.java b/src/services/ai/states/TurretAttackState.java index 20840e8a..29ac49ca 100644 --- a/src/services/ai/states/TurretAttackState.java +++ b/src/services/ai/states/TurretAttackState.java @@ -21,16 +21,11 @@ ******************************************************************************/ package services.ai.states; -import java.util.Random; -import java.util.Vector; - import main.NGECore; import resources.objects.creature.CreatureObject; import resources.objects.tangible.TangibleObject; import resources.objects.weapon.WeaponObject; -import services.ai.AIActor; import services.ai.TurretAIActor; -import services.ai.states.AIState.StateResult; import tools.DevLog; public class TurretAttackState extends TurretAIState { @@ -108,12 +103,19 @@ public class TurretAttackState extends TurretAIState { NGECore core = NGECore.getInstance(); if (core.aiService.getCheckAI()!=null){ - if (core.aiService.getCheckAI().getObjectID()==creature.getObjectID()) - System.out.println("creature.getConditionDamage() " + creature.getConditionDamage() + " creature.getMaximumCondition() " + creature.getMaximumCondition()); +// if (core.aiService.getCheckAI().getObjectID()==creature.getObjectID()) +// System.out.println("creature.getConditionDamage() " + creature.getConditionDamage() + " creature.getMaximumCondition() " + creature.getMaximumCondition()); } - if(creature.getConditionDamage()>=creature.getMaximumCondition()) + if(creature.getConditionDamage()>=creature.getMaximumCondition()){ +// String effectFile = "clienteffect/npe_explosion_02.cef"; +// Vector allPlayers = core.simulationService.getAllNearPlayers(300, creature.getPlanet(), creature.getPosition()); +// for (CreatureObject player : allPlayers){ +// PlayClientEffectLocMessage cEffMsg = new PlayClientEffectLocMessage(effectFile, creature.getPlanet().getName(), creature.getPosition()); +// player.getClient().getSession().write(cEffMsg.serialize()); +// } return StateResult.DEAD; + } if(!creature.isInCombat() || creature.getDefendersList().size() == 0 || actor.getFollowObject() == null) { @@ -157,7 +159,12 @@ public class TurretAttackState extends TurretAIState { actor.removeDefender(target); // actor.scheduleRecovery(); // return StateResult.UNFINISHED; - +// String effectFile = "clienteffect/npe_explosion_02.cef"; +// Vector allPlayers = core.simulationService.getAllNearPlayers(300, creature.getPlanet(), creature.getPosition()); +// for (CreatureObject player : allPlayers){ +// PlayClientEffectLocMessage cEffMsg = new PlayClientEffectLocMessage(effectFile, creature.getPlanet().getName(), creature.getPosition()); +// player.getClient().getSession().write(cEffMsg.serialize()); +// } return StateResult.FINISHED; } } diff --git a/src/services/ai/states/TurretIdleState.java b/src/services/ai/states/TurretIdleState.java index b4fe24c2..e6543a66 100644 --- a/src/services/ai/states/TurretIdleState.java +++ b/src/services/ai/states/TurretIdleState.java @@ -22,7 +22,6 @@ package services.ai.states; import services.ai.TurretAIActor; -import services.ai.states.AIState.StateResult; import tools.DevLog; public class TurretIdleState extends TurretAIState { diff --git a/src/services/ai/states/WithdrawalState.java b/src/services/ai/states/WithdrawalState.java index 05facb88..2f343107 100644 --- a/src/services/ai/states/WithdrawalState.java +++ b/src/services/ai/states/WithdrawalState.java @@ -3,7 +3,6 @@ package services.ai.states; import resources.datatables.Options; import resources.objects.creature.CreatureObject; import services.ai.AIActor; -import services.ai.states.AIState.StateResult; import tools.DevLog; public class WithdrawalState extends AIState { diff --git a/src/services/gcw/GCWPylon.java b/src/services/gcw/GCWPylon.java index 55ace633..e7e17607 100644 --- a/src/services/gcw/GCWPylon.java +++ b/src/services/gcw/GCWPylon.java @@ -21,20 +21,15 @@ ******************************************************************************/ package services.gcw; -import java.util.HashSet; import java.util.Map; -import java.util.Set; 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.TimeUnit; - import main.NGECore; -import protocol.swg.PlayClientEffectObjectMessage; import protocol.swg.PlayClientEffectObjectTransformMessage; -import protocol.swg.UpdateContainmentMessage; import engine.clients.Client; import engine.resources.scene.Planet; import engine.resources.scene.Point3D; @@ -48,7 +43,6 @@ import resources.objects.installation.InstallationObject; import resources.objects.tangible.TangibleObject; import resources.objects.weapon.WeaponObject; import services.ai.TurretAIActor; -import services.gcw.GCWSpawner.PatrolRoute; /** * @author Charon @@ -147,10 +141,10 @@ public class GCWPylon extends TangibleObject{ //if (determinePylonLevel()==0) //return; -// resourceFilling = 100; -// spawnLevel = 3; - resourceFilling = 10; - spawnLevel = 1; + resourceFilling = 100; + spawnLevel = 3; +// resourceFilling = 10; +// spawnLevel = 1; switch (pylonType){ case PylonType.Barricade: createBarricade(); diff --git a/src/services/gcw/GCWSpawner.java b/src/services/gcw/GCWSpawner.java index 9a4e92f4..c59f6924 100644 --- a/src/services/gcw/GCWSpawner.java +++ b/src/services/gcw/GCWSpawner.java @@ -40,6 +40,7 @@ import resources.objects.tangible.TangibleObject; * @author Charon */ +@SuppressWarnings("unused") public class GCWSpawner extends TangibleObject{ private static final long serialVersionUID = 1L; @@ -63,6 +64,7 @@ public class GCWSpawner extends TangibleObject{ private String[] imperialVehicleTemplates2 = new String[]{"imp_invasion_at_st"}; private String[] imperialVehicleTemplates3 = new String[]{"imp_invasion_at_st"}; + private String[] siegeVehicleTemplates = new String[]{""}; private String[] rebelSiegeVehicleTemplates1 = new String[]{"rebel_invasion_hailfire_droid"}; private String[] rebelSiegeVehicleTemplates2 = new String[]{"rebel_invasion_hailfire_droid"}; @@ -225,6 +227,12 @@ public class GCWSpawner extends TangibleObject{ CreatureObject soldier = (CreatureObject)NGECore.getInstance().spawnService.spawnCreature(soldierTemplate, 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); if (spawnerFaction==Factions.Rebel) soldier.setStfName(stfName); + if (spawnerFaction==Factions.Imperial){ + String[] Prefices = new String[]{"GK-","TK-"}; + int suffix = 300 + new Random().nextInt(700); + String stormtrooperID = Prefices[new Random().nextInt(Prefices.length)]+suffix; + soldier.setCustomName(stormtrooperID); + } NGECore.getInstance().invasionService.registerInvader(soldier); totalSpawnedUnits++; soldier.setAttachment("IsInvader","yes"); @@ -268,7 +276,13 @@ public class GCWSpawner extends TangibleObject{ String soldierTemplate = soldierTemplates[new Random().nextInt(soldierTemplates.length)]; lastDefender = (CreatureObject)NGECore.getInstance().spawnService.spawnCreature(soldierTemplate, 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); if (spawnerFaction==Factions.Rebel) - lastDefender.setStfName(stfName); + lastDefender.setStfName(stfName); + if (spawnerFaction==Factions.Imperial){ + String[] Prefices = new String[]{"GK-","TK-"}; + int suffix = 300 + new Random().nextInt(700); + String stormtrooperID = Prefices[new Random().nextInt(Prefices.length)]+suffix; + lastDefender.setCustomName(stormtrooperID); + } NGECore.getInstance().invasionService.registerDefender(lastDefender); totalSpawnedUnits++; } diff --git a/src/services/gcw/InvasionService.java b/src/services/gcw/InvasionService.java index 1aae211b..71100d9d 100644 --- a/src/services/gcw/InvasionService.java +++ b/src/services/gcw/InvasionService.java @@ -46,6 +46,7 @@ import resources.common.OutOfBand; import resources.common.SpawnPoint; import resources.datatables.FactionStatus; import resources.datatables.Factions; +import resources.datatables.GalaxyStatus; import resources.datatables.GcwType; import resources.datatables.Options; import resources.datatables.Posture; @@ -77,6 +78,7 @@ import engine.resources.service.INetworkRemoteEvent; * @author Charon */ +@SuppressWarnings("unused") public class InvasionService implements INetworkDispatch { private NGECore core; @@ -114,7 +116,6 @@ public class InvasionService implements INetworkDispatch { private boolean ph2_message6sent = false; private boolean ph2_message7sent = false; - //private ScheduledFuture eventManagerTask = null; private ScheduledFuture defendingGeneralTask = null; private Map generalWarningLevelMap = new ConcurrentHashMap(); @@ -138,15 +139,26 @@ public class InvasionService implements INetworkDispatch { public InvasionService(final NGECore core) { this.core = core; + // Utility code // Executors.newSingleThreadScheduledExecutor().schedule(() -> { // arrangePylons(new Point3D(-1238.13F, 56, -3812.84F),100); // }, 20, TimeUnit.SECONDS); - // Local code to schedule a 20 minutes long phase2 invasion + + + // Local code to schedule a 20-30 minutes long phase2 invasion Executors.newSingleThreadScheduledExecutor().schedule(() -> { //testPylons(); // temp time reference, will be server time later + while (NGECore.getInstance().getGalaxyStatus()!=GalaxyStatus.Online){ + try { + Thread.sleep(1000); + } catch (Exception e) { + e.printStackTrace(); + } + } + temptimestartreference = System.currentTimeMillis(); scheduleInvasionManager(); invasionScheduled=true; @@ -190,10 +202,13 @@ public class InvasionService implements INetworkDispatch { if (invasionLocation>2) invasionLocation=0; // Rotate + // Random for now + invasionLocation = new Random().nextInt(2); + invasionPlanet = getInvasionPlanet(invasionLocation).getName(); - invasionLocation=InvasionLocation.Dearic; - invasionPlanet="talus"; +// invasionLocation=InvasionLocation.Dearic; +// invasionPlanet="talus"; // invasionLocation=InvasionLocation.Keren; // invasionPlanet="naboo"; @@ -217,9 +232,7 @@ public class InvasionService implements INetworkDispatch { if (invasionLocation==InvasionLocation.Dearic){ spawnPylonsDearic(); } - - - + spawnDefensiveAssets(); spawnOffensiveAssets(); @@ -258,7 +271,7 @@ public class InvasionService implements INetworkDispatch { } // Message at 15:00 -> 900000 seconds - if (invasionPhase==1 && System.currentTimeMillis()>temptimestartreference + 150000 && ! ph1_message2sent){ + if (invasionPhase==1 && System.currentTimeMillis()>temptimestartreference + 50000 && ! ph1_message2sent){ send_Phase1_InvaderMessage2(); send_Phase1_DefenderMessage2(); ph1_message2sent = true; @@ -266,7 +279,7 @@ public class InvasionService implements INetworkDispatch { } // Message at 30:00 -> 1800000 seconds - if (invasionPhase==1 && System.currentTimeMillis()>temptimestartreference + 200000 && ! ph2_message1sent){ + if (invasionPhase==1 && System.currentTimeMillis()>temptimestartreference + 60000 && ! ph2_message1sent){ invasionPhase=2; preparePhase2(); System.out.println("PHASE 2"); @@ -277,7 +290,7 @@ public class InvasionService implements INetworkDispatch { } // Message at 45:00 -> 2700000 seconds - if (invasionPhase==2 && System.currentTimeMillis()>temptimestartreference + 400000 && ! ph2_message2sent){ // 1200000 + if (invasionPhase==2 && System.currentTimeMillis()>temptimestartreference + 900000 && ! ph2_message2sent){ // 1200000 send_Phase2_InvaderMessage2(); send_Phase2_DefenderMessage2(); ph2_message2sent = true; @@ -543,9 +556,7 @@ public class InvasionService implements INetworkDispatch { disabledVehicles.put(disabledVehicleRegistryCounter++, registrant); } } - - - + public void wipeInvaders(Map invaderMap){ for (BuildingObject camp : offensiveCamps){ @@ -2404,5 +2415,17 @@ public class InvasionService implements INetworkDispatch { public static final int Bestine = 1; public static final int Dearic = 2; + } + + public int getInvasionLocation() { + return invasionLocation; + } + + public String getInvasionPlanetName() { + return getInvasionPlanet(invasionLocation).getName(); + } + + public void setInvasionLocation(int invasionLocation) { + this.invasionLocation = invasionLocation; } } diff --git a/src/services/gcw/InvasionService3.java b/src/services/gcw/InvasionService3.java deleted file mode 100644 index 520d4fa8..00000000 --- a/src/services/gcw/InvasionService3.java +++ /dev/null @@ -1,1390 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2013 - * - * This File is part of NGECore2. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - * - * Using NGEngine to work with NGECore2 is making a combined work based on NGEngine. - * Therefore all terms and conditions of the GNU Lesser General Public License cover the combination. - ******************************************************************************/ -package services.gcw; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Random; -import java.util.Set; -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; - -import org.apache.mina.core.session.IoSession; - -import protocol.swg.CommPlayerMessage; -import protocol.swg.PlayClientEffectLocMessage; -import protocol.swg.PlayClientEffectObjectMessage; -import protocol.swg.PlayClientEffectObjectTransformMessage; -import protocol.swg.UpdateContainmentMessage; -import resources.common.OutOfBand; -import resources.datatables.FactionStatus; -import resources.datatables.Factions; -import resources.datatables.GcwType; -import resources.datatables.Options; -import resources.datatables.WeaponType; -import resources.objects.building.BuildingObject; -import resources.objects.creature.CreatureObject; -import resources.objects.installation.InstallationMessageBuilder; -import resources.objects.installation.InstallationObject; -import resources.objects.mission.MissionObject; -import resources.objects.tangible.TangibleObject; -import resources.objects.weapon.WeaponObject; -import services.ai.AIActor; -import services.ai.TurretAIActor; -import services.gcw.GCWSpawner.PatrolRoute; -import services.gcw.GCWPylon.PylonType; -import services.gcw.GCWSpawner.SpawnerType; -import services.sui.SUIWindow; -import services.sui.SUIService.ListBoxType; -import services.sui.SUIWindow.SUICallback; -import services.sui.SUIWindow.Trigger; -import main.NGECore; -import engine.clients.Client; -import engine.resources.common.CRC; -import engine.resources.container.Traverser; -import engine.resources.objects.SWGObject; -import engine.resources.scene.Planet; -import engine.resources.scene.Point3D; -import engine.resources.scene.Quaternion; -import engine.resources.service.INetworkDispatch; -import engine.resources.service.INetworkRemoteEvent; - -/** - * @author Charon - */ - -public class InvasionService3 implements INetworkDispatch { - - private NGECore core; - private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); - protected final Object objectMutex = new Object(); - - private long kerenInvasionStartTime = 1; - private long bestineInvasionStartTime = 2; - private long dearicInvasionStartTime = 3; - - private CreatureObject invasionGeneral = null; - private CreatureObject defendingGeneral = null; - private CreatureObject defendingQuestOfficer = null; - - private int invasionLocation=InvasionLocation.Dearic; - private Point3D invasionLocationCenter; - private int invadingFaction=Factions.Imperial; - private int defendingFaction=Factions.Rebel; - private int invasionPhase=2; // Test phase 2 - - private long temptimestartreference = 0L; - private boolean message1sent = false; - private boolean message2sent = false; - private boolean message3sent = false; - private boolean message4sent = false; - - private ScheduledFuture eventManagerTask = null; - - private Map invadingCreatures = new ConcurrentHashMap(); - private int invaderRegistryCounter = 0; - private Map defendingCreatures = new ConcurrentHashMap(); - private int defenderRegistryCounter = 0; - private Vector defensiveBanners = new Vector(); - - public InvasionService3(final NGECore core) { - this.core = core; - InvasionService srv2 = new InvasionService(core); -// Executors.newSingleThreadScheduledExecutor().schedule(() -> { -// testPylons(); -// // temp time reference, will be server time later -// temptimestartreference = System.currentTimeMillis(); -// scheduleInvasionEventManager(); -// }, 30, TimeUnit.SECONDS); // Start invasion phase 2 after 30 seconds from server start -// - - } - - public void scheduleInvasionEventManager(){ - - eventManagerTask = scheduler.scheduleAtFixedRate(new Runnable() { - - @Override - public void run() { - try { - invasionEventManager(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - }, 10, 2000, TimeUnit.MILLISECONDS); - } - - public void invasionEventManager(){ - - // Determine planet here - - setInvasionLocationCenter(); - - if (invasionPhase==2 && System.currentTimeMillis()>temptimestartreference + 140000 && ! message1sent){ - sendDefenderMessage1(); - message1sent = true; - System.out.println("Defender msg1 sent "); - } - if (invasionPhase==2 && System.currentTimeMillis()>temptimestartreference + 600000 && ! message2sent){ - sendDefenderMessage2(); - message2sent = true; - invasionPhase=3; - defendingGeneral.setOptionsBitmask(Options.ATTACKABLE); - makeDefensiveGeneralDefenderForNPCs(); - System.out.println("invaderRegistryCounter " + invaderRegistryCounter); - System.out.println("defenderRegistryCounter " + defenderRegistryCounter); - System.out.println("Defender msg2 sent "); // Local server gives only 30 mins time, so its 20 mins for this phase - } - if (invasionPhase==3 && System.currentTimeMillis()>temptimestartreference + 1000000 && ! message3sent){ - sendDefenderMessage3(); - message3sent = true; - sendInvaderLostMessage(); - sendDefenderWonMessage(); - System.out.println("Defender msg3 sent "); - } - - if (defendingGeneral!=null){ - if (invasionPhase==3 && (defendingGeneral.getPosture()==13 || defendingGeneral.getPosture()==14) && ! message4sent){ - sendInvaderWonMessage(); - sendDefenderLostMessage(); - message4sent = true; - invasionPhase=4; // Post-Invasion phase - System.out.println("Defender msg4 sent "); - - // Take care of GCW points - grantGCWPoints(invadingFaction,1000); - grantGCWPoints(defendingFaction,100); - // ToDo: tokens - - // Clean Up - wipeInvaders(); - wipeDefenders(); - } - } - } - - public void grantGCWPoints(int faction, int gcwPoints){ - String factionName = getFactionName(faction); - Vector allPlayers = core.simulationService.getAllNearSameFactionPlayers(500,invasionLocationCenter, getInvasionPlanet(invasionLocation), factionName); - for (CreatureObject player : allPlayers) { - if (player.getFaction().length() > 0 && player.getFactionStatus() > FactionStatus.OnLeave) { - core.gcwService.addGcwPoints(player, gcwPoints, GcwType.Enemy); - } - } - } - - public void registerInvader(CreatureObject registrant){ - invadingCreatures.put(invaderRegistryCounter++, registrant); - } - - public void registerDefender(CreatureObject registrant){ - defendingCreatures.put(invaderRegistryCounter++, registrant); - } - - public void wipeInvaders(){ - - for (Map.Entry entry : invadingCreatures.entrySet()) { - CreatureObject creature = entry.getValue(); - AIActor actor = (AIActor)creature.getAttachment("AI"); - core.simulationService.remove(creature, creature.getWorldPosition().x, creature.getWorldPosition().z, true); // Make sure - if (actor!=null) - actor.destroyActor(); - } - - Executors.newSingleThreadScheduledExecutor().schedule(() -> { - for (Map.Entry entry : invadingCreatures.entrySet()) { - CreatureObject creature = entry.getValue(); - System.out.println("Wiped creature " + creature.getObjectID()); - core.simulationService.remove(creature, creature.getWorldPosition().x, creature.getWorldPosition().z, true); // Make sure - core.objectService.destroyObject(creature.getObjectID()); - } - System.out.println("Destroyed all invaders."); - }, 15, TimeUnit.SECONDS); // Make sure remaining AI is finished with moves that might make them re-appear - } - - public void wipeDefenders(){ - - for (TangibleObject banner : defensiveBanners){ - core.objectService.destroyObject(banner.getObjectID()); - } - - core.objectService.destroyObject(defendingGeneral.getObjectID()); - core.objectService.destroyObject(defendingQuestOfficer.getObjectID()); - -// for (Map.Entry entry : defendingCreatures.entrySet()) { -// CreatureObject creature = entry.getValue(); -// AIActor actor = (AIActor)creature.getAttachment("AI"); -// core.simulationService.remove(creature, creature.getWorldPosition().x, creature.getWorldPosition().z, true); // Make sure -// actor.destroyActor(); -// } - - Executors.newSingleThreadScheduledExecutor().schedule(() -> { - for (Map.Entry entry : defendingCreatures.entrySet()) { - CreatureObject creature = entry.getValue(); - core.simulationService.remove(creature, creature.getWorldPosition().x, creature.getWorldPosition().z, true); // Make sure - core.objectService.destroyObject(creature.getObjectID()); - } - System.out.println("Destroyed all defenders."); - }, 15, TimeUnit.SECONDS); // Make sure remaining AI is finished with moves that might make them re-appear - - } - - - public void spawnOffensiveAssets(){ - spawnOffensiveCamps(); - } - - public void spawnDefensiveAssets(){ - spawnDefendingGeneral(); - spawnDefensiveQuestOfficer(); - spawnBarricades(); - spawnTurrets(); - spawnTower(); - spawnBanners(); - spawnSupplyTerminals(); - } - - public void spawnSupplyTerminals(){ - - } - - public void supplyTerminalSUI(CreatureObject user, int childMenu){ -// if (invasionPhase!=1) -// return; // prevent exploit - String terminalName = "@gcw:terminal_gcw_reb_def_n"; - if (defendingFaction==Factions.Imperial) - terminalName = "@gcw:terminal_gcw_imp_def_n"; - - Map suiOptions = new HashMap(); - suiOptions.put((long) 1, "@gcw:gcw_barricade_tool_n"); - suiOptions.put((long) 2, "@gcw:gcw_spawner_tool_n"); - suiOptions.put((long) 3, "@gcw:gcw_turret_tool_n"); - suiOptions.put((long) 4, "@gcw:gcw_tower_tool_n"); - final SUIWindow window = core.suiService.createListBox(ListBoxType.LIST_BOX_OK_CANCEL, terminalName, "For now the tools are directly available.", suiOptions, user, null, 10); - Vector returnList = new Vector(); - - returnList.add("List.lstList:SelectedRow"); - window.addHandler(0, "", Trigger.TRIGGER_OK, returnList, new SUICallback() - { - public void process(SWGObject owner, int eventType, Vector returnList) - { -// if (invasionPhase!=1) -// return; // prevent exploit - int index = Integer.parseInt(returnList.get(0)); - int childIndex = (int) window.getObjectIdByIndex(index); - - CreatureObject player = (CreatureObject) owner; - SWGObject inventory = player.getSlottedObject("inventory"); - Planet planet = player.getPlanet(); - - switch(childIndex) - { - case 1: - TangibleObject barricadeTool = (TangibleObject) core.objectService.createObject("object/tangible/gcw/crafting_quest/shared_gcw_barricade_tool.iff", planet); - barricadeTool.setStfFilename("gcw"); - barricadeTool.setStfName("gcw_barricade_tool_n"); - barricadeTool.setDetailFilename("gcw"); - barricadeTool.setDetailName("gcw_barricade_tool_d"); - barricadeTool.setUses(10); - inventory.add(barricadeTool); - break; - - case 2: - TangibleObject spawnerTool = (TangibleObject) core.objectService.createObject("object/tangible/gcw/crafting_quest/shared_gcw_spawner_tool.iff", planet); - spawnerTool.setStfFilename("gcw"); - spawnerTool.setStfName("gcw_spawner_tool_n"); - spawnerTool.setDetailFilename("gcw"); - spawnerTool.setDetailName("gcw_spawner_tool_d"); - spawnerTool.setUses(10); - inventory.add(spawnerTool); - break; - - case 3: - TangibleObject turretTool = (TangibleObject) core.objectService.createObject("object/tangible/gcw/crafting_quest/shared_gcw_turret_tool.iff", planet); - turretTool.setStfFilename("gcw"); - turretTool.setStfName("gcw_turret_tool_n"); - turretTool.setDetailFilename("gcw"); - turretTool.setDetailName("gcw_turret_tool_d"); - turretTool.setUses(10); - inventory.add(turretTool); - break; - - case 4: - TangibleObject towerTool = (TangibleObject) core.objectService.createObject("object/tangible/gcw/crafting_quest/shared_gcw_tower_tool.iff", planet); - towerTool.setStfFilename("gcw"); - towerTool.setStfName("gcw_tower_tool_n"); - towerTool.setDetailFilename("gcw"); - towerTool.setDetailName("gcw_tower_tool_d"); - towerTool.setUses(10); - inventory.add(towerTool); - break; - } - } - }); - - core.suiService.openSUIWindow(window); - - } - - public void supplyOffensiveTerminalSUI(CreatureObject user, int childMenu){ -// if (invasionPhase!=1) -// return; // prevent exploit - String terminalName = "@gcw:terminal_gcw_reb_offensiv_n"; - if (defendingFaction==Factions.Imperial) - terminalName = "@gcw:terminal_gcw_imp_offensiv_n"; - Map suiOptions = new HashMap(); - suiOptions.put((long) 1, "@gcw:gcw_patrol_tool_n"); - suiOptions.put((long) 2, "@gcw:gcw_vehicle_tool_n"); - final SUIWindow window = core.suiService.createListBox(ListBoxType.LIST_BOX_OK_CANCEL, terminalName, "For now the tools are directly available", suiOptions, user, null, 10); - Vector returnList = new Vector(); - - returnList.add("List.lstList:SelectedRow"); - window.addHandler(0, "", Trigger.TRIGGER_OK, returnList, new SUICallback() - { - public void process(SWGObject owner, int eventType, Vector returnList) - { -// if (invasionPhase!=1) -// return; // prevent exploit - int index = Integer.parseInt(returnList.get(0)); - int childIndex = (int) window.getObjectIdByIndex(index); - - CreatureObject player = (CreatureObject) owner; - SWGObject inventory = player.getSlottedObject("inventory"); - Planet planet = player.getPlanet(); - - switch(childIndex) - { - case 1: - TangibleObject barricadeTool = (TangibleObject) core.objectService.createObject("object/tangible/gcw/crafting_quest/shared_gcw_patrol_tool.iff", planet); - barricadeTool.setStfFilename("gcw"); - barricadeTool.setStfName("gcw_patrol_tool_n"); - barricadeTool.setDetailFilename("gcw"); - barricadeTool.setDetailName("gcw_patrol_tool_d"); - barricadeTool.setUses(10); - inventory.add(barricadeTool); - break; - - case 2: - TangibleObject spawnerTool = (TangibleObject) core.objectService.createObject("object/tangible/gcw/crafting_quest/shared_gcw_vehicle_tool.iff", planet); - spawnerTool.setStfFilename("gcw"); - spawnerTool.setStfName("gcw_vehicle_tool_n"); - spawnerTool.setDetailFilename("gcw"); - spawnerTool.setDetailName("gcw_vehicle_tool_d"); - spawnerTool.setUses(10); - inventory.add(spawnerTool); - break; - } - } - }); - - core.suiService.openSUIWindow(window); - } - - public void usePylon(CreatureObject user, GCWPylon pylon){ - // check pylon filling status - if (pylon.getAttachment("Filling")==null) - return; - - if (user.getWorldPosition().getDistance2D(pylon.getWorldPosition())>7){ - user.sendSystemMessage("@gcw:pylon_too_far",(byte) 0); - return; - } - - int pylonFilling = (int) pylon.getAttachment("Filling"); - if (pylonFilling>=100){ - user.sendSystemMessage("@gcw:pylon_construction_complete",(byte) 0); - return; - } - - if (!(CRC.StringtoCRC(user.getFaction())==pylon.getPylonFaction())){ - user.sendSystemMessage("@gcw:pylon_construction_cannot_use",(byte) 0); - return; - } - - // determine pylon type - int pylonType = pylon.getPylonType(); - String pylonName = (String)pylon.getAttachment("Name"); - String toolTemplate = ""; - switch (pylonType){ - case PylonType.Barricade: toolTemplate="object/tangible/gcw/crafting_quest/shared_gcw_barricade_tool.iff"; - break; - case PylonType.SoldierDefense: toolTemplate="object/tangible/gcw/crafting_quest/shared_gcw_spawner_tool.iff"; - break; - case PylonType.SoldierPatrol: toolTemplate="object/tangible/gcw/crafting_quest/shared_gcw_patrol_tool.iff"; - break; - case PylonType.VehiclePatrol: toolTemplate="object/tangible/gcw/crafting_quest/shared_gcw_vehicle_tool.iff"; - break; - case PylonType.SiegeVehiclePatrol: toolTemplate="object/tangible/gcw/crafting_quest/shared_gcw_vehicle_tool.iff"; - break; - case PylonType.Tower: toolTemplate="object/tangible/gcw/crafting_quest/shared_gcw_tower_tool.iff"; - break; - case PylonType.Turret: toolTemplate="object/tangible/gcw/crafting_quest/shared_gcw_turret_tool.iff"; - break; - } - - if (toolTemplate.length()==0) - return; // shouldn't happen - - // Find the according tool with the lowest uses in user's inventory - final String foundToolTemplate = toolTemplate; - Vector tools = new Vector(); - user.getSlottedObject("inventory").viewChildren(user, true, false, new Traverser() { - @Override - public void process(SWGObject item) { - if (item.getTemplate().equals(foundToolTemplate)) { - if (tools.size()==0) - tools.add((TangibleObject)item); - else { - TangibleObject itemTANO = (TangibleObject)item; - if (itemTANO.getUses()[] fut = {null}; - fut[0] = scheduler.scheduleAtFixedRate(new Runnable() { - - @Override - public void run() { - try { - // Animate count-down timer-bar - user.sendSystemMessage(""+countdown[0], (byte)0); - countdown[0]--; - // check if user has moved - if (userpos.getDistance2D(user.getWorldPosition())>0.2){ - // cancel count-down - fut[0].cancel(true); - cancelled[0] = true; - core.suiService.closeSUIWindow(window.getOwner(),window.getWindowId()); - user.sendSystemMessage("@gcw:pylon_construction_moved",(byte) 0); - } - if (user.isInCombat()){ - fut[0].cancel(true); - cancelled[0] = true; - core.suiService.closeSUIWindow(window.getOwner(),window.getWindowId()); - user.sendSystemMessage("@gcw:pylon_construction_entered_combat",(byte) 0); - } - if (user.getPosture()==13 & user.getPosture()==14){ - fut[0].cancel(true); - cancelled[0] = true; - core.suiService.closeSUIWindow(window.getOwner(),window.getWindowId()); - user.sendSystemMessage("@gcw:pylon_construction_incapacitated",(byte) 0); - } - - } catch (Exception e) { - e.printStackTrace(); - } - } - - }, 0, 1, TimeUnit.SECONDS); - - scheduler.schedule(new Runnable() { - @Override - public void run() { - try { - fut[0].cancel(true); - if (! cancelled[0]){ - TangibleObject tool = tools.get(0); - updatePylonFilling(pylon, tool); - core.suiService.closeSUIWindow(window.getOwner(),window.getWindowId()); - // increase fatigue - core.buffService.addBuffToCreature(user, "gcw_fatigue", user); - System.out.println(" user.getGCWFatigue() "+user.getGCWFatigue()); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - }, constructiontimeagain, TimeUnit.SECONDS); - - } - - public void updatePylonFilling(GCWPylon pylon, TangibleObject tool){ - - int pylonFilling = (int)pylon.getAttachment("Filling"); - String pylonName = (String)pylon.getAttachment("Name"); - // determine power of tool - int power = 20; // assume 20 for now - - pylonFilling += power; - if (pylonFilling>100) - pylonFilling=100; - - String newPylonName = pylonName + " " + pylonFilling +"/100"; - pylon.setCustomName(newPylonName); - pylon.setAttachment("Filling",pylonFilling); - pylon.setResourceFilling(pylonFilling); - - - tool.setUses(tool.getUses()-1); - if (tool.getUses()==0){ - core.objectService.destroyObject(tool.getObjectID()); - } - } - - public void useBarricade(CreatureObject user, TangibleObject structure){ - - if (user.isTrader()){ - TangibleObject tool = retrieveToolFromInventory(user, "object/tangible/gcw/crafting_quest/shared_gcw_barricade_tool.iff"); - if (tool==null) - return; - repairStructure(tool, structure); - } else { - // ToDo: IMPLEMENT BARRICADE QUEST CALL HERE - user.sendSystemMessage("Barricade Quest not yet implemented!", (byte)0); - } - } - - public void useTurret(CreatureObject user, TangibleObject structure){ - - if (user.isTrader()){ - TangibleObject tool = retrieveToolFromInventory(user, "object/tangible/gcw/crafting_quest/shared_gcw_turret_tool.iff"); - if (tool==null) - return; - repairStructure(tool, structure); - } else { - // ToDo: IMPLEMENT TURRET QUEST CALL HERE - user.sendSystemMessage("Turret Quest not yet implemented!", (byte)0); - } - } - - public void useTower(CreatureObject user, TangibleObject structure){ - - if (user.isTrader()){ - TangibleObject tool = retrieveToolFromInventory(user, "object/tangible/gcw/crafting_quest/shared_gcw_tower_tool.iff"); - if (tool==null) - return; - repairStructure(tool, structure); - } else { - // ToDo: IMPLEMENT TOWER QUEST CALL HERE - user.sendSystemMessage("Tower Quest not yet implemented!", (byte)0); - } - } - - public void repairStructure(TangibleObject tool, TangibleObject structure){ - System.out.println("REPAIR STRUCT"); - int structureCondition = structure.getConditionDamage(); - if (structureCondition>=structure.getMaximumCondition()){ - return; - } - - int repairAmount = 5000; - int newCondition = structureCondition-repairAmount; - if (newCondition<0) - newCondition=0; - - structure.setConditionDamage(newCondition); - - tool.setUses(tool.getUses()-1); - if (tool.getUses()==0){ - core.objectService.destroyObject(tool.getObjectID()); - } - } - - public TangibleObject retrieveToolFromInventory(CreatureObject user, String toolTemplate){ - - if (toolTemplate.length()==0) - return null; - - // Find the according tool with the lowest uses in user's inventory - final String foundToolTemplate = toolTemplate; - Vector tools = new Vector(); - user.getSlottedObject("inventory").viewChildren(user, true, false, new Traverser() { - @Override - public void process(SWGObject item) { - if (item.getTemplate().equals(foundToolTemplate)) { - if (tools.size()==0) - tools.add((TangibleObject)item); - else { - TangibleObject itemTANO = (TangibleObject)item; - if (itemTANO.getUses() newObservers = new HashSet(turret.getObservers()); - for(Client c : newObservers) { - UpdateContainmentMessage ucm = new UpdateContainmentMessage(turretWeapon.getObjectID(), turret.getObjectID(), 4); - c.getSession().write(ucm.serialize()); - } - } - - public void createBarricade(String barricadeTemplate, float x, float y, float z, float qy, float qw, int maxCondition){ - Quaternion quaternion = new Quaternion(qy,0F,qw,0F); - TangibleObject barricade = (TangibleObject) core.objectService.createObject(barricadeTemplate, 0, getInvasionPlanet(invasionLocation), new Point3D(x, y, z), quaternion); - core.simulationService.add(barricade, barricade.getPosition().x, barricade.getPosition().z, true); - String customName = "Rebel Barricade"; - String factionString = "rebel"; - if (defendingFaction==Factions.Imperial){ - customName = "Imperial Barricade"; - factionString = "imperial"; - } - barricade.setCustomName(customName); - barricade.setOptionsBitmask(Options.ATTACKABLE | Options.QUEST); - barricade.setFaction(factionString); - barricade.setFactionStatus(FactionStatus.Combatant); - barricade.setMaximumCondition(maxCondition); - - final Future[] fut = {null}; - fut[0] = scheduler.scheduleAtFixedRate(new Runnable() { - @Override public void run() { - try { - if (NGECore.getInstance().objectService.getObject(barricade.getObjectID())==null){ - Thread.yield(); - fut[0].cancel(false); - } - - 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); - } else { - /*System.out.println("HASBUFF " + nearAllies.size());*/ -// if (ally.getClient()!=null) -// System.out.println("ALLY: " + ally.getCustomName()); - } - } // towFacGuardDefenseItem - Thread.currentThread().interrupt(); - } catch (Exception e) { - System.err.println("Exception in Barricade thread " + e.getMessage()); - } - } - }, 5, 2, TimeUnit.SECONDS); - } - // gcw_general_resistance_stack_rebel - // for Towers: tower_defender - - public void spawnTower(){ - createTower(548.8F, 6, -2872.06F, 0.72F, 0.69F, 100000); - } - - public void createTower(float x, float y, float z, float qy, float qw, int maxCondition){ - Quaternion quaternion = new Quaternion(qy,0F,qw,0F); - String towerTemplate = "object/tangible/destructible/shared_gcw_rebel_tower.iff"; - String factionString = "rebel"; - String towerString = "Rebel Tower"; - if (defendingFaction==Factions.Imperial){ - towerTemplate = "object/tangible/destructible/shared_gcw_imperial_tower.iff"; - factionString = "imperial"; - towerString = "Imperial Tower"; - } - TangibleObject tower = (TangibleObject) core.objectService.createObject(towerTemplate, 0, getInvasionPlanet(invasionLocation), new Point3D(x, y, z), quaternion); - core.simulationService.add(tower, tower.getPosition().x, tower.getPosition().z, true); - tower.setCustomName(towerString); - tower.setOptionsBitmask(Options.ATTACKABLE | Options.QUEST); - tower.setFaction(factionString); - tower.setFactionStatus(FactionStatus.Combatant); - tower.setMaximumCondition(maxCondition); - - final Future[] fut = {null}; - fut[0] = scheduler.scheduleAtFixedRate(new Runnable() { - @Override public void run() { - try { - if (NGECore.getInstance().objectService.getObject(tower.getObjectID())==null){ - Thread.yield(); - fut[0].cancel(false); - } - - Vector nearAllies = NGECore.getInstance().simulationService.getAllNearSameFactionNPCs(500, tower); - for (CreatureObject ally : nearAllies){ - if (!ally.isPlayer()){ - if (! ally.hasBuff("tower_defender")){ - core.buffService.addBuffToCreature(ally, "tower_defender", ally); - } - } - } - Thread.currentThread().interrupt(); - } catch (Exception e) { - System.err.println("Exception in Tower thread " + e.getMessage()); - } - } - }, 5, 2, TimeUnit.SECONDS); - } - - - public void spawnBanners(){ - - // Starport - createBanner(329.34F, 6, -2936.67F, 0.71F, 0.7F); - createBanner(329.34F, 6, -2925.15F, 0.71F, 0.7F); - - createBanner(414.98F, 6, -3027.86F, 0.71F, -0.7F); - createBanner(414.98F, 6, -2988.05F, 0.71F, -0.7F); - createBanner(448.98F, 6, -3028.05F, 0.68F, -0.73F); - createBanner(448.98F, 6, -2987.95F, 0.70F, 0.71F); - - createBanner(369.96F, 6, -2944.02F, 1.00F, 0.0F); - - createBanner(537.96F, 6, -3038.97F, 0.00F, 1.0F); - - createBanner(569.96F, 6, -2940.37F, 0.71F, -0.69F); - - createBanner(476.09F, 6, -2955.1F, 0.71F, 0.69F); - - createBanner(471.56F, 6, -3004.66F, 1.0F, 0.00F); - createBanner(488.40F, 6, -3004.66F, 1.0F, 0.00F); - - createBanner(524.88F, 6.51F, -3004.96F, 0.927F, 0.374F); - createBanner(525.03F, 6.51F, -2974.90F, 0.91F, -0.41F); - createBanner(555.13F, 6.51F, -2975.05F, 0.93F, 0.37F); - createBanner(555.15F, 6.51F, -3004.96F, 0.39F, 0.922F); - - } - - public void createBanner(float x, float y, float z, float qy, float qw){ - Quaternion quaternion = new Quaternion(qy,0F,qw,0F); //object/installation/battlefield/destructible shared_banner_rebel_style_01.iff - String bannerTemplate = "object/tangible/gcw/shared_flip_banner_onpole_rebel.iff"; //object/tangible/event_perk/shared_banner_rebel_style_01.iff - String factionString = "rebel_banner"; - if (defendingFaction==Factions.Imperial){ - bannerTemplate = "object/tangible/gcw/shared_flip_banner_onpole_imperial.iff"; - factionString = "imperial_banner"; - } - TangibleObject banner = (TangibleObject) core.objectService.createObject(bannerTemplate, 0, getInvasionPlanet(invasionLocation), new Point3D(x, y, z), quaternion); - core.simulationService.add(banner, banner.getPosition().x, banner.getPosition().z, true); - banner.setStfFilename("obj_n"); - banner.setStfName(factionString); - banner.setDetailFilename("obj_d"); - banner.setDetailName(factionString); - defensiveBanners.add(banner); - } - - public int getInvasionPhase() { - return invasionPhase; - } - - public void setInvasionPhase(int invasionPhase) { - this.invasionPhase = invasionPhase; - } - - public void sendInvaderMessage1(){ - String message = ""; - if (invadingFaction==Factions.Imperial) - message = "@gcw:gcw_announcement_attack_city_imperial_talus_dearic"; - if (invadingFaction==Factions.Rebel) - message = "@gcw:gcw_announcement_attack_city_rebel_talus_dearic"; - - ConcurrentHashMap clients = NGECore.getInstance().getActiveConnectionsMap(); - for (Map.Entry entry : clients.entrySet()) { - Client client = entry.getValue(); - if (client.getParent().getPlanet().equals(getInvasionPlanet(invasionLocation))){ - CommPlayerMessage comm = new CommPlayerMessage(client.getParent().getObjectId(), OutOfBand.ProsePackage(message)); - comm.setTime(2000); - comm.setModel("object/mobile/shared_dressed_assassin_mission_giver_0" + Integer.toString(new Random().nextInt(2) + 1) + ".iff"); - client.getSession().write(comm.serialize()); - } - } - } - - public void sendDefenderMessage1(){ - String message = ""; - if (defendingFaction==Factions.Imperial) - message = "@gcw:gcw_announcement_man_defenses_imperial_talus_dearic"; - if (defendingFaction==Factions.Rebel) - message = "@gcw:gcw_announcement_man_defenses_rebel_talus_dearic"; - ConcurrentHashMap clients = NGECore.getInstance().getActiveConnectionsMap(); - for (Map.Entry entry : clients.entrySet()) { - Client client = entry.getValue(); - if (client.getParent()!=null){ - if (client.getParent().getPlanet().equals(getInvasionPlanet(invasionLocation))){ - CommPlayerMessage comm = new CommPlayerMessage(client.getParent().getObjectId(), OutOfBand.ProsePackage(message)); - comm.setTime(2000); - comm.setModel(defendingGeneral.getTemplate()); - client.getSession().write(comm.serialize()); - } - } - } - } - - - public void sendInvaderMessage2(){ - String message = ""; - if (invadingFaction==Factions.Imperial) - message = "@gcw:gcw_announcement_attack_half_done_imperial_talus_dearic"; - if (invadingFaction==Factions.Rebel) - message = "@gcw:gcw_announcement_attack_city_rebel_talus_dearic"; - - ConcurrentHashMap clients = NGECore.getInstance().getActiveConnectionsMap(); - for (Map.Entry entry : clients.entrySet()) { - Client client = entry.getValue(); - if (client.getParent()!=null){ - if (client.getParent().getPlanet().equals(getInvasionPlanet(invasionLocation))){ - CommPlayerMessage comm = new CommPlayerMessage(client.getParent().getObjectId(), OutOfBand.ProsePackage(message)); - comm.setTime(2000); - comm.setModel("object/mobile/shared_dressed_assassin_mission_giver_0" + Integer.toString(new Random().nextInt(2) + 1) + ".iff"); - client.getSession().write(comm.serialize()); - } - } - } - } - - public void sendDefenderMessage2(){ - String message = ""; - if (defendingFaction==Factions.Imperial) - message = "@gcw:gcw_announcement_defense_half_done_imperial_talus_dearic"; - if (defendingFaction==Factions.Rebel) - message = "@gcw:gcw_announcement_defense_half_done_rebel_talus_dearic"; - ConcurrentHashMap clients = NGECore.getInstance().getActiveConnectionsMap(); - for (Map.Entry entry : clients.entrySet()) { - Client client = entry.getValue(); - if (client.getParent()!=null){ - if (client.getParent().getPlanet().equals(getInvasionPlanet(invasionLocation))){ - CommPlayerMessage comm = new CommPlayerMessage(client.getParent().getObjectId(), OutOfBand.ProsePackage(message)); - comm.setTime(2000); - comm.setModel(defendingGeneral.getTemplate()); - client.getSession().write(comm.serialize()); - } - } - } - } - - public void sendInvaderMessage3(){ - String message = ""; - if (invadingFaction==Factions.Imperial) - message = "@gcw:gcw_announcement_attack_half_done_imperial_talus_dearic"; - if (invadingFaction==Factions.Rebel) - message = "@gcw:gcw_announcement_attack_city_rebel_talus_dearic"; - - ConcurrentHashMap clients = NGECore.getInstance().getActiveConnectionsMap(); - for (Map.Entry entry : clients.entrySet()) { - Client client = entry.getValue(); - if (client.getParent()!=null){ - if (client.getParent().getPlanet().equals(getInvasionPlanet(invasionLocation))){ - CommPlayerMessage comm = new CommPlayerMessage(client.getParent().getObjectId(), OutOfBand.ProsePackage(message)); - comm.setTime(2000); - comm.setModel("object/mobile/shared_dressed_assassin_mission_giver_0" + Integer.toString(new Random().nextInt(2) + 1) + ".iff"); - client.getSession().write(comm.serialize()); - } - } - } - } - - public void sendDefenderMessage3(){ - String message = ""; - if (defendingFaction==Factions.Imperial) - message = "@gcw:gcw_announcement_defense_half_done_imperial_talus_dearic"; - if (defendingFaction==Factions.Rebel) - message = "@gcw:gcw_announcement_defense_half_done_rebel_talus_dearic"; - ConcurrentHashMap clients = NGECore.getInstance().getActiveConnectionsMap(); - for (Map.Entry entry : clients.entrySet()) { - Client client = entry.getValue(); - if (client.getParent()!=null){ - if (client.getParent().getPlanet().equals(getInvasionPlanet(invasionLocation))){ - CommPlayerMessage comm = new CommPlayerMessage(client.getParent().getObjectId(), OutOfBand.ProsePackage(message)); - comm.setTime(2000); - comm.setModel(defendingGeneral.getTemplate()); - client.getSession().write(comm.serialize()); - } - } - } - } - - - public void sendInvaderWonMessage(){ - String message = ""; - if (invadingFaction==Factions.Imperial) - message = "@gcw:gcw_announcement_city_won_imperial_talus_dearic"; - if (invadingFaction==Factions.Rebel) - message = "@gcw:gcw_announcement_city_won_rebel_talus_dearic"; - - ConcurrentHashMap clients = NGECore.getInstance().getActiveConnectionsMap(); - for (Map.Entry entry : clients.entrySet()) { - Client client = entry.getValue(); - if (client.getParent()!=null){ - if (client.getParent().getPlanet().equals(getInvasionPlanet(invasionLocation))){ - CommPlayerMessage comm = new CommPlayerMessage(client.getParent().getObjectId(), OutOfBand.ProsePackage(message)); - comm.setTime(2000); - comm.setModel("object/mobile/shared_dressed_assassin_mission_giver_0" + Integer.toString(new Random().nextInt(2) + 1) + ".iff"); - client.getSession().write(comm.serialize()); - } - } - } - } - - public void sendDefenderWonMessage(){ - String message = ""; - if (defendingFaction==Factions.Imperial) - message = "@gcw:gcw_announcement_won_attack_imeprial_talus_dearic"; - if (defendingFaction==Factions.Rebel) - message = "@gcw:gcw_announcement_won_attack_rebel_talus_dearic"; - ConcurrentHashMap clients = NGECore.getInstance().getActiveConnectionsMap(); - for (Map.Entry entry : clients.entrySet()) { - Client client = entry.getValue(); - if (client.getParent()!=null){ - if (client.getParent().getPlanet().equals(getInvasionPlanet(invasionLocation))){ - CommPlayerMessage comm = new CommPlayerMessage(client.getParent().getObjectId(), OutOfBand.ProsePackage(message)); - comm.setTime(2000); - comm.setModel(defendingGeneral.getTemplate()); - client.getSession().write(comm.serialize()); - } - } - } - } - - public void sendInvaderLostMessage(){ - String message = ""; - if (defendingFaction==Factions.Imperial) - message = "@gcw:gcw_announcement_city_lost_imperial_tatooine_bestine"; - if (defendingFaction==Factions.Rebel) - message = "@gcw:gcw_announcement_city_lost_rebel_talus_dearic"; - - ConcurrentHashMap clients = NGECore.getInstance().getActiveConnectionsMap(); - for (Map.Entry entry : clients.entrySet()) { - Client client = entry.getValue(); - if (client.getParent()!=null){ - if (client.getParent().getPlanet().equals(getInvasionPlanet(invasionLocation))){ - CommPlayerMessage comm = new CommPlayerMessage(client.getParent().getObjectId(), OutOfBand.ProsePackage(message)); - comm.setTime(2000); - comm.setModel("object/mobile/shared_dressed_assassin_mission_giver_0" + Integer.toString(new Random().nextInt(2) + 1) + ".iff"); - client.getSession().write(comm.serialize()); - } - } - } - } - - public void sendDefenderLostMessage(){ - String message = ""; - if (defendingFaction==Factions.Imperial) - message = "@gcw:gcw_announcement_city_lost_imperial_talus_dearic"; - if (defendingFaction==Factions.Rebel) - message = "@gcw:gcw_announcement_city_lost_rebel_talus_dearic"; - ConcurrentHashMap clients = NGECore.getInstance().getActiveConnectionsMap(); - for (Map.Entry entry : clients.entrySet()) { - Client client = entry.getValue(); - if (client.getParent()!=null){ - if (client.getParent().getPlanet().equals(getInvasionPlanet(invasionLocation))){ - CommPlayerMessage comm = new CommPlayerMessage(client.getParent().getObjectId(), OutOfBand.ProsePackage(message)); - comm.setTime(2000); - comm.setModel(defendingGeneral.getTemplate()); - client.getSession().write(comm.serialize()); - } - } - } - } - - - public Planet getInvasionPlanet(int location){ - Planet planet = null; - switch (location){ - case InvasionLocation.Dearic : planet = core.terrainService.getPlanetByName("talus"); - break; - case InvasionLocation.Keren : planet = core.terrainService.getPlanetByName("naboo"); - break; - case InvasionLocation.Bestine : planet = core.terrainService.getPlanetByName("tatooine"); - break; - } - return planet; - } - - 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); - } - } - - public float getDistanceToDefensiveGeneral(CreatureObject checker){ - //float dist = checker.getWorldPosition().getDistance2D(defendingGeneral.getWorldPosition()); - //return dist; - return NGECore.getInstance().aiService.distanceSquared(defendingGeneral.getWorldPosition(), checker.getWorldPosition()); - } - - public CreatureObject getDefensiveGeneral(){ - return defendingGeneral; - } - - public void setInvasionLocationCenter(){ - switch (invasionLocation){ - case InvasionLocation.Dearic : invasionLocationCenter = new Point3D(452,6,-3002); - break; - case InvasionLocation.Keren : invasionLocationCenter = new Point3D(); - break; - case InvasionLocation.Bestine : invasionLocationCenter = new Point3D(); - break; - } - } - - public String getFactionName(int faction){ - if (faction==Factions.Rebel) - return "rebel"; - if (faction==Factions.Imperial) - return "imperial"; - return "neutral"; - } - - public int getFactionID(String factionName){ - if (factionName=="rebel") - return Factions.Rebel; - if (factionName=="imperial") - return Factions.Imperial; - return Factions.Neutral; - } - - @Override - public void shutdown() { - - } - @Override - public void insertOpcodes(Map arg0, - Map arg1) { - // TODO Auto-generated method stub - - } - - public class InvasionLocation { - - public static final int Keren = 0; - public static final int Bestine = 1; - public static final int Dearic = 2; - - } - -} diff --git a/src/services/gcw/VehiclePatrolPylon.java b/src/services/gcw/VehiclePatrolPylon.java index 35da108d..68bd68a1 100644 --- a/src/services/gcw/VehiclePatrolPylon.java +++ b/src/services/gcw/VehiclePatrolPylon.java @@ -26,6 +26,7 @@ import java.util.Vector; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; + import engine.resources.scene.Planet; import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; @@ -38,6 +39,7 @@ import resources.objects.tangible.TangibleObject; * @author Charon */ +@SuppressWarnings("unused") public class VehiclePatrolPylon extends TangibleObject{ private static final long serialVersionUID = 1L; diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index 6960b964..b15df3b3 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -133,6 +133,7 @@ import services.chat.ChatRoom; import services.equipment.EquipmentService; import services.gcw.GCWPylon; import services.gcw.GCWSpawner; +import services.spawn.MobileTemplate; import services.sui.SUIWindow; import services.sui.SUIWindow.SUICallback; import services.sui.SUIWindow.Trigger; @@ -572,19 +573,24 @@ public class ObjectService implements INetworkDispatch { if (object.getAttachment("AI") != null && object.getAttachment("AI") instanceof AIActor && ((AIActor) object.getAttachment("AI")).getMobileTemplate().getRespawnTime() > 0) { final long objectId = object.getObjectID(); - final String Template = object.getTemplate(); + final MobileTemplate Template = ((AIActor) object.getAttachment("AI")).getMobileTemplate(); final Planet planet = object.getPlanet(); final Point3D position = object.getPosition(); + final Point3D spawnPosition = ((AIActor) object.getAttachment("AI")).getSpawnPosition(); final Quaternion orientation = object.getOrientation(); - final long cellId = ((object.getContainer() == null) ? 0L : object.getContainer().getObjectID()); + // final long cellId = ((object.getContainer() == null) ? 0L : object.getContainer().getObjectID()); + CellObject cellO = spawnPosition.getCell(); + final long cellId = ((cellO == null) ? 0L : cellO.getObjectID()); final short level = ((object instanceof CreatureObject) ? ((CreatureObject) object).getLevel() : (short) 0); - scheduler.schedule(new Runnable() { @Override public void run() { try { - NGECore.getInstance().spawnService.spawnCreature(Template, objectId, planet.getName(), cellId, position.x, position.y, position.z, orientation.w, orientation.x, orientation.y, orientation.z, level); + CreatureObject newObject = NGECore.getInstance().spawnService.spawnCreature(Template, 0, planet.getName(), cellId, spawnPosition.x, spawnPosition.y, spawnPosition.z, orientation.w, orientation.x, orientation.y, orientation.z, level); + AIActor newAIActor = (AIActor)newObject.getAttachment("AI"); + newAIActor.cloneActor(((AIActor) object.getAttachment("AI"))); + //object.setAttachment("AI", null); } catch (Exception e) { e.printStackTrace(); } @@ -592,7 +598,7 @@ public class ObjectService implements INetworkDispatch { }, ((AIActor) object.getAttachment("AI")).getMobileTemplate().getRespawnTime(), TimeUnit.SECONDS); } - + String filePath = "scripts/" + object.getTemplate().split("shared_" , 2)[0].replace("shared_", "") + object.getTemplate().split("shared_" , 2)[1].replace(".iff", "") + ".py"; if (FileUtilities.doesFileExist(filePath)) { diff --git a/src/services/spawn/SpawnService.java b/src/services/spawn/SpawnService.java index e04c60b4..c41493b9 100644 --- a/src/services/spawn/SpawnService.java +++ b/src/services/spawn/SpawnService.java @@ -32,13 +32,14 @@ import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Random; import java.util.Vector; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; +import java.util.stream.Collectors; -import protocol.swg.UpdateContainmentMessage; import resources.common.collidables.CollidableBox; import resources.common.collidables.CollidableCircle; import resources.datatables.Options; @@ -76,8 +77,14 @@ public class SpawnService { public CreatureObject spawnCreature(String template, long objectId, String planetName, long cellId, float x, float y, float z, float qW, float qX, float qY, float qZ, short level) { - Planet planet = core.terrainService.getPlanetByName(planetName); MobileTemplate mobileTemplate = mobileTemplates.get(template); + return spawnCreature(mobileTemplate, objectId, planetName, cellId, x, y, z, qW, qX, qY, qZ, level); + } + + public CreatureObject spawnCreature(MobileTemplate mobileTemplate, long objectId, String planetName, long cellId, float x, float y, float z, float qW, float qX, float qY, float qZ, short level) { + + Planet planet = core.terrainService.getPlanetByName(planetName); + if(planet == null || mobileTemplate == null) return null; @@ -167,7 +174,6 @@ public class SpawnService { defaultWeapon.setStfFilename("theme_park_name"); defaultWeapon.setStfName("at_st"); } - } if (weaponTemplates.get(rnd).getMinDamage() != 0 && weaponTemplates.get(rnd).getMaxDamage() != 0) { @@ -178,14 +184,8 @@ public class SpawnService { defaultWeapon.setMinDamage(creature.getLevel() * 22); } - if (!defaultWeapon.getTemplate().contains("atst_ranged")) - creature.addObjectToEquipList(defaultWeapon); - if (!defaultWeapon.getTemplate().contains("atst_ranged")) - creature.add(defaultWeapon); - else { - UpdateContainmentMessage updateContainmentMessage= new UpdateContainmentMessage(defaultWeapon.getObjectID(), creature.getObjectID(), 4); - creature.notifyClients(updateContainmentMessage.serialize(),true); - } + creature.addObjectToEquipList(defaultWeapon); + creature.add(defaultWeapon); creature.setWeaponId(defaultWeapon.getObjectID()); creature.addObjectToEquipList(inventory); creature.add(inventory); @@ -221,8 +221,7 @@ public class SpawnService { armor = 6000; core.skillModService.addSkillMod(creature, "expertise_innate_protection_all", armor); } -<<<<<<< HEAD - + if (mobileTemplate.isAIEnabled()){ if (!mobileTemplate.isNoAI()){ // NoAI is for QuestGivers that don't fight to save resources AIActor actor = new AIActor(creature, creature.getPosition(), scheduler); @@ -236,18 +235,13 @@ public class SpawnService { } creature.setAttachment("radial_filename", "npc/mobile"); -======= - AIActor actor = new AIActor(creature, creature.getPosition(), scheduler); - creature.setAttachment("AI", actor); if (mobileTemplate.getConversationFileName().length()>0){ creature.setAttachment("radial_filename", "object/conversation"); creature.setAttachment("conversationFile", mobileTemplate.getConversationFileName()); } else creature.setAttachment("radial_filename", "npc/mobile"); - actor.setMobileTemplate(mobileTemplate); ->>>>>>> origin/master - + if(cell == null) { core.simulationService.add(creature, x, z, true); @@ -758,4 +752,13 @@ public class SpawnService { return mobileTemplates.get(template); } + public String getMobileTemplateName(MobileTemplate mobileTemplate) { + for (Entry entry : mobileTemplates.entrySet()) { + if (mobileTemplate.equals(entry.getValue())) { + return entry.getKey(); + } + } + return null; + } + }