From 5981efda9f64d4233a35e35d739f679e7dc5fb65 Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Sat, 2 Aug 2014 00:06:22 +0200 Subject: [PATCH] Added more content, tweaked AI resources and buffs - Added invasion-specific buffs - Added factional handling - Added AI switches - Added construction/repairing - Fixed enemy TANO color when changing status - Fixed notification baselines to consider GCW-specific circumstances - Optimized AI algorithmic complexity by eliminating expensive arithmetic operations - Fixed reposition state to avoid locations in water - Considered tower defense buff for NPCs in combat service - Compacted 3 AI threads into one - Dynamic allocation of AI resources depending on patrol point index and same faction AI density - Added Withdrawal state for more realistic post-battle behaviour - Positioned all pylons, camps, officers, terminals, barricades, turrets, towers, cloners in the appropriate coordinates --- options.cfg | 3 +- scripts/buffs/gcw_fatigue.py | 17 + scripts/buffs/tower_defender.py | 14 + scripts/commands/pvp.py | 5 +- scripts/commands/setgodmode.py | 51 +- .../imperial/imp_defensive_quest_officer.py | 1 + .../faction/imperial/imp_invasion_at_st.py | 5 +- .../faction/imperial/imp_invasion_captain.py | 44 + .../faction/imperial/imp_invasion_general.py | 2 + .../imp_offensive_invasion_general.py | 45 + .../rebel/rebel_defensive_quest_officer.py | 2 +- .../faction/rebel/rebel_invasion_at_xt.py | 5 +- .../faction/rebel/rebel_invasion_captain.py | 46 + .../faction/rebel/rebel_invasion_general.py | 2 + .../rebel/rebel_invasion_hailfire_droid.py | 6 +- .../rebel/rebel_offensive_invasion_general.py | 48 + .../turret/gcw/adv_turret_block_med_heat.py | 7 +- .../turret/gcw/adv_turret_dish_large_heat.py | 7 +- .../turret/gcw/adv_turret_dish_sm_heat.py | 7 +- .../gcw_city_construction_beacon.py | 7 +- .../destructible/gcw_imperial_barricade.py | 7 +- .../destructible/gcw_imperial_tower.py | 7 +- .../destructible/gcw_rebel_barricade.py | 7 +- .../tangible/destructible/gcw_rebel_tower.py | 7 +- .../tangible/terminal/terminal_gcw_imp_def.py | 7 +- .../terminal/terminal_gcw_imp_offensiv.py | 7 +- .../tangible/terminal/terminal_gcw_reb_def.py | 7 +- .../terminal/terminal_gcw_reb_offensiv.py | 7 +- src/main/NGECore.java | 3 +- .../DataTransform.java | 35 +- .../objects/creature/CreatureObject.java | 32 + .../installation/InstallationObject.java | 104 +- .../objects/tangible/TangibleObject.java | 31 +- src/services/BuffService.java | 19 +- src/services/DevService.java | 32 +- src/services/PlayerService.java | 35 +- src/services/SimulationService.java | 47 +- src/services/StaticService.java | 3 +- src/services/TerrainService.java | 8 +- src/services/ai/AIActor.java | 243 +- src/services/ai/AIService.java | 8 + src/services/ai/states/AIState.java | 356 ++- src/services/ai/states/AttackState.java | 47 +- src/services/ai/states/DeathState.java | 2 +- src/services/ai/states/PatrolState.java | 2 +- src/services/ai/states/RepositionState.java | 110 +- src/services/ai/states/WithdrawalState.java | 67 + src/services/combat/CombatService.java | 9 +- src/services/gcw/FactionService.java | 28 +- src/services/gcw/GCWPylon.java | 636 +++-- src/services/gcw/GCWSpawner.java | 339 ++- src/services/gcw/InvasionService.java | 2288 +++++++++++++---- src/services/gcw/InvasionService3.java | 1390 ++++++++++ src/services/object/ObjectService.java | 17 +- src/services/spawn/MobileTemplate.java | 9 + src/services/spawn/SpawnService.java | 26 +- 56 files changed, 5074 insertions(+), 1232 deletions(-) create mode 100644 scripts/buffs/gcw_fatigue.py create mode 100644 scripts/buffs/tower_defender.py create mode 100644 scripts/mobiles/generic/faction/imperial/imp_invasion_captain.py create mode 100644 scripts/mobiles/generic/faction/imperial/imp_offensive_invasion_general.py create mode 100644 scripts/mobiles/generic/faction/rebel/rebel_invasion_captain.py create mode 100644 scripts/mobiles/generic/faction/rebel/rebel_offensive_invasion_general.py create mode 100644 src/services/ai/states/WithdrawalState.java create mode 100644 src/services/gcw/InvasionService3.java diff --git a/options.cfg b/options.cfg index 2e096467..f0e0916b 100644 --- a/options.cfg +++ b/options.cfg @@ -1,6 +1,7 @@ LOAD.SNAPSHOT_OBJECTS=1 LOAD.BUILDOUT_OBJECTS=1 -#LOAD.BUILDOUT_ONLY_FOR="dathomir" +# example: LOAD.BUILDOUT_ONLY_FOR=tatooine +LOAD.BUILDOUT_ONLY_FOR=naboo LOAD.RESOURCE.SYSTEM=0 # Misc diff --git a/scripts/buffs/gcw_fatigue.py b/scripts/buffs/gcw_fatigue.py new file mode 100644 index 00000000..61d5e796 --- /dev/null +++ b/scripts/buffs/gcw_fatigue.py @@ -0,0 +1,17 @@ +import sys + +def setup(core, actor, buff): + + return + +def add(core, actor, buff): + actor.setGCWFatigue(actor.getGCWFatigue()+1) + return + +def remove(core, actor, buff): + if actor.getGCWFatigue()>0: + actor.setGCWFatigue(actor.getGCWFatigue()-1) + # clear defbuff + + return + \ No newline at end of file diff --git a/scripts/buffs/tower_defender.py b/scripts/buffs/tower_defender.py new file mode 100644 index 00000000..8ca5e20c --- /dev/null +++ b/scripts/buffs/tower_defender.py @@ -0,0 +1,14 @@ +import sys + +def setup(core, actor, buff): + + return + +def add(core, actor, buff): + core.skillModService.addSkillMod(actor, 'expertise_damage_npc', 200) + return + +def remove(core, actor, buff): + core.skillModService.deductSkillMod(actor, 'expertise_damage_npc', -200) + return + \ No newline at end of file diff --git a/scripts/commands/pvp.py b/scripts/commands/pvp.py index 8fd3f42a..446f4f3c 100644 --- a/scripts/commands/pvp.py +++ b/scripts/commands/pvp.py @@ -48,6 +48,7 @@ def run(core, actor, target, commandString): #This can be removed if player is required to see the recruiter first if faction == '': + actor.setFactionStatus(FactionStatus.Combatant) # Must be! otherwise updatePVPstatus will be called with onLeave! actor.setFaction(commandString) faction = commandString @@ -59,8 +60,8 @@ def run(core, actor, target, commandString): actor.sendSystemMessage('@faction_recruiter:on_leave_to_covert', 0) actor.setPvpStatus(PvpStatus.GoingCovert, True) time.sleep(1) - actor.setFactionStatus(FactionStatus.Combatant) actor.setPvpStatus(PvpStatus.GoingCovert, False) + actor.setFactionStatus(FactionStatus.Combatant) actor.sendSystemMessage('@faction_recruiter:covert_complete', 0) actor.updatePvpStatus() core.factionService.updatePVPFromNearbyNPCs(actor, actor.getClient()) @@ -72,8 +73,8 @@ def run(core, actor, target, commandString): time.sleep(30) if core.gcwService.isInPvpZone(actor): return - actor.setFactionStatus(FactionStatus.SpecialForces) actor.setPvpStatus(PvpStatus.GoingOvert, False) + actor.setFactionStatus(FactionStatus.SpecialForces) actor.sendSystemMessage('@faction_recruiter:overt_complete', 0) actor.updatePvpStatus() return diff --git a/scripts/commands/setgodmode.py b/scripts/commands/setgodmode.py index 43c3876e..aebfd5c5 100644 --- a/scripts/commands/setgodmode.py +++ b/scripts/commands/setgodmode.py @@ -8,6 +8,7 @@ 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(): @@ -185,13 +186,61 @@ def run(core, actor, target, commandString): latarget = core.objectService.getObject(latargetID) actor.sendSystemMessage('Checking AI handling for unit ' + latarget.getCustomName(), 0) core.aiService.setCheckAI(latarget) + + elif command == 'checkaitarget': + latargetID = long(actor.getIntendedTarget()) + latarget = core.objectService.getObject(latargetID) + if latarget.getAttachment('AI'): + if latarget.getAttachment('AI').getFollowObject(): + actor.sendSystemMessage('Checking AI target ' + latarget.getAttachment('AI').getFollowObject().getTemplate(), 0) + + elif command == 'checkaistate': + latargetID = long(actor.getIntendedTarget()) + latarget = core.objectService.getObject(latargetID) + if latarget.getAttachment('AI'): + if latarget.getAttachment('AI').getCurrentState(): + actor.sendSystemMessage('Checking AI state ' + latarget.getAttachment('AI').getCurrentState().getClass().getName(), 0) + + elif command == 'checkairepos': + latargetID = long(actor.getIntendedTarget()) + latarget = core.objectService.getObject(latargetID) + if latarget.getAttachment('AI'): + if latarget.getAttachment('AI').getRepositionStartTime()(): + actor.sendSystemMessage('Checking AI state ' + latarget.getAttachment('AI').getRepositionStartTime(), 0) + + elif command == 'checkaiprog': + latargetID = long(actor.getIntendedTarget()) + latarget = core.objectService.getObject(latargetID) + if latarget.getAttachment('AI'): + actor.sendSystemMessage('Checking AI progression %s' % latarget.getAttachment('AI').getProgressionMarker(), 0) elif command == 'showbitmask': latargetID = long(actor.getIntendedTarget()) latarget = core.objectService.getObject(latargetID) actor.sendSystemMessage('Optionsbitmask for unit ' + latarget.getCustomName() + ' is %s' % latarget.getOptionsBitmask(), 0) + + elif command == 'suitest': + window = core.suiService.createSUIWindow('Script.countdownTimerBar', actor, None, 5) + #window.setProperty('bg.caption.lblTitle:Text', 'Titletext') + #window.setProperty('text:Text', '10') + #window.setProperty('bar.value:Page', '10') + window.addDataItem('bar.value', '10') + core.suiService.openSUIWindow(window) + time.sleep(5) + core.suiService.closeSUIWindow(window.getOwner(),window.getWindowId()) + + elif command == 'spawninst': - elif command == 'unknownAbilityPacket' and arg1: + #String campTemplate = "object/building/poi/shared_gcw_rebel_clone_tent_small.iff"; // LOL why doesn't this spawn?!?!?! + inst = core.objectService.createObject(arg1, 0, actor.getPlanet(), actor.getWorldPosition(), actor.getOrientation()) + if inst: + #TangibleObject inst = (TangibleObject) core.objectService.createObject(campTemplate, 0, core.terrainService.getPlanetByName("talus"), new Point3D(-890,9, -2994), quaternion) + core.simulationService.add(inst, inst.getPosition().x, inst.getPosition().z, True) + positionY = core.terrainService.getHeight(inst.getPlanetId(), inst.getPosition().x, inst.getPosition().z) + instpos = Point3D(inst.getPosition().x,positionY+2, inst.getPosition().z) + inst.setPosition(instpos) + + elif command == 'unknownAbilityPacket' and arg1: packet = UnknownAbilityPacket(arg1) actor.getClient().getSession().write(packet.serialize()) actor.sendSystemMessage('Sent UnknownAbilityPacket for ability ' + arg1, 0) diff --git a/scripts/mobiles/generic/faction/imperial/imp_defensive_quest_officer.py b/scripts/mobiles/generic/faction/imperial/imp_defensive_quest_officer.py index 5ab86300..02c3d8a9 100644 --- a/scripts/mobiles/generic/faction/imperial/imp_defensive_quest_officer.py +++ b/scripts/mobiles/generic/faction/imperial/imp_defensive_quest_officer.py @@ -24,6 +24,7 @@ def addTemplate(core): mobileTemplate.setFaction("imperial") mobileTemplate.setFactionStatus(FactionStatus.Combatant) mobileTemplate.setOptionsBitmask(Options.CONVERSABLE | Options.INVULNERABLE) + mobileTemplate.setNoAI(True) templates = Vector() templates.add('object/mobile/shared_dressed_imperial_colonel_m.iff') diff --git a/scripts/mobiles/generic/faction/imperial/imp_invasion_at_st.py b/scripts/mobiles/generic/faction/imperial/imp_invasion_at_st.py index 3f407eba..b6e60b36 100644 --- a/scripts/mobiles/generic/faction/imperial/imp_invasion_at_st.py +++ b/scripts/mobiles/generic/faction/imperial/imp_invasion_at_st.py @@ -31,12 +31,13 @@ def addTemplate(core): mobileTemplate.setTemplates(templates) weaponTemplates = Vector() # object/weapon/ranged/turret/shared_turret_heat.iff object/weapon/ranged/vehicle/shared_vehicle_atst_ranged.iff - weapontemplate = WeaponTemplate('object/weapon/ranged/vehicle/shared_vehicle_atst_ranged.iff', WeaponType.RIFLE, 2.0, 55, 'energy') + weapontemplate = WeaponTemplate('object/weapon/ranged/vehicle/shared_vehicle_atst_ranged.iff', WeaponType.CARBINE, 2.0, 55, 'energy') + #weapontemplate = WeaponTemplate('object/weapon/ranged/rifle/shared_rifle_t21.iff', WeaponType.RIFLE, 1.0, 24, 'energy') weaponTemplates.add(weapontemplate) mobileTemplate.setWeaponTemplateVector(weaponTemplates) attacks = Vector() - mobileTemplate.setDefaultAttack('rangedShot') + mobileTemplate.setDefaultAttack('gcw_atst_attack_tower') #gcw_atst_attack_tower #rangedShot mobileTemplate.setAttacks(attacks) core.spawnService.addMobileTemplate('imp_invasion_at_st', mobileTemplate) diff --git a/scripts/mobiles/generic/faction/imperial/imp_invasion_captain.py b/scripts/mobiles/generic/faction/imperial/imp_invasion_captain.py new file mode 100644 index 00000000..5fa32db5 --- /dev/null +++ b/scripts/mobiles/generic/faction/imperial/imp_invasion_captain.py @@ -0,0 +1,44 @@ +import sys +from services.spawn import MobileTemplate +from services.spawn import WeaponTemplate +from resources.datatables import WeaponType +from resources.datatables import Difficulty +from resources.datatables import Options +from resources.datatables import FactionStatus +from java.util import Vector + + +def addTemplate(core): + mobileTemplate = MobileTemplate() + + mobileTemplate.setCreatureName('gcw_city_imperial_captain') + mobileTemplate.setLevel(90) + mobileTemplate.setDifficulty(Difficulty.NORMAL) + + mobileTemplate.setMinSpawnDistance(4) + mobileTemplate.setMaxSpawnDistance(8) + mobileTemplate.setDeathblow(False) + mobileTemplate.setScale(1) + mobileTemplate.setSocialGroup("imperial") + mobileTemplate.setAssistRange(0) + mobileTemplate.setStalker(False) + mobileTemplate.setFaction("imperial") + mobileTemplate.setFactionStatus(FactionStatus.Combatant) + mobileTemplate.setOptionsBitmask(Options.CONVERSABLE | Options.INVULNERABLE) + mobileTemplate.setNoAI(True) + + templates = Vector() + templates.add('object/mobile/shared_dressed_imperial_captain_m.iff') + mobileTemplate.setTemplates(templates) + + weaponTemplates = Vector() + weapontemplate = WeaponTemplate('object/weapon/ranged/carbine/shared_carbine_e11.iff', WeaponType.CARBINE, 1.0, 15, 'energy') + weaponTemplates.add(weapontemplate) + mobileTemplate.setWeaponTemplateVector(weaponTemplates) + + attacks = Vector() + mobileTemplate.setDefaultAttack('rangedShot') + mobileTemplate.setAttacks(attacks) + + core.spawnService.addMobileTemplate('imp_invasion_captain', mobileTemplate) + return \ No newline at end of file diff --git a/scripts/mobiles/generic/faction/imperial/imp_invasion_general.py b/scripts/mobiles/generic/faction/imperial/imp_invasion_general.py index 194a46b8..7b19a8cc 100644 --- a/scripts/mobiles/generic/faction/imperial/imp_invasion_general.py +++ b/scripts/mobiles/generic/faction/imperial/imp_invasion_general.py @@ -25,6 +25,8 @@ def addTemplate(core): mobileTemplate.setStalker(False) mobileTemplate.setFaction("imperial") mobileTemplate.setFactionStatus(FactionStatus.Combatant) + mobileTemplate.setOptionsBitmask(Options.INVULNERABLE) + mobileTemplate.setAIEnabled(False) templates = Vector() templates.add('object/mobile/shared_dressed_imperial_general_m.iff') diff --git a/scripts/mobiles/generic/faction/imperial/imp_offensive_invasion_general.py b/scripts/mobiles/generic/faction/imperial/imp_offensive_invasion_general.py new file mode 100644 index 00000000..b13bdac1 --- /dev/null +++ b/scripts/mobiles/generic/faction/imperial/imp_offensive_invasion_general.py @@ -0,0 +1,45 @@ +import sys +from services.spawn import MobileTemplate +from services.spawn import WeaponTemplate +from resources.datatables import WeaponType +from resources.datatables import Difficulty +from resources.datatables import Options +from resources.datatables import FactionStatus +from java.util import Vector + + +def addTemplate(core): + mobileTemplate = MobileTemplate() + + mobileTemplate.setCreatureName('gcw_city_offensive_imperial_general') + mobileTemplate.setLevel(110) + mobileTemplate.setHealth(1000000) + mobileTemplate.setDifficulty(Difficulty.BOSS) + + mobileTemplate.setMinSpawnDistance(4) + mobileTemplate.setMaxSpawnDistance(8) + mobileTemplate.setDeathblow(True) + mobileTemplate.setScale(1) + mobileTemplate.setSocialGroup("imperial") + mobileTemplate.setAssistRange(0) + mobileTemplate.setStalker(False) + mobileTemplate.setFaction("imperial") + mobileTemplate.setFactionStatus(FactionStatus.Combatant) + mobileTemplate.setOptionsBitmask(Options.CONVERSABLE | Options.INVULNERABLE) + mobileTemplate.setAIEnabled(False) + + templates = Vector() + templates.add('object/mobile/shared_dressed_imperial_general_m.iff') + mobileTemplate.setTemplates(templates) + + weaponTemplates = Vector() + weapontemplate = WeaponTemplate('object/weapon/ranged/carbine/shared_carbine_e11.iff', WeaponType.CARBINE, 1.0, 15, 'energy') + weaponTemplates.add(weapontemplate) + mobileTemplate.setWeaponTemplateVector(weaponTemplates) + + attacks = Vector() + mobileTemplate.setDefaultAttack('rangedShot') + mobileTemplate.setAttacks(attacks) + + core.spawnService.addMobileTemplate('imp_offensive_invasion_general', mobileTemplate) + return \ No newline at end of file diff --git a/scripts/mobiles/generic/faction/rebel/rebel_defensive_quest_officer.py b/scripts/mobiles/generic/faction/rebel/rebel_defensive_quest_officer.py index 27147933..4570cb07 100644 --- a/scripts/mobiles/generic/faction/rebel/rebel_defensive_quest_officer.py +++ b/scripts/mobiles/generic/faction/rebel/rebel_defensive_quest_officer.py @@ -22,7 +22,7 @@ def addTemplate(core): mobileTemplate.setFaction("rebel") mobileTemplate.setFactionStatus(FactionStatus.Combatant) mobileTemplate.setOptionsBitmask(Options.CONVERSABLE | Options.INVULNERABLE) - mobileTemplate.setAIEnabled(False) + mobileTemplate.setNoAI(True) templates = Vector() templates.add('object/mobile/shared_dressed_rebel_lieutenant_colonel_human_male_01.iff') diff --git a/scripts/mobiles/generic/faction/rebel/rebel_invasion_at_xt.py b/scripts/mobiles/generic/faction/rebel/rebel_invasion_at_xt.py index fbd7c2b2..64c7258d 100644 --- a/scripts/mobiles/generic/faction/rebel/rebel_invasion_at_xt.py +++ b/scripts/mobiles/generic/faction/rebel/rebel_invasion_at_xt.py @@ -24,9 +24,10 @@ def addTemplate(core): mobileTemplate.setStalker(False) mobileTemplate.setFaction("rebel") mobileTemplate.setFactionStatus(FactionStatus.Combatant) + mobileTemplate.setOptionsBitmask(Options.ATTACKABLE) templates = Vector() - templates.add('object/mobile/vehicle/shared_walker_at_xt.iff') + templates.add('object/mobile/shared_atxt.iff') mobileTemplate.setTemplates(templates) weaponTemplates = Vector() @@ -35,7 +36,7 @@ def addTemplate(core): mobileTemplate.setWeaponTemplateVector(weaponTemplates) attacks = Vector() - mobileTemplate.setDefaultAttack('rangedShot') + mobileTemplate.setDefaultAttack('gcw_atst_attack_tower') mobileTemplate.setAttacks(attacks) core.spawnService.addMobileTemplate('rebel_invasion_at_xt', mobileTemplate) diff --git a/scripts/mobiles/generic/faction/rebel/rebel_invasion_captain.py b/scripts/mobiles/generic/faction/rebel/rebel_invasion_captain.py new file mode 100644 index 00000000..9ef28ca6 --- /dev/null +++ b/scripts/mobiles/generic/faction/rebel/rebel_invasion_captain.py @@ -0,0 +1,46 @@ +import sys +from services.spawn import MobileTemplate +from services.spawn import WeaponTemplate +from resources.datatables import WeaponType +from resources.datatables import Difficulty +from resources.datatables import Options +from resources.datatables import FactionStatus +from java.util import Vector + +def addTemplate(core): + mobileTemplate = MobileTemplate() + + mobileTemplate.setCreatureName('gcw_city_rebel_captain') + mobileTemplate.setLevel(90) + mobileTemplate.setDifficulty(Difficulty.ELITE) + + mobileTemplate.setMinSpawnDistance(4) + mobileTemplate.setMaxSpawnDistance(8) + mobileTemplate.setSocialGroup("rebel") + mobileTemplate.setAssistRange(0) + mobileTemplate.setStalker(False) + mobileTemplate.setFaction("rebel") + mobileTemplate.setFactionStatus(FactionStatus.Combatant) + mobileTemplate.setOptionsBitmask(Options.CONVERSABLE | Options.INVULNERABLE) + mobileTemplate.setNoAI(True) + + templates = Vector() + templates.add('object/mobile/shared_dressed_rebel_army_captain_bothan_male.iff') + templates.add('object/mobile/shared_dressed_rebel_army_captain_human_male_01.iff') + templates.add('object/mobile/shared_dressed_rebel_army_captain_moncal_male_01.iff') + templates.add('object/mobile/shared_dressed_rebel_army_captain_trandoshan_female.iff') + templates.add('object/mobile/shared_dressed_rebel_army_captain_twk_male.iff') + templates.add('object/mobile/shared_dressed_rebel_army_captain_zabrak_female.iff') + mobileTemplate.setTemplates(templates) + + weaponTemplates = Vector() + weapontemplate = WeaponTemplate('object/weapon/ranged/carbine/shared_carbine_e5.iff', WeaponType.CARBINE, 1.0, 15, 'energy') + weaponTemplates.add(weapontemplate) + mobileTemplate.setWeaponTemplateVector(weaponTemplates) + + attacks = Vector() + mobileTemplate.setDefaultAttack('rangedShot') + mobileTemplate.setAttacks(attacks) + + core.spawnService.addMobileTemplate('rebel_invasion_captain', mobileTemplate) + return \ No newline at end of file diff --git a/scripts/mobiles/generic/faction/rebel/rebel_invasion_general.py b/scripts/mobiles/generic/faction/rebel/rebel_invasion_general.py index 6a6ee374..db7458e8 100644 --- a/scripts/mobiles/generic/faction/rebel/rebel_invasion_general.py +++ b/scripts/mobiles/generic/faction/rebel/rebel_invasion_general.py @@ -23,6 +23,8 @@ def addTemplate(core): mobileTemplate.setStalker(False) mobileTemplate.setFaction("rebel") mobileTemplate.setFactionStatus(FactionStatus.Combatant) + mobileTemplate.setOptionsBitmask(Options.INVULNERABLE) + mobileTemplate.setAIEnabled(False) templates = Vector() templates.add('object/mobile/shared_dressed_rebel_general_human_female_01.iff') diff --git a/scripts/mobiles/generic/faction/rebel/rebel_invasion_hailfire_droid.py b/scripts/mobiles/generic/faction/rebel/rebel_invasion_hailfire_droid.py index bd8164a4..b6e1d362 100644 --- a/scripts/mobiles/generic/faction/rebel/rebel_invasion_hailfire_droid.py +++ b/scripts/mobiles/generic/faction/rebel/rebel_invasion_hailfire_droid.py @@ -11,7 +11,7 @@ from java.util import Vector def addTemplate(core): mobileTemplate = MobileTemplate() - mobileTemplate.setCreatureName('eow_gcw_city_at_st_2') + mobileTemplate.setCreatureName('rebel_battle_droid') mobileTemplate.setLevel(90) mobileTemplate.setDifficulty(Difficulty.BOSS) @@ -30,12 +30,12 @@ def addTemplate(core): mobileTemplate.setTemplates(templates) weaponTemplates = Vector() - weapontemplate = WeaponTemplate('object/weapon/ranged/vehicle/shared_vehicle_atst_ranged.iff', WeaponType.CARBINE, 1.0, 15, 'energy') + weapontemplate = WeaponTemplate('object/weapon/ranged/droid/shared_droid_rocket_launcher.iff', WeaponType.RIFLE, 1.0, 55, 'energy') weaponTemplates.add(weapontemplate) mobileTemplate.setWeaponTemplateVector(weaponTemplates) attacks = Vector() - mobileTemplate.setDefaultAttack('rangedShot') + mobileTemplate.setDefaultAttack('gcw_rocket_launch') #fireRocketLauncher #gcw_atst_attack_tower mobileTemplate.setAttacks(attacks) core.spawnService.addMobileTemplate('rebel_invasion_hailfire_droid', mobileTemplate) diff --git a/scripts/mobiles/generic/faction/rebel/rebel_offensive_invasion_general.py b/scripts/mobiles/generic/faction/rebel/rebel_offensive_invasion_general.py new file mode 100644 index 00000000..c627f8c8 --- /dev/null +++ b/scripts/mobiles/generic/faction/rebel/rebel_offensive_invasion_general.py @@ -0,0 +1,48 @@ +import sys +from services.spawn import MobileTemplate +from services.spawn import WeaponTemplate +from resources.datatables import WeaponType +from resources.datatables import Difficulty +from resources.datatables import Options +from resources.datatables import FactionStatus +from java.util import Vector + +def addTemplate(core): + mobileTemplate = MobileTemplate() + + mobileTemplate.setCreatureName('gcw_city_offensive_rebel_general') + mobileTemplate.setLevel(110) + mobileTemplate.setHealth(1000000) + mobileTemplate.setDifficulty(Difficulty.BOSS) + + mobileTemplate.setMinSpawnDistance(4) + mobileTemplate.setMaxSpawnDistance(8) + mobileTemplate.setDeathblow(True) + mobileTemplate.setSocialGroup("rebel") + mobileTemplate.setAssistRange(0) + mobileTemplate.setStalker(False) + mobileTemplate.setFaction("rebel") + mobileTemplate.setFactionStatus(FactionStatus.Combatant) + mobileTemplate.setOptionsBitmask(Options.CONVERSABLE | Options.INVULNERABLE) + mobileTemplate.setAIEnabled(False) + + templates = Vector() + templates.add('object/mobile/shared_dressed_rebel_general_human_female_01.iff') + templates.add('object/mobile/shared_dressed_rebel_general_human_female_02.iff') + templates.add('object/mobile/shared_dressed_rebel_general_moncal_male_01.iff') + templates.add('object/mobile/shared_dressed_rebel_general_old_twilek_male_01.iff') + templates.add('object/mobile/shared_dressed_rebel_general_rieekan_01.iff') + templates.add('object/mobile/shared_dressed_rebel_general_rodian_female_01.iff') + mobileTemplate.setTemplates(templates) + + weaponTemplates = Vector() + weapontemplate = WeaponTemplate('object/weapon/ranged/carbine/shared_carbine_e5.iff', WeaponType.CARBINE, 1.0, 15, 'energy') + weaponTemplates.add(weapontemplate) + mobileTemplate.setWeaponTemplateVector(weaponTemplates) + + attacks = Vector() + mobileTemplate.setDefaultAttack('rangedShot') + mobileTemplate.setAttacks(attacks) + + core.spawnService.addMobileTemplate('rebel_offensive_invasion_general', mobileTemplate) + return \ No newline at end of file diff --git a/scripts/object/installation/turret/gcw/adv_turret_block_med_heat.py b/scripts/object/installation/turret/gcw/adv_turret_block_med_heat.py index ccad8904..04e68ef9 100644 --- a/scripts/object/installation/turret/gcw/adv_turret_block_med_heat.py +++ b/scripts/object/installation/turret/gcw/adv_turret_block_med_heat.py @@ -1,4 +1,7 @@ -import sys - def setup(core, object): + object.setAttachment('radial_filename', 'object/usable') + return + +def use(core, owner, target): + core.invasionService.useTurret(owner, target); return \ No newline at end of file diff --git a/scripts/object/installation/turret/gcw/adv_turret_dish_large_heat.py b/scripts/object/installation/turret/gcw/adv_turret_dish_large_heat.py index ccad8904..04e68ef9 100644 --- a/scripts/object/installation/turret/gcw/adv_turret_dish_large_heat.py +++ b/scripts/object/installation/turret/gcw/adv_turret_dish_large_heat.py @@ -1,4 +1,7 @@ -import sys - def setup(core, object): + object.setAttachment('radial_filename', 'object/usable') + return + +def use(core, owner, target): + core.invasionService.useTurret(owner, target); return \ No newline at end of file diff --git a/scripts/object/installation/turret/gcw/adv_turret_dish_sm_heat.py b/scripts/object/installation/turret/gcw/adv_turret_dish_sm_heat.py index ccad8904..04e68ef9 100644 --- a/scripts/object/installation/turret/gcw/adv_turret_dish_sm_heat.py +++ b/scripts/object/installation/turret/gcw/adv_turret_dish_sm_heat.py @@ -1,4 +1,7 @@ -import sys - def setup(core, object): + object.setAttachment('radial_filename', 'object/usable') + return + +def use(core, owner, target): + core.invasionService.useTurret(owner, target); return \ No newline at end of file diff --git a/scripts/object/tangible/destructible/gcw_city_construction_beacon.py b/scripts/object/tangible/destructible/gcw_city_construction_beacon.py index ccad8904..52398bbc 100644 --- a/scripts/object/tangible/destructible/gcw_city_construction_beacon.py +++ b/scripts/object/tangible/destructible/gcw_city_construction_beacon.py @@ -1,4 +1,7 @@ -import sys - def setup(core, object): + object.setAttachment('radial_filename', 'object/usable') + return + +def use(core, owner, target): + core.invasionService.usePylon(owner, target); return \ No newline at end of file diff --git a/scripts/object/tangible/destructible/gcw_imperial_barricade.py b/scripts/object/tangible/destructible/gcw_imperial_barricade.py index ccad8904..3fce58db 100644 --- a/scripts/object/tangible/destructible/gcw_imperial_barricade.py +++ b/scripts/object/tangible/destructible/gcw_imperial_barricade.py @@ -1,4 +1,7 @@ -import sys - def setup(core, object): + object.setAttachment('radial_filename', 'object/usable') + return + +def use(core, owner, target): + core.invasionService.useBarricade(owner, target); return \ No newline at end of file diff --git a/scripts/object/tangible/destructible/gcw_imperial_tower.py b/scripts/object/tangible/destructible/gcw_imperial_tower.py index ccad8904..287f3df3 100644 --- a/scripts/object/tangible/destructible/gcw_imperial_tower.py +++ b/scripts/object/tangible/destructible/gcw_imperial_tower.py @@ -1,4 +1,7 @@ -import sys - def setup(core, object): + object.setAttachment('radial_filename', 'object/usable') + return + +def use(core, owner, target): + core.invasionService.useTower(owner, target); return \ No newline at end of file diff --git a/scripts/object/tangible/destructible/gcw_rebel_barricade.py b/scripts/object/tangible/destructible/gcw_rebel_barricade.py index ccad8904..3fce58db 100644 --- a/scripts/object/tangible/destructible/gcw_rebel_barricade.py +++ b/scripts/object/tangible/destructible/gcw_rebel_barricade.py @@ -1,4 +1,7 @@ -import sys - def setup(core, object): + object.setAttachment('radial_filename', 'object/usable') + return + +def use(core, owner, target): + core.invasionService.useBarricade(owner, target); return \ No newline at end of file diff --git a/scripts/object/tangible/destructible/gcw_rebel_tower.py b/scripts/object/tangible/destructible/gcw_rebel_tower.py index ccad8904..287f3df3 100644 --- a/scripts/object/tangible/destructible/gcw_rebel_tower.py +++ b/scripts/object/tangible/destructible/gcw_rebel_tower.py @@ -1,4 +1,7 @@ -import sys - def setup(core, object): + object.setAttachment('radial_filename', 'object/usable') + return + +def use(core, owner, target): + core.invasionService.useTower(owner, target); return \ No newline at end of file diff --git a/scripts/object/tangible/terminal/terminal_gcw_imp_def.py b/scripts/object/tangible/terminal/terminal_gcw_imp_def.py index ccad8904..046f166e 100644 --- a/scripts/object/tangible/terminal/terminal_gcw_imp_def.py +++ b/scripts/object/tangible/terminal/terminal_gcw_imp_def.py @@ -1,4 +1,7 @@ -import sys - def setup(core, object): + object.setAttachment('radial_filename', 'object/usable') + return + +def use(core, owner, target): + core.invasionService.supplyTerminalSUI(owner, 0); return \ No newline at end of file diff --git a/scripts/object/tangible/terminal/terminal_gcw_imp_offensiv.py b/scripts/object/tangible/terminal/terminal_gcw_imp_offensiv.py index ccad8904..142710d8 100644 --- a/scripts/object/tangible/terminal/terminal_gcw_imp_offensiv.py +++ b/scripts/object/tangible/terminal/terminal_gcw_imp_offensiv.py @@ -1,4 +1,7 @@ -import sys - def setup(core, object): + object.setAttachment('radial_filename', 'object/usable') + return + +def use(core, owner, target): + core.invasionService.supplyOffensiveTerminalSUI(owner, 0); return \ No newline at end of file diff --git a/scripts/object/tangible/terminal/terminal_gcw_reb_def.py b/scripts/object/tangible/terminal/terminal_gcw_reb_def.py index ccad8904..046f166e 100644 --- a/scripts/object/tangible/terminal/terminal_gcw_reb_def.py +++ b/scripts/object/tangible/terminal/terminal_gcw_reb_def.py @@ -1,4 +1,7 @@ -import sys - def setup(core, object): + object.setAttachment('radial_filename', 'object/usable') + return + +def use(core, owner, target): + core.invasionService.supplyTerminalSUI(owner, 0); return \ No newline at end of file diff --git a/scripts/object/tangible/terminal/terminal_gcw_reb_offensiv.py b/scripts/object/tangible/terminal/terminal_gcw_reb_offensiv.py index ccad8904..142710d8 100644 --- a/scripts/object/tangible/terminal/terminal_gcw_reb_offensiv.py +++ b/scripts/object/tangible/terminal/terminal_gcw_reb_offensiv.py @@ -1,4 +1,7 @@ -import sys - def setup(core, object): + object.setAttachment('radial_filename', 'object/usable') + return + +def use(core, owner, target): + core.invasionService.supplyOffensiveTerminalSUI(owner, 0); return \ No newline at end of file diff --git a/src/main/NGECore.java b/src/main/NGECore.java index d02566ab..d9a31562 100644 --- a/src/main/NGECore.java +++ b/src/main/NGECore.java @@ -93,6 +93,7 @@ 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; @@ -851,7 +852,7 @@ public class NGECore { public Vector getExcludedDevelopers(){ Vector excludedDevelopers = new Vector(); - excludedDevelopers.add("Charon"); + //excludedDevelopers.add("Charon"); // Feel free to add your OS user account name here to exclude yourself from loading buildouts and snapshots // without having to change options.cfg all the time return excludedDevelopers; diff --git a/src/protocol/swg/objectControllerObjects/DataTransform.java b/src/protocol/swg/objectControllerObjects/DataTransform.java index 3b8381e5..62b698b3 100644 --- a/src/protocol/swg/objectControllerObjects/DataTransform.java +++ b/src/protocol/swg/objectControllerObjects/DataTransform.java @@ -21,15 +21,14 @@ ******************************************************************************/ package protocol.swg.objectControllerObjects; +import java.nio.BufferUnderflowException; import java.nio.ByteOrder; - import java.lang.Math; import org.apache.mina.core.buffer.IoBuffer; import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; - import protocol.swg.ObjControllerMessage; public class DataTransform extends ObjControllerObject { @@ -93,21 +92,23 @@ public class DataTransform extends ObjControllerObject { } public void deserialize(IoBuffer buffer) { - objectId = buffer.getLong(); - buffer.getInt(); - - movementStamp = buffer.getInt(); - movementIndex = buffer.getInt(); - - xOrientation = buffer.getFloat(); - yOrientation = buffer.getFloat(); - zOrientation = buffer.getFloat(); - wOrientation = buffer.getFloat(); - - xPosition = buffer.getFloat(); - yPosition = buffer.getFloat(); - zPosition = buffer.getFloat(); - speed = buffer.getFloat(); + try{ + objectId = buffer.getLong(); + buffer.getInt(); + + movementStamp = buffer.getInt(); + movementIndex = buffer.getInt(); + + xOrientation = buffer.getFloat(); + yOrientation = buffer.getFloat(); + zOrientation = buffer.getFloat(); + wOrientation = buffer.getFloat(); + + xPosition = buffer.getFloat(); + yPosition = buffer.getFloat(); + zPosition = buffer.getFloat(); + speed = buffer.getFloat(); + } catch (BufferUnderflowException ex){System.err.println("BufferUnderflowException during Datatransform deserialization");} } public IoBuffer serialize() { diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index 4949b3d5..61a92530 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -187,6 +187,8 @@ public class CreatureObject extends TangibleObject implements Serializable { private transient CreatureObject calledPet; private byte locomotion = 0; + private short GCWFatigue = 0; + private boolean isConstructing = false; public CreatureObject(long objectID, Planet planet, Point3D position, Quaternion orientation, String Template) { super(objectID, planet, position, orientation, Template); @@ -1885,4 +1887,34 @@ public class CreatureObject extends TangibleObject implements Serializable { public void setCalledPet(CreatureObject calledPet) { this.calledPet = calledPet; } + + public short getGCWFatigue() { + return GCWFatigue; + } + + public void setGCWFatigue(short gCWFatigue) { + GCWFatigue = gCWFatigue; + } + + public boolean isTrader(){ + if (isPlayer()){ + PlayerObject player = (PlayerObject) this.getSlottedObject("ghost"); + String profession = player.getProfession(); + if (profession.equals("trader_0a") || + profession.equals("trader_0b") || + profession.equals("trader_0c") || + profession.equals("trader_0d")){ + return true; + } + } + return false; + } + + public boolean isConstructing() { + return isConstructing; + } + + public void setConstructing(boolean isConstructing) { + this.isConstructing = isConstructing; + } } diff --git a/src/resources/objects/installation/InstallationObject.java b/src/resources/objects/installation/InstallationObject.java index 12389bda..9c38ea52 100644 --- a/src/resources/objects/installation/InstallationObject.java +++ b/src/resources/objects/installation/InstallationObject.java @@ -24,6 +24,8 @@ package resources.objects.installation; import java.io.Serializable; import java.util.Vector; +import org.apache.mina.core.buffer.IoBuffer; + import main.NGECore; import protocol.swg.UpdatePVPStatusMessage; import protocol.swg.UpdatePostureMessage; @@ -31,14 +33,18 @@ import protocol.swg.UpdatePostureMessage; import com.sleepycat.persist.model.Entity; import engine.clients.Client; +import engine.resources.common.CRC; +import engine.resources.objects.Baseline; import engine.resources.scene.Planet; import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; +import resources.datatables.Options; import resources.objects.ObjectMessageBuilder; +import resources.objects.SWGSet; +import resources.objects.building.BuildingMessageBuilder; import resources.objects.creature.CreatureObject; import resources.objects.tangible.TangibleObject; -@Entity(version=0) public class InstallationObject extends TangibleObject implements Serializable { private static final long serialVersionUID = 1L; @@ -49,32 +55,94 @@ public class InstallationObject extends TangibleObject implements Serializable { messageBuilder = new InstallationMessageBuilder(this); } +// @Override +// public void sendBaselines(Client destination) { +// +// if(destination == null || destination.getSession() == null) { +// //System.out.println("NULL session"); +// return; +// } +// +// destination.getSession().write(messageBuilder.buildBaseline3(this)); +// //destination.getSession().write(messageBuilder.buildBaseline6(this)); +// +// if(destination != getClient()) { +// UpdatePVPStatusMessage upvpm = new UpdatePVPStatusMessage(getObjectID(), NGECore.getInstance().factionService.calculatePvpStatus((CreatureObject) destination.getParent(), this), getFaction()); +// destination.getSession().write(upvpm.serialize()); +// } +// } + + public Baseline getBaseline3() { + Baseline baseline = super.getBaseline3(); + baseline.put("activeFlag", false); + baseline.put("PowerReserves", 0); + baseline.put("PowerCost", 0); + return baseline; + } + + @Override public void sendBaselines(Client destination) { - - if(destination == null || destination.getSession() == null) { - //System.out.println("NULL session"); - return; - } - -// destination.getSession().write(messageBuilder.buildBaseline3(this)); -// destination.getSession().write(messageBuilder.buildBaseline6(this)); - - if(destination != getClient()) { - UpdatePVPStatusMessage upvpm = new UpdatePVPStatusMessage(getObjectID(), NGECore.getInstance().factionService.calculatePvpStatus((CreatureObject) destination.getParent(), this), getFaction()); - destination.getSession().write(upvpm.serialize()); + if (destination != null && destination.getSession() != null) { + + // Factional peculiarities + Baseline baseLine3 = getBaseline(3); + if (destination.getParent() instanceof CreatureObject){ + if (((CreatureObject) destination.getParent()).isPlayer() && ((CreatureObject) destination.getParent()).getFaction()!=this.getFaction()){ + int optionsBitMask = getOptionsBitmask(); + if (getOption(Options.QUEST)) + optionsBitMask = optionsBitMask & ~Options.QUEST; + if (!getOption(Options.ATTACKABLE)) + optionsBitMask = optionsBitMask | Options.ATTACKABLE; + + baseLine3.set("optionsBitmask", optionsBitMask); + } + } + + //destination.getSession().write(getBaseline(3).getBaseline()); + destination.getSession().write(baseLine3.getBaseline()); + destination.getSession().write(getBaseline(6).getBaseline()); + + Client parent = ((getGrandparent() == null) ? null : getGrandparent().getClient()); + + if (parent != null && destination == parent) { + destination.getSession().write(getBaseline(8).getBaseline()); + destination.getSession().write(getBaseline(9).getBaseline()); + } + + if (destination.getParent() != this) { + UpdatePVPStatusMessage upvpm = new UpdatePVPStatusMessage(getObjectID()); + upvpm.setFaction(CRC.StringtoCRC(getFaction())); +// if (this.getTemplate().contains("turret")){ +// System.out.println("TURRET RESULT " + NGECore.getInstance().factionService.calculatePvpStatus((CreatureObject) destination.getParent(), this)); +// } + upvpm.setStatus(NGECore.getInstance().factionService.calculatePvpStatus((CreatureObject) destination.getParent(), this)); + destination.getSession().write(upvpm.serialize()); + } } } + @Override + public void notifyClients(IoBuffer buffer, boolean notifySelf) { + notifyObservers(buffer, false); + } + + @Override + public ObjectMessageBuilder getMessageBuilder() { + synchronized(objectMutex) { + if (messageBuilder == null) { + messageBuilder = new InstallationMessageBuilder(this); + } + return messageBuilder; + } + } + + @Override public void initAfterDBLoad() { super.init(); messageBuilder = new InstallationMessageBuilder(this); defendersList = new Vector(); } - - public ObjectMessageBuilder getMessageBuilder() { - return messageBuilder; - } - + } \ No newline at end of file diff --git a/src/resources/objects/tangible/TangibleObject.java b/src/resources/objects/tangible/TangibleObject.java index 52bc4cb0..583921c9 100644 --- a/src/resources/objects/tangible/TangibleObject.java +++ b/src/resources/objects/tangible/TangibleObject.java @@ -405,11 +405,10 @@ public class TangibleObject extends SWGObject implements Serializable { if (observer.getParent() != null) { observer.getSession().write(new UpdatePVPStatusMessage(this.getObjectID(), NGECore.getInstance().factionService.calculatePvpStatus((CreatureObject) observer.getParent(), this), getFaction()).serialize()); if(getClient() != null){ - getClient().getSession().write(new UpdatePVPStatusMessage(observer.getParent().getObjectID(), NGECore.getInstance().factionService.calculatePvpStatus((CreatureObject) this, (CreatureObject) observer.getParent()), getFaction()).serialize()); - System.out.println("SENT TO CLIENT!"); - } + getClient().getSession().write(new UpdatePVPStatusMessage(observer.getParent().getObjectID(), NGECore.getInstance().factionService.calculatePvpStatus((CreatureObject) this, (CreatureObject) observer.getParent()), getFaction()).serialize()); + //System.out.println("SENT TO CLIENT!"); + } } - } if (getClient() != null) { @@ -430,7 +429,6 @@ public class TangibleObject extends SWGObject implements Serializable { } } - } public boolean isAttackableBy(CreatureObject attacker) { @@ -636,9 +634,26 @@ public class TangibleObject extends SWGObject implements Serializable { } } + @Override public void sendBaselines(Client destination) { if (destination != null && destination.getSession() != null) { - destination.getSession().write(getBaseline(3).getBaseline()); + + // Factional peculiarities + Baseline baseLine3 = getBaseline(3); + if (destination.getParent() instanceof CreatureObject){ + if (((CreatureObject) destination.getParent()).isPlayer() && ((CreatureObject) destination.getParent()).getFaction()!=this.getFaction()){ + int optionsBitMask = getOptionsBitmask(); + if (getOption(Options.QUEST)) + optionsBitMask = optionsBitMask & ~Options.QUEST; + if (!getOption(Options.ATTACKABLE)) + optionsBitMask = optionsBitMask | Options.ATTACKABLE; + + baseLine3.set("optionsBitmask", optionsBitMask); + } + } + + //destination.getSession().write(getBaseline(3).getBaseline()); + destination.getSession().write(baseLine3.getBaseline()); destination.getSession().write(getBaseline(6).getBaseline()); Client parent = ((getGrandparent() == null) ? null : getGrandparent().getClient()); @@ -651,6 +666,10 @@ public class TangibleObject extends SWGObject implements Serializable { if (destination.getParent() != this) { UpdatePVPStatusMessage upvpm = new UpdatePVPStatusMessage(getObjectID()); upvpm.setFaction(CRC.StringtoCRC(getFaction())); +// if (this.getTemplate().contains("barricade")){ +// System.out.println("BARTANO RESULT " + NGECore.getInstance().factionService.calculatePvpStatus((CreatureObject) destination.getParent(), this)); +// } + upvpm.setStatus(NGECore.getInstance().factionService.calculatePvpStatus((CreatureObject) destination.getParent(), this)); destination.getSession().write(upvpm.serialize()); } diff --git a/src/services/BuffService.java b/src/services/BuffService.java index a5458831..86ee2ddb 100644 --- a/src/services/BuffService.java +++ b/src/services/BuffService.java @@ -46,6 +46,7 @@ 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; @@ -130,6 +131,10 @@ public class BuffService implements INetworkDispatch { } else { if (! hasBuff(target,buffName)) // QA, prevent infinite "refreshing" of buff by repeated use doAddBuff(target, buffName, buffer); + else { + if (buff.getMaxStacks()>1) + doAddBuff(target, buffName, buffer); + } return true; } } @@ -191,6 +196,12 @@ 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); + } + } // } target.addBuff(buff); @@ -266,7 +277,13 @@ public class BuffService implements INetworkDispatch { 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); + } + } + // } if (!buff.getCallback().equals("none") && !buff.getCallback().equals("")) { if (FileUtilities.doesFileExist("scripts/buffs/" + buff.getBuffName() + ".py")) { diff --git a/src/services/DevService.java b/src/services/DevService.java index 7d958e88..d74108e1 100644 --- a/src/services/DevService.java +++ b/src/services/DevService.java @@ -41,6 +41,7 @@ import resources.datatables.WeaponType; import resources.harvest.SurveyTool; import resources.objects.building.BuildingObject; import resources.objects.creature.CreatureObject; +import resources.objects.installation.InstallationObject; import resources.objects.player.PlayerObject; import resources.objects.tangible.TangibleObject; import resources.objects.weapon.WeaponObject; @@ -95,6 +96,12 @@ public class DevService implements INetworkDispatch { suiOptions.put((long) 4, "Treasure chest test"); if (System.getProperty("user.name").equals("Charon")) suiOptions.put((long) 6, "Dearic attack camp"); + if (System.getProperty("user.name").equals("Charon")) + suiOptions.put((long) 7, "Keren defensive positions"); + if (System.getProperty("user.name").equals("Charon")) + suiOptions.put((long) 8, "Bestine defensive positions"); + if (System.getProperty("user.name").equals("Charon")) + suiOptions.put((long) 9, "Spawn Pylon"); if (creature.getClient().isGM()) suiOptions.put((long) 200, "Get new CBT"); break; @@ -232,13 +239,36 @@ public class DevService implements INetworkDispatch { return; case 6: // Locations -890,4, -2994 475,6,-3019 + core.simulationService.transferToPlanet(player, core.terrainService.getPlanetByName("talus"), new Point3D(475,6,-3019), player.getOrientation(), null); + //core.simulationService.transferToPlanet(player, core.terrainService.getPlanetByName("talus"), new Point3D(264, 4, -2950), player.getOrientation(), null); // starport + //core.simulationService.transferToPlanet(player, core.terrainService.getPlanetByName("talus"), new Point3D(-930,9, -2994), player.getOrientation(), null); + + //core.invasionService.testPylons(); + return; + case 7: // Locations -890,4, -2994 475,6,-3019 //core.simulationService.transferToPlanet(player, core.terrainService.getPlanetByName("talus"), new Point3D(475,6,-3019), player.getOrientation(), null); - core.simulationService.transferToPlanet(player, core.terrainService.getPlanetByName("talus"), new Point3D(264, 4, -2950), player.getOrientation(), null); + core.simulationService.transferToPlanet(player, core.terrainService.getPlanetByName("naboo"), new Point3D(1788, 6, 2518), player.getOrientation(), null); + //core.simulationService.transferToPlanet(player, core.terrainService.getPlanetByName("talus"), new Point3D(-930,9, -2994), player.getOrientation(), null); + + //core.invasionService.testPylons(); + return; + + case 8: // Locations -890,4, -2994 475,6,-3019 + //core.simulationService.transferToPlanet(player, core.terrainService.getPlanetByName("talus"), new Point3D(475,6,-3019), player.getOrientation(), null); + core.simulationService.transferToPlanet(player, core.terrainService.getPlanetByName("tatooine"), new Point3D(-1214,6, -3626), player.getOrientation(), null); //core.simulationService.transferToPlanet(player, core.terrainService.getPlanetByName("talus"), new Point3D(-930,9, -2994), player.getOrientation(), null); //core.invasionService.testPylons(); return; + case 9: + TangibleObject turret = (TangibleObject) NGECore.getInstance().objectService.createObject("object/tangible/destructible/shared_gcw_city_construction_beacon.iff", 0, player.getPlanet(), player.getWorldPosition(), player.getOrientation()); + NGECore.getInstance().simulationService.add(turret, turret.getPosition().x, turret.getPosition().z, true); + float positionY = NGECore.getInstance().terrainService.getHeight(turret.getPlanetId(), turret.getPosition().x, turret.getPosition().z); + + turret.setPosition(new Point3D(turret.getPosition().x,positionY, turret.getPosition().z)); + return; + // Character case 10: // Set combat level to 90 if (player.getAttachment("hasLeveled") == null) { diff --git a/src/services/PlayerService.java b/src/services/PlayerService.java index e65d989c..0b0242f5 100644 --- a/src/services/PlayerService.java +++ b/src/services/PlayerService.java @@ -67,6 +67,7 @@ import resources.common.OutOfBand; import resources.common.ProsePackage; import resources.common.SpawnPoint; import resources.datatables.DisplayType; +import resources.datatables.FactionStatus; import resources.datatables.Options; import resources.datatables.PlayerFlags; import resources.datatables.Professions; @@ -526,10 +527,19 @@ public class PlayerService implements INetworkDispatch { @SuppressWarnings("unchecked") public void sendCloningWindow(CreatureObject creature, final boolean pvpDeath) { - //if(creature.getPosture() != 14) - // return; + if(creature.getPosture() != 14) + return; List cloners = core.staticService.getCloningFacilitiesByPlanet(creature.getPlanet()); + + boolean invasionDeath = core.invasionService.checkInvasionDeath(creature); + + if (invasionDeath){ + if (core.invasionService.getAccordingCloners(creature).size()>0){ + cloners = core.invasionService.getAccordingCloners(creature); + } + } + Map cloneData = new HashMap(); Point3D position = creature.getWorldPosition(); @@ -542,9 +552,20 @@ public class PlayerService implements INetworkDispatch { } final long preDesignatedObjectId = (preDesignatedCloner != null) ? preDesignatedCloner.getObjectID() : 0; cloners.stream().filter(c -> c.getObjectID() != preDesignatedObjectId).forEach(c -> cloneData.put(c.getObjectID(), core.mapService.getClosestCityName(c))); + + Map listedCloneData = cloneData; + if (invasionDeath){ + if (core.invasionService.getAccordingCloners(creature).size()>0){ + listedCloneData = new HashMap(); + for (SWGObject cloner : core.invasionService.getAccordingCloners(creature)){ + listedCloneData.put(cloner.getObjectID(), cloner.getCustomName()); + } + } + } + final SUIWindow window = core.suiService.createListBox(ListBoxType.LIST_BOX_OK_CANCEL, "@base_player:revive_title", "@base_player:clone_prompt_header", - cloneData, creature, null, 0); + listedCloneData, creature, null, 0); Vector returnList = new Vector(); returnList.add("List.lstList:SelectedRow"); @@ -577,10 +598,10 @@ public class PlayerService implements INetworkDispatch { } public void handleCloneRequest(CreatureObject creature, BuildingObject cloner, SpawnPoint spawnPoint, boolean pvpDeath) { - + CellObject cell = cloner.getCellByCellNumber(spawnPoint.getCellNumber()); - if(cell == null) + if(cell == null && !cloner.getTemplate().contains("shared_invisible_cloner")) return; creature.setPosture((byte) 0); @@ -599,7 +620,9 @@ public class PlayerService implements INetworkDispatch { creature.updateAllBuffs(); } - creature.setFactionStatus(0); + creature.setFactionStatus(FactionStatus.OnLeave); + creature.updatePvpStatus(); + core.buffService.addBuffToCreature(creature, "cloning_sickness", creature); } diff --git a/src/services/SimulationService.java b/src/services/SimulationService.java index 710f1080..90cc738a 100644 --- a/src/services/SimulationService.java +++ b/src/services/SimulationService.java @@ -82,6 +82,7 @@ import resources.objects.group.GroupObject; import resources.objects.harvester.HarvesterObject; import resources.objects.installation.InstallationObject; import resources.objects.player.PlayerObject; +import resources.objects.staticobject.StaticObject; import resources.objects.tangible.TangibleObject; import resources.common.*; import resources.common.collidables.AbstractCollidable; @@ -289,6 +290,27 @@ public class SimulationService implements INetworkDispatch { return foundCreatures; } + public Vector getAllNearNonSameFactionTargets(int distance, SWGObject center ){ + Vector foundTargets = new Vector(); + core.simulationService.get(center.getPlanet(), center.getWorldPosition().x, center.getWorldPosition().z, distance).stream().forEach((objecta) -> { + if (center.getObjectID()!=objecta.getObjectID()){ + String centerfaction = ""; + if (center instanceof CreatureObject) + centerfaction = ((CreatureObject)center).getFaction(); + if (center instanceof InstallationObject) + centerfaction = ((InstallationObject)center).getFaction(); + if (center instanceof TangibleObject) + centerfaction = ((TangibleObject)center).getFaction(); + + if (centerfaction.length()>0 && !(objecta instanceof StaticObject)){ + if (objecta.getObjectID()!=center.getObjectID() && NGECore.getInstance().factionService.isFactionEnemy((TangibleObject) objecta,(TangibleObject) center)) + foundTargets.add((TangibleObject)objecta); + } + } + }); + return foundTargets; + } + public Vector getAllNearNonSameFactionNPCs(int distance, SWGObject center ){ Vector foundCreatures = new Vector(); core.simulationService.get(center.getPlanet(), center.getWorldPosition().x, center.getWorldPosition().z, distance).stream().forEach((objecta) -> { @@ -1302,8 +1324,8 @@ public class SimulationService implements INetworkDispatch { public boolean checkLineOfSight(SWGObject object, Point3D position2) { long startTime = System.nanoTime(); - float heightOrigin = 1.f; - float heightDirection = 1.f; + float heightOrigin = 1.75f; + float heightDirection = 1.75f; if (object instanceof CreatureObject) { heightOrigin = getHeightOrigin((CreatureObject) object); @@ -1322,6 +1344,9 @@ public class SimulationService implements INetworkDispatch { continue; } + if (object.getTemplate().contains("_barricade") || object.getTemplate().contains("shared_dejarik_table_base")) + continue; + if (object.getTemplateData() != null && object.getTemplateData().getAttribute("collisionActionBlockFlags") != null) { int bit = (Integer) object.getTemplateData().getAttribute("collisionActionBlockFlags") & 255; @@ -1358,9 +1383,9 @@ public class SimulationService implements INetworkDispatch { public boolean checkLineOfSight2(SWGObject obj1, Point3D obj2) { long startTime = System.nanoTime(); - float heightOrigin = 1.f; - float heightDirection = 1.f; - + float heightOrigin = 1.75f; + float heightDirection = 1.75f; + if(obj1 instanceof CreatureObject) heightOrigin = getHeightOrigin((CreatureObject) obj1); @@ -1378,6 +1403,9 @@ public class SimulationService implements INetworkDispatch { if(object == obj1) continue; + if (object.getTemplate().contains("_barricade") || object.getTemplate().contains("shared_dejarik_table_base")) + continue; + if(object.getTemplateData() != null && object.getTemplateData().getAttribute("collisionActionBlockFlags") != null) { int bit = (Integer) object.getTemplateData().getAttribute("collisionActionBlockFlags") & 255; if(bit == (Integer) object.getTemplateData().getAttribute("collisionActionBlockFlags")) @@ -1447,8 +1475,10 @@ public class SimulationService implements INetworkDispatch { } - float heightOrigin = 1.f; - float heightDirection = 1.f; +// float heightOrigin = 1.f; +// float heightDirection = 1.f; + float heightOrigin = 1.75f; + float heightDirection = 1.75f; if (obj2.getTemplate().equals("object/tangible/inventory/shared_character_inventory.iff")){ obj2 = obj2.getContainer(); // LOS message fix on corpse @@ -1474,6 +1504,9 @@ public class SimulationService implements INetworkDispatch { if(object == obj1 || object == obj2) continue; + if (object.getTemplate().contains("_barricade") || object.getTemplate().contains("shared_dejarik_table_base")) + continue; + if(object.getTemplateData() != null && object.getTemplateData().getAttribute("collisionActionBlockFlags") != null) { int bit = (Integer) object.getTemplateData().getAttribute("collisionActionBlockFlags") & 255; if(bit == (Integer) object.getTemplateData().getAttribute("collisionActionBlockFlags")) diff --git a/src/services/StaticService.java b/src/services/StaticService.java index e40a8619..5014eeac 100644 --- a/src/services/StaticService.java +++ b/src/services/StaticService.java @@ -239,14 +239,13 @@ public class StaticService implements INetworkDispatch { public List getCloningFacilitiesByPlanet(Planet planet) { List objects = core.simulationService.get(planet, 0, 0, 8300); List cloners = new ArrayList(); - for (SWGObject obj : objects) { if(obj instanceof BuildingObject && (obj.getTemplate().contains("cloning_facility") || obj.getTemplate().contains("cloning_tatooine") || obj.getTemplate().contains("cloning_naboo") || obj.getTemplate().contains("cloning_corellia"))) { if(!obj.getTemplate().equals("object/building/general/shared_cloning_facility_general.iff")) cloners.add(obj); } } - + return cloners; } diff --git a/src/services/TerrainService.java b/src/services/TerrainService.java index 8bea9b00..97c53ec2 100644 --- a/src/services/TerrainService.java +++ b/src/services/TerrainService.java @@ -212,16 +212,16 @@ public class TerrainService { } if (loaded && config.getInt("LOAD.BUILDOUT_OBJECTS") > 0) { - if (!core.getExcludedDevelopers().contains(System.getProperty("user.name"))){ + if (!core.getExcludedDevelopers().contains(System.getProperty("user.name"))){ if (! config.keyExists("LOAD.BUILDOUT_ONLY_FOR")){ try { core.objectService.loadBuildoutObjects(planet); } catch (InstantiationException | IllegalAccessException e) { e.printStackTrace(); } - } else { - if (planet.getName().equals(config.getString("LOAD.BUILDOUT_ONLY_FOR"))){ - try { + } else { + if (planet.getName().trim().equals(config.getString("LOAD.BUILDOUT_ONLY_FOR").trim())){ + try { core.objectService.loadBuildoutObjects(planet); } catch (InstantiationException | IllegalAccessException e) { e.printStackTrace(); diff --git a/src/services/ai/AIActor.java b/src/services/ai/AIActor.java index 99d1f4e5..efdb8fe5 100644 --- a/src/services/ai/AIActor.java +++ b/src/services/ai/AIActor.java @@ -93,6 +93,8 @@ public class AIActor { private long actorID = 0L; private static long autoActorID = 0L; private boolean actorAlive = true; + private int progressionMarker = 0; + private boolean AIactive = true; public AIActor(CreatureObject creature, Point3D spawnPosition, ScheduledExecutorService scheduler) { actorID = autoActorID++; @@ -102,6 +104,23 @@ public class AIActor { this.scheduler = scheduler; creature.getEventBus().subscribe(this); this.currentState = new IdleState(); + initiateSchedules(); + } + + public AIActor(CreatureObject creature, Point3D spawnPosition, ScheduledExecutorService scheduler, boolean aiactive) { + actorID = autoActorID++; + this.creature = creature; + this.spawnPosition = spawnPosition; + setLastPositionBeforeStateChange(spawnPosition); // just to make sure it's initialized + this.scheduler = scheduler; + creature.getEventBus().subscribe(this); + this.currentState = new IdleState(); + this.AIactive = aiactive; + initiateSchedules(); + } + + private void initiateSchedules(){ + setIntendedPrimaryAIState(this.currentState); // to switch back to after aggro regenTask = scheduler.scheduleAtFixedRate(() -> { try { @@ -120,41 +139,42 @@ public class AIActor { if(creature.getOption(Options.AGGRESSIVE)) { aggroCheckTask = scheduler.scheduleAtFixedRate(() -> { try { - - if(creature == null || creature.getObservers().isEmpty() || creature.isInCombat() || isStalking) - return; - if (creature.getAttachment("tamed")!=null){ - DevLog.debugoutai(this, "Charon", "Pet AI", "aggroCheckTask tamed==1"); - return; - } - - if (creature.getCustomName().contains("baby")) - DevLog.debugoutai(this, "Charon", "Pet AI", "baby aggroCheckTask should not be here " +creature.getAttachment("tamed")); - - creature.getObservers().stream().map(Client::getParent).filter(obj -> obj.inRange(creature.getWorldPosition(), 15)).forEach((obj) -> { - if(new Random().nextFloat() <= 0.5 || creature.isInCombat() || isStalking) { - /*if(mobileTemplate.isStalker()) { - setFollowObject((CreatureObject) obj); - setCurrentState(new StalkState()); - } else */ - - if (creature.getAttachment("IsBeingTamed")!=null) - return; - - if (obj instanceof CreatureObject){ - CreatureObject addedObject = (CreatureObject) obj; - if (addedObject.getCalledPet()!=null){ - CreatureObject calledPet = addedObject.getCalledPet(); - if (calledPet.getPosture() != 13 && calledPet.getPosture() != 14){ - addDefender(calledPet); + if (AIactive){ + if(creature == null || creature.getObservers().isEmpty() || creature.isInCombat() || isStalking) + return; + if (creature.getAttachment("tamed")!=null){ + DevLog.debugoutai(this, "Charon", "Pet AI", "aggroCheckTask tamed==1"); + return; + } + + if (creature.getCustomName().contains("baby")) + DevLog.debugoutai(this, "Charon", "Pet AI", "baby aggroCheckTask should not be here " +creature.getAttachment("tamed")); + + creature.getObservers().stream().map(Client::getParent).filter(obj -> obj.inRange(creature.getWorldPosition(), 15)).forEach((obj) -> { + if(new Random().nextFloat() <= 0.5 || creature.isInCombat() || isStalking) { + /*if(mobileTemplate.isStalker()) { + setFollowObject((CreatureObject) obj); + setCurrentState(new StalkState()); + } else */ + + if (creature.getAttachment("IsBeingTamed")!=null) + return; + + if (obj instanceof CreatureObject){ + CreatureObject addedObject = (CreatureObject) obj; + if (addedObject.getCalledPet()!=null){ + CreatureObject calledPet = addedObject.getCalledPet(); + if (calledPet.getPosture() != 13 && calledPet.getPosture() != 14){ + addDefender(calledPet); + } + } + if (addedObject.getPosture() != 13 && addedObject.getPosture() != 14){ + addDefender(addedObject); } } - if (addedObject.getPosture() != 13 && addedObject.getPosture() != 14){ - addDefender(addedObject); - } } - } - }); + }); + } } catch (Exception e) { e.printStackTrace(); } @@ -163,75 +183,62 @@ public class AIActor { if(creature.getFaction().length()>0 || !creature.getOption(Options.AGGRESSIVE)) { factionCheckTask = scheduler.scheduleAtFixedRate(() -> { try { - - // this is difficult, should NPC not fight when no player is near? || creature.getObservers().isEmpty() - if(creature == null || creature.getFactionStatus()!=FactionStatus.Combatant || creature.isInCombat()) - return; - - creature.getObservers().stream().map(Client::getParent).filter(obj -> obj.inRange(creature.getWorldPosition(), 15)).forEach((obj) -> { - if(new Random().nextFloat() <= 0.5 || creature.isInCombat()) { -// DevLog.debugout("Charon", "CHECK faction creature ", "added " + creature.getFaction()); -// DevLog.debugout("Charon", "CHECK faction obj", "added " + ((TangibleObject)obj).getFaction()); -// DevLog.debugout("Charon", "CHECK factionCheckTask", "added " + obj.getCustomName()); -// DevLog.debugout("Charon", "CHECK isFactionEnemy", "res " + NGECore.getInstance().factionService.isFactionEnemy((TangibleObject)creature, (TangibleObject)obj)); - if (obj instanceof CreatureObject && NGECore.getInstance().factionService.isFactionEnemy((TangibleObject)creature, (TangibleObject)obj)){ - CreatureObject addedObject = (CreatureObject) obj; - if (addedObject.getCalledPet()!=null){ - CreatureObject calledPet = addedObject.getCalledPet(); - if (calledPet.getPosture() != 13 && calledPet.getPosture() != 14){ - addDefender(calledPet); - } - } - if (addedObject.getPosture() != 13 && addedObject.getPosture() != 14 && ! addedObject.getOption(Options.INVULNERABLE)){ - addDefender(addedObject); - DevLog.debugoutai(this,"Charon", "faction creature ", "added " + creature.getFaction()); - DevLog.debugoutai(this,"Charon", "faction obj", "added " + ((TangibleObject)obj).getFaction()); - DevLog.debugoutai(this,"Charon", "factionCheckTask", "added " + obj.getCustomName()); - } - - } - } - }); - - NGECore.getInstance().simulationService.getAllNearNonSameFactionNPCs(15, creature).forEach((obj) -> { - if(new Random().nextFloat() <= 0.5 || creature.isInCombat()) { -// DevLog.debugout("Charon", "CHECK faction creature ", "added " + creature.getFaction()); -// DevLog.debugout("Charon", "CHECK faction obj", "added " + ((TangibleObject)obj).getFaction()); -// DevLog.debugout("Charon", "CHECK factionCheckTask", "added " + obj.getCustomName()); -// DevLog.debugout("Charon", "CHECK isFactionEnemy", "res " + NGECore.getInstance().factionService.isFactionEnemy((TangibleObject)creature, (TangibleObject)obj)); - if (obj instanceof CreatureObject && NGECore.getInstance().factionService.isFactionEnemy((TangibleObject)creature, (TangibleObject)obj)){ - CreatureObject addedObject = (CreatureObject) obj; - if (addedObject.getCalledPet()!=null){ - CreatureObject calledPet = addedObject.getCalledPet(); - if (calledPet.getPosture() != 13 && calledPet.getPosture() != 14 & ! calledPet.getOption(Options.INVULNERABLE)){ - addDefender(calledPet); - } - } - if (addedObject.getPosture() != 13 && addedObject.getPosture() != 14 & ! addedObject.getOption(Options.INVULNERABLE)){ - addDefender(addedObject); - DevLog.debugoutai(this,"Charon", "faction creature ", "added " + creature.getFaction()); - DevLog.debugoutai(this,"Charon", "faction obj", "added " + ((TangibleObject)obj).getFaction()); - DevLog.debugoutai(this,"Charon", "factionCheckTask", "added " + obj.getCustomName()); - } + if (AIactive){ + // this is difficult, should NPC not fight when no player is near? || creature.getObservers().isEmpty() + if(creature == null || creature.getFactionStatus()!=FactionStatus.Combatant || creature.isInCombat()) + return; + if(this.getFollowObject() != null){ // Don't search if actor has valid target + CreatureObject addedCreature = null; + TangibleObject addedObject = null; + if (this.getFollowObject() instanceof TangibleObject){ + addedObject = (TangibleObject) this.getFollowObject(); + if (addedObject.getConditionDamage()>=addedObject.getMaximumCondition()) + return; + } + if (this.getFollowObject() instanceof CreatureObject){ + addedCreature = (CreatureObject) this.getFollowObject(); + if (addedCreature.getPosture() != 13 && addedCreature.getPosture() != 14) + return; } } - }); - - NGECore.getInstance().simulationService.getAllNearNonSameFactionTANOs(15, creature).forEach((obj) -> { - if(new Random().nextFloat() <= 0.5 || creature.isInCombat()) { - DevLog.debugoutai(this,"Charon", "TANO1 CHECK", creature.getTemplate() + " spotted near " + obj.getTemplate()); -// DevLog.debugout("Charon", "TANO CHECK faction obj", "added " + ((TangibleObject)obj).getFaction()); -// DevLog.debugout("Charon", "TANO CHECK factionCheckTask", "added " + obj.getCustomName()); -// DevLog.debugout("Charon", "TANO CHECK isFactionEnemy", "res " + NGECore.getInstance().factionService.isFactionEnemy((TangibleObject)creature, (TangibleObject)obj)); - if (obj instanceof TangibleObject && !(obj instanceof CreatureObject) && NGECore.getInstance().factionService.isFactionEnemy((TangibleObject)creature, (TangibleObject)obj)){ - TangibleObject addedObject = (TangibleObject) obj; - addDefender(addedObject); - DevLog.debugoutai(this,"Charon", "TANO1 faction ", creature.getTemplate() + "added " + creature.getFaction()); - DevLog.debugoutai(this,"Charon", "TANO1 faction obj", "added " + ((TangibleObject)obj).getFaction()); - DevLog.debugoutai(this,"Charon", "TANO1 factionCheckTask", "added " + obj.getCustomName()); + + // Check for near targets + float[] closestDist = {9999F}; + TangibleObject[] closestCreature = {null}; + + NGECore.getInstance().simulationService.getAllNearNonSameFactionTargets(15, creature).forEach((obj) -> { + if(new Random().nextFloat() <= 0.5 || creature.isInCombat()) { + if (obj instanceof CreatureObject && NGECore.getInstance().factionService.isFactionEnemy((TangibleObject)creature, (CreatureObject)obj)){ + CreatureObject addedObject = (CreatureObject) obj; + if (addedObject.getCalledPet()!=null){ + CreatureObject calledPet = addedObject.getCalledPet(); + if (NGECore.getInstance().aiService.distanceSquared2D(creature.getWorldPosition(), obj.getWorldPosition()) { @@ -725,4 +743,33 @@ public class AIActor { public void setActorAlive(boolean actorAlive) { this.actorAlive = actorAlive; } + + public int getProgressionMarker() { + return progressionMarker; + } + + public void setProgressionMarker(int progressionMarker) { + this.progressionMarker = progressionMarker; + } + + public boolean isAIactive() { + return AIactive; + } + + public void setAIactive(boolean aIactive) { + AIactive = aIactive; + } + + public void prepareDeletion() { + if(this.creature!=null){ + lastPositionBeforeStateChange = this.creature.getWorldPosition(); + this.creature.getDefendersList().clear(); + this.setFollowObject(null); + } + this.setIntendedPrimaryAIState(new IdleState()); + patrolPoints.clear(); + movementPoints.clear(); + actorAlive = false; // stop moving + AIactive = false; // stop reacting to attacks + } } diff --git a/src/services/ai/AIService.java b/src/services/ai/AIService.java index 69749a51..ac63a35a 100644 --- a/src/services/ai/AIService.java +++ b/src/services/ai/AIService.java @@ -230,6 +230,14 @@ public class AIService { return this.checkerAI; } + public float distanceSquared2D(Point3D p2, Point3D p1){ + return (p2.x - p1.x) * (p2.x - p1.x) + (p2.z - p1.z) * (p2.z - p1.z); + } + + public float distanceSquared(Point3D p2, Point3D p1){ + 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 logAI(String logMsg){ if (checkDeveloperIdentity()){ System.err.println("AI-LOG: " + logMsg); diff --git a/src/services/ai/states/AIState.java b/src/services/ai/states/AIState.java index b65bad65..39ac0b2d 100644 --- a/src/services/ai/states/AIState.java +++ b/src/services/ai/states/AIState.java @@ -87,130 +87,149 @@ public abstract class AIState { return false; } - if (movementPoints.size() != 0){ - try{ - targetPosition = movementPoints.firstElement(); - } catch (NoSuchElementException e) { - targetPosition = currentPosition; + if (movementPoints.size() != 0){ + try{ + targetPosition = movementPoints.firstElement(); + } catch (NoSuchElementException e) { + targetPosition = currentPosition; + } + } + + if (actor.getCurrentState().getClass().equals(PatrolState.class)){ + targetPosition = patrolPoints.get(actor.getPatrolPointIndex()); + } + + if (actor.getCurrentState().getClass().equals(WithdrawalState.class)){ + targetPosition = patrolPoints.get(actor.getPatrolPointIndex()); + } + + if (actor.getCurrentState().getClass().equals(FollowState.class)){ + targetPosition = actor.getFollowObject().getWorldPosition(); + } + + Vector path = core.aiService.findPath(creature.getPlanetId(), currentPosition, targetPosition); + + if (targetPosition==null){ + DevLog.debugoutai(actor, "Charon", "AI State findnewpos", "Breakout2"); + return false; + } + float distanceToTarget = targetPosition.getWorldPosition().getDistance(creature.getWorldPosition()); + + if(distanceToTarget > stopDistance) { + maxDistance = Math.min(speed, distanceToTarget - stopDistance); + } else { + /* + DevLog.debugoutai(actor, "Charon", "AI State findnewpos", "Breakout3"); + if (actor.getCurrentState().getClass().equals(RetreatState.class)){ + if(actor.getIntendedPrimaryAIState().equals(PatrolState.class)){ + actor.setCurrentState(new PatrolState()); + } + if(actor.getIntendedPrimaryAIState().equals(FollowState.class)){ + actor.setCurrentState(new FollowState()); + } + if(actor.getIntendedPrimaryAIState().equals(LoiterState.class)){ + actor.setCurrentState(new LoiterState()); } } + */ + return false; + } + + Point3D oldPosition = null; + float pathDistance = 0; + + - if (actor.getCurrentState().getClass().equals(PatrolState.class)){ - targetPosition = patrolPoints.get(actor.getPatrolPointIndex()); - } + for(int i = 1; i < path.size() && !finished; i++) { - if (actor.getCurrentState().getClass().equals(FollowState.class)){ - targetPosition = actor.getFollowObject().getWorldPosition(); - } + Point3D currentPathPosition = path.get(i); + cell = currentPathPosition.getCell(); - Vector path = core.aiService.findPath(creature.getPlanetId(), currentPosition, targetPosition); + if(oldPosition == null) + oldPosition = path.get(0); + Point3D oldWorldPos = oldPosition.getWorldPosition(); - if (targetPosition==null){ - DevLog.debugoutai(actor, "Charon", "AI State findnewpos", "Breakout2"); - return false; - } - float distanceToTarget = targetPosition.getWorldPosition().getDistance(creature.getWorldPosition()); - - if(distanceToTarget > stopDistance) { - maxDistance = Math.min(speed, distanceToTarget - stopDistance); - } else { - /* - DevLog.debugoutai(actor, "Charon", "AI State findnewpos", "Breakout3"); - if (actor.getCurrentState().getClass().equals(RetreatState.class)){ - if(actor.getIntendedPrimaryAIState().equals(PatrolState.class)){ - actor.setCurrentState(new PatrolState()); - } - if(actor.getIntendedPrimaryAIState().equals(FollowState.class)){ - actor.setCurrentState(new FollowState()); - } - if(actor.getIntendedPrimaryAIState().equals(LoiterState.class)){ - actor.setCurrentState(new LoiterState()); - } - } - */ - return false; - } - - Point3D oldPosition = null; - float pathDistance = 0; - - - - for(int i = 1; i < path.size() && !finished; i++) { + pathDistance += oldWorldPos.getDistance(currentPathPosition.getWorldPosition()); + if(pathDistance >= maxDistance || i == path.size() - 1 || currentPathPosition.getCell() != creature.getContainer()) { - Point3D currentPathPosition = path.get(i); - cell = currentPathPosition.getCell(); + finished = true; - if(oldPosition == null) - oldPosition = path.get(0); - Point3D oldWorldPos = oldPosition.getWorldPosition(); - - pathDistance += oldWorldPos.getDistance(currentPathPosition.getWorldPosition()); - if(pathDistance >= maxDistance || i == path.size() - 1 || currentPathPosition.getCell() != creature.getContainer()) { - - finished = true; - - if(movementPoints.size() != 0 && currentPosition.getWorldPosition().getDistance(currentPathPosition.getWorldPosition()) <= stopDistance && cell == creature.getContainer()) { - if(i == path.size() - 1 && movementPoints.size()>0) + if(movementPoints.size() != 0 && currentPosition.getWorldPosition().getDistance(currentPathPosition.getWorldPosition()) <= stopDistance && cell == creature.getContainer()) { + if(i == path.size() - 1 && movementPoints.size()>0){ + try { movementPoints.remove(0); - finished = false; - } else { + } catch (ArrayIndexOutOfBoundsException ex){} // No idea why a vector with size>0 throws this sometimes + } + finished = false; + } else { + + if(cell == null) + oldPosition = oldPosition.getWorldPosition(); + else { + if(oldPosition.getCell() == null) + oldPosition = core.simulationService.convertPointToModelSpace(oldPosition, cell.getContainer()); + } - if(cell == null) - oldPosition = oldPosition.getWorldPosition(); - else { - if(oldPosition.getCell() == null) - oldPosition = core.simulationService.convertPointToModelSpace(oldPosition, cell.getContainer()); - } + if(pathDistance > maxDistance) { - if(pathDistance > maxDistance) { + //float distance = oldWorldPos.getDistance(currentPathPosition.getWorldPosition()); + float distance = NGECore.getInstance().aiService.distanceSquared(oldWorldPos, currentPathPosition.getWorldPosition()); // Ok to use, as distance is not directly used later + float travelDistance = distance - (pathDistance - maxDistance); + // temp fix for melee npcs + travelDistance *= 1.3; + if(travelDistance <= 0) { + newX = currentPathPosition.x; + newZ = currentPathPosition.z; + } else { - float distance = oldWorldPos.getDistance(currentPathPosition.getWorldPosition()); - float travelDistance = distance - (pathDistance - maxDistance); - // temp fix for melee npcs - travelDistance *= 1.3; - if(travelDistance <= 0) { + if(distance > 0) { + dx = currentPathPosition.x - oldPosition.x; + dz = currentPathPosition.z - oldPosition.z; + //float deltaDist = (float) Math.sqrt((dx * dx) + (dz * dz)); + int fullong=0; // Approximation->faster + int halfshort=0; + float tempdx = dx; + float tempdz = dz; + if (tempdx<0) + tempdx*=-1; + if (tempdz<0) + tempdz*=-1; + if(tempdx > tempdz) { + fullong = (int)(tempdx*100); + halfshort = ((int)(tempdz*100)) >> 1; + } else { + fullong = (int)(tempdz*100); + halfshort = ((int)(tempdx*100)) >> 1; + } + float deltaDist = (fullong + halfshort)/100; + + newX = (float) (oldPosition.x + (speed * (dx / deltaDist))); + newZ = (float) (oldPosition.z + (speed * (dz / deltaDist))); + + + } else { newX = currentPathPosition.x; newZ = currentPathPosition.z; - } else { - - if(distance > 0) { - dx = currentPathPosition.x - oldPosition.x; - dz = currentPathPosition.z - oldPosition.z; - float deltaDist = (float) Math.sqrt((dx * dx) + (dz * dz)); - - - newX = (float) (oldPosition.x + (speed * (dx / deltaDist))); - newZ = (float) (oldPosition.z + (speed * (dz / deltaDist))); - -// if (creature.getPlanet().getName().equals("talus") && creature.getTemplate().contains("stormtrooper")){ -// float magnitude = (float)Math.sqrt(newX*newX + newZ*newZ); -// System.out.println("magnitude: " + magnitude); -// } - - } else { - newX = currentPathPosition.x; - newZ = currentPathPosition.z; - } - } - if(cell == null) { - float height = core.terrainService.getHeight(creature.getPlanetId(), newX, newZ); - newY = height; - } else { - newY = currentPathPosition.y; - } + } + + if(cell == null) { + float height = core.terrainService.getHeight(creature.getPlanetId(), newX, newZ); + newY = height; + } else { + newY = currentPathPosition.y; } } - - } else { - newX = currentPathPosition.x; - newZ = currentPathPosition.z; - newY = core.terrainService.getHeight(creature.getPlanetId(), newX, newZ); } - oldPosition = currentPathPosition; + + } else { + newX = currentPathPosition.x; + newZ = currentPathPosition.z; + newY = core.terrainService.getHeight(creature.getPlanetId(), newX, newZ); } + oldPosition = currentPathPosition; + } //} newPosition.x = newX; newPosition.y = newY; @@ -712,10 +731,7 @@ public abstract class AIState { NGECore core = NGECore.getInstance(); CreatureObject creature = actor.getCreature(); -// if (creature.getPlanet().getName().equals("talus") && creature.getTemplate().contains("stormtrooper")){ -// System.out.println("actor " + actor.getActorID() + " stateID " + stateID + " creatureID"+ creature.getObjectID()+ " TIMEDIFF: " + (System.currentTimeMillis()-lastExecutionTime)); -// lastExecutionTime = System.currentTimeMillis(); -// } + if(creature.getPosture() == 14 || creature.getPosture() == 13) { actor.setFollowObject(null); return; @@ -740,8 +756,8 @@ public abstract class AIState { } Point3D currentPosition = creature.getWorldPosition(); - if(target != null && !core.simulationService.checkLineOfSight(creature, target)) - maxDistance = 1; +// if(target != null && !core.simulationService.checkLineOfSight(creature, target)) +// maxDistance = 1; // Manage Patrol points maxDistance = 1; @@ -749,17 +765,29 @@ public abstract class AIState { return; Point3D currentDestination = actor.getPatrolPoints().get(actor.getPatrolPointIndex()); //System.out.println("currentPosition.getDistance2D(currentDestination) " + currentPosition.getDistance2D(currentDestination)); - if (currentPosition.getDistance2D(currentDestination)<2){ + if (NGECore.getInstance().aiService.distanceSquared2D(currentPosition, currentDestination)<4){ + //if (currentPosition.getDistance2D(currentDestination)<4){ if (actor.getPatrolPointIndex()=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!"); + } + return; // Last Patrol point reached and no loop } } @@ -771,6 +799,110 @@ public abstract class AIState { + if(!foundNewPos || (newPosition.x == 0 && newPosition.z == 0)) + return; + + Point3D newWorldPos = newPosition.getWorldPosition(); + float direction = (float) Math.atan2(newWorldPos.x - currentPosition.x, newWorldPos.z - currentPosition.z); + if(direction < 0) + direction = (float) (2 * Math.PI + direction); + Quaternion quaternion = new Quaternion((float) Math.cos(direction / 2), 0, (float) Math.sin(direction / 2), 0); + if (quaternion.y < 0.0f && quaternion.w > 0.0f) { + quaternion.y *= -1; + quaternion.w *= -1; + } + +// if (newPosition.getCell()==null) +// System.out.println("newPosition.getCell() is NULL"); + try{ + core.simulationService.moveObject(creature, newPosition, quaternion, creature.getMovementCounter(), speed, newPosition.getCell()); + } catch (NullPointerException e) { + // Just to identify what exactly is null here +// if (creature==null) +// System.out.print("creature==null" ); +// if (newPosition==null) +// System.out.print("newPosition==null" ); +// if (quaternion==null) +// System.out.print("quaternion==null" ); +// if (newPosition.getCell()==null) +// System.out.print("newPosition.getCell()==null" ); +// +// System.out.print("creature.getMovementCounter() " + creature.getMovementCounter()); + } + + } + + public void doWithdrawal(AIActor actor) { + //NGECore.getInstance().aiService.logAI("AI STATE doPatrol"); + + NGECore core = NGECore.getInstance(); + + if(actor==null) + return; + CreatureObject creature = actor.getCreature(); + if(creature==null) + return; + +// if (creature.getPlanet().getName().equals("talus") && creature.getTemplate().contains("stormtrooper")){ +// System.out.println("actor " + actor.getActorID() + " stateID " + stateID + " creatureID"+ creature.getObjectID()+ " TIMEDIFF: " + (System.currentTimeMillis()-lastExecutionTime)); +// lastExecutionTime = System.currentTimeMillis(); +// } + if(creature.getPosture() == 14 || creature.getPosture() == 13) { + actor.setFollowObject(null); + return; + } + +// if (creature.isInCombat()){ +// return; +// } + + + TangibleObject target = actor.getFollowObject(); + float speed = (float) creature.getWalkSpeed(); + float maxDistance = 6; + if(creature.getWeaponId() != 0) { + WeaponObject weapon = (WeaponObject) core.objectService.getObject(creature.getWeaponId()); + if(weapon != null) + maxDistance = weapon.getMaxRange() - 1; + } else if(creature.getSlottedObject("default_weapon") != null) { + WeaponObject weapon = (WeaponObject) creature.getSlottedObject("default_weapon"); + if(weapon != null) + maxDistance = weapon.getMaxRange() - 1; + } + Point3D currentPosition = creature.getWorldPosition(); + +// if(target != null && !core.simulationService.checkLineOfSight(creature, target)) +// maxDistance = 1; + + // Manage Patrol points + maxDistance = 1; + if (actor.getPatrolPoints().size()==0) + return; + if (actor.getPatrolPointIndex()<=0) + actor.setPatrolPointIndex(0); + Point3D currentDestination = actor.getPatrolPoints().get(actor.getPatrolPointIndex()); + //System.out.println("currentPosition.getDistance2D(currentDestination) " + currentPosition.getDistance2D(currentDestination)); + if (NGECore.getInstance().aiService.distanceSquared2D(currentPosition, currentDestination)<4){ + //if (currentPosition.getDistance2D(currentDestination)<4){ + if (actor.getPatrolPointIndex()>0){ + actor.setPatrolPointIndex(actor.getPatrolPointIndex()-1); + } else { + if (actor!=null) + actor.destroyActor(); + if (creature!=null){ + core.simulationService.remove(creature, creature.getWorldPosition().x, creature.getWorldPosition().z, true); // Make sure + core.objectService.destroyObject(creature.getObjectID()); + } + return; // First Patrol point reached + } + } + + Point3D newPosition = new Point3D(); + boolean foundNewPos = findNewPosition(actor, speed, maxDistance, newPosition); + + + + if(!foundNewPos || (newPosition.x == 0 && newPosition.z == 0)) return; diff --git a/src/services/ai/states/AttackState.java b/src/services/ai/states/AttackState.java index 71cba691..39e39ee4 100644 --- a/src/services/ai/states/AttackState.java +++ b/src/services/ai/states/AttackState.java @@ -67,6 +67,9 @@ public class AttackState extends AIState { @Override public byte move(AIActor actor) { CreatureObject creature = actor.getCreature(); + if (creature==null) + return StateResult.FINISHED; + if(creature.getPosture() == 14) return StateResult.DEAD; actor.getMovementPoints().clear(); @@ -77,12 +80,15 @@ public class AttackState extends AIState { if (actor.getIntendedPrimaryAIState().getClass().equals(FollowState.class)) checkPosition = creature.getWorldPosition(); - if(checkPosition.getDistance(creature.getWorldPosition()) > 128 || NGECore.getInstance().terrainService.isWater(creature.getPlanetId(), actor.getFollowObject().getWorldPosition())) { - actor.removeDefender(actor.getFollowObject()); - //actor.scheduleMovement(); - //return StateResult.UNFINISHED; - return StateResult.FINISHED; - } + try { + if(checkPosition.getDistance(creature.getWorldPosition()) > 128 || NGECore.getInstance().terrainService.isWater(creature.getPlanetId(), actor.getFollowObject().getWorldPosition())) { + actor.removeDefender(actor.getFollowObject()); + //actor.scheduleMovement(); + //return StateResult.UNFINISHED; + return StateResult.FINISHED; + } + } catch (Exception ex){} // When the followobject turns becomes null inside the if scope an npe can occur + float maxDistance = 0; if(creature.getWeaponId() != 0) { WeaponObject weapon = (WeaponObject) NGECore.getInstance().objectService.getObject(creature.getWeaponId()); @@ -104,9 +110,13 @@ public class AttackState extends AIState { return StateResult.UNFINISHED; } } catch (Exception e){ - DevLog.debugoutai(actor, "Charon", "AI Attack State Exception move method", "actor " + actor); + if (actor!=null) + DevLog.debugoutai(actor, "Charon", "AI Attack State Exception move method", "actor " + actor); + if (actor.getFollowObject()!=null) DevLog.debugoutai(actor, "Charon", "AI Attack State Exception move method", "actor.getFollowObject() " + actor.getFollowObject()); + if (actor.getFollowObject()!=null) DevLog.debugoutai(actor, "Charon", "AI Attack State Exception move method", "actor.getFollowObject().getWorldPosition() " + actor.getFollowObject().getWorldPosition()); + if (creature!=null) DevLog.debugoutai(actor, "Charon", "AI Attack State Exception move method", "creature.getWorldPosition() " + creature.getWorldPosition()); } @@ -208,6 +218,29 @@ public class AttackState extends AIState { actor.scheduleRecovery(); return StateResult.UNFINISHED; } + } else { + TangibleObject targetObject = (TangibleObject) target; + if((targetObject.getConditionDamage()>=targetObject.getMaximumCondition())) { + + actor.setFollowObject(actor.getHighestDamageDealer()); + target = (CreatureObject) actor.getFollowObject(); + if(target == null) + { + creature.setLookAtTarget(0); + creature.setIntendedTarget(0); + + } + actor.setFollowObject(null); + actor.removeDefender(target); + + if (actor.getIntendedPrimaryAIState().getClass().equals(PatrolState.class)) + actor.setCurrentState(new RetreatState()); // Should be Patrol state + else { + actor.setCurrentState(new RetreatState()); // Should be Patrol state + } + return StateResult.FINISHED; + } + } if(target.getWorldPosition().getDistance(creature.getWorldPosition()) > maxDistance) { diff --git a/src/services/ai/states/DeathState.java b/src/services/ai/states/DeathState.java index 9992feb2..bb49a07e 100644 --- a/src/services/ai/states/DeathState.java +++ b/src/services/ai/states/DeathState.java @@ -46,7 +46,7 @@ public class DeathState extends AIState { if (killer.isPlayer()) // No point to do this for NPCs NGECore.getInstance().lootService.DropLoot(killer,(TangibleObject)(actor.getCreature())); } - actor.destroyActor(); // to prevent standing up right after death + //actor.destroyActor(); // to prevent standing up right after death return 0; } diff --git a/src/services/ai/states/PatrolState.java b/src/services/ai/states/PatrolState.java index ee32da39..ee61d713 100644 --- a/src/services/ai/states/PatrolState.java +++ b/src/services/ai/states/PatrolState.java @@ -64,7 +64,7 @@ public class PatrolState extends AIState { } CreatureObject creature = actor.getCreature(); if(creature.isInCombat()){ - System.out.println("PatrolState locking!"); + //System.out.println("PatrolState locking!"); locked = true; return StateResult.FINISHED; } diff --git a/src/services/ai/states/RepositionState.java b/src/services/ai/states/RepositionState.java index c987ed52..ce7dce90 100644 --- a/src/services/ai/states/RepositionState.java +++ b/src/services/ai/states/RepositionState.java @@ -5,6 +5,7 @@ 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; /** @@ -12,6 +13,9 @@ import tools.DevLog; */ public class RepositionState extends AIState{ + + int prog = 10; + @Override public byte onEnter(AIActor actor) { DevLog.debugoutai(actor, "Charon", "AI RepositionState", "onEnter"); @@ -27,53 +31,123 @@ public class RepositionState extends AIState{ TangibleObject tempObject = new TangibleObject(); // LOS overload for pos and creature does not work correctly tempObject.setPosition(scanPosition); boolean breakout = false; - while (!NGECore.getInstance().simulationService.checkLineOfSight2(target,scanPosition) && !breakout){ + boolean foundPos = false; + actor.setProgressionMarker(1); + long repositionCalculationStart = System.currentTimeMillis(); // Limit time this is calculated to prevent deadloops + while (!NGECore.getInstance().simulationService.checkLineOfSight(target,scanPosition) && !breakout || System.currentTimeMillis()>repositionCalculationStart+2000){ // Quick, light-weight way to get the AI into a firing LOS position // ToDo: Check if the Quadnode at the LOS position contains a structure // Required: Add according method to Quadtree.java - for (int x=2;x<50 && (!NGECore.getInstance().simulationService.checkLineOfSight2(target,scanPosition));x=x+2){ - scanPosition = new Point3D(creaturePosition.x+x,creaturePosition.y,creaturePosition.z); + + boolean abortCondition = false; + for (int x=1;x<50 && !abortCondition;x=x+1){ + if (NGECore.getInstance().simulationService.checkLineOfSight(target,new Point3D(creaturePosition.x+x,creaturePosition.y,creaturePosition.z)) && !NGECore.getInstance().terrainService.isWater(creature.getPlanetId(), creaturePosition.x+x, creaturePosition.z)){ + scanPosition = new Point3D(creaturePosition.x+x,creaturePosition.y,creaturePosition.z); + abortCondition = true; + } } - for (int x=2;x>-50 && (!NGECore.getInstance().simulationService.checkLineOfSight2(target,scanPosition));x=x-2){ - scanPosition = new Point3D(creaturePosition.x+x,creaturePosition.y,creaturePosition.z); + for (int x=-1;x>-50 && !abortCondition;x=x-1){ + if (NGECore.getInstance().simulationService.checkLineOfSight(target,new Point3D(creaturePosition.x+x,creaturePosition.y,creaturePosition.z)) && !NGECore.getInstance().terrainService.isWater(creature.getPlanetId(), creaturePosition.x+x, creaturePosition.z)){ + scanPosition = new Point3D(creaturePosition.x+x,creaturePosition.y,creaturePosition.z); + abortCondition = true; + } } - for (int z=2;z<50 && (!NGECore.getInstance().simulationService.checkLineOfSight2(target,scanPosition));z=z+2){ - scanPosition = new Point3D(creaturePosition.x,creaturePosition.y,creaturePosition.z+z); + for (int z=1;z<50 && !abortCondition;z=z+1){ + if (NGECore.getInstance().simulationService.checkLineOfSight(target,new Point3D(creaturePosition.x,creaturePosition.y,creaturePosition.z+z)) && !NGECore.getInstance().terrainService.isWater(creature.getPlanetId(), creaturePosition.x, creaturePosition.z+z)){ + scanPosition = new Point3D(creaturePosition.x,creaturePosition.y,creaturePosition.z+z); + abortCondition = true; + } } - for (int z=2;z>-50 && (!NGECore.getInstance().simulationService.checkLineOfSight2(target,scanPosition));z=z-2){ - scanPosition = new Point3D(creaturePosition.x,creaturePosition.y,creaturePosition.z+z); + for (int z=-1;z>-50 && !abortCondition;z=z-1){ + if (NGECore.getInstance().simulationService.checkLineOfSight(target,new Point3D(creaturePosition.x,creaturePosition.y,creaturePosition.z+z)) && !NGECore.getInstance().terrainService.isWater(creature.getPlanetId(), creaturePosition.x, creaturePosition.z+z)){ + scanPosition = new Point3D(creaturePosition.x,creaturePosition.y,creaturePosition.z+z); + abortCondition = true; + } } -// if (!NGECore.getInstance().simulationService.checkLineOfSight2(target,scanPosition)) -// breakout=true; + actor.setProgressionMarker(2); + + if (!NGECore.getInstance().simulationService.checkLineOfSight(target,scanPosition)){ + foundPos=true; + } + // else // System.out.println("LOS found"); // breakout=true; } - actor.setRepositionLocation(scanPosition); - actor.setRepositionStartTime(System.currentTimeMillis()); + actor.setProgressionMarker(3); + if (foundPos){ + actor.setRepositionLocation(scanPosition); + actor.setRepositionStartTime(System.currentTimeMillis()); + } else { + float positionY = NGECore.getInstance().terrainService.getHeight(target.getPlanetId(), target.getPosition().x, target.getPosition().z); + actor.setRepositionLocation(new Point3D(target.getWorldPosition().x,positionY,target.getWorldPosition().z)); + actor.setRepositionStartTime(System.currentTimeMillis()+5000); // give it more time + } - return 0; + actor.scheduleMovement(); + return StateResult.UNFINISHED; } @Override public byte onExit(AIActor actor) { - // TODO Auto-generated method stub + // TODO Auto-generated method stub + actor.setProgressionMarker(9); + TangibleObject followObject = actor.getFollowObject(); + if (followObject==null) + return StateResult.FINISHED; + + if (followObject instanceof CreatureObject) + if (((CreatureObject) followObject).getPosture()==14 || ((CreatureObject) followObject).getPosture()==13) + actor.setFollowObject(null); + + if (! (followObject instanceof CreatureObject)) + if(followObject.getConditionDamage()>=followObject.getMaximumCondition()) + actor.setFollowObject(null); + DevLog.debugoutai(actor, "Charon", "AI RepositionState", "exit"); - return 0; + + return StateResult.FINISHED; } @Override public byte move(AIActor actor) { DevLog.debugoutai(actor, "Charon", "AI RepositionState", "move"); - + actor.setProgressionMarker(prog++); Point3D newPosition = actor.getRepositionLocation(); TangibleObject target = actor.getLastTarget(); - if (target==null) + if (target==null){ + if (actor.getIntendedPrimaryAIState().getClass().equals(PatrolState.class)) + actor.setCurrentState(new RetreatState()); + else { + actor.setCurrentState(new RetreatState()); + } return StateResult.FINISHED; + } + + if (target instanceof CreatureObject) + if (((CreatureObject) target).getPosture()==14 || ((CreatureObject) target).getPosture()==13){ + if (actor.getIntendedPrimaryAIState().getClass().equals(PatrolState.class)) + actor.setCurrentState(new RetreatState()); + else { + actor.setCurrentState(new RetreatState()); + } + return StateResult.FINISHED; + } + + if (! (target instanceof CreatureObject)) + if(target.getConditionDamage()>=target.getMaximumCondition()){ + if (actor.getIntendedPrimaryAIState().getClass().equals(PatrolState.class)) + actor.setCurrentState(new RetreatState()); + else { + actor.setCurrentState(new RetreatState()); + } + return StateResult.FINISHED; + } if (newPosition.getDistance2D(target.getWorldPosition())<0.5 || System.currentTimeMillis()>actor.getRepositionStartTime()+5000){ actor.addDefender(target); + actor.setCurrentState(new AttackState()); return StateResult.FINISHED; } diff --git a/src/services/ai/states/WithdrawalState.java b/src/services/ai/states/WithdrawalState.java new file mode 100644 index 00000000..05facb88 --- /dev/null +++ b/src/services/ai/states/WithdrawalState.java @@ -0,0 +1,67 @@ +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 { +private boolean locked = false; + + + @Override + public byte onEnter(AIActor actor) { + + DevLog.debugoutai(actor, "Charon", "AI WithdrawalState", "WITHDRAWAL ENTERED!"); + CreatureObject creature = actor.getCreature(); + if (creature==null) + return 0; + creature.setOptions(Options.INVULNERABLE, true); + if(creature.getPosture() == 14) + return StateResult.DEAD; + actor.setPatrolPointIndex(actor.getPatrolPointIndex()-1); + actor.scheduleMovement(); + actor.scheduleRecovery(); + return StateResult.UNFINISHED; + } + + @Override + public byte onExit(AIActor actor) { + DevLog.debugoutai(actor, "Charon", "AI WithdrawalState", "EXITING WITHDRAWAL STATE!"); + + return StateResult.FINISHED; + } + + @Override + public byte move(AIActor actor) { + DevLog.debugoutai(actor, "Charon", "AI WithdrawalState", "WITHDRAWAL MOVE!"); + if (locked){ + System.out.println("WITHDRAWAL locked!"); + return StateResult.FINISHED; + } + if (actor==null) + return StateResult.FINISHED; + CreatureObject creature = actor.getCreature(); + if (creature==null) + return StateResult.FINISHED; + +// if(creature.isInCombat()){ +// //System.out.println("PatrolState locking!"); +// locked = true; +// return StateResult.FINISHED; +// } + doWithdrawal(actor); + actor.scheduleMovement(); + return StateResult.UNFINISHED; + } + + @Override + public byte recover(AIActor actor) { + if (actor.getFollowObject()!=null) + System.out.println("recover follow object is not null"); + if (actor.getFollowObject()!=null) + System.out.println("recover follow object is not null"); + return StateResult.UNFINISHED; + } +} diff --git a/src/services/combat/CombatService.java b/src/services/combat/CombatService.java index 79a827fe..4a941e55 100644 --- a/src/services/combat/CombatService.java +++ b/src/services/combat/CombatService.java @@ -795,6 +795,7 @@ public class CombatService implements INetworkDispatch { String animationStr = command.getRandomAnimation(weapon); // choosing turretShot as default attack, results in a zero length string if (weapon.getTemplate().contains("atst_ranged")) animationStr="fire_1_single_light"; + CombatAction combatAction = new CombatAction(CRC.StringtoCRC(animationStr), attacker.getObjectID(), weapon.getObjectID(), target.getObjectID(), command.getCommandCRC()); // int turret_fire = 0xD334C0B8; // 0xA7595B4E @@ -1089,10 +1090,14 @@ public class CombatService implements INetworkDispatch { } + if (!attacker.isPlayer()){ + if (attacker.hasBuff("expertise_damage_npc")){ + rawDamage *=2; // tower_defense buff + } + } } - return rawDamage; - + return rawDamage; } private float calculateDamageForInstallation(InstallationObject attacker, TangibleObject target, WeaponObject weapon, CombatCommand command) { diff --git a/src/services/gcw/FactionService.java b/src/services/gcw/FactionService.java index 5f1e3854..0ac7621a 100644 --- a/src/services/gcw/FactionService.java +++ b/src/services/gcw/FactionService.java @@ -240,13 +240,22 @@ public class FactionService implements INetworkDispatch { PyObject method = core.scriptService.getMethod("scripts/faction/", objectFaction, "isEnemy"); if (method != null && method.isCallable()) { - return ((method.__call__(Py.java2py(targetFaction)).asInt() == 1) ? true : false); + int checkResult = method.__call__(Py.java2py(targetFaction)).asInt(); + if (objectFaction.equals("rebel") || objectFaction.equals("imperial")){ + if (object.getFactionStatus()==FactionStatus.OnLeave) + checkResult=0; + } + if (targetFaction.equals("rebel") || targetFaction.equals("imperial")){ + if (target.getFactionStatus()==FactionStatus.OnLeave) + checkResult=0; + } + return ((checkResult == 1) ? true : false); } } return false; } - + /* * Calculates the target's pvp bitmask based on the person's * faction standing and the enemy's options bitmask. @@ -267,6 +276,10 @@ public class FactionService implements INetworkDispatch { PlayerObject ghost = (PlayerObject) object.getSlottedObject("ghost"); int pvpBitmask = 0; + + if (target==null) + return 0; // Avoids infinite loading screen when another player character has been deleted, + // but is still referenced by some collections being null if (object == target) { pvpBitmask |= PvpStatus.Self; @@ -291,7 +304,7 @@ public class FactionService implements INetworkDispatch { if (target.getFactionStatus() == FactionStatus.SpecialForces) { pvpBitmask |= PvpStatus.Overt; } - + // Everything below assumes target is potentially attackable. if (!target.getOption(Options.ATTACKABLE) || target.getOption(Options.INVULNERABLE)) { return pvpBitmask; @@ -568,7 +581,14 @@ public class FactionService implements INetworkDispatch { upvpm.setStatus(NGECore.getInstance().factionService.calculatePvpStatus((CreatureObject) destination.getParent(), creo)); destination.getSession().write(upvpm.serialize()); } - if (obj instanceof InstallationObject){ + if (obj instanceof TangibleObject && !(obj instanceof CreatureObject)){ + TangibleObject tano = (TangibleObject) obj; + UpdatePVPStatusMessage upvpm = new UpdatePVPStatusMessage(tano.getObjectID()); + upvpm.setFaction(CRC.StringtoCRC(tano.getFaction())); + upvpm.setStatus(NGECore.getInstance().factionService.calculatePvpStatus((TangibleObject) destination.getParent(), tano)); + destination.getSession().write(upvpm.serialize()); + } + if (obj instanceof InstallationObject && !(obj instanceof TangibleObject)){ InstallationObject inso = (InstallationObject) obj; UpdatePVPStatusMessage upvpm = new UpdatePVPStatusMessage(inso.getObjectID()); upvpm.setFaction(CRC.StringtoCRC(inso.getFaction())); diff --git a/src/services/gcw/GCWPylon.java b/src/services/gcw/GCWPylon.java index c0cf0012..f00428bc 100644 --- a/src/services/gcw/GCWPylon.java +++ b/src/services/gcw/GCWPylon.java @@ -21,18 +21,34 @@ ******************************************************************************/ package services.gcw; -import java.util.Random; +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; import engine.resources.scene.Quaternion; -import main.NGECore; +import resources.datatables.FactionStatus; import resources.datatables.Factions; +import resources.datatables.Options; +import resources.datatables.WeaponType; import resources.objects.creature.CreatureObject; +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 @@ -44,50 +60,21 @@ public class GCWPylon extends TangibleObject{ private int pylonType = 0; private int pylonFaction = 0; private int spawnLevel = 0; - private int totalSpawnedUnits = 0; - private String[] soldierTemplates = new String[]{""}; - private String[] rebelSoldierTemplates1 = new String[]{""}; - private String[] rebelSoldierTemplates2 = new String[]{""}; - private String[] rebelSoldierTemplates3 = new String[]{"gcw_city_rebel_soldier"}; - private String[] imperialSoldierTemplates1 = new String[]{""}; - private String[] imperialSoldierTemplates2 = new String[]{""}; - private String[] imperialSoldierTemplates3 = new String[]{"elite_imperial_stormtrooper_90"}; + private int patrolRoute = 0; + private int resourceFilling = 0; + private int delay = 0; - private String[] vehicleTemplates = new String[]{""}; - private String[] rebelVehicleTemplates1 = new String[]{"rebel_invasion_at_xt"}; - private String[] rebelVehicleTemplates2 = new String[]{"rebel_invasion_at_xt"}; - private String[] rebelVehicleTemplates3 = new String[]{"rebel_invasion_at_xt"}; - private String[] imperialVehicleTemplates1 = new String[]{"imp_invasion_at_st"}; - private String[] imperialVehicleTemplates2 = new String[]{"imp_invasion_at_st"}; - private String[] imperialVehicleTemplates3 = new String[]{"imp_invasion_at_st"}; + private static Map typeStfMapping = new ConcurrentHashMap(); + static{ + typeStfMapping.put(PylonType.SoldierPatrol, "Soldier Patrol Pylon"); + typeStfMapping.put(PylonType.SoldierDefense, "Soldier Patrol Pylon"); + typeStfMapping.put(PylonType.VehiclePatrol, "Soldier Patrol Pylon"); + typeStfMapping.put(PylonType.SiegeVehiclePatrol, "Soldier Patrol Pylon"); + typeStfMapping.put(PylonType.Barricade, "Soldier Patrol Pylon"); + typeStfMapping.put(PylonType.Turret, "Soldier Patrol Pylon"); + typeStfMapping.put(PylonType.Tower, "Soldier Patrol Pylon"); + } - private String[] siegeVehicleTemplates = new String[]{""}; - private String[] rebelSiegeVehicleTemplates1 = new String[]{"rebel_invasion_hailfire_droid"}; - private String[] rebelSiegeVehicleTemplates2 = new String[]{"rebel_invasion_hailfire_droid"}; - private String[] rebelSiegeVehicleTemplates3 = new String[]{"rebel_invasion_hailfire_droid"}; - private String[] imperialSiegeVehicleTemplates1 = new String[]{"imp_invasion_at_at"}; - private String[] imperialSiegeVehicleTemplates2 = new String[]{"imp_invasion_at_at"}; - private String[] imperialSiegeVehicleTemplates3 = new String[]{"imp_invasion_at_at"}; - - private String barricadeTemplate = ""; - private String rebelBarricadeTemplate = "object/tangible/destructible/shared_gcw_rebel_barricade.iff"; - private String imperialBarricadeTemplate = "object/tangible/destructible/shared_gcw_imperial_barricade.iff"; - - - private String turretTemplates = ""; - private String[] rebelTurretTemplates1 = new String[]{""}; - private String[] rebelTurretTemplates2 = new String[]{""}; - private String[] rebelTurretTemplates3 = new String[]{"object/tangible/destructible/shared_gcw_rebel_turret.iff"}; - private String[] imperialTurretTemplates1 = new String[]{""}; - private String[] imperialTurretTemplates2 = new String[]{""}; - private String[] imperialTurretTemplates3 = new String[]{"object/tangible/destructible/shared_gcw_imperial_turret.iff"}; - - private String towerTemplate = ""; - private String rebelTowerTemplate = "object/tangible/destructible/shared_gcw_rebel_tower.iff"; - private String imperialTowerTemplate = "object/tangible/destructible/shared_gcw_imperial_tower.iff"; - - private Vector patrolRoute = new Vector(); - private CreatureObject lastDefender = null; private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); @@ -96,7 +83,9 @@ public class GCWPylon extends TangibleObject{ } public GCWPylon(long objectID, Planet planet, Point3D position, Quaternion orientation, String template){ - super(objectID, planet, position, orientation, template); + super(objectID, planet, position, orientation, template); + this.setAttachment("Filling",0); + this.setResourceFilling(0); } public int getPylonType() { @@ -106,53 +95,26 @@ public class GCWPylon extends TangibleObject{ public void setPylonType(int pylonType) { this.pylonType = pylonType; - if (pylonType==PylonType.SoldierPatrol){ - scheduler.scheduleAtFixedRate(new Runnable() { - @Override public void run() { - try { - spawnSoldier(); - } catch (Exception e) { - System.err.println("Exception in SoldierPatrolPylon->scheduleAtFixedRate->spawnSoldier() " + e.getMessage()); - } - } - }, 5, 60, TimeUnit.SECONDS); + String pylonName = ""; + switch (pylonType){ + case PylonType.Barricade: pylonName="Barricade Construction Site"; + break; + case PylonType.SoldierDefense: pylonName="Soldier Construction Site"; + break; + case PylonType.SoldierPatrol: pylonName="Patrol Construction Site"; + break; + case PylonType.VehiclePatrol: pylonName="Vehicle Construction Site"; + break; + case PylonType.SiegeVehiclePatrol: pylonName="Siege Vehicle Construction Site"; + break; + case PylonType.Tower: pylonName="Tower Construction Site"; + break; + case PylonType.Turret: pylonName="Turret Construction Site"; + break; } - if (pylonType==PylonType.SoldierDefense){ - scheduler.scheduleAtFixedRate(new Runnable() { - @Override public void run() { - try { - spawnSoldierDefender(); - } catch (Exception e) { - System.err.println("Exception in SoldierDefensePylon->scheduleAtFixedRate->spawnSoldier() " + e.getMessage()); - } - } - }, 5, 90, TimeUnit.SECONDS); - } - - if (pylonType==PylonType.VehiclePatrol){ - scheduler.scheduleAtFixedRate(new Runnable() { - @Override public void run() { - try { - spawnVehicle(); - } catch (Exception e) { - System.err.println("Exception in SoldierPatrolPylon->scheduleAtFixedRate->spawnVehicle() " + e.getMessage()); - } - } - }, 5, 120, TimeUnit.SECONDS); - } - - if (pylonType==PylonType.SoldierPatrol){ - scheduler.scheduleAtFixedRate(new Runnable() { - @Override public void run() { - try { - spawnSoldier(); - } catch (Exception e) { - System.err.println("Exception in SoldierPatrolPylon->scheduleAtFixedRate->spawnSoldier() " + e.getMessage()); - } - } - }, 5, 60, TimeUnit.SECONDS); - } + this.setCustomName(pylonName + " 0/100"); + this.setAttachment("Name", pylonName); } @@ -171,251 +133,226 @@ public class GCWPylon extends TangibleObject{ public void setSpawnLevel(int spawnLevel) { this.spawnLevel = spawnLevel; } - - public void spawnSoldier(){ - if (NGECore.getInstance().invasionService.getInvasionPhase()==2){ - if (pylonFaction==Factions.Rebel){ - switch (spawnLevel) { - case 1: soldierTemplates = rebelSoldierTemplates1; - case 2: soldierTemplates = rebelSoldierTemplates2; - case 3: soldierTemplates = rebelSoldierTemplates3; - } - } - if (pylonFaction==Factions.Imperial){ - switch (spawnLevel) { - case 1: soldierTemplates = imperialSoldierTemplates1; - case 2: soldierTemplates = imperialSoldierTemplates2; - case 3: soldierTemplates = imperialSoldierTemplates3; - } - } - String soldierTemplate = soldierTemplates[new Random().nextInt(soldierTemplates.length)]; - 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); - - NGECore.getInstance().aiService.setPatrol(soldier, patrolRoute); - NGECore.getInstance().aiService.setPatrolLoop(soldier,false); - NGECore.getInstance().invasionService.registerInvader(soldier); - totalSpawnedUnits++; - } - } - - public void spawnSoldierDefender(){ - - if (NGECore.getInstance().invasionService.getInvasionPhase()==2){ - if (pylonFaction==Factions.Rebel){ - switch (spawnLevel) { - case 1: soldierTemplates = rebelSoldierTemplates1; - case 2: soldierTemplates = rebelSoldierTemplates2; - case 3: soldierTemplates = rebelSoldierTemplates3; - } - } - if (pylonFaction==Factions.Imperial){ - switch (spawnLevel) { - case 1: soldierTemplates = imperialSoldierTemplates1; - case 2: soldierTemplates = imperialSoldierTemplates2; - case 3: soldierTemplates = imperialSoldierTemplates3; - } - } - if (lastDefender!=null) - if (lastDefender.getPosture()!=13 && lastDefender.getPosture()!=13) - return; - 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); - - NGECore.getInstance().invasionService.registerDefender(lastDefender); - totalSpawnedUnits++; - } - } - - public void spawnVehicle(){ - - if (NGECore.getInstance().invasionService.getInvasionPhase()==2){ - if (pylonFaction==Factions.Rebel){ - switch (spawnLevel) { - case 1: vehicleTemplates = rebelVehicleTemplates1; - case 2: vehicleTemplates = rebelVehicleTemplates2; - case 3: vehicleTemplates = rebelVehicleTemplates3; - } - } - if (pylonFaction==Factions.Imperial){ - switch (spawnLevel) { - case 1: vehicleTemplates = imperialVehicleTemplates1; - case 2: vehicleTemplates = imperialVehicleTemplates2; - case 3: vehicleTemplates = imperialVehicleTemplates3; - } - } - String vehicleTemplate = vehicleTemplates[new Random().nextInt(vehicleTemplates.length)]; - CreatureObject vehicle = (CreatureObject)NGECore.getInstance().spawnService.spawnCreature(vehicleTemplate, this.getPlanet().getName(), 0L, this.getPosition().x, this.getPosition().y, this.getPosition().z, this.getOrientation().w, this.getOrientation().x, this.getOrientation().y,this.getOrientation().z,-1); - - NGECore.getInstance().aiService.setPatrol(vehicle, get_Dearic_Route_1()); - NGECore.getInstance().aiService.setPatrolLoop(vehicle,false); - NGECore.getInstance().invasionService.registerInvader(vehicle); - totalSpawnedUnits++; - } - } - public void setPatrolRoute(int route){ - switch(route){ - case PatrolRoute.Dearic1: patrolRoute = get_Dearic_Route_1(); - break; - case PatrolRoute.Dearic2: patrolRoute = get_Dearic_Route_2(); - break; - case PatrolRoute.Dearic3: patrolRoute = get_Dearic_Route_3(); - break; - case PatrolRoute.Dearic4: patrolRoute = get_Dearic_Route_4(); - break; - case PatrolRoute.Dearic5: patrolRoute = get_Dearic_Route_5(); - break; - case PatrolRoute.Dearic6: patrolRoute = get_Dearic_Route_6(); - break; - case PatrolRoute.Dearic7: patrolRoute = get_Dearic_Route_7(); - break; - case PatrolRoute.Dearic8: patrolRoute = get_Dearic_Route_8(); - break; - case PatrolRoute.Dearic9: patrolRoute = get_Dearic_Route_9(); - break; - case PatrolRoute.Dearic10: patrolRoute = get_Dearic_Route_10(); - break; - } + this.patrolRoute = route; } - public Vector get_Dearic_Route_1(){ - Vector patrolpoints = new Vector(); - patrolpoints.add(new Point3D(68.0F, 6.00F, -2959F)); - patrolpoints.add(new Point3D(151.93F,6.00F, -2961.66F)); - patrolpoints.add(new Point3D(170.18F, 6.00F, -2992.99F)); - patrolpoints.add(new Point3D(262.76F, 6.00F, -2999.76F)); - patrolpoints.add(new Point3D(275.87F, 6.00F, -3008.44F)); - patrolpoints.add(new Point3D(303.41F, 6.00F, -3005.19F)); - patrolpoints.add(new Point3D(343.31F, 6.00F, -2961.06F)); - patrolpoints.add(new Point3D(379.98F, 6.00F, -2963.31F)); - patrolpoints.add(new Point3D(404.70F, 6.00F, -2980.57F)); - patrolpoints.add(new Point3D(412.54F, 6.00F, -3039.39F)); - patrolpoints.add(new Point3D(423.06F, 6.00F, -3050.75F)); - patrolpoints.add(new Point3D(446.92F, 6.00F, -3046.32F)); - patrolpoints.add(new Point3D(470.48F, 6.00F, -3023.43F)); - return patrolpoints; + public int getPatrolRoute(){ + return this.patrolRoute; } - public Vector get_Dearic_Route_2(){ - Vector patrolpoints = new Vector(); - patrolpoints.add(new Point3D(76.0F, 6.00F, -2893F)); - patrolpoints.add(new Point3D(153.0F, 6.00F, -2898F)); - patrolpoints.add(new Point3D(162.89F, 6.00F, -2836.9F)); - patrolpoints.add(new Point3D(291.44F, 6.00F, -2844.6F)); - patrolpoints.add(new Point3D(333.19F, 6.00F, -2878.0F)); - patrolpoints.add(new Point3D(337.00F, 6.00F, -2954.0F)); - patrolpoints.add(new Point3D(378.00F, 6.00F, -2959.0F)); - patrolpoints.add(new Point3D(407.00F, 6.00F, -2978.0F)); - patrolpoints.add(new Point3D(414.00F, 6.00F, -3041.0F)); - patrolpoints.add(new Point3D(448.00F, 6.00F, -3043.0F)); - patrolpoints.add(new Point3D(463.00F, 6.00F, -3017.0F)); - return patrolpoints; - } - - public Vector get_Dearic_Route_3(){ - Vector patrolpoints = new Vector(); - patrolpoints.add(new Point3D(199.0F, 6.00F, -2790F)); - patrolpoints.add(new Point3D(200.0F, 6.00F, -2838F)); - patrolpoints.add(new Point3D(294.0F, 6.00F, -2841F)); - patrolpoints.add(new Point3D(335.0F, 6.00F, -2882F)); - patrolpoints.add(new Point3D(341.0F, 6.00F, -2950F)); - patrolpoints.add(new Point3D(378.0F, 6.00F, -2958F)); - patrolpoints.add(new Point3D(405.0F, 6.00F, -2981F)); - patrolpoints.add(new Point3D(473.0F, 6.00F, -3024F)); - return patrolpoints; - } - - public Vector get_Dearic_Route_4(){ - Vector patrolpoints = new Vector(); - patrolpoints.add(new Point3D(332.0F, 6.00F, -2715F)); - patrolpoints.add(new Point3D(324.0F, 6.00F, -2817F)); - patrolpoints.add(new Point3D(302.0F, 6.00F, -2835F)); - patrolpoints.add(new Point3D(338.0F, 6.00F, -2888F)); - patrolpoints.add(new Point3D(342.0F, 6.00F, -2949F)); - patrolpoints.add(new Point3D(407.0F, 6.00F, -2972F)); - patrolpoints.add(new Point3D(415.0F, 6.00F, -3055F)); - patrolpoints.add(new Point3D(451.0F, 6.00F, -3044F)); - patrolpoints.add(new Point3D(460.0F, 6.00F, -3011F)); - return patrolpoints; - } - - public Vector get_Dearic_Route_5(){ - Vector patrolpoints = new Vector(); - patrolpoints.add(new Point3D(384.0F, 6.00F, -2720F)); - patrolpoints.add(new Point3D(404.0F, 6.00F, -2817F)); - patrolpoints.add(new Point3D(417.0F, 6.00F, -2827F)); - patrolpoints.add(new Point3D(414.0F, 6.00F, -2854F)); - patrolpoints.add(new Point3D(384.0F, 6.00F, -2888F)); - patrolpoints.add(new Point3D(384.0F, 6.00F, -2959F)); - patrolpoints.add(new Point3D(407.0F, 6.00F, -2975F)); - patrolpoints.add(new Point3D(416.0F, 6.00F, -3049F)); - patrolpoints.add(new Point3D(450.0F, 6.00F, -3043F)); - patrolpoints.add(new Point3D(474.0F, 6.00F, -3025F)); - return patrolpoints; - } - - public Vector get_Dearic_Route_6(){ - Vector patrolpoints = new Vector(); - patrolpoints.add(new Point3D(590.0F, 6.00F, -2825F)); - patrolpoints.add(new Point3D(567.0F, 6.00F, -2860F)); - patrolpoints.add(new Point3D(563.0F, 6.00F, -2943F)); - patrolpoints.add(new Point3D(563.0F, 6.00F, -2943F)); - patrolpoints.add(new Point3D(507.0F, 6.00F, -2955F)); - patrolpoints.add(new Point3D(500.0F, 6.00F, -3011F)); - return patrolpoints; - } - - public Vector get_Dearic_Route_7(){ - Vector patrolpoints = new Vector(); - patrolpoints.add(new Point3D(723.0F, 6.00F, -2995F)); - patrolpoints.add(new Point3D(720.0F, 6.00F, -2964F)); - patrolpoints.add(new Point3D(623.0F, 6.00F, -2961F)); - patrolpoints.add(new Point3D(614.0F, 6.00F, -3010F)); - patrolpoints.add(new Point3D(510.0F, 6.00F, -3032F)); - patrolpoints.add(new Point3D(484.0F, 6.00F, -3021F)); - return patrolpoints; - } - - public Vector get_Dearic_Route_8(){ - Vector patrolpoints = new Vector(); - patrolpoints.add(new Point3D(733.0F, 6.00F, -3004F)); - patrolpoints.add(new Point3D(701.0F, 6.00F, -3004F)); - patrolpoints.add(new Point3D(699.0F, 6.00F, -3039F)); - patrolpoints.add(new Point3D(627.0F, 6.00F, -3041F)); - patrolpoints.add(new Point3D(605.0F, 6.00F, -3018F)); - patrolpoints.add(new Point3D(509.0F, 6.00F, -3033F)); - patrolpoints.add(new Point3D(496.0F, 6.00F, -3018F)); - return patrolpoints; - } - - public Vector get_Dearic_Route_9(){ - Vector patrolpoints = new Vector(); - patrolpoints.add(new Point3D(330.0F, 23.00F, -3402F)); - patrolpoints.add(new Point3D(360.0F, 6.00F, -3357F)); - patrolpoints.add(new Point3D(415.0F, 6.00F, -3273F)); - patrolpoints.add(new Point3D(464.0F, 6.00F, -3256F)); - patrolpoints.add(new Point3D(467.0F, 6.00F, -3236F)); - patrolpoints.add(new Point3D(498.0F, 6.00F, -3230F)); - patrolpoints.add(new Point3D(501.0F, 6.00F, -3205F)); - patrolpoints.add(new Point3D(481.0F, 6.00F, -3174F)); - patrolpoints.add(new Point3D(482.0F, 6.00F, -3126F)); - patrolpoints.add(new Point3D(437.0F, 6.00F, -3065F)); - patrolpoints.add(new Point3D(465.0F, 6.00F, -3019F)); - return patrolpoints; - } - - public Vector get_Dearic_Route_10(){// just for tests - Vector patrolpoints = new Vector(); - patrolpoints.add(new Point3D(618.0F, 6.00F, -2972F)); - patrolpoints.add(new Point3D(617.0F, 6.00F, -2980F)); - patrolpoints.add(new Point3D(616.0F, 6.00F, -2990F)); - patrolpoints.add(new Point3D(615.0F, 6.00F, -3010F)); - patrolpoints.add(new Point3D(500.0F, 6.00F, -3035F)); + public void convertToPhase2Object(){ - return patrolpoints; + //if (determinePylonLevel()==0) + //return; + +// resourceFilling = 100; +// spawnLevel = 3; + resourceFilling = 10; + spawnLevel = 1; + + switch (pylonType){ + case PylonType.Barricade: createBarricade(); + break; + case PylonType.SoldierDefense: createSpawner(); + break; + case PylonType.SoldierPatrol: createSpawner(); + break; + case PylonType.VehiclePatrol: createSpawner(); + break; + case PylonType.SiegeVehiclePatrol: createSpawner(); + break; + case PylonType.Tower: createTower(); + break; + case PylonType.Turret: createTurret(); + break; + } + } + + public int determinePylonLevel(){ + if (resourceFilling==0) spawnLevel = 0; + if (resourceFilling>0 && resourceFilling<50) spawnLevel = 1; + if (resourceFilling>=50 && resourceFilling<100) spawnLevel = 2; + if (resourceFilling==100) spawnLevel = 3; + return spawnLevel; + } + + public void createSpawner(){ + GCWSpawner spawner = (GCWSpawner) NGECore.getInstance().objectService.createObject("object/tangible/loot/creature_loot/collections/shared_dejarik_table_base.iff", 0, this.getPlanet(), this.getWorldPosition(), this.getOrientation()); + NGECore.getInstance().simulationService.add(spawner, spawner.getPosition().x, spawner.getPosition().z, true); + spawner.setPatrolRoute(getPatrolRoute()); + spawner.setDelay(getDelay()); + spawner.setSpawnLevel(3); + spawner.setSpawnerFaction(getPylonFaction()); + spawner.setSpawnerType(getPylonType()); + NGECore.getInstance().invasionService.registerPhase2Objects(spawner); + } + + public void createTurret(){ + String turretTemplate="object/installation/turret/gcw/shared_adv_turret_dish_sm_heat.iff"; + //String turretTemplate="object/installation/turret/gcw/shared_adv_turret_dish_large_heat.iff"; + if (spawnLevel==2) turretTemplate="object/installation/turret/gcw/shared_adv_turret_dish_large_heat.iff"; + if (spawnLevel==3) turretTemplate="object/installation/turret/gcw/shared_adv_turret_block_med_heat.iff"; + Planet spawnPlanet = this.getPlanet(); + Point3D spawnPos = this.getWorldPosition(); + Quaternion quat = this.getOrientation(); + NGECore.getInstance().objectService.destroyObject(this.getObjectID()); + InstallationObject turret = (InstallationObject) NGECore.getInstance().objectService.createObject(turretTemplate, 0, spawnPlanet, spawnPos, quat); + NGECore.getInstance().simulationService.add(turret, turret.getPosition().x, turret.getPosition().z, true); + float positionY = NGECore.getInstance().terrainService.getHeight(turret.getPlanetId(), turret.getPosition().x, turret.getPosition().z); + if (turret.getWorldPosition().getDistance2D(new Point3D(1779.27F, 12, 2517.37F))<5 || turret.getWorldPosition().getDistance2D(new Point3D(1797.00F, 12, 2518.32F))<5){ + positionY +=4; // The terrainService delivers incorrect heights on that bridge near the general in Keren + } + turret.setPosition(new Point3D(turret.getPosition().x,positionY, turret.getPosition().z)); + String customName = "Rebel Turret"; + String factionString = "rebel"; + if (getPylonFaction()==Factions.Imperial){ + customName = "Imperial Turret"; + factionString = "imperial"; + } + turret.setCustomName(customName); + + turret.setOptionsBitmask(Options.ATTACKABLE | Options.QUEST); + //turret.setOptionsBitmask(Options.QUEST); + turret.setFaction(factionString); + turret.setFactionStatus(FactionStatus.Combatant); + turret.setMaximumCondition(50000); + TurretAIActor actor = new TurretAIActor(turret, turret.getPosition(), scheduler); + turret.setAttachment("AI", actor); + NGECore.getInstance().invasionService.registerPhase2Objects(turret); + + WeaponObject turretWeapon = (WeaponObject) NGECore.getInstance().objectService.createObject("object/weapon/ranged/turret/shared_turret_heat.iff", turret.getPlanet()); + turretWeapon.setAttackSpeed(5.0F); + //turretWeapon.setAttackSpeed(0.50F); + turretWeapon.setWeaponType(WeaponType.RIFLE); + turretWeapon.setMaxRange(60.0F); + turretWeapon.setDamageType("energy"); + + int minDamage = 1500; int maxDamage = 2000; + if (spawnLevel==2) {minDamage=2500; maxDamage=3500;} + if (spawnLevel==3) {minDamage=4000; maxDamage=5000;} + + turretWeapon.setMinDamage(minDamage); + turretWeapon.setMaxDamage(maxDamage); + turret.add(turretWeapon); + turret.setAttachment("TurretWeapon",turretWeapon.getObjectID()); +// Set 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 = "object/tangible/destructible/shared_gcw_rebel_barricade.iff"; + TangibleObject barricade = (TangibleObject) NGECore.getInstance().objectService.createObject(barricadeTemplate, 0, this.getPlanet(), this.getWorldPosition(), this.getOrientation()); + NGECore.getInstance().simulationService.add(barricade, barricade.getPosition().x, barricade.getPosition().z, true); + String customName = "Rebel Barricade"; + String factionString = "rebel"; + if (getPylonFaction()==Factions.Imperial){ + customName = "Imperial Barricade"; + factionString = "imperial"; + } + barricade.setCustomName(customName); + barricade.setOptionsBitmask(Options.ATTACKABLE | Options.QUEST); + //barricade.setOptionsBitmask(Options.QUEST); + barricade.setFaction(factionString); + barricade.setFactionStatus(FactionStatus.Combatant); + int maxCondition = 50000; + maxCondition += 5000 * resourceFilling; + + barricade.setMaximumCondition(maxCondition); + NGECore.getInstance().invasionService.registerPhase2Objects(barricade); + + 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(),NGECore.getInstance().invasionService.getFactionName(getPylonFaction())); + for (CreatureObject ally : nearAllies){ + if (! ally.hasBuff("barricade_defender")){ + NGECore.getInstance().buffService.addBuffToCreature(ally, "barricade_defender", ally); + } else { + + } + } // towFacGuardDefenseItem + Thread.currentThread().interrupt(); + } catch (Exception e) { + System.err.println("Exception in Barricade thread " + e.getMessage()); + } + } + }, 5, 2, TimeUnit.SECONDS); } + public void createTower(){ + String towerTemplate = "object/tangible/destructible/shared_gcw_rebel_tower.iff"; + String factionString = "rebel"; + String towerString = "Rebel Tower"; + if (getPylonFaction()==Factions.Imperial){ + towerTemplate = "object/tangible/destructible/shared_gcw_imperial_tower.iff"; + factionString = "imperial"; + towerString = "Imperial Tower"; + } + TangibleObject tower = (TangibleObject) NGECore.getInstance().objectService.createObject(towerTemplate, 0, this.getPlanet(), this.getWorldPosition(), this.getOrientation()); + NGECore.getInstance().simulationService.add(tower, tower.getPosition().x, tower.getPosition().z, true); + tower.setCustomName(towerString); + tower.setOptionsBitmask(Options.ATTACKABLE | Options.QUEST); + //tower.setOptionsBitmask(Options.QUEST); + tower.setFaction(factionString); + tower.setFactionStatus(FactionStatus.Combatant); + int maxCondition = 50000; + maxCondition += 5000 * resourceFilling; + + tower.setMaximumCondition(maxCondition); + NGECore.getInstance().invasionService.registerPhase2Objects(tower); + + 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")){ + NGECore.getInstance().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 int getResourceFilling() { + return resourceFilling; + } + + public void setResourceFilling(int resourceFilling) { + this.resourceFilling = resourceFilling; + } + + public int getDelay() { + return delay; + } + + public void setDelay(int delay) { + this.delay = delay; + } + public class PylonType { public static final int SoldierPatrol = 0; @@ -436,27 +373,32 @@ public class GCWPylon extends TangibleObject{ Tower Pylon - Spawns a watch tower that grants intelligence to nearby NPCs and offers combat missions to players - shown with a Tower icon. */ - public class PatrolRoute { - - public static final int Dearic1 = 0; - public static final int Dearic2 = 1; - public static final int Dearic3 = 2; - public static final int Dearic4 = 3; - public static final int Dearic5 = 4; - public static final int Dearic6 = 5; - public static final int Dearic7 = 6; - public static final int Dearic8 = 7; - public static final int Dearic9 = 8; - public static final int Dearic10 = 9; - - } + public void sendBaselines(Client destination) { + if (destination != null && destination.getSession() != null) { + destination.getSession().write(getBaseline(3).getBaseline()); + destination.getSession().write(getBaseline(6).getBaseline()); + + Client parent = ((getGrandparent() == null) ? null : getGrandparent().getClient()); + + if (parent != null && destination == parent) { + destination.getSession().write(getBaseline(8).getBaseline()); + destination.getSession().write(getBaseline(9).getBaseline()); + } - public int getTotalSpawnedUnits() { - return totalSpawnedUnits; + if (destination.getParent() != this) { + // The icon disappears after a few seconds, no idea why. Must be the commandString requirement + float y = -0.1F; + //float qz= 1.06535322E9F; + float qz= 99999; + //String animName = "pt_gcw_quest_rebel_barricade.prt"; + String animName = "pt_gcw_quest_imperial_patrol_2.prt"; + //String animName = "pt_reb_insignia_02.prt"; // pt_gcw_quest_imperial_patrol_2.prt + Point3D effectorPosition = new Point3D(0,y,0); + Quaternion effectorOrientation = new Quaternion(0,0,0,qz); + PlayClientEffectObjectTransformMessage lmsg = new PlayClientEffectObjectTransformMessage("appearance/" + animName,this.getObjectID(),"",effectorPosition,effectorOrientation); + //PlayClientEffectObjectMessage lmsg = new PlayClientEffectObjectMessage("appearance/" + animName, this.getObjectID(), ""); + destination.getSession().write(lmsg.serialize()); + } + } } - - public void setTotalSpawnedUnits(int totalSpawnedUnits) { - this.totalSpawnedUnits = totalSpawnedUnits; - } - } diff --git a/src/services/gcw/GCWSpawner.java b/src/services/gcw/GCWSpawner.java index 29a017ed..6e46394d 100644 --- a/src/services/gcw/GCWSpawner.java +++ b/src/services/gcw/GCWSpawner.java @@ -88,6 +88,7 @@ public class GCWSpawner extends TangibleObject{ private Vector patrolRoute = new Vector(); private CreatureObject lastDefender = null; + private int delay = 0; private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); @@ -105,7 +106,6 @@ public class GCWSpawner extends TangibleObject{ public void setSpawnerType(int spawnerType) { this.spawnerType = spawnerType; - if (spawnerType==SpawnerType.SoldierPatrol){ scheduler.scheduleAtFixedRate(new Runnable() { @Override public void run() { @@ -115,7 +115,7 @@ public class GCWSpawner extends TangibleObject{ System.err.println("Exception in SoldierPatrolPylon->scheduleAtFixedRate->spawnSoldier() " + e.getMessage()); } } - }, 5, 60, TimeUnit.SECONDS); + }, getDelay(), 240, TimeUnit.SECONDS); //120 } if (spawnerType==SpawnerType.SoldierDefense){ @@ -139,7 +139,7 @@ public class GCWSpawner extends TangibleObject{ System.err.println("Exception in SoldierPatrolPylon->scheduleAtFixedRate->spawnVehicle() " + e.getMessage()); } } - }, 5, 120, TimeUnit.SECONDS); + }, getDelay(), 240, TimeUnit.SECONDS); //240 } if (spawnerType==SpawnerType.SiegeVehiclePatrol){ @@ -151,7 +151,7 @@ public class GCWSpawner extends TangibleObject{ System.err.println("Exception in SoldierPatrolPylon->scheduleAtFixedRate->spawnSoldier() " + e.getMessage()); } } - }, 120, 600, TimeUnit.SECONDS); + }, getDelay(), 600, TimeUnit.SECONDS); } } @@ -173,7 +173,6 @@ public class GCWSpawner extends TangibleObject{ } public void spawnSoldier(){ - if (NGECore.getInstance().invasionService.getInvasionPhase()==2){ if (spawnerFaction==Factions.Rebel){ switch (spawnLevel) { @@ -192,11 +191,12 @@ public class GCWSpawner extends TangibleObject{ String soldierTemplate = soldierTemplates[new Random().nextInt(soldierTemplates.length)]; //if (totalSpawnedUnits==0){ 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); - - NGECore.getInstance().aiService.setPatrol(soldier, patrolRoute); - NGECore.getInstance().aiService.setPatrolLoop(soldier,false); NGECore.getInstance().invasionService.registerInvader(soldier); totalSpawnedUnits++; + soldier.setAttachment("IsInvader","yes"); + NGECore.getInstance().aiService.setPatrol(soldier, patrolRoute); + NGECore.getInstance().aiService.setPatrolLoop(soldier,false); + //} } } @@ -248,11 +248,11 @@ public class GCWSpawner extends TangibleObject{ } String vehicleTemplate = vehicleTemplates[new Random().nextInt(vehicleTemplates.length)]; CreatureObject vehicle = (CreatureObject)NGECore.getInstance().spawnService.spawnCreature(vehicleTemplate, this.getPlanet().getName(), 0L, this.getPosition().x, this.getPosition().y, this.getPosition().z, this.getOrientation().w, this.getOrientation().x, this.getOrientation().y,this.getOrientation().z,-1); - - NGECore.getInstance().aiService.setPatrol(vehicle, patrolRoute); - NGECore.getInstance().aiService.setPatrolLoop(vehicle,false); NGECore.getInstance().invasionService.registerInvader(vehicle); totalSpawnedUnits++; + vehicle.setAttachment("IsInvader","yes"); + NGECore.getInstance().aiService.setPatrol(vehicle, patrolRoute); + NGECore.getInstance().aiService.setPatrolLoop(vehicle,false); } } @@ -276,11 +276,12 @@ public class GCWSpawner extends TangibleObject{ String vehicleTemplate = vehicleTemplates[new Random().nextInt(vehicleTemplates.length)]; CreatureObject vehicle = (CreatureObject)NGECore.getInstance().spawnService.spawnCreature(vehicleTemplate, this.getPlanet().getName(), 0L, this.getPosition().x, this.getPosition().y, this.getPosition().z, this.getOrientation().w, this.getOrientation().x, this.getOrientation().y,this.getOrientation().z,-1); vehicle.setAttachment("IsSlowVehicle",true); - - NGECore.getInstance().aiService.setPatrol(vehicle, patrolRoute); - NGECore.getInstance().aiService.setPatrolLoop(vehicle,false); NGECore.getInstance().invasionService.registerInvader(vehicle); totalSpawnedUnits++; + vehicle.setAttachment("IsInvader","yes"); + + NGECore.getInstance().aiService.setPatrol(vehicle, patrolRoute); + NGECore.getInstance().aiService.setPatrolLoop(vehicle,false); } } @@ -308,6 +309,38 @@ public class GCWSpawner extends TangibleObject{ break; case PatrolRoute.Dearic11: patrolRoute = get_Dearic_Route_11(); break; + + case PatrolRoute.Keren1: patrolRoute = get_Keren_Route_1(); + break; + case PatrolRoute.Keren2: patrolRoute = get_Keren_Route_2(); + break; + case PatrolRoute.Keren3: patrolRoute = get_Keren_Route_3(); + break; + case PatrolRoute.Keren4: patrolRoute = get_Keren_Route_4(); + break; + case PatrolRoute.Keren5: patrolRoute = get_Keren_Route_5(); + break; + case PatrolRoute.Keren6: patrolRoute = get_Keren_Route_6(); + break; + case PatrolRoute.Keren7: patrolRoute = get_Keren_Route_7(); + break; + + case PatrolRoute.Bestine1: patrolRoute = get_Bestine_Route_1(); + break; + case PatrolRoute.Bestine2: patrolRoute = get_Bestine_Route_2(); + break; + case PatrolRoute.Bestine3: patrolRoute = get_Bestine_Route_3(); + break; + case PatrolRoute.Bestine4: patrolRoute = get_Bestine_Route_4(); + break; + case PatrolRoute.Bestine5: patrolRoute = get_Bestine_Route_5(); + break; + case PatrolRoute.Bestine6: patrolRoute = get_Bestine_Route_6(); + break; + case PatrolRoute.Bestine7: patrolRoute = get_Bestine_Route_7(); + break; + case PatrolRoute.Bestine8: patrolRoute = get_Bestine_Route_8(); + break; } } @@ -341,7 +374,7 @@ public class GCWSpawner extends TangibleObject{ patrolpoints.add(new Point3D(407.00F, 6.00F, -2978.0F)); patrolpoints.add(new Point3D(414.00F, 6.00F, -3041.0F)); patrolpoints.add(new Point3D(448.00F, 6.00F, -3043.0F)); - patrolpoints.add(new Point3D(463.00F, 6.00F, -3017.0F)); + patrolpoints.add(new Point3D(464.00F, 6.00F, -3017.0F)); return patrolpoints; } @@ -419,7 +452,7 @@ public class GCWSpawner extends TangibleObject{ patrolpoints.add(new Point3D(627.0F, 6.00F, -3041F)); patrolpoints.add(new Point3D(605.0F, 6.00F, -3018F)); patrolpoints.add(new Point3D(509.0F, 6.00F, -3033F)); - patrolpoints.add(new Point3D(496.0F, 6.00F, -3018F)); + patrolpoints.add(new Point3D(495.0F, 6.00F, -3017F)); return patrolpoints; } @@ -455,6 +488,254 @@ public class GCWSpawner extends TangibleObject{ patrolpoints.add(new Point3D(332.0F, 6.00F, -2715F)); return patrolpoints; } + + + public Vector get_Keren_Route_1(){ + Vector patrolpoints = new Vector(); + patrolpoints.add(new Point3D(1342.0F, 13.00F, 2917F)); + patrolpoints.add(new Point3D(1447.0F, 13.00F, 2825F)); + patrolpoints.add(new Point3D(1463.0F, 14.00F, 2781F)); + patrolpoints.add(new Point3D(1530.0F, 25.00F, 2760F)); + patrolpoints.add(new Point3D(1523.0F, 25.00F, 2731F)); + patrolpoints.add(new Point3D(1555.0F, 29.00F, 2721F)); + patrolpoints.add(new Point3D(1607.0F, 25.00F, 2706F)); + patrolpoints.add(new Point3D(1607.0F, 25.00F, 2706F)); + patrolpoints.add(new Point3D(1601.0F, 25.00F, 2676F)); + patrolpoints.add(new Point3D(1652.0F, 12.00F, 2652F)); + patrolpoints.add(new Point3D(1674.0F, 12.00F, 2637F)); + patrolpoints.add(new Point3D(1674.0F, 12.00F, 2586F)); + patrolpoints.add(new Point3D(1725.0F, 12.00F, 2584F)); + patrolpoints.add(new Point3D(1727.0F, 12.00F, 2559F)); + patrolpoints.add(new Point3D(1758.0F, 12.00F, 2555F)); + patrolpoints.add(new Point3D(1766.0F, 12.00F, 2528F)); + patrolpoints.add(new Point3D(1780.0F, 12.00F, 2520F)); + return patrolpoints; + } + + public Vector get_Keren_Route_2(){ + Vector patrolpoints = new Vector(); + patrolpoints.add(new Point3D(1994.03F, 12.00F, 2769.94F)); + patrolpoints.add(new Point3D(1981.79F, 13.89F, 2736.23F)); + patrolpoints.add(new Point3D(1911.87F, 12F, 2737.51F)); + patrolpoints.add(new Point3D(1892.03F, 12F, 2718.64F)); + patrolpoints.add(new Point3D(1883.43F, 12F, 2727.32F)); + patrolpoints.add(new Point3D(1863.00F, 12F, 2707.36F)); + patrolpoints.add(new Point3D(1883.67F, 12F, 2694.01F)); + patrolpoints.add(new Point3D(1899.48F, 12F, 2661.86F)); + patrolpoints.add(new Point3D(1901.68F, 12F, 2638.95F)); + patrolpoints.add(new Point3D(1897.24F, 12F, 2603.49F)); + patrolpoints.add(new Point3D(1879.39F, 12F, 2563.75F)); + patrolpoints.add(new Point3D(1841.89F, 12F, 2527.75F)); + patrolpoints.add(new Point3D(1824.33F, 12F, 2521.45F)); + patrolpoints.add(new Point3D(1789.56F, 12F, 2518.26F)); + + return patrolpoints; + } + + public Vector get_Keren_Route_3(){ + Vector patrolpoints = new Vector(); + patrolpoints.add(new Point3D(2063.0F, 49.00F, 2794F)); + patrolpoints.add(new Point3D(2020.0F, 49.00F, 2796F)); + patrolpoints.add(new Point3D(1817.0F, 40.00F, 2808F)); + patrolpoints.add(new Point3D(1753.0F, 40.00F, 2808F)); + patrolpoints.add(new Point3D(1715.0F, 40.00F, 2780F)); + patrolpoints.add(new Point3D(1717.0F, 12.00F, 2741F)); + patrolpoints.add(new Point3D(1713.0F, 12.00F, 2639F)); + patrolpoints.add(new Point3D(1695.0F, 12.00F, 2635F)); + patrolpoints.add(new Point3D(1696.0F, 12.00F, 2589F)); + patrolpoints.add(new Point3D(1725.0F, 12.00F, 2585F)); + patrolpoints.add(new Point3D(1727.0F, 12.00F, 2560F)); + patrolpoints.add(new Point3D(1758.0F, 12.00F, 2555F)); + patrolpoints.add(new Point3D(1766.0F, 12.00F, 2527F)); + patrolpoints.add(new Point3D(1781.0F, 12.00F, 2516F)); + + return patrolpoints; + } + + public Vector get_Keren_Route_4(){ + Vector patrolpoints = new Vector(); + patrolpoints.add(new Point3D(1990.0F, 30.00F, 2715F)); + patrolpoints.add(new Point3D(1990.0F, 30.00F, 2682F)); + patrolpoints.add(new Point3D(1988.0F, 12.00F, 2624F)); + patrolpoints.add(new Point3D(1983.0F, 12.00F, 2560F)); + patrolpoints.add(new Point3D(1931.0F, 12.00F, 2535F)); + patrolpoints.add(new Point3D(1902.0F, 12.00F, 2554F)); + patrolpoints.add(new Point3D(1879.0F, 12.00F, 2525F)); + patrolpoints.add(new Point3D(1846.0F, 12.00F, 2504F)); + patrolpoints.add(new Point3D(1806.0F, 12.00F, 2492F)); + patrolpoints.add(new Point3D(1806.0F, 12.00F, 2520F)); + patrolpoints.add(new Point3D(1794.0F, 12.00F, 2519F)); + + return patrolpoints; + } + + public Vector get_Keren_Route_5(){ + Vector patrolpoints = new Vector(); + patrolpoints.add(new Point3D(1342.0F, 13.00F, 2917F)); + patrolpoints.add(new Point3D(1447.0F, 13.00F, 2825F)); + patrolpoints.add(new Point3D(1463.0F, 14.00F, 2781F)); + patrolpoints.add(new Point3D(1530.0F, 25.00F, 2760F)); + patrolpoints.add(new Point3D(1523.0F, 25.00F, 2731F)); + patrolpoints.add(new Point3D(1555.0F, 29.00F, 2721F)); + patrolpoints.add(new Point3D(1607.0F, 25.00F, 2706F)); + patrolpoints.add(new Point3D(1607.0F, 25.00F, 2706F)); + patrolpoints.add(new Point3D(1601.0F, 25.00F, 2676F)); + patrolpoints.add(new Point3D(1652.0F, 12.00F, 2652F)); + patrolpoints.add(new Point3D(1674.0F, 12.00F, 2637F)); + patrolpoints.add(new Point3D(1674.0F, 12.00F, 2586F)); + patrolpoints.add(new Point3D(1725.0F, 12.00F, 2584F)); + patrolpoints.add(new Point3D(1758.0F, 12.00F, 2555F)); + patrolpoints.add(new Point3D(1766.0F, 12.00F, 2528F)); + patrolpoints.add(new Point3D(1780.0F, 12.00F, 2520F)); + return patrolpoints; + } + + public Vector get_Keren_Route_6(){ + Vector patrolpoints = new Vector(); + patrolpoints.add(new Point3D(1980.0F, 10.00F, 2179F)); + patrolpoints.add(new Point3D(1957.0F, 11.00F, 2259F)); + patrolpoints.add(new Point3D(1934.0F, 12.00F, 2341F)); + patrolpoints.add(new Point3D(1947.0F, 12.00F, 2387F)); + patrolpoints.add(new Point3D(1945.0F, 12.00F, 2414F)); + patrolpoints.add(new Point3D(1879.0F, 12.00F, 2419F)); + patrolpoints.add(new Point3D(1847.0F, 12.00F, 2458F)); + patrolpoints.add(new Point3D(1789.0F, 12.00F, 2459F)); + patrolpoints.add(new Point3D(1743.0F, 12.00F, 2458F)); + patrolpoints.add(new Point3D(1728.0F, 12.00F, 2468F)); + patrolpoints.add(new Point3D(1729.0F, 12.00F, 2495F)); + patrolpoints.add(new Point3D(1761.0F, 12.00F, 2495F)); + patrolpoints.add(new Point3D(1764.0F, 12.00F, 2516F)); + patrolpoints.add(new Point3D(1776.0F, 12.00F, 2517F)); + return patrolpoints; + } + + public Vector get_Keren_Route_7(){ + Vector patrolpoints = new Vector(); + patrolpoints.add(new Point3D(1342.0F, 13.00F, 2917F)); + patrolpoints.add(new Point3D(1487.0F, 20.00F, 2808F)); + + return patrolpoints; + } + + public Vector get_Bestine_Route_1(){ + Vector patrolpoints = new Vector(); + patrolpoints.add(new Point3D(-978.75F, 12.00F, -3747.46F)); + patrolpoints.add(new Point3D(-996.37F, 12.00F, -3731.11F)); + patrolpoints.add(new Point3D(-1004.13F, 12.00F, -3708.60F)); + patrolpoints.add(new Point3D(-1042.40F, 12.00F, -3672.19F)); + patrolpoints.add(new Point3D(-1067.11F, 12.00F, -3665.97F)); + patrolpoints.add(new Point3D(-1107.36F, 12.00F, -3633.51F)); + patrolpoints.add(new Point3D(-1126.32F, 12.00F, -3650.40F)); + patrolpoints.add(new Point3D(-1144.03F, 12.00F, -3652.36F)); + patrolpoints.add(new Point3D(-1175.46F, 12.00F, -3631.40F)); + patrolpoints.add(new Point3D(-1204.07F, 12.00F, -3627.40F)); + return patrolpoints; + } + + public Vector get_Bestine_Route_2(){ + Vector patrolpoints = new Vector(); + patrolpoints.add(new Point3D(-1002.90F, 19.15F, -3593.77F)); + patrolpoints.add(new Point3D(-1053.93F, 12F, -3576.39F)); + patrolpoints.add(new Point3D(-1064.00F, 12F, -3586.90F)); + patrolpoints.add(new Point3D(-1084.30F, 12F, -3583.85F)); + patrolpoints.add(new Point3D(-1100.69F, 12F, -3622.65F)); + patrolpoints.add(new Point3D(-1129.25F, 12F, -3653.48F)); + patrolpoints.add(new Point3D(-1158.12F, 12F, -3654.10F)); + patrolpoints.add(new Point3D(-1191.37F, 12F, -3628.60F)); + patrolpoints.add(new Point3D(-1214.79F, 12F, -3633.39F)); + return patrolpoints; + } + + public Vector get_Bestine_Route_3(){ + Vector patrolpoints = new Vector(); + patrolpoints.add(new Point3D(-1104F, 20.00F, -3467F)); + patrolpoints.add(new Point3D(-1084.21F, 12.00F, -3513.44F)); + patrolpoints.add(new Point3D(-1107.65F, 12.00F, -3570.01F)); + patrolpoints.add(new Point3D(-1166.30F, 12.00F, -3527.04F)); + patrolpoints.add(new Point3D(-1182.49F, 12.00F, -3543.62F)); + patrolpoints.add(new Point3D(-1195.03F, 12.00F, -3534.84F)); + patrolpoints.add(new Point3D(-1222.08F, 12.00F, -3567.95F)); + patrolpoints.add(new Point3D(-1245.74F, 12.00F, -3550.56F)); + patrolpoints.add(new Point3D(-1284.93F, 12.00F, -3596.65F)); + patrolpoints.add(new Point3D(-1255.27F, 12.00F, -3620.79F)); + patrolpoints.add(new Point3D(-1223.85F, 12.00F, -3625.50F)); + return patrolpoints; + } + + public Vector get_Bestine_Route_4(){ + Vector patrolpoints = new Vector(); + patrolpoints.add(new Point3D(-1224.17F, 14.92F, -3477.66F)); + patrolpoints.add(new Point3D(-1214.17F, 12F, -3520.83F)); + patrolpoints.add(new Point3D(-1239.38F, 12F, -3552.16F)); + patrolpoints.add(new Point3D(-1251.67F, 12F, -3554.41F)); + patrolpoints.add(new Point3D(-1288.84F, 12F, -3605.51F)); + patrolpoints.add(new Point3D(-1253.18F, 12F, -3620.50F)); + patrolpoints.add(new Point3D(-1224.78F, 12F, -3627.92F)); + return patrolpoints; + } + + public Vector get_Bestine_Route_5(){ + Vector patrolpoints = new Vector(); + patrolpoints.add(new Point3D(-1289.09F, 10.77F, -3451.00F)); + patrolpoints.add(new Point3D(-1287.35F, 12F, -3499.91F)); + patrolpoints.add(new Point3D(-1293.84F, 12F, -3516.75F)); + patrolpoints.add(new Point3D(-1293.84F, 12F, -3516.75F)); + patrolpoints.add(new Point3D(-1282.01F, 12F, -3531.76F)); + patrolpoints.add(new Point3D(-1286.69F, 12F, -3604.70F)); + patrolpoints.add(new Point3D(-1247.24F, 12F, -3622.33F)); + patrolpoints.add(new Point3D(-1221.27F, 12F, -3616.53F)); + return patrolpoints; + } + + public Vector get_Bestine_Route_6(){ + Vector patrolpoints = new Vector(); + patrolpoints.add(new Point3D(-1399.33F, 18.02F, -3842.45F)); + patrolpoints.add(new Point3D(-1378.02F, 10.02F, -3803.54F)); + patrolpoints.add(new Point3D(-1355.98F, 12.25F, -3741.07F)); + patrolpoints.add(new Point3D(-1351.22F, 12.0F, -3703.81F)); + patrolpoints.add(new Point3D(-1301.95F, 12.0F, -3626.74F)); + patrolpoints.add(new Point3D(-1261.14F, 12.0F, -3624.71F)); + patrolpoints.add(new Point3D(-1224.89F, 12.0F, -3631.51F)); + return patrolpoints; + } + + public Vector get_Bestine_Route_7(){ + Vector patrolpoints = new Vector(); + patrolpoints.add(new Point3D(-1319.14F, 21.54F, -3854.52F)); + patrolpoints.add(new Point3D(-1327.96F, 24.39F, -3791.74F)); + patrolpoints.add(new Point3D(-1325.62F, 12.0F, -3694.68F)); + patrolpoints.add(new Point3D(-1325.62F, 12.0F, -3694.68F)); + patrolpoints.add(new Point3D(-1313.86F, 12.0F, -3632.90F)); + patrolpoints.add(new Point3D(-1261.17F, 12.0F, -3623.71F)); + patrolpoints.add(new Point3D(-1225.88F, 12.0F, -3631.15F)); + return patrolpoints; + } + + public Vector get_Bestine_Route_8(){ + Vector patrolpoints = new Vector(); + patrolpoints.add(new Point3D(-1143.05F, 14.43F, -3756.47F)); + patrolpoints.add(new Point3D(-1126.50F, 12F, -3691.73F)); + patrolpoints.add(new Point3D(-1188.91F, 12F, -3627.55F)); + patrolpoints.add(new Point3D(-1203.55F, 12F, -3624.19F)); + return patrolpoints; + } + + + public int getTotalSpawnedUnits() { + return totalSpawnedUnits; + } + + public void setTotalSpawnedUnits(int totalSpawnedUnits) { + this.totalSpawnedUnits = totalSpawnedUnits; + } + + public int getDelay() { + return delay; + } + + public void setDelay(int delay) { + this.delay = delay; + } public class SpawnerType { @@ -490,14 +771,22 @@ public class GCWSpawner extends TangibleObject{ public static final int Dearic10 = 9; public static final int Dearic11 = 10; + public static final int Keren1 = 11; + public static final int Keren2 = 12; + public static final int Keren3 = 13; + public static final int Keren4 = 14; + public static final int Keren5 = 15; + public static final int Keren6 = 16; + public static final int Keren7 = 17; + + public static final int Bestine1 = 18; + public static final int Bestine2 = 19; + public static final int Bestine3 = 20; + public static final int Bestine4 = 21; + public static final int Bestine5 = 22; + public static final int Bestine6 = 23; + public static final int Bestine7 = 24; + public static final int Bestine8 = 25; + public static final int Bestine9 = 26; } - - public int getTotalSpawnedUnits() { - return totalSpawnedUnits; - } - - public void setTotalSpawnedUnits(int totalSpawnedUnits) { - this.totalSpawnedUnits = totalSpawnedUnits; - } - } diff --git a/src/services/gcw/InvasionService.java b/src/services/gcw/InvasionService.java index 22ca6802..ae6f0e57 100644 --- a/src/services/gcw/InvasionService.java +++ b/src/services/gcw/InvasionService.java @@ -21,10 +21,12 @@ ******************************************************************************/ package services.gcw; -import java.util.HashSet; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; 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; @@ -36,86 +38,193 @@ import java.util.concurrent.TimeUnit; import org.apache.mina.core.session.IoSession; import protocol.swg.CommPlayerMessage; -import protocol.swg.UpdateContainmentMessage; +import protocol.swg.PlayClientEffectObjectTransformMessage; import resources.common.OutOfBand; +import resources.common.SpawnPoint; 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.tangible.TangibleObject; -import resources.objects.weapon.WeaponObject; import services.ai.AIActor; -import services.ai.TurretAIActor; +import services.ai.states.WithdrawalState; 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 InvasionService 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 boolean invasionScheduled = false; private CreatureObject invasionGeneral = null; private CreatureObject defendingGeneral = null; private CreatureObject defendingQuestOfficer = null; + private Vector offensiveQuestOfficers = new Vector(); - private int invasionLocation=InvasionLocation.Dearic; + private int invasionLocation=-1; + private String invasionPlanet="tatooine"; + private Point3D invasionLocationCenter; private int invadingFaction=Factions.Imperial; private int defendingFaction=Factions.Rebel; - private int invasionPhase=2; // Test phase 2 + + private int invasionPhase=1; // Test phase 1 + + private Vector pylonList = new Vector(); + private Vector offensiveSupplyTerminals = new Vector(); private long temptimestartreference = 0L; - private boolean message1sent = false; - private boolean message2sent = false; - private boolean message3sent = false; - private boolean message4sent = false; + private boolean ph1_message1sent = false; + private boolean ph1_message2sent = false; + private boolean ph2_message1sent = false; + private boolean ph2_message2sent = false; + private boolean ph2_message3sent = false; + private boolean ph2_message4sent = false; + private boolean ph2_message5sent = false; + private boolean ph2_message6sent = false; + private boolean ph2_message7sent = false; - private ScheduledFuture eventManagerTask = null; + //private ScheduledFuture eventManagerTask = null; + private ScheduledFuture defendingGeneralTask = null; + private Map generalWarningLevelMap = new ConcurrentHashMap(); private Map invadingCreatures = new ConcurrentHashMap(); private int invaderRegistryCounter = 0; private Map defendingCreatures = new ConcurrentHashMap(); private int defenderRegistryCounter = 0; + private Map phase2Objects = new ConcurrentHashMap(); + private int phase2ObjectRegistryCounter = 0; private Vector defensiveBanners = new Vector(); + private Vector defensiveSupplyTerminals = new Vector(); + private TangibleObject defensiveTable; + private Vector offensiveCamps = new Vector(); + + private List offensiveClonerList = new Vector(); public InvasionService(final NGECore core) { this.core = core; - + +// 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 Executors.newSingleThreadScheduledExecutor().schedule(() -> { - testPylons(); + + //testPylons(); // temp time reference, will be server time later temptimestartreference = System.currentTimeMillis(); + scheduleInvasionManager(); + invasionScheduled=true; scheduleInvasionEventManager(); - }, 30, TimeUnit.SECONDS); // Start invasion phase 2 after 30 seconds from server start + }, 60, TimeUnit.SECONDS); + // Server code to schedule invasions hourly + /* + for (;;){ + while (!invasionScheduled) { + Calendar now = Calendar.getInstance(); + // wait for the next full hour + if (now.get(Calendar.MINUTE)==0 && ! invasionScheduled){ + scheduleInvasionManager(); + scheduleInvasionEventManager(); + invasionScheduled=true; + try { + if (!invasionScheduled) + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + try { + if (invasionScheduled) + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + */ + } + + public void scheduleInvasionManager(){ + + invasionLocation++; // Change Location of invasion + if (invasionLocation>2) + invasionLocation=0; // Rotate + + invasionPlanet = getInvasionPlanet(invasionLocation).getName(); + + invasionLocation=InvasionLocation.Dearic; + invasionPlanet="talus"; + +// invasionLocation=InvasionLocation.Keren; +// invasionPlanet="naboo"; + +// invasionLocation=InvasionLocation.Bestine; +// invasionPlanet="tatooine"; + + // Make sides random for now. + // Later GCWService will determine the sides + if (new Random().nextFloat()<0.5){ + invadingFaction=Factions.Rebel; + defendingFaction=Factions.Imperial; + } + + if (invasionLocation==InvasionLocation.Keren){ + spawnPylonsKeren(); + } + if (invasionLocation==InvasionLocation.Bestine){ + spawnPylonsBestine(); + } + if (invasionLocation==InvasionLocation.Dearic){ + spawnPylonsDearic(); + } + + + + spawnDefensiveAssets(); + spawnOffensiveAssets(); + + setInvasionLocationCenter(); } public void scheduleInvasionEventManager(){ - - eventManagerTask = scheduler.scheduleAtFixedRate(new Runnable() { + + final Future[] evm = {null}; + evm[0] = scheduler.scheduleAtFixedRate(new Runnable() { @Override public void run() { try { + if (!invasionScheduled){ + Thread.yield(); + evm[0].cancel(false); + } invasionEventManager(); } catch (Exception e) { e.printStackTrace(); @@ -127,36 +236,59 @@ public class InvasionService implements INetworkDispatch { public void invasionEventManager(){ - // Determine planet here + if (invasionPhase==1 && System.currentTimeMillis()>temptimestartreference + 60000 && ! ph1_message1sent){ + send_Phase1_InvaderMessage1(); + send_Phase1_DefenderMessage1(); + ph1_message1sent = true; + System.out.println("Phase 1 msg1 sent "); + } - setInvasionLocationCenter(); + if (invasionPhase==1 && System.currentTimeMillis()>temptimestartreference + 300000 && ! ph1_message2sent){ + send_Phase1_InvaderMessage2(); + send_Phase1_DefenderMessage2(); + ph1_message2sent = true; + System.out.println("Phase 1 msg2 sent "); + } - if (invasionPhase==2 && System.currentTimeMillis()>temptimestartreference + 140000 && ! message1sent){ - sendDefenderMessage1(); - message1sent = true; + //if (invasionPhase==1 && System.currentTimeMillis()>temptimestartreference + 600000 && ! ph2_message1sent){ + if (invasionPhase==1 && System.currentTimeMillis()>temptimestartreference + 35000 && ! ph2_message1sent){ + invasionPhase=2; + preparePhase2(); + System.out.println("PHASE 2"); + send_Phase2_InvaderMessage1(); + send_Phase2_DefenderMessage1(); + ph2_message1sent = true; System.out.println("Defender msg1 sent "); } - if (invasionPhase==2 && System.currentTimeMillis()>temptimestartreference + 600000 && ! message2sent){ - sendDefenderMessage2(); - message2sent = true; + + if (invasionPhase==2 && System.currentTimeMillis()>temptimestartreference + 900000 && ! ph2_message2sent){ // 1200000 + send_Phase2_InvaderMessage2(); + send_Phase2_DefenderMessage2(); + ph2_message2sent = true; invasionPhase=3; + AIActor actor = (AIActor)defendingGeneral.getAttachment("AI"); + actor.setAIactive(true); defendingGeneral.setOptionsBitmask(Options.ATTACKABLE); + + defendingGeneral.updatePvpStatus(); + makeDefensiveGeneralDefenderForNPCs(); 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){ + + if (invasionPhase==3 && defendingGeneral.getHealth() invadingCreaturesClone = new ConcurrentHashMap(); + Map defendingCreaturesClone = new ConcurrentHashMap(); + for (Map.Entry entry : invadingCreatures.entrySet()) { + invadingCreaturesClone.put(entry.getKey(), entry.getValue()); + } + for (Map.Entry entry : defendingCreatures.entrySet()) { + defendingCreaturesClone.put(entry.getKey(), entry.getValue()); + } + + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + wipeInvaders(invadingCreaturesClone); + wipeDefenders(defendingCreaturesClone); // Make sure all are deleted + }, 360, TimeUnit.SECONDS); + + + withdrawInvaders(); + for (BuildingObject camp : offensiveCamps){ + core.simulationService.remove(camp, camp.getWorldPosition().x, camp.getWorldPosition().z, true); + core.objectService.destroyObject(camp.getObjectID()); + } + + for (CreatureObject officer : offensiveQuestOfficers){ + core.simulationService.remove(officer, officer.getWorldPosition().x, officer.getWorldPosition().z, true); + core.objectService.destroyObject(officer.getObjectID()); + } + for (TangibleObject banner : defensiveBanners){ + core.objectService.destroyObject(banner.getObjectID()); + } + + if (defensiveTable!=null) + core.objectService.destroyObject(defensiveTable.getObjectID()); + if (defendingGeneral!=null) + core.objectService.destroyObject(defendingGeneral.getObjectID()); + if (defendingQuestOfficer!=null) + core.objectService.destroyObject(defendingQuestOfficer.getObjectID()); + if (invasionGeneral!=null) + core.objectService.destroyObject(invasionGeneral.getObjectID()); + + deletePhase2Objects(); + generalWarningLevelMap.clear(); + offensiveSupplyTerminals = new Vector(); + invaderRegistryCounter = 0; + defenderRegistryCounter = 0; + defensiveBanners.clear(); + defensiveSupplyTerminals.clear(); + defensiveTable = null; + defendingGeneralTask.cancel(true); + defendingGeneralTask = null; + + invasionScheduled = false; // free Service } - } + + if (invasionPhase==3 && defendingGeneral.getHealth()<0.5*defendingGeneral.getMaxHealth() &&(defendingGeneral.getPosture()!=13 || defendingGeneral.getPosture()!=14) && ! ph2_message5sent){ + //sendInvaderGeneralHalfMessage(); + sendDefenderGeneralHalfMessage(); + ph2_message5sent = true; + } + } else { + //defenders won 30 mins 1800000 + if (invasionPhase==2 && System.currentTimeMillis()>temptimestartreference + 1200000 && ! ph2_message3sent){ + sendDefenderWonMessage(); + sendInvaderLostMessage(); + ph2_message3sent = true; + invasionPhase=3; + + invasionScheduled = false; // free Service + System.out.println("Defender msg2 sent "); // Local server gives only 30 mins time, so its 20 mins for this phase + } + } + + + } + + public void withdrawInvaders(){ + for (Map.Entry entry : invadingCreatures.entrySet()) { + CreatureObject creature = entry.getValue(); + if (creature!=null){ + if (creature.getAttachment("AI")!=null){ + AIActor actor = (AIActor)creature.getAttachment("AI"); + if (actor!=null){ + actor.setActorAlive(true); + actor.setAIactive(true); + actor.setIntendedPrimaryAIState(new WithdrawalState()); + actor.setCurrentState(new WithdrawalState()); + } + } + } + } } public void grantGCWPoints(int faction, int gcwPoints){ @@ -183,6 +404,7 @@ public class InvasionService implements INetworkDispatch { } public void registerInvader(CreatureObject registrant){ +// System.out.println("Registered! " + invaderRegistryCounter); invadingCreatures.put(invaderRegistryCounter++, registrant); } @@ -190,209 +412,1097 @@ public class InvasionService implements INetworkDispatch { defendingCreatures.put(invaderRegistryCounter++, registrant); } - public void wipeInvaders(){ + public void wipeInvaders(Map invaderMap){ + + for (BuildingObject camp : offensiveCamps){ + core.simulationService.remove(camp, camp.getWorldPosition().x, camp.getWorldPosition().z, true); + core.objectService.destroyObject(camp.getObjectID()); + } - for (Map.Entry entry : invadingCreatures.entrySet()) { + for (CreatureObject officer : offensiveQuestOfficers){ + core.simulationService.remove(officer, officer.getWorldPosition().x, officer.getWorldPosition().z, true); + core.objectService.destroyObject(officer.getObjectID()); + } + + for (SWGObject cloner : offensiveClonerList){ + core.simulationService.remove(cloner, cloner.getWorldPosition().x, cloner.getWorldPosition().z, true); + core.objectService.destroyObject(cloner.getObjectID()); + } + + + for (Map.Entry entry : invaderMap.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(); - } + if (creature!=null){ + if (creature.getAttachment("AI")!=null){ + AIActor actor = (AIActor)creature.getAttachment("AI"); + if (actor!=null){ + System.out.println("Preparing deletion " + creature.getObjectID()); + actor.prepareDeletion(); + } + } + } + } + + Executors.newSingleThreadScheduledExecutor().schedule(() -> { + System.out.println("Started schedule to destroy " + invaderMap.entrySet().size()); + for (Map.Entry entry : invaderMap.entrySet()) { + CreatureObject creature = entry.getValue(); + if (creature!=null){ + if (creature.getAttachment("AI")!=null){ + AIActor actor = (AIActor)creature.getAttachment("AI"); + core.simulationService.remove(creature, creature.getWorldPosition().x, creature.getWorldPosition().z, true); // Make sure + System.out.println("destroying Actor " + creature.getObjectID()); + actor.destroyActor(); + } + } + } + }, 5, TimeUnit.SECONDS); + Executors.newSingleThreadScheduledExecutor().schedule(() -> { - for (Map.Entry entry : invadingCreatures.entrySet()) { + for (Map.Entry entry : invaderMap.entrySet()) { CreatureObject creature = entry.getValue(); - core.simulationService.remove(creature, creature.getWorldPosition().x, creature.getWorldPosition().z, true); // Make sure - core.objectService.destroyObject(creature.getObjectID()); + if (creature!=null){ + core.simulationService.remove(creature, creature.getWorldPosition().x, creature.getWorldPosition().z, true); // Make sure + core.objectService.destroyObject(creature.getObjectID()); + } } + invaderMap.clear(); 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(){ + public void wipeDefenders(Map defenderMap){ for (TangibleObject banner : defensiveBanners){ core.objectService.destroyObject(banner.getObjectID()); } - core.objectService.destroyObject(defendingGeneral.getObjectID()); - core.objectService.destroyObject(defendingQuestOfficer.getObjectID()); + if (defensiveTable!=null) + core.objectService.destroyObject(defensiveTable.getObjectID()); + if (defendingGeneral!=null) + core.objectService.destroyObject(defendingGeneral.getObjectID()); + if (defendingQuestOfficer!=null) + core.objectService.destroyObject(defendingQuestOfficer.getObjectID()); + + for (Map.Entry entry : defenderMap.entrySet()) { + CreatureObject creature = entry.getValue(); + if (creature!=null){ + if (creature.getAttachment("AI")!=null){ + AIActor actor = (AIActor)creature.getAttachment("AI"); + actor.prepareDeletion(); + } + } + } -// 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 : defenderMap.entrySet()) { + CreatureObject creature = entry.getValue(); + if (creature!=null){ + if (creature.getAttachment("AI")!=null){ + AIActor actor = (AIActor)creature.getAttachment("AI"); + core.simulationService.remove(creature, creature.getWorldPosition().x, creature.getWorldPosition().z, true); // Make sure + actor.destroyActor(); + } + } + } + }, 5, TimeUnit.SECONDS); Executors.newSingleThreadScheduledExecutor().schedule(() -> { - for (Map.Entry entry : defendingCreatures.entrySet()) { + for (Map.Entry entry : defenderMap.entrySet()) { CreatureObject creature = entry.getValue(); - core.simulationService.remove(creature, creature.getWorldPosition().x, creature.getWorldPosition().z, true); // Make sure - core.objectService.destroyObject(creature.getObjectID()); + if (creature!=null){ + core.simulationService.remove(creature, creature.getWorldPosition().x, creature.getWorldPosition().z, true); // Make sure + core.objectService.destroyObject(creature.getObjectID()); + } } + defenderMap.clear(); 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 registerPhase2Objects(TangibleObject registrant){ + phase2Objects.put(phase2ObjectRegistryCounter++, registrant); + } + + public void deletePhase2Objects(){ + for (Map.Entry entry : phase2Objects.entrySet()) { + TangibleObject tano = entry.getValue(); + if (tano!=null){ + core.simulationService.remove(tano, tano.getWorldPosition().x, tano.getWorldPosition().z, true); // Make sure + core.objectService.destroyObject(tano.getObjectID()); + } + } + defendingCreatures.clear(); + } + + public void spawnOffensiveAssets(){ - spawnOffensiveCamps(); + spawnOffensiveCamps(); + spawnOffensiveCloners(); } public void spawnDefensiveAssets(){ spawnDefendingGeneral(); spawnDefensiveQuestOfficer(); - spawnBarricades(); - spawnTurrets(); - spawnTower(); spawnBanners(); spawnSupplyTerminals(); + spawnDefensivePlanningTable(); + } + + public void spawnDefensivePlanningTable(){ + if (invasionLocation==InvasionLocation.Keren){ + String template = "object/tangible/terminal/shared_planning_table_keren_reb.iff"; + if (defendingFaction==Factions.Imperial) + template = "object/tangible/terminal/shared_planning_table_keren_imp.iff"; + spawnDefensiveTable(new Point3D(1789.07F, 12, 2530.95F),new Quaternion(1,0F,0,0F),template); + } + if (invasionLocation==InvasionLocation.Bestine){ + String template = "object/tangible/terminal/shared_planning_table_bestine_reb.iff"; + if (defendingFaction==Factions.Imperial) + template = "object/tangible/terminal/shared_planning_table_bestine_imp.iff"; + spawnDefensiveTable(new Point3D(-1196.37F, 12, -3615.20F),new Quaternion(1,0F,0,0F),template); + } + if (invasionLocation==InvasionLocation.Dearic){ + String template = "object/tangible/terminal/shared_planning_table_dearic_reb.iff"; + if (defendingFaction==Factions.Imperial) + template = "object/tangible/terminal/shared_planning_table_dearic_imp.iff"; + spawnDefensiveTable(new Point3D(476.19F, 6, -3026.57F),new Quaternion(-0.37F,0F,0.92F,0F),template); + } + } + + public void spawnDefensiveTable(Point3D position, Quaternion quaternion, String template){ + + defensiveTable = (TangibleObject) core.objectService.createObject(template, 0, getInvasionPlanet(invasionLocation), position, quaternion); + core.simulationService.add(defensiveTable, defensiveTable.getPosition().x, defensiveTable.getPosition().z, true); + + String name = "gcw_reb_defense_table_n"; + String description = "gcw_reb_defense_table_d"; + if (defendingFaction==Factions.Imperial){ + name = "gcw_imp_defense_table_n"; + description = "gcw_imp_defense_table_d"; + } + + defensiveTable.setStfFilename("gcw"); + defensiveTable.setStfName(name); + defensiveTable.setDetailFilename("gcw"); + defensiveTable.setDetailName(description); } public void spawnSupplyTerminals(){ + if (invasionLocation==InvasionLocation.Keren){ + spawnDefensiveSupplyTerminal(new Point3D(1787.41F, 12, 2521.47F),new Quaternion(0,0F,1,0F)); + } + if (invasionLocation==InvasionLocation.Bestine){ + spawnDefensiveSupplyTerminal(new Point3D(-1212.58F, 12, -3614.57F),new Quaternion(0,0F,1,0F)); + } + if (invasionLocation==InvasionLocation.Dearic){ + spawnDefensiveSupplyTerminal(new Point3D(465.68F, 6, -3006.34F),new Quaternion(0,0F,1,0F)); + } } - public void testPylons(){ + public void spawnDefensiveSupplyTerminal(Point3D position, Quaternion quaternion){ + + // "object/tangible/terminal/shared_terminal_gcw_build_resource.iff" + String supplyTerminalTemplate = "object/tangible/terminal/shared_terminal_gcw_reb_def.iff"; // shared_terminal_gcw_reb_def.iff + if (defendingFaction==Factions.Imperial) + supplyTerminalTemplate = "object/tangible/terminal/shared_terminal_gcw_imp_def.iff"; - spawnDefensiveAssets(); - spawnOffensiveAssets(); + TangibleObject supplyTerminal1 = (TangibleObject) core.objectService.createObject(supplyTerminalTemplate, 0, getInvasionPlanet(invasionLocation), position, quaternion); + core.simulationService.add(supplyTerminal1, supplyTerminal1.getPosition().x, supplyTerminal1.getPosition().z, true); + supplyTerminal1.setStfFilename("gcw"); + supplyTerminal1.setStfName("terminal_gcw_reb_def_n"); + supplyTerminal1.setDetailFilename("gcw"); + supplyTerminal1.setDetailName("terminal_gcw_reb_def_d"); + if (defendingFaction==Factions.Imperial){ + supplyTerminalTemplate = "object/tangible/terminal/shared_terminal_gcw_imp_def.iff"; + supplyTerminal1.setStfFilename("gcw"); + supplyTerminal1.setStfName("terminal_gcw_reb_def_n"); + supplyTerminal1.setDetailFilename("gcw"); + supplyTerminal1.setDetailName("terminal_gcw_reb_def_d"); + } + defensiveSupplyTerminals.add(supplyTerminal1); + } + + 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"; - Quaternion quaternion = new Quaternion(0.28F,0F,0.95F,0F); + 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; + } + + if (!user.getFaction().equals(getFactionName(pylon.getPylonFaction()))){ + return; + } + // ToDo: Consider Factional Helpers + if (user.getFaction().equals(getFactionName(pylon.getPylonFaction())) && user.getFactionStatus() 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; + user.setConstructing(false); + 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; + user.setConstructing(false); + 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; + user.setConstructing(false); + core.suiService.closeSUIWindow(window.getOwner(),window.getWindowId()); + user.sendSystemMessage("@gcw:pylon_construction_incapacitated",(byte) 0); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + + }, 0, 1, TimeUnit.SECONDS); - GCWSpawner pylon1 = (GCWSpawner) core.objectService.createObject("object/tangible/loot/creature_loot/collections/shared_dejarik_table_base.iff", 0, core.terrainService.getPlanetByName("talus"), new Point3D(-48, 6, -2798), quaternion); - core.simulationService.add(pylon1, pylon1.getPosition().x, pylon1.getPosition().z, true); - pylon1.setPatrolRoute(PatrolRoute.Dearic1); - pylon1.setSpawnerType(PylonType.SoldierPatrol); - pylon1.setSpawnerFaction(invadingFaction); - pylon1.setSpawnLevel(3); + scheduler.schedule(new Runnable() { + @Override + public void run() { + try { + fut[0].cancel(true); + if (! cancelled[0]){ + TangibleObject tool = tools.get(0); + updatePylonFilling(pylon, tool); + user.setConstructing(false); + 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); - GCWSpawner pylon2 = (GCWSpawner) core.objectService.createObject("object/tangible/loot/creature_loot/collections/shared_dejarik_table_base.iff", 0, core.terrainService.getPlanetByName("talus"), new Point3D(-51, 6, -2798), quaternion); - core.simulationService.add(pylon2, pylon2.getPosition().x, pylon2.getPosition().z, true); - pylon2.setPatrolRoute(PatrolRoute.Dearic1); - pylon2.setSpawnerType(PylonType.VehiclePatrol); - pylon2.setSpawnerFaction(invadingFaction); - pylon2.setSpawnLevel(3); + } + + public void updatePylonFilling(GCWPylon pylon, TangibleObject tool){ -// GCWPylon pylon4 = (GCWPylon) core.objectService.createObject("object/tangible/gcw/shared_gcw_city_spawner.iff", 0, core.terrainService.getPlanetByName("talus"), new Point3D(506, 6, -3025), quaternion); -// core.simulationService.add(pylon4, pylon4.getPosition().x, pylon4.getPosition().z, true); -// pylon4.setPylonType(PylonType.SoldierPatrol); -// pylon4.setPylonFaction(invadingFaction); -// pylon4.setSpawnLevel(3); + int pylonFilling = (int)pylon.getAttachment("Filling"); + String pylonName = (String)pylon.getAttachment("Name"); + // determine power of tool + int power = 20; // assume 20 for now - GCWSpawner pylon3 = (GCWSpawner) core.objectService.createObject("object/tangible/loot/creature_loot/collections/shared_dejarik_table_base.iff", 0, core.terrainService.getPlanetByName("talus"), new Point3D(5, 6, -2683), quaternion); - core.simulationService.add(pylon3, pylon3.getPosition().x, pylon3.getPosition().z, true); - pylon3.setPatrolRoute(PatrolRoute.Dearic2); - pylon3.setSpawnerType(SpawnerType.SoldierPatrol); - pylon3.setSpawnerFaction(invadingFaction); - pylon3.setSpawnLevel(3); + 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.getFaction().equals(getFactionName(defendingFaction))){ + return; + } + // ToDo: Consider Factional Helpers + if (user.getFaction().equals(getFactionName(defendingFaction)) && user.getFactionStatus()=structure.getMaximumCondition()){ + return; + } + if (user.isConstructing()) + return; + if (structureCondition<10000){ + user.sendSystemMessage("@gcw:gcw_object_doesnt_need_repair",(byte) 0); + return; + } + - GCWSpawner pylon4 = (GCWSpawner) core.objectService.createObject("object/tangible/loot/creature_loot/collections/shared_dejarik_table_base.iff", 0, core.terrainService.getPlanetByName("talus"), new Point3D(141, 6, -2517), quaternion); - core.simulationService.add(pylon4, pylon4.getPosition().x, pylon4.getPosition().z, true); - pylon4.setPatrolRoute(PatrolRoute.Dearic3); - pylon4.setSpawnerType(SpawnerType.SoldierPatrol); - pylon4.setSpawnerFaction(invadingFaction); - pylon4.setSpawnLevel(3); + SUIWindow window = core.suiService.createSUIWindow("Script.countdownTimerBar", user, null, 5); + window.setProperty("bg.caption.lblTitle:Text", "Titletext"); + window.setProperty("Prompt.lblPrompt:Text", "Prompttext"); // CodeData + window.setProperty("bar.value:Text", "Prompttext"); + //countdown time + // @gcw:reparing_gcw_object + core.suiService.openSUIWindow(window); - GCWSpawner pylon5 = (GCWSpawner) core.objectService.createObject("object/tangible/loot/creature_loot/collections/shared_dejarik_table_base.iff", 0, core.terrainService.getPlanetByName("talus"), new Point3D(275, 6, -2481), quaternion); - core.simulationService.add(pylon5, pylon5.getPosition().x, pylon5.getPosition().z, true); - pylon5.setPatrolRoute(PatrolRoute.Dearic4); - pylon5.setSpawnerType(SpawnerType.SoldierPatrol); - pylon5.setSpawnerFaction(invadingFaction); - pylon5.setSpawnLevel(3); + user.setConstructing(true); + int repairtimeagain = 10; + int[] countdown = {repairtimeagain}; + final Point3D userpos = user.getWorldPosition(); + boolean[] cancelled = {false}; + final Future[] 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.setConstructing(false); + 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.setConstructing(false); + 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.setConstructing(false); + user.sendSystemMessage("@gcw:pylon_construction_incapacitated",(byte) 0); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + + }, 0, 1, TimeUnit.SECONDS); - GCWSpawner pylon5a = (GCWSpawner) core.objectService.createObject("object/tangible/loot/creature_loot/collections/shared_dejarik_table_base.iff", 0, core.terrainService.getPlanetByName("talus"), new Point3D(271, 6, -2481), quaternion); - core.simulationService.add(pylon5a, pylon5a.getPosition().x, pylon5a.getPosition().z, true); - pylon5a.setPatrolRoute(PatrolRoute.Dearic11); - pylon5a.setSpawnerType(SpawnerType.SiegeVehiclePatrol); - pylon5a.setSpawnerFaction(invadingFaction); - pylon5a.setSpawnLevel(3); + scheduler.schedule(new Runnable() { + @Override + public void run() { + try { + fut[0].cancel(true); + if (! cancelled[0]){ + int repairAmount = 5000; + int newCondition = structureCondition-repairAmount; + if (newCondition<0) + newCondition=0; + + structure.setConditionDamage(newCondition); + user.setConstructing(false); + tool.setUses(tool.getUses()-1); + if (tool.getUses()==0){ + core.objectService.destroyObject(tool.getObjectID()); + } + core.suiService.closeSUIWindow(window.getOwner(),window.getWindowId()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + }, repairtimeagain, TimeUnit.SECONDS); + + } + + public TangibleObject retrieveToolFromInventory(CreatureObject user, String toolTemplate){ - GCWSpawner pylon6 = (GCWSpawner) core.objectService.createObject("object/tangible/loot/creature_loot/collections/shared_dejarik_table_base.iff", 0, core.terrainService.getPlanetByName("talus"), new Point3D(519, 6, -2452), quaternion); - core.simulationService.add(pylon6, pylon6.getPosition().x, pylon6.getPosition().z, true); - pylon6.setPatrolRoute(PatrolRoute.Dearic5); - pylon6.setSpawnerType(SpawnerType.SoldierPatrol); - pylon6.setSpawnerFaction(invadingFaction); - pylon6.setSpawnLevel(3); + if (toolTemplate.length()==0) + return null; - GCWSpawner pylon7 = (GCWSpawner) core.objectService.createObject("object/tangible/loot/creature_loot/collections/shared_dejarik_table_base.iff", 0, core.terrainService.getPlanetByName("talus"), new Point3D(845, 6, -2550), quaternion); - core.simulationService.add(pylon7, pylon7.getPosition().x, pylon7.getPosition().z, true); - pylon7.setPatrolRoute(PatrolRoute.Dearic6); - pylon7.setSpawnerType(SpawnerType.SoldierPatrol); - pylon7.setSpawnerFaction(invadingFaction); - pylon7.setSpawnLevel(3); + // 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()0){ // For pets doing damage + damager = (CreatureObject)core.objectService.getObject(damager.getOwnerId()); + } + if (!damager.isPlayer()) + continue; + int warningLevel = 0; + + if (generalWarningLevelMap.get(damager)!=null) + warningLevel = generalWarningLevelMap.get(damager); + + if (actor.getDamageMap().get(damager)>3000 && warningLevel==0){ + // Warning 1 + generalWarningLevelMap.put(damager,1); + damager.sendSystemMessage("Attacking the general puts you at risk to become attackable by other players!", (byte) 0); + } + + if (actor.getDamageMap().get(damager)>10000 && warningLevel==1){ + // Warning 2 + generalWarningLevelMap.put(damager,2); + damager.sendSystemMessage("Continuing your attacks on the general will turn you special forces!", (byte) 0); + } + + if (actor.getDamageMap().get(damager)>15000 && warningLevel==2){ + // Warning 3 -> turn overt + generalWarningLevelMap.put(damager,3); + damager.sendSystemMessage("Your faction status is now special forces!", (byte) 0); + damager.setFactionStatus(FactionStatus.SpecialForces); + damager.updatePvpStatus(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + }, 10, 5000, TimeUnit.MILLISECONDS); } @@ -424,207 +1578,161 @@ public class InvasionService implements INetworkDispatch { } if (invasionLocation==InvasionLocation.Keren){ - defendingQuestOfficer = (CreatureObject) NGECore.getInstance().staticService.spawnObject(questOfficerTemplate, "naboo", 0L, 1787, 6, 2512, 1, 0); + defendingQuestOfficer = (CreatureObject) NGECore.getInstance().staticService.spawnObject(questOfficerTemplate, "naboo", 0L, 1787, 12, 2531, 1, 0); } if (invasionLocation==InvasionLocation.Bestine){ - defendingQuestOfficer = (CreatureObject) NGECore.getInstance().staticService.spawnObject(questOfficerTemplate, "tatooine", 0L, -1195, 6, -3620, 1, 0); + defendingQuestOfficer = (CreatureObject) NGECore.getInstance().staticService.spawnObject(questOfficerTemplate, "tatooine", 0L, -1195, 12, -3620, 1, 0); } if (invasionLocation==InvasionLocation.Dearic){ defendingQuestOfficer = (CreatureObject) NGECore.getInstance().staticService.spawnObject(questOfficerTemplate, "talus", 0L, 478, 6, -3023, 0, 1); } } + public void spawnOffensiveGeneral(){ + + String generalTemplate = "rebel_offensive_invasion_general"; + if (invadingFaction==Factions.Imperial){ + generalTemplate = "imp_offensive_invasion_general"; + } + + if (invasionLocation==InvasionLocation.Keren){ + invasionGeneral = (CreatureObject) NGECore.getInstance().staticService.spawnObject(generalTemplate, "naboo", 0L, 1206.99F, 7.33F, 3057.06F, 0.85F, 0.51F); + } + if (invasionLocation==InvasionLocation.Bestine){ + invasionGeneral = (CreatureObject) NGECore.getInstance().staticService.spawnObject(generalTemplate, "tatooine", 0L, -900, 12, -3782, 1, 0); + } + if (invasionLocation==InvasionLocation.Dearic){ + invasionGeneral = (CreatureObject) NGECore.getInstance().staticService.spawnObject(generalTemplate, "talus", 0L, -894.90F, 9.93F, -2993.29F, 0.96F, 0.26F); + } + + } + public void spawnOffensiveCamps(){ - Quaternion quaternion = new Quaternion(0.00F,0F,1.00F,0F); - String campTemplate = "object/building/military/shared_gcw_battlefield_base.iff"; - //String campTemplate = "object/building/poi/shared_gcw_rebel_clone_tent_small.iff"; // LOL why doesn't this spawn?!?!?! - BuildingObject camp = (BuildingObject) core.objectService.createObject(campTemplate, 0, core.terrainService.getPlanetByName("talus"), new Point3D(-890,9, -2994), quaternion); + String campTemplate = "object/building/poi/shared_scout_camp_s5.iff"; + if (invadingFaction==Factions.Imperial){ + campTemplate = "object/building/poi/shared_scout_camp_s5.iff"; + } + if (invasionLocation==InvasionLocation.Keren){ + spawnOffensiveCamp(new Point3D(1820, 17, 2192),new Quaternion(0.00F,0F,1.00F,0F),campTemplate); + spawnOffensiveCamp(new Point3D(2131, 60, 2766),new Quaternion(0.00F,0F,1.00F,0F),campTemplate); + spawnOffensiveCamp(new Point3D(1212, 7, 3054),new Quaternion(1.00F,0F,0.00F,0F),campTemplate); + + spawnOffensiveQuestOfficer(new Point3D(1820, 17, 2192), new Quaternion(0.81F,0F,-0.58F,0F)); + spawnOffensiveQuestOfficer(new Point3D(2135.60F,60.0F,2769.78F), new Quaternion(-0.58F,0F,0.81F,0F)); + spawnOffensiveQuestOfficer(new Point3D(1212, 7, 3054), new Quaternion(0.51F,0F,0.85F,0F)); + + spawnOffensiveGeneral(); + + spawnOffensiveSupplyTerminal(new Point3D(1204.51F,7.33F,3054.27F), new Quaternion(0.28F,0F,0.95F,0F)); + spawnOffensiveSupplyTerminal(new Point3D(2139.16F,60.0F,2765.92F), new Quaternion(0.98F,0F,-0.14F,0F)); + spawnOffensiveSupplyTerminal(new Point3D(1828.02F,17.34F,2192.75F), new Quaternion(0.96F,0F,-0.26F,0F)); + } + if (invasionLocation==InvasionLocation.Bestine){ + spawnOffensiveCamp(new Point3D(-900,24, -3782),new Quaternion(0.00F,0F,1.00F,0F),campTemplate); + spawnOffensiveCamp(new Point3D(-1253,44.77F, -3348),new Quaternion(0.00F,0F,1.00F,0F),campTemplate); + spawnOffensiveCamp(new Point3D(-1184,62.95F, -3821),new Quaternion(0.00F,0F,1.00F,0F),campTemplate); + + spawnOffensiveQuestOfficer(new Point3D(-900,24, -3782), new Quaternion(0.81F,0F,-0.58F,0F)); + spawnOffensiveQuestOfficer(new Point3D(-1253,44, -3348), new Quaternion(-0.58F,0F,0.81F,0F)); + spawnOffensiveQuestOfficer(new Point3D(-1184,62, -3821), new Quaternion(0.51F,0F,0.85F,0F)); + + spawnOffensiveGeneral(); + + spawnOffensiveSupplyTerminal(new Point3D(-903,24, -3782), new Quaternion(0.28F,0F,0.95F,0F)); + spawnOffensiveSupplyTerminal(new Point3D(-1256,44, -3348), new Quaternion(0.98F,0F,-0.14F,0F)); + spawnOffensiveSupplyTerminal(new Point3D(-1188,62, -3821), new Quaternion(0.96F,0F,-0.26F,0F)); + } + if (invasionLocation==InvasionLocation.Dearic){ + + spawnOffensiveCamp(new Point3D(-890,9.93F, -2994),new Quaternion(0.00F,0F,1.00F,0F),campTemplate); + spawnOffensiveCamp(new Point3D(-2,6, -2805),new Quaternion(0.00F,0F,1.00F,0F),campTemplate); + spawnOffensiveCamp(new Point3D(352.85F,6F, -2606.14F),new Quaternion(0.00F,0F,1.00F,0F),campTemplate); + + spawnOffensiveGeneral(); + + spawnOffensiveQuestOfficer(new Point3D(-890,9, -2994), new Quaternion(0.81F,0F,-0.58F,0F)); + spawnOffensiveQuestOfficer(new Point3D(-1.70F,6, -2802.84F), new Quaternion(0.52F,0F,0.85F,0F)); + spawnOffensiveQuestOfficer(new Point3D(355,6, -2605), new Quaternion(0.00F,0F,1.00F,0F)); + + spawnOffensiveSupplyTerminal(new Point3D(-882.80F,9.93F, -2994.76F), new Quaternion(1.00F,0F,0.00F,0F)); + spawnOffensiveSupplyTerminal(new Point3D(-1.33F,6, -2807.17F), new Quaternion(0.87F,0F,0.48F,0F)); + spawnOffensiveSupplyTerminal(new Point3D(347.56F,6, -2604.86F), new Quaternion(0.24F,0F,0.97F,0F)); + + } + } + + public void spawnOffensiveCamp(Point3D position, Quaternion quaternion, String campTemplate){ + // object/building/poi/shared_gcw_camp_rebel_recruiter.iff This IS the right template, but the client doesn't spawn it! + // This works at least object/building/poi/shared_scout_camp_s5.iff + BuildingObject camp = (BuildingObject) core.objectService.createObject(campTemplate, 0, getInvasionPlanet(invasionLocation), position, quaternion); //TangibleObject camp = (TangibleObject) core.objectService.createObject(campTemplate, 0, core.terrainService.getPlanetByName("talus"), new Point3D(-890,9, -2994), quaternion); core.simulationService.add(camp, camp.getPosition().x, camp.getPosition().z, true); - System.out.println("checkForObject: " + core.simulationService.checkForObject(30, camp)); - System.out.println("camp: " + camp.getTemplate()); + offensiveCamps.add(camp); } - public void spawnBarricades(){ - - createBarricade("object/tangible/destructible/shared_gcw_rebel_barricade.iff", 480.05F, 6, -3009.93F, 1.0F, 0F, 50000); - createBarricade("object/tangible/destructible/shared_gcw_rebel_barricade.iff", 483.42F, 6, -3007.00F, -0.7F, 0.7F, 50000); - createBarricade("object/tangible/destructible/shared_gcw_rebel_barricade.iff", 476.95F, 6, -3006.85F, -0.69F, 0.716F, 50000); - - createBarricade("object/tangible/destructible/shared_gcw_rebel_barricade.iff", 410.82F, 6, -3012.75F, 1.00F, 0.00F, 50000); - - createBarricade("object/tangible/destructible/shared_gcw_rebel_barricade.iff", 431.76F, 6, -3072.4F, 0.41F, 0.91F, 50000); - createBarricade("object/tangible/destructible/shared_gcw_rebel_barricade.iff", 444.5F, 6, -3074.5F, 0.41F, 0.91F, 50000); - - createBarricade("object/tangible/destructible/shared_gcw_rebel_barricade.iff", 509.8F, 6, -2955.06F, 0.72F, 0.69F, 50000); // Bank - - createBarricade("object/tangible/destructible/shared_gcw_rebel_barricade.iff", 552.81F, 6, -2938.06F, 0.72F, 0.69F, 50000); - - - createBarricade("object/tangible/destructible/shared_gcw_rebel_barricade.iff", 387.98F, 6, -2742.24F, 0.032F, 0.999F, 50000); - createBarricade("object/tangible/destructible/shared_gcw_rebel_barricade.iff", 332.25F, 6, -2741.97F, 0.032F, 0.999F, 50000); + + public void spawnOffensiveQuestOfficer(Point3D position, Quaternion quaternion){ + + String questOfficerTemplate = "rebel_invasion_captain"; + if (invadingFaction==Factions.Imperial) + questOfficerTemplate = "imp_invasion_captain"; + CreatureObject offensiveQuestOfficer = (CreatureObject)NGECore.getInstance().spawnService.spawnCreature(questOfficerTemplate, getInvasionPlanet(invasionLocation).getName(), 0L, position.x, position.y, position.z, quaternion.w, quaternion.x, quaternion.y,quaternion.z,-1); + offensiveQuestOfficers.add(offensiveQuestOfficer); } - public void spawnTurrets(){ - - createTurret("object/installation/turret/gcw/shared_adv_turret_dish_large_heat.iff", 557, 6, -3028, 0.62F, 0.78F, 2000, 2400); - createTurret("object/installation/turret/gcw/shared_adv_turret_dish_large_heat.iff", 405.09F, 6, -3020.4F, 1.00F, 0.00F, 2000, 2400); - createTurret("object/installation/turret/gcw/shared_adv_turret_dish_large_heat.iff", 423.5F, 6, -3059.5F, 0.97F, -0.23F, 2000, 2400); - createTurret("object/installation/turret/gcw/shared_adv_turret_dish_large_heat.iff", 498.87F, 6, -2950.12F, 0.72F, 0.69F, 2000, 2400); - // object/tangible/destructible/shared_gcw_rebel_turret.iff crashes the client, not fixable + public void spawnOffensiveSupplyTerminal(Point3D position, Quaternion quaternion){ + + // "object/tangible/terminal/shared_terminal_gcw_build_resource.iff" + String supplyTerminalTemplate = "object/tangible/terminal/shared_terminal_gcw_reb_offensiv.iff"; + if (invadingFaction==Factions.Imperial) + supplyTerminalTemplate = "object/tangible/terminal/shared_terminal_gcw_imp_offensiv.iff"; - createTurret("object/installation/turret/gcw/shared_adv_turret_dish_large_heat.iff", 378.07F, 6, -2742.26F, -0.023F, 0.999F, 2000, 2400); - } - - public void createTurret(String turretTemplate, float x, float y, float z, float qy, float qw, int minDamage, int maxDamage){ - Quaternion quaternion = new Quaternion(qy,0F,qw,0F); - InstallationObject turret = (InstallationObject) core.objectService.createObject(turretTemplate, 0, getInvasionPlanet(invasionLocation), new Point3D(x, y, z), quaternion); - //TangibleObject turret = (TangibleObject) core.objectService.createObject(turretTemplate, 0, getInvasionPlanet(invasionLocation), new Point3D(x, y, z), quaternion); - core.simulationService.add(turret, turret.getPosition().x, turret.getPosition().z, true); - String customName = "Rebel Turret"; - String factionString = "rebel"; - if (defendingFaction==Factions.Imperial){ - customName = "Imperial Turret"; - factionString = "imperial"; + TangibleObject supplyTerminal1 = (TangibleObject) core.objectService.createObject(supplyTerminalTemplate, 0, getInvasionPlanet(invasionLocation), position, quaternion); + core.simulationService.add(supplyTerminal1, supplyTerminal1.getPosition().x, supplyTerminal1.getPosition().z, true); + supplyTerminal1.setStfFilename("gcw"); + supplyTerminal1.setStfName("terminal_gcw_reb_offensiv_n"); + supplyTerminal1.setDetailFilename("gcw"); + supplyTerminal1.setDetailName("terminal_gcw_reb_offensiv_d"); + if (invadingFaction==Factions.Imperial){ + supplyTerminalTemplate = "object/tangible/terminal/shared_terminal_gcw_imp_offensiv.iff"; + supplyTerminal1.setStfFilename("gcw"); + supplyTerminal1.setStfName("terminal_gcw_imp_offensiv_n"); + supplyTerminal1.setDetailFilename("gcw"); + supplyTerminal1.setDetailName("terminal_gcw_imp_offensiv_d"); } - turret.setCustomName(customName); -// turret.setCustomName2(customName); + offensiveSupplyTerminals.add(supplyTerminal1); + } -// turret.setStfFilename(stfFilename); -// turret.setStfName(stfName); - -// InstallationMessageBuilder messageBuilder = new InstallationMessageBuilder(); -// // steal a session for lack of a better method -// Client stolenClient = null; -// synchronized(core.getActiveConnectionsMap()) { -// for (Client client : core.getActiveConnectionsMap().values()) { -// if (client.getParent() != null && client.getParent() instanceof CreatureObject) { -// if (((CreatureObject)client.getParent()).isPlayer()) -// stolenClient = client; -// } -// } -// } -// if (stolenClient!=null) -// stolenClient.getSession().write(messageBuilder.buildCustomNameDelta(turret,customName)); - - turret.setOptionsBitmask(Options.ATTACKABLE | Options.QUEST); - turret.setFaction(factionString); - turret.setFactionStatus(FactionStatus.Combatant); - turret.setMaximumCondition(50000); - TurretAIActor actor = new TurretAIActor(turret, turret.getPosition(), scheduler); - turret.setAttachment("AI", actor); - - WeaponObject turretWeapon = (WeaponObject) core.objectService.createObject("object/weapon/ranged/turret/shared_turret_heat.iff", turret.getPlanet()); - turretWeapon.setAttackSpeed(5.0F); - //turretWeapon.setAttackSpeed(0.50F); - turretWeapon.setWeaponType(WeaponType.RIFLE); - turretWeapon.setMaxRange(60.0F); // setMaxRange(60.0F); 14.0F - turretWeapon.setDamageType("energy"); - turretWeapon.setMinDamage(minDamage); - turretWeapon.setMaxDamage(maxDamage); - turret.add(turretWeapon); - turret.setAttachment("TurretWeapon",turretWeapon.getObjectID()); - Set 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 preparePhase2(){ + for (GCWPylon pylon : pylonList){ + pylon.convertToPhase2Object(); + core.objectService.destroyObject(pylon.getObjectID()); } - } - - 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"; + pylonList.clear(); + pylonList = null; + for (TangibleObject defensiveSupplyTerminal : defensiveSupplyTerminals){ + core.objectService.destroyObject(defensiveSupplyTerminal.getObjectID()); + } + for (TangibleObject offensiveSupplyTerminal : offensiveSupplyTerminals){ + core.objectService.destroyObject(offensiveSupplyTerminal.getObjectID()); } - 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(){ + if (invasionLocation==InvasionLocation.Keren){ + spawnKerenBanners(); + } + if (invasionLocation==InvasionLocation.Bestine){ + spawnBestineBanners(); + } + if (invasionLocation==InvasionLocation.Dearic){ + spawnDearicBanners(); + } + } + + public void spawnDearicBanners(){ // Starport createBanner(329.34F, 6, -2936.67F, 0.71F, 0.7F); @@ -653,6 +1761,19 @@ public class InvasionService implements INetworkDispatch { } + public void spawnKerenBanners(){ + + // Starport + createBanner(1436.87F, 13, 2764.41F, 0.71F, 0.7F); + createBanner(1436.46F, 13, 2777.70F, 0.71F, 0.7F); + + } + + public void spawnBestineBanners(){ + + // Starport + } + 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 @@ -677,206 +1798,195 @@ public class InvasionService implements INetworkDispatch { public void setInvasionPhase(int invasionPhase) { this.invasionPhase = invasionPhase; } - - public void sendInvaderMessage1(){ + + // Phase 1 messages + + public void send_Phase1_InvaderMessage1(){ String message = ""; if (invadingFaction==Factions.Imperial) - message = "@gcw:gcw_announcement_attack_city_imperial_talus_dearic"; + message = "@gcw:gcw_announcement_call_to_arms_imperial_" + getInvasionLocationName(); 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()); - } - } + message = "@gcw:gcw_announcement_call_to_arms_rebel_" + getInvasionLocationName(); + sendMessageToClients(invadingFaction, message); } - public void sendDefenderMessage1(){ + public void send_Phase1_DefenderMessage1(){ String message = ""; if (defendingFaction==Factions.Imperial) - message = "@gcw:gcw_announcement_man_defenses_imperial_talus_dearic"; + message = "@gcw:gcw_announcement_construct_defenses_imperial_" + getInvasionLocationName(); 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()); - } - } - } + message = "@gcw:gcw_announcement_construct_defenses_rebel_" + getInvasionLocationName(); + sendMessageToClients(defendingFaction, message); } - - public void sendInvaderMessage2(){ + public void send_Phase1_InvaderMessage2(){ String message = ""; if (invadingFaction==Factions.Imperial) - message = "@gcw:gcw_announcement_attack_half_done_imperial_talus_dearic"; + message = "@gcw:gcw_announcement_rally_for_invasion_imperial_" + getInvasionLocationName(); 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()); - } - } - } + message = "@gcw:gcw_announcement_rally_for_invasion_rebel_" + getInvasionLocationName(); + sendMessageToClients(invadingFaction, message); } - public void sendDefenderMessage2(){ + public void send_Phase1_DefenderMessage2(){ String message = ""; if (defendingFaction==Factions.Imperial) - message = "@gcw:gcw_announcement_defense_half_done_imperial_talus_dearic"; + message = "@gcw:gcw_announcement_building_almost_complete_imperial_" + getInvasionLocationName(); 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()); - } - } - } + message = "@gcw:gcw_announcement_building_almost_complete_rebel_" + getInvasionLocationName(); + sendMessageToClients(defendingFaction, message); } - public void sendInvaderMessage3(){ + + + // Phase 2 messages + + public void send_Phase2_InvaderMessage1(){ String message = ""; if (invadingFaction==Factions.Imperial) - message = "@gcw:gcw_announcement_attack_half_done_imperial_talus_dearic"; + message = "@gcw:gcw_announcement_attack_city_imperial_" + getInvasionLocationName(); 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()); - } - } - } + message = "@gcw:gcw_announcement_attack_city_rebel_" + getInvasionLocationName(); + sendMessageToClients(invadingFaction, message); } - public void sendDefenderMessage3(){ + public void send_Phase2_DefenderMessage1(){ String message = ""; if (defendingFaction==Factions.Imperial) - message = "@gcw:gcw_announcement_defense_half_done_imperial_talus_dearic"; + message = "@gcw:gcw_announcement_man_defenses_imperial_" + getInvasionLocationName(); 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()); - } - } - } + message = "@gcw:gcw_announcement_man_defenses_rebel_" + getInvasionLocationName(); + sendMessageToClients(defendingFaction, message); + } + + public void send_Phase2_InvaderMessage2(){ + String message = ""; + if (invadingFaction==Factions.Imperial) + message = "@gcw:gcw_announcement_attack_half_done_imperial_" + getInvasionLocationName(); + if (invadingFaction==Factions.Rebel) + message = "@gcw:gcw_announcement_attack_city_rebel_" + getInvasionLocationName(); + sendMessageToClients(invadingFaction, message); } - + public void send_Phase2_DefenderMessage2(){ + String message = ""; + if (defendingFaction==Factions.Imperial) + message = "@gcw:gcw_announcement_defense_half_done_imperial_" + getInvasionLocationName(); + if (defendingFaction==Factions.Rebel) + message = "@gcw:gcw_announcement_defense_half_done_rebel_" + getInvasionLocationName(); + sendMessageToClients(defendingFaction, message); + } + public void sendInvaderWonMessage(){ String message = ""; if (invadingFaction==Factions.Imperial) - message = "@gcw:gcw_announcement_city_won_imperial_talus_dearic"; + message = "@gcw:gcw_announcement_city_won_imperial_" + getInvasionLocationName(); 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()); - } - } - } + message = "@gcw:gcw_announcement_city_won_rebel_" + getInvasionLocationName(); + sendMessageToClients(invadingFaction, message); } 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()); - } - } + if (getInvasionLocationName().equals("talus_dearic")){ + if (defendingFaction==Factions.Imperial) + message = "@gcw:gcw_announcement_won_attack_imperial_" + getInvasionLocationName(); + if (defendingFaction==Factions.Rebel) + message = "@gcw:gcw_announcement_won_attack_rebel_" + getInvasionLocationName(); + } else { + if (defendingFaction==Factions.Imperial) + message = "@gcw:gcw_announcement_city_safe_imperial_" + getInvasionLocationName(); + if (defendingFaction==Factions.Rebel) + message = "@gcw:gcw_announcement_city_safe_rebel_" + getInvasionLocationName(); } + sendMessageToClients(defendingFaction, message); } public void sendInvaderLostMessage(){ String message = ""; if (defendingFaction==Factions.Imperial) - message = "@gcw:gcw_announcement_city_lost_imperial_tatooine_bestine"; + message = "@gcw:gcw_announcement_city_lost_imperial_" + getInvasionLocationName(); 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()); - } - } - } + message = "@gcw:gcw_announcement_city_lost_rebel_" + getInvasionLocationName(); + sendMessageToClients(invadingFaction, message); } + public void sendCitySafeMessage(){ + String message = ""; + if (invadingFaction==Factions.Imperial) + message = "@gcw:gcw_announcement_city_end_safe_imperial_" + getInvasionLocationName(); + if (invadingFaction==Factions.Rebel) + message = "@gcw:gcw_announcement_city_end_safe_rebel_" + getInvasionLocationName(); + sendMessageToClients(invadingFaction, message); + } + + + + public void sendDefenderLostMessage(){ String message = ""; if (defendingFaction==Factions.Imperial) - message = "@gcw:gcw_announcement_city_lost_imperial_talus_dearic"; + message = "@gcw:gcw_announcement_city_lost_imperial_" + getInvasionLocationName(); if (defendingFaction==Factions.Rebel) - message = "@gcw:gcw_announcement_city_lost_rebel_talus_dearic"; + message = "@gcw:gcw_announcement_city_lost_rebel_" + getInvasionLocationName(); + sendMessageToClients(defendingFaction, message); + } + + public void sendInvaderGeneralAttackMessage(){ + String message = ""; + if (defendingFaction==Factions.Imperial) + message = "@gcw:gcw_announcement_attack_half_done_imperial_" + getInvasionLocationName(); + if (defendingFaction==Factions.Rebel) + message = "@gcw:gcw_announcement_attack_half_done_rebel_" + getInvasionLocationName(); + sendMessageToClients(invadingFaction, message); + } + + public void sendDefenderGeneralAttackMessage(){ + String message = ""; + if (defendingFaction==Factions.Imperial) + message = "@gcw:gcw_announcement_general_under_attack_imperial_" + getInvasionLocationName(); + if (defendingFaction==Factions.Rebel) + message = "@gcw:gcw_announcement_general_under_attack_rebel_" + getInvasionLocationName(); + sendMessageToClients(defendingFaction, message); + } + + public void sendInvaderGeneralHalfMessage(){ // Is there any? +// String message = ""; +// if (defendingFaction==Factions.Imperial) +// message = "@gcw:gcw_announcement_city_lost_imperial_" + getInvasionLocationName(); +// if (defendingFaction==Factions.Rebel) +// message = "@gcw:gcw_announcement_city_lost_rebel_" + getInvasionLocationName(); +// sendMessageToClients(invadingFaction, message); + } + + public void sendDefenderGeneralHalfMessage(){ + String message = ""; + if (defendingFaction==Factions.Imperial) + message = "@gcw:gcw_announcement_invasion_almost_defeated_imperial_" + getInvasionLocationName(); + if (defendingFaction==Factions.Rebel) + message = "@gcw:gcw_announcement_invasion_almost_defeated_rebel_" + getInvasionLocationName(); + sendMessageToClients(defendingFaction, message); + } + + public void sendMessageToClients(int tofaction, String message){ +// String modelTemplate = defendingGeneral.getTemplate(); +// if (tofaction==Factions.Imperial) +// modelTemplate = invasionGeneral.getTemplate(); + String modelTemplate = defendingGeneral.getTemplate(); + if (invadingFaction==tofaction) + modelTemplate = invasionGeneral.getTemplate(); + +// if (tofaction==Factions.Imperial) +// modelTemplate = invasionGeneral.getTemplate(); 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))){ + String faction = ((CreatureObject)client.getParent()).getFaction(); + if (client.getParent().getPlanet().equals(getInvasionPlanet(invasionLocation)) && faction.equals(getFactionName(tofaction))){ CommPlayerMessage comm = new CommPlayerMessage(client.getParent().getObjectId(), OutOfBand.ProsePackage(message)); comm.setTime(2000); - comm.setModel(defendingGeneral.getTemplate()); + comm.setModel(modelTemplate); client.getSession().write(comm.serialize()); } } @@ -884,6 +1994,7 @@ public class InvasionService implements INetworkDispatch { } + public Planet getInvasionPlanet(int location){ Planet planet = null; switch (location){ @@ -903,30 +2014,188 @@ public class InvasionService implements INetworkDispatch { return; for (CreatureObject enemy : enemies) { AIActor actor = (AIActor)enemy.getAttachment("AI"); + if (actor==null) + return; actor.addDefender(defendingGeneral); } } public float getDistanceToDefensiveGeneral(CreatureObject checker){ - float dist = checker.getWorldPosition().getDistance2D(defendingGeneral.getWorldPosition()); - return dist; + //float dist = checker.getWorldPosition().getDistance2D(defendingGeneral.getWorldPosition()); + //return dist; + return NGECore.getInstance().aiService.distanceSquared2D(defendingGeneral.getWorldPosition(), checker.getWorldPosition()); } public CreatureObject getDefensiveGeneral(){ return defendingGeneral; } + + public boolean checkInvasionDeath(CreatureObject dead){ + boolean value = false; + if (invasionScheduled){ + String funeralSite = dead.getPlanet().getName(); + if (funeralSite.equals(invasionPlanet)){ + if (invasionLocationCenter.getDistance2D(dead.getWorldPosition())<500){ + value = true; + } + } + } + return value; + } + + public List getAccordingCloners(CreatureObject dead){ + List clonerList = new Vector(); + if (invasionScheduled){ + String funeralSite = dead.getPlanet().getName(); + if (funeralSite.equals(invasionPlanet)){ + if (invasionLocationCenter.getDistance2D(dead.getWorldPosition())<500){ + if (isInvadingFaction(dead)){ + clonerList = getInvaderClonersForPlanet(); + } + } + } + } + return clonerList; + } + + public List getInvaderClonersForPlanet(){ + return offensiveClonerList; + } + + public boolean isInvadingFaction(CreatureObject checker){ + if (checker.getFaction().equals(getFactionName(invadingFaction))) + return true; + return false; + } + + public boolean isdefendingFaction(CreatureObject checker){ + if (checker.getFaction().equals(getFactionName(defendingFaction))) + return true; + return false; + } + + private void spawnOffensiveCloners(){ + String clonerTemplate = "object/tangible/gcw/static_base/shared_invisible_cloner_rebel.iff"; + if (invadingFaction==Factions.Imperial){ + clonerTemplate = "object/tangible/gcw/static_base/shared_invisible_cloner_imperial.iff"; + } + + Point3D cloner1Pos = null; + Point3D cloner2Pos = null; + Point3D cloner3Pos = null; + switch (invasionPlanet) { + case "naboo": cloner1Pos = new Point3D(1814.81F, 17.34F, 2183.17F); + cloner2Pos = new Point3D(2125.71F, 60, 2756.94F); + cloner3Pos = new Point3D(1217.18F, 7.33F, 3062.95F); + break; + case "tatooine": cloner1Pos = new Point3D(-905.35F,24, -3791.04F); + cloner2Pos = new Point3D(-1258.13F,44.77F, -3357.66F); + cloner3Pos = new Point3D(-1189.65F,62.95F, -3830.22F); + break; + case "talus": cloner1Pos = new Point3D(-895.30F,9.93F, -3003.25F); + cloner2Pos = new Point3D(-7.27F,6, -2813.55F); + cloner3Pos = new Point3D(347.51F,6F, -2614.82F); + break; + } + + BuildingObject cloner1 = (BuildingObject) NGECore.getInstance().objectService.createObject(clonerTemplate, 0, core.terrainService.getPlanetByName(invasionPlanet), cloner1Pos, new Quaternion(0.00F,0F,1.00F,0F)); + NGECore.getInstance().simulationService.add(cloner1, cloner1.getPosition().x, cloner1.getPosition().z, true); + cloner1.setCustomName("Attack camp #1"); + Vector spawnPoints = new Vector(); + spawnPoints.add(new SpawnPoint(cloner1Pos,0F,1F)); + cloner1.setAttachment("spawnPoints", spawnPoints); + core.mapService.addLocation(cloner1.getPlanet(), "Attack camp #1", cloner1.getPosition().x, cloner1.getPosition().z, (byte)5, (byte)0, (byte)0); + + BuildingObject cloner2 = (BuildingObject) NGECore.getInstance().objectService.createObject(clonerTemplate, 0, core.terrainService.getPlanetByName(invasionPlanet), cloner2Pos, new Quaternion(0.00F,0F,1.00F,0F)); + NGECore.getInstance().simulationService.add(cloner2, cloner2.getPosition().x, cloner2.getPosition().z, true); + cloner2.setCustomName("Attack camp #2"); + spawnPoints = new Vector(); + spawnPoints.add(new SpawnPoint(cloner2Pos,0F,1F)); + cloner2.setAttachment("spawnPoints", spawnPoints); + core.mapService.addLocation(cloner2.getPlanet(), "Attack camp #2", cloner2.getPosition().x, cloner2.getPosition().z, (byte)5, (byte)0, (byte)0); + + BuildingObject cloner3 = (BuildingObject) NGECore.getInstance().objectService.createObject(clonerTemplate, 0, core.terrainService.getPlanetByName(invasionPlanet), cloner3Pos, new Quaternion(0.00F,0F,1.00F,0F)); + NGECore.getInstance().simulationService.add(cloner3, cloner3.getPosition().x, cloner3.getPosition().z, true); + cloner3.setCustomName("Attack camp #3"); + spawnPoints = new Vector(); + spawnPoints.add(new SpawnPoint(cloner3Pos,0F,1F)); + cloner3.setAttachment("spawnPoints", spawnPoints); + core.mapService.addLocation(cloner3.getPlanet(), "Attack camp #3", cloner3.getPosition().x, cloner3.getPosition().z, (byte)5, (byte)0, (byte)0); + + offensiveClonerList.add(cloner1); + offensiveClonerList.add(cloner2); + offensiveClonerList.add(cloner3); + } + + // Utility method + public void arrangePylons(Point3D center, int angle){ + + int pylondistance= 4; + + Point3D pylonRefPos1 = new Point3D(-2*pylondistance,0,-pylondistance); + Point3D pylonRefPos2 = new Point3D(-pylondistance,0,pylondistance); + Point3D pylonRefPos3 = new Point3D(0,0,-pylondistance); + Point3D pylonRefPos4 = new Point3D(pylondistance,0,pylondistance); + Point3D pylonRefPos5 = new Point3D(2*pylondistance,0,-pylondistance); + + Point3D pylonTurnedPos1 = turnPoint(pylonRefPos1, angle); + Point3D pylonTurnedPos2 = turnPoint(pylonRefPos2, angle); + Point3D pylonTurnedPos3 = turnPoint(pylonRefPos3, angle); + Point3D pylonTurnedPos4 = turnPoint(pylonRefPos4, angle); + Point3D pylonTurnedPos5 = turnPoint(pylonRefPos5, angle); + + + float positionY1 = core.terrainService.getHeight(getInvasionPlanet(invasionLocation).getID(), center.x + pylonTurnedPos1.x, center.z + pylonTurnedPos1.z); + float positionY2 = core.terrainService.getHeight(getInvasionPlanet(invasionLocation).getID(), center.x + pylonTurnedPos2.x, center.z + pylonTurnedPos2.z); + float positionY3 = core.terrainService.getHeight(getInvasionPlanet(invasionLocation).getID(), center.x + pylonTurnedPos3.x, center.z + pylonTurnedPos3.z); + float positionY4 = core.terrainService.getHeight(getInvasionPlanet(invasionLocation).getID(), center.x + pylonTurnedPos4.x, center.z + pylonTurnedPos4.z); + float positionY5 = core.terrainService.getHeight(getInvasionPlanet(invasionLocation).getID(), center.x + pylonTurnedPos5.x, center.z + pylonTurnedPos5.z); + + Point3D pylonWorldPos1 = new Point3D(center.x + pylonTurnedPos1.x,positionY1,center.z + pylonTurnedPos1.z); + Point3D pylonWorldPos2 = new Point3D(center.x + pylonTurnedPos2.x,positionY2,center.z + pylonTurnedPos2.z); + Point3D pylonWorldPos3 = new Point3D(center.x + pylonTurnedPos3.x,positionY3,center.z + pylonTurnedPos3.z); + Point3D pylonWorldPos4 = new Point3D(center.x + pylonTurnedPos4.x,positionY4,center.z + pylonTurnedPos4.z); + Point3D pylonWorldPos5 = new Point3D(center.x + pylonTurnedPos5.x,positionY5,center.z + pylonTurnedPos5.z); + + System.out.println("new Point3D(" + pylonWorldPos1.x + "F, " + pylonWorldPos1.y + "F, " + pylonWorldPos1.z + "F)"); + System.out.println("new Point3D(" + pylonWorldPos2.x + "F, " + pylonWorldPos2.y + "F, " + pylonWorldPos2.z + "F)"); + System.out.println("new Point3D(" + pylonWorldPos3.x + "F, " + pylonWorldPos3.y + "F, " + pylonWorldPos3.z + "F)"); + System.out.println("new Point3D(" + pylonWorldPos4.x + "F, " + pylonWorldPos4.y + "F, " + pylonWorldPos4.z + "F)"); + System.out.println("new Point3D(" + pylonWorldPos5.x + "F, " + pylonWorldPos5.y + "F, " + pylonWorldPos5.z + "F)"); + } + + private Point3D turnPoint(Point3D orig, int angle){ + double origangle = Math.toDegrees(Math.atan2(orig.x, orig.z)); + double hypo = Math.sqrt(orig.x*orig.x+orig.z*orig.z); + double newAngle = origangle + angle; + float newX = (float)(hypo * Math.sin(Math.toRadians(newAngle))); + float newZ = (float)(hypo * Math.cos(Math.toRadians(newAngle))); + Point3D result = new Point3D(newX,0,newZ); + return result; + } + + public void setInvasionLocationCenter(){ switch (invasionLocation){ case InvasionLocation.Dearic : invasionLocationCenter = new Point3D(452,6,-3002); break; - case InvasionLocation.Keren : invasionLocationCenter = new Point3D(); + case InvasionLocation.Keren : invasionLocationCenter = new Point3D(1840,12,2635); break; - case InvasionLocation.Bestine : invasionLocationCenter = new Point3D(); + case InvasionLocation.Bestine : invasionLocationCenter = new Point3D(-1192,12,-3606); break; } } + public String getInvasionLocationName(){ + switch (invasionLocation){ + case InvasionLocation.Dearic : return "talus_dearic"; + case InvasionLocation.Keren : return "naboo_keren"; + case InvasionLocation.Bestine : return "tatooine_bestine"; + } + return ""; + } + public String getFactionName(int faction){ if (faction==Factions.Rebel) return "rebel"; @@ -952,6 +2221,5 @@ public class InvasionService implements INetworkDispatch { public static final int Bestine = 1; public static final int Dearic = 2; - } - + } } diff --git a/src/services/gcw/InvasionService3.java b/src/services/gcw/InvasionService3.java new file mode 100644 index 00000000..d8b0f48e --- /dev/null +++ b/src/services/gcw/InvasionService3.java @@ -0,0 +1,1390 @@ +/******************************************************************************* + * 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/object/ObjectService.java b/src/services/object/ObjectService.java index 62c5395a..724e9d86 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -283,13 +283,13 @@ public class ObjectService implements INetworkDispatch { } else if(Template.startsWith("object/tangible/destructible/shared_gcw_city_construction_beacon")) { - float positionY = core.terrainService.getHeight(planet.getID(), position.x, position.z)-1f; + float positionY = core.terrainService.getHeight(planet.getID(), position.x, position.z)-1.5f; Point3D newpoint = new Point3D(position.x,positionY,position.z); object = new GCWPylon(objectID, planet, position, orientation, Template); } else if(Template.startsWith("object/tangible/loot/creature_loot/collections/shared_dejarik_table_base")) { - float positionY = core.terrainService.getHeight(planet.getID(), position.x, position.z)+1f; + float positionY = core.terrainService.getHeight(planet.getID(), position.x, position.z)+0.3f; Point3D newpoint = new Point3D(position.x,positionY,position.z); object = new GCWSpawner(objectID, planet, position, orientation, Template); @@ -303,6 +303,17 @@ public class ObjectService implements INetworkDispatch { //object = new BuildingObject(objectID, planet, position, orientation, Template); + } else if(Template.startsWith("object/tangible/gcw/static_base/shared_invisible_cloner")) { + + object = new BuildingObject(objectID, planet, position, orientation, Template); + if(!isSnapshot && !overrideSnapshot && object.getPortalVisitor() != null) { + int cellCount = object.getPortalVisitor().cells.size() - 1; // -1 for index 0 cell which is outside the building and used for ai pathfinding + for (int i = 0; i < cellCount; i++) { + CellObject cell = (CellObject) createObject("object/cell/shared_cell.iff", planet); + cell.setCellNumber(i+1); + object.add(cell); + } + } } else if(Template.startsWith("object/tangible")) { object = new TangibleObject(objectID, planet, position, orientation, Template); @@ -1282,7 +1293,6 @@ public class ObjectService implements INetworkDispatch { } public void loadBuildoutObjects(Planet planet) throws InstantiationException, IllegalAccessException { - DatatableVisitor buildoutTable = ClientFileManager.loadFile("datatables/buildout/areas_" + planet.getName() + ".iff", DatatableVisitor.class); for (int i = 0; i < buildoutTable.getRowCount(); i++) { @@ -1290,7 +1300,6 @@ public class ObjectService implements INetworkDispatch { String areaName = (String) buildoutTable.getObject(i, 0); float x1 = (Float) buildoutTable.getObject(i, 1); float z1 = (Float) buildoutTable.getObject(i, 2); - readBuildoutDatatable(ClientFileManager.loadFile("datatables/buildout/" + planet.getName() + "/" + areaName + ".iff", DatatableVisitor.class), planet, x1, z1); } diff --git a/src/services/spawn/MobileTemplate.java b/src/services/spawn/MobileTemplate.java index dd4a2fbf..efbf7844 100644 --- a/src/services/spawn/MobileTemplate.java +++ b/src/services/spawn/MobileTemplate.java @@ -63,6 +63,7 @@ public class MobileTemplate implements Cloneable { private String PCDTemplate=""; private String conversationFileName=""; private boolean AIEnabled = true; + private boolean noAI = false; public Vector getTemplates() { @@ -378,5 +379,13 @@ public class MobileTemplate implements Cloneable { public void setAIEnabled(boolean aIEnabled) { AIEnabled = aIEnabled; } + + public boolean isNoAI() { + return noAI; + } + + public void setNoAI(boolean noAI) { + this.noAI = noAI; + } } diff --git a/src/services/spawn/SpawnService.java b/src/services/spawn/SpawnService.java index a036bc9a..b373a681 100644 --- a/src/services/spawn/SpawnService.java +++ b/src/services/spawn/SpawnService.java @@ -38,6 +38,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; +import protocol.swg.UpdateContainmentMessage; import resources.common.collidables.CollidableBox; import resources.common.collidables.CollidableCircle; import resources.datatables.Options; @@ -164,6 +165,11 @@ public class SpawnService { defaultWeapon.setWeaponType(weaponTemplates.get(rnd).getWeaponType()); defaultWeapon.setMaxRange(weaponTemplates.get(rnd).getMaxRange()); defaultWeapon.setDamageType(weaponTemplates.get(rnd).getDamageType()); + if (defaultWeapon.getTemplate().contains("atst_ranged")){ + defaultWeapon.setStfFilename("theme_park_name"); + defaultWeapon.setStfName("at_st"); + } + } if (weaponTemplates.get(rnd).getMinDamage() != 0 && weaponTemplates.get(rnd).getMaxDamage() != 0) { @@ -174,8 +180,14 @@ public class SpawnService { defaultWeapon.setMinDamage(creature.getLevel() * 22); } - creature.addObjectToEquipList(defaultWeapon); - creature.add(defaultWeapon); + 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.setWeaponId(defaultWeapon.getObjectID()); creature.addObjectToEquipList(inventory); creature.add(inventory); @@ -213,9 +225,15 @@ public class SpawnService { } if (mobileTemplate.isAIEnabled()){ - AIActor actor = new AIActor(creature, creature.getPosition(), scheduler); + if (!mobileTemplate.isNoAI()){ // NoAI is for QuestGivers that don't fight to save resources + AIActor actor = new AIActor(creature, creature.getPosition(), scheduler); + creature.setAttachment("AI", actor); + actor.setMobileTemplate(mobileTemplate); + } + } else { // AIEnabled is to dynamically switch the AI on later + AIActor actor = new AIActor(creature, creature.getPosition(), scheduler, false); creature.setAttachment("AI", actor); - actor.setMobileTemplate(mobileTemplate); + actor.setMobileTemplate(mobileTemplate); } creature.setAttachment("radial_filename", "npc/mobile");