Files
dsrc/sku.0/sys.server/compiled/game/script/library/gcw.java
T

3678 lines
97 KiB
Java

package script.library;
import script.*;
import script.base_class.*;
import script.combat_engine.*;
import java.util.Arrays;
import java.util.Hashtable;
import java.util.Vector;
import script.base_script;
import script.ai.ai_combat;
import script.library.buff;
import script.library.colors_hex;
import script.library.factions;
import script.library.faction_perk;
import script.library.loot;
import script.library.pet_lib;
import script.library.prose;
import script.library.regions;
import script.library.space_flags;
import script.library.trial;
import script.library.utils;
public class gcw extends script.base_script
{
public gcw()
{
}
public static final int GCW_UPDATE_PULSE = 1800;
public static final float DECAY_PER_UPDATE = .02f;
public static final String SCRIPTVAR_SCAN_INTEREST = "scan.interest";
public static final String REGION_SPAWN_WEIGHT_PATH = "datatables/spawning/imperial_presence/presence_weight/";
public static final String TABLE_PLAYER_BASE_CAP = "datatables/faction_perk/hq/hq_planetary_placement_cap.iff";
public static final int INTEREST_FACTION = 0;
public static final int INTEREST_SOMETHING = 1;
public static final int INTEREST_SPICE = 2;
public static final int INTEREST_SLICED_ITEMS = 3;
public static final int INTEREST_FACTION_ITEMS = 4;
public static final int INTEREST_CONTRABAND = 28;
public static final String TEMPLATE_LAMBDA_SHUTTLE = "object/creature/npc/theme_park/lambda_shuttle.iff";
public static final int AC_NONE = 0;
public static final int AC_ATTACK = 1;
public static final int AC_SCAN = 2;
public static final String GCW_BASE_MANAGER = "gcw.base_manager.master_object";
public static final String GCW_BASE_COUNT_REBEL = "gcw.player_base_count.rebel";
public static final String GCW_BASE_COUNT_IMPERIAL = "gcw.player_base_count.imperial";
public static final String VAR_BASE_HACK_DICTIONARY = "gcw.player_base_hack.dictionary";
public static final String GCW_SEQUENCER_KEREN = "-292452502778781373";
public static final String GCW_SEQUENCER_DEARIC = "-348184546868074204";
public static final String GCW_SEQUENCER_BESTINE = "-233342756915162113";
public static final int NO_CONTROL = 0;
public static final int IMPERIAL_CONTROL = 1;
public static final int REBEL_CONTROL = 2;
public static final int FACTION_NEUTRAL = 0;
public static final int FACTION_REBEL = 1;
public static final int FACTION_IMPERIAL = 2;
public static final String LIST_CREDIT_FOR_KILLS = "gcw_tracking.credit_for_kills";
public static final String LIST_DAILY_KILL_VALUES = "gcw_tracking.daily_kill_credit";
public static final int NORMAL_GCW_VALUE = 5;
public static final int ELITE_GCW_VALUE = 10;
public static final int BOSS_GCW_VALUE = 25;
public static final double SPACE_GCW_VALUE = 4.0;
public static final int GCW_PLAYER_BASE_DESTRUCTION = 100;
public static final String GCW_PLAYER_BASE_POINT_VALUE = "datatables/faction_perk/hq/hq_point_values.iff";
public static final int GCW_PLAYER_PVP_MODIFIER = 100;
public static final int BATTLEFIELD_VICTORY_POINT_VALUE = 500;
public static final int BATTLEFIELD_DEFEAT_POINT_VALUE = 100;
public static final int BATTLEFIELD_TIE_POINT_VALUE = 200;
public static final int BATTLEFIELD_TERMINAL_CAPTURE_MULTIPLIER = 100;
public static final int ACTIVITY_CONSTANT = 100;
public static final int MAX_DEATH_BY_PLAYER = 15;
public static final double MIN_PVP_LEVEL_RATIO_LIMIT = 0.7;
public static final double MIN_NPC_LEVEL_RATIO_LIMIT = 0.86;
public static final string_id SID_GENERIC_POINT_GRANT = new string_id("gcw", "gcw_rank_generic_point_grant");
public static final string_id SID_PVP_KILL_POINT_GRANT = new string_id("gcw", "gcw_rank_pvp_kill_point_grant");
public static final String REGION_CONTROLLER = "gcw_pvp_region_controller";
public static final String PVP_REGION_ACTIVITY_PERFORMED = "gcw_pvp_region.attack_performed";
public static final int GCW_POINT_TYPE_GROUND_PVE = 0;
public static final int GCW_POINT_TYPE_GROUND_PVP = 1;
public static final int GCW_POINT_TYPE_GROUND_PVP_REGION = 2;
public static final int GCW_POINT_TYPE_BASE_BUSTING = 3;
public static final int GCW_POINT_TYPE_SPACE_PVE = 4;
public static final int GCW_POINT_TYPE_SPACE_PVP = 5;
public static final int GCW_POINT_TYPE_GROUND_QUEST = 6;
public static final int GCW_POINT_TYPE_TRADING = 7;
public static final int GCW_POINT_TYPE_ENTERTAINING = 8;
public static final int GCW_POINT_TYPE_MAX = 9;
public static final String validScenes[] =
{
"tatooine",
"corellia",
"dantooine",
"dathomir",
"endor",
"lok",
"naboo",
"rori",
"talus",
"yavin4",
"space_tatooine",
"space_corellia",
"space_dantooine",
"space_dathomir",
"space_endor",
"space_lok",
"space_naboo",
"space_yavin4"
};
public static final int maxRegions[] =
{
14,
14,
17,
14,
16,
14,
14,
13,
13,
18
};
public static final String defaultRegions[] =
{
"gcw_region_tatooine_13",
"gcw_region_corellia_13",
"gcw_region_dantooine_16",
"gcw_region_dathomir_13",
"gcw_region_endor_15",
"gcw_region_lok_13",
"gcw_region_naboo_13",
"gcw_region_rori_13",
"gcw_region_talus_13",
"gcw_region_yavin4_17",
"gcw_region_tatooine_14",
"gcw_region_corellia_14",
"gcw_region_dantooine_17",
"gcw_region_dathomir_14",
"gcw_region_endor_16",
"gcw_region_lok_14",
"gcw_region_naboo_14",
"gcw_region_yavin4_18"
};
public static final String pointTypes[] =
{
"pve",
"pvp",
"pvp_battlefield",
"pvp",
"space_pve",
"space_pvp",
"pve",
"trading",
"entertaining"
};
public static final float COLLECTION_DAMAGE_RATIO_MIN = .41f;
public static final String PVP_PUSHBACK_REGION = "pvp_pushback";
public static final String PVP_BATTLEFIELD_REGION = "pvp_battlefield";
public static final int GCW_ENTERTAINMENT_TIME = 30;
public static final String GCW_SCRIPTVAR_PARENT = "gcw_entertainment";
public static final String GCW_ENTERTAINMENT_FLAG = "gcw_entertain_npc";
public static final String GCW_NPC_SCRIPTVAR_FLAG = "entertainment_npc";
public static final String GCW_PATROL_OBJ = "patrol_point_object";
public static final String GCW_NPC_CLEANUP_FLAG = "entertainment_npc_cleanup";
public static final String GCW_NPC_BEING_ENTERTAINED = "entertainment_npc";
public static final String ENTERTAIN_GCW_TROOPS_PID = GCW_SCRIPTVAR_PARENT + ".gcw_entertainment_pid";
public static final String GCW_STOPPED_ENTERTAINING = GCW_SCRIPTVAR_PARENT + ".gcw_player_stopped_entertaining";
public static final String GCW_ENTERTAINER_PATROL_QUEST = "gcw_entertain_patrol";
public static final String GCW_REPAIR_PATROL_QUEST = "gcw_repair_patrol";
public static final String GCW_REPAIR_TURRET_QUEST = "gcw_repair_turret";
public static final String GCW_REPAIR_BARRICADE_QUEST = "gcw_repair_barricade";
public static final String GCW_SPY_PATROL_DESTROY_QUEST = "gcw_spy_destroy_patrol";
public static final String GCW_SPY_PATROL_SCOUT_QUEST = "gcw_spy_scout_patrol";
public static final String GCW_REPAIR_VEHICLE_PATROL_QUEST = "gcw_repair_vehicle";
public static final String GCW_REPAIR_DAMAGED_VEHICLE_QUEST = "gcw_repair_vehicle";
public static final String GCW_MEDIC_HEAL_QUEST = "gcw_medic_heal";
public static final String GCW_DEFEND_BARRICADE_REBEL = "gcw_defend_rebel_barricade";
public static final String GCW_DEFEND_BARRICADE_IMPERIAL = "gcw_defend_imperial_barricade";
public static final String GCW_DEFEND_TURRET_REBEL = "gcw_defend_rebel_turret";
public static final String GCW_DEFEND_TURRET_IMPERIAL = "gcw_defend_imperial_turret";
public static final String GCW_DEFEND_TOWER_REBEL = "gcw_defend_rebel_tower";
public static final String GCW_DEFEND_TOWER_IMPERIAL = "gcw_defend_imperial_tower";
public static final String GCW_DESTROY_BARRICADE = "gcw_destroy_barricade";
public static final String GCW_DESTROY_TURRET = "gcw_destroy_turret";
public static final String GCW_ENTERTAIN_RALLY = "gcw_entertain_rallying";
public static final String GCW_ENTERTAIN_FATIGUE = "gcw_entertain_fatigue";
public static final String GCW_SMUGGLER_SLICING = "gcw_smuggler_slicing";
public static final String GCW_ELIMINATE_REBELS = "gcw_eliminate_rebels";
public static final String GCW_ELIMINATE_IMPERIALS = "gcw_eliminate_imperials";
public static final String BUFF_SPY_EXPLOSIVES = "gcw_spy_destroy_patrol_explosive_stack";
public static final String BUFF_GENERAL_RESIST_STACK_IMP = "gcw_general_resistance_stack_imperial";
public static final String BUFF_GENERAL_RESIST_STACK_REB = "gcw_general_resistance_stack_rebel";
public static final String BUFF_PLAYER_FATIGUE = "gcw_fatigue";
public static final String SPY_DESTROY_PID = "spyDestroyPid";
public static final String SPY_SCOUT_PID = "spyScoutPid";
public static final String TRADER_REPAIR_PID = "traderRepairPid";
public static final String OBJECT_TO_REPAIR = "objectToRepair";
public static final String GCW_REPAIR_QUEST = "gcwRepairQuest";
public static final String GCW_REPAIR_RESOURCE_COUNT = "gcwRepairResourceCount";
public static final String GCW_OBJECT_REPAIR_COUNT = "gcwObjectRepairCount";
public static final string_id SID_COUNTDOWN_LOCOMOTION = new string_id("gcw", "locomotion_stopped_countdown");
public static final string_id SID_INTERRUPTED_INCAPACITATED = new string_id("gcw", "incap_stopped_countdown");
public static final string_id SID_INTERRUPTED_DAMAGED = new string_id("gcw", "combat_stopped_countdown");
public static final string_id SID_YOU_NEED_TO_BE_COMBATANT = new string_id("gcw", "you_need_to_be_combatant_to_entertain");
public static final string_id SID_YOU_NEED_ENTERTAINMENT_QUEST = new string_id("gcw", "you_need_entertainment_quest_to_entertain");
public static final string_id SID_ENTERTAIN_TROOPS_TIMER = new string_id("gcw", "entertain_troops_timer");
public static final string_id SID_DOESNT_NEED_REPAIR = new string_id("gcw", "gcw_object_doesnt_need_repair");
public static final string_id SID_DOESNT_NEED_HEALING = new string_id("gcw", "gcw_object_doesnt_need_healing");
public static final string_id SID_YOU_NEED_RESOURCES_REPAIR = new string_id("gcw", "you_need_resources_to_repair");
public static final string_id SID_YOU_NEED_TOOL_REPAIR = new string_id("gcw", "gcw_asset_repair_resource_needed");
public static final string_id SID_RESOURCES_NEEDED = new string_id("gcw", "pylon_resources_needed");
public static final string_id SID_SCOUT_PP_TIMER = new string_id("gcw", "reporting_patrol_point_position");
public static final string_id SID_REPAIR_PP_TIMER = new string_id("gcw", "reparing_gcw_object");
public static final string_id SID_HEAL_PP_TIMER = new string_id("gcw", "healing_gcw_object");
public static final string_id SID_DESTROY_PP_TIMER = new string_id("gcw", "placing_patrol_point_explosives");
public static final String GCW_RESOURCE_TYPE_BARRICADE = "ore";
public static final String GCW_RESOURCE_TYPE_TURRET = "metal";
public static final String GCW_RESOURCE_TYPE_PATROL = "metal";
public static final String GCW_RESOURCE_TYPE_VEHICLE = "metal";
public static final String GCW_RESOURCE_TYPE_DAMAGED_VEHICLE = "metal";
public static final String GCW_SPAWN_ID_OBJVAR = "spawn_id";
public static final String GCW_DEFENSE_PATROL_OBJVAR = "defense_patrol";
public static final String GCW_OFFENSE_PATROL_OBJVAR = "offense_patrol";
public static final String GCW_TOOL_TEMPLATE_OBJVAR = "tool_template";
public static final String GCW_DEF_TOOL_TEMPLATE_OBJVAR = "defense_tool_template";
public static final String GCW_OFF_TOOL_TEMPLATE_OBJVAR = "offense_tool_template";
public static final String GCW_CONSTRUCTION_TASK = "resourcesUsed";
public static final String GCW_CONSTRUCTION_SIGNAL = "resourcesUsed";
public static final String GCW_IMP_DESTROY_BARRICADE_TASK = "destroyBarricadeImperial";
public static final String GCW_IMP_DESTROY_BARRICADE_SIGNAL = "destroyBarricadeImperial";
public static final String GCW_REB_DESTROY_BARRICADE_TASK = "destroyBarricadeRebel";
public static final String GCW_REB_DESTROY_BARRICADE_SIGNAL = "destroyBarricadeRebel";
public static final String GCW_IMP_DESTROY_TURRET_TASK = "destroyTurretImperial";
public static final String GCW_IMP_DESTROY_TURRET_SIGNAL = "destroyTurretImperial";
public static final String GCW_REB_DESTROY_TURRET_TASK = "destroyTurretRebel";
public static final String GCW_REB_DESTROY_TURRET_SIGNAL = "destroyTurretRebel";
public static final String GCW_REB_ENTERTAIN_PATROL_TASK = "entertainedPostRebel";
public static final String GCW_REB_ENTERTAIN_PATROL_SIGNAL = "entertainedPostRebel";
public static final String GCW_IMP_ENTERTAIN_PATROL_TASK = "entertainedPostImperial";
public static final String GCW_IMP_ENTERTAIN_PATROL_SIGNAL = "entertainedPostImperial";
public static final String GCW_REB_DESTROY_PATROL_SIGNAL = "destroyedPatrolPointRebel";
public static final String GCW_IMP_DESTROY_PATROL_SIGNAL = "destroyedPatrolPointImperial";
public static final String GCW_REB_FIND_PATROL_SIGNAL = "findPatrolPointRebel";
public static final String GCW_IMP_FIND_PATROL_SIGNAL = "findPatrolPointImperial";
public static final String GCW_PARTICIPATION_FLAG = "gcw_participation_flag";
public static final String GCW_POINT_OVERRIDE = "gcw_point_override";
public static final String GCW_REBEL_TOKEN = "item_gcw_rebel_token";
public static final String GCW_IMPERIAL_TOKEN = "item_gcw_imperial_token";
public static final String GCW_NPC_ENTERTAINED_BUFF = "gcw_entertained_patrol_npc";
public static final int REPAIR_COUNT_MAX = 100;
public static final int QUEST_COUNT_MAX = 100;
public static final int GCW_REPAIR_AMOUNT = 50000;
public static final int GCW_RESOURCE_COUNT_BARRICADE = 50000;
public static final int GCW_RESOURCE_COUNT_TURRET = 50000;
public static final int GCW_RESOURCE_COUNT_PATROL = 50000;
public static final int GCW_RESOURCE_COUNT_VEHICLE = 50000;
public static final int GCW_RESOURCE_COUNT_DAMAGED_VEHICLE = 50000;
public static final int GCW_CITY_PHASE_UNKNOWN = 0;
public static final int GCW_CITY_PHASE_CONSTRUCTION = 1;
public static final int GCW_CITY_PHASE_COMBAT = 2;
public static final int GCW_CONSTRUCTION_MAXIMUM = 100;
public static final int GCW_FATIGUE_DIVISOR = 10;
public static final int GCW_FATIGUE_TIMER_MAX = 100;
public static final int GCW_PULSE_TIMER = 10800;
public static final int GCW_CONSTRUCTION_END_TIMER = 1800;
public static final int GCW_COMBAT_END_TIMER = 1800;
public static final int GCW_GENERAL_GCW_BONUS_MULTIPLIER = 5;
public static final int GCW_GENERAL_GCW_BASE_AMOUNT = 1000;
public static final int GCW_GENERAL_TOKEN_BONUS_DIVISOR = 1000;
public static final int GCW_POINTS_WINNER_PARTICIPANTS = 1000;
public static final int GCW_POINTS_LOSER_PARTICIPANTS = 100;
public static final int GCW_TOKENS_WINNER_PARTICIPANTS = 40;
public static final int GCW_TOKENS_LOSER_PARTICIPANTS = 10;
public static final int GCW_POINTS_CONSTRUCTION_PHASE = 100;
public static final int GCW_TOKENS_CONSTRUCTION_PHASE = 20;
public static final String DEARIC_CITY_TABLE = "datatables/gcw/gcw_city_dearic.iff";
public static final String KEREN_CITY_TABLE = "datatables/gcw/gcw_city_keren.iff";
public static final String BESTINE_CITY_TABLE = "datatables/gcw/gcw_city_bestine.iff";
public static final String CITY_DEARIC = "dearic";
public static final String CITY_BESTINE = "bestine";
public static final String CITY_KEREN = "keren";
public static final String COLOR_REBELS = "\\"+ colors_hex.COLOR_REBELS;
public static final String COLOR_IMPERIALS = "\\"+ colors_hex.COLOR_IMPERIALS;
public static void assignScanInterests(obj_id npc) throws InterruptedException
{
if (!isIdValid(npc) || isPlayer(npc) || pet_lib.isPet(npc))
{
return;
}
int interests = 0;
location here = getLocation(npc);
if (here == null)
{
return;
}
int spawnWeight = Integer.MIN_VALUE;
String tbl = REGION_SPAWN_WEIGHT_PATH + here.area + ".iff";
String[] regionNames = dataTableGetStringColumn(tbl, "REGION_NAME");
if (regionNames != null && regionNames.length > 0)
{
region[] r = getRegionsWithSpawnableAtPoint(here, regions.SPAWN_TRUE);
if (r != null && r.length > 0)
{
for (int i = 0; i < r.length; i++)
{
testAbortScript();
String rName = r[i].getName();
int idx = utils.getElementPositionInArray(regionNames, rName);
if (idx > -1)
{
spawnWeight = dataTableGetInt(tbl, idx, "WEIGHT");
break;
}
}
}
}
if (spawnWeight == Integer.MIN_VALUE)
{
spawnWeight = rand(-10, 10);
}
if (rand(0, 10) <= rand(1, 10) - spawnWeight)
{
interests = utils.setBit(interests, INTEREST_FACTION);
}
if (rand(1, 100) <= 10)
{
interests |= INTEREST_CONTRABAND;
}
else
{
if (rand(0, 10) <= rand(1, 10) + spawnWeight)
{
interests = utils.setBit(interests, INTEREST_SPICE);
}
if (rand(-5, 5) <= rand(-3, 3) + spawnWeight)
{
interests = utils.setBit(interests, INTEREST_SLICED_ITEMS);
}
if (rand(0, 10) <= rand(1, 10) - spawnWeight)
{
interests = utils.setBit(interests, INTEREST_FACTION_ITEMS);
}
}
if (interests == 0)
{
interests = utils.setBit(interests, rand(INTEREST_FACTION, INTEREST_FACTION_ITEMS));
}
utils.setScriptVar(npc, SCRIPTVAR_SCAN_INTEREST, interests);
}
public static float scan(obj_id scanner, obj_id target) throws InterruptedException
{
if (!isIdValid(scanner) || !isIdValid(target))
{
return -1f;
}
int interests = utils.getIntScriptVar(scanner, SCRIPTVAR_SCAN_INTEREST);
if (interests == 0)
{
return -1f;
}
return getContrabandRating(target, interests);
}
public static boolean isContrabandItem(obj_id item) throws InterruptedException
{
if (!isIdValid(item))
{
return false;
}
return (getContrabandRating(item, INTEREST_CONTRABAND) > 0f);
}
public static float getContrabandRating(obj_id target, int interests) throws InterruptedException
{
if (!isIdValid(target) || interests == 0)
{
return 0f;
}
int got = getGameObjectType(target);
if (isGameObjectTypeOf(got, GOT_creature) || isPlayer(target))
{
obj_id self = getSelf();
if (isIdValid(self))
{
int total = 0;
obj_id[] items = getInventoryAndEquipment(target);
if (items != null && items.length > 0)
{
int min_check = 1;
float dist = getDistance(self, target);
if (dist < 64f)
{
min_check -= Math.round(dist / 15f);
}
if (min_check < 1)
{
min_check = 1;
}
int i = 0;
while (i < items.length)
{
testAbortScript();
total += getContrabandRating(items[i], interests);
i += rand(1, min_check);
}
}
int myFac = pvpGetAlignedFaction(self);
int tFac = pvpGetAlignedFaction(target);
if (tFac == myFac)
{
total -= pvpGetCurrentGcwRank(target);
if (total < 0)
{
total = 0;
}
}
else
{
if (utils.checkBit(interests, INTEREST_FACTION))
{
if (pvpAreFactionsOpposed(myFac, tFac))
{
if (isPlayer(target))
{
total += pvpGetCurrentGcwRank(target);
}
else
{
total += 5;
}
}
}
}
return total;
}
}
else
{
if (isSpice(target) && utils.checkBit(interests, INTEREST_SPICE))
{
int cnt = getCount(target);
if (cnt > 0)
{
return (float) cnt;
}
return 6f;
}
if (isSlicedEquipment(target) && utils.checkBit(interests, INTEREST_SLICED_ITEMS))
{
if (utils.isEquipped(target))
{
return 4f;
}
return 2f;
}
if (isNonImperialFactionItem(target) && utils.checkBit(interests, INTEREST_FACTION_ITEMS))
{
if (utils.isEquipped(target))
{
return 6f;
}
return 3f;
}
}
return 0f;
}
public static float getContrabandRating(obj_id target) throws InterruptedException
{
obj_id self = getSelf();
int interests = utils.getIntScriptVar(self, SCRIPTVAR_SCAN_INTEREST);
return getContrabandRating(target, interests);
}
public static boolean isSpice(obj_id target) throws InterruptedException
{
if (!isIdValid(target))
{
return false;
}
return (getGameObjectType(target) == GOT_misc_food && hasScript(target, "item.comestible.spice"));
}
public static boolean isSlicedEquipment(obj_id target) throws InterruptedException
{
if (!isIdValid(target))
{
return false;
}
int got = getGameObjectType(target);
return (hasObjVar(target, "slicing.hack") && (isGameObjectTypeOf(got, GOT_weapon) || isGameObjectTypeOf(got, GOT_armor)));
}
public static boolean isNonImperialFactionItem(obj_id target) throws InterruptedException
{
if (!isIdValid(target))
{
return false;
}
if (hasScript(target, faction_perk.SCRIPT_FACTION_ITEM))
{
if (hasObjVar(target, faction_perk.VAR_FACTION))
{
String iFac = getStringObjVar(target, faction_perk.VAR_FACTION);
if (!iFac.equals("imperial"))
{
return true;
}
}
}
return false;
}
public static void harass(obj_id npc, obj_id target) throws InterruptedException
{
if (!isIdValid(npc))
{
return;
}
if (hasScript(npc, "ai.imperial_presence.harass"))
{
return;
}
attachScript(npc, "ai.imperial_presence.harass");
if (isIdValid(target) && target.isLoaded())
{
dictionary d = new dictionary();
d.put("harassTarget", target);
messageTo(npc, "handleNewHarassTarget", d, 1f, false);
}
else
{
messageTo(npc, "handleCheckpointMode", null, 1f, false);
}
}
public static boolean spawnViaLambda(location loc, String tbl, String column, dictionary params) throws InterruptedException
{
if (loc == null || tbl == null || tbl.equals("") || column == null || column.equals(""))
{
return false;
}
String[] spawnNames = dataTableGetStringColumn(tbl, column);
return createLambdaDropship(loc, spawnNames, params);
}
public static boolean spawnViaLambda(location loc, String tbl, int col, dictionary params) throws InterruptedException
{
if (loc == null || tbl == null || tbl.equals("") || col < 0)
{
return false;
}
String[] spawnNames = dataTableGetStringColumn(tbl, col);
return createLambdaDropship(loc, spawnNames, params);
}
public static boolean createLambdaDropship(location loc, String[] spawnNames, dictionary params) throws InterruptedException
{
if (loc == null || spawnNames == null || spawnNames.length == 0)
{
return false;
}
if (!loc.area.equals(getCurrentSceneName()))
{
return false;
}
obj_id lambda = create.object("object/creature/npc/theme_park/lambda_shuttle.iff", loc);
if (!isIdValid(lambda))
{
return false;
}
setYaw(lambda, rand(-180f, 180f));
attachScript(lambda, "systems.spawning.dropship.lambda");
utils.setScriptVar(lambda, "spawnNames", spawnNames);
if (params != null && !params.isEmpty())
{
utils.setScriptVar(lambda, "spawnParameters", params);
}
return true;
}
public static boolean spawnViaLambdaPerGeo(location loc, dictionary params) throws InterruptedException
{
if (loc == null)
{
return false;
}
String[] spawnNames = getGeoSpawnNames(loc);
return createLambdaDropship(loc, spawnNames, params);
}
public static String[] getGeoSpawnNames(location loc, boolean allowHeavy) throws InterruptedException
{
if (loc == null)
{
return null;
}
region[] r = getRegionsAtPoint(loc);
if (r == null || r.length == 0)
{
return null;
}
String tbl = "datatables/imperial_presence/geo/general.iff";
if (allowHeavy && rand(0, 10) < 2)
{
tbl = "datatables/imperial_presence/geo/general_heavy.iff";
}
for (int i = 0; i < r.length; i++)
{
testAbortScript();
int geoType = r[i].getGeographicalType();
if (geoType == regions.GEO_DESERT || geoType == regions.GEO_OASIS || geoType == regions.GEO_WASTELAND)
{
tbl = "datatables/imperial_presence/geo/desert.iff";
}
else if (geoType == regions.GEO_FOREST || geoType == regions.GEO_JUNGLE || geoType == regions.GEO_WASTELAND)
{
tbl = "datatables/imperial_presence/geo/forest.iff";
}
else if (geoType == regions.GEO_SWAMP)
{
tbl = "datatables/imperial_presence/geo/swamp.iff";
}
}
int numCol = dataTableGetNumColumns(tbl);
if (numCol <= 0)
{
return null;
}
return dataTableGetStringColumn(tbl, rand(0, numCol - 1));
}
public static String[] getGeoSpawnNames(location loc) throws InterruptedException
{
return getGeoSpawnNames(loc, false);
}
public static obj_id getGCWMasterObject(obj_id objObject) throws InterruptedException
{
return getGCWMasterObject(getLocation(objObject));
}
public static obj_id getGCWMasterObject(location locTest) throws InterruptedException
{
String strPlanet = locTest.area;
dictionary dctObjectInfo = dataTableGetRow("datatables/gcw/gcw_master_objects.iff", strPlanet);
if (dctObjectInfo == null)
{
LOG("gcw", "No object for "+ strPlanet);
return null;
}
String strObjId = dctObjectInfo.getString("strObjId");
Long lngId;
try
{
lngId = new Long(strObjId);
}
catch(NumberFormatException err)
{
LOG("gcw", "Bad object id format for "+ strPlanet);
return null;
}
obj_id objMaster = obj_id.getObjId(lngId.longValue());
return objMaster;
}
public static void changeGCWScore(location locTest, int intValue, String strFaction) throws InterruptedException
{
dictionary dctParams = new dictionary();
dctParams.put("intScoreChange", intValue);
dctParams.put("strFaction", strFaction);
obj_id objParent = getGCWMasterObject(locTest);
messageTo(objParent, "updateGCWScore", dctParams, 0, true);
}
public static void incrementGCWScore(obj_id objObject) throws InterruptedException
{
location locTest = getLocation(objObject);
int intScoreChange = faction_perk.grabFactionBasePointValue(objObject);
String strFaction = getStringObjVar(objObject, "faction");
changeGCWScore(locTest, intScoreChange, strFaction);
}
public static void decrementGCWScore(obj_id objObject) throws InterruptedException
{
location locTest = getLocation(objObject);
int intScoreChange = faction_perk.grabFactionBasePointValue(objObject);
intScoreChange = intScoreChange * -1;
String strFaction = getStringObjVar(objObject, "faction");
changeGCWScore(locTest, intScoreChange, strFaction);
return;
}
public static boolean canPlaceFactionBaseByPlanet(obj_id player, obj_id deed, String planet) throws InterruptedException
{
if (isGcwRestrictedSceneName(planet))
{
return false;
}
if (!canPlaceFactionBaseByScore(player, deed, planet))
{
return false;
}
return true;
}
public static boolean canPlaceFactionBaseByScore(obj_id player, obj_id deed, String planet) throws InterruptedException
{
return (getCurrentPlanetaryFactionBaseCountPlanet(planet) < getCurrentPlanetaryFactionBaseMaxPlanet(planet));
}
public static int getCurrentPlanetaryFactionBaseCountPlanet(String planet) throws InterruptedException
{
obj_id planetId = getPlanetByName(planet);
if (!isIdValid(planetId))
{
return Integer.MAX_VALUE;
}
return getRebelBaseCount(planetId) + getImperialBaseCount(planetId);
}
public static int getCurrentPlanetaryFactionBaseMaxPlanet(String planet) throws InterruptedException
{
obj_id planetId = getPlanetByName(planet);
if (!isIdValid(planetId))
{
return -1;
}
if (!dataTableOpen(TABLE_PLAYER_BASE_CAP))
{
return -1;
}
int row = dataTableSearchColumnForString(planet, "planet", TABLE_PLAYER_BASE_CAP);
return (row == -1 ? -1 : dataTableGetInt(TABLE_PLAYER_BASE_CAP, planet, "base_max"));
}
public static int getImperialBaseCount(obj_id planet) throws InterruptedException
{
return (utils.hasScriptVar(planet, GCW_BASE_COUNT_IMPERIAL) ? utils.getIntScriptVar(planet, GCW_BASE_COUNT_IMPERIAL) : 0);
}
public static int getRebelBaseCount(obj_id planet) throws InterruptedException
{
return (utils.hasScriptVar(planet, GCW_BASE_COUNT_REBEL) ? utils.getIntScriptVar(planet, GCW_BASE_COUNT_REBEL) : 0);
}
public static void modifyPlanetaryBaseCount(obj_id base, int faction, int delta) throws InterruptedException
{
obj_id planetId = getPlanetByName(getLocation(base).area);
obj_id planetRegister = utils.getObjIdScriptVar(planetId, GCW_BASE_MANAGER);
if (!isIdValid(planetRegister))
{
return;
}
dictionary dict = new dictionary();
dict.put("faction", faction);
dict.put("delta", delta);
messageTo(planetRegister, "alterBaseCount", dict, 0, false);
}
public static boolean isGcwRestrictedSceneName(String scene) throws InterruptedException
{
String[] restrictedScene =
{
"kashyyyk_main",
"kashyyyk_north_dungeons",
"kashyyyk_pob_dungeons",
"kashyyyk_south_dungeons",
"kashyyyk_rryatt_trail",
"kashyyyk_hunting",
"space_light1",
"space_heavy1",
"dathomir",
"yavin4",
"endor",
"mustafar"
};
for (int i = 0; i < restrictedScene.length; i++)
{
testAbortScript();
if (restrictedScene[i].equals(scene))
{
return true;
}
}
return false;
}
public static dictionary getGCWDictionary(obj_id self) throws InterruptedException
{
int intImperialControlScore = getIntObjVar(self, "Imperial.controlScore");
int intRebelControlScore = getIntObjVar(self, "Rebel.controlScore");
dictionary dctParams = new dictionary();
LOG("gcw", "Putting Imperial "+ intImperialControlScore);
LOG("gcw", "Putting Rebel "+ intRebelControlScore);
dctParams.put("intImperialControlScore", intImperialControlScore);
dctParams.put("intRebelControlScore", intRebelControlScore);
return dctParams;
}
public static float getImperialRatio(obj_id objNPC) throws InterruptedException
{
float fltImperialControlScore = (float) getIntObjVar(objNPC, "Imperial.controlScore");
float fltRebelControlScore = (float) getIntObjVar(objNPC, "Rebel.controlScore");
if ((fltImperialControlScore == 0) && (fltRebelControlScore == 0))
{
return 1.0f;
}
if (fltImperialControlScore == 0)
{
return .0f;
}
float fltScore = fltImperialControlScore / fltRebelControlScore;
return fltScore;
}
public static float getRebelRatio(obj_id objNPC) throws InterruptedException
{
float fltImperialControlScore = (float) getIntObjVar(objNPC, "Imperial.controlScore");
float fltRebelControlScore = (float) getIntObjVar(objNPC, "Rebel.controlScore");
if ((fltImperialControlScore == 0) && (fltRebelControlScore == 0))
{
return 1.0f;
}
if (fltRebelControlScore == 0)
{
return .0f;
}
LOG("gcw", "Rebel score is "+ fltRebelControlScore);
LOG("gcw", "Imperial score is "+ fltImperialControlScore);
float fltScore = fltRebelControlScore / fltImperialControlScore;
return fltScore;
}
public static void incrementGCWStanding(obj_id killer, obj_id target) throws InterruptedException
{
obj_id self = killer;
final int MINIMUM_TIME_BETWEEN_KILLS = 900;
if (!factions.isDeclared(killer))
{
return;
}
int intScore = 1;
if (isPlayer(target))
{
intScore = 25;
}
int intTime = getGameTime();
int intLastKill = utils.getIntScriptVar(target, "intLastGCWDeath");
if ((intTime - intLastKill < MINIMUM_TIME_BETWEEN_KILLS))
{
}
obj_id objStructure = getTopMostContainer(killer);
if (!isPlayer(objStructure))
{
if (!permissionsIsPublic(objStructure))
{
return;
}
}
utils.setScriptVar(target, "intLastGCWDeath", intTime);
dictionary dctParams = new dictionary();
dctParams.put("intScore", intScore);
messageTo(killer, "updateGCWStanding", dctParams, 0, false);
}
public static void checkAndUpdateGCWStanding(obj_id self, int intAddedPoints) throws InterruptedException
{
String area = getLocation(self).area;
if (area.equals("dungeon1") || area.equals("adventure1") || area.equals("adventure2"))
{
return;
}
final int SCORE_THRESHOLD = 25;
final int POINT_EXCHANGE_RATE = 25;
int intCurrentScore = getIntObjVar(self, "gcw.intKillScore");
intCurrentScore = intCurrentScore + intAddedPoints;
if (intCurrentScore >= SCORE_THRESHOLD)
{
int intPlanetPoints = intCurrentScore / POINT_EXCHANGE_RATE;
intCurrentScore = intCurrentScore - (intPlanetPoints * POINT_EXCHANGE_RATE);
prose_package ppTest = new prose_package();
string_id strSpam = new string_id("faction_perk", "earned_gcw_points");
ppTest = prose.setStringId(ppTest, strSpam);
ppTest = prose.setDI(ppTest, intPlanetPoints);
sendSystemMessageProse(self, ppTest);
String strFaction = "";
if (factions.isRebel(self))
{
playClientEffectObj(self, "clienteffect/holoemote_rebel.cef", self, "head");
play2dNonLoopingSound(self, "sound/music_themequest_victory_rebel.snd");
strFaction = "Rebel";
}
else
{
playClientEffectObj(self, "clienteffect/holoemote_imperial.cef", self, "head");
play2dNonLoopingSound(self, "sound/music_themequest_victory_imperial.snd");
strFaction = "Imperial";
}
changeGCWScore(getLocation(self), intPlanetPoints, strFaction);
}
setObjVar(self, "gcw.intKillScore", intCurrentScore);
}
public static obj_id getPub30StaticBaseControllerId(obj_id subject) throws InterruptedException
{
return getFirstObjectWithScript(getLocation(trial.getTop(subject)), 500.0f, "systems.gcw.static_base.master");
}
public static int getPub30StaticBaseControllingFaction(obj_id subject) throws InterruptedException
{
obj_id controller = getPub30StaticBaseControllerId(subject);
return getIntObjVar(controller, "gcw.static_base.base_status");
}
public static int getPub30StaticBaseTimeSinceLastCapture(obj_id subject) throws InterruptedException
{
obj_id controller = getPub30StaticBaseControllerId(subject);
if (!hasObjVar(controller, "gcw.static_base.last_capture"))
{
return -1;
}
else
{
return getIntObjVar(controller, "gcw.static_base.last_capture");
}
}
public static void setPub30StaticBaseTimeSinceLastCapture(obj_id subject, int time) throws InterruptedException
{
obj_id controller = getPub30StaticBaseControllerId(subject);
setObjVar(controller, "gcw.static_base.last_capture", time);
}
public static final int PHASE_5 = 259200;
public static final int PHASE_4 = 86400;
public static final int PHASE_3 = 28800;
public static final int PHASE_2 = 14400;
public static int getPub30StaticBaseCapturePhase(obj_id subject) throws InterruptedException
{
int lastCapture = getPub30StaticBaseTimeSinceLastCapture(subject);
if (lastCapture == -1)
{
return 0;
}
int difference = getGameTime() - lastCapture;
if (difference >= 259200)
{
return 5;
}
if (difference >= 86400)
{
return 4;
}
if (difference >= 28800)
{
return 3;
}
if (difference >= 14400)
{
return 2;
}
return 1;
}
public static int getPub30TimeToNextPhaseInt(obj_id subject) throws InterruptedException
{
int lastCapture = getPub30StaticBaseTimeSinceLastCapture(subject);
int inPhase = getPub30StaticBaseCapturePhase(subject);
switch(inPhase)
{
case 1:
return (PHASE_2 + lastCapture) - getGameTime();
case 2:
return (PHASE_3 + lastCapture) - getGameTime();
case 3:
return (PHASE_4 + lastCapture) - getGameTime();
case 4:
return (PHASE_5 + lastCapture) - getGameTime();
default:
return -1;
}
}
public static String getPub30TimeToNextPhaseString(obj_id subject) throws InterruptedException
{
int timeToNext = getPub30TimeToNextPhaseInt(subject);
return utils.formatTimeVerbose(timeToNext);
}
public static int advancePub30StaticBaseCapturePhase(obj_id subject) throws InterruptedException
{
int currentPhase = getPub30StaticBaseCapturePhase(subject);
if (currentPhase == 5)
{
return 5;
}
int newTime = 0;
switch(currentPhase)
{
case 1:
newTime = getGameTime() - PHASE_2;
setPub30StaticBaseTimeSinceLastCapture(subject, newTime);
return 2;
case 2:
newTime = getGameTime() - PHASE_3;
setPub30StaticBaseTimeSinceLastCapture(subject, newTime);
return 3;
case 3:
newTime = getGameTime() - PHASE_4;
setPub30StaticBaseTimeSinceLastCapture(subject, newTime);
return 4;
case 4:
newTime = getGameTime() - PHASE_5;
setPub30StaticBaseTimeSinceLastCapture(subject, newTime);
return 5;
default:
return -1;
}
}
public static int regressPub30StaticBaseCapturePhase(obj_id subject) throws InterruptedException
{
int currentPhase = getPub30StaticBaseCapturePhase(subject);
if (currentPhase == 1)
{
return 1;
}
int newTime = 0;
switch(currentPhase)
{
case 2:
newTime = getGameTime();
setPub30StaticBaseTimeSinceLastCapture(subject, newTime);
return 1;
case 3:
newTime = getGameTime() - PHASE_2;
setPub30StaticBaseTimeSinceLastCapture(subject, newTime);
return 2;
case 4:
newTime = getGameTime() - PHASE_3;
setPub30StaticBaseTimeSinceLastCapture(subject, newTime);
return 3;
case 5:
newTime = getGameTime() - PHASE_4;
setPub30StaticBaseTimeSinceLastCapture(subject, newTime);
return 4;
default:
return -1;
}
}
public static void clearCreditForKills(obj_id player) throws InterruptedException
{
utils.removeBatchScriptVar(player, LIST_CREDIT_FOR_KILLS);
}
public static int findAttackerInArray(Vector attackList, obj_id attacker) throws InterruptedException
{
if (attackList == null || attackList.size() == 0)
{
return -1;
}
for (int i = 0; i < attackList.size(); i++)
{
testAbortScript();
String[] splitEntry = split(((String)(attackList.get(i))), '-');
obj_id idAtPoint = utils.stringToObjId(splitEntry[0]);
if (idAtPoint == attacker)
{
return i;
}
}
return -1;
}
public static int getDamageFromAttacker(Vector attackList, obj_id attacker) throws InterruptedException
{
if (attackList == null || attackList.size() == 0)
{
return 0;
}
for (int i = 0; i < attackList.size(); i++)
{
testAbortScript();
String[] splitEntry = split(((String)(attackList.get(i))), '-');
obj_id idAtPoint = utils.stringToObjId(splitEntry[0]);
if (idAtPoint == attacker)
{
return utils.stringToInt(splitEntry[1]);
}
}
return 0;
}
public static String packAttackerDamage(obj_id attacker, int damage) throws InterruptedException
{
return ("" + attacker + "-" + damage);
}
public static boolean releaseGcwPointCredit(obj_id player) throws InterruptedException
{
obj_id[] gcwEnemiesList = new obj_id[0];
if (verifyPvpRegionStatus(player))
{
gcwEnemiesList = getPlayerCreaturesInRange(getLocation(player), 80.0f);
}
boolean isImperialPlayer = factions.isImperial(player);
boolean isRebelPlayer = factions.isRebel(player);
obj_id landedDeathBlow = getObjIdObjVar(player, pclib.VAR_DEATHBLOW_KILLER);
if (beast_lib.isBeast(landedDeathBlow) || pet_lib.isPet(landedDeathBlow))
{
landedDeathBlow = getMaster(landedDeathBlow);;
}
if (gcwEnemiesList != null && gcwEnemiesList.length > 0)
{
removeDayOldEntries(player);
for (int i = 0; i < gcwEnemiesList.length; i++)
{
testAbortScript();
if (!isIdValid(gcwEnemiesList[i]) || !exists(gcwEnemiesList[i]) || !verifyPvpRegionStatus(gcwEnemiesList[i]))
{
continue;
}
if (((float)getLevel(player) / (float)getLevel(gcwEnemiesList[i]) >= MIN_PVP_LEVEL_RATIO_LIMIT && ((isImperialPlayer && factions.isRebel(gcwEnemiesList[i])) || (factions.isImperial(gcwEnemiesList[i]) && isRebelPlayer))))
{
int points = distributeIndividualContribution(player, gcwEnemiesList[i], 0, GCW_POINT_TYPE_GROUND_PVP);
pvpModifyCurrentPvpKills(gcwEnemiesList[i], 1);
incrementKillMeter(gcwEnemiesList[i], 1);
}
}
Vector attackerList = utils.getResizeableStringBatchScriptVar(player, gcw.LIST_CREDIT_FOR_KILLS);
if (attackerList == null || attackerList.size() == 0)
{
return false;
}
for (int j = 0; j < attackerList.size(); j++)
{
testAbortScript();
String[] parseKiller = split(((String)(attackerList.get(j))), '-');
obj_id killer = utils.stringToObjId(parseKiller[0]);
if (beast_lib.isBeast(killer) || pet_lib.isPet(killer))
{
killer = getMaster(killer);
}
double vLev = (double)getLevel(player);
double kLev = (double)getLevel(killer);
boolean isOfLevel = (vLev / kLev) >= MIN_PVP_LEVEL_RATIO_LIMIT;
if (isOfLevel && killer != landedDeathBlow)
{
pvp.bfCreditForAssist(killer);
gcwInvasionCreditForAssist(killer);
}
}
utils.removeBatchScriptVar(player, gcw.LIST_CREDIT_FOR_KILLS);
return true;
}
Vector attackerList = utils.getResizeableStringBatchScriptVar(player, gcw.LIST_CREDIT_FOR_KILLS);
if (attackerList == null || attackerList.size() == 0)
{
return false;
}
int totalDamage = 0;
for (int q = 0; q < attackerList.size(); q++)
{
testAbortScript();
String[] damageSplit = split(((String)(attackerList.get(q))), '-');
totalDamage += utils.stringToInt(damageSplit[1]);
}
removeDayOldEntries(player);
for (int j = 0; j < attackerList.size(); j++)
{
testAbortScript();
String[] parseKiller = split(((String)(attackerList.get(j))), '-');
obj_id killer = utils.stringToObjId(parseKiller[0]);
double vLev = (double)getLevel(player);
double kLev = (double)getLevel(killer);
boolean isOfLevel = (vLev/kLev) >= MIN_PVP_LEVEL_RATIO_LIMIT;
if (isOfLevel)
{
int points = distributeIndividualContribution(player, ((String)(attackerList.get(j))), totalDamage, GCW_POINT_TYPE_GROUND_PVP);
if (isIdValid(killer) && exists(killer))
{
pvpModifyCurrentPvpKills(killer, 1);
incrementKillMeter(killer, 1);
}
}
}
utils.removeBatchScriptVar(player, gcw.LIST_CREDIT_FOR_KILLS);
return true;
}
public static void notifyPvpRegionWatcherOfDeath(obj_id player) throws InterruptedException
{
obj_id pvpRegionController = gcw.getPvpRegionControllerIdByPlayer(player);
dictionary dict = new dictionary();
dict.put("player", player);
if (isIdValid(pvpRegionController))
{
messageTo(pvpRegionController, "diedInPvpRegion", dict, 1, false);
}
}
public static boolean isAlreadyInArray(String[] orderedList, String attackerEntry) throws InterruptedException
{
for (int i = 0; i < orderedList.length; i++)
{
testAbortScript();
if (orderedList[i].equals(attackerEntry))
{
return true;
}
}
return false;
}
public static int distributeIndividualContribution(obj_id victim, String playerString, int totalDamage, int point_type) throws InterruptedException
{
String[] parse = split(playerString, '-');
obj_id killer = utils.stringToObjId(parse[0]);
if (!isIdValid(killer) || !exists(killer))
{
return 0;
}
return distributeIndividualContribution(victim, killer, totalDamage, point_type);
}
public static int distributeIndividualContribution(obj_id victim, obj_id enemy, int totalDamage, int point_type) throws InterruptedException
{
if (!isIdValid(victim) || !exists(victim) || !isIdValid(enemy) || !exists(enemy))
{
return 0;
}
int targetRank = pvpGetCurrentGcwRank(enemy);
int selfRank = pvpGetCurrentGcwRank(victim);
int finalReward = (int) ((targetRank + selfRank) * (GCW_PLAYER_PVP_MODIFIER) / 10);
if (finalReward < 0)
{
return 0;
}
boolean inRegion = verifyPvpRegionStatus(enemy);
if (inRegion)
{
finalReward += (int) (finalReward * 0.5f);
}
loot.rollRandomFactionalCollectible(victim, enemy, selfRank);
obj_id relic = loot.chroniclesPvpLootDrop(enemy);
finalReward = addToDailyGcwPointAllotment(victim, enemy, finalReward);
String information = getName(victim);
grantModifiedGcwPoints(victim, enemy, finalReward, true, point_type, information);
dictionary webster = new dictionary();
webster.put("victim", victim);
webster.put("victimRank", selfRank);
messageTo(enemy, "recivedGcwCreditForKill", webster, 0.0f, false);
return finalReward;
}
public static int addToDailyGcwPointAllotment(obj_id victim, obj_id killer, int gcwPoint) throws InterruptedException
{
Vector dailyKills = new Vector();
dailyKills.setSize(0);
if (utils.hasResizeableStringBatchObjVar(victim, LIST_DAILY_KILL_VALUES))
{
dailyKills = utils.getResizeableStringBatchObjVar(victim, LIST_DAILY_KILL_VALUES);
utils.removeBatchObjVar(victim, LIST_DAILY_KILL_VALUES);
}
int targetRank = pvpGetCurrentGcwRank(killer);
int selfRank = pvpGetCurrentGcwRank(victim);
int maxInterval = (int) (targetRank + selfRank) * GCW_PLAYER_PVP_MODIFIER;
int positionInArray = findAttackerInArray(dailyKills, killer);
if (positionInArray == -1)
{
if (gcwPoint > maxInterval)
{
gcwPoint = maxInterval;
}
String newEntry = packKillerDailyPoints(killer, 1, getGameTime());
utils.addElement(dailyKills, newEntry);
}
else
{
int accruedPoints = getAccruedPoints(((String)(dailyKills.get(positionInArray))));
int timeAtFirstAward = getTimeOfFirstAward(((String)(dailyKills.get(positionInArray))));
gcwPoint = gcwPoint > maxInterval ? maxInterval : gcwPoint;
if (getGameTime() > timeAtFirstAward + 86400)
{
timeAtFirstAward = getGameTime();
accruedPoints = 1;
}
else
{
accruedPoints++;
if (accruedPoints > 4)
{
gcwPoint = (int)(gcwPoint * 0.5f);
}
else
{
gcwPoint = (int)(gcwPoint * (float)((10.0f - ((float)accruedPoints - 1.0f)) / 10.0f));
}
}
String newEntry = packKillerDailyPoints(killer, accruedPoints, timeAtFirstAward);
dailyKills.set(positionInArray, newEntry);
}
utils.setResizeableBatchObjVar(victim, LIST_DAILY_KILL_VALUES, dailyKills);
return gcwPoint;
}
public static void removeDayOldEntries(obj_id player) throws InterruptedException
{
if (!utils.hasResizeableStringBatchObjVar(player, LIST_DAILY_KILL_VALUES))
{
return;
}
Vector dailyList = utils.getResizeableStringBatchObjVar(player, LIST_DAILY_KILL_VALUES);
utils.removeBatchObjVar(player, LIST_DAILY_KILL_VALUES);
int dayPast = getGameTime() - 86400;
for (int i = 0; i < dailyList.size(); i++)
{
testAbortScript();
String[] parse = split(((String)(dailyList.get(i))), '-');
int timeHack = utils.stringToInt(parse[2]);
if (dayPast > timeHack)
{
utils.removeElementAt(dailyList, i);
}
}
utils.setResizeableBatchObjVar(player, LIST_DAILY_KILL_VALUES, dailyList);
}
public static String packKillerDailyPoints(obj_id player, int gcwPoint, int time) throws InterruptedException
{
return ("" + player + "-" + gcwPoint + "-" + time);
}
public static int getTimeOfFirstAward(String killRecord) throws InterruptedException
{
String[] parse = split(killRecord, '-');
return utils.stringToInt(parse[2]);
}
public static int getAccruedPoints(Vector attackList, obj_id attacker) throws InterruptedException
{
if (attackList == null || attackList.size() == 0)
{
return 0;
}
for (int i = 0; i < attackList.size(); i++)
{
testAbortScript();
String[] splitEntry = split(((String)(attackList.get(i))), '-');
obj_id idAtPoint = utils.stringToObjId(splitEntry[0]);
if (idAtPoint == attacker)
{
return utils.stringToInt(splitEntry[1]);
}
}
return 0;
}
public static int getAccruedPoints(String killRecord) throws InterruptedException
{
String[] parse = split(killRecord, '-');
return utils.stringToInt(parse[1]);
}
public static void grantModifiedGcwPoints(obj_id victim, obj_id[] attackers, boolean pvpKill, int point_type, String information) throws InterruptedException
{
if (!isIdValid(victim))
{
return;
}
if (attackers == null || attackers.length == 0)
{
return;
}
for (int i = 0; i < attackers.length; i++)
{
testAbortScript();
if (isIdValid(attackers[i]) && exists(attackers[i]) && getDistance(victim, attackers[i]) < 120.0f)
{
grantModifiedGcwPoints(victim, attackers[i], pvpKill, point_type, information);
}
}
}
public static void grantModifiedGcwPoints(obj_id attacker, int pointValue, int point_type, String information) throws InterruptedException
{
pointValue = getModifiedGcwPointValue(attacker, pointValue);
_grantGcwPoints(null, attacker, pointValue, false, point_type, information);
}
public static void grantModifiedGcwPoints(obj_id victim, obj_id attacker, boolean pvpKill, int point_type, String information) throws InterruptedException
{
int pointValue = getNpcKillCredit(victim, attacker);
grantModifiedGcwPoints(victim, attacker, pointValue, pvpKill, point_type, information);
}
public static void grantModifiedGcwPoints(obj_id victim, obj_id attacker, int pointValue, boolean pvpKill, int point_type, String information) throws InterruptedException
{
pointValue = getModifiedGcwPointValue(attacker, pointValue);
_grantGcwPoints(victim, attacker, pointValue, pvpKill, point_type, information);
}
public static void grantUnmodifiedGcwPoints(obj_id attacker, int pointValue) throws InterruptedException
{
_grantGcwPoints(null, attacker, pointValue, false, -1, "");
}
public static void _grantGcwPoints(obj_id victim, obj_id attacker, int pointValue, boolean pvpKill, int pointType, String information) throws InterruptedException
{
if (!isIdValid(attacker) || !exists(attacker) || pointValue < 1 || pet_lib.isPet(victim))
{
return;
}
pvpModifyCurrentGcwPoints(attacker, pointValue);
prose_package pp = new prose_package();
pp.target.set(getName(victim));
pp.digitInteger = pointValue;
if (pvpKill)
{
pp.stringId = SID_PVP_KILL_POINT_GRANT;
sendSystemMessageProse(attacker, pp);
}
else
{
pp.stringId = SID_GENERIC_POINT_GRANT;
sendSystemMessageProse(attacker, pp);
}
doGcwPointCsLogging(attacker, pointValue, pointType, information);
gcwInvasionCreditForGCW(attacker, pointValue);
grantGcwPointsToRegion(attacker, pointValue, pointType);
testGcwPointCheating(attacker, pointType);
}
public static void testGcwPointCheating(obj_id player, int pointType) throws InterruptedException
{
int testTime = utils.getIntScriptVar(player, "gcw.lastCheatingTestTime");
location loc = utils.getLocationScriptVar(player, "gcw.lastCheatingLocation");
if (testTime <= 0 || loc == null)
{
loc = getLocation(player);
utils.setScriptVar(player, "gcw.lastCheatingTestTime", getGameTime());
utils.setScriptVar(player, "gcw.lastCheatingLocation", loc);
return;
}
float distance = getDistance(loc, getLocation(player));
if (distance > 5.0f)
{
loc = getLocation(player);
utils.setScriptVar(player, "gcw.lastCheatingTestTime", getGameTime());
utils.setScriptVar(player, "gcw.lastCheatingLocation", loc);
return;
}
int timeDelta = getGameTime() - testTime;
if (timeDelta >= 30)
{
String pointTypeTitle = "";
switch(pointType)
{
case GCW_POINT_TYPE_GROUND_PVE:
pointTypeTitle = "GCW_points_ground_pve";
break;
case GCW_POINT_TYPE_GROUND_PVP:
pointTypeTitle = "GCW_points_ground_pvp";
break;
case GCW_POINT_TYPE_GROUND_PVP_REGION:
pointTypeTitle = "GCW_points_ground_pvp_region";
break;
case GCW_POINT_TYPE_BASE_BUSTING:
pointTypeTitle = "GCW_points_player_base_busting";
break;
case GCW_POINT_TYPE_SPACE_PVE:
pointTypeTitle = "GCW_points_space_pve";
break;
case GCW_POINT_TYPE_SPACE_PVP:
pointTypeTitle = "GCW_points_space_pvp";
break;
case GCW_POINT_TYPE_GROUND_QUEST:
pointTypeTitle = "GCW_points_ground_quest";
default:
pointTypeTitle = "GCW_unknown";
break;
}
utils.setScriptVar(player, "gcw.lastCheatingTestTime", getGameTime());
boolean stealthed = stealth.getInvisBuff(player) != null;
CustomerServiceLog("GCW_cheating", ",Player,"+ player + ",Name,"+ getName(player) + ",GCW Type,"+ pointTypeTitle + ",Location,"+ loc + ",Stealthed,"+ stealthed);
}
}
public static void doGcwPointCsLogging(obj_id player, int pointValue, int pointType, String information) throws InterruptedException
{
switch(pointType)
{
case GCW_POINT_TYPE_GROUND_PVE:
CustomerServiceLog("GCW_points_ground_pve", "%TU has acquired "+ pointValue + " points for defeating "+ information + " in pve action", player);
break;
case GCW_POINT_TYPE_GROUND_PVP:
CustomerServiceLog("GCW_points_ground_pvp", "%TU has acquired "+ pointValue + " points for defeating "+ information + " in combat", player);
break;
case GCW_POINT_TYPE_GROUND_PVP_REGION:
CustomerServiceLog("GCW_points_ground_pvp_region", "%TU has acquired "+ pointValue + " points in the "+ information + " battlefield region.", player);
break;
case GCW_POINT_TYPE_BASE_BUSTING:
CustomerServiceLog("GCW_points_player_base_busting", "%TU has acquired "+ pointValue + " points for destroying "+ information, player);
break;
case GCW_POINT_TYPE_SPACE_PVE:
CustomerServiceLog("GCW_points_space_pve", "%TU has acquired "+ pointValue + " points for destroying "+ information, player);
break;
case GCW_POINT_TYPE_SPACE_PVP:
CustomerServiceLog("GCW_points_space_pvp", "%TU has acquired "+ pointValue + " points for defeating "+ information + " in space combat", player);
break;
case GCW_POINT_TYPE_GROUND_QUEST:
CustomerServiceLog("GCW_points_ground_quest", "%TU has acquired "+ pointValue + " points for completing the "+ information + " groundquest", player);
default:
break;
}
}
public static String getGcwCategory(int pointType) throws InterruptedException
{
if (pointType < 0 || pointType >= GCW_POINT_TYPE_MAX)
{
return null;
}
String pointCategory = pointTypes[pointType];
String scene = getCurrentSceneName();
int sceneIndex = utils.getElementPositionInArray(validScenes, scene);
if (sceneIndex < 0)
{
return null;
}
return scene + "_" + pointCategory;
}
public static String getGcwRegion(obj_id target) throws InterruptedException
{
if (!isIdValid(target) || !exists(target))
{
return null;
}
region[] regionList = getRegionsAtPoint(getLocation(target));
String regionName = "";
for (int i = 0, j = regionList.length; i < j; i++)
{
testAbortScript();
region currentRegion = regionList[i];
if (currentRegion == null)
{
continue;
}
String currentRegionName = currentRegion.getName();
if (currentRegionName != null && currentRegionName.length() > 0 && currentRegionName.startsWith("gcw_region"))
{
regionName = currentRegionName;
break;
}
}
if (regionName.length() <= 0)
{
String scene = getCurrentSceneName();
int sceneIndex = utils.getElementPositionInArray(validScenes, scene);
regionName = defaultRegions[sceneIndex];
}
return regionName;
}
public static void grantGcwPointsToRegion(obj_id player, int pointValue, int pointType) throws InterruptedException
{
if (!isIdValid(player) || pointValue < 0 || pointType < 0 || pointType >= GCW_POINT_TYPE_MAX)
{
return;
}
String category = getGcwCategory(pointType);
String regionName = getGcwRegion(player);
if (category == null || category.length() <= 0 || regionName == null || regionName.length() <= 0)
{
return;
}
if (factions.isImperial(player))
{
adjustGcwImperialScore("grantGcwPointsToRegion", category, pointValue);
adjustGcwImperialScore("grantGcwPointsToRegion", regionName, pointValue);
LOG("gcw_region_points", "Imperial gain. regionName: "+ regionName + " category: "+ category + " pointValue: "+ pointValue);
}
else if (factions.isRebel(player))
{
adjustGcwRebelScore("grantGcwPointsToRegion", category, pointValue);
adjustGcwRebelScore("grantGcwPointsToRegion", regionName, pointValue);
LOG("gcw_region_points", "Rebel gain. regionName: "+ regionName + " category: "+ category + " pointValue: "+ pointValue);
}
}
public static int getImperialPercentileByRegion(obj_id target) throws InterruptedException
{
if (!isIdValid(target) || !exists(target))
{
return 50;
}
String category = getGcwRegion(target);
if (category == null || category.length() <= 0)
{
return 50;
}
return getGcwImperialScorePercentile(category);
}
public static int getRebelPercentileByRegion(obj_id target) throws InterruptedException
{
return 100 - getImperialPercentileByRegion(target);
}
public static String getRegionFactionOwner(obj_id target) throws InterruptedException
{
String category = getGcwRegion(target);
if (category == null || category.length() <= 0)
{
return null;
}
int imperial = getImperialPercentileByRegion(target);
if (imperial > 50)
{
return "imperial";
}
if (imperial < 50)
{
return "rebel";
}
return null;
}
public static int getImperialPlanetaryPercentage(String planet) throws InterruptedException
{
if (planet == null || planet.length() <= 0)
{
return 50;
}
int sceneIndex = utils.getElementPositionInArray(validScenes, planet);
if (sceneIndex < 0 || sceneIndex >= maxRegions.length)
{
return 50;
}
int categories = maxRegions[sceneIndex];
float imperialPercentages = 0;
for (int i = 1; i <= categories; i++)
{
testAbortScript();
String category = "gcw_region_"+ planet + "_"+ i;
imperialPercentages += getGcwImperialScorePercentile(category);
}
return Math.round(imperialPercentages / categories);
}
public static int getRebelPlanetaryPercentage(String planet) throws InterruptedException
{
return 100 - getImperialPlanetaryPercentage(planet);
}
public static boolean verifyPvpRegionStatus(obj_id player) throws InterruptedException
{
obj_id region_controller = getPvpRegionControllerIdByPlayer(player);
if (!isIdValid(region_controller))
{
return false;
}
utils.setScriptVar(player, PVP_REGION_ACTIVITY_PERFORMED, true);
return true;
}
public static int getNpcKillCredit(obj_id npc, obj_id player) throws InterruptedException
{
if (isPlayer(npc) || pet_lib.isPet(npc))
{
return 0;
}
String faction = factions.getFaction(npc);
if (faction == null || faction.equals(""))
{
return 0;
}
if (!faction.equals("Rebel") && !faction.equals("Imperial"))
{
return 0;
}
if (faction.equals("Rebel") && !factions.isImperial(player))
{
return 0;
}
if (faction.equals("Imperial") && !factions.isRebel(player))
{
return 0;
}
double npcLev = (double) getLevel(npc);
double playLev = (double) getLevel(player);
if ((npcLev / playLev) < MIN_NPC_LEVEL_RATIO_LIMIT)
{
return 0;
}
int difficultyClass = getIntObjVar(npc, "difficultyClass");
switch(difficultyClass)
{
case 0:
return NORMAL_GCW_VALUE;
case 1:
return ELITE_GCW_VALUE;
case 2:
return BOSS_GCW_VALUE;
default:
return 0;
}
}
public static int getModifiedGcwPointValue(obj_id player, int passedValue) throws InterruptedException
{
float mod = 1.0f;
if (utils.hasScriptVar(player, "buff.xpBonus.value"))
{
mod += utils.getFloatScriptVar(player, "buff.xpBonus.value");
}
if (utils.hasScriptVar(player, "buff.xpBonusGeneral.value"))
{
mod += utils.getFloatScriptVar(player, "buff.xpBonusGeneral.value");
}
if (utils.hasScriptVar(player, "buff.gcwBonusGeneral.value"))
{
mod += utils.getFloatScriptVar(player, "buff.gcwBonusGeneral.value");
}
if (isSpaceBattlefieldZone())
{
mod += .1f;
}
return (int) (mod * passedValue);
}
public static void registerPvpRegionControllerWithPlanet(obj_id controlObject, String regionName) throws InterruptedException
{
obj_id planetId = getPlanetByName(getLocation(controlObject).area);
utils.setScriptVar(planetId, REGION_CONTROLLER + "."+ regionName, controlObject);
}
public static obj_id getPvpRegionControllerIdByName(obj_id player, String regionName) throws InterruptedException
{
obj_id planetId = getPlanetByName(getLocation(player).area);
String packedRegion = REGION_CONTROLLER + "."+ regionName;
return utils.hasScriptVar(planetId, packedRegion) ? utils.getObjIdScriptVar(planetId, packedRegion) : null;
}
public static obj_id getPvpRegionControllerIdByPlayer(obj_id player) throws InterruptedException
{
region[] regionList = getRegionsAtPoint(getLocation(player));
obj_id planetId = getPlanetByName(getLocation(player).area);
obj_id regionController = null;
if (regionList == null || regionList.length == 0)
{
return null;
}
for (int i = 0; i < regionList.length; i++)
{
testAbortScript();
String regionName = regionList[i].getName();
String packedRegion = REGION_CONTROLLER + "."+ regionName;
if (utils.hasScriptVar(planetId, packedRegion))
{
regionController = utils.getObjIdScriptVar(planetId, packedRegion);
}
}
return regionController;
}
public static void notifyPvpRegionControllerOfPlayerEnter(obj_id controllerId, obj_id player) throws InterruptedException
{
dictionary dict = new dictionary();
dict.put("player", player);
messageTo(controllerId, "newPlayerNotify", dict, 0, false);
doLogging("GCW_points_ground_pvp", "notifyPvpRegionControllerOfPlayerEnter"+ getName(player) + "/"+ player + " has entered the region. Notifying controller object "+ controllerId);
}
public static void makeBattlefieldRegion(obj_id controller) throws InterruptedException
{
if (!isIdValid(controller))
{
doLogging("GCW_points_ground_pvp", "makeBattlefieldRegion controller not valid");
return;
}
String regionName = getBattlefieldRegionName(controller);
if (regionName == null || regionName.length() < 1)
{
doLogging("GCW_points_ground_pvp", "makeBattlefieldRegion regionName invalid");
return;
}
location whereIam = getLocation(controller);
region battlefieldRegion = getRegion(whereIam.area, regionName);
if (battlefieldRegion != null)
{
doLogging("GCW_points_ground_pvp", "makeBattlefieldRegion registerPvpRegionControllerWithPlanet battlefieldRegion exists");
registerPvpRegionControllerWithPlanet(controller, regionName);
return;
}
doLogging("GCW_points_ground_pvp", "makeBattlefieldRegion registerPvpRegionControllerWithPlanet failed");
}
public static void makePushbackRegion(obj_id controller) throws InterruptedException
{
if (!isIdValid(controller))
{
doLogging("GCW_points_ground_pvp", "makePushbackRegion controller not valid");
return;
}
String regionName = getPushbackRegionName(controller);
if (regionName == null || regionName.length() < 1)
{
doLogging("GCW_points_ground_pvp", "makePushbackRegion regionName invalid");
return;
}
location whereIam = getLocation(controller);
region pushbackRegion = getRegion(whereIam.area, regionName);
if (pushbackRegion != null)
{
doLogging("GCW_points_ground_pvp", "makePushbackRegion registerPvpRegionControllerWithPlanet pushbackRegion exists");
registerPvpRegionControllerWithPlanet(controller, regionName);
return;
}
doLogging("GCW_points_ground_pvp", "makePushbackRegion registerPvpRegionControllerWithPlanet failed");
}
public static obj_id getPushbackControllerByPlayer(obj_id player) throws InterruptedException
{
return getPvpRegionControllerIdByPlayer(player);
}
public static void grantSpacePvpKillCredit(obj_id defender, obj_id[] attackers) throws InterruptedException
{
Vector validAttackers = new Vector();
validAttackers.setSize(0);
for (int i = 0; i < attackers.length; i++)
{
testAbortScript();
if (factions.isImperial(defender))
{
if (factions.isRebel(attackers[i]) && validateSpaceTier(defender, attackers[i]))
{
utils.addElement(validAttackers, attackers[i]);
}
else
{
LOG("doLogging", "Faction or tier error");
}
}
if (factions.isRebel(defender))
{
if (factions.isImperial(attackers[i]) && validateSpaceTier(defender, attackers[i]))
{
utils.addElement(validAttackers, attackers[i]);
}
else
{
LOG("doLogging", "Faction or tier error");
}
}
}
if (validAttackers == null || validAttackers.size() < 1)
{
return;
}
for (int k = 0; k < validAttackers.size(); k++)
{
testAbortScript();
String packedAttacker = ""+ ((obj_id)(validAttackers.get(k))) + "-"+ 1;
int reward = distributeIndividualContribution(defender, packedAttacker, validAttackers.size(), GCW_POINT_TYPE_SPACE_PVP);
pvpModifyCurrentPvpKills(((obj_id)(validAttackers.get(k))), 1);
}
}
public static boolean validateSpaceTier(obj_id defender, obj_id attacker) throws InterruptedException
{
int defLevel = space_flags.getPilotTier(defender);
int atkLevel = space_flags.getPilotTier(attacker);
switch(defLevel)
{
case 0:
return false;
case 1:
if (atkLevel > 2)
{
return false;
}
case 2:
if (atkLevel > 3)
{
return false;
}
case 3:
break;
case 4:
break;
case 5:
break;
}
return true;
}
public static int getSpaceKillCredit(int player_level, String targetTier) throws InterruptedException
{
double pointGrant = 0.0;
double pointIncriment = SPACE_GCW_VALUE;
switch(player_level)
{
case 1:
if (targetTier.equals("tier1"))
{
pointGrant = pointIncriment;
}
if (targetTier.equals("tier2") || targetTier.equals("tier3") || targetTier.equals("tier4") || targetTier.equals("tier5"))
{
pointGrant = pointIncriment * 1.5;
}
break;
case 2:
if (targetTier.equals("tier1"))
{
pointGrant = (pointIncriment * 2) / 2;
}
if (targetTier.equals("tier2"))
{
pointGrant = pointIncriment * 2;
}
if (targetTier.equals("tier3") || targetTier.equals("tier4") || targetTier.equals("tier5"))
{
pointGrant = pointIncriment * 2.5;
}
break;
case 3:
if (targetTier.equals("tier2"))
{
pointGrant = (pointIncriment * 3) / 2;
}
if (targetTier.equals("tier3"))
{
pointGrant = pointIncriment * 3;
}
if (targetTier.equals("tier4") || targetTier.equals("tier5"))
{
pointGrant = pointIncriment * 3.5;
}
break;
case 4:
if (targetTier.equals("tier3"))
{
pointGrant = (pointIncriment * 4) / 2;
}
if (targetTier.equals("tier4"))
{
pointGrant = pointIncriment * 4;
}
if (targetTier.equals("tier5"))
{
pointGrant = pointIncriment * 4.5;
}
break;
case 5:
if (targetTier.equals("tier4"))
{
pointGrant = (pointIncriment * 5) / 2;
}
if (targetTier.equals("tier5"))
{
pointGrant = pointIncriment * 5;
}
break;
default:
break;
}
return (int) pointGrant;
}
public static void grantBaseDestructionPoints(obj_id base) throws InterruptedException
{
obj_id[] interiorPlayers = trial.getPlayersInDungeon(base);
obj_id[] exteriorPlayers = getPlayerCreaturesInRange(getLocation(base), 120.0f);
String baseFac = factions.getFaction(base);
if (baseFac == null || (!baseFac.equals("Rebel") && !baseFac.equals("Imperial")))
{
CustomerServiceLog("GCW_points_player_base_busting", "Base("+ getName(base) + "/"+ base + "/"+ baseFac + ") did not have a Rebel or Imperial faction");
return;
}
Vector filteredList = new Vector();
filteredList.setSize(0);
if (interiorPlayers != null && interiorPlayers.length > 0)
{
for (int i = 0; i < interiorPlayers.length; i++)
{
testAbortScript();
if (isIdValid(interiorPlayers[i]) && exists(interiorPlayers[i]))
{
String playerFac = factions.getFaction(interiorPlayers[i]);
if (playerFac == null)
{
continue;
}
if (baseFac.equals("Rebel") && playerFac.equals("Imperial"))
{
utils.addElement(filteredList, interiorPlayers[i]);
}
if (baseFac.equals("Imperial") && playerFac.equals("Rebel"))
{
utils.addElement(filteredList, interiorPlayers[i]);
}
}
}
}
if (exteriorPlayers != null && exteriorPlayers.length > 0)
{
for (int k = 0; k < exteriorPlayers.length; k++)
{
testAbortScript();
if (isIdValid(exteriorPlayers[k]) && exists(exteriorPlayers[k]))
{
String playerFac = factions.getFaction(exteriorPlayers[k]);
if (playerFac == null)
{
continue;
}
if (baseFac.equals("Rebel") && playerFac.equals("Imperial"))
{
if (filteredList.size() > 0)
{
if (utils.getElementPositionInArray(filteredList, exteriorPlayers[k]) == -1)
{
utils.addElement(filteredList, exteriorPlayers[k]);
}
}
else
{
utils.addElement(filteredList, exteriorPlayers[k]);
}
}
if (baseFac.equals("Imperial") && playerFac.equals("Rebel"))
{
if (filteredList.size() > 0)
{
if (utils.getElementPositionInArray(filteredList, exteriorPlayers[k]) == -1)
{
utils.addElement(filteredList, exteriorPlayers[k]);
}
}
else
{
utils.addElement(filteredList, exteriorPlayers[k]);
}
}
}
}
}
String table = GCW_PLAYER_BASE_POINT_VALUE;
if (!dataTableOpen(table))
{
CustomerServiceLog("GCW_points_player_base_busting", "Could not open the "+ GCW_PLAYER_BASE_POINT_VALUE + " data table");
return;
}
String template = getTemplateName(base);
int value = dataTableGetInt(table, template, "point_value");
if (value < -1)
{
CustomerServiceLog("GCW_points_player_base_busting", "template "+ template + " could not be found in the dataTable "+ GCW_PLAYER_BASE_POINT_VALUE);
return;
}
value *= GCW_PLAYER_BASE_DESTRUCTION;
if (filteredList == null || filteredList.size() == 0)
{
CustomerServiceLog("GCW_points_player_base_busting", "There are no valid players in the filtered list");
return;
}
for (int j = 0; j < filteredList.size(); j++)
{
testAbortScript();
grantModifiedGcwPoints(((obj_id)(filteredList.get(j))), value, gcw.GCW_POINT_TYPE_BASE_BUSTING, template);
}
}
public static int getGcwGroundQuestAward(obj_id player, int quest_tier) throws InterruptedException
{
if (!factions.isImperial(player) && !factions.isRebel(player))
{
return 0;
}
float tierValue = getGroundQuestTierBonus(quest_tier);
int rank = pvpGetCurrentGcwRank(player);
String gcwRankTable = "datatables/gcw/gcw_rank.iff";
int rankCapBase = dataTableGetInt(gcwRankTable, 0, "RatingEarningCap");
int rankCap = dataTableGetInt(gcwRankTable, rank - 1, "RatingEarningCap");
float groundQuestGcwValue = tierValue * 5000;
float capDeltaBonus = rankCapBase / rankCap;
groundQuestGcwValue *= capDeltaBonus;
return (int) groundQuestGcwValue;
}
public static float getGroundQuestTierBonus(int quest_tier) throws InterruptedException
{
float tierValue = 0.0f;
switch(quest_tier)
{
case 1:
tierValue = 0.03f;
break;
case 2:
tierValue = 0.039f;
break;
case 3:
tierValue = 0.047f;
break;
case 4:
tierValue = 0.054f;
break;
case 5:
tierValue = 0.06f;
break;
default:
break;
}
return tierValue;
}
public static void doLogging(String section, String message) throws InterruptedException
{
CustomerServiceLog(section, message);
}
public static region getPvPRegion(obj_id controller) throws InterruptedException
{
region[] regions = getRegionsAtPoint(getLocation(controller));
if (regions == null || regions.length == 0)
{
return null;
}
region pvpRegion = null;
for (int i = 0; i < regions.length; i++)
{
testAbortScript();
if (isNotifyRegion(regions[i]))
{
pvpRegion = regions[i];
}
}
return pvpRegion;
}
public static void getRegionToRegister(obj_id controller) throws InterruptedException
{
if (!isIdValid(controller))
{
return;
}
region pvpRegion = getPvPRegion(controller);
if (pvpRegion == null)
{
return;
}
String regionName = pvpRegion.getName();
if (regionName != null)
{
utils.setScriptVar(controller, "pvp_region", regionName);
registerPvpRegionControllerWithPlanet(controller, regionName);
}
return;
}
public static boolean isPlayerValidOnBattlefield(obj_id player, obj_id controller) throws InterruptedException
{
return true;
}
public static String getBattlefieldRegionName(obj_id controller) throws InterruptedException
{
if (!isIdValid(controller))
{
return null;
}
location loc = getLocation(controller);
if (loc == null)
{
return null;
}
return PVP_BATTLEFIELD_REGION + "_" + loc.x + "_" + loc.z;
}
public static String getPushbackRegionName(obj_id controller) throws InterruptedException
{
if (!isIdValid(controller))
{
return null;
}
location loc = getLocation(controller);
if (loc == null)
{
return null;
}
return PVP_PUSHBACK_REGION + "_" + loc.x + "_" + loc.z;
}
public static boolean canEntertainGcwNonPlayingCharacter(obj_id player, obj_id npc) throws InterruptedException
{
if (!isValidId(player) || !exists(player))
{
return false;
}
if (!isValidId(npc) || !exists(npc))
{
return false;
}
if (!factions.isSameFactionorFactionHelper(player, npc))
{
return false;
}
String entertainerFaction = factions.getFaction(player);
if ((!factions.isImperialHelper(player) && !factions.isRebelHelper(player) && (entertainerFaction == null || entertainerFaction.length() <= 0)))
{
sendSystemMessage(player, SID_YOU_NEED_TO_BE_COMBATANT);
doAnimationAction (npc, "shake_head_no");
return false;
}
if (!groundquests.isQuestActive(player, GCW_ENTERTAINER_PATROL_QUEST))
{
sendSystemMessage(player, SID_YOU_NEED_ENTERTAINMENT_QUEST);
return false;
}
if (buff.hasBuff(npc, GCW_NPC_ENTERTAINED_BUFF))
{
return false;
}
return true;
}
public static boolean setEntertainGcwNonPlayerCharacter(obj_id player, obj_id npc) throws InterruptedException
{
if (!isValidId(player) || !exists(player))
{
return false;
}
if (!isValidId(npc) || !exists(npc))
{
return false;
}
if (!canEntertainGcwNonPlayingCharacter(player, npc))
{
return false;
}
int flags = 0;
flags |= sui.CD_EVENT_INCAPACITATE;
flags |= sui.CD_EVENT_DAMAGED;
flags |= sui.CD_EVENT_COMBAT;
flags |= sui.CD_EVENT_LOCOMOTION;
flags |= sui.CD_EVENT_STEALTHED;
stealth.testInvisNonCombatAction(player, npc);
utils.setScriptVar(player, GCW_SCRIPTVAR_PARENT + ".playerEntertainmentStart", getGameTime());
utils.setScriptVar(player, GCW_SCRIPTVAR_PARENT + ".gcwNpc", npc);
utils.setScriptVar(npc, GCW_SCRIPTVAR_PARENT + ".isGcwEntertained", 1);
LOG("gcw_entertainer","gcwNpc: "+npc);
int pid = sui.smartCountdownTimerSUI(player, player, "quest_countdown_timer", SID_ENTERTAIN_TROOPS_TIMER, 0, GCW_ENTERTAINMENT_TIME, "handleEntertainingGcwTroops", 0, flags);
sui.setPid(player, pid, ENTERTAIN_GCW_TROOPS_PID);
return true;
}
public static boolean canGcwObjectBeRepaired(obj_id object) throws InterruptedException
{
LOG("gcw_patrol_point","canGcwObjectBeRepaired");
if (!isValidId(object) || !exists(object))
{
return false;
}
if (hasObjVar(object, "repairCount") && getIntObjVar(object, "repairCount") >= REPAIR_COUNT_MAX)
{
return false;
}
int currentHp = getHitpoints(object);
if (currentHp <= 0)
{
return false;
}
int maxHp = getMaxHitpoints(object);
if (maxHp <= 0)
{
return false;
}
if (currentHp == maxHp)
{
return false;
}
int threshold = maxHp - currentHp >= GCW_REPAIR_AMOUNT ? GCW_REPAIR_AMOUNT : 0;
if (threshold <= 0)
{
return false;
}
LOG("gcw_patrol_point","canGcwObjectBeRepaired passed all validation");
return true;
}
public static boolean useGcwObjectForQuest(obj_id player, obj_id gcwObject, String questName) throws InterruptedException
{
LOG("gcw_patrol_point","useGcwObjectForQuest init");
if (!isValidId(player) || !exists(player))
{
return false;
}
if (!isValidId(gcwObject) || !exists(gcwObject))
{
return false;
}
int flags = 0;
flags |= sui.CD_EVENT_INCAPACITATE;
flags |= sui.CD_EVENT_LOCOMOTION;
flags |= sui.CD_EVENT_STEALTHED;
stealth.testInvisNonCombatAction(player, gcwObject);
int timeToRepair = 10 + getFatigueTimerMod(player);
if (timeToRepair > GCW_FATIGUE_TIMER_MAX)
{
timeToRepair = GCW_FATIGUE_TIMER_MAX;
}
if (questName.equals(GCW_SPY_PATROL_DESTROY_QUEST))
{
timeToRepair = 5;
if (isGod(player))
{
timeToRepair = 3;
}
LOG("gcw_patrol_point","useGcwObjectForQuest sending to messageHandler handleOpposingFactionDestroyQuest");
utils.setScriptVar(player, "spyPatrolPoint", gcwObject);
int pid = sui.smartCountdownTimerSUI(player, player, "quest_countdown_timer", SID_DESTROY_PP_TIMER, 0, timeToRepair, "handleOpposingFactionDestroyQuest", 0, flags);
sui.setPid(player, pid, gcw.SPY_DESTROY_PID);
}
else if (questName.equals(GCW_SPY_PATROL_SCOUT_QUEST))
{
timeToRepair = 5;
if (isGod(player))
{
timeToRepair = 3;
}
LOG("gcw_patrol_point","useGcwObjectForQuest sending to messageHandler handleOpposingFactionScoutQuest");
utils.setScriptVar(player, "spyPatrolPoint", gcwObject);
int pid = sui.smartCountdownTimerSUI(player, player, "quest_countdown_timer", SID_SCOUT_PP_TIMER, 0, timeToRepair, "handleOpposingFactionScoutQuest", 0, flags);
sui.setPid(player, pid, gcw.SPY_SCOUT_PID);
}
else if (questName.equals(GCW_REPAIR_PATROL_QUEST))
{
if (isGod(player))
{
timeToRepair = 3;
}
LOG("gcw_patrol_point","useGcwObjectForQuest sending to messageHandler handleTraderRepairQuest");
utils.setScriptVar(player, gcw.OBJECT_TO_REPAIR, gcwObject);
utils.setScriptVar(player, gcw.GCW_REPAIR_QUEST, gcw.GCW_REPAIR_PATROL_QUEST);
utils.setScriptVar(player, gcw.GCW_REPAIR_RESOURCE_COUNT, gcw.GCW_RESOURCE_COUNT_PATROL);
int pid = sui.smartCountdownTimerSUI(player, player, "quest_countdown_timer", SID_REPAIR_PP_TIMER, 0, timeToRepair, "handleTraderRepairQuest", 0, flags);
sui.setPid(player, pid, gcw.TRADER_REPAIR_PID);
}
else if (questName.equals(GCW_REPAIR_TURRET_QUEST))
{
if (isGod(player))
{
timeToRepair = 3;
}
LOG("gcw_patrol_point","useGcwObjectForQuest sending to messageHandler handleTraderRepairQuest");
utils.setScriptVar(player, gcw.OBJECT_TO_REPAIR, gcwObject);
utils.setScriptVar(player, gcw.GCW_REPAIR_QUEST, gcw.GCW_REPAIR_TURRET_QUEST);
utils.setScriptVar(player, gcw.GCW_REPAIR_RESOURCE_COUNT, gcw.GCW_RESOURCE_COUNT_TURRET);
int pid = sui.smartCountdownTimerSUI(player, player, "quest_countdown_timer", SID_REPAIR_PP_TIMER, 0, timeToRepair, "handleTraderRepairQuest", 0, flags);
sui.setPid(player, pid, gcw.TRADER_REPAIR_PID);
}
else if (questName.equals(GCW_REPAIR_BARRICADE_QUEST))
{
if (isGod(player))
{
timeToRepair = 3;
}
LOG("gcw_patrol_point","useGcwObjectForQuest sending to messageHandler handleTraderRepairQuest");
utils.setScriptVar(player, gcw.OBJECT_TO_REPAIR, gcwObject);
utils.setScriptVar(player, gcw.GCW_REPAIR_QUEST, gcw.GCW_REPAIR_BARRICADE_QUEST);
utils.setScriptVar(player, gcw.GCW_REPAIR_RESOURCE_COUNT, gcw.GCW_RESOURCE_COUNT_BARRICADE);
int pid = sui.smartCountdownTimerSUI(player, player, "quest_countdown_timer", SID_REPAIR_PP_TIMER, 0, timeToRepair, "handleTraderRepairQuest", 0, flags);
sui.setPid(player, pid, gcw.TRADER_REPAIR_PID);
}
else if (questName.equals(GCW_REPAIR_VEHICLE_PATROL_QUEST))
{
if (isGod(player))
{
timeToRepair = 3;
}
LOG("gcw_patrol_point","useGcwObjectForQuest sending to messageHandler handleTraderRepairQuest");
utils.setScriptVar(player, gcw.OBJECT_TO_REPAIR, gcwObject);
utils.setScriptVar(player, gcw.GCW_REPAIR_QUEST, gcw.GCW_REPAIR_VEHICLE_PATROL_QUEST);
utils.setScriptVar(player, gcw.GCW_REPAIR_RESOURCE_COUNT, gcw.GCW_RESOURCE_COUNT_VEHICLE);
int pid = sui.smartCountdownTimerSUI(player, player, "quest_countdown_timer", SID_REPAIR_PP_TIMER, 0, timeToRepair, "handleTraderRepairQuest", 0, flags);
sui.setPid(player, pid, gcw.TRADER_REPAIR_PID);
}
else if (questName.equals(GCW_REPAIR_DAMAGED_VEHICLE_QUEST))
{
if (isGod(player))
{
timeToRepair = 3;
}
LOG("gcw_patrol_point","useGcwObjectForQuest sending to messageHandler handleTraderRepairQuest");
utils.setScriptVar(player, gcw.OBJECT_TO_REPAIR, gcwObject);
utils.setScriptVar(player, gcw.GCW_REPAIR_QUEST, gcw.GCW_REPAIR_DAMAGED_VEHICLE_QUEST);
utils.setScriptVar(player, gcw.GCW_REPAIR_RESOURCE_COUNT, gcw.GCW_RESOURCE_COUNT_DAMAGED_VEHICLE);
int pid = sui.smartCountdownTimerSUI(player, player, "quest_countdown_timer", SID_REPAIR_PP_TIMER, 0, timeToRepair, "handleTraderRepairQuest", 0, flags);
sui.setPid(player, pid, gcw.TRADER_REPAIR_PID);
}
else if (questName.equals(GCW_MEDIC_HEAL_QUEST))
{
if (isGod(player))
{
timeToRepair = 3;
}
LOG("gcw_patrol_point","useGcwObjectForQuest sending to messageHandler handleTraderRepairQuest");
utils.setScriptVar(player, OBJECT_TO_REPAIR, gcwObject);
utils.setScriptVar(player, GCW_REPAIR_QUEST, GCW_MEDIC_HEAL_QUEST);
utils.setScriptVar(player, GCW_REPAIR_RESOURCE_COUNT, GCW_RESOURCE_COUNT_DAMAGED_VEHICLE);
int pid = sui.smartCountdownTimerSUI(player, player, "quest_countdown_timer", SID_HEAL_PP_TIMER, 0, timeToRepair, "handleTraderRepairQuest", 0, flags);
sui.setPid(player, pid, gcw.TRADER_REPAIR_PID);
}
return true;
}
public static boolean repairGcwObject(obj_id object, obj_id player, int resourceCount) throws InterruptedException
{
if (!isValidId(object) || !exists(object))
{
return false;
}
if (!isValidId(player) || !exists(player))
{
return false;
}
if (resourceCount <= 0)
{
return false;
}
if (hasObjVar(object, GCW_OBJECT_REPAIR_COUNT) && getIntObjVar(object, GCW_OBJECT_REPAIR_COUNT) >= REPAIR_COUNT_MAX)
{
return false;
}
if (!isMob(object))
{
int currentHp = getHitpoints(object);
if (currentHp <= 0)
{
return false;
}
int maxHp = getMaxHitpoints(object);
if (maxHp <= 0)
{
return false;
}
int threshold = maxHp - currentHp > resourceCount ? resourceCount : 0;
if (threshold <= 0)
{
sendSystemMessage(player, SID_DOESNT_NEED_REPAIR);
return false;
}
double subtract = resourceCount * .2f;
if ((int)subtract <= 0)
{
return false;
}
setMaxHitpoints(object, maxHp - (int)subtract);
setHitpoints(object, currentHp + (int)(resourceCount * .8f));
}
int repairCount = getIntObjVar(object, GCW_OBJECT_REPAIR_COUNT);
setObjVar(object, GCW_OBJECT_REPAIR_COUNT, repairCount + 1);
messageTo(object, "repairComplete", null, 1.0f, false);
return true;
}
public static void playQuestIconParticle(obj_id self) throws InterruptedException
{
dictionary params = new dictionary();
location loc = getLocation(self);
params.put("particleLoc", loc);
int playIconTime = getGameTime();
params.put("iconMessageTime", playIconTime);
utils.setScriptVar(self, "iconMessageTime", playIconTime);
messageTo(self, "playQuestIcon", params, 1.0f, false);
}
public static void playQuestIconHandler(obj_id self, dictionary params) throws InterruptedException
{
int playIconTime = utils.getIntScriptVar(self, "iconMessageTime");
int messageTime = params.getInt("iconMessageTime");
if (playIconTime != messageTime)
{
return;
}
location loc = params.getLocation("particleLoc");
float offset = params.getFloat("offset");
if (loc != null)
{
String particleName = utils.getStringScriptVar(self, "gcwQuestIcon");
if (particleName != null && particleName.length() > 0)
{
playClientEffectLoc(self, "appearance/"+ particleName, loc, offset);
}
else
{
playClientEffectLoc(self, "appearance/pt_icon_quest_red.prt", loc, offset);
}
playIconTime = getGameTime();
params.put("iconMessageTime", playIconTime);
utils.setScriptVar(self, "iconMessageTime", playIconTime);
messageTo(self, "playQuestIcon", params, 6.0f, false);
}
}
public static boolean signalAllParticipantsForDamage(obj_id victimObject, String questName, String signalHasName, String signalSendName) throws InterruptedException
{
LOG("signalAllParticipantsForDamage","signalAllParticipantsForDamage init");
if (!isValidId(victimObject) || !exists(victimObject))
{
return false;
}
if (questName == null || questName.length() <= 0)
{
return false;
}
if (signalHasName == null || signalHasName.length() <= 0)
{
return false;
}
if (signalSendName == null || signalSendName.length() <= 0)
{
return false;
}
obj_id[] attackerList = utils.getObjIdBatchScriptVar(victimObject, "creditForKills.attackerList.attackers");
if (attackerList == null || attackerList.length <= 0)
{
LOG("signalAllParticipantsForDamage","signalAllParticipantsForDamage attackerList NULL");
return false;
}
LOG("signalAllParticipantsForDamage","signalAllParticipantsForDamage attackerList.length: "+attackerList.length);
for (int i = 0; i < attackerList.length; ++i)
{
testAbortScript();
LOG("signalAllParticipantsForDamage","signalAllParticipantsForDamage attackerList[i]: "+attackerList[i]);
if (!isValidId(attackerList[i]))
{
continue;
}
trial.addNonInstanceFactionParticipant(attackerList[i], victimObject);
LOG("signalAllParticipantsForDamage","signalAllParticipantsForDamage attackerList[i]: "+attackerList[i]+" is a valid OID");
if (!groundquests.isQuestActive(attackerList[i], questName))
{
continue;
}
LOG("signalAllParticipantsForDamage","signalAllParticipantsForDamage attackerList[i]: "+attackerList[i]+" has quest active!");
if (!groundquests.isTaskActive(attackerList[i], questName, signalHasName))
{
continue;
}
LOG("signalAllParticipantsForDamage","signalAllParticipantsForDamage signal being sent to: "+attackerList[i]);
groundquests.sendSignal(attackerList[i], signalSendName);
gcw.gcwInvasionCreditForDestroy(attackerList[i]);
}
return true;
}
public static boolean hasConstructionOrRepairTool(obj_id player, obj_id object) throws InterruptedException
{
if (!isValidId(player) || !exists(player))
{
return false;
}
if (!isValidId(object) || !exists(object))
{
return false;
}
obj_id playerInventory = utils.getInventoryContainer(player);
if (!isValidId(playerInventory) || !exists(playerInventory))
{
return false;
}
if (!hasObjVar(object, GCW_SPAWN_ID_OBJVAR))
{
return false;
}
String spawnId = getStringObjVar(object, GCW_SPAWN_ID_OBJVAR);
if (spawnId == null || spawnId.length() <= 0)
{
return false;
}
String desiredTemplate = "";
if (spawnId.equals(GCW_DEFENSE_PATROL_OBJVAR) || spawnId.equals(GCW_OFFENSE_PATROL_OBJVAR))
{
if (!hasObjVar(object, GCW_DEF_TOOL_TEMPLATE_OBJVAR) || !hasObjVar(object, GCW_OFF_TOOL_TEMPLATE_OBJVAR))
{
return false;
}
if (spawnId.equals(GCW_DEFENSE_PATROL_OBJVAR))
{
desiredTemplate = getStringObjVar(object, GCW_DEF_TOOL_TEMPLATE_OBJVAR);
}
if (spawnId.equals(GCW_OFFENSE_PATROL_OBJVAR))
{
desiredTemplate = getStringObjVar(object, GCW_OFF_TOOL_TEMPLATE_OBJVAR);
}
}
else
{
if (!hasObjVar(object, GCW_TOOL_TEMPLATE_OBJVAR))
{
return false;
}
desiredTemplate = getStringObjVar(object, GCW_TOOL_TEMPLATE_OBJVAR);
}
if (desiredTemplate == null || desiredTemplate.length() <= 0)
{
return false;
}
return utils.playerHasItemByTemplateInInventoryOrEquipped(player, desiredTemplate);
}
public static boolean useConstructionOrRepairTool(obj_id player, obj_id object) throws InterruptedException
{
if (!isValidId(player) || !exists(player))
{
return false;
}
if (!isValidId(object) || !exists(object))
{
return false;
}
if (!hasObjVar(object, GCW_SPAWN_ID_OBJVAR))
{
return false;
}
String spawnId = getStringObjVar(object, GCW_SPAWN_ID_OBJVAR);
if (spawnId == null || spawnId.length() <= 0)
{
return false;
}
String desiredTemplate = "";
if (spawnId.equals(GCW_DEFENSE_PATROL_OBJVAR) || spawnId.equals(GCW_OFFENSE_PATROL_OBJVAR))
{
if (!hasObjVar(object, GCW_DEF_TOOL_TEMPLATE_OBJVAR) || !hasObjVar(object, GCW_OFF_TOOL_TEMPLATE_OBJVAR))
{
return false;
}
if (spawnId.equals(GCW_DEFENSE_PATROL_OBJVAR))
{
desiredTemplate = getStringObjVar(object, GCW_DEF_TOOL_TEMPLATE_OBJVAR);
}
if (spawnId.equals(GCW_OFFENSE_PATROL_OBJVAR))
{
desiredTemplate = getStringObjVar(object, GCW_OFF_TOOL_TEMPLATE_OBJVAR);
}
}
else
{
if (!hasObjVar(object, GCW_TOOL_TEMPLATE_OBJVAR))
{
return false;
}
desiredTemplate = getStringObjVar(object, GCW_TOOL_TEMPLATE_OBJVAR);
}
obj_id toolObject = utils.getItemByTemplateInInventoryOrEquipped(player, desiredTemplate);
if (!isValidId(toolObject) || !exists(toolObject))
{
return false;
}
gcwInvasionCreditForCrafting(player);
return decrementCount(toolObject);
}
public static int getGcwCityInvasionPhase(obj_id childObject) throws InterruptedException
{
if (!isValidId(childObject) || !exists(childObject))
{
return GCW_CITY_PHASE_UNKNOWN;
}
obj_id parent = trial.getParent(childObject);
if (!isValidId(parent))
{
return GCW_CITY_PHASE_UNKNOWN;
}
if (utils.hasScriptVar(parent, "gcw.constructionEnded"))
{
return GCW_CITY_PHASE_COMBAT;
}
if (utils.hasScriptVar(parent, "gcw.invasionRunning"))
{
return GCW_CITY_PHASE_CONSTRUCTION;
}
return GCW_CITY_PHASE_UNKNOWN;
}
public static boolean playerSystemMessageResourceNeeded(obj_id player, obj_id object, boolean construction) throws InterruptedException
{
if (!isValidId(player) || !exists(player))
{
return false;
}
if (!isValidId(object) || !exists(object))
{
return false;
}
if ((!hasObjVar(object, gcw.GCW_TOOL_TEMPLATE_OBJVAR) && !hasObjVar(object, gcw.GCW_DEF_TOOL_TEMPLATE_OBJVAR) && !hasObjVar(object, gcw.GCW_OFF_TOOL_TEMPLATE_OBJVAR)))
{
return false;
}
String toolTemplate = "";
if (hasObjVar(object, GCW_DEF_TOOL_TEMPLATE_OBJVAR) && hasObjVar(object, GCW_OFF_TOOL_TEMPLATE_OBJVAR))
{
if (hasObjVar(object, GCW_SPAWN_ID_OBJVAR) && getStringObjVar(object, GCW_SPAWN_ID_OBJVAR).equals(GCW_DEFENSE_PATROL_OBJVAR))
{
toolTemplate = getStringObjVar(object, gcw.GCW_DEF_TOOL_TEMPLATE_OBJVAR);
}
else if (hasObjVar(object, GCW_SPAWN_ID_OBJVAR) && getStringObjVar(object, GCW_SPAWN_ID_OBJVAR).equals(GCW_OFFENSE_PATROL_OBJVAR))
{
toolTemplate = getStringObjVar(object, gcw.GCW_OFF_TOOL_TEMPLATE_OBJVAR);
}
}
else
{
toolTemplate = getStringObjVar(object, gcw.GCW_TOOL_TEMPLATE_OBJVAR);
}
if (toolTemplate == null || toolTemplate.length() <= 0)
{
return false;
}
string_id objName = getNameFromTemplate(toolTemplate);
if (objName == null)
{
return false;
}
prose_package pp = new prose_package();
string_id msg = new string_id();
if (construction)
{
msg = SID_RESOURCES_NEEDED;
}
else
{
msg = SID_YOU_NEED_TOOL_REPAIR;
}
pp = prose.setStringId(pp, msg);
pp = prose.setTO(pp, objName);
sendSystemMessageProse(player, pp);
return true;
}
public static int getFatigueTimerMod(obj_id player) throws InterruptedException
{
int fatigueStack = (int)buff.getBuffStackCount(player, BUFF_PLAYER_FATIGUE);
int fatigueMod = 0;
if (fatigueStack > 0)
{
fatigueMod = fatigueStack / GCW_FATIGUE_DIVISOR;
}
return fatigueMod;
}
public static obj_id getInvasionSequencerNearby(obj_id target) throws InterruptedException
{
if (!isIdValid(target) || !exists(target))
{
return null;
}
obj_id keren = utils.stringToObjId(GCW_SEQUENCER_KEREN);
obj_id bestine = utils.stringToObjId(GCW_SEQUENCER_BESTINE);
obj_id dearic = utils.stringToObjId(GCW_SEQUENCER_DEARIC);
if (isIdValid(keren) && exists(keren))
{
return keren;
}
if (isIdValid(bestine) && exists(bestine))
{
return bestine;
}
if (isIdValid(dearic) && exists(dearic))
{
return dearic;
}
return null;
}
public static String getCityFromTable(obj_id self) throws InterruptedException
{
String cityName = "";
String datatable = getStringObjVar(self, "instance.data_table");
if (datatable == null || datatable.length() < 1)
{
return null;
}
if (datatable.equals(DEARIC_CITY_TABLE))
{
return CITY_DEARIC;
}
else if (datatable.equals(KEREN_CITY_TABLE))
{
return CITY_KEREN;
}
else if (datatable.equals(BESTINE_CITY_TABLE))
{
return CITY_BESTINE;
}
return null;
}
public static boolean awardGcwInvasionParticipants(Vector participantList, int factionFlag, int gcwTokenAmt, int gcwPointAmt) throws InterruptedException
{
if (participantList == null || participantList.size() <= 0)
{
CustomerServiceLog("gcw_city_invasion", "gcw.awardInvasionParticipants: participantList array invalid. Returning False.");
return false;
}
if (factionFlag != factions.FACTION_FLAG_REBEL && factionFlag != factions.FACTION_FLAG_IMPERIAL)
{
CustomerServiceLog("gcw_city_invasion", "gcw.awardInvasionParticipants: Faction Flag invalid. Returning False.");
return false;
}
if (gcwTokenAmt <= 0 && gcwPointAmt <= 0)
{
CustomerServiceLog("gcw_city_invasion", "gcw.awardInvasionParticipants: participantList awards were equal to or less than 0. Returning False.");
return false;
}
String tokenStaticName = "";
obj_id[] lootList = new obj_id[1];
if (factionFlag == factions.FACTION_FLAG_IMPERIAL)
{
tokenStaticName = "item_gcw_imperial_token";
}
else if (factionFlag == factions.FACTION_FLAG_REBEL)
{
tokenStaticName = "item_gcw_rebel_token";
}
for (int i = 0; i < participantList.size(); i++)
{
testAbortScript();
if (!isValidId(((obj_id)(participantList.get(i)))) || !exists(((obj_id)(participantList.get(i)))))
{
continue;
}
if (!isPlayerConnected(((obj_id)(participantList.get(i)))))
{
continue;
}
grantUnmodifiedGcwPoints(((obj_id)(participantList.get(i))), gcwPointAmt);
if (tokenStaticName == null || tokenStaticName.length() <= 0)
{
continue;
}
obj_id playerInv = getObjectInSlot(((obj_id)(participantList.get(i))), utils.SLOT_INVENTORY);
if (isValidId(playerInv))
{
obj_id lootCreated = static_item.createNewItemFunction(tokenStaticName, playerInv, gcwTokenAmt);
lootList[0] = lootCreated;
showLootBox(((obj_id)(participantList.get(i))), lootList);
}
}
return true;
}
public static boolean invasionIsValidAndEngaged() throws InterruptedException
{
obj_id self = getSelf();
if (!isIdValid(self) || !exists(self))
{
return false;
}
obj_id sequencer = getInvasionSequencerNearby(self);
if (!isIdValid(sequencer) || !exists(sequencer))
{
return false;
}
if (!utils.hasScriptVar(sequencer, "gcw.invasionRunning"))
{
return false;
}
return true;
}
public static void gcwSetCredits(obj_id who, int playerGCW, int playerPvpKills, int playerKills, int playerAssists, int playerCraftedItems, int playerDestroyedItems) throws InterruptedException
{
if (!isIdValid(who) || !exists(who) || !isPlayer(who))
{
return;
}
gcw_score.gcw_data currentData = gcw_score.getPlayerGcwData(who);
String playerName = getName(who);
String playerFaction = factions.getFaction(who);
String factionColor = "";
if (factions.getFactionFlag(who) == factions.FACTION_FLAG_REBEL)
{
factionColor = COLOR_REBELS;
}
else if (factions.getFactionFlag(who) == factions.FACTION_FLAG_IMPERIAL)
{
factionColor = COLOR_IMPERIALS;
}
if (playerFaction == null || playerFaction.length() <= 0)
{
if (factions.isRebelHelper(who))
{
factionColor = COLOR_REBELS;
playerFaction = "Rebel Helper";
}
else if (factions.isImperialHelper(who))
{
factionColor = COLOR_IMPERIALS;
playerFaction = "Imperial Helper";
}
else
{
return;
}
}
playerFaction = factionColor + playerFaction;
String playerProfession = "@ui_roadmap:"+ skill.getProfessionName(getSkillTemplate(who));
int playerLevel = getLevel(who);
if (currentData != null)
{
playerGCW = currentData.playerGCW + playerGCW;
playerPvpKills = currentData.playerPvpKills + playerPvpKills;
playerKills = currentData.playerKills + playerKills;
playerAssists = currentData.playerAssists + playerAssists;
playerCraftedItems = currentData.playerCraftedItems + playerCraftedItems;
playerDestroyedItems = currentData.playerDestroyedItems + playerDestroyedItems;
}
gcw_score.setPlayerGcwData(who, playerName, playerFaction, playerProfession, playerLevel, playerGCW, playerPvpKills, playerKills, playerAssists, playerCraftedItems, playerDestroyedItems);
}
public static void gcwInvasionCreditForGCW(obj_id who, int gcw) throws InterruptedException
{
if (!invasionIsValidAndEngaged())
{
return;
}
gcwSetCredits(who, gcw, 0, 0, 0, 0, 0);
}
public static void gcwInvasionCreditForPVPKill(obj_id who) throws InterruptedException
{
if (!invasionIsValidAndEngaged())
{
return;
}
gcwSetCredits(who, 0, 1, 0, 0, 0, 0);
}
public static void gcwInvasionCreditForKill(obj_id who) throws InterruptedException
{
if (!invasionIsValidAndEngaged())
{
return;
}
gcwSetCredits(who, 0, 0, 1, 0, 0, 0);
}
public static void gcwInvasionCreditForAssist(obj_id who) throws InterruptedException
{
if (!invasionIsValidAndEngaged())
{
return;
}
gcwSetCredits(who, 0, 0, 0, 1, 0, 0);
}
public static void gcwInvasionCreditForCrafting(obj_id who) throws InterruptedException
{
if (!invasionIsValidAndEngaged())
{
return;
}
gcwSetCredits(who, 0, 0, 0, 0, 1, 0);
}
public static void gcwInvasionCreditForDestroy(obj_id who) throws InterruptedException
{
if (!invasionIsValidAndEngaged())
{
return;
}
gcwSetCredits(who, 0, 0, 0, 0, 0, 1);
}
}