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
This commit is contained in:
CharonInferar
2014-08-02 00:06:22 +02:00
parent b1f05c6802
commit 5981efda9f
56 changed files with 5074 additions and 1232 deletions
+17
View File
@@ -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
+14
View File
@@ -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
+3 -2
View File
@@ -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
+50 -1
View File
@@ -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)
@@ -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')
@@ -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)
@@ -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
@@ -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')
@@ -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
@@ -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')
@@ -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)
@@ -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
@@ -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')
@@ -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)
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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