diff --git a/sku.0/sys.server/compiled/game/.idea/workspace.xml b/sku.0/sys.server/compiled/game/.idea/workspace.xml
index 3f52b1fb4..5266d59e2 100755
--- a/sku.0/sys.server/compiled/game/.idea/workspace.xml
+++ b/sku.0/sys.server/compiled/game/.idea/workspace.xml
@@ -456,6 +456,7 @@
+
@@ -1487,18 +1488,8 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+
@@ -1507,78 +1498,38 @@
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
+
+
@@ -1595,41 +1546,42 @@
- squad_blacksun_tier4_patrol_02
- squad_blacksun_tier4_patrol_03
- blacksun_.*tier4
- rebel_spacestation
- spacestation_rebel
- getShipShieldHitpoints
- combat_ship
- OnShipHit
- setShipSlotTargetable
- turret
- imperial_lancer
- losingRole
- defendingFaction
- defendingFaction"
- getObjIdArrayData
- getAllPlayersInShip
- hasScript
- OnShipWas
- LOITER
- patrolRandomPath
- station
- debug
+ authoritative
+ remoteMessageTo
+ localMessageTo
+ space_lok
hasMessageTo
- rebelhelper
- "attackingFaction"
- capital
spacebattlestatus
- dec
- OnShipWasHit
- battle_spawner
+ servertime
+ capitalShipDestroyed
+ OnAboutToBeDestroyed
+ intInvincible
+ last_battle_time
+ light_fighter_light_fighter_tier3
+ lastBattleTime
+ self.
+ LOG("space_gcw",
+ + ".active"
+ heroSpawnTime
+ .active
+ isBattleActive
+ exterior_spawner
+ interior_spawner
+ ewok
+ pie.rsp
+ mob_spawner
+ poi_ewok_hut
+ endor_ewok_large1
+ datatables/poi
+ poi_mob_spawner
+ tatooine_filler_egg
+ capital
imperial_space_gcw
/
+ spaceLog(
Z:\swg-main\dsrc\sku.0\sys.server\compiled\game\datatables\spacequest
@@ -1669,7 +1621,6 @@
-
@@ -1696,26 +1647,27 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
+
+
@@ -1734,9 +1686,9 @@
-
-
+
+
@@ -1744,40 +1696,11 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -2055,7 +1978,7 @@
-
+
@@ -2063,15 +1986,15 @@
-
+
-
-
+
+
@@ -2104,278 +2027,10 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -2399,7 +2054,6 @@
-
@@ -2407,55 +2061,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -2463,7 +2068,6 @@
-
@@ -2471,29 +2075,19 @@
-
-
-
-
-
-
-
-
-
-
+
-
-
+
@@ -2501,7 +2095,7 @@
-
+
@@ -2509,7 +2103,7 @@
-
+
@@ -2517,8 +2111,318 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sku.0/sys.server/compiled/game/datatables/space_mobile/space_mobile.tab b/sku.0/sys.server/compiled/game/datatables/space_mobile/space_mobile.tab
old mode 100644
new mode 100755
index d9ce6cc83..9ce4e3460
--- a/sku.0/sys.server/compiled/game/datatables/space_mobile/space_mobile.tab
+++ b/sku.0/sys.server/compiled/game/datatables/space_mobile/space_mobile.tab
@@ -1,6 +1,6 @@
strIndex strComments strShip strPilot shipClass intXP fltItemChance intRolls strLootLookup novaOrionLoot collectionRoll collectionLoot intMinCredits intMaxCredits isAggro space_faction alliedFactions enemyFactions intImperialFactionPoints intRebelFactionPoints index_color_1 index_color_2 index_texture_1 objvars scriptlist cargo strCapitalShipType strBoardingType strInteriorChassisType strBoardingType formationPriority strAppearance strTauntDiction fltAttackTauntChance fltDefendTauntChance fltDieTauntChance fltIntroTauntChance strConversation
s[unique] s s s "e(fighter=0,bomber=1,capital=2,transport=3)[fighter]" i f i s i[-1] i[4] s[no_loot] i i i s s s i i i[-1] i[-1] i[-1] s s s s s s s i[5] s s f f f f s
-anthropology_collector dantooine mob z95_tier3 light_fighter_light_fighter_tier3 fighter 1280 0.15 1 story_dantooine_anthro tier3_components 120 294 0 civilian civilian 3 0 2 civilian
+anthropology_collector dantooine mob z95_tier3 light_fighter_tier3 fighter 1280 0.15 1 story_dantooine_anthro tier3_components 120 294 0 civilian civilian 3 0 2 civilian
anthropology_diplomat dantooine mob z95_tier3 light_fighter_tier3 fighter 1280 0.15 1 story_dantooine_anthro tier3_components 120 294 0 civilian civilian 3 0 2 civilian
anthropology_guardian dantooine mob z95_tier3 light_fighter_tier3 fighter 1280 0.15 1 story_dantooine_anthro tier3_components 120 294 0 civilian civilian 3 0 2 civilian
anthropology_professor_boss dantooine boss mob z95_tier4 light_fighter_tier5 fighter 3276.8 0.14 1 story_dantooine_anthro 5 tier5_components 225 525 0 civilian civilian 3 0 2 civilian
diff --git a/sku.0/sys.server/compiled/game/script/library/space_combat.java b/sku.0/sys.server/compiled/game/script/library/space_combat.java
index 8c3b24618..52a0fd713 100755
--- a/sku.0/sys.server/compiled/game/script/library/space_combat.java
+++ b/sku.0/sys.server/compiled/game/script/library/space_combat.java
@@ -3441,6 +3441,8 @@ public class space_combat extends script.base_script
space_utils.notifyObject(objDefender, "OnHullNearlyDestroyed", dctParams);
}
if(fltChassisHitPoints <= fltDamage && hasScript(objDefender, "systems.gcw.space.hero_ship")){
+ if(hasObjVar(objDefender, "intInvincible")) return 0;
+ setObjVar(objDefender, "intInvincible", 1);
dictionary params = new dictionary();
params.put("attacker", objAttacker);
space_utils.notifyObject(objDefender, "OnAboutToBeDestroyed", params);
diff --git a/sku.0/sys.server/compiled/game/script/space/combat/combat_ship.java b/sku.0/sys.server/compiled/game/script/space/combat/combat_ship.java
index 9ec35af10..f0f96cc75 100755
--- a/sku.0/sys.server/compiled/game/script/space/combat/combat_ship.java
+++ b/sku.0/sys.server/compiled/game/script/space/combat/combat_ship.java
@@ -198,6 +198,13 @@ public class combat_ship extends script.base_script
}
}
float fltDamage = space_combat.getShipWeaponDamage(objAttacker, self, intWeaponSlot, isMissile);
+
+ // scale back cap ship to cap ship damage for space gcw battles
+ if(hasScript(self, "systems.gcw.space.capital_ship") && hasScript(objAttacker, "systems.gcw.space.capital_ship")){
+ // scale damage down 50%
+ fltDamage = fltDamage * 0.25f;
+ }
+
if (isIdValid(getPilotId(self)))
{
if (hasObjVar(getPilotId(self), "intCombatDebug"))
diff --git a/sku.0/sys.server/compiled/game/script/space/combat/combat_ship_player.java b/sku.0/sys.server/compiled/game/script/space/combat/combat_ship_player.java
index d365109e4..ef1f537da 100755
--- a/sku.0/sys.server/compiled/game/script/space/combat/combat_ship_player.java
+++ b/sku.0/sys.server/compiled/game/script/space/combat/combat_ship_player.java
@@ -2691,9 +2691,9 @@ public class combat_ship_player extends script.base_script
private void sendSpaceBattleStatusMessage(obj_id self, String zone){
String scene = zone == null ? getCurrentSceneName() : "space_" + zone;
- String lastBattleType = battle_controller.getLastBattleType(scene);
- String currentBattleType = battle_controller.getCurrentBattleType(scene);
- int secondsUntilNextBattle = battle_controller.getTimeUntilNextBattleForZone(scene);
+ String lastBattleType = battle_controller.getLastBattleType(self, scene);
+ String currentBattleType = battle_controller.getCurrentBattleType(self, scene);
+ int secondsUntilNextBattle = battle_controller.getTimeUntilNextBattleForZone(self, scene);
String sys = getSpaceSystemName(scene.substring(6));
if(secondsUntilNextBattle == -1){
diff --git a/sku.0/sys.server/compiled/game/script/systems/gcw/space/battle_controller.java b/sku.0/sys.server/compiled/game/script/systems/gcw/space/battle_controller.java
index 774cd3ea3..85b0561a7 100755
--- a/sku.0/sys.server/compiled/game/script/systems/gcw/space/battle_controller.java
+++ b/sku.0/sys.server/compiled/game/script/systems/gcw/space/battle_controller.java
@@ -7,8 +7,6 @@ import script.obj_id;
public class battle_controller extends script.base_script {
- public final boolean debug = true;
-
public final int DEFAULT_TATOOINE_DELAY = 3;
public final int DEFAULT_CORELLIA_DELAY = 3;
public final int DEFAULT_DANTOOINE_DELAY = 3;
@@ -57,12 +55,14 @@ public class battle_controller extends script.base_script {
{
LOG("space_gcw", "battle_controller.OnInitialize: The space battle sequencer object is starting for the fist time.");
+ removeObjVar(self, "space_gcw");
+
// get minutes to the top of the hour so we can kick off a regularly scheduled battle status check.
int calendarTime = getCalendarTime();
int[] convertedCalendarTime = player_structure.convertSecondsTime(calendarTime);
- float minutesToTopOfHour = 59 - convertedCalendarTime[2];
+ //float minutesToTopOfHour = 59 - convertedCalendarTime[2];
+ float minutesToTopOfHour = 0;
getSettings();
- if(debug) minutesToTopOfHour = 3.0f;
LOG("space_gcw", "battle_controller.OnInitialize: Starting check for battle status in roughly " + minutesToTopOfHour + " minutes.");
// check battle status at the top of the hour
messageTo(self, "checkBattleStatus", null, minutesToTopOfHour * 60.0f, false);
@@ -81,7 +81,14 @@ public class battle_controller extends script.base_script {
String msg = null;
obj_id controller = getSelf();
- String defendingFaction = getStringObjVar(controller, "space_gcw." + spawner + ".lastDefendingFaction").equals("imperial") ? "Imperial" : "Rebel";
+ String lastDefendingFaction;
+ if(hasObjVar(controller, "space_gcw." + spawner + ".lastDefendingFaction")){
+ lastDefendingFaction = getStringObjVar(controller, "space_gcw." + spawner + ".lastDefendingFaction");
+ }
+ else{
+ lastDefendingFaction = "imperial";
+ }
+ String defendingFaction = lastDefendingFaction.equals("imperial") ? "Imperial" : "Rebel";
String attackingFaction = defendingFaction.equals("Imperial") ? "Rebel" : "Imperial";
String defendingShipType = "Capital Ship";
@@ -103,12 +110,14 @@ public class battle_controller extends script.base_script {
public int checkBattleStatus(obj_id self, dictionary params) {
LOG("space_gcw", "battle_controller.checkBattleStatus: The space battle sequencer object is checking the battle status of all zones.");
for(String[] scene : BATTLE_SCENES){
+ // try implementation that just fires off a check to the spawner itself... do this because of the messageTo authoritative issues.
+
obj_id spawner = getObjIdObjVar(self, "space_gcw." + scene[0] + ".spawner");
if(spawner == null){
continue;
}
- if(hasMessageTo(spawner, "startSpaceGCWBattle")){
- LOG("space_gcw", "battle_controller.checkBattleStatus: Scene " + scene[0] + " already has a timer set so skipping this zone.");
+ if(hasObjVar(self, "space_gcw." + scene[0] + ".nextBattleStart")){
+ LOG("space_gcw", "battle_controller.checkBattleStatus: Scene " + scene[0] + " already has a timer set (firing in " + (getIntObjVar(self, "space_gcw." + scene[0] + ".nextBattleStart") - getCalendarTime()) + " seconds) so skipping this zone.");
handlePendingBattleWarning(spawner, scene[0]);
continue;
}
@@ -120,8 +129,8 @@ public class battle_controller extends script.base_script {
if(battleIsActive) continue;
int secondsUntilNextBattle;
- if(hasObjVar(spawner, "last_battle_time")) {
- secondsUntilNextBattle = getSecondsUntilNextBattle(scene, getIntObjVar(spawner, "last_battle_time"));
+ if(hasObjVar(self, "space_gcw." + scene[0] + ".lastBattleTime")) {
+ secondsUntilNextBattle = getSecondsUntilNextBattle(scene, getIntObjVar(self, "space_gcw." + scene[0] + ".lastBattleTime"));
}
else{
secondsUntilNextBattle = getStagger(scene[0]) * 60 * 60;
@@ -145,12 +154,12 @@ public class battle_controller extends script.base_script {
setObjVar(self, "space_gcw." + spawner + ".lastBattleType", battleType);
if(secondsUntilNextBattle == 0){
- LOG("space_gcw", "battle_controller.checkBattleStatus: The space battle sequencer object is starting a " + scene[1] + " battle in zone " + scene[0] + " for the first time.");
+ LOG("space_gcw", "battle_controller.checkBattleStatus: The space battle sequencer object is starting a " + scene[1] + " battle in zone " + scene[0] + ".");
}
else {
LOG("space_gcw", "battle_controller.checkBattleStatus: The space battle sequencer is not starting a battle in zone " + scene[0] + " because it has " + String.format("%.0f", secondsUntilNextBattle / 60.0f) + " minutes until the next battle.");
}
-
+ setObjVar(self, "space_gcw." + scene[0] + ".nextBattleStart", secondsUntilNextBattle + getCalendarTime());
messageTo(spawner, "startSpaceGCWBattle", battleDetails, secondsUntilNextBattle, false);
}
@@ -162,13 +171,12 @@ public class battle_controller extends script.base_script {
public int getSecondsUntilNextBattle(String[] scene, int lastBattleTime){
int secondsUntilNext = getHoursBetweenBattles(scene[0]) * 60 * 60;
- int gameTime = getGameTime();
+ int gameTime = getCalendarTime();
int nextBattleTime = lastBattleTime + secondsUntilNext;
- if(nextBattleTime >= gameTime){
+ if(nextBattleTime > gameTime){
return nextBattleTime - gameTime;
}
-
return 0;
}
public int getHoursBetweenBattles(String scene){
@@ -270,18 +278,17 @@ public class battle_controller extends script.base_script {
*
* Otherwise, the remaning time until the start of the next battle (in seconds) will be returned.
*/
- public static int getTimeUntilNextBattleForZone(String zone){
- obj_id controller = getPlanetByName("tatooine");
+ public static int getTimeUntilNextBattleForZone(obj_id self, String zone){
for (String[] scene : battle_controller.BATTLE_SCENES){
if(scene[0].equals(zone)){
- obj_id spawner = getObjIdObjVar(controller, "space_gcw." + scene[0] + ".spawner");
- LOG("space_gcw", "COMMAND: checking spawner " + spawner + " with controller " + controller + ". Battle status: " + getIntObjVar(controller, "space_gcw." + spawner + ".active"));
- if(getIntObjVar(controller, "space_gcw." + spawner + ".active") == 1){
+ obj_id spawner = getObjIdObjVar(self, "space_gcw." + scene[0] + ".spawner");
+ LOG("space_gcw", "COMMAND: checking spawner " + spawner + " with controller " + self + ". Battle status: " + getIntObjVar(self, "space_gcw." + spawner + ".active"));
+
+ if(getIntObjVar(self, "space_gcw." + spawner + ".active") == 1){
return -2;
}
- else if(hasMessageTo(spawner, "startSpaceGCWBattle")) {
- LOG("space_gcw", "RESULT: " + timeUntilMessageTo(spawner, "startSpaceGCWBattle"));
- return timeUntilMessageTo(spawner, "startSpaceGCWBattle");
+ else if(hasObjVar(self, "space_gcw." + scene[0] + ".nextBattleTime")) {
+ return getIntObjVar(self, "space_gcw." + scene[0] + ".nextBattleTime") - getCalendarTime();
}
return -1;
}
@@ -295,11 +302,10 @@ public class battle_controller extends script.base_script {
* Method to get the last battle type (PvP or PvE) for the given zone.
*
*/
- public static String getLastBattleType(String zone){
- obj_id controller = getPlanetByName("tatooine");
+ public static String getLastBattleType(obj_id self, String zone){
for (String[] scene : battle_controller.BATTLE_SCENES) {
if (scene[0].equals(zone)) {
- obj_id spawner = getObjIdObjVar(controller, "space_gcw." + scene[0] + ".spawner");
+ obj_id spawner = getObjIdObjVar(self, "space_gcw." + scene[0] + ".spawner");
if (hasObjVar(spawner, "last_battle_type")) {
return getStringObjVar(spawner, "last_battle_type");
}
@@ -317,11 +323,10 @@ public class battle_controller extends script.base_script {
* Method to get the current battle type (PvP or PvE) for the given zone.
*
*/
- public static String getCurrentBattleType(String zone){
- obj_id controller = getPlanetByName("tatooine");
+ public static String getCurrentBattleType(obj_id self, String zone){
for (String[] scene : battle_controller.BATTLE_SCENES) {
if (scene[0].equals(zone)) {
- obj_id spawner = getObjIdObjVar(controller, "space_gcw." + scene[0] + ".spawner");
+ obj_id spawner = getObjIdObjVar(self, "space_gcw." + scene[0] + ".spawner");
if (hasObjVar(spawner, "battle_type")) {
return getStringObjVar(spawner, "battle_type");
}
diff --git a/sku.0/sys.server/compiled/game/script/systems/gcw/space/battle_spawner.java b/sku.0/sys.server/compiled/game/script/systems/gcw/space/battle_spawner.java
index 8a915e612..dd9c6ceee 100755
--- a/sku.0/sys.server/compiled/game/script/systems/gcw/space/battle_spawner.java
+++ b/sku.0/sys.server/compiled/game/script/systems/gcw/space/battle_spawner.java
@@ -12,8 +12,8 @@ public class battle_spawner extends script.base_class {
private static final String HERO_PILOT_DATA = "datatables/npc/space/space_gcw_hero.iff";
public static float DEFAULT_BATTLE_TIME_PREPATORY = 900.0f; // 900 == 15 minutes
public static float DEFAULT_BATTLE_TIME_LENGTH = 3600.0f; // 3600 == 60 minutes
- public static float MAX_SUPPORT_CRAFT = 30;
- public static float MAX_SUPPORT_SPAWN = 60;
+ public static int DEFAULT_MAX_SUPPORT_CRAFT = 30;
+ public static int DEFAULT_MAX_SUPPORT_SPAWN = 60;
public static final double HERO_SPAWN_CHANCE = 0.20d; // 0.20d == 20% chance a hero will spawn
public static final float DEFAULT_PVP_POINT_MULTIPLIER = 2.0f;
public static final float DEFAULT_PVE_POINT_MULTIPLIER = 1.0f;
@@ -87,6 +87,8 @@ public class battle_spawner extends script.base_class {
public int customPointAward;
public float battleTimeLength;
public float prepatoryTimeLength;
+ public static int maxSupportShips;
+ public static int maxSupportSpawn;
// This script is the spawner for the Space GCW (GCW 2) battles.
// It uses Tatooine to track battles (the controller) and places the following object vars
@@ -102,35 +104,37 @@ public class battle_spawner extends script.base_class {
}
public int registerWithController(obj_id self, dictionary params) throws InterruptedException {
obj_id controller = getPlanetByName("tatooine");
- removeObjVar(controller, "space_gcw");
if(!hasScript(controller, CONTROLLER_SCRIPT)) attachScript(controller, CONTROLLER_SCRIPT);
location battleLocation = getLocation(self);
+ removeObjVar(controller, "space_gcw." + battleLocation.area);
setObjVar(self, "controller", controller);
setObjVar(controller, "space_gcw." + battleLocation.area + ".spawner", self);
+ spaceLog( "--- Registering battle spawner (" + self + ") in zone: " + battleLocation.area);
getSettings();
return SCRIPT_CONTINUE;
}
public int startSpaceGCWBattle(obj_id self, dictionary params) throws InterruptedException {
// make sure we're not already having a battle
- if(!battleIsNotActive()) return SCRIPT_CONTINUE;
+ if(battleIsActive(self)) return SCRIPT_CONTINUE;
+ location spaceLocation = getLocation(self);
- LOG("space_gcw", "In startSpaceGCWBattle... beginning battle creation.");
+ spaceLog( "In startSpaceGCWBattle... beginning battle creation.");
obj_id controller = params.getObjId("controller");
+ removeObjVar(controller, "space_gcw." + spaceLocation.area + ".nextBattleStart");
- int gameTime = getGameTime();
- String battleId = getLocation(self).area + "_" + gameTime;
+ int gameTime = getCalendarTime();
+ String battleId = spaceLocation.area + "_" + gameTime;
// controller should have chosen the battle type.
setObjVar(self, "battle_id", battleId);
setObjVar(self, "battle_type", params.getString("battle_type"));
setObjVar(self, "last_battle_time", gameTime);
- setObjVar(controller, "space_gcw." + self + ".lastBattleTime", gameTime);
+ setObjVar(controller, "space_gcw." + spaceLocation.area + ".lastBattleTime", gameTime);
params.put("battle_id", battleId);
// tell the controller we've started the battle
- setObjVar(controller, "space_gcw." + self.toString() + ".active", 1);
+ setObjVar(controller, "space_gcw." + self + ".active", 1);
- location spaceLocation = getLocation(self);
String planetName = spaceLocation.area.substring(6);
// get defending faction
@@ -150,7 +154,7 @@ public class battle_spawner extends script.base_class {
setObjVar(self, "defendingFaction", "rebel");
setObjVar(self, "attackingFaction", "imperial");
}
- LOG("space_gcw", "In startSpaceGCWBattle... just created defending ship(" + defendingShip + ").");
+ spaceLog( "In startSpaceGCWBattle... just created defending ship(" + defendingShip + ").");
setObjVar(defendingShip, "intNoPlayerDamage", 1);
if(params.getString("battle_type").equals(BATTLE_TYPE_PVP)){
setObjVar(defendingShip, "intPvPDamageOnly",1);
@@ -169,13 +173,13 @@ public class battle_spawner extends script.base_class {
params.put("defendingShip", defendingShip);
// spawn attacking capital ship
- LOG("space_gcw", "In startSpaceGCWBattle... starting battle in " + prepatoryTimeLength / 60.0f + " minutes.");
+ spaceLog( "In startSpaceGCWBattle... starting battle in " + prepatoryTimeLength / 60.0f + " minutes.");
messageTo(self, "spawnAttack", params, prepatoryTimeLength, false);
return SCRIPT_CONTINUE;
}
public void makeComponentsUntargetable(obj_id ship) {
- LOG("space_gcw", "In makeComponentsUntargetable... now starting to disable component targeting for (" + ship + ").");
+ spaceLog( "In makeComponentsUntargetable... now starting to disable component targeting for (" + ship + ").");
int[] shipChassisSlots = getShipChassisSlots(ship);
for (int shipChassisSlot : shipChassisSlots) {
if (isShipSlotInstalled(ship, shipChassisSlot)) {
@@ -184,19 +188,19 @@ public class battle_spawner extends script.base_class {
}
}
public int spawnAttack(obj_id self, dictionary params) throws InterruptedException {
- LOG("space_gcw", "In spawnAttack... beginning to spawn attack craft.");
+ spaceLog( "In spawnAttack... beginning to spawn attack craft.");
// get spawn point for the attacker ship - defaults to 2500 m away from battle point (use pythag theorum, a2 + b2 = c2 where c == 2500 and b == 1000)
location battleLocation = params.getLocation("battleLocation");
transform attackSpawnPoint = transform.identity.setPosition_p(battleLocation.x - 1000.0f, battleLocation.y, battleLocation.z - 2291.0f);
obj_id attackingShip;
if(params.getString("defendingFaction").equalsIgnoreCase("rebel")){
attackingShip = space_create.createShipHyperspace(IMPERIAL_SHIP_TEMPLATE, attackSpawnPoint);
- LOG("space_gcw", "In spawnAttack... just created attack capital ship (" + IMPERIAL_SHIP_TEMPLATE + ":" + attackingShip + ").");
+ spaceLog( "In spawnAttack... just created attack capital ship (" + IMPERIAL_SHIP_TEMPLATE + ":" + attackingShip + ").");
params.put("attackingFaction", "imperial");
}
else{
attackingShip = space_create.createShipHyperspace(REBEL_SHIP_TEMPLATE, attackSpawnPoint);
- LOG("space_gcw", "In spawnAttack... just created attack capital ship (" + REBEL_SHIP_TEMPLATE + ":" + attackingShip + ").");
+ spaceLog( "In spawnAttack... just created attack capital ship (" + REBEL_SHIP_TEMPLATE + ":" + attackingShip + ").");
params.put("attackingFaction", "rebel");
}
if(params.getString("battle_type").equals(BATTLE_TYPE_PVP)){
@@ -221,7 +225,7 @@ public class battle_spawner extends script.base_class {
// move the attacking ship along the path
_spaceUnitMoveTo(attackingShip, flightPath);
- LOG("space_gcw", "In spawnAttack... will spawn support craft in 20 seconds.");
+ spaceLog( "In spawnAttack... will spawn support craft in 20 seconds.");
messageTo(self, "spawnSupportCraft", params, 20.0f, false);
// set timer to keep track of battle time - set config value for length of battle
@@ -230,10 +234,12 @@ public class battle_spawner extends script.base_class {
return SCRIPT_CONTINUE;
}
public int spawnSupportCraft(obj_id self, dictionary params) throws InterruptedException {
- LOG("space_gcw", "In spawnSupportCraft... now starting to spawn supporting craft.");
+ spaceLog( "In spawnSupportCraft... now starting to spawn supporting craft.");
obj_id attackingShip = params.getObjId("attackingShip");
obj_id defendingShip = params.getObjId("defendingShip");
- LOG("space_gcw", "In spawnSupportCraft... attacking ship is obj id " + attackingShip + " and defending ship is obj id " + defendingShip + ".");
+ if(!isValidId(attackingShip) || !isValidId(defendingShip))
+ return SCRIPT_CONTINUE;
+ spaceLog( "In spawnSupportCraft... attacking ship is obj id " + attackingShip + " and defending ship is obj id " + defendingShip + ".");
// spawn offense & defense support craft
Vector defenseCraft = spawnSupportShips(defendingShip);
@@ -246,87 +252,114 @@ public class battle_spawner extends script.base_class {
for(int i=0; i < spawnedShipCount; i++){
obj_id attacker = (obj_id) attackCraft.get(i);
obj_id defender = (obj_id) defenseCraft.get(i);
- LOG("space_gcw","In spawnSupportCraft... forcing ship " + attacker + " to attack ship " + defender + ".");
+ spaceLog("In spawnSupportCraft... forcing ship " + attacker + " to attack ship " + defender + ".");
if(attacker != null && defender != null)
ship_ai.spaceAttack(attacker, defender);
}
return SCRIPT_CONTINUE;
}
- private static boolean battleIsNotActive(){
- obj_id self = getSelf();
+ private static boolean battleIsActive(obj_id self){
obj_id controller = getObjIdObjVar(self, "controller");
- return getIntObjVar(controller, "space_gcw." + self.toString() + ".active") == 0;
+ return getIntObjVar(controller, "space_gcw." + self + ".active") == 1;
}
public static Vector spawnSupportShips(obj_id motherShip) throws InterruptedException{
int totalSpawnedThisFight = 0;
if(hasObjVar(motherShip, "totalSpawnedSupportCraft")){
totalSpawnedThisFight = getIntObjVar(motherShip, "totalSpawnedSupportCraft");
- if(totalSpawnedThisFight >= MAX_SUPPORT_SPAWN)
+ if(totalSpawnedThisFight >= maxSupportSpawn)
return getResizeableObjIdArrayObjVar(motherShip, "supportCraft");
}
- String[] support_ship_types;
- String[] hero_pilots;
- if(shipGetSpaceFaction(motherShip) == 370444368){
- // rebel
- support_ship_types = REBEL_SUPPORT_CRAFT;
- hero_pilots = REBEL_HEROES;
- }
- // imperial
- else{
- support_ship_types = IMPERIAL_SUPPORT_CRAFT;
- hero_pilots = IMPERIAL_HEROES;
- }
Vector shipList = getResizeableObjIdArrayObjVar(motherShip, "supportCraft");
if(shipList == null) shipList = new Vector<>();
boolean heroSpawned = false;
- if(hasObjVar(motherShip, "heroSpawned") || (hasObjVar(motherShip, "heroSpawnTime") && getIntObjVar(motherShip, "heroSpawnTime") > (getGameTime() - (60 * 10)))){
+ if(hasObjVar(motherShip, "heroSpawned") || (hasObjVar(motherShip, "heroSpawnTime") && getIntObjVar(motherShip, "heroSpawnTime") > (getCalendarTime() - (60 * 10)))){
// a hero is only eligible to spawn once every 10 minutes.
heroSpawned = true;
}
obj_id ship;
- for (int i = shipList.size(); i < MAX_SUPPORT_CRAFT; i++) {
+ for (int i = shipList.size(); i < maxSupportShips; i++) {
if (heroSpawned || Math.random() > HERO_SPAWN_CHANCE) {
- ship = createUnit(motherShip, support_ship_types[rand(0, support_ship_types.length - 1)], 200.0f);
- attachScript(ship, "systems.gcw.space.support_ship");
- setObjVar(ship, "motherShip", motherShip);
- LOG("space_gcw", "In spawnSupportShips... just spawned a regular ship (" + ship + ":" + getTemplateName(ship) + ") #" + (i+1) + " / " + MAX_SUPPORT_CRAFT + " ships.");
+ ship = spawnStandardShip(motherShip);
+ spaceLog( "In spawnSupportShips... just spawned a regular ship (" + ship + ":" + getTemplateName(ship) + ") #" + (i+1) + " / " + maxSupportShips + " ships.");
} else {
- dictionary pilot = choosePilot(hero_pilots);
- if(pilot == null){
- LOG("space_gcw", "Could not find an ace pilot to spawn!");
- continue;
- }
- ship = createUnit(motherShip, pilot.getString("ship_template"), 100.0f);
- setName(ship, new string_id("space/ship_names", pilot.getString("ship_name")));
- attachScript(ship, "systems.gcw.space.hero_ship");
- setObjVar(ship, "motherShip", motherShip);
- setObjVar(ship, "ace_name", pilot.getString("hero_name"));
- setObjVar(motherShip, "heroSpawned", true);
- setObjVar(motherShip, "heroSpawnTime", getGameTime());
+ ship = spawnAcePilot(motherShip);
heroSpawned = true;
- LOG("space_gcw", "In spawnSupportShips... just spawned a hero ship (" + ship + ":" + pilot.getString("hero_name") + ") #" + (i+1) + " / " + MAX_SUPPORT_CRAFT + " ships.");
+ spaceLog( "In spawnSupportShips... just spawned a hero ship (" + ship + ":" + getName(ship) + ") #" + (i+1) + " / " + maxSupportShips + " ships.");
+ }
+ if(isValidId(ship)) {
+ totalSpawnedThisFight++;
+ shipList.add(ship);
}
-
- transform[] trPatrolPoints = ship_ai.createPatrolPathLoiter(getTransform_o2p(motherShip), 500.0f, 1000.0f);
- ship_ai.spacePatrol(ship, trPatrolPoints);
- totalSpawnedThisFight++;
- shipList.add(ship);
}
- LOG("space_gcw", "Returning array of ships of size " + shipList.size());
setObjVar(motherShip, "totalSpawnedSupportCraft", totalSpawnedThisFight);
return shipList;
}
+ private static obj_id spawnStandardShip(obj_id motherShip) throws InterruptedException{
+ String[] support_ship_types = getSupportShipList(motherShip);
+ int totalSpawnedThisFight = 0;
+ if(hasObjVar(motherShip, "totalSpawnedSupportCraft")){
+ totalSpawnedThisFight = getIntObjVar(motherShip, "totalSpawnedSupportCraft");
+ if(totalSpawnedThisFight >= maxSupportSpawn)
+ return null;
+ }
+ obj_id ship = createUnit(motherShip, support_ship_types[rand(0, support_ship_types.length - 1)], 200.0f);
+ attachScript(ship, "systems.gcw.space.support_ship");
+ spaceLog( "In spawnSupportShips... just spawned a regular ship (" + ship + ":" + getTemplateName(ship) + ").");
+ transform[] trPatrolPoints = ship_ai.createPatrolPathLoiter(getTransform_o2p(motherShip), 500.0f, 1000.0f);
+ ship_ai.spacePatrol(ship, trPatrolPoints);
+ setObjVar(motherShip, "totalSpawnedSupportCraft", totalSpawnedThisFight);
+ return ship;
+ }
+ private static obj_id spawnAcePilot(obj_id motherShip) throws InterruptedException {
+ int totalSpawnedThisFight = 0;
+ if(hasObjVar(motherShip, "totalSpawnedSupportCraft")){
+ totalSpawnedThisFight = getIntObjVar(motherShip, "totalSpawnedSupportCraft");
+ if(totalSpawnedThisFight >= maxSupportSpawn)
+ return null;
+ }
+ dictionary pilot = choosePilot(getAcePilotList(motherShip));
+ if(pilot == null){
+ spaceLog( "Could not find an ace pilot to spawn!");
+ return null;
+ }
+ obj_id ship = createUnit(motherShip, pilot.getString("ship_template"), 100.0f);
+ setName(ship, new string_id("space/ship_names", pilot.getString("ship_name")));
+ attachScript(ship, "systems.gcw.space.hero_ship");
+ setObjVar(ship, "ace_name", pilot.getString("hero_name"));
+ setObjVar(motherShip, "heroSpawned", true);
+ setObjVar(motherShip, "heroSpawnTime", getCalendarTime());
+ transform[] trPatrolPoints = ship_ai.createPatrolPathLoiter(getTransform_o2p(motherShip), 500.0f, 1000.0f);
+ ship_ai.spacePatrol(ship, trPatrolPoints);
+ setObjVar(motherShip, "totalSpawnedSupportCraft", totalSpawnedThisFight);
+ return ship;
+ }
+ private static String[] getSupportShipList(obj_id motherShip) {
+ if(shipGetSpaceFaction(motherShip) == 370444368){
+ // rebel
+ return REBEL_SUPPORT_CRAFT;
+ }
+ // imperial
+ return IMPERIAL_SUPPORT_CRAFT;
+ }
+ private static String[] getAcePilotList(obj_id motherShip){
+ if(shipGetSpaceFaction(motherShip) == 370444368){
+ // rebel
+ return REBEL_HEROES;
+ }
+ // imperial
+ return IMPERIAL_HEROES;
+ }
private static dictionary choosePilot(String[] pilots){
int rng = rand(0, pilots.length - 1);
String pilot = pilots[rng];
String[] pilotNames = dataTableGetStringColumn(HERO_PILOT_DATA, "hero_name");
if(pilotNames == null){
- LOG("space_gcw", "In battle_spawner.choosePilot... we didn't get ANY pilot names from our datatable (" + HERO_PILOT_DATA + ")!");
+ spaceLog( "In battle_spawner.choosePilot... we didn't get ANY pilot names from our datatable (" + HERO_PILOT_DATA + ")!");
return null;
}
else if(pilotNames.length == 0){
- LOG("space_gcw", "In battle_spawner.choosePilot... crap - somehow we couldn't find a pilot to spawn.");
+ spaceLog( "In battle_spawner.choosePilot... crap - somehow we couldn't find a pilot to spawn.");
return null;
}
for(int i=0; i < pilotNames.length; i++){
@@ -342,24 +375,34 @@ public class battle_spawner extends script.base_class {
);
}
public int capitalShipDestroyed(obj_id self, dictionary params) {
- if(battleIsNotActive()) return SCRIPT_CONTINUE;
+ if(!battleIsActive(self)) return SCRIPT_CONTINUE;
// end the battle
- LOG("space_gcw", "Capital Ship Destroyed... ending the battle.");
+ spaceLog( "Capital Ship Destroyed... ending the battle.");
messageTo(self, "endBattle", params, 0.0f, false);
return SCRIPT_CONTINUE;
}
public int endBattle(obj_id self, dictionary params) throws InterruptedException {
- LOG("space_gcw", "In endBattle... ending the battle.");
+ if(!battleIsActive(self) || hasObjVar(self, "pending_cleanup")) return SCRIPT_CONTINUE;
+ setObjVar(self, "pending_cleanup", 1);
+ spaceLog( "In endBattle... ending the battle.");
if(!params.containsKey("destroyedShip")){
- LOG("space_gcw", "In endBattle... reason - time ran out - making the attackers the losing side.");
+ spaceLog( "In endBattle... reason - time ran out - making the attackers the losing side.");
params.put("destroyedShip", params.getObjId("attackingShip"));
params.put("losingFaction", params.getString("attackingFaction"));
params.put("losingRole", "attack");
- params.put("supportCraft", getResizeableObjIdArrayObjVar(params.getObjId("destroyedShip"), "supportCraft"));
+ obj_id destroyedShip = params.getObjId("destroyedShip");
+ Vector supportCraft = new Vector(0);
+ if(destroyedShip != null) {
+ supportCraft = getResizeableObjIdArrayObjVar(destroyedShip, "supportCraft");
+ if (supportCraft == null) {
+ supportCraft = new Vector(0);
+ }
+ }
+ params.put("supportCraft", supportCraft);
}
else{
- LOG("space_gcw", "In endBattle... reason - " + params.getString("losingFaction") + " " + params.getString("losingRole") + " capital ship destroyed.");
+ spaceLog( "In endBattle... reason - " + params.getString("losingFaction") + " " + params.getString("losingRole") + " capital ship destroyed.");
}
setObjVar(self, "last_battle_type", getObjVar(self, "battle_type"));
distributeAwards(self, params);
@@ -367,7 +410,7 @@ public class battle_spawner extends script.base_class {
return SCRIPT_CONTINUE;
}
public void distributeAwards(obj_id self, dictionary params) throws InterruptedException {
- LOG("space_gcw", "In distributeAwards... distributing the awards to the participants.");
+ spaceLog( "In distributeAwards... distributing the awards to the participants.");
String battleType = getStringObjVar(self, "battle_type");
String battleId = getStringObjVar(self, "battle_id");
@@ -381,7 +424,7 @@ public class battle_spawner extends script.base_class {
// get all single-member participants in this battle.
- LOG("space_gcw", "In distributeAwards... now checking single ship participants.");
+ spaceLog( "In distributeAwards... now checking single ship participants.");
// distribute to pob qualifiers
pointAwardedPlayers.addAll(
processShip(
@@ -397,7 +440,7 @@ public class battle_spawner extends script.base_class {
)
);
- LOG("space_gcw", "In distributeAwards... now checking gunship participants.");
+ spaceLog( "In distributeAwards... now checking gunship participants.");
// distribute to gunship qualifiers
pointAwardedPlayers.addAll(
processShip(
@@ -413,7 +456,7 @@ public class battle_spawner extends script.base_class {
)
);
- LOG("space_gcw", "In distributeAwards... now checking POB participants.");
+ spaceLog( "In distributeAwards... now checking POB participants.");
// distribute to pob qualifiers
processShip(
getObjVarList(self, "space_gcw.pob.participant." + battleId),
@@ -428,13 +471,13 @@ public class battle_spawner extends script.base_class {
);
}
public List processShip(obj_var_list qualifiedShips, int playerCeiling, obj_id self, List pointAwardedPlayers, String attackingFaction, boolean imperialsWon, String shipType, String battleType, String battleId) throws InterruptedException{
- LOG("space_gcw", "In processShip... now checking ship participants.");
+ spaceLog( "In processShip... now checking ship participants.");
if(qualifiedShips == null || qualifiedShips.getNumItems() == 0){
- LOG("space_gcw", "In processShip... no participating ships of this type were found.");
+ spaceLog( "In processShip... no participating ships of this type were found.");
return Collections.EMPTY_LIST;
}
int numQualifiedShips = qualifiedShips.getNumItems();
- LOG("space_gcw", "In processShip... processing " + numQualifiedShips + " ships.");
+ spaceLog( "In processShip... processing " + numQualifiedShips + " ships.");
// iterate through all qualified ships
for(int i = 0; i < numQualifiedShips; i++){
@@ -442,35 +485,35 @@ public class battle_spawner extends script.base_class {
if(shipObjVar == null) continue;
obj_id ship = obj_id.getObjId(Long.parseLong(shipObjVar.getName()));
- LOG("space_gcw", "In processShip... now processing ship " + ship + ".");
+ spaceLog( "In processShip... now processing ship " + ship + ".");
// make sure this ship is still in the game.
if(!isValidId(ship)){
- LOG("space_gcw", "In processShip... ship " + ship + " is no longer valid (destroyed? zoned out?) so skipping.");
+ spaceLog( "In processShip... ship " + ship + " is no longer valid (destroyed? zoned out?) so skipping.");
continue;
}
obj_id[] currentShipMembers = space_utils.getAllPlayersInShip(ship);
int playerCount = currentShipMembers.length;
// make sure players are still on this ship.
if(playerCount == 0){
- LOG("space_gcw", "In processShip... no valid players were found on this ship.");
+ spaceLog( "In processShip... no valid players were found on this ship.");
continue;
}
- LOG("space_gcw", "In processShip... found " + playerCount + " player(s) on board ship " + ship + ".");
+ spaceLog( "In processShip... found " + playerCount + " player(s) on board ship " + ship + ".");
// if pob is not in the same system, continue on to the next gunship (no soup for YOU!)
if(!getLocation(ship).area.equals(getLocation(self).area)){
- LOG("space_gcw", "In processShip... ship " + ship + " is no longer in the same zone as the space battle - skipping.");
+ spaceLog( "In processShip... ship " + ship + " is no longer in the same zone as the space battle - skipping.");
continue;
}
- LOG("space_gcw", "In processShip... now processing " + playerCount + " VALID players on board ship " + ship + " (i.e. not ejected, still on board ship, etc).");
+ spaceLog( "In processShip... now processing " + playerCount + " VALID players on board ship " + ship + " (i.e. not ejected, still on board ship, etc).");
for(obj_id player : currentShipMembers){
if(!factions.isImperialorImperialHelper(player) && !factions.isRebelorRebelHelper(player)) continue;
- LOG("space_gcw", "In processShip... now processing player " + player + ".");
+ spaceLog( "In processShip... now processing player " + player + ".");
// make sure the player haven't been given anything yet.
if(pointAwardedPlayers.contains(player)){
- LOG("space_gcw", "In processShip... player " + player + " has already been granted awards for this battle - skipping.");
+ spaceLog( "In processShip... player " + player + " has already been granted awards for this battle - skipping.");
continue;
}
float pointAdjustment = (playerCount > playerCeiling ? playerCeiling / playerCount : 1);
@@ -481,7 +524,7 @@ public class battle_spawner extends script.base_class {
return pointAwardedPlayers;
}
public void handlePlayerAwards(obj_id player, String attackingFaction, boolean imperialsWon, String shipType, String battleType, String battleId, float pointAdjustmentValue) throws InterruptedException {
- LOG("space_gcw", "In handlePlayerAwards... now awarding GCW points.");
+ spaceLog( "In handlePlayerAwards... now awarding GCW points.");
boolean playerIsImperial = factions.isImperialorImperialHelper(player);
boolean playerWasAttacking = (playerIsImperial && attackingFaction.equals("imperial")) || (factions.isRebelorRebelHelper(player) && attackingFaction.equals("rebel"));
boolean playerWon = (playerIsImperial && imperialsWon) ||
@@ -489,7 +532,7 @@ public class battle_spawner extends script.base_class {
// distribute points to player
int awardedPoints = new Float(calculateAwardedPoints(playerWon, battleType) * pointAdjustmentValue).intValue();
- LOG("space_gcw", "In handlePlayerAwards... giving " + awardedPoints + " GCW points to player \"" + getPlayerName(player) + "\" (" + player + ").");
+ spaceLog( "In handlePlayerAwards... giving " + awardedPoints + " GCW points to player \"" + getPlayerName(player) + "\" (" + player + ").");
gcw.grantModifiedGcwPoints(
player,
awardedPoints,
@@ -520,13 +563,13 @@ public class battle_spawner extends script.base_class {
);
- LOG("space_gcw", "In handlePlayerAwards... now giving out coins to players.");
+ spaceLog( "In handlePlayerAwards... now giving out coins to players.");
// distribute tokens to player
if(awardGcwTokens(player, awardedTokens, playerIsImperial ? "imperial" : "rebel")) {
- LOG("space_gcw", "In handlePlayerAwards... giving " + awardedTokens + " " + (playerIsImperial ? "Imperial" : "Rebel") + " space gcw tokens to player \"" + getPlayerName(player) + "\" (" + player + ").");
+ spaceLog( "In handlePlayerAwards... giving " + awardedTokens + " " + (playerIsImperial ? "Imperial" : "Rebel") + " space gcw tokens to player \"" + getPlayerName(player) + "\" (" + player + ").");
}
else{
- LOG("space_gcw", "In handlePlayerAwards... unable to reward player \"" + getPlayerName(player) + "\" (" + player + ") any space GCW tokens!");
+ spaceLog( "In handlePlayerAwards... unable to reward player \"" + getPlayerName(player) + "\" (" + player + ") any space GCW tokens!");
}
}
@@ -609,15 +652,15 @@ public class battle_spawner extends script.base_class {
}
public void cleanup(dictionary params) throws InterruptedException {
- LOG("space_gcw", "In cleanup... now cleaning up the battle.");
+ spaceLog( "In cleanup... now cleaning up the battle.");
obj_id self = getSelf();
// despawn ships
- obj_id attackingShip = params.getObjId("attackingShip");
- obj_id defendingShip = params.getObjId("defendingShip");
- LOG("space_gcw", "In cleanup... attacking ship is (" + attackingShip + ") and defending ship is (" + defendingShip + ").");
+ obj_id attackingShip = getObjIdObjVar(self,"attackingShip");
+ obj_id defendingShip = getObjIdObjVar(self, "defendingShip");
+ spaceLog( "In cleanup... attacking ship is (" + attackingShip + ") and defending ship is (" + defendingShip + ").");
- LOG("space_gcw", "In cleanup... despawning attack support craft...");
+ spaceLog( "In cleanup... despawning attack support craft...");
Vector supportShips;
if(isValidId(attackingShip)) {
supportShips = getResizeableObjIdArrayObjVar(attackingShip, "supportCraft");
@@ -627,14 +670,14 @@ public class battle_spawner extends script.base_class {
}
if(supportShips != null) {
for (Object ship : supportShips) {
- LOG("space_gcw", "...despawning attack ship (" + ship + ")");
+ spaceLog( "...despawning attack ship (" + ship + ")");
if(isValidId((obj_id) ship)){
detachAllScripts((obj_id) ship);
destroyObjectHyperspace((obj_id) ship);
}
}
}
- LOG("space_gcw", "In cleanup... despawning defense support craft...");
+ spaceLog( "In cleanup... despawning defense support craft...");
if(isValidId(defendingShip)) {
supportShips = getResizeableObjIdArrayObjVar(defendingShip, "supportCraft");
}
@@ -643,14 +686,14 @@ public class battle_spawner extends script.base_class {
}
if(supportShips != null) {
for (Object ship : supportShips) {
- LOG("space_gcw", "...despawning defense ship (" + ship + ")");
+ spaceLog( "...despawning defense ship (" + ship + ")");
if(isValidId((obj_id) ship)){
detachAllScripts((obj_id) ship);
destroyObjectHyperspace((obj_id) ship);
}
}
}
- LOG("space_gcw", "In cleanup... despawning attack capital ship...");
+ spaceLog( "In cleanup... despawning attack capital ship...");
if(isValidId(attackingShip)){
detachAllScripts(attackingShip);
@@ -674,21 +717,31 @@ public class battle_spawner extends script.base_class {
else{
defendingFaction = "rebel";
}
- setObjVar(controller, "space_gcw." + self.toString() + ".lastWinningFaction", losingFaction.equals("imperial") ? "rebel" : "imperial");
- setObjVar(controller, "space_gcw." + self.toString() + ".lastDefendingFaction", defendingFaction);
- setObjVar(controller, "space_gcw." + self.toString() + ".lastWinningRole", losingRole.equals("attack") ? "defense" : "attack");
+ setObjVar(controller, "space_gcw." + self + ".lastWinningFaction", losingFaction.equals("imperial") ? "rebel" : "imperial");
+ setObjVar(controller, "space_gcw." + self + ".lastDefendingFaction", defendingFaction);
+ setObjVar(controller, "space_gcw." + self + ".lastWinningRole", losingRole.equals("attack") ? "defense" : "attack");
+
+ removeObjVar(self, "pending_cleanup");
if(isValidId(defendingShip)){
+ setObjVar(self, "pending_cleanup", 1);
messageTo(self, "despawnDefendingShip", params, 60.0f, false);
}
else{
// tell the controller we've ended the battle
- setObjVar(controller, "space_gcw." + self.toString() + ".active", 0);
+ setObjVar(controller, "space_gcw." + self + ".active", 0);
}
// clean up objvars on self
int lastRunTime = getIntObjVar(self, "last_battle_time");
+ String battleId = getStringObjVar(self, "battle_id");
+ boolean pendingCleanup = hasObjVar(self, "pending_cleanup");
removeAllObjVars(self);
+ removeObjVar(controller, "space_gcw.pob.participant." + battleId);
+ removeObjVar(controller, "space_gcw.gunship.participant." + battleId);
+ removeObjVar(controller, "space_gcw.participant." + battleId);
+
+ if(pendingCleanup) setObjVar(self, "pending_cleanup", 1);
setObjVar(self, "last_battle_time", lastRunTime);
setObjVar(self, "controller", controller);
}
@@ -696,17 +749,23 @@ public class battle_spawner extends script.base_class {
public int despawnDefendingShip(obj_id self, dictionary params) {
// tell the controller we've ended the battle
obj_id controller = params.getObjId("controller");
- setObjVar(controller, "space_gcw." + self.toString() + ".active", 0);
+ setObjVar(controller, "space_gcw." + self + ".active", 0);
obj_id defendingShip = params.getObjId("defendingShip");
detachAllScripts(defendingShip);
- LOG("space_gcw", "In cleanup... despawning defending capital ship...");
+ spaceLog( "In cleanup... despawning defending capital ship...");
destroyObjectHyperspace(defendingShip);
+ removeObjVar(self, "pending_cleanup");
return SCRIPT_CONTINUE;
}
+
+ public static void spaceLog(String message){
+ String zone = getLocation(getSelf()).area;
+ LOG("space_gcw", "Zone " + zone + ": " + message);
+ }
public void getSettings() throws InterruptedException {
- LOG("space_gcw", "Getting Settings...");
+ spaceLog( "Getting Settings...");
// get customized settings
customPveBattleModifier = utils.stringToFloat(getConfigSetting("GameServer", "spaceGcwPvETokenModifier"));
if (customPveBattleModifier < 0) customPveBattleModifier = DEFAULT_PVE_TOKEN_MULTIPLIER;
@@ -743,6 +802,12 @@ public class battle_spawner extends script.base_class {
prepatoryTimeLength = utils.stringToFloat(getConfigSetting("GameServer", "spaceGcwPrepatoryTime"));
if (prepatoryTimeLength <= 0) prepatoryTimeLength = DEFAULT_BATTLE_TIME_PREPATORY;
- LOG("space_gcw", "Done getting settings...");
+
+ maxSupportShips = utils.stringToInt(getConfigSetting("GameServer", "spaceGcwMaxSupportShips"));
+ if (maxSupportShips <= 0) maxSupportShips = DEFAULT_MAX_SUPPORT_CRAFT;
+
+ maxSupportSpawn = utils.stringToInt(getConfigSetting("GameServer", "spaceGcwTotalSupportSpawn"));
+ if (maxSupportSpawn <= 0) maxSupportSpawn = DEFAULT_MAX_SUPPORT_SPAWN;
+ spaceLog( "Done getting settings...");
}
}
diff --git a/sku.0/sys.server/compiled/game/script/systems/gcw/space/capital_ship.java b/sku.0/sys.server/compiled/game/script/systems/gcw/space/capital_ship.java
index 1c8739411..4f00984d9 100755
--- a/sku.0/sys.server/compiled/game/script/systems/gcw/space/capital_ship.java
+++ b/sku.0/sys.server/compiled/game/script/systems/gcw/space/capital_ship.java
@@ -45,17 +45,16 @@ public class capital_ship extends script.space.combat.combat_space_base {
public int OnDestroy(obj_id self) throws InterruptedException{
// make sure battle is active because it won't be if we're just cleaning up and destroying the capital ships.
obj_id spawner = getObjIdObjVar(self, "spawner");
- if(isValidId(spawner)) {
- obj_id controller = getObjIdObjVar(spawner, "controller");
- if (controller != null && getIntObjVar(controller, "space_gcw." + spawner + ".active") != 1)
- return SCRIPT_CONTINUE;
- }
+ obj_id controller = getObjIdObjVar(spawner, "controller");
+ if (controller != null && getIntObjVar(controller, "space_gcw." + spawner + ".active") != 1)
+ return SCRIPT_CONTINUE;
dictionary params = new dictionary();
params.put("spawner", getObjIdObjVar(self, "spawner"));
params.put("destroyedShip", self);
params.put("losingFaction", getShipFaction(self));
params.put("losingRole", getStringObjVar(self, "role"));
params.put("supportCraft", getResizeableObjIdArrayObjVar(self, "supportCraft"));
+ params.put("controller", controller);
messageTo(spawner, "capitalShipDestroyed", params, 0.0f, false);
return SCRIPT_CONTINUE;
}
@@ -76,7 +75,7 @@ public class capital_ship extends script.space.combat.combat_space_base {
);
setObjVar(self, "supportCraft", spawnedShips);
} catch (Exception e) {
- LOG("space_gcw", "Could not remove support ship from the mothership's supportCraft array.");
+ LOG("space_gcw", "Could not remove support ship (" + destroyedShip + ") from the mothership's (" + self + ") supportCraft array: " + e.getLocalizedMessage());
}
messageTo(self, "spawnSupportShip", null, rand(15.0f, 45.0f), false);
return SCRIPT_CONTINUE;
@@ -87,7 +86,7 @@ public class capital_ship extends script.space.combat.combat_space_base {
obj_id spawner = getObjIdObjVar(self, "spawner");
if(isValidId(spawner)) {
obj_id controller = getObjIdObjVar(spawner, "controller");
- if (getIntObjVar(controller, "space_gcw." + self.toString() + ".active") == 0) return SCRIPT_CONTINUE;
+ if (getIntObjVar(controller, "space_gcw." + spawner + ".active") == 0) return SCRIPT_CONTINUE;
}
// create a new ship
setObjVar(self, "supportCraft", battle_spawner.spawnSupportShips(self));