mirror of
https://github.com/SWG-Source/dsrc.git
synced 2026-07-13 22:01:04 -04:00
Refactors factional presence tracking from src to dsrc for more flexibility and hooking to GCW leaderboard for scaled scoring later Addresses a number of faction base and faction presence GU items Rescripted gmRevive to have more functionality Restore Planet Map Cats to final day
12289 lines
567 KiB
Java
Executable File
12289 lines
567 KiB
Java
Executable File
package script.player.base;
|
|
|
|
import script.*;
|
|
import script.library.*;
|
|
|
|
import java.util.Iterator;
|
|
import java.util.Set;
|
|
import java.util.Vector;
|
|
|
|
public class base_player extends script.base_script
|
|
{
|
|
public base_player()
|
|
{
|
|
}
|
|
public static final int TIME_DEATH = 5;
|
|
public static final float RANGE_COUP_DE_GRACE = 3.0f;
|
|
public static final String JEDI_CLOAK_TEMPLATE = "object/tangible/wearable/robe/robe_s05.iff";
|
|
public static final String MSG_REVIVE_TITLE = "@base_player:revive_title";
|
|
public static final String MSG_REVIVE_MSG = "@base_player:revive_msg";
|
|
public static final String MSG_REVIVE_CLOSEST_INSURED = "@base_player:revive_closest_insured";
|
|
public static final String MSG_REVIVE_CLOSEST_UNINSURED = "@base_player:revive_closest_uninsured";
|
|
public static final String MSG_REVIVE_BIND_INSURED = "@base_player:revive_bind_insured";
|
|
public static final String MSG_REVIVE_BIND_UNINSURED = "@base_player:revive_bind_uninsured";
|
|
public static final String MSG_REVIVE_CLOSEST = "@base_player:revive_closest";
|
|
public static final String MSG_REVIVE_BIND = "@base_player:revive_bind";
|
|
public static final string_id SID_VICTIM_INCAPACITATED = new string_id("base_player", "victim_incapacitated");
|
|
public static final string_id SID_KILLER_TARGET_INCAPACITATED = new string_id("base_player", "killer_target_incapacitated");
|
|
public static final string_id PROSE_VICTIM_INCAP = new string_id("base_player", "prose_victim_incap");
|
|
public static final string_id PROSE_TARGET_INCAP = new string_id("base_player", "prose_target_incap");
|
|
public static final string_id SID_COUP_DE_GRACE = new string_id("base_player", "death_blow");
|
|
public static final string_id SID_REVIVE = new string_id("base_player", "revive_player");
|
|
public static final string_id SID_RESUSCITATE = new string_id("base_player", "resuscitate_player");
|
|
public static final string_id SID_TARGET_OUT_OF_RANGE = new string_id("error_message", "target_out_of_range");
|
|
public static final string_id SID_TARGET_NOT_ATTACKABLE = new string_id("error_message", "target_not_attackable");
|
|
public static final string_id SID_SYNTAX_UNCONSENT = new string_id("error_message", "syntax_unconsent");
|
|
public static final string_id SID_CONSENT_TO_EMPTY = new string_id("error_message", "consent_to_empty");
|
|
public static final string_id SID_CONSENT_FROM_EMPTY = new string_id("error_message", "consent_from_empty");
|
|
public static final string_id SID_HAVE_CONSENT_TRUE = new string_id("base_player", "haveconsent_true");
|
|
public static final string_id SID_HAVE_CONSENT_FALSE = new string_id("base_player", "haveconsent_false");
|
|
public static final string_id SID_CONSENT_SUCCESSFUL = new string_id("base_player", "consent_successful");
|
|
public static final string_id SID_UNCONSENT_SUCCESSFUL = new string_id("base_player", "unconsent_successful");
|
|
public static final string_id SID_CONSENT_TO_LISTBOX_PROMPT = new string_id("base_player", "consent_to_listbox_prompt");
|
|
public static final string_id SID_CONSENT_TO_LISTBOX_TITLE = new string_id("base_player", "consent_to_listbox_title");
|
|
public static final string_id SID_CONSENT_FROM_LISTBOX_PROMPT = new string_id("base_player", "consent_from_listbox_prompt");
|
|
public static final string_id SID_CONSENT_FROM_LISTBOX_TITLE = new string_id("base_player", "consent_from_listbox_title");
|
|
public static final string_id SID_UNCONSENT_LISTBOX_PROMPT = new string_id("base_player", "unconsent_listbox_prompt");
|
|
public static final string_id SID_UNCONSENT_LISTBOX_TITLE = new string_id("base_player", "unconsent_listbox_title");
|
|
public static final string_id PROSE_GOT_CONSENT = new string_id("base_player", "prose_got_consent");
|
|
public static final string_id PROSE_LOST_CONSENT = new string_id("base_player", "prose_lost_consent");
|
|
public static final string_id SID_CORPSE_EXPIRED = new string_id("base_player", "corpse_expired");
|
|
public static final string_id SID_PERM_NO_MOVE = new string_id("error_message", "perm_no_move");
|
|
public static final string_id SID_CMD_OPEN_FAIL = new string_id("error_message", "prose_open_fail");
|
|
public static final string_id SID_CMD_NO_EFFECT = new string_id("error_message", "cmd_no_effect");
|
|
public static final string_id SID_CMD_NO_EFFECT_ON_TARGET = new string_id("error_message", "cmd_no_effect_on_target");
|
|
public static final string_id SID_NO_UNINSURED_INSURABLES = new string_id("error_message", "no_uninsured_insurables");
|
|
public static final string_id SID_BAD_INSURE_REQUEST = new string_id("error_message", "bad_insure_request");
|
|
public static final string_id SID_INSURE_FAIL = new string_id("error_message", "insure_fail");
|
|
public static final string_id PROSE_INSURE_FAIL = new string_id("error_message", "prose_insure_fail");
|
|
public static final string_id SID_CLONE_FAIL = new string_id("error_message", "clone_fail");
|
|
public static final string_id SID_CLONE_FAIL_SELECTION = new string_id("base_player", "clone_fail_no_selection");
|
|
public static final string_id SID_TARGET_MUST_BE_PLAYER = new string_id("error_message", "target_must_be_player");
|
|
public static final string_id SID_ERROR_INVITE_RANGE = new string_id("error_message", "error_invite_range");
|
|
public static final string_id PROSE_INVITE_RANGE = new string_id("error_message", "prose_invite_range");
|
|
public static final string_id SID_INSTANCE_REVIVE = new string_id("base_player", "instance_revive");
|
|
public static final string_id SID_INSTANCE_REVIVE_TITLE = new string_id("base_player", "instance_revive_title");
|
|
public static final String HANDLER_PLAYER_REVIVE = "handlePlayerRevive";
|
|
public static final String HANDLER_UNCONSENT_MENU = "handleUnconsentMenu";
|
|
public static final String HANDLER_CASH_LOOTED = "handleCashLooted";
|
|
public static final string_id PROSE_COIN_LOOT = new string_id("base_player", "prose_coin_loot");
|
|
public static final string_id PROSE_COIN_LOOT_NO_TARGET = new string_id("base_player", "prose_coin_loot_no_target");
|
|
public static final string_id PROSE_COIN_LOOT_FAILED = new string_id("error_message", "prose_coin_loot_fail");
|
|
public static final int LOGOUT_TIME = 30;
|
|
public static final int LOGOUT_COUNT_INTERVAL = 5;
|
|
public static final string_id SID_SYS_SCENTMASK_NOSKILL = new string_id("skl_use", "sys_scentmask_noskill");
|
|
public static final string_id SID_SYS_SCENTMASK_START = new string_id("skl_use", "sys_scentmask_start");
|
|
public static final string_id SID_SYS_SCENTMASK_STOP = new string_id("skl_use", "sys_scentmask_stop");
|
|
public static final string_id SID_SYS_SCENTMASK_FAIL = new string_id("skl_use", "sys_scentmask_fail");
|
|
public static final string_id SID_SYS_SCENTMASK_ALREADY = new string_id("skl_use", "sys_scentmask_already");
|
|
public static final string_id SID_SYS_SCENTMASK_DELAY = new string_id("skl_use", "sys_scentmask_delay");
|
|
public static final string_id SID_SYS_SCENTMASK_CONCEALED = new string_id("skl_use", "sys_scentmask_concealed");
|
|
public static final string_id SID_SYS_CONCEAL_NOSKILL = new string_id("skl_use", "sys_conceal_noskill");
|
|
public static final string_id SID_SYS_CONCEAL_START = new string_id("skl_use", "sys_conceal_start");
|
|
public static final string_id SID_SYS_CONCEAL_STOP = new string_id("skl_use", "sys_conceal_stop");
|
|
public static final string_id SID_SYS_CONCEAL_FAIL = new string_id("skl_use", "sys_conceal_fail");
|
|
public static final string_id SID_SYS_CONCEAL_CANT = new string_id("skl_use", "sys_conceal_cant");
|
|
public static final string_id SID_SYS_CONCEAL_NOTPLAYER = new string_id("skl_use", "sys_conceal_notplayer");
|
|
public static final string_id SID_SYS_TARGET_CONCEALED = new string_id("skl_use", "sys_target_concealed");
|
|
public static final string_id SID_SYS_CONCEAL_REMOVE = new string_id("skl_use", "sys_conceal_remove");
|
|
public static final string_id SID_SYS_CONCEAL_NOKIT = new string_id("skl_use", "sys_conceal_nokit");
|
|
public static final string_id SID_SYS_CONCEAL_SCENTMASKED = new string_id("skl_use", "sys_conceal_scentmasked");
|
|
public static final string_id SID_SYS_CONCEAL_APPLY = new string_id("skl_use", "sys_conceal_apply");
|
|
public static final string_id SID_SYS_CONCEAL_DELAY = new string_id("skl_use", "sys_conceal_delay");
|
|
public static final string_id SID_SYS_SCAN_NOTHING = new string_id("skl_use", "sys_scan_nothing");
|
|
public static final string_id SID_SYS_SCAN_BEGIN = new string_id("skl_use", "sys_scan_begin");
|
|
public static final string_id SID_SYS_SCAN_ALREADY = new string_id("skl_use", "sys_scan_already");
|
|
public static final string_id SID_SYS_SCAN_INSIDE = new string_id("skl_use", "sys_scan_inside");
|
|
public static final string_id SID_SYS_SCAN_MOVED = new string_id("skl_use", "sys_scan_moved");
|
|
public static final string_id SID_SYS_SCAN_COMBAT = new string_id("skl_use", "sys_scan_combat");
|
|
public static final string_id SID_SURVEY_WAYPOINT_NAME = new string_id("skl_use", "survey_waypoint_name");
|
|
public static final string_id SID_SURVEY_WAYPOINT = new string_id("survey", "survey_waypoint");
|
|
public static final string_id SID_SAMPLE_CANCEL = new string_id("survey", "sample_cancel");
|
|
public static final string_id SID_SAMPLE_CANCEL_ATTACK = new string_id("survey", "sample_cancel_attack");
|
|
public static final string_id SID_NODE_WAYPOINT = new string_id("survey", "node_waypoint");
|
|
public static final string_id SID_GAMBLE_NO_ACTION = new string_id("survey", "gamble_no_action");
|
|
public static final string_id SID_TRAP_CANCEL = new string_id("trap/trap", "sys_traplay_cancel");
|
|
public static final string_id SID_TRAP_CANCEL_ATTACK = new string_id("trap/trap", "sys_traplay_cancel_attack");
|
|
public static final string_id SID_TRAP_COUNT = new string_id("trap/trap", "sys_traplay_count");
|
|
public static final string_id SID_SYS_EJECT_REQUEST = new string_id("error_message", "sys_eject_request");
|
|
public static final string_id SID_SYS_EJECT_FAIL_MOVE = new string_id("error_message", "sys_eject_fail_move");
|
|
public static final string_id SID_SYS_EJECT_FAIL_CONTAINED = new string_id("error_message", "sys_eject_fail_contained");
|
|
public static final string_id SID_SYS_EJECT_FAIL_PROXIMITY = new string_id("error_message", "sys_eject_fail_proximity");
|
|
public static final string_id SID_SYS_EJECT_FAIL_GROUND = new string_id("error_message", "sys_eject_fail_ground");
|
|
public static final string_id SID_SYS_EJECT_SUCCESS = new string_id("error_message", "sys_eject_success");
|
|
public static final string_id SID_SYS_EJECT_DUNGEON = new string_id("error_messaage", "sys_eject_dungeon_pp");
|
|
public static final string_id SID_NOT_MILITIA = new string_id("city/city", "not_militia");
|
|
public static final string_id SID_CITY_WARNED = new string_id("city/city", "city_warned");
|
|
public static final string_id SID_CITY_WARN_DONE = new string_id("city/city", "city_warn_done");
|
|
public static final string_id SID_ALREADY_WARNED = new string_id("city/city", "already_warned");
|
|
public static final string_id SID_CITY_BANNED = new string_id("city/city", "city_banned");
|
|
public static final string_id SID_CITY_BAN_DONE = new string_id("city/city", "city_ban_done");
|
|
public static final string_id SID_CITY_PARDONED = new string_id("city/city", "city_pardoned");
|
|
public static final string_id SID_CITY_PARDON_DONE = new string_id("city/city", "city_pardon_done");
|
|
public static final string_id SID_LEAVE_CITY = new string_id("city/city", "city_leave_city");
|
|
public static final string_id SID_ENTER_CITY = new string_id("city/city", "city_enter_city");
|
|
public static final string_id SID_CITY_WARNING = new string_id("city/city", "city_warning");
|
|
public static final string_id SID_CITY_WARNING_TARGET = new string_id("city/city", "city_warning_target");
|
|
public static final string_id SID_NOT_CITIZEN_BAN = new string_id("city/city", "not_citizen_ban");
|
|
public static final string_id SID_NOT_CSR_BAN = new string_id("city/city", "not_csr_ban");
|
|
public static final string_id SID_CSR_BAN_ATTEMPT_MSG = new string_id("city/city", "csr_ban_attempt_msg");
|
|
public static final string_id SID_RIGHTS_GRANTED = new string_id("city/city", "rights_granted");
|
|
public static final string_id SID_GRANT_RIGHTS_FAIL = new string_id("city/city", "grant_rights_fail");
|
|
public static final string_id SID_RIGHTS_GRANTED_SELF = new string_id("city/city", "rights_granted_self");
|
|
public static final String CITY_MISSION_TERMINALS = "datatables/city/mission_terminals.iff";
|
|
public static final string_id SID_NO_MORE_MT = new string_id("city/city", "no_more_mt");
|
|
public static final String CITY_SKILL_TRAINERS = "datatables/city/skill_trainers.iff";
|
|
public static final string_id SID_NO_MORE_TRAINERS = new string_id("city/city", "no_more_trainers");
|
|
public static final string_id SID_CITY_NO_MONEY = new string_id("city/city", "action_no_money");
|
|
public static final string_id SID_NO_FACTIONAL = new string_id("city/city", "no_factional");
|
|
public static final string_id SID_RIGHTS_REVOKED = new string_id("city/city", "rights_revoked");
|
|
public static final string_id SID_RIGHTS_REVOKED_OTHER = new string_id("city/city", "rights_revoked_other");
|
|
public static final string_id SID_CIVIC_ONLY = new string_id("city/city", "civic_only");
|
|
public static final String[] ZONING_RIGHTS_ARRAY = new String[]
|
|
{
|
|
"@city/city:full_zoning_rights",
|
|
"@city/city:st_zoning_rights"
|
|
};
|
|
public static final string_id SID_ST_RIGHTS_GRANTED = new string_id("city/city", "st_rights_granted");
|
|
public static final string_id SID_ST_GRANT_RIGHTS_FAIL = new string_id("city/city", "st_grant_rights_fail");
|
|
public static final string_id SID_ST_RIGHTS_GRANTED_SELF = new string_id("city/city", "st_rights_granted_self");
|
|
public static final string_id SID_ST_RIGHTS_REVOKED = new string_id("city/city", "st_rights_revoked");
|
|
public static final string_id SID_ST_RIGHTS_REVOKED_OTHER = new string_id("city/city", "st_rights_revoked_other");
|
|
public static final string_id SID_NOT_IN_CITY_LIMITS = new string_id("city/city", "not_in_city_limits");
|
|
public static final String NOVICE_MARKSMAN = "combat_marksman_novice";
|
|
public static final String NOVICE_BRAWLER = "combat_brawler_novice";
|
|
public static final String NOVICE_MEDIC = "science_medic_novice";
|
|
public static final String NOVICE_ARTISAN = "crafting_artisan_novice";
|
|
public static final String NOVICE_ENTERTAINER = "social_entertainer_novice";
|
|
public static final String NOVICE_SCOUT = "outdoors_scout_novice";
|
|
public static final string_id SID_INVITE_TO_RIDE = new string_id("base_player", "invite_to_ride");
|
|
public static final string_id SID_CANNOT_OFFER_RIDE_TO = new string_id("base_player", "cannot_offer_ride_to");
|
|
public static final string_id SID_OFFER_RIDE_TO = new string_id("base_player", "offer_ride_to");
|
|
public static final string_id SID_UNABLE_TO_ACCEPT_RIDE = new string_id("base_player", "unable_to_accept_ride");
|
|
public static final string_id SID_ACCEPTED_RIDE = new string_id("base_player", "accepted_ride");
|
|
public static final string_id SID_DECLINED_RIDE = new string_id("base_player", "declined_ride");
|
|
public static final string_id SID_NO_ROOM_FOR_PASSENGER = new string_id("base_player", "no_room_for_passenger");
|
|
public static final string_id SID_SPICE_DOWNER_DURATION_REDUCED = new string_id("base_player", "spice_downer_duration_reduced");
|
|
public static final string_id SID_SPICE_DOWNER_DURATION_NEGATED = new string_id("base_player", "spice_downer_duration_negated");
|
|
public static final string_id SID_INCAPACITATION_DURATION_REDUCED = new string_id("base_player", "incapacitation_duration_reduced");
|
|
public static final String NEW_PLAYER_QUESTS_SCRIPT = "theme_park.new_player.new_player";
|
|
public static final String SPACE_CERTIFICATION = "private_cert_space";
|
|
public static final string_id SID_CAN_PLACE_ONE_BASE = new string_id("faction_perk", "faction_base_refunded_one");
|
|
public static final String COUPE_DE_GRACE_TARGET = "coupeDeGraceTarget";
|
|
public static final String[] ATTRIBUTES =
|
|
{
|
|
"HEALTH",
|
|
"CONSTITUTION",
|
|
"ACTION",
|
|
"STAMINA",
|
|
"MIND",
|
|
"WILLPOWER"
|
|
};
|
|
public static final int TRANSFER_SHIPS = 1;
|
|
public static final int TRANSFER_DROIDS = 1;
|
|
public static final string_id SID_CANT_MILK_MOUNTED = new string_id("skl_use", "milk_mounted");
|
|
public static final string_id SID_CANT_MILK = new string_id("skl_use", "milk_cant");
|
|
public static final string_id SID_CANT_MILK_COMBAT = new string_id("skl_use", "milk_combat");
|
|
public static final string_id SID_NO_MILK = new string_id("skl_use", "milk_none");
|
|
public static final string_id SID_NO_ALLOW_MILK = new string_id("skl_use", "milk_unmilkeable");
|
|
public static final string_id MILK_TOO_FAR_START = new string_id("skl_use", "milk_too_far_start");
|
|
public static final string_id MILK_NO_TARGET = new string_id("skl_use", "milk_no_target");
|
|
public static final String CTS_LOT_COUNT = "cts.lotcount";
|
|
public static final String PVP_SKILL_1 = "retaliation_ability";
|
|
public static final String PVP_SKILL_2 = "adrenaline_ability";
|
|
public static final String PVP_SKILL_3 = "unstoppable_ability";
|
|
public static final String PVP_SKILL_4 = "last_man_ability";
|
|
public static final String PVP_SKILL_5 = "aura_buff_self";
|
|
public static final String PVP_SKILL_6 = "airstrike_ability";
|
|
public static final string_id COVERCHARGE_DANCER_MESSAGE = new string_id("base_player", "covercharge_dancer_message");
|
|
public static final string_id SID_FOUND_NOTHING = new string_id("lair_n", "found_nothing");
|
|
public static final string_id TOO_FAR_FROM_LAIR = new string_id("lair_n", "too_far_from_lair");
|
|
public static final string_id LAIR_NOT_TARGETED = new string_id("lair_n", "lair_not_targeted");
|
|
public static final string_id SHAPECHANGE = new string_id("spam", "shapechange_combat");
|
|
public static final String[] WAYPOINT_GROUND_PLANETS_EXTERNAL =
|
|
{
|
|
"tatooine",
|
|
"naboo",
|
|
"corellia",
|
|
"rori",
|
|
"talus",
|
|
"yavin4",
|
|
"endor",
|
|
"lok",
|
|
"dantooine",
|
|
"dathomir",
|
|
"kachirho",
|
|
"etyyy",
|
|
"khowir",
|
|
"mustafar"
|
|
};
|
|
public static final String[] WAYPOINT_GROUND_PLANETS_INTERNAL =
|
|
{
|
|
"tatooine",
|
|
"naboo",
|
|
"corellia",
|
|
"rori",
|
|
"talus",
|
|
"yavin4",
|
|
"endor",
|
|
"lok",
|
|
"dantooine",
|
|
"dathomir",
|
|
"kashyyyk_main",
|
|
"kashyyyk_hunting",
|
|
"kashyyyk_dead_forest",
|
|
"mustafar"
|
|
};
|
|
public static final vector[] WAYPOINT_GROUND_PLANETS_BUILDOUT_COORDS =
|
|
{
|
|
null,
|
|
null,
|
|
null,
|
|
null,
|
|
null,
|
|
null,
|
|
null,
|
|
null,
|
|
null,
|
|
null,
|
|
new vector(0.0f, 0.0f, 0.0f),
|
|
new vector(0.0f, 0.0f, 0.0f),
|
|
new vector(0.0f, 0.0f, 0.0f),
|
|
new vector(-2304.0f, 0.0f, 2848.0f)
|
|
};
|
|
public static final String[] WAYPOINT_SPACE_ZONES_EXTERNAL =
|
|
{
|
|
"space_tatooine",
|
|
"space_naboo",
|
|
"space_corellia",
|
|
"space_deep",
|
|
"space_kessel",
|
|
"space_yavin4",
|
|
"space_endor",
|
|
"space_lok",
|
|
"space_dantooine",
|
|
"space_dathomir",
|
|
"space_kashyyyk",
|
|
"space_nova_orion"
|
|
};
|
|
public static final String[] WAYPOINT_SPACE_ZONES_INTERNAL =
|
|
{
|
|
"space_tatooine",
|
|
"space_naboo",
|
|
"space_corellia",
|
|
"space_heavy1",
|
|
"space_light1",
|
|
"space_yavin4",
|
|
"space_endor",
|
|
"space_lok",
|
|
"space_dantooine",
|
|
"space_dathomir",
|
|
"space_kashyyyk",
|
|
"space_nova_orion"
|
|
};
|
|
public static final boolean LOGGING_ON = true;
|
|
public static final String LOGNAME = "junk_log";
|
|
public static final int EXTRAORDINARY_WEALTH_LOGGING_THRESHOLD = 10000000;
|
|
public static final int PROFIT_LOGGING_THRESHOLD = 500000;
|
|
private static final boolean FORCE_SKIP_TUTORIAL = utils.checkConfigFlag("GameServer", "skipTutorial");
|
|
private static final boolean WALL_OF_MIST_DISABLED = utils.checkConfigFlag("GameServer", "fsWallOfMistDisabled");
|
|
private static final boolean VETERAN_REWARDS_ENABLED = utils.checkConfigFlag("GameServer", "enableVeteranRewards");
|
|
|
|
public int OnCustomizeFinished(obj_id self, obj_id object, String params) throws InterruptedException
|
|
{
|
|
if (utils.hasScriptVar(self, "armor_colorize.tool_oid") || utils.hasScriptVar(self, "structure_colorize.tool_oid"))
|
|
{
|
|
obj_id tool = obj_id.NULL_ID;
|
|
if (utils.hasScriptVar(self, "armor_colorize.tool_oid"))
|
|
{
|
|
tool = utils.getObjIdScriptVar(self, "armor_colorize.tool_oid");
|
|
}
|
|
else if (utils.hasScriptVar(self, "structure_colorize.tool_oid"))
|
|
{
|
|
tool = utils.getObjIdScriptVar(self, "structure_colorize.tool_oid");
|
|
}
|
|
if (!isValidId(tool) || !exists(tool))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
colorizeObject(self, object, tool, params);
|
|
}
|
|
if (utils.hasScriptVar(self, vendor_lib.GREETER_PLAYTERCOLOR_SCRVAR))
|
|
{
|
|
vendor_lib.colorizeGreeterFromWidget(self, object, params);
|
|
}
|
|
if (utils.hasScriptVar(self, "veteranRewardItemColor.color_setting"))
|
|
{
|
|
utils.colorizeItemFromWidget(self, object, params);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnEnteredCombat(obj_id self) throws InterruptedException
|
|
{
|
|
int shapechange = buff.getBuffOnTargetFromGroup(self, "shapechange");
|
|
if (shapechange != 0)
|
|
{
|
|
buff.removeBuff(self, shapechange);
|
|
sendSystemMessage(self, SHAPECHANGE);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnAttach(obj_id self) throws InterruptedException
|
|
{
|
|
final String[] NEWBIE_PROFICIENCIES =
|
|
{
|
|
"knife_stone",
|
|
"knife_survival",
|
|
"lance_staff_wood_s1",
|
|
"axe_heavy",
|
|
"rifle_cdef",
|
|
"pistol_cdef",
|
|
"carbine_cdef"
|
|
};
|
|
setObjVar(self, pclib.VAR_NEWBIE_DEATH, 1);
|
|
skill.setPlayerStatsForLevel(self, 1);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnSkillAboutToBeRevoked(obj_id self, String skill) throws InterruptedException
|
|
{
|
|
if ((toLower(skill)).startsWith("pilot"))
|
|
{
|
|
int godLevel = -1;
|
|
if (isGod(self))
|
|
{
|
|
godLevel = getGodLevel(self);
|
|
}
|
|
if (!utils.hasScriptVar(self, "revokePilotSkill") && (godLevel < 50))
|
|
{
|
|
space_skill.retireWarning(self, skill);
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnCombatLevelChanged(obj_id self, int oldCombatLevel, int newCombatLevel) throws InterruptedException
|
|
{
|
|
if (newCombatLevel <= 1 || oldCombatLevel >= newCombatLevel)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!utils.hasScriptVar(self, "respec.conceal"))
|
|
{
|
|
skill.doPlayerLeveling(self, oldCombatLevel, newCombatLevel);
|
|
}
|
|
else
|
|
{
|
|
skill.setPlayerStatsForLevel(self, newCombatLevel);
|
|
utils.removeScriptVar(self, "respec.conceal");
|
|
}
|
|
if ((utils.isProfession(self, utils.TRADER)) && (!hasSkill(self, "class_trader")))
|
|
{
|
|
grantSkill(self, "class_trader");
|
|
}
|
|
if ((!hasSkill(self, "expertise")) && (newCombatLevel == 10))
|
|
{
|
|
expertise.autoAllocateExpertiseByLevel(self, true);
|
|
}
|
|
recomputeCommandSeries(self);
|
|
grantLevelSpecificRewards(self, newCombatLevel);
|
|
skill.sendlevelUpStatChangeSystemMessages(self, oldCombatLevel, newCombatLevel);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public void grantLevelSpecificRewards(obj_id player, int newCombatLevel) throws InterruptedException{
|
|
if(!utils.checkConfigFlag("Custom", "grantLevelSpecificRewards")) return;
|
|
if(hasObjVar(player, "level.reward." + newCombatLevel)) return;
|
|
obj_id inv = utils.getInventoryContainer(player);
|
|
switch(newCombatLevel){
|
|
case 20:
|
|
// create the Level 20 reward Flash Speeder (stella)
|
|
createLevelReward("Flash Speeder deed", "object/tangible/deed/vehicle_deed/speederbike_flash_deed.iff", newCombatLevel, player);
|
|
break;
|
|
case 70:
|
|
createLevelReward("Lava Flea deed", "object/tangible/veteran_reward/mount_lava_flea.iff", newCombatLevel, player);
|
|
// create the Level 70 reward Lava Flea (stella)
|
|
break;
|
|
}
|
|
}
|
|
public void createLevelReward(String name, String template, int level, obj_id player) throws InterruptedException{
|
|
String playerName = getName(player);
|
|
obj_id reward = createObjectInInventoryAllowOverload(template, player);
|
|
if(isIdValid(reward)){
|
|
setObjVar(player, "level.reward." + level, true);
|
|
sendSystemMessage(player, "A " + name + " has been placed in your inventory.", null);
|
|
CustomerServiceLog("LevelItemRewards", "Player " + playerName + " (" + player + ") has been awarded the " + name + " for reaching Level " + level + ".");
|
|
}
|
|
else{
|
|
CustomerServiceLog("LevelItemRewards", "Unable to create " + name + " reward for Player " + playerName + " (" + player + ")");
|
|
}
|
|
}
|
|
public int updateGCWStanding(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int intScore = params.getInt("intScore");
|
|
gcw.checkAndUpdateGCWStanding(self, intScore);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnSkillRevoked(obj_id self, String strSkill) throws InterruptedException
|
|
{
|
|
if (strSkill.equals("pilot_rebel_navy_novice") || strSkill.equals("pilot_imperial_navy_novice") || strSkill.equals("pilot_neutral_novice"))
|
|
{
|
|
space_flags.clearSpaceTrack(self);
|
|
space_skill.revokeExperienceForRetire(self, strSkill);
|
|
if (space_quest.hasQuest(self))
|
|
{
|
|
obj_id datapad = utils.getPlayerDatapad(self);
|
|
if (isIdValid(datapad))
|
|
{
|
|
obj_id[] dpobjs = getContents(datapad);
|
|
for (obj_id dpobj : dpobjs) {
|
|
if (hasObjVar(dpobj, space_quest.QUEST_TYPE)) {
|
|
space_quest.setQuestAborted(self, dpobj);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
removeObjVar(self, "space_quest.series");
|
|
obj_var_list questList = getObjVarList(self, space_quest.QUEST_STATUS);
|
|
LOG("revoke", "QUESTLIST: QuestList " + questList);
|
|
if (questList != null)
|
|
{
|
|
int spaceQuests = questList.getNumItems();
|
|
for (int i = 0; i < spaceQuests; ++i)
|
|
{
|
|
obj_var spaceFields = questList.getObjVar(i);
|
|
String questType = spaceFields.getName();
|
|
obj_var_list typeList = questList.getObjVarList(questType);
|
|
int questCount = typeList.getNumItems();
|
|
for (int j = 0; j < questCount; j++)
|
|
{
|
|
obj_var quest = typeList.getObjVar(j);
|
|
String questName = quest.getName();
|
|
String spaceTable = "/datatables/spacequest/" + questType + "/" + questName + ".iff";
|
|
String questSeries = dataTableGetString(spaceTable, 0, "questSeries");
|
|
if (questSeries == null)
|
|
{
|
|
LOG("revoke_space_quest", "QUESTSERIES IS NULL IN DATATABLE: " + spaceTable);
|
|
continue;
|
|
}
|
|
if (!questSeries.equals("") && questSeries.equals("pilot_profession"))
|
|
{
|
|
space_quest.clearQuestFlags(self, questType, questName);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
utils.unequipAndNotifyUncerted(self);
|
|
if (strSkill.equals("outdoors_ranger_movement_03"))
|
|
{
|
|
if (hasSchematic(self, "object/draft_schematic/scout/item_camokit_kashyyyk.iff"))
|
|
{
|
|
revokeSchematic(self, "object/draft_schematic/scout/item_camokit_kashyyyk.iff");
|
|
}
|
|
}
|
|
if (strSkill.startsWith("expertise_"))
|
|
{
|
|
expertise.cacheExpertiseProcReacList(self);
|
|
armor.recalculateArmorForPlayer(self);
|
|
obj_id tempWeapon = getObjectInSlot(self, "hold_r");
|
|
if (isIdValid(tempWeapon))
|
|
{
|
|
weapons.adjustWeaponRangeForExpertise(self, tempWeapon, true);
|
|
}
|
|
skill.recalcPlayerPools(self, false);
|
|
}
|
|
trial.bumpSession(self, "displayDefensiveMods");
|
|
messageTo(self, "setDisplayOnlyDefensiveMods", trial.getSessionDict(self, "displayDefensiveMods"), 5, false);
|
|
recomputeCommandSeries(self);
|
|
beast_lib.verifyAndUpdateCalledBeastStats(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnInitialize(obj_id self) throws InterruptedException
|
|
{
|
|
if ((utils.isProfession(self, utils.TRADER)) && (!hasSkill(self, "class_trader")))
|
|
{
|
|
grantSkill(self, "class_trader");
|
|
}
|
|
if (!hasSkill(self, "expertise"))
|
|
{
|
|
expertise.autoAllocateExpertiseByLevel(self, false);
|
|
}
|
|
city.initCitizen(self);
|
|
respecNewEntertainerSkills(self);
|
|
respecNewCrafterSkills(self);
|
|
boolean setting = utils.checkConfigFlag("TestCenterPlayer", "ApplyTCMark");
|
|
if (setting)
|
|
{
|
|
setObjVar(self, "tcTester", 1);
|
|
}
|
|
if (getForcePower(self) > 0)
|
|
{
|
|
if (getJediState(self) == JEDI_STATE_NONE)
|
|
{
|
|
setJediState(self, JEDI_STATE_FORCE_SENSITIVE);
|
|
}
|
|
}
|
|
if (hasSkill(self, "jedi_padawan_novice"))
|
|
{
|
|
setSkillTemplate(self, "a");
|
|
attachScript(self, "player.player_jedi_conversion");
|
|
}
|
|
if (!isJedi(self))
|
|
{
|
|
if (hasObjVar(self, "jedi.postponeGrant"))
|
|
{
|
|
if (!jedi.postponeGrantJedi())
|
|
{
|
|
LOG("jedi", "MAKING " + self + " A JEDI FROM ON_INITIALIZE");
|
|
messageTo(self, "makeJedi", null, 0.1f, false);
|
|
}
|
|
}
|
|
else if (hasObjVar(self, "jedi.timeStamp"))
|
|
{
|
|
LOG("jedi", "MAKING " + self + " A JEDI FROM ON_INITIALIZE");
|
|
messageTo(self, "makeJedi", null, 0.1f, false);
|
|
}
|
|
}
|
|
skill.fixTerrainNegotiationMods(self);
|
|
if (isIdValid(getHouseId(self)))
|
|
{
|
|
skill.grantAllPoliticianSkills(self);
|
|
}
|
|
else
|
|
{
|
|
int currentCity = getCitizenOfCityId(self);
|
|
obj_id currentCityMayor = cityGetLeader(currentCity);
|
|
if (self == currentCityMayor)
|
|
{
|
|
skill.grantAllPoliticianSkills(self);
|
|
}
|
|
}
|
|
int vehicleBuff = buff.getBuffOnTargetFromGroup(self, "vehicle");
|
|
if (vehicleBuff != 0)
|
|
{
|
|
buff.removeBuff(self, vehicleBuff);
|
|
}
|
|
if (buff.hasBuff(self, "forceRun"))
|
|
{
|
|
buff.removeBuff(self, "forceRun");
|
|
}
|
|
if (buff.hasBuff(self, "forceRun_1"))
|
|
{
|
|
buff.removeBuff(self, "forceRun_1");
|
|
}
|
|
if (buff.hasBuff(self, "forceRun_2"))
|
|
{
|
|
buff.removeBuff(self, "forceRun_2");
|
|
}
|
|
jedi.jediSaberPearlRestore(self);
|
|
if (!hasSkill(self, "social_language_wookiee_comprehend"))
|
|
{
|
|
grantSkill(self, "social_language_wookiee_comprehend");
|
|
}
|
|
if (!group.isGrouped(self))
|
|
{
|
|
int[] buffList = buff.getGroupBuffEffects(self);
|
|
if (buffList != null && buffList.length > 0)
|
|
{
|
|
buff.removeGroupBuffEffect(self, buffList);
|
|
}
|
|
}
|
|
if (features.isSpaceEdition(self))
|
|
{
|
|
grantCommand(self, SPACE_CERTIFICATION);
|
|
}
|
|
else
|
|
{
|
|
revokeCommand(self, SPACE_CERTIFICATION);
|
|
}
|
|
removeObjVar(self, pclib.VAR_SAFE_LOGOUT);
|
|
recalculateLevel(self);
|
|
removeObjVar(self, "clickRespec");
|
|
removeObjVar(self, "npcRespec");
|
|
detachScript(self, group.SCRIPT_GROUP_MEMBER);
|
|
if (!hasScript(self, dot.SCRIPT_PLAYER_DOT))
|
|
{
|
|
setState(self, STATE_BLEEDING, false);
|
|
setState(self, STATE_POISONED, false);
|
|
setState(self, STATE_DISEASED, false);
|
|
setState(self, STATE_ON_FIRE, false);
|
|
}
|
|
if (buff.hasBuff(self, "healOverTime"))
|
|
{
|
|
buff.removeBuff(self, "healOverTime");
|
|
}
|
|
chat.resetTempAnimationMood(self);
|
|
if (hasObjVar(self, cloninglib.VAR_BIND_FACILITY_TEMPLATE))
|
|
{
|
|
obj_id facilityId = getObjIdObjVar(self, cloninglib.VAR_BIND_FACILITY);
|
|
dictionary data = new dictionary();
|
|
data.put("requester", self);
|
|
messageTo(facilityId, "requestCloningData", data, 0, false);
|
|
}
|
|
if (hasObjVar(self, "coa3"))
|
|
{
|
|
removeObjVar(self, "coa3");
|
|
}
|
|
utils.validatePlayerHairStyle(self);
|
|
badge.grantThemeParkBadges(self);
|
|
if (hasSchematic(self, getObjectTemplateCrc("object/draft_schematic/weapon/razor_knuckler.iff")))
|
|
{
|
|
temp_schematic.revoke(self, "object/draft_schematic/weapon/razor_knuckler.iff");
|
|
}
|
|
if (bounty_hunter.hasMaxBountyMissionsOnTarget(self))
|
|
{
|
|
messageTo(self, "handleBountyMissionTimeout", null, 30.0f, true);
|
|
}
|
|
int totalMoney = getTotalMoney(self);
|
|
utils.setScriptVar(self, "profit", totalMoney);
|
|
if (totalMoney > EXTRAORDINARY_WEALTH_LOGGING_THRESHOLD)
|
|
{
|
|
CustomerServiceLog("Wealth", "Extraordinary Wealth: " + getName(self) + " (" + self + ") logged in with " + totalMoney + " credits");
|
|
}
|
|
utils.unequipAndNotifyUncerted(self);
|
|
utils.checkInventoryForSnowflakeItemSwaps(self);
|
|
if (hasObjVar(self, "item_reimbursement_list"))
|
|
{
|
|
String[] strReimbursementList = getStringArrayObjVar(self, "item_reimbursement_list");
|
|
removeObjVar(self, "item_reimbursement_list");
|
|
for (String s1 : strReimbursementList) {
|
|
obj_id objTest = createObjectInInventoryAllowOverload(s1, self);
|
|
if (isIdValid(objTest)) {
|
|
if (armor.isArmorComponent(objTest)) {
|
|
if (!isGameObjectTypeOf(objTest, GOT_armor_foot) && !isGameObjectTypeOf(objTest, GOT_armor_hand)) {
|
|
final String[] ARMOR_SET =
|
|
{
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_imperial_s01_leggings.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_imperial_s01_helmet.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_imperial_s01_gloves.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_imperial_s01_chest_plate.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_imperial_s01_bracer_r.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_imperial_s01_bracer_l.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_imperial_s01_boots.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_imperial_s01_bicep_r.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_imperial_s01_bicep_l.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_imperial_s01_belt.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_rebel_s01_leggings.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_rebel_s01_helmet.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_rebel_s01_gloves.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_rebel_s01_chest_plate.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_rebel_s01_bracer_r.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_rebel_s01_bracer_l.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_rebel_s01_boots.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_rebel_s01_bicep_r.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_rebel_s01_bicep_l.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_rebel_s01_belt.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_neutral_s01_leggings.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_neutral_s01_helmet.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_neutral_s01_gloves.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_neutral_s01_chest_plate.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_neutral_s01_bracer_r.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_neutral_s01_bracer_l.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_neutral_s01_boots.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_neutral_s01_bicep_r.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_neutral_s01_bicep_l.iff",
|
|
"object/tangible/wearables/armor/clone_trooper/armor_clone_trooper_neutral_s01_belt.iff"
|
|
};
|
|
for (String s : ARMOR_SET) {
|
|
if (s1.equals(s)) {
|
|
armor.setArmorDataPercent(objTest, 2, 1, 0.94f, 0.95f);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
CustomerServiceLog("item_reimbursement", "Created item of type " + s1 + " and Id of " + objTest + " in the inventory of %TU", self);
|
|
} else {
|
|
CustomerServiceLog("item_reimbursement", "Failed to reimburse item of type " + s1 + " in the inventory of %TU", self);
|
|
}
|
|
}
|
|
}
|
|
int fatigue = getShockWound(self);
|
|
if (fatigue > 0)
|
|
{
|
|
setShockWound(self, 0);
|
|
}
|
|
obj_var_list buffList = getObjVarList(self, "clickItem");
|
|
if (buffList != null)
|
|
{
|
|
int count = buffList.getNumItems();
|
|
int curTime = getGameTime();
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
obj_var item = buffList.getObjVar(i);
|
|
int reuseTime = item.getIntData();
|
|
if (reuseTime < curTime)
|
|
{
|
|
String cooldownGroup = item.getName();
|
|
removeObjVar(self, "clickItem." + cooldownGroup);
|
|
}
|
|
}
|
|
}
|
|
if (!hasScript(self, "player.live_conversions"))
|
|
{
|
|
attachScript(self, "player.live_conversions");
|
|
}
|
|
if (!hasScript(self, "systems.skills.stealth.player_stealth"))
|
|
{
|
|
attachScript(self, "systems.skills.stealth.player_stealth");
|
|
}
|
|
skill_template.validateWorkingSkill(self);
|
|
skill.setPlayerStatsForLevel(self, getLevel(self));
|
|
LOG("base_player - OnInitialize", "calling armor.recalculateArmorForPlayer(self); with a 'self' of: " + self);
|
|
armor.recalculateArmorForPlayer(self);
|
|
obj_id objWeapon = getDefaultWeapon(self);
|
|
String strTemplate = getTemplateName(objWeapon);
|
|
if (isIdValid(objWeapon) && strTemplate.equals("object/weapon/melee/unarmed/unarmed_default_player.iff"))
|
|
{
|
|
if (!hasScript(objWeapon, "systems.combat.combat_weapon"))
|
|
{
|
|
attachScript(objWeapon, "systems.combat.combat_weapon");
|
|
messageTo(objWeapon, "weaponConversion", null, 2, false);
|
|
}
|
|
float fltWeaponSpeed = getWeaponAttackSpeed(objWeapon);
|
|
if (fltWeaponSpeed != 0.50f)
|
|
{
|
|
setWeaponAttackSpeed(objWeapon, 0.50f);
|
|
}
|
|
}
|
|
expertise.cacheExpertiseProcReacList(self);
|
|
proc.buildCurrentProcList(self);
|
|
proc.buildCurrentReacList(self);
|
|
givePublishGift(self);
|
|
sendSmugglerSystemBootstrap(self);
|
|
recomputeCommandSeries(self);
|
|
trial.bumpSession(self, "displayDefensiveMods");
|
|
messageTo(self, "setDisplayOnlyDefensiveMods", trial.getSessionDict(self, "displayDefensiveMods"), 5, false);
|
|
missions.initializeDailyOnLogin(self);
|
|
int lastDecayTime = getIntObjVar(self, "bounty.decayTime");
|
|
int currentTime = getCalendarTime();
|
|
if (lastDecayTime == 0)
|
|
{
|
|
setObjVar(self, "bounty.decayTime", currentTime);
|
|
}
|
|
else
|
|
{
|
|
int bounty = getIntObjVar(self, "bounty.amount");
|
|
if (currentTime - lastDecayTime > 604800)
|
|
{
|
|
setObjVar(self, "bounty.decayTime", currentTime);
|
|
if (bounty < 10000)
|
|
{
|
|
removeObjVar(self, "bounty.amount");
|
|
}
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleRetireWarning(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int btn = sui.getIntButtonPressed(params);
|
|
if (btn == sui.BP_CANCEL)
|
|
{
|
|
location loc = utils.getLocationScriptVar(self, "revokePilotSkillWarningLoc");
|
|
String wp_name = utils.getStringScriptVar(self, "revokePilotSkillWarningWpName");
|
|
if (loc == null)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id wp = createWaypointInDatapad(self, loc);
|
|
setWaypointName(wp, wp_name);
|
|
setWaypointColor(wp, "blue");
|
|
setWaypointActive(wp, true);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnPvpRankingChanged(obj_id self, int oldRank, int newRank) throws InterruptedException
|
|
{
|
|
String faction = "";
|
|
boolean isImperial = false;
|
|
if (factions.isImperial(self))
|
|
{
|
|
faction = "pvp_imperial_";
|
|
isImperial = true;
|
|
}
|
|
if (factions.isRebel(self))
|
|
{
|
|
faction = "pvp_rebel_";
|
|
}
|
|
if (faction.equals(""))
|
|
{
|
|
factions.removeAllPvpSkills(self);
|
|
CustomerServiceLog("pvp_rank_error", "Player %TU somehow changed PvP rank without being Rebel or Imperial, removing all PvP skills.", self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (oldRank <= 6 && newRank > 6)
|
|
{
|
|
skill.grantSkill(self, faction + PVP_SKILL_1);
|
|
if (isImperial)
|
|
{
|
|
badge.grantBadge(self, "pvp_imperial_lieutenant");
|
|
}
|
|
else
|
|
{
|
|
badge.grantBadge(self, "pvp_rebel_lieutenant");
|
|
}
|
|
}
|
|
if (oldRank <= 7 && newRank > 7)
|
|
{
|
|
skill.grantSkill(self, faction + PVP_SKILL_2);
|
|
if (isImperial)
|
|
{
|
|
badge.grantBadge(self, "pvp_imperial_captain");
|
|
}
|
|
else
|
|
{
|
|
badge.grantBadge(self, "pvp_rebel_captain");
|
|
}
|
|
}
|
|
if (oldRank <= 8 && newRank > 8)
|
|
{
|
|
skill.grantSkill(self, faction + PVP_SKILL_3);
|
|
if (isImperial)
|
|
{
|
|
badge.grantBadge(self, "pvp_imperial_major");
|
|
}
|
|
else
|
|
{
|
|
badge.grantBadge(self, "pvp_rebel_major");
|
|
}
|
|
}
|
|
if (oldRank <= 9 && newRank > 9)
|
|
{
|
|
skill.grantSkill(self, faction + PVP_SKILL_4);
|
|
if (isImperial)
|
|
{
|
|
badge.grantBadge(self, "pvp_imperial_lt_colonel");
|
|
}
|
|
else
|
|
{
|
|
badge.grantBadge(self, "pvp_rebel_commander");
|
|
}
|
|
}
|
|
if (oldRank <= 10 && newRank > 10)
|
|
{
|
|
skill.grantSkill(self, faction + PVP_SKILL_5);
|
|
if (isImperial)
|
|
{
|
|
badge.grantBadge(self, "pvp_imperial_colonel");
|
|
}
|
|
else
|
|
{
|
|
badge.grantBadge(self, "pvp_rebel_colonel");
|
|
}
|
|
}
|
|
if (oldRank <= 11 && newRank > 11)
|
|
{
|
|
skill.grantSkill(self, faction + PVP_SKILL_6);
|
|
if (isImperial)
|
|
{
|
|
badge.grantBadge(self, "pvp_imperial_general");
|
|
}
|
|
else
|
|
{
|
|
badge.grantBadge(self, "pvp_rebel_general");
|
|
}
|
|
}
|
|
if (oldRank == 12 && newRank <= 11)
|
|
{
|
|
skill.revokeSkill(self, faction + PVP_SKILL_6);
|
|
if (newRank == 10)
|
|
{
|
|
skill.revokeSkill(self, faction + PVP_SKILL_5);
|
|
}
|
|
if (newRank == 9)
|
|
{
|
|
skill.revokeSkill(self, faction + PVP_SKILL_4);
|
|
skill.revokeSkill(self, faction + PVP_SKILL_5);
|
|
}
|
|
if (newRank == 8)
|
|
{
|
|
skill.revokeSkill(self, faction + PVP_SKILL_3);
|
|
skill.revokeSkill(self, faction + PVP_SKILL_4);
|
|
skill.revokeSkill(self, faction + PVP_SKILL_5);
|
|
}
|
|
if (newRank == 7)
|
|
{
|
|
skill.revokeSkill(self, faction + PVP_SKILL_2);
|
|
skill.revokeSkill(self, faction + PVP_SKILL_3);
|
|
skill.revokeSkill(self, faction + PVP_SKILL_4);
|
|
skill.revokeSkill(self, faction + PVP_SKILL_5);
|
|
}
|
|
if (newRank < 7)
|
|
{
|
|
skill.revokeSkill(self, faction + PVP_SKILL_1);
|
|
skill.revokeSkill(self, faction + PVP_SKILL_2);
|
|
skill.revokeSkill(self, faction + PVP_SKILL_3);
|
|
skill.revokeSkill(self, faction + PVP_SKILL_4);
|
|
skill.revokeSkill(self, faction + PVP_SKILL_5);
|
|
}
|
|
}
|
|
if (oldRank == 11 && newRank <= 10)
|
|
{
|
|
skill.revokeSkill(self, faction + PVP_SKILL_5);
|
|
if (newRank == 9)
|
|
{
|
|
skill.revokeSkill(self, faction + PVP_SKILL_4);
|
|
}
|
|
if (newRank == 8)
|
|
{
|
|
skill.revokeSkill(self, faction + PVP_SKILL_3);
|
|
skill.revokeSkill(self, faction + PVP_SKILL_4);
|
|
}
|
|
if (newRank == 7)
|
|
{
|
|
skill.revokeSkill(self, faction + PVP_SKILL_2);
|
|
skill.revokeSkill(self, faction + PVP_SKILL_3);
|
|
skill.revokeSkill(self, faction + PVP_SKILL_4);
|
|
}
|
|
if (newRank < 7)
|
|
{
|
|
skill.revokeSkill(self, faction + PVP_SKILL_1);
|
|
skill.revokeSkill(self, faction + PVP_SKILL_2);
|
|
skill.revokeSkill(self, faction + PVP_SKILL_3);
|
|
skill.revokeSkill(self, faction + PVP_SKILL_4);
|
|
}
|
|
}
|
|
if (oldRank == 10 && newRank <= 9)
|
|
{
|
|
skill.revokeSkill(self, faction + PVP_SKILL_4);
|
|
if (newRank == 8)
|
|
{
|
|
skill.revokeSkill(self, faction + PVP_SKILL_3);
|
|
}
|
|
if (newRank == 7)
|
|
{
|
|
skill.revokeSkill(self, faction + PVP_SKILL_2);
|
|
skill.revokeSkill(self, faction + PVP_SKILL_3);
|
|
}
|
|
if (newRank < 7)
|
|
{
|
|
skill.revokeSkill(self, faction + PVP_SKILL_1);
|
|
skill.revokeSkill(self, faction + PVP_SKILL_2);
|
|
skill.revokeSkill(self, faction + PVP_SKILL_3);
|
|
}
|
|
}
|
|
if (oldRank == 9 && newRank <= 8)
|
|
{
|
|
skill.revokeSkill(self, faction + PVP_SKILL_3);
|
|
if (newRank == 7)
|
|
{
|
|
skill.revokeSkill(self, faction + PVP_SKILL_2);
|
|
}
|
|
if (newRank < 7)
|
|
{
|
|
skill.revokeSkill(self, faction + PVP_SKILL_1);
|
|
skill.revokeSkill(self, faction + PVP_SKILL_2);
|
|
}
|
|
}
|
|
if (oldRank == 8 && newRank <= 7)
|
|
{
|
|
skill.revokeSkill(self, faction + PVP_SKILL_2);
|
|
if (newRank < 7)
|
|
{
|
|
skill.revokeSkill(self, faction + PVP_SKILL_1);
|
|
}
|
|
}
|
|
if (oldRank == 7 && newRank < 7)
|
|
{
|
|
skill.revokeSkill(self, faction + PVP_SKILL_1);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnEnvironmentalDeath(obj_id self) throws InterruptedException
|
|
{
|
|
if (!hasObjVar(self, pclib.VAR_BEEN_COUPDEGRACED))
|
|
{
|
|
setObjVar(self, pclib.VAR_DEATHBLOW_KILLER, self);
|
|
setObjVar(self, pclib.VAR_DEATHBLOW_STAMP, getGameTime());
|
|
}
|
|
messageTo(self, pclib.HANDLER_PLAYER_DEATH, null, 0, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnAboutToBeIncapacitated(obj_id self, obj_id killer) throws InterruptedException
|
|
{
|
|
if (performCriticalHeal(self))
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnIncapacitated(obj_id self, obj_id killer) throws InterruptedException
|
|
{
|
|
utils.setScriptVar(self, "lastKiller", killer);
|
|
if (hasScript(killer, "ai.smuggler_spawn_enemy"))
|
|
{
|
|
int exceptionSmuggler = 0;
|
|
if (hasObjVar(self, "quest.owner"))
|
|
{
|
|
obj_id smuggler = (getObjIdObjVar(self, "quest.owner"));
|
|
if (self != smuggler)
|
|
{
|
|
exceptionSmuggler = 1;
|
|
}
|
|
}
|
|
if (exceptionSmuggler == 0)
|
|
{
|
|
groundquests.sendSignal(self, "smugglerEnemyIncap");
|
|
messageTo(killer, "smugglerKilled", null, 1.0f, false);
|
|
}
|
|
}
|
|
if (callable.hasAnyCallable(self))
|
|
{
|
|
obj_id objCallable = callable.getCallable(self, callable.CALLABLE_TYPE_RIDEABLE);
|
|
if (exists(objCallable) && isIdValid(objCallable))
|
|
{
|
|
callable.storeCallable(self, objCallable);
|
|
}
|
|
}
|
|
int vehicleBuff = buff.getBuffOnTargetFromGroup(self, "vehicle");
|
|
if (vehicleBuff != 0)
|
|
{
|
|
buff.removeBuff(self, vehicleBuff);
|
|
}
|
|
if (buff.hasBuff(self, "incapWeaken"))
|
|
{
|
|
pclib.killPlayer(self, killer, true);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
else
|
|
{
|
|
buff.applyBuff(self, "incapWeaken");
|
|
}
|
|
int recapacitateTimer = 10;
|
|
float recapacitateModified = getEnhancedSkillStatisticModifierUncapped(self, "resistance_incapacitation");
|
|
if (recapacitateModified > 0)
|
|
{
|
|
recapacitateTimer -= recapacitateModified;
|
|
if (recapacitateTimer <= 2)
|
|
{
|
|
recapacitateTimer = 2;
|
|
}
|
|
sendSystemMessage(self, SID_INCAPACITATION_DURATION_REDUCED);
|
|
}
|
|
CustomerServiceLog("player_death", "Player %TU is incapacitated by %TT", self, killer);
|
|
if (!isIdValid(killer))
|
|
{
|
|
killer = self;
|
|
}
|
|
if (killer == self)
|
|
{
|
|
sendSystemMessage(self, SID_VICTIM_INCAPACITATED);
|
|
}
|
|
else
|
|
{
|
|
prose_package ppToVictim = prose.getPackage(PROSE_VICTIM_INCAP, killer);
|
|
sendSystemMessageProse(self, ppToVictim);
|
|
}
|
|
if (killer != self)
|
|
{
|
|
prose_package ppToKiller = prose.getPackage(PROSE_TARGET_INCAP, self);
|
|
sendSystemMessageProse(killer, ppToKiller);
|
|
}
|
|
utils.removeScriptVar(self, COUPE_DE_GRACE_TARGET);
|
|
utils.setScriptVar(self, "incap.timeStamp", (getGameTime() + recapacitateTimer));
|
|
setCount(self, recapacitateTimer);
|
|
setHealth(self, 0);
|
|
combat.doCombatDebuffs(self);
|
|
messageTo(self, "recapacitationDelay", null, recapacitateTimer, false);
|
|
clearAllAiEnemyFlags(self);
|
|
dot.removeAllDots(self);
|
|
if (stealth.hasInvisibleBuff(self))
|
|
{
|
|
stealth.checkForAndMakeVisible(self);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public void clearAllAiEnemyFlags(obj_id self) throws InterruptedException
|
|
{
|
|
obj_id allEnemies[] = pvpGetPersonalEnemyIds(self);
|
|
if (allEnemies == null)
|
|
{
|
|
return;
|
|
}
|
|
for (obj_id allEnemy : allEnemies) {
|
|
if (isIdValid(allEnemy) && allEnemy.isLoaded() && (!isPlayer(allEnemy))) {
|
|
pvpRemoveTempEnemyFlags(self, allEnemy);
|
|
pvpRemoveTempEnemyFlags(allEnemy, self);
|
|
}
|
|
}
|
|
}
|
|
public int recapacitationDelay(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (getPosture(self) != POSTURE_INCAPACITATED)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!combat.clearCombatDebuffs(self))
|
|
{
|
|
messageTo(self, "recapacitationDelay", null, 1, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
setHealth(self, 1);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int requestMissionLocations(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id groupObject = getGroupObject(self);
|
|
if ((isIdValid(groupObject)) && (params != null) && (params.containsKey("requestMissionLocationsNumber")))
|
|
{
|
|
obj_id[] missions = getMissionObjects(self);
|
|
Vector missionLocation = new Vector();
|
|
missionLocation.setSize(0);
|
|
if ((missions != null) && (missions.length > 0))
|
|
{
|
|
int missionIndex = 0;
|
|
for (missionIndex = 0; missionIndex < missions.length; ++missionIndex)
|
|
{
|
|
if (isIdValid(missions[missionIndex]))
|
|
{
|
|
if (getMissionStatus(missions[missionIndex]) > 0)
|
|
{
|
|
utils.addElement(missionLocation, getMissionStartLocation(missions[missionIndex]));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
dictionary response = new dictionary();
|
|
response.put("requestMissionLocationsNumber", params.getInt("requestMissionLocationsNumber"));
|
|
response.put("sender", self);
|
|
response.put("senderLocation", getLocation(self));
|
|
if (missionLocation.size() > 0)
|
|
{
|
|
response.put("missionLocation", missionLocation);
|
|
}
|
|
messageTo(groupObject, "missionLocationResponse", response, 0, false);
|
|
}
|
|
group.destroyGroupWaypoint(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnAddedToGroup(obj_id self, obj_id groupId) throws InterruptedException
|
|
{
|
|
if (!hasScript(self, group.SCRIPT_GROUP_MEMBER))
|
|
{
|
|
attachScript(self, group.SCRIPT_GROUP_MEMBER);
|
|
}
|
|
if (beast_lib.getBeastOnPlayer(self) != null)
|
|
{
|
|
obj_id beast = beast_lib.getBeastOnPlayer(self);
|
|
obj_id beastBCD = beast_lib.getBeastBCD(beast);
|
|
messageTo(beastBCD, "ownerGrouped", null, 1, false);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnRemovedFromGroup(obj_id self, obj_id groupId) throws InterruptedException
|
|
{
|
|
if (utils.hasScriptVar(self, "currentHolo"))
|
|
{
|
|
performance.holographicCleanup(self);
|
|
}
|
|
squad_leader.clearRallyPoint(self);
|
|
detachScript(self, group.SCRIPT_GROUP_MEMBER);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnGroupLeaderChanged(obj_id self, obj_id groupId, obj_id newLeader, obj_id oldLeader) throws InterruptedException
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnGroupDisbanded(obj_id self, obj_id group) throws InterruptedException
|
|
{
|
|
squad_leader.clearRallyPoint(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnObjectMenuRequest(obj_id self, obj_id player, menu_info mi) throws InterruptedException
|
|
{
|
|
removeObjVar(self, "noTrade");
|
|
menu_info_data mid = mi.getMenuItemByType(menu_info_types.COMBAT_DEATH_BLOW);
|
|
if (mid == null)
|
|
{
|
|
int myPosture = getPosture(self);
|
|
if (myPosture == POSTURE_INCAPACITATED)
|
|
{
|
|
if (pvpCanAttack(player, self))
|
|
{
|
|
mi.addRootMenu(menu_info_types.COMBAT_DEATH_BLOW, new string_id("", ""));
|
|
}
|
|
}
|
|
else if (myPosture == POSTURE_DEAD)
|
|
{
|
|
if ((group.inSameGroup(self, player) || pclib.hasConsent(player, self)))
|
|
{
|
|
if (hasCommand(player, "revivePlayer"))
|
|
{
|
|
int reviveRoot = mi.addRootMenu(menu_info_types.SERVER_MENU1, SID_REVIVE);
|
|
if (hasCommand(player, "resuscitatePlayer"))
|
|
{
|
|
mi.addSubMenu(reviveRoot, menu_info_types.SERVER_MENU9, SID_RESUSCITATE);
|
|
}
|
|
}
|
|
else if (hasCommand(player, "resuscitatePlayer"))
|
|
{
|
|
mi.addRootMenu(menu_info_types.SERVER_MENU9, SID_RESUSCITATE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
mid.setServerNotify(true);
|
|
}
|
|
|
|
{
|
|
obj_id listenTarget = getPerformanceListenTarget(player);
|
|
if (isIdValid(listenTarget) && group.inSameGroup(listenTarget, self))
|
|
{
|
|
mi.addRootMenu(menu_info_types.SERVER_PERFORMANCE_LISTEN_STOP, performance.SID_RADIAL_PERFORMANCE_LISTEN_STOP);
|
|
}
|
|
if (hasScript(self, performance.MUSIC_HEARTBEAT_SCRIPT) && (!isIdValid(listenTarget) || !group.inSameGroup(self, listenTarget)))
|
|
{
|
|
mi.addRootMenu(menu_info_types.SERVER_PERFORMANCE_LISTEN, performance.SID_RADIAL_PERFORMANCE_LISTEN);
|
|
}
|
|
obj_id watchTarget = getPerformanceWatchTarget(player);
|
|
if (watchTarget == self)
|
|
{
|
|
mi.addRootMenu(menu_info_types.SERVER_PERFORMANCE_WATCH_STOP, performance.SID_RADIAL_PERFORMANCE_WATCH_STOP);
|
|
}
|
|
else
|
|
{
|
|
if (hasScript(self, performance.DANCE_HEARTBEAT_SCRIPT))
|
|
{
|
|
mi.addRootMenu(menu_info_types.SERVER_PERFORMANCE_WATCH, performance.SID_RADIAL_PERFORMANCE_WATCH);
|
|
}
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnObjectMenuSelect(obj_id self, obj_id player, int item) throws InterruptedException
|
|
{
|
|
if (item == menu_info_types.COMBAT_DEATH_BLOW)
|
|
{
|
|
}
|
|
else if (item == menu_info_types.SERVER_MENU9)
|
|
{
|
|
queueCommand(player, (-1360827551), self, "", COMMAND_PRIORITY_DEFAULT);
|
|
}
|
|
else if (item == menu_info_types.SERVER_MENU1)
|
|
{
|
|
queueCommand(player, (-915040138), self, "", COMMAND_PRIORITY_DEFAULT);
|
|
}
|
|
else if (item == menu_info_types.SERVER_PERFORMANCE_LISTEN)
|
|
{
|
|
dictionary params = new dictionary();
|
|
params.put("target", self);
|
|
messageTo(player, "handleListenRadialCmd", params, 0, false);
|
|
sendDirtyObjectMenuNotification(self);
|
|
}
|
|
else if (item == menu_info_types.SERVER_PERFORMANCE_WATCH)
|
|
{
|
|
dictionary params = new dictionary();
|
|
params.put("target", self);
|
|
messageTo(player, "handleWatchRadialCmd", params, 0, false);
|
|
sendDirtyObjectMenuNotification(self);
|
|
}
|
|
else if (item == menu_info_types.SERVER_PERFORMANCE_LISTEN_STOP)
|
|
{
|
|
dictionary params = new dictionary();
|
|
messageTo(player, "handleListenRadialCmd", params, 0, false);
|
|
sendDirtyObjectMenuNotification(self);
|
|
}
|
|
else if (item == menu_info_types.SERVER_PERFORMANCE_WATCH_STOP)
|
|
{
|
|
dictionary params = new dictionary();
|
|
messageTo(player, "handleWatchRadialCmd", params, 0, false);
|
|
sendDirtyObjectMenuNotification(self);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnMadeAuthoritative(obj_id self) throws InterruptedException
|
|
{
|
|
if (FORCE_SKIP_TUTORIAL)
|
|
{
|
|
setObjVar(self, "skipTutorial", 1);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnLogin(obj_id self) throws InterruptedException
|
|
{
|
|
boolean ctsDisconnectRequested = false;
|
|
if (hasObjVar(self, "disableLoginCtsInProgress"))
|
|
{
|
|
int timeOut = getIntObjVar(self, "disableLoginCtsInProgress");
|
|
if (timeOut > getGameTime())
|
|
{
|
|
ctsDisconnectRequested = true;
|
|
messageTo(self, "disconnectPlayerCtsCompletedOrInProgress", null, 0.1f, false);
|
|
CustomerServiceLog("Login", "dropping character (" + self + ": " + getName(self) + ") because of CTS completed or in progress");
|
|
}
|
|
else
|
|
{
|
|
removeObjVar(self, "disableLoginCtsInProgress");
|
|
}
|
|
}
|
|
if (!ctsDisconnectRequested && hasObjVar(self, "disableLoginCtsCompleted") && !isUsingAdminLogin(self))
|
|
{
|
|
ctsDisconnectRequested = true;
|
|
messageTo(self, "disconnectPlayerCtsCompletedOrInProgress", null, 0.1f, false);
|
|
CustomerServiceLog("Login", "dropping character (" + self + ": " + getName(self) + ") because of CTS completed or in progress");
|
|
}
|
|
if (!utils.hasScriptVar(self, "galaxyMessage.showmessage"))
|
|
{
|
|
obj_id planetId = getPlanetByName("tatooine");
|
|
if (!isIdNull(planetId))
|
|
{
|
|
utils.setScriptVar(self, "galaxyMessage.showmessage", true);
|
|
if (hasObjVar(planetId, "galaxyMessage"))
|
|
{
|
|
String strGalaxyMessage = "\\#FF0000" + utils.getStringObjVar(planetId, "galaxyMessage") + "\\#FFFFFF";
|
|
sendConsoleMessage(self, strGalaxyMessage);
|
|
}
|
|
else
|
|
{
|
|
String strGalaxyMessage = "\\#FF0000" + "Welcome to Star Wars Galaxies" + "\\#FFFFFF";
|
|
sendConsoleMessage(self, strGalaxyMessage);
|
|
}
|
|
boolean warden = isWarden(self);
|
|
if (warden || (getGodLevel(self) >= 10))
|
|
{
|
|
String strGalaxyMessage = "\\#FF0000";
|
|
if (!warden)
|
|
{
|
|
strGalaxyMessage += "Displaying warden MOTD to you even though you are not a warden, because you are of the appropriate god level:\n";
|
|
}
|
|
if (hasObjVar(planetId, "galaxyWardenMessage"))
|
|
{
|
|
strGalaxyMessage += utils.getStringObjVar(planetId, "galaxyWardenMessage");
|
|
}
|
|
else
|
|
{
|
|
strGalaxyMessage += "Welcome warden";
|
|
}
|
|
strGalaxyMessage += "\\#FFFFFF";
|
|
sendConsoleMessage(self, strGalaxyMessage);
|
|
}
|
|
}
|
|
}
|
|
removeObjVar(self, "noTrade");
|
|
if (hasObjVar(self, "comingFromTutorial"))
|
|
{
|
|
removeObjVar(self, "comingFromTutorial");
|
|
attachScript(self, "theme_park.newbie_tutorial.new_player_ribbon");
|
|
}
|
|
if (!hasObjVar(self, "combatLevel") && hasObjVar(self, "clickRespec.combatLevel"))
|
|
{
|
|
setObjVar(self, "combatLevel", getIntObjVar(self, "clickRespec.combatLevel"));
|
|
removeObjVar(self, "clickRespec.combatLevel");
|
|
}
|
|
obj_id bldg = getTopMostContainer(self);
|
|
if (isIdValid(bldg))
|
|
{
|
|
dictionary parms = new dictionary();
|
|
parms.put("player", self);
|
|
messageTo(bldg, "handlePlayerLogin", parms, 0, false);
|
|
String bldgName = getTemplateName(bldg);
|
|
if (bldgName.equals("object/building/general/bunker_allum_mine.iff"))
|
|
{
|
|
if (!events.isEventActive(events.DEATH_WATCH))
|
|
{
|
|
CustomerServiceLog("DUNGEON_DeathWatchBunker", "*Death Watch Unauthorized Entry: %TU entered the death watch bunker while it was turned off.", self);
|
|
}
|
|
}
|
|
if (hasObjVar(bldg, "player_structure.condemned"))
|
|
{
|
|
player_structure.doCondemnedSui(bldg, self);
|
|
expelFromBuilding(self);
|
|
}
|
|
}
|
|
chatEnterRoom("SWG.system");
|
|
chatEnterRoom("SWG." + getGalaxyName() + ".system");
|
|
chatEnterRoom("SWG." + getGalaxyName() + "." + getCurrentSceneName() + ".system");
|
|
float curScale = getScale(self);
|
|
int gender = getGender(self);
|
|
int intSpecies = getSpecies(self);
|
|
String species = utils.getPlayerSpeciesName(intSpecies);
|
|
float min = 1.0f;
|
|
float max = 1.0f;
|
|
if (gender == GENDER_MALE)
|
|
{
|
|
min = dataTableGetFloat("datatables/player/racial_scale.iff", species, "MALE_MIN");
|
|
max = dataTableGetFloat("datatables/player/racial_scale.iff", species, "MALE_MAX");
|
|
}
|
|
else
|
|
{
|
|
min = dataTableGetFloat("datatables/player/racial_scale.iff", species, "FEMALE_MIN");
|
|
max = dataTableGetFloat("datatables/player/racial_scale.iff", species, "FEMALE_MAX");
|
|
}
|
|
if (min > 0 && max > 0)
|
|
{
|
|
if (curScale < min)
|
|
{
|
|
setScale(self, min);
|
|
}
|
|
else if (curScale > max)
|
|
{
|
|
setScale(self, max);
|
|
}
|
|
}
|
|
if (getState(self, STATE_MASK_SCENT) == 1)
|
|
{
|
|
if (utils.hasScriptVar(self, "scentmask.camokit"))
|
|
{
|
|
String kitPlanet = utils.getStringScriptVar(self, "scentmask.camokit");
|
|
String planetName = getCurrentSceneName();
|
|
if (planetName.startsWith("kashyyyk"))
|
|
{
|
|
planetName = "kashyyyk";
|
|
}
|
|
if (!kitPlanet.equals(planetName))
|
|
{
|
|
messageTo(self, "removeScentMaskNoNotify", null, 0, false);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
messageTo(self, "removeScentMaskNoNotify", null, 0, false);
|
|
}
|
|
}
|
|
if (hasSkill(self, "demo_combat"))
|
|
{
|
|
revokeSkill(self, "demo_combat");
|
|
}
|
|
boolean needsPrerequisites = true;
|
|
int attempts = 0;
|
|
while (needsPrerequisites && attempts < 100)
|
|
{
|
|
++attempts;
|
|
needsPrerequisites = false;
|
|
String[] skillList = getSkillListingForPlayer(self);
|
|
if (skillList != null)
|
|
{
|
|
int i = 0;
|
|
for (i = 0; i < skillList.length; ++i)
|
|
{
|
|
String[] prereqs = getSkillPrerequisiteSkills(skillList[i]);
|
|
if (prereqs != null)
|
|
{
|
|
int j = 0;
|
|
for (j = 0; j < prereqs.length; ++j)
|
|
{
|
|
if (!hasSkill(self, prereqs[j]))
|
|
{
|
|
grantSkill(self, prereqs[j]);
|
|
needsPrerequisites = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (hasObjVar(self, player_structure.VAR_RESIDENCE_BUILDING))
|
|
{
|
|
setHouseId(self, getObjIdObjVar(self, player_structure.VAR_RESIDENCE_BUILDING));
|
|
removeObjVar(self, player_structure.VAR_RESIDENCE_BUILDING);
|
|
}
|
|
slicing.clearSlicing(self);
|
|
hq.ejectEnemyFactionOnLogin(self);
|
|
if (!isIdValid(getGroupObject(self)))
|
|
{
|
|
obj_id groupWaypoint = getObjIdObjVar(self, "groupWaypoint");
|
|
if (isIdValid(groupWaypoint))
|
|
{
|
|
destroyWaypointInDatapad(groupWaypoint, self);
|
|
removeObjVar(self, "groupWaypoint");
|
|
}
|
|
}
|
|
veteran_deprecated.updateVeteranTime(self);
|
|
if (hasObjVar(self, "renamePerformed"))
|
|
{
|
|
String old_name = getStringObjVar(self, "renamePerformed");
|
|
removeObjVar(self, "renamePerformed");
|
|
if (old_name != null)
|
|
{
|
|
if (force_rank.isForceRanked(self))
|
|
{
|
|
force_rank.renameRankMember(self, old_name);
|
|
}
|
|
}
|
|
}
|
|
meditation.endMeditation(self, false);
|
|
if (isIdValid(getGroupObject(self)) && (!hasScript(self, group.SCRIPT_GROUP_MEMBER)))
|
|
{
|
|
attachScript(self, group.SCRIPT_GROUP_MEMBER);
|
|
}
|
|
utils.removeScriptVar(self, COUPE_DE_GRACE_TARGET);
|
|
if(!isInTutorialArea(self)) {
|
|
if(!isGod(self) && hasObjVar(self, "npe") && isInWorldCell(self)) {
|
|
getClusterWideData("npe_public_instances", "npe_space_station*", false, self);
|
|
} else {
|
|
space_dungeon.verifyPlayerSession(self);
|
|
space_dungeon.validateInstanceControllerId(self);
|
|
}
|
|
}
|
|
int campXp = getExperiencePoints(self, "camp");
|
|
if (campXp > 0)
|
|
{
|
|
grantExperiencePoints(self, "scout", campXp);
|
|
grantExperiencePoints(self, "camp", 0 - campXp);
|
|
}
|
|
if (!utils.hasScriptVar(self, "bountyConsistencyCheck"))
|
|
{
|
|
Vector playerBountyMissionTargetId = new Vector();
|
|
playerBountyMissionTargetId.setSize(0);
|
|
obj_id[] objMissions = getMissionObjects(self);
|
|
if (objMissions != null)
|
|
{
|
|
for (obj_id objMission : objMissions) {
|
|
String missionType = getMissionType(objMission);
|
|
if (missionType.equals("bounty")) {
|
|
if (hasObjVar(objMission, "objTarget")) {
|
|
playerBountyMissionTargetId = utils.addElement(playerBountyMissionTargetId, getObjIdObjVar(objMission, "objTarget"));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
obj_id[] bounties = getBountyHunterBounties(self);
|
|
if (bounties == null)
|
|
{
|
|
bounties = new obj_id[0];
|
|
}
|
|
boolean foundMatch = false;
|
|
for (Object o1 : playerBountyMissionTargetId) {
|
|
foundMatch = false;
|
|
for (obj_id bounty : bounties) {
|
|
if (((obj_id) o1) == bounty) {
|
|
foundMatch = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!foundMatch) {
|
|
CustomerServiceLog("bounty_inconsistency", self + " (" + getName(self) + ") has a bounty mission for " + ((obj_id) o1) + " (" + getPlayerName(((obj_id) o1)) + ") but doesn't have a corresponding bounty");
|
|
dictionary d = new dictionary();
|
|
d.put("target", ((obj_id) o1));
|
|
messageTo(self, "handleBountyMissionIncomplete", d, 10.0f, false);
|
|
}
|
|
}
|
|
for (obj_id bounty : bounties) {
|
|
foundMatch = false;
|
|
for (Object o : playerBountyMissionTargetId) {
|
|
if (((obj_id) o) == bounty) {
|
|
foundMatch = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!foundMatch) {
|
|
CustomerServiceLog("bounty_inconsistency", self + " (" + getName(self) + ") has a bounty for " + bounty + " (" + getPlayerName(bounty) + ") but doesn't have a corresponding bounty misssion");
|
|
removeJediBounty(bounty, self);
|
|
}
|
|
}
|
|
utils.setScriptVar(self, "bountyConsistencyCheck", 1);
|
|
}
|
|
if (!utils.hasScriptVar(self, "shipShieldOneTimeRebalance"))
|
|
{
|
|
obj_id[] objPcds = space_transition.findShipControlDevicesForPlayer(self);
|
|
if (objPcds != null && objPcds.length > 0)
|
|
{
|
|
for (obj_id objPcd : objPcds) {
|
|
obj_id objShip = space_transition.getShipFromShipControlDevice(objPcd);
|
|
if (isIdValid(objShip)) {
|
|
space_combat.simpleShieldRatioRebalance(objShip);
|
|
}
|
|
}
|
|
}
|
|
utils.setScriptVar(self, "shipShieldOneTimeRebalance", 1);
|
|
}
|
|
armor.calculateWornArmor(self);
|
|
squad_leader.validateRallyPoint(self);
|
|
if (!utils.hasScriptVar(self, "waitingOnCloneRespawn"))
|
|
{
|
|
int posture = getPosture(self);
|
|
if (posture == POSTURE_DEAD)
|
|
{
|
|
if (!hasObjVar(self, pclib.VAR_BEEN_COUPDEGRACED))
|
|
{
|
|
setObjVar(self, pclib.VAR_DEATHBLOW_KILLER, self);
|
|
setObjVar(self, pclib.VAR_DEATHBLOW_STAMP, getGameTime());
|
|
}
|
|
messageTo(self, pclib.HANDLER_PLAYER_DEATH, null, 5, false);
|
|
}
|
|
else
|
|
{
|
|
if (hasObjVar(self, pclib.VAR_BEEN_COUPDEGRACED))
|
|
{
|
|
removeObjVar(self, pclib.VAR_BEEN_COUPDEGRACED);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
messageTo(self, "handleCloneRespawn", null, 1.0f, false);
|
|
}
|
|
if (groundquests.hasCompletedQuest(self, "ep3_avatar_self_destruct"))
|
|
{
|
|
badge.grantBadge(self, "bdg_kash_avatar_zssik");
|
|
}
|
|
if (!utils.hasScriptVar(self, "performance.buildabuff.buffComponentKeys") && buff.hasBuff(self, "buildabuff_inspiration"))
|
|
{
|
|
buff.removeBuff(self, "buildabuff_inspiration");
|
|
}
|
|
if (getLocation(self).area == "dungeon1")
|
|
{
|
|
if (trial.getTop(self) == self)
|
|
{
|
|
warpPlayer(self, "tatooine", 0, 0, 0, null, 0, 0, 0, null, false);
|
|
}
|
|
}
|
|
if (utils.isProfession(self, utils.FORCE_SENSITIVE) && getLevel(self) > 3)
|
|
{
|
|
if (!buff.isInStance(self) && !buff.isInFocus(self))
|
|
{
|
|
messageTo(self, "applyJediStance", null, 1.0f, false);
|
|
}
|
|
}
|
|
if (utils.isProfession(self, utils.SMUGGLER))
|
|
{
|
|
messageTo(self, "applySmugglingBonuses", null, 1.0f, false);
|
|
}
|
|
int cityId = getCitizenOfCityId(self);
|
|
if (cityId > 0 && !utils.hasScriptVar(self, "recieved_city_motd"))
|
|
{
|
|
obj_id cityHall = cityGetCityHall(cityId);
|
|
dictionary outparams = new dictionary();
|
|
outparams.put("player", self);
|
|
messageTo(cityHall, "msgCheckMyCityMotd", outparams, 0, false);
|
|
}
|
|
if(groundquests.hasCompletedQuest(self, "u16_nym_themepark_miner_dna_collection") && utils.playerHasStaticItemInBankOrInventory(self, "item_nym_themepark_dna_extractor")) {
|
|
obj_id dna_extractor = utils.getStaticItemInBankOrInventory(self, "item_nym_themepark_dna_extractor");
|
|
if(isValidId(dna_extractor)) utils.destroyObject(dna_extractor);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int disconnectPlayerCtsCompletedOrInProgress(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
setObjVar(self, "safeLogout", 1);
|
|
disconnectPlayer(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int ctsCompletedForCharacter(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (utils.hasScriptVar(self, cts.SCRIPTVAR_CTS_ITEM_ID))
|
|
{
|
|
final obj_id ctsItem = utils.getObjIdScriptVar(self, cts.SCRIPTVAR_CTS_ITEM_ID);
|
|
if (isIdValid(ctsItem))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "destroying item " + ctsItem + " used for ingame CTS by character " + self);
|
|
destroyObject(ctsItem);
|
|
}
|
|
}
|
|
setObjVar(self, "disableLoginCtsCompleted", getCalendarTime());
|
|
messageTo(self, "disconnectPlayerCtsCompletedOrInProgress", null, 0.1f, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int applyJediStance(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (hasSkill(self, "expertise_fs_path_cautious_nature_1"))
|
|
{
|
|
buff.applyBuff(self, self, jedi.JEDI_STANCE);
|
|
}
|
|
else
|
|
{
|
|
buff.applyBuff(self, self, jedi.JEDI_FOCUS);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int applySmugglingBonuses(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
removeSmugglingBuffs(self);
|
|
messageTo(self, "addSmugglingBuffs", null, 1.0f, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int addSmugglingBuffs(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int smUnderworld = (int)getSkillStatisticModifier(self, "expertise_underworld_boss_bonus");
|
|
int rangeBonus = (int)getSkillStatisticModifier(self, "expertise_sm_rank_range_buff");
|
|
int damageBonus = (int)getSkillStatisticModifier(self, "expertise_sm_rank_damage_buff");
|
|
float underworldFaction = factions.getFactionStanding(self, "underworld");
|
|
int smugglerTier = smuggler.getSmugglerRank(underworldFaction);
|
|
switch (smugglerTier)
|
|
{
|
|
case 1:
|
|
if (smUnderworld > 0)
|
|
{
|
|
buff.applyBuff(self, "sm_underworld_boss_1");
|
|
}
|
|
if (rangeBonus > 0)
|
|
{
|
|
buff.applyBuff(self, "sm_underworld_range_1");
|
|
}
|
|
if (damageBonus > 0)
|
|
{
|
|
buff.applyBuff(self, "sm_underworld_damage_1");
|
|
}
|
|
break;
|
|
case 2:
|
|
if (smUnderworld > 0)
|
|
{
|
|
buff.applyBuff(self, "sm_underworld_boss_2");
|
|
}
|
|
if (rangeBonus > 0)
|
|
{
|
|
buff.applyBuff(self, "sm_underworld_range_2");
|
|
}
|
|
if (damageBonus > 0)
|
|
{
|
|
buff.applyBuff(self, "sm_underworld_damage_2");
|
|
}
|
|
break;
|
|
case 3:
|
|
if (smUnderworld > 0)
|
|
{
|
|
buff.applyBuff(self, "sm_underworld_boss_3");
|
|
}
|
|
if (rangeBonus > 0)
|
|
{
|
|
buff.applyBuff(self, "sm_underworld_range_3");
|
|
}
|
|
if (damageBonus > 0)
|
|
{
|
|
buff.applyBuff(self, "sm_underworld_damage_3");
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
messageTo(self, "recalcArmor", null, 1, false);
|
|
messageTo(self, "recalcWeaponRange", null, 1, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int recalcWeaponRange(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id tempWeapon = getObjectInSlot(self, "hold_r");
|
|
if (isIdValid(tempWeapon))
|
|
{
|
|
weapons.adjustWeaponRangeForExpertise(self, tempWeapon, true);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public void removeSmugglingBuffs(obj_id who) throws InterruptedException
|
|
{
|
|
buff.removeBuff(who, "sm_underworld_boss_1");
|
|
buff.removeBuff(who, "sm_underworld_boss_2");
|
|
buff.removeBuff(who, "sm_underworld_boss_3");
|
|
buff.removeBuff(who, "sm_underworld_range_1");
|
|
buff.removeBuff(who, "sm_underworld_range_2");
|
|
buff.removeBuff(who, "sm_underworld_range_3");
|
|
buff.removeBuff(who, "sm_underworld_damage_1");
|
|
buff.removeBuff(who, "sm_underworld_damage_2");
|
|
buff.removeBuff(who, "sm_underworld_damage_3");
|
|
messageTo(who, "recalcArmor", null, 1, false);
|
|
messageTo(who, "recalcWeaponRange", null, 1, false);
|
|
}
|
|
public int removeSmugglingBonuses(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
removeSmugglingBuffs(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handlerRemoveGroupBuffEffect(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (params == null || params.isEmpty())
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int[] buffList = params.getIntArray("buffList");
|
|
if (buffList == null || buffList.length <= 0)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
buff.removeGroupBuffEffect(self, buffList);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnNewbieTutorialResponse(obj_id self, String action) throws InterruptedException
|
|
{
|
|
if (action.equals("clientReady"))
|
|
{
|
|
int playerState = getState(self, STATE_DISGUISE);
|
|
if (playerState > 0)
|
|
{
|
|
int shapechange = buff.getBuffOnTargetFromGroup(self, "shapechange");
|
|
if (shapechange == 0)
|
|
{
|
|
revertObjectAppearance(self);
|
|
}
|
|
}
|
|
location myLoc = getLocation(self);
|
|
if (hasTriggerVolume(self, "group_buff_breach"))
|
|
{
|
|
obj_id groupId = getGroupObject(self);
|
|
if (isIdValid(groupId))
|
|
{
|
|
obj_id[] groupMembers = getGroupMemberIds(groupId);
|
|
if (groupMembers != null && groupMembers.length > 0)
|
|
{
|
|
int[] buffList = buff.getOwnedGroupBuffs(self);
|
|
dictionary dict = new dictionary();
|
|
dict.put("buffList", buffList);
|
|
for (obj_id groupMember : groupMembers) {
|
|
location playerLoc = getLocation(groupMember);
|
|
if (playerLoc == null) {
|
|
messageTo(groupMember, "handlerRemoveGroupBuffEffect", dict, 1, false);
|
|
continue;
|
|
}
|
|
if (!myLoc.area.equals(playerLoc.area)) {
|
|
messageTo(groupMember, "handlerRemoveGroupBuffEffect", dict, 1, false);
|
|
continue;
|
|
}
|
|
float distance = getDistance(myLoc, playerLoc);
|
|
if (distance > 110.0f) {
|
|
messageTo(groupMember, "handlerRemoveGroupBuffEffect", dict, 1, false);
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
int[] allBuffs = buff.getAllBuffs(self);
|
|
if (allBuffs != null && allBuffs.length > 0)
|
|
{
|
|
for (int allBuff : allBuffs) {
|
|
if (buff.isAuraBuff(allBuff)) {
|
|
obj_id caster = buff.getBuffCaster(self, allBuff);
|
|
if (!isIdValid(caster) || !exists(caster)) {
|
|
buff.removeBuff(self, allBuff);
|
|
continue;
|
|
}
|
|
location casterLoc = getLocation(caster);
|
|
if (!myLoc.area.equals(casterLoc.area)) {
|
|
buff.removeBuff(self, allBuff);
|
|
continue;
|
|
}
|
|
float distance = getDistance(myLoc, casterLoc);
|
|
if (distance > 110.0f) {
|
|
buff.removeBuff(self, allBuff);
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (!events.isEventActive(events.GALACTIC_MOON_FESTIVAL))
|
|
{
|
|
if (hasObjVar(self, event_perk.COUNTER_TIMESTAMP))
|
|
{
|
|
removeObjVar(self, event_perk.COUNTER_TIMESTAMP);
|
|
}
|
|
if (hasObjVar(self, event_perk.COUNTER))
|
|
{
|
|
removeObjVar(self, event_perk.COUNTER);
|
|
}
|
|
if (hasObjVar(self, event_perk.COUNTER_RESTARTTIME))
|
|
{
|
|
removeObjVar(self, event_perk.COUNTER_RESTARTTIME);
|
|
}
|
|
}
|
|
if (!events.isEventActive(events.LIFEDAY))
|
|
{
|
|
if (hasObjVar(self, "lifeday"))
|
|
{
|
|
removeObjVar(self, "lifeday");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (lifeDayNewDay(self))
|
|
{
|
|
if (hasObjVar(self, "lifeday"))
|
|
{
|
|
removeObjVar(self, "lifeday");
|
|
}
|
|
if (buff.hasBuff(self, "event_lifeday_imperial_competitive"))
|
|
{
|
|
buff.removeBuff(self, "event_lifeday_imperial_competitive");
|
|
}
|
|
if (buff.hasBuff(self, "event_lifeday_rebel_competitive"))
|
|
{
|
|
buff.removeBuff(self, "event_lifeday_rebel_competitive");
|
|
}
|
|
if (buff.hasBuff(self, "event_lifeday_imperial_present_counter"))
|
|
{
|
|
buff.removeBuff(self, "event_lifeday_imperial_present_counter");
|
|
}
|
|
if (buff.hasBuff(self, "event_lifeday_rebel_tree_counter"))
|
|
{
|
|
buff.removeBuff(self, "event_lifeday_rebel_tree_counter");
|
|
}
|
|
}
|
|
}
|
|
if (hasScript(self, "systems.respec.click_combat_respec"))
|
|
{
|
|
detachScript(self, "systems.respec.click_combat_respec");
|
|
}
|
|
String skillTemplate = getSkillTemplate(self);
|
|
String workingSkill = getWorkingSkill(self);
|
|
if (skillTemplate == null || skillTemplate.equals("") || skillTemplate.equals("a"))
|
|
{
|
|
int combatLevel = respec.getOldCombatLevel(self);
|
|
obj_id respecDevice = utils.getStaticItemInBankOrInventory(self, "item_respec_token_01_01");
|
|
if (hasObjVar(self, "combatLevel"))
|
|
{
|
|
combatLevel = getIntObjVar(self, "combatLevel");
|
|
}
|
|
else
|
|
{
|
|
if (isIdValid(respecDevice))
|
|
{
|
|
combatLevel = getIntObjVar(respecDevice, "combatLevel");
|
|
}
|
|
}
|
|
if (combatLevel > 80)
|
|
{
|
|
combatLevel = 80;
|
|
}
|
|
setObjVar(self, "combatLevel", combatLevel);
|
|
setObjVar(self, "clickRespec.combatLevel", combatLevel);
|
|
setObjVar(self, "clickRespec.npeRespec", 1);
|
|
if (!isIdValid(respecDevice))
|
|
{
|
|
respecDevice = static_item.createNewItemFunction("item_respec_token_01_01", self);
|
|
if (isIdValid(respecDevice))
|
|
{
|
|
setObjVar(respecDevice, "combatLevel", combatLevel);
|
|
setObjVar(respecDevice, "highestLevel", true);
|
|
}
|
|
}
|
|
attachScript(self, "systems.respec.click_combat_respec");
|
|
messageTo(self, "delayRespecInstructions", null, 1, false);
|
|
}
|
|
if (hasObjVar(self, "npe.skippingTutorial"))
|
|
{
|
|
location origin = getLocation(self);
|
|
location fighting = new location(3521.0f, 0.0f, -4821.0f, origin.area);
|
|
location crafty = new location(3309.0f, 6.0f, -4785.0f, origin.area);
|
|
String profession = getSkillTemplate(self);
|
|
obj_id objInv = utils.getInventoryContainer(self);
|
|
String questNewbieStart = "quest/speeder_quest";
|
|
String questNewbieStartBH = "quest/speeder_quest";
|
|
String questCrafterEntertainer = "quest/tatooine_eisley_noncombat";
|
|
int crafter = profession.indexOf("trader");
|
|
int entertainer = profession.indexOf("entertainer");
|
|
int bountyhunter = profession.indexOf("bounty_hunter");
|
|
if (crafter > -1 || entertainer > -1)
|
|
{
|
|
if (!groundquests.isQuestActiveOrComplete(self, questCrafterEntertainer))
|
|
{
|
|
groundquests.grantQuest(self, questCrafterEntertainer);
|
|
}
|
|
}
|
|
else if (bountyhunter > -1)
|
|
{
|
|
if (groundquests.hasCompletedQuest(self, questNewbieStartBH) || groundquests.isQuestActive(self, questNewbieStartBH))
|
|
{
|
|
detachScript(self, "npe.handoff_to_tatooine");
|
|
}
|
|
else
|
|
{
|
|
groundquests.requestGrantQuest(self, questNewbieStartBH);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (groundquests.hasCompletedQuest(self, questNewbieStart) || groundquests.isQuestActive(self, questNewbieStart))
|
|
{
|
|
detachScript(self, "npe.handoff_to_tatooine");
|
|
}
|
|
else
|
|
{
|
|
groundquests.requestGrantQuest(self, questNewbieStart);
|
|
}
|
|
}
|
|
if (crafter > -1)
|
|
{
|
|
messageTo(self, "handleSurveyToolbarSetup", null, 5, false);
|
|
}
|
|
static_item.createNewItemFunction("item_npe_uniform_crate_01_01", objInv);
|
|
npe.giveProfessionWeapon(self);
|
|
removeObjVar(self, "npe.skippingTutorial");
|
|
int combatLevel = getLevel(self);
|
|
if (combatLevel < 5)
|
|
{
|
|
respec.autoLevelPlayer(self, 5, false);
|
|
}
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnCSCreateItem(obj_id self, obj_id container, String staticItemName) throws InterruptedException
|
|
{
|
|
gmlib.generateStaticItem(container, staticItemName);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int delayRespecInstructions(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int pid = createSUIPage(sui.SUI_MSGBOX, self, self, "noHandler");
|
|
setSUIProperty(pid, "this", "Size", "475,575");
|
|
setSUIProperty(pid, "this", "Location", "100,100");
|
|
setSUIProperty(pid, sui.MSGBOX_TITLE, sui.PROP_TEXT, "@click_respec:respec_title");
|
|
setSUIProperty(pid, sui.MSGBOX_PROMPT, sui.PROP_TEXT, "@click_respec:respec_message");
|
|
sui.msgboxButtonSetup(pid, sui.OK_ONLY);
|
|
showSUIPage(pid);
|
|
flushSUIPage(pid);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnRemovingFromWorld(obj_id self) throws InterruptedException
|
|
{
|
|
removeObjVar(self, "conversation");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleLoginLocResolved(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
CustomerServiceLog("LOGIN_LOC", "(" + self + ":" + getPlayerObject(self) + ") " + getName(self) + ": warp callback entered @ loc=" + (getLocation(self)).toString() + " world_loc=" + (getWorldLocation(self)).toString());
|
|
String prompt = "Due to a system error involving invalid login coordinates, an attempt has been made to warp you to a local starport.";
|
|
prompt += " We apologize for the inconvenience.";
|
|
sui.msgbox(self, prompt);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleStatProfileSUI(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (!utils.hasScriptVar(self, "screwedStats.opt"))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
String[] opt = utils.getStringArrayScriptVar(self, "screwedStats.opt");
|
|
utils.removeScriptVar(self, "screwedStats.opt");
|
|
int idx = sui.getListboxSelectedRow(params);
|
|
if (idx == -1 || idx == 0)
|
|
{
|
|
sendSystemMessageTestingOnly(self, "You will be asked the previous question on each log-in until the problem is rectified.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (opt == null || opt.length == 0)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (idx < 1 || idx >= opt.length)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
dictionary racial_mods = null;
|
|
String template = utils.getTemplateFilenameNoPath(self);
|
|
if (template != null && !template.equals(""))
|
|
{
|
|
if (template.endsWith(".iff"))
|
|
{
|
|
template = template.substring(0, template.length() - 4);
|
|
}
|
|
String racial_tbl = "datatables/creation/racial_mods.iff";
|
|
int templateRow = 0;
|
|
if (getGender(self) == GENDER_MALE)
|
|
{
|
|
templateRow = dataTableSearchColumnForString(template, 0, racial_tbl);
|
|
}
|
|
else
|
|
{
|
|
templateRow = dataTableSearchColumnForString(template, 1, racial_tbl);
|
|
}
|
|
racial_mods = dataTableGetRow(racial_tbl, templateRow);
|
|
}
|
|
if (racial_mods == null || racial_mods.isEmpty())
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
String profile = opt[idx];
|
|
if (profile == null || profile.equals("") || profile.equals("none"))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
dictionary prof_mods = dataTableGetRow("datatables/creation/profession_mods.iff", profile);
|
|
for (int x = 0; x < NUM_ATTRIBUTES; x++)
|
|
{
|
|
String aname = "";
|
|
switch (x)
|
|
{
|
|
case 0:
|
|
aname = "health";
|
|
break;
|
|
case 1:
|
|
aname = "constitution";
|
|
break;
|
|
case 2:
|
|
aname = "action";
|
|
break;
|
|
case 3:
|
|
aname = "stamina";
|
|
break;
|
|
case 4:
|
|
aname = "mind";
|
|
break;
|
|
case 5:
|
|
aname = "willpower";
|
|
break;
|
|
}
|
|
int newval = racial_mods.getInt(aname) + prof_mods.getInt(aname);
|
|
setMaxAttrib(self, x, newval);
|
|
}
|
|
healing.fullHeal(self);
|
|
String prompt = " We apologize for any inconveniences this may cause.";
|
|
sui.msgbox(self, prompt);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnLogout(obj_id self) throws InterruptedException
|
|
{
|
|
if (hasObjVar(self, pclib.VAR_CONSENT_FROM_ID))
|
|
{
|
|
pclib.relinquishConsents(self);
|
|
}
|
|
(self.getScriptVars()).remove(veteran_deprecated.SCRIPTVAR_VETERAN_LOGGED_IN);
|
|
obj_id objBuilding = getTopMostContainer(self);
|
|
if (isIdValid(objBuilding) && objBuilding != self)
|
|
{
|
|
if (hasScript(objBuilding, "planet_map.active_registered"))
|
|
{
|
|
dictionary dctParams = new dictionary();
|
|
dctParams.put("objItem", self);
|
|
messageTo(objBuilding, "removeRegistrant", dctParams, 0, false);
|
|
}
|
|
location buildingEjectionPoint = getBuildingEjectLocation(objBuilding);
|
|
if (buildingEjectionPoint != null)
|
|
{
|
|
setObjVar(self, "building_ejection_point", buildingEjectionPoint);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
removeObjVar(self, "building_ejection_point");
|
|
}
|
|
if (utils.hasScriptVar(self, "battlefield.queue"))
|
|
{
|
|
String battlefieldName = utils.getStringScriptVar(self, "battlefield.queue");
|
|
obj_id controller = null;
|
|
if (battlefieldName != null || battlefieldName.length() > 0)
|
|
{
|
|
controller = utils.getObjIdScriptVar(self, "battlefield." + battlefieldName);
|
|
}
|
|
if (isIdValid(controller))
|
|
{
|
|
dictionary params = new dictionary();
|
|
params.put("player", self);
|
|
if (factions.isRebel(self))
|
|
{
|
|
params.put("faction", factions.FACTION_FLAG_REBEL);
|
|
}
|
|
else if (factions.isImperial(self))
|
|
{
|
|
params.put("faction", factions.FACTION_FLAG_IMPERIAL);
|
|
}
|
|
messageTo(controller, "removePlayerFromQueue", params, 1.0f, false);
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnUnloadedFromMemory(obj_id self) throws InterruptedException
|
|
{
|
|
chatExitRoom("SWG.system");
|
|
chatExitRoom("SWG." + getGalaxyName() + ".system");
|
|
chatExitRoom("SWG." + getGalaxyName() + "." + getCurrentSceneName() + ".system");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnImmediateLogout(obj_id self) throws InterruptedException
|
|
{
|
|
(self.getScriptVars()).remove(veteran_deprecated.SCRIPTVAR_VETERAN_LOGGED_IN);
|
|
if (utils.hasScriptVar(self, "profit"))
|
|
{
|
|
int startMoney = utils.getIntScriptVar(self, "profit");
|
|
int endMoney = getTotalMoney(self);
|
|
utils.removeScriptVar(self, "profit");
|
|
if ((endMoney - startMoney) > PROFIT_LOGGING_THRESHOLD)
|
|
{
|
|
CustomerServiceLog("Wealth", "Extraordinary Profit: " + getName(self) + " (" + self + ") logged in with " + startMoney + " credits and logged out with " + endMoney + " credits, for a profit of " + (endMoney - startMoney) + " credits");
|
|
}
|
|
}
|
|
if (guild.hasWindowPid(self))
|
|
{
|
|
guild.removeWindowPid(self);
|
|
}
|
|
int vehicleBuff = buff.getBuffOnTargetFromGroup(self, "vehicle");
|
|
if (vehicleBuff != 0)
|
|
{
|
|
buff.removeBuff(self, vehicleBuff);
|
|
}
|
|
if (callable.hasAnyCallable(self))
|
|
{
|
|
callable.storeCallables(self);
|
|
}
|
|
removeObjVar(self, "surveying.sampleLocation");
|
|
if (hasObjVar(self, "safeLogout"))
|
|
{
|
|
if (getIntObjVar(self, "safeLogout") == 1)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
obj_id building = getTopMostContainer(self);
|
|
if (isIdValid(building))
|
|
{
|
|
if (hasObjVar(building, "safeLogout") && getIntObjVar(building, "safeLogout") == 1)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (hasScript(building, force_rank.SCRIPT_ENCLAVE_CONTROLLER))
|
|
{
|
|
if (!force_rank.isPlayersEnclave(building, self))
|
|
{
|
|
expelFromBuilding(self);
|
|
}
|
|
}
|
|
}
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
public int OnAboutToReceiveItem(obj_id self, obj_id srcContainer, obj_id transferer, obj_id item) throws InterruptedException
|
|
{
|
|
int got = getGameObjectType(item);
|
|
if (isGameObjectTypeOf(got, GOT_misc_container_wearable))
|
|
{
|
|
obj_id belt = getObjectInSlot(self, "utility_belt");
|
|
if (isIdValid(belt) && isGameObjectTypeOf(belt, GOT_misc_container_wearable))
|
|
{
|
|
obj_id inv = utils.getInventoryContainer(self);
|
|
putInOverloaded(belt, inv);
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnReceivedItem(obj_id self, obj_id srcContainer, obj_id transferer, obj_id item) throws InterruptedException
|
|
{
|
|
int got = getGameObjectType(item);
|
|
if (isGameObjectTypeOf(got, GOT_armor) && !isGameObjectTypeOf(got, GOT_armor_psg))
|
|
{
|
|
armor.calculateWornArmor(self);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnLostItem(obj_id self, obj_id destContainer, obj_id transferer, obj_id item) throws InterruptedException
|
|
{
|
|
int got = getGameObjectType(item);
|
|
if (isGameObjectTypeOf(got, GOT_armor) && !isGameObjectTypeOf(got, GOT_armor_psg))
|
|
{
|
|
armor.calculateWornArmor(self);
|
|
}
|
|
if (isGameObjectTypeOf(got, GOT_weapon))
|
|
{
|
|
combat.cacheCombatData(self);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnTransferred(obj_id self, obj_id src, obj_id dest, obj_id transferer) throws InterruptedException
|
|
{
|
|
if ((pet_lib.isMount(src)) || (pet_lib.isMount(dest)) || (vehicle.isVehicle(src)) || (vehicle.isVehicle(dest)))
|
|
{
|
|
movement.refresh(self);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleEjection(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id sender = null;
|
|
if (params == null || params.isEmpty())
|
|
{
|
|
sender = getTopMostContainer(self);
|
|
}
|
|
else
|
|
{
|
|
sender = params.getObjId("sender");
|
|
}
|
|
if (!isIdValid(sender))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
location there = getBuildingEjectLocation(sender);
|
|
if (there == null)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
pclib.sendToAnyLocation(self, there, null);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdEject(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
dictionary outparams = new dictionary();
|
|
outparams.put("loc", getLocation(self));
|
|
messageTo(self, "handleDelayedEjection", outparams, 10.0f, false);
|
|
sendSystemMessage(self, SID_SYS_EJECT_REQUEST);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleDelayedEjection(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (params == null)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (getLocation(self).area == "tutorial")
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
location loc = params.getLocation("loc");
|
|
location curloc = getLocation(self);
|
|
if (getDistance(loc, curloc) > 1.0f)
|
|
{
|
|
sendSystemMessage(self, SID_SYS_EJECT_FAIL_MOVE);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id instanceController = instance.getAreaInstanceController(self);
|
|
if (isIdValid(instanceController))
|
|
{
|
|
String instanceName = instance.getInstanceName(instanceController);
|
|
instance.requestExitPlayer(instanceName, self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
{
|
|
obj_id dungeon_id = space_dungeon.getDungeonIdForPlayer(self);
|
|
if (isValidId(dungeon_id) && exists(dungeon_id))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
obj_id container = getTopMostContainer(self);
|
|
obj_id building = null;
|
|
if (isIdValid(container))
|
|
{
|
|
if (isGameObjectTypeOf(container, GOT_building) && hasScript(container, "structure.permanent_structure"))
|
|
{
|
|
ejectPlayerFromBuilding(self, container);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id[] near = getNonCreaturesInRange(getWorldLocation(self), 128.0f);
|
|
location here = getWorldLocation(self);
|
|
obj_id closest = null;
|
|
float maxdist = 9999.0f;
|
|
for (obj_id obj_id : near) {
|
|
if (isGameObjectTypeOf(obj_id, GOT_building) || isGameObjectTypeOf(obj_id, GOT_installation)) {
|
|
float dist = getDistance(here, getWorldLocation(obj_id));
|
|
if (dist < maxdist) {
|
|
maxdist = dist;
|
|
closest = obj_id;
|
|
}
|
|
}
|
|
}
|
|
if (isIdValid(closest))
|
|
{
|
|
if (isGameObjectTypeOf(closest, GOT_building))
|
|
{
|
|
ejectPlayerFromBuilding(self, closest);
|
|
}
|
|
else if (isGameObjectTypeOf(closest, GOT_installation))
|
|
{
|
|
float yaw = getYaw(closest);
|
|
location there = getWorldLocation(closest);
|
|
location loc1 = utils.rotatePointXZ(there, 8.0f, yaw + 90.0f);
|
|
location loc2 = utils.rotatePointXZ(there, 8.0f, yaw - 90.0f);
|
|
float d1 = getDistance(here, loc1);
|
|
float d2 = getDistance(here, loc2);
|
|
if (d1 < d2)
|
|
{
|
|
pclib.sendToAnyLocation(self, loc1, null);
|
|
}
|
|
else
|
|
{
|
|
pclib.sendToAnyLocation(self, loc2, null);
|
|
}
|
|
sendSystemMessage(self, SID_SYS_EJECT_SUCCESS);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
sendSystemMessage(self, SID_SYS_EJECT_FAIL_PROXIMITY);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public void ejectPlayerFromBuilding(obj_id player, obj_id building) throws InterruptedException
|
|
{
|
|
location there = getBuildingEjectLocation(building);
|
|
if (there == null)
|
|
{
|
|
return;
|
|
}
|
|
pclib.sendToAnyLocation(player, there, null);
|
|
sendSystemMessage(player, SID_SYS_EJECT_SUCCESS);
|
|
}
|
|
public int handleWatchRadialCmd(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id target = params.getObjId("target");
|
|
if (isIdValid(target))
|
|
{
|
|
performance.watch(self, target);
|
|
}
|
|
else
|
|
{
|
|
performance.stopWatch(self);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleListenRadialCmd(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id target = params.getObjId("target");
|
|
if (isIdValid(target))
|
|
{
|
|
performance.listen(self, target);
|
|
}
|
|
else
|
|
{
|
|
performance.stopListen(self);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleSkillPurchase(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
String boxTitle = params.getString(sui.LISTBOX_TITLE + "." + sui.PROP_TEXT);
|
|
String skillName = boxTitle.substring(boxTitle.indexOf(":") + 1);
|
|
if (!skill.purchaseSkill(self, skillName))
|
|
{
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleRequestCoinLoot(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (params == null || params.isEmpty())
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id corpseId = params.getObjId(corpse.DICT_CORPSE_ID);
|
|
if (!isIdValid(corpseId))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int cash = params.getInt(corpse.DICT_COINS);
|
|
int safeCash = group.getSafeDifference(self, cash);
|
|
if (safeCash < cash)
|
|
{
|
|
cash = safeCash;
|
|
params.put(corpse.DICT_COINS, cash);
|
|
}
|
|
if (cash > 0)
|
|
{
|
|
if (transferBankCreditsFromNamedAccount(money.ACCT_NPC_LOOT, self, cash, null, null, null))
|
|
{
|
|
utils.moneyInMetric(corpseId, money.ACCT_NPC_LOOT, cash);
|
|
withdrawCashFromBank(self, cash, corpse.HANDLER_COINS_LOOTED, corpse.HANDLER_COINLOOT_FAILED, params);
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleUnconsentMenu(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int btnPressed = sui.getIntButtonPressed(params);
|
|
switch (btnPressed)
|
|
{
|
|
case sui.BP_CANCEL:
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int idx = sui.getListboxSelectedRow(params);
|
|
if (idx < 0)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (hasObjVar(self, pclib.VAR_CONSENT_TO_ID))
|
|
{
|
|
obj_id[] consentTo = getObjIdArrayObjVar(self, pclib.VAR_CONSENT_TO_ID);
|
|
if ((consentTo == null) || (consentTo.length == 0))
|
|
{
|
|
}
|
|
else
|
|
{
|
|
obj_id target = consentTo[idx];
|
|
queueCommand(self, (-1562441686), null, getPlayerFullName(target), COMMAND_PRIORITY_DEFAULT);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
sendSystemMessage(self, SID_CONSENT_TO_EMPTY);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleConsentToLogout(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (params == null)
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
obj_id consented = params.getObjId(corpse.DICT_PLAYER_ID);
|
|
obj_id[] corpses = getObjIdArrayObjVar(self, pclib.VAR_CORPSE_ID);
|
|
if (corpses != null)
|
|
{
|
|
corpse.revokeCorpseConsent(corpses, consented);
|
|
}
|
|
Vector consentToList = getResizeableObjIdArrayObjVar(self, pclib.VAR_CONSENT_TO_ID);
|
|
if (consentToList != null)
|
|
{
|
|
consentToList = utils.removeElement(consentToList, consented);
|
|
if ((consentToList == null) || (consentToList.size() == 0))
|
|
{
|
|
removeObjVar(self, pclib.VAR_CONSENT_TO_ID);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
setObjVar(self, pclib.VAR_CONSENT_TO_ID, consentToList);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleReceivedConsent(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id consenter = params.getObjId(pclib.DICT_CONSENTER_ID);
|
|
Vector consentFrom = getResizeableObjIdArrayObjVar(self, pclib.VAR_CONSENT_FROM_ID);
|
|
if (consentFrom == null)
|
|
{
|
|
Vector newConsentFrom = new Vector();
|
|
newConsentFrom.setSize(0);
|
|
consentFrom = newConsentFrom;
|
|
}
|
|
else
|
|
{
|
|
if (utils.getElementPositionInArray(consentFrom, consenter) > -1)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
consentFrom = utils.addElement(consentFrom, consenter);
|
|
setObjVar(self, pclib.VAR_CONSENT_FROM_ID, consentFrom);
|
|
prose_package pp = prose.getPackage(PROSE_GOT_CONSENT, getPlayerFullName(consenter));
|
|
sendSystemMessageProse(self, pp);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleReceivedUnconsent(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id consenter = params.getObjId(pclib.DICT_CONSENTER_ID);
|
|
Vector consentFrom = getResizeableObjIdArrayObjVar(self, pclib.VAR_CONSENT_FROM_ID);
|
|
if (consentFrom != null)
|
|
{
|
|
int idx = utils.getElementPositionInArray(consentFrom, consenter);
|
|
if (idx > -1)
|
|
{
|
|
consentFrom = utils.removeElementAt(consentFrom, idx);
|
|
if ((consentFrom == null) || (consentFrom.size() == 0))
|
|
{
|
|
removeObjVar(self, pclib.VAR_CONSENT_FROM_BASE);
|
|
}
|
|
else
|
|
{
|
|
setObjVar(self, pclib.VAR_CONSENT_FROM_ID, consentFrom);
|
|
}
|
|
prose_package pp = prose.getPackage(PROSE_LOST_CONSENT, getPlayerFullName(consenter));
|
|
sendSystemMessageProse(self, pp);
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleCorpseCoinLoot(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (params == null || params.isEmpty())
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id corpseId = params.getObjId(corpse.DICT_CORPSE_ID);
|
|
int cash = params.getInt(corpse.DICT_COINS);
|
|
if (isIdValid(corpseId))
|
|
{
|
|
obj_id nullId = null;
|
|
queueCommand(self, (-1939113026), null, Integer.toString(cash), COMMAND_PRIORITY_DEFAULT);
|
|
obj_id gid = getGroupObject(self);
|
|
if (isIdValid(gid))
|
|
{
|
|
group.notifyCoinLoot(gid, self, corpseId, cash);
|
|
}
|
|
else
|
|
{
|
|
prose_package pp = prose.getPackage(PROSE_COIN_LOOT_NO_TARGET, null, nullId, cash);
|
|
sendSystemMessageProse(self, pp);
|
|
}
|
|
CustomerServiceLog("Loot", "(" + self + ") " + getName(self) + " looted " + cash + " credits from (" + corpseId + ") " + getName(corpseId));
|
|
obj_id cInv = utils.getInventoryContainer(corpseId);
|
|
if (isIdValid(cInv))
|
|
{
|
|
obj_id[] corpseContents = corpse.getValidLootContents(getContents(cInv));
|
|
if (corpseContents == null || corpseContents.length <= 0)
|
|
{
|
|
messageTo(corpseId, "handleCorpseExpire", null, 2, true);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
else
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
messageTo(corpseId, "handleCorpseExpire", null, 2, true);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleCorpseCoinLootFailed(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (params == null)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id corpseId = params.getObjId(corpse.DICT_CORPSE_ID);
|
|
int cash = params.getInt(corpse.DICT_COINS);
|
|
prose_package pp = prose.getPackage(PROSE_COIN_LOOT_FAILED, null, corpseId, cash);
|
|
sendSystemMessageProse(self, pp);
|
|
int got = getGameObjectType(corpseId);
|
|
if (got == GOT_corpse)
|
|
{
|
|
CustomerServiceLog("Death", "(" + self + ") " + getName(self) + " FAILED to loot " + cash + " credits from (" + corpseId + ") " + getName(corpseId));
|
|
}
|
|
else
|
|
{
|
|
CustomerServiceLog("Loot", "(" + self + ") " + getName(self) + " FAILED to loot " + cash + " credits from (" + corpseId + ") " + getName(corpseId));
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleCorpseExpire(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (params == null)
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
obj_id corpseId = params.getObjId(corpse.DICT_CORPSE_ID);
|
|
if (isIdValid(corpseId))
|
|
{
|
|
obj_id[] corpses = getObjIdArrayObjVar(self, pclib.VAR_CORPSE_ID);
|
|
if (utils.getElementPositionInArray(corpses, corpseId) > -1)
|
|
{
|
|
sendSystemMessage(self, SID_CORPSE_EXPIRED);
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleCorpseWaypointUpdate(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (params == null)
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
obj_id waypoint = params.getObjId(corpse.DICT_CORPSE_WAYPOINT);
|
|
location loc = params.getLocation(corpse.DICT_CORPSE_LOC);
|
|
setWaypointLocation(waypoint, loc);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleCorpseCleanup(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (params == null)
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
obj_id corpseId = params.getObjId(corpse.DICT_CORPSE_ID);
|
|
obj_id waypoint = params.getObjId(corpse.DICT_CORPSE_WAYPOINT);
|
|
destroyWaypointInDatapad(waypoint, self);
|
|
Vector corpses = utils.getResizeableObjIdBatchObjVar(self, pclib.VAR_CORPSE_ID);
|
|
Vector killers = utils.getResizeableObjIdBatchObjVar(self, pclib.VAR_CORPSE_KILLER);
|
|
Vector stamps = utils.getResizeableIntBatchObjVar(self, pclib.VAR_CORPSE_STAMP);
|
|
if ((corpses == null) || (killers == null))
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
int idx = utils.getElementPositionInArray(corpses, corpseId);
|
|
if (idx > -1)
|
|
{
|
|
corpses = utils.removeElementAt(corpses, idx);
|
|
killers = utils.removeElementAt(killers, idx);
|
|
stamps = utils.removeElementAt(stamps, idx);
|
|
if ((corpses == null) || (corpses.size() == 0))
|
|
{
|
|
removeObjVar(self, pclib.VAR_CORPSE_BASE);
|
|
}
|
|
else
|
|
{
|
|
utils.setResizeableBatchObjVar(self, pclib.VAR_CORPSE_ID, corpses);
|
|
utils.setResizeableBatchObjVar(self, pclib.VAR_CORPSE_KILLER, killers);
|
|
utils.setResizeableBatchObjVar(self, pclib.VAR_CORPSE_STAMP, stamps);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleIncapCounterDeath(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int posture = getPosture(self);
|
|
obj_id objKiller = params.getObjId("objKiller");
|
|
if (posture == POSTURE_INCAPACITATED && !hasObjVar(self, pclib.VAR_BEEN_COUPDEGRACED))
|
|
{
|
|
pclib.coupDeGrace(self, objKiller, false);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int reportJediDeathCount(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleJediDeathCount(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (isJedi(self))
|
|
{
|
|
int jediDeaths = getIntObjVar(self, jedi.VAR_JEDI_DEATHS);
|
|
string_id msg = new string_id("jedi_spam", "jedi_death");
|
|
prose_package proseMsg = prose.getPackage(msg, jediDeaths);
|
|
sendSystemMessageProse(self, proseMsg);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int decayJediDeath(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int jediDeaths = getIntObjVar(self, jedi.VAR_JEDI_DEATHS);
|
|
jediDeaths--;
|
|
if (jediDeaths < 0)
|
|
{
|
|
jediDeaths = 0;
|
|
}
|
|
setObjVar(self, jedi.VAR_JEDI_DEATHS, jediDeaths);
|
|
if (isGod(self))
|
|
{
|
|
string_id msg = new string_id("jedi_spam", "jedi_death_decay");
|
|
prose_package proseMsg = prose.getPackage(msg, jediDeaths);
|
|
sendSystemMessageProse(self, proseMsg);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleHealOverTimeTick(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
float duration = params.getFloat("duration");
|
|
float tick = params.getFloat("tick");
|
|
int heal = params.getInt("heal");
|
|
int hot_id = params.getInt("id");
|
|
int isCombat = params.getInt("combat");
|
|
obj_id medic = params.getObjId("medic");
|
|
if (isDead(self))
|
|
{
|
|
if (buff.hasBuff(self, "healOverTime"))
|
|
{
|
|
buff.removeBuff(self, "healOverTime");
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!utils.hasScriptVar(self, healing.VAR_PLAYER_HOT_ID))
|
|
{
|
|
if (buff.hasBuff(self, "healOverTime"))
|
|
{
|
|
buff.removeBuff(self, "healOverTime");
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int player_id = utils.getIntScriptVar(self, healing.VAR_PLAYER_HOT_ID);
|
|
if (hot_id != player_id)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!isIncapacitated(self))
|
|
{
|
|
int delta = healing.healDamage(medic, self, HEALTH, heal);
|
|
if (isCombat == 1 && isIdValid(medic))
|
|
{
|
|
prose_package pp = new prose_package();
|
|
pp = prose.setStringId(pp, new string_id("healing", "heal_fly"));
|
|
pp = prose.setDI(pp, delta);
|
|
pp = prose.setTO(pp, ATTRIBUTES[HEALTH]);
|
|
showFlyTextPrivateProseWithFlags(self, self, pp, 2.0f, colors.SEAGREEN, FLY_TEXT_FLAG_IS_HEAL);
|
|
if (medic != self)
|
|
{
|
|
showFlyTextPrivateProseWithFlags(self, medic, pp, 2.0f, colors.SEAGREEN, FLY_TEXT_FLAG_IS_HEAL);
|
|
}
|
|
pp = prose.setStringId(pp, healing.SID_PERFORM_HEAL_DAMAGE_SUCCESS);
|
|
pp = prose.setTT(pp, medic);
|
|
pp = prose.setTO(pp, self);
|
|
pp = prose.setDI(pp, delta);
|
|
healing.sendMedicalSpam(medic, self, pp, true, true, true, COMBAT_RESULT_MEDICAL);
|
|
delta = (int)(delta * healing.HEAL_OVER_TIME_AGGRO_REDUCER);
|
|
healing._addMedicalHate(medic, self, delta);
|
|
}
|
|
}
|
|
duration -= tick;
|
|
if (duration <= 0.0f)
|
|
{
|
|
if (buff.hasBuff(self, "healOverTime"))
|
|
{
|
|
buff.removeBuff(self, "healOverTime");
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
dictionary d = new dictionary();
|
|
d.put("duration", duration);
|
|
d.put("tick", tick);
|
|
d.put("heal", heal);
|
|
d.put("id", hot_id);
|
|
d.put("combat", isCombat);
|
|
d.put("medic", medic);
|
|
if (tick >= 0)
|
|
{
|
|
messageTo(self, healing.MSG_HEAL_OVER_TIME, d, tick, false);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handlePlayerDeath(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
groundquests.sendSignal(self, "smugglerEnemyIncap");
|
|
if (utils.hasScriptVar(self, pclib.VAR_SUI_CLONE))
|
|
{
|
|
int oldpid = utils.getIntScriptVar(self, pclib.VAR_SUI_CLONE);
|
|
forceCloseSUIPage(oldpid);
|
|
utils.removeScriptVar(self, pclib.VAR_SUI_CLONE);
|
|
}
|
|
if (!isDead(self))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
pvpRemoveAllTempEnemyFlags(self);
|
|
clearBuffIcon(self, "food");
|
|
if (isPvpRelatedDeath(self))
|
|
{
|
|
utils.setScriptVar(self, "buffDecay", 1);
|
|
buff.decayAllBuffsFromPvpDeath(self);
|
|
}
|
|
else
|
|
{
|
|
buff.removeAllBuffs(self, true);
|
|
}
|
|
if (!hasObjVar(self, pclib.VAR_BEEN_COUPDEGRACED))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
Vector options = new Vector();
|
|
options.setSize(0);
|
|
Vector cloneLocs = new Vector();
|
|
cloneLocs.setSize(0);
|
|
Vector spawnLocs = new Vector();
|
|
spawnLocs.setSize(0);
|
|
Vector damage = new Vector();
|
|
damage.setSize(0);
|
|
boolean isNewbieDeath = false;
|
|
location deathLoc = pclib.getEffectiveDeathLocation(self);
|
|
String planetName = deathLoc.area;
|
|
obj_id planet = getPlanetByName(planetName);
|
|
location worldLoc = getWorldLocation(self);
|
|
String areaName = getBuildoutAreaName(worldLoc.x, worldLoc.z);
|
|
obj_id bound = getObjIdObjVar(self, cloninglib.VAR_BIND_FACILITY);
|
|
boolean isBindListed = false;
|
|
obj_id controller = utils.getObjIdScriptVar(self, "battlefield.active");
|
|
if (isIdValid(controller) && exists(controller))
|
|
{
|
|
location cloneLoc = null;
|
|
String cloneName = "Clone Center";
|
|
String battlefieldName = utils.getStringObjVar(controller, "battlefieldName");
|
|
if (factions.isRebel(self))
|
|
{
|
|
cloneLoc = utils.getLocationScriptVar(controller, "battlefieldRebelSpawn");
|
|
cloneName = "Rebel Cloning Center - " + localize(new string_id("spam", battlefieldName));
|
|
}
|
|
else if (factions.isImperial(self))
|
|
{
|
|
cloneLoc = utils.getLocationScriptVar(controller, "battlefieldImperialSpawn");
|
|
cloneName = "Imperial Cloning Center - " + localize(new string_id("spam", battlefieldName));
|
|
}
|
|
options = utils.addElement(options, cloneName);
|
|
cloneLocs = utils.addElement(cloneLocs, cloneLoc);
|
|
spawnLocs = utils.addElement(spawnLocs, cloneLoc);
|
|
}
|
|
else
|
|
{
|
|
if (cloninglib.canUseBindFacility(planetName, areaName))
|
|
{
|
|
String bindName = "@base_player:clone_location_registered_select_begin ";
|
|
if (hasObjVar(self, cloninglib.VAR_BIND_BASE))
|
|
{
|
|
String cloneName = getStringObjVar(self, cloninglib.VAR_BIND_CITY_NAME);
|
|
location bindLoc = getLocationObjVar(self, cloninglib.VAR_BIND_LOCATION);
|
|
location spawnLoc = getLocationObjVar(self, cloninglib.VAR_BIND_SPAWN_LOC);
|
|
if (bindLoc != null)
|
|
{
|
|
if (isIdValid(bound))
|
|
{
|
|
if (city.isCityBanned(self, bound))
|
|
{
|
|
bindName += " @base_player:clone_location_city_banned";
|
|
bindLoc = null;
|
|
spawnLoc = null;
|
|
}
|
|
else
|
|
{
|
|
bindName += cloneName;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bindName += "@base_player:clone_location_unknown";
|
|
bindLoc = null;
|
|
spawnLoc = null;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bindName += "@base_player:clone_location_none";
|
|
bindLoc = null;
|
|
spawnLoc = null;
|
|
}
|
|
bindName += " @base_player:clone_location_registered_select_end";
|
|
options = utils.addElement(options, bindName);
|
|
cloneLocs = utils.addElement(cloneLocs, bindLoc);
|
|
spawnLocs = utils.addElement(spawnLocs, spawnLoc);
|
|
if (pvp.isPvpDeath(self) || isNewbieDeath)
|
|
{
|
|
damage = utils.addElement(damage, 0);
|
|
}
|
|
else
|
|
{
|
|
damage = utils.addElement(damage, cloninglib.CLONE_DAMAGE_LOW);
|
|
}
|
|
isBindListed = true;
|
|
}
|
|
}
|
|
if (isIdValid(planet))
|
|
{
|
|
if (utils.hasScriptVar(planet, cloninglib.VAR_PLANET_CLONE_LOC))
|
|
{
|
|
Vector cloneList = cloninglib.getAvailableCloningFacilities(self);
|
|
int playerFaction = factions.getFactionFlag(self);
|
|
obj_id tatooinePlanet = getPlanetByName("tatooine");
|
|
for (Object o : cloneList) {
|
|
dictionary cloneData = (dictionary) o;
|
|
obj_id facility = cloneData.getObjId("faciltyId");
|
|
String cloneName = cloneData.getString("cloneName");
|
|
location cloneLoc = cloneData.getLocation("facilityLoc");
|
|
location spawnLoc = cloneData.getLocation("spawnLoc");
|
|
if (facility == bound && !isBindListed) {
|
|
cloneName = "@base_player:clone_location_registered_select_begin " + getStringObjVar(self, cloninglib.VAR_BIND_CITY_NAME) + " @base_player:clone_location_registered_select_end";
|
|
isBindListed = true;
|
|
}
|
|
if (cloneName.equals("@naboo_region_names:theed") && cloneLoc.z > 4100) {
|
|
cloneName += "_north";
|
|
}
|
|
if (playerFaction == factions.FACTION_FLAG_IMPERIAL || playerFaction == factions.FACTION_FLAG_REBEL) {
|
|
if (cloneName.equals("@tatooine_region_names:bestine") && utils.hasScriptVar(tatooinePlanet, "gcw.invasionRunning.bestine")) {
|
|
int factionDefending = utils.getIntScriptVar(tatooinePlanet, "gcw.factionDefending.bestine");
|
|
if ((factionDefending == factions.FACTION_FLAG_IMPERIAL || factionDefending == factions.FACTION_FLAG_REBEL) && playerFaction != factionDefending) {
|
|
continue;
|
|
}
|
|
}
|
|
if (cloneName.equals("@talus_region_names:dearic") && utils.hasScriptVar(tatooinePlanet, "gcw.invasionRunning.dearic")) {
|
|
int factionDefending = utils.getIntScriptVar(tatooinePlanet, "gcw.factionDefending.dearic");
|
|
if ((factionDefending == factions.FACTION_FLAG_IMPERIAL || factionDefending == factions.FACTION_FLAG_REBEL) && playerFaction != factionDefending) {
|
|
continue;
|
|
}
|
|
}
|
|
if (cloneName.equals("@naboo_region_names:keren") && utils.hasScriptVar(tatooinePlanet, "gcw.invasionRunning.keren")) {
|
|
int factionDefending = utils.getIntScriptVar(tatooinePlanet, "gcw.factionDefending.keren");
|
|
if ((factionDefending == factions.FACTION_FLAG_IMPERIAL || factionDefending == factions.FACTION_FLAG_REBEL) && playerFaction != factionDefending) {
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
options = utils.addElement(options, cloneName);
|
|
cloneLocs = utils.addElement(cloneLocs, cloneLoc);
|
|
spawnLocs = utils.addElement(spawnLocs, spawnLoc);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (options == null || options.size() < 1)
|
|
{
|
|
}
|
|
int suiClone = createCloningSui(self, options);
|
|
if (suiClone == -1)
|
|
{
|
|
debugServerConsoleMsg(self, "PLAYER DEATH ERROR: unable to create sui for player = " + self);
|
|
debugServerConsoleMsg(self, "* reviving player at cuttent location...");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
utils.setScriptVar(self, pclib.VAR_SUI_CLONE, suiClone);
|
|
utils.setScriptVar(self, pclib.VAR_REVIVE_OPTIONS, options);
|
|
utils.setScriptVar(self, pclib.VAR_REVIVE_CLONE, cloneLocs);
|
|
utils.setScriptVar(self, pclib.VAR_REVIVE_SPAWN, spawnLocs);
|
|
dictionary hrem = new dictionary();
|
|
hrem.put("time", healing.REVIVE_TIMER);
|
|
hrem.put("sui", suiClone);
|
|
utils.setScriptVar(self, combat.DIED_RECENTLY, true);
|
|
messageTo(self, "clearRecentDeathScriptVar", null, combat.RECENT_DEATH_EXPIRATION, false);
|
|
messageTo(self, "handleReviveExpirationMessage", hrem, 0.0f, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int createCloningSui(obj_id player, Vector list) throws InterruptedException
|
|
{
|
|
String title = MSG_REVIVE_TITLE;
|
|
String prompt = buildCloningPrompt(player, -1);
|
|
int pid = createSUIPage(sui.SUI_LISTBOX, player, player, HANDLER_PLAYER_REVIVE);
|
|
setSUIProperty(pid, sui.LISTBOX_TITLE, sui.PROP_TEXT, title);
|
|
setSUIProperty(pid, sui.LISTBOX_PROMPT, sui.PROP_TEXT, prompt);
|
|
sui.listboxButtonSetup(pid, sui.OK_ONLY);
|
|
clearSUIDataSource(pid, sui.LISTBOX_DATASOURCE);
|
|
for (int i = 0; i < list.size(); i++)
|
|
{
|
|
addSUIDataItem(pid, sui.LISTBOX_DATASOURCE, "" + i);
|
|
setSUIProperty(pid, sui.LISTBOX_DATASOURCE + "." + i, sui.PROP_TEXT, ((String)list.get(i)));
|
|
}
|
|
subscribeToSUIEvent(pid, sui_event_type.SET_onGenericSelection, sui.LISTBOX_LIST, "handleCloneSuiUpdate");
|
|
subscribeToSUIPropertyForEvent(pid, sui_event_type.SET_onGenericSelection, sui.LISTBOX_LIST, sui.LISTBOX_LIST, sui.PROP_SELECTEDROW);
|
|
subscribeToSUIProperty(pid, sui.LISTBOX_LIST, sui.PROP_SELECTEDROW);
|
|
subscribeToSUIProperty(pid, sui.LISTBOX_TITLE, sui.PROP_TEXT);
|
|
showSUIPage(pid);
|
|
flushSUIPage(pid);
|
|
return pid;
|
|
}
|
|
public int handleCloneSuiUpdate(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if ((params == null) || (params.isEmpty()))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int pid = utils.getIntScriptVar(self, pclib.VAR_SUI_CLONE);
|
|
int idx = sui.getListboxSelectedRow(params);
|
|
String prompt = buildCloningPrompt(self, idx);
|
|
setSUIProperty(pid, sui.LISTBOX_PROMPT, sui.PROP_TEXT, prompt);
|
|
flushSUIPage(pid);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public String buildCloningPrompt(obj_id player, int index) throws InterruptedException
|
|
{
|
|
String[] options = utils.getStringArrayScriptVar(player, pclib.VAR_REVIVE_OPTIONS);
|
|
location[] cloneLocs = utils.getLocationArrayScriptVar(player, pclib.VAR_REVIVE_CLONE);
|
|
String prompt = "@base_player:clone_prompt_header ";
|
|
if (index > -1)
|
|
{
|
|
prompt += "\n\n @base_player:clone_prompt_data ";
|
|
prompt += "\n @base_player:clone_prompt_location " + options[index];
|
|
prompt += "\n @base_player:clone_prompt_distance " + distanceToString(getDistance(player, cloneLocs[index]));
|
|
}
|
|
return prompt;
|
|
}
|
|
public String distanceToString(float dist) throws InterruptedException
|
|
{
|
|
String text;
|
|
if (dist < 0)
|
|
{
|
|
text = "@base_player:clone_location_unknown";
|
|
}
|
|
else if (dist < 1000)
|
|
{
|
|
text = "" + (int)dist + "m";
|
|
}
|
|
else
|
|
{
|
|
text = "" + (int)(dist / 1000.0f) + "km";
|
|
}
|
|
return text;
|
|
}
|
|
public int handleCloningDataUpdate(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id facilityId = params.getObjId("faciltyId");
|
|
location facilityLoc = params.getLocation("facilityLoc");
|
|
location spawnLoc = params.getLocation("spawnLoc");
|
|
String cloneName = params.getString("cloneName");
|
|
setObjVar(self, cloninglib.VAR_BIND_FACILITY, facilityId);
|
|
setObjVar(self, cloninglib.VAR_BIND_LOCATION, facilityLoc);
|
|
setObjVar(self, cloninglib.VAR_BIND_SPAWN_LOC, spawnLoc);
|
|
setObjVar(self, cloninglib.VAR_BIND_CITY_NAME, cloneName);
|
|
removeObjVar(self, cloninglib.VAR_BIND_FACILITY_TEMPLATE);
|
|
removeObjVar(self, cloninglib.VAR_BIND_FACILITY_CELL);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int clearRecentDeathScriptVar(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (utils.hasScriptVar(self, combat.DIED_RECENTLY))
|
|
{
|
|
utils.removeScriptVar(self, combat.DIED_RECENTLY);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleReviveExpirationMessage(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (!utils.hasScriptVar(self, pclib.VAR_SUI_CLONE))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int remaining_time = params.getInt("time");
|
|
int sui_id = params.getInt("sui");
|
|
int next_msg_time = 600;
|
|
int sui_var = utils.getIntScriptVar(self, pclib.VAR_SUI_CLONE);
|
|
if (sui_id != sui_var)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
prose_package pp = new prose_package();
|
|
pp = prose.setStringId(pp, new string_id("base_player", "revive_exp_msg"));
|
|
if (remaining_time <= 0)
|
|
{
|
|
sendSystemMessage(self, new string_id("base_player", "revive_expired"));
|
|
forceCloseSUIPage(sui_id);
|
|
if (space_dungeon.isCloningInstance(self))
|
|
{
|
|
space_dungeon.handleInstanceClone(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
location[] cloneLocs = utils.getLocationArrayScriptVar(self, pclib.VAR_REVIVE_CLONE);
|
|
location[] spawnLocs = utils.getLocationArrayScriptVar(self, pclib.VAR_REVIVE_SPAWN);
|
|
location clone = cloneLocs[0];
|
|
location spawn = spawnLocs[0];
|
|
if (!pclib.playerRevive(self, clone, spawn, 0))
|
|
{
|
|
messageTo(self, pclib.HANDLER_CLONE_RESPAWN, null, 1, true);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
else if (remaining_time <= 60)
|
|
{
|
|
pp = prose.setStringId(pp, new string_id("base_player", "revive_exp_msg_last"));
|
|
next_msg_time = remaining_time;
|
|
}
|
|
else if (remaining_time <= 300)
|
|
{
|
|
next_msg_time = 120;
|
|
}
|
|
else if (remaining_time <= 600)
|
|
{
|
|
next_msg_time = 300;
|
|
}
|
|
pp = prose.setTT(pp, player_structure.assembleTimeRemaining(player_structure.convertSecondsTime(remaining_time)));
|
|
sendSystemMessageProse(self, pp);
|
|
remaining_time -= next_msg_time;
|
|
dictionary d = new dictionary();
|
|
d.put("time", remaining_time);
|
|
d.put("sui", sui_id);
|
|
messageTo(self, "handleReviveExpirationMessage", d, next_msg_time, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleInstanceClonePause(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
String prompt = "@" + SID_INSTANCE_REVIVE;
|
|
String title = "@" + SID_INSTANCE_REVIVE_TITLE;
|
|
int pid = sui.msgbox(self, self, prompt, sui.OK_ONLY, title, "handleInstanceCloneSelection");
|
|
showSUIPage(pid);
|
|
utils.setScriptVar(self, pclib.VAR_SUI_CLONE, pid);
|
|
dictionary hrem = new dictionary();
|
|
hrem.put("time", healing.REVIVE_TIMER);
|
|
hrem.put("sui", pid);
|
|
messageTo(self, "handleReviveExpirationMessage", hrem, 0.0f, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleInstanceCloneSelection(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int posture = getPosture(self);
|
|
if (posture != POSTURE_DEAD)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
space_dungeon.handleInstanceClone(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int showReviveSUI(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (utils.hasScriptVar(self, "reviveSUI.pid"))
|
|
{
|
|
int oldpid = utils.getIntScriptVar(self, "reviveSUI.pid");
|
|
sui.closeSUI(self, oldpid);
|
|
utils.removeScriptVar(self, "reviveSUI.pid");
|
|
}
|
|
obj_id medic = params.getObjId("medic");
|
|
int weak = params.getInt("weak");
|
|
string_id reviveSUITitleSID = new string_id("spam", "revive_sui_title");
|
|
prose_package ppPrompt = new prose_package();
|
|
ppPrompt = prose.setStringId(ppPrompt, new string_id("spam", "revive_sui_prompt"));
|
|
ppPrompt = prose.setTT(ppPrompt, medic);
|
|
if (weak == 0)
|
|
{
|
|
reviveSUITitleSID = new string_id("spam", "revive_sui_title_weak");
|
|
ppPrompt = prose.setStringId(ppPrompt, new string_id("spam", "revive_sui_prompt_weak"));
|
|
}
|
|
String title = "@" + reviveSUITitleSID;
|
|
utils.setScriptVar(self, "reviveSUI.medic", medic);
|
|
utils.setScriptVar(self, "reviveSUI.weak", weak);
|
|
int pid = sui.msgbox(self, self, ppPrompt, sui.YES_NO, title, "handleReviveSUI");
|
|
utils.setScriptVar(self, "reviveSUI.pid", pid);
|
|
showSUIPage(pid);
|
|
params.put("pid", pid);
|
|
messageTo(self, "handleReviveSUITimeout", params, 120, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleReviveSUITimeout(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int pidThisMessageRefersToo = params.getInt("pid");
|
|
if (utils.hasScriptVar(self, "reviveSUI.pid"))
|
|
{
|
|
int storedPid = utils.getIntScriptVar(self, "reviveSUI.pid");
|
|
if (storedPid == pidThisMessageRefersToo)
|
|
{
|
|
sui.closeSUI(self, storedPid);
|
|
utils.removeScriptVar(self, "reviveSUI.pid");
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleReviveSUI(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int bp = sui.getIntButtonPressed(params);
|
|
obj_id medic = utils.getObjIdScriptVar(self, "reviveSUI.medic");
|
|
int weak = utils.getIntScriptVar(self, "reviveSUI.weak");
|
|
if (bp == sui.BP_OK)
|
|
{
|
|
pclib.clearEffectsForDeath(self);
|
|
int maxHealth = getWoundedMaxAttrib(self, HEALTH);
|
|
int maxAction = getWoundedMaxAttrib(self, ACTION);
|
|
int actionVal = weak * (maxAction / 2);
|
|
int toHeal = (maxHealth / 3) + 1;
|
|
if (weak == 0)
|
|
{
|
|
toHeal = (maxHealth / 10) + 1;
|
|
}
|
|
setAttrib(self, HEALTH, toHeal);
|
|
setAttrib(self, ACTION, actionVal);
|
|
setAttrib(self, MIND, 0);
|
|
utils.removeScriptVar(self, "reviveSUI.weak");
|
|
utils.removeScriptVar(self, "reviveSUI.pid");
|
|
messageTo(self, "handlePlayerResuscitated", null, 0, true);
|
|
}
|
|
else
|
|
{
|
|
prose_package pp = new prose_package();
|
|
pp = prose.setStringId(pp, new string_id("spam", "revive_attempt_denied"));
|
|
pp = prose.setTO(pp, self);
|
|
sendSystemMessageProse(medic, pp);
|
|
utils.removeScriptVar(self, "reviveSUI.weak");
|
|
utils.removeScriptVar(self, "reviveSUI.medic");
|
|
utils.removeScriptVar(self, "reviveSUI.pid");
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handlePlayerRevive(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (!utils.hasScriptVar(self, pclib.VAR_SUI_CLONE))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
utils.removeScriptVar(self, pclib.VAR_SUI_CLONE);
|
|
location clone = null;
|
|
location spawn = null;
|
|
int damage = cloninglib.CLONE_DAMAGE_HIGH;
|
|
int idx = -1;
|
|
int delayedClone = 0;
|
|
if (params != null)
|
|
{
|
|
idx = sui.getListboxSelectedRow(params);
|
|
if (idx > -1)
|
|
{
|
|
location[] cloneLocs = utils.getLocationArrayScriptVar(self, pclib.VAR_REVIVE_CLONE);
|
|
location[] spawnLocs = utils.getLocationArrayScriptVar(self, pclib.VAR_REVIVE_SPAWN);
|
|
clone = cloneLocs[idx];
|
|
spawn = spawnLocs[idx];
|
|
location deathLoc = getLocation(self);
|
|
region[] respawnRegions = getRegionsWithPvPAtPoint(deathLoc, regions.PVP_REGION_TYPE_ADVANCED);
|
|
if ((respawnRegions != null && respawnRegions.length > 0) || utils.hasScriptVar(self, "battlefield.active"))
|
|
{
|
|
delayedClone = 15;
|
|
utils.setScriptVar(self, "no_cloning_sickness", 1);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
sendSystemMessage(self, SID_CLONE_FAIL_SELECTION);
|
|
}
|
|
}
|
|
if (clone != null && clone.compareTo(new location()) != 0 && spawn != null && spawn.compareTo(new location()) != 0)
|
|
{
|
|
if (delayedClone > 0)
|
|
{
|
|
int gameTime = getGameTime();
|
|
int timeRemaining = delayedClone - (gameTime % delayedClone);
|
|
int pid = sui.countdownTimerSUI(self, self, "waitingToClone", new string_id("gcw", "static_base_waiting_to_clone"), (delayedClone - timeRemaining), delayedClone, "handleDelayedCloneCancel");
|
|
if (pid > -1)
|
|
{
|
|
dictionary d = new dictionary();
|
|
d.put("clone", clone);
|
|
d.put("spawn", spawn);
|
|
d.put("damage", damage);
|
|
d.put("id", pid);
|
|
messageTo(self, "handleDelayedClone", d, timeRemaining, true);
|
|
utils.setScriptVar(self, "waiting_to_clone", pid);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
else if (pclib.playerRevive(self, clone, spawn, 0))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
messageTo(self, pclib.HANDLER_PLAYER_DEATH, null, 0, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleDelayedClone(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (!utils.hasScriptVar(self, "waiting_to_clone"))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int pid = utils.getIntScriptVar(self, "waiting_to_clone");
|
|
int id = params.getInt("id");
|
|
if (pid != id)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
forceCloseSUIPage(pid);
|
|
location clone = params.getLocation("clone");
|
|
location spawn = params.getLocation("spawn");
|
|
int damage = params.getInt("damage");
|
|
if (clone != null && clone.compareTo(new location()) != 0 && spawn != null && spawn.compareTo(new location()) != 0)
|
|
{
|
|
pclib.playerRevive(self, clone, spawn, damage);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleDelayedCloneCancel(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (!utils.hasScriptVar(self, "waiting_to_clone"))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
utils.removeScriptVar(self, "waiting_to_clone");
|
|
messageTo(self, pclib.HANDLER_PLAYER_DEATH, null, 0.0f, true);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleCloneRespawn(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
utils.removeScriptVar(self, pclib.VAR_SUI_CLONE);
|
|
utils.removeScriptVar(self, pclib.VAR_REVIVE_OPTIONS);
|
|
utils.removeScriptVar(self, pclib.VAR_REVIVE_CLONE);
|
|
utils.removeScriptVar(self, pclib.VAR_REVIVE_SPAWN);
|
|
utils.removeScriptVar(self, "waitingOnCloneRespawn");
|
|
removeObjVar(self, pclib.VAR_BEEN_COUPDEGRACED);
|
|
pvpRemoveAllTempEnemyFlags(self);
|
|
int intGuildId = getGuildId(self);
|
|
if (intGuildId != 0)
|
|
{
|
|
int[] enemies_A_to_B = guildGetEnemies(intGuildId);
|
|
if (enemies_A_to_B != null && enemies_A_to_B.length > 0)
|
|
{
|
|
int[] enemies_B_to_A = getGuildsAtWarWith(intGuildId);
|
|
if (enemies_B_to_A != null && enemies_B_to_A.length > 0)
|
|
{
|
|
for (int i1 : enemies_A_to_B) {
|
|
if (guild.findIntTableOffset(enemies_B_to_A, i1) != -1) {
|
|
pvpSetGuildWarCoolDownPeriodEnemyFlag(self);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
pclib.checkCovertRespawn(self);
|
|
pclib.clearEffectsForDeath(self);
|
|
utils.removeScriptVar(self, "jedi.rankedDeath");
|
|
if (hasObjVar(self, "fullHealClone"))
|
|
{
|
|
removeObjVar(self, "fullHealClone");
|
|
healing.healClone(self, false);
|
|
}
|
|
else
|
|
{
|
|
healing.healClone(self, true);
|
|
}
|
|
setPosture(self, POSTURE_UPRIGHT);
|
|
utils.removeScriptVar(self, "pvp_death");
|
|
queueCommand(self, (-1465754503), self, "", COMMAND_PRIORITY_IMMEDIATE);
|
|
playClientEffectObj(self, "clienteffect/player_clone_compile.cef", self, null);
|
|
if (!utils.hasScriptVar(self, "no_cloning_sickness") && !instance.isInInstanceArea(self))
|
|
{
|
|
buff.applyBuff(self, "cloning_sickness");
|
|
}
|
|
else if (utils.hasScriptVar(self, "no_cloning_sickness"))
|
|
{
|
|
utils.removeScriptVar(self, "no_cloning_sickness");
|
|
}
|
|
if (0 == pvpGetAlignedFaction(self))
|
|
{
|
|
int currentMercenaryFaction = pvpNeutralGetMercenaryFaction(self);
|
|
if ((0 != currentMercenaryFaction) && pvpNeutralIsMercenaryDeclared(self))
|
|
{
|
|
pvpNeutralSetMercenaryFaction(self, currentMercenaryFaction, false);
|
|
}
|
|
}
|
|
CustomerServiceLog("Death", "(" + self + ") " + getName(self) + " has clone respawned at " + (getLocation(self)).toString());
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handlePlayerResuscitated(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int suiClone = utils.getIntScriptVar(self, pclib.VAR_SUI_CLONE);
|
|
LOG("resuscitate", "self = " + self + ": clone sui = " + suiClone);
|
|
if (suiClone > -1)
|
|
{
|
|
LOG("resuscitate", "attempting to force closure of clone sui: sui #" + suiClone);
|
|
forceCloseSUIPage(suiClone);
|
|
}
|
|
utils.removeScriptVar(self, pclib.VAR_SUI_CLONE);
|
|
utils.removeScriptVar(self, pclib.VAR_REVIVE_OPTIONS);
|
|
pvpRemoveAllTempEnemyFlags(self);
|
|
removeObjVar(self, pclib.VAR_BEEN_COUPDEGRACED);
|
|
obj_id medic = utils.getObjIdScriptVar(self, "reviveSUI.medic");
|
|
utils.removeScriptVar(self, "reviveSUI.medic");
|
|
if (isIdValid(medic))
|
|
{
|
|
prose_package pp = new prose_package();
|
|
pp = prose.setStringId(pp, healing.SID_PERFORM_REVIVE_SUCCESS);
|
|
pp = prose.setTT(pp, medic);
|
|
pp = prose.setTO(pp, self);
|
|
sendSystemMessageProse(medic, pp);
|
|
sendSystemMessageProse(self, pp);
|
|
}
|
|
else
|
|
{
|
|
sendSystemMessage(self, new string_id("healing", "perform_revive_success_self_only"));
|
|
}
|
|
if (hasObjVar(self, "outbreak.usedGate"))
|
|
{
|
|
buff.applyBuff(self, "death_troopers_no_vehicle");
|
|
}
|
|
setPosture(self, POSTURE_UPRIGHT);
|
|
utils.removeScriptVar(self, "pvp_death");
|
|
CustomerServiceLog("Death", "(" + self + ") " + getName(self) + " has been resuscitated at " + (getLocation(self)).toString());
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleReviveStand(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
setPosture(self, POSTURE_UPRIGHT);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleInstanceRessurect(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
pclib.resurrectPlayer(self, true);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleDecayReport(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
utils.removeScriptVarTree(self, "decayReport");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleRepairItems(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id[] repairList = params.getObjIdArray("items");
|
|
cloninglib.repairItems(self, repairList);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleChatPersistentMessage(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (params == null)
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
String from = params.getString("from");
|
|
if (from == null)
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
String subject = params.getString("subject");
|
|
if (subject == null)
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
String message = params.getString("message");
|
|
if (message == null)
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
String outOfBand = params.getString("outofband");
|
|
String avatarName = getChatName(self);
|
|
if (avatarName == null)
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
chatSendPersistentMessage(from, avatarName, subject, message, outOfBand);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int gmRevive(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
target = self;
|
|
params = toLower(params);
|
|
if (params.equals("-target"))
|
|
{
|
|
target = getLookAtTarget(self);
|
|
}
|
|
if (isIdValid(target))
|
|
{
|
|
obj_id targetCreature = null;
|
|
obj_id targetShip = null;
|
|
int got = getGameObjectType(target);
|
|
if (isGameObjectTypeOf(got, GOT_ship))
|
|
{
|
|
targetShip = target;
|
|
targetCreature = getShipPilot(target);
|
|
}
|
|
else if (isGameObjectTypeOf(got, GOT_creature))
|
|
{
|
|
targetShip = getPilotedShip(target);
|
|
targetCreature = target;
|
|
}
|
|
if (!isIdValid(targetShip) && !isIdValid(targetCreature))
|
|
{
|
|
sendSystemMessageTestingOnly(self, "The /gmRevive command may only be used on creature or ship type objects");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (isIdValid(targetShip))
|
|
{
|
|
space_crafting.repairDamage(targetCreature, targetShip, 1.0f, 0.0f);
|
|
if (isShipSlotInstalled(targetShip, ship_chassis_slot_type.SCST_shield_0))
|
|
{
|
|
setShipShieldHitpointsFrontCurrent(targetShip, getShipShieldHitpointsFrontMaximum(targetShip));
|
|
setShipShieldHitpointsBackCurrent(targetShip, getShipShieldHitpointsBackMaximum(targetShip));
|
|
}
|
|
if (isIdValid(targetCreature))
|
|
{
|
|
sendSystemMessageTestingOnly(targetCreature, "Ship Repaired.");
|
|
}
|
|
CustomerServiceLog("Death", "(" + targetShip + ") " + getName(targetShip) + " has been /gmRevive'd at " + (getLocation(self)).toString() + " by (" + self + ") " + getName(self));
|
|
}
|
|
if (isIdValid(targetCreature))
|
|
{
|
|
obj_id mountId = getMountId(targetCreature);
|
|
if (isIdValid(mountId))
|
|
{
|
|
utils.dismountRiderJetpackCheck(targetCreature);
|
|
}
|
|
if (pclib.resurrectPlayer(targetCreature))
|
|
{
|
|
sendSystemMessageTestingOnly(targetCreature, "You have been restored...");
|
|
if (isPlayer(targetCreature))
|
|
{
|
|
pclib.clearCombatData(targetCreature);
|
|
buff.removeAllBuffs(targetCreature, true);
|
|
removeObjVar(targetCreature, "combat.intIncapacitationCount");
|
|
setPosture(targetCreature, POSTURE_UPRIGHT);
|
|
queueCommand(targetCreature, (-1465754503), targetCreature, "", COMMAND_PRIORITY_IMMEDIATE);
|
|
queueCommand(targetCreature, (-562996732), targetCreature, "", COMMAND_PRIORITY_IMMEDIATE);
|
|
play2dNonLoopingSound(targetCreature, "sound/music_acq_healer.snd");
|
|
utils.removeScriptVar(targetCreature, "pvp_death");
|
|
sendSystemMessageTestingOnly(self, "You have /gmRevived " + getName(targetCreature));
|
|
}
|
|
}
|
|
}
|
|
CustomerServiceLog("Death", "(" + targetCreature + ") " + getName(targetCreature) + " has been /gmRevive'd at " + (getLocation(self)).toString() + " by (" + self + ") " + getName(self));
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdEat(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
if (!isIdValid(target) && exists(target))
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
consumable.consumeItem(self, target);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdUseSkillBuff(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
LOG("skillBuff", "cmdUseSkillBuff");
|
|
if (!isIdValid(target) && exists(target))
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
dictionary childparams = new dictionary();
|
|
childparams.put("player", self);
|
|
messageTo(target, "handleUseSkillBuff", childparams, 1.0f, true);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdTip(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
if ((params == null) || (params.equals("")))
|
|
{
|
|
showTipSyntax(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
location here = getLocation(self);
|
|
if (((here.area)).equals("tutorial"))
|
|
{
|
|
sendSystemMessageTestingOnly(self, "You cannot use this command from within the tutorial.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
CustomerServiceLog("Trade", "Tip Invoked -- Self: " + self + " Target: " + target + " Params: " + params);
|
|
if (params.equals("clear"))
|
|
{
|
|
CustomerServiceLog("Trade", " Tip -- Self: " + self + " " + getName(self) + " -- User requested tip data clear.");
|
|
sendSystemMessage(self, pclib.SID_TIP_CLEAR);
|
|
pclib.cleanupTipSui(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (utils.hasScriptVar(self, pclib.VAR_TIP_SUI))
|
|
{
|
|
int suiConfirm = utils.getIntScriptVar(self, pclib.VAR_TIP_SUI);
|
|
forceCloseSUIPage(suiConfirm);
|
|
obj_id oldTarget = utils.getObjIdScriptVar(self, pclib.VAR_TIP_TARGET);
|
|
if (isIdValid(oldTarget) && exists(oldTarget) && oldTarget.isLoaded())
|
|
{
|
|
prose_package tipAbort = prose.getPackage(pclib.PROSE_TIP_ABORT, oldTarget);
|
|
sendSystemMessageProse(self, tipAbort);
|
|
}
|
|
else
|
|
{
|
|
sendSystemMessage(self, pclib.SID_TIP_ABORT);
|
|
}
|
|
CustomerServiceLog("Trade", " Tip -- Self: " + self + " " + getName(self) + " -- Cancelled prior tip due to new tip attempt.");
|
|
pclib.cleanupTipSui(self);
|
|
}
|
|
if (target == self)
|
|
{
|
|
CustomerServiceLog("Trade", " Tip -- Self: " + self + " " + getName(self) + " -- Tip aborted: (target == self)");
|
|
sendSystemMessageTestingOnly(self, "You can't use yourself as a target for /tip!");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
boolean useCash = true;
|
|
if (params.contains("bank"))
|
|
{
|
|
params = gm.removeKeyword(params, "bank");
|
|
useCash = false;
|
|
}
|
|
java.util.StringTokenizer st = new java.util.StringTokenizer(params);
|
|
int amt = 0;
|
|
String name = null;
|
|
int cnt = st.countTokens();
|
|
switch (cnt)
|
|
{
|
|
case 1:
|
|
if (!isIdValid(target))
|
|
{
|
|
showTipSyntax(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
break;
|
|
case 2:
|
|
name = st.nextToken();
|
|
break;
|
|
default:
|
|
showTipSyntax(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
boolean areMoreTokens = st.hasMoreTokens();
|
|
if (areMoreTokens)
|
|
{
|
|
String sAmt = st.nextToken();
|
|
amt = utils.stringToInt(sAmt);
|
|
if (amt < 1)
|
|
{
|
|
prose_package invalidParam = prose.getPackage(pclib.PROSE_INVALID_TIP_PARAM, sAmt);
|
|
sendSystemMessageProse(self, invalidParam);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if ((name == null) || (name.equals("")))
|
|
{
|
|
pclib.giveTip(self, target, getName(target), amt, useCash);
|
|
}
|
|
else
|
|
{
|
|
obj_id playerId = getPlayerIdFromFirstName(name);
|
|
if (isIdValid(playerId))
|
|
{
|
|
pclib.giveTip(self, playerId, name, amt, useCash);
|
|
}
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdTipFail(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
sendSystemMessageTestingOnly(self, "/TIP command failed in command table...");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdCheckForceStatus(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleWireConfirm(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int bp = sui.getIntButtonPressed(params);
|
|
if (bp == sui.BP_CANCEL)
|
|
{
|
|
CustomerServiceLog("Trade", " Tip -- Player: " + self + " " + getName(self) + " -- Tip aborted: Bank-to-Bank transfer canceled by player's request.");
|
|
pclib.cleanupTipSui(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id target = utils.getObjIdScriptVar(self, pclib.VAR_TIP_TARGET);
|
|
if (!isIdValid(target))
|
|
{
|
|
sendSystemMessage(self, pclib.SID_TIP_ERROR);
|
|
CustomerServiceLog("Trade", " Tip -- Player: " + self + " " + getName(self) + " Target: " + target + " -- Tip aborted: Target was invalid after tip fee dialog was accepted.");
|
|
pclib.cleanupTipSui(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int amt = utils.getIntScriptVar(self, pclib.VAR_TIP_AMT);
|
|
int fee = (int)(amt * pclib.TIP_WIRE_SURCHARGE);
|
|
if (fee < 1)
|
|
{
|
|
fee = 1;
|
|
}
|
|
int total = amt + fee;
|
|
String targetName = utils.getStringScriptVar(self, pclib.VAR_TIP_TARGET_NAME);
|
|
if (getBankBalance(self) < total)
|
|
{
|
|
CustomerServiceLog("Trade", " Tip -- Player: " + self + " " + getName(self) + " Target: " + target + " -- Tip aborted: Player couldn't afford the wire fee.");
|
|
prose_package nsfWire = prose.getPackage(pclib.PROSE_TIP_NSF_WIRE, self, getName(self), null, target, targetName, null, null, null, null, total, 0.0f);
|
|
sendSystemMessageProse(self, nsfWire);
|
|
}
|
|
else
|
|
{
|
|
dictionary d = new dictionary();
|
|
d.put("target", target);
|
|
d.put("amt", amt);
|
|
d.put("useCash", false);
|
|
d.put("targetName", targetName);
|
|
CustomerServiceLog("Trade", " Tip -- Player: " + self + " " + getName(self) + " Target: " + target + " -- Transferring wire bank money to escrow account! Amt: " + amt);
|
|
transferBankCreditsToNamedAccount(self, money.ACCT_TIP_ESCROW, amt, "handleTipSuccess", "handleTipFail", d);
|
|
if (utils.isFreeTrial(self, target))
|
|
{
|
|
pclib.doTipLogging(self, target, amt);
|
|
}
|
|
CustomerServiceLog("Trade", " Tip -- Player: " + self + " " + getName(self) + " Target: " + target + " -- Transferring wire bank fee to surcharge account! Amt: " + fee);
|
|
transferBankCreditsToNamedAccount(self, money.ACCT_TIP_SURCHARGE, fee, "noHandler", "noHandler", d);
|
|
utils.moneyOutMetric(self, money.ACCT_TIP_SURCHARGE, fee);
|
|
}
|
|
pclib.cleanupTipSui(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleTipSuccess(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
String myName = getName(self);
|
|
obj_id po = getPlayerObject(self);
|
|
CustomerServiceLog("Trade", " Tip -- Player: " + self + " " + getName(self) + " -- Handling a successful transfer.");
|
|
obj_id target = params.getObjId("target");
|
|
if (params == null || params.isEmpty() || !isIdValid(target))
|
|
{
|
|
CustomerServiceLog("Trade", " Tip -- Player: " + self + " " + getName(self) + " -- Error! Can't handle successful tip transfer! The target data is invalid.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int amt = params.getInt("amt");
|
|
boolean useCash = params.getBoolean("useCash");
|
|
String targetName = params.getString("targetName");
|
|
params.put("actor", self);
|
|
params.put("actorName", myName);
|
|
obj_id tpo = getPlayerObject(target);
|
|
if (useCash)
|
|
{
|
|
prose_package toSelf = prose.getPackage(pclib.PROSE_TIP_PASS_SELF, target, amt);
|
|
sendSystemMessageProse(self, toSelf);
|
|
prose_package toTarget = prose.getPackage(pclib.PROSE_TIP_PASS_TARGET, self, amt);
|
|
sendSystemMessageProse(target, toTarget);
|
|
CustomerServiceLog("Trade", " Tip -- Player: " + self + " " + getName(self) + " Target: " + target + " " + getName(target) + " -- Cash tip transfer successfully completed. Amt: " + amt);
|
|
}
|
|
else
|
|
{
|
|
CustomerServiceLog("Trade", " Tip -- Player: " + self + " " + getName(self) + " Target: " + target + " " + getName(target) + " -- Bank->Escrow wire transfer complete. Telling target to request escrow funds. Amt: " + amt);
|
|
messageTo(target, "handleTipEscrowRequest", params, 1.0f, true);
|
|
prose_package bankToEscrow = prose.getPackage(new string_id("base_player", "bank_to_escrow"), targetName, amt);
|
|
sendSystemMessageProse(self, bankToEscrow);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleTipEscrowRequest(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int amt = params.getInt("amt");
|
|
obj_id player = params.getObjId("actor");
|
|
String playerName = params.getString("actorName");
|
|
CustomerServiceLog("Trade", " Tip -- Player: " + player + " " + playerName + " Target: " + self + " " + getName(self) + " -- Target is now requesting funds from the escrow account. Amt: " + amt);
|
|
if (amt >= 1 && amt <= 1000000)
|
|
{
|
|
boolean success = transferBankCreditsFromNamedAccount(money.ACCT_TIP_ESCROW, self, amt, "handleTipEscrowPass", "handleTipEscrowFail", params);
|
|
if (!success)
|
|
{
|
|
CustomerServiceLog("Trade", " Tip -- Player: " + player + " " + playerName + " Target: " + self + " -- Tip aborted: Unable to transfer money from bank to escrow. Amt: " + amt);
|
|
refundEscrow(player, playerName, self, getName(self), amt);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
CustomerServiceLog("Trade", " Tip -- Player: " + player + " " + playerName + " Target: " + self + " " + getName(self) + " -- Target was unable to request tip funds from escrow because the amount is invalid! Amt: " + amt);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleTipEscrowPass(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id actor = params.getObjId("actor");
|
|
String actorName = params.getString("actorName");
|
|
obj_id target = params.getObjId("target");
|
|
String targetName = params.getString("targetName");
|
|
if (!isIdValid(actor) || !isIdValid(target) || targetName == null || actorName == null)
|
|
{
|
|
CustomerServiceLog("Trade", " Tip -- Player: " + actor + " " + actorName + " Target: " + target + " " + getName(target) + " -- Unable to handle successful transfer Escrow->Bank because of bad parameters.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int amt = params.getInt("amt");
|
|
boolean useCash = params.getBoolean("useCash");
|
|
CustomerServiceLog("Trade", " Tip -- Player: " + actor + " " + actorName + " Target: " + target + " " + getName(target) + " -- Target successfully withdrew the money from escrow. Wire transfer complete. Amt: " + amt);
|
|
prose_package bodyToTarget = prose.getPackage(pclib.PROSE_WIRE_MAIL_TARGET, actorName, amt);
|
|
utils.sendMail(pclib.SID_WIRE_MAIL_SUBJECT, bodyToTarget, targetName, "@money/acct_n:bank");
|
|
prose_package bodyToSelf = prose.getPackage(pclib.PROSE_WIRE_MAIL_SELF, targetName, amt);
|
|
utils.sendMail(pclib.SID_WIRE_MAIL_SUBJECT, bodyToSelf, actorName, targetName);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleTipEscrowFail(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id actor = params.getObjId("actor");
|
|
String actorName = params.getString("actorName");
|
|
obj_id target = params.getObjId("target");
|
|
String targetName = params.getString("targetName");
|
|
if (!isIdValid(actor) || !isIdValid(target) || targetName == null || actorName == null)
|
|
{
|
|
CustomerServiceLog("Trade", " Tip -- Player: " + actor + " " + actorName + " Target: " + target + " " + getName(target) + " -- Unable to handle FAILED transfer Escrow->Bank because of bad parameters.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int amt = params.getInt("amt");
|
|
boolean useCash = params.getBoolean("useCash");
|
|
CustomerServiceLog("Trade", " Tip -- Player: " + actor + " " + actorName + " Target: " + target + " " + getName(target) + " -- Target failed to withdraw the money from escrow! Wire transfer FAILED! Attempting to refund. Amt: " + amt);
|
|
prose_package escrowFailed = prose.getPackage(new string_id("base_player", "escrow_withdraw_failed"), actorName, amt);
|
|
utils.sendMail(pclib.SID_WIRE_MAIL_SUBJECT, escrowFailed, targetName, actorName);
|
|
refundEscrow(actor, actorName, target, targetName, amt);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public void refundEscrow(obj_id player, String playerName, obj_id target, String targetName, int amt) throws InterruptedException
|
|
{
|
|
dictionary params = new dictionary();
|
|
params.put("player", player);
|
|
params.put("playerName", playerName);
|
|
params.put("target", target);
|
|
params.put("targetName", targetName);
|
|
params.put("amt", amt);
|
|
messageTo(player, "handleTipRefundRequest", params, 1.0f, true);
|
|
}
|
|
public int handleTipRefundRequest(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id player = params.getObjId("player");
|
|
String playerName = params.getString("playerName");
|
|
obj_id target = params.getObjId("target");
|
|
String targetName = params.getString("targetName");
|
|
int amt = params.getInt("amt");
|
|
if (amt < 1 || amt > 1000000)
|
|
{
|
|
CustomerServiceLog("Trade", " Tip -- Player: " + player + " " + playerName + " Target: " + target + " " + targetName + " -- Unable to refund escrow because the amount is invalid! Amt:" + amt);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
boolean success = transferBankCreditsFromNamedAccount(money.ACCT_TIP_ESCROW, player, amt, "handleTipRefundPass", "handleTipRefundFail", params);
|
|
CustomerServiceLog("Trade", " Tip -- Player: " + player + " " + playerName + " Target: " + target + " " + targetName + " -- Calling transferBankCreditsFromNamedAccount to transfer refund from escrow. Amt:" + amt);
|
|
if (!success)
|
|
{
|
|
CustomerServiceLog("Trade", " Tip -- Player: " + player + " " + playerName + " Target: " + target + " " + targetName + " -- transferBankCreditsFromNamedAccount failed immediately while attempting to refund escrow! Amt:" + amt);
|
|
notifyFailedRefund(player, playerName, target, targetName, amt);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleTipRefundPass(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id player = params.getObjId("player");
|
|
String playerName = params.getString("playerName");
|
|
obj_id target = params.getObjId("target");
|
|
String targetName = params.getString("targetName");
|
|
int amt = params.getInt("amt");
|
|
prose_package refundToSelf = prose.getPackage(new string_id("base_player", "received_escrow_refund"), targetName, amt);
|
|
utils.sendMail(pclib.SID_WIRE_MAIL_SUBJECT, refundToSelf, playerName, targetName);
|
|
CustomerServiceLog("Trade", " Tip -- Player: " + player + " " + playerName + " Target: " + target + " " + targetName + " -- Refund successfully delivered. Amt:" + amt);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleTipRefundFail(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id player = params.getObjId("player");
|
|
String playerName = params.getString("playerName");
|
|
obj_id target = params.getObjId("target");
|
|
String targetName = params.getString("targetName");
|
|
int amt = params.getInt("amt");
|
|
notifyFailedRefund(player, playerName, target, targetName, amt);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public void notifyFailedRefund(obj_id player, String playerName, obj_id target, String targetName, int amt) throws InterruptedException
|
|
{
|
|
CustomerServiceLog("Trade", " Tip -- Player: " + player + " " + playerName + " Target: " + target + " " + targetName + " -- Failed to refund player from escrow account! Amt:" + amt);
|
|
prose_package refundToSelf = prose.getPackage(new string_id("base_player", "failed_escrow_refund"), targetName, amt);
|
|
utils.sendMail(pclib.SID_WIRE_MAIL_SUBJECT, refundToSelf, playerName, targetName);
|
|
}
|
|
public int handleTipFail(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
CustomerServiceLog("Trade", " Tip -- Player: " + self + " " + getName(self) + " -- Tip cash transfer or bank wire escrow transfer failed!");
|
|
utils.removeScriptVar(self, pclib.VAR_TIP_SUI);
|
|
utils.removeScriptVar(self, pclib.VAR_TIP_TARGET);
|
|
utils.removeScriptVar(self, pclib.VAR_TIP_AMT);
|
|
obj_id target = params.getObjId("target");
|
|
if (!isIdValid(target))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!exists(target) || !target.isLoaded())
|
|
{
|
|
sendSystemMessage(self, pclib.SID_TIP_ERROR);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int amt = params.getInt("amt");
|
|
boolean useCash = params.getBoolean("useCash");
|
|
if (useCash)
|
|
{
|
|
CustomerServiceLog("Trade", " Tip -- Player: " + self + " " + getName(self) + " Target: " + target + " " + getName(target) + " -- Cash transfer failed in transferCashTo! Amt: " + amt);
|
|
prose_package nsfCash = prose.getPackage(pclib.PROSE_TIP_NSF_CASH, target, amt);
|
|
sendSystemMessageProse(self, nsfCash);
|
|
}
|
|
else
|
|
{
|
|
CustomerServiceLog("Trade", " Tip -- Player: " + self + " " + getName(self) + " Target: " + target + " " + getName(target) + " -- Bank->Escrow transfer failed in transferBankCreditsToNamedAccount! Amt: " + amt);
|
|
prose_package nsfBank = prose.getPackage(pclib.PROSE_TIP_NSF_BANK, target, amt);
|
|
sendSystemMessageProse(self, nsfBank);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public void showTipSyntax(obj_id self) throws InterruptedException
|
|
{
|
|
sendSystemMessage(self, pclib.SID_TIP_SYNTAX);
|
|
}
|
|
public int cmdOpenFail(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
if (!isIdValid(target))
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
prose_package pp = prose.getPackage(SID_CMD_OPEN_FAIL, target);
|
|
sendSystemMessageProse(self, pp);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdLoot(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
obj_id player = self;
|
|
if (!isIdValid(target))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!isMob(target))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!isIncapacitated(target))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (isIncapacitated(self))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (pet_lib.isPet(target))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int got = getGameObjectType(target);
|
|
if (got == GOT_corpse)
|
|
{
|
|
queueCommand(self, (1421655546), target, "", COMMAND_PRIORITY_DEFAULT);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (isMob(target) && !isPlayer(target))
|
|
{
|
|
if (group.isGrouped(self))
|
|
{
|
|
obj_id team = getGroupObject(self);
|
|
int lootRule = getGroupLootRule(team);
|
|
if (lootRule == 3)
|
|
{
|
|
if (hasObjVar(target, "autoLootComplete"))
|
|
{
|
|
obj_id corpseInv = utils.getInventoryContainer(target);
|
|
queueCommand(player, (1880585606), corpseInv, "", COMMAND_PRIORITY_DEFAULT);
|
|
}
|
|
obj_id[] objMembersWhoExist = utils.getLocalGroupMemberIds(team);
|
|
int teamNumber = objMembersWhoExist.length;
|
|
if (teamNumber > 0)
|
|
{
|
|
int which = rand(0, teamNumber - 1);
|
|
player = objMembersWhoExist[which];
|
|
}
|
|
}
|
|
if (loot.doGroupLootAllCheck(self, target))
|
|
{
|
|
loot.lootAiCorpse(player, target);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
loot.lootAiCorpse(self, target);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdLootPlayer(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
if (!isIdValid(target))
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
if (!utils.isOwner(target, self) && !isGod(self))
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
int got = getGameObjectType(target);
|
|
if (got != GOT_corpse)
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
corpse.lootPlayerCorpse(self, target);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdActivateClone(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
if (params.equals("now"))
|
|
{
|
|
if (isGod(self))
|
|
{
|
|
if (utils.hasScriptVar(self, pclib.VAR_SUI_CLONE))
|
|
{
|
|
int cloneSui = utils.getIntScriptVar(self, pclib.VAR_SUI_CLONE);
|
|
utils.removeScriptVar(self, pclib.VAR_SUI_CLONE);
|
|
forceCloseSUIPage(cloneSui);
|
|
}
|
|
if (!pclib.playerRevive(self))
|
|
{
|
|
sendSystemMessageTestingOnly(self, "You may only use this command to force a clone spawn if you are dead.");
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
if (utils.hasScriptVar(self, pclib.VAR_SUI_CLONE))
|
|
{
|
|
sendSystemMessageTestingOnly(self, "You already have a cloning options menu open!");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!isDead(self))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
messageTo(self, pclib.HANDLER_PLAYER_DEATH, null, 0, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdActivateCloneFail(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
sendSystemMessageTestingOnly(self, "You may only use this command to activate the cloning options menu if you are dead.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdSetBind(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
if (!isIdValid(target))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int got = getGameObjectType(target);
|
|
if (got != GOT_terminal_cloning)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
cloninglib.requestBind(self, target);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public boolean canDeathBlow(obj_id killer, obj_id victim) throws InterruptedException
|
|
{
|
|
if ((!isIdValid(victim)) || (!isPlayer(victim)))
|
|
{
|
|
debugServerConsoleMsg(killer, "cmdCoupDeGrace: (" + victim + ")target is not player or is not incapacitated!!");
|
|
combat.sendCombatSpamMessage(killer, new string_id("cbt_spam", "invalid_target"));
|
|
showFlyTextPrivate(killer, killer, new string_id("combat_effects", "target_invalid_fly"), 1.5f, colors.WHITE);
|
|
return false;
|
|
}
|
|
if (!pvpCanAttack(killer, victim))
|
|
{
|
|
showFlyTextPrivate(killer, killer, new string_id("combat_effects", "target_invalid_fly"), 1.5f, colors.WHITE);
|
|
combat.sendCombatSpamMessage(killer, new string_id("cbt_spam", "invalid_pvp_target"));
|
|
return false;
|
|
}
|
|
if (isIncapacitated(victim))
|
|
{
|
|
if (hasObjVar(victim, pclib.VAR_BEEN_COUPDEGRACED))
|
|
{
|
|
combat.sendCombatSpamMessage(killer, new string_id("cbt_spam", "invalid_target"));
|
|
showFlyTextPrivate(killer, killer, new string_id("combat_effects", "target_invalid_fly"), 1.5f, colors.WHITE);
|
|
return false;
|
|
}
|
|
location myPos = getLocation(killer);
|
|
location targetPos = getLocation(victim);
|
|
if (myPos != null && targetPos != null)
|
|
{
|
|
float distance = myPos.distance(targetPos);
|
|
float maxDistance = getCommandMaxRange((1917386623));
|
|
debugServerConsoleMsg(null, "Deathblow distance to target ");
|
|
if (distance < maxDistance)
|
|
{
|
|
stealth.checkForAndMakeVisibleNoRecourse(killer);
|
|
if (isIncapacitated(killer) || isDead(killer))
|
|
{
|
|
return false;
|
|
}
|
|
if (getState(killer, STATE_FEIGN_DEATH) == 1)
|
|
{
|
|
return false;
|
|
}
|
|
int killerPosture = getPosture(killer);
|
|
if (killerPosture == POSTURE_KNOCKED_DOWN)
|
|
{
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
showFlyTextPrivate(killer, killer, new string_id("combat_effects", "range_too_far"), 1.5f, colors.MEDIUMTURQUOISE);
|
|
combat.sendCombatSpamMessage(killer, new string_id("cbt_spam", "out_of_range_far"), COMBAT_RESULT_OUT_OF_RANGE);
|
|
CustomerServiceLog("Pvp", "Player %TU received deathblow message for target %TT, but has moved too " + "far away (" + distance + ")", killer, victim);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
combat.sendCombatSpamMessage(killer, new string_id("cbt_spam", "invalid_target"));
|
|
showFlyTextPrivate(killer, killer, new string_id("combat_effects", "target_invalid_fly"), 1.5f, colors.WHITE);
|
|
CustomerServiceLog("Pvp", "Player %TU received deathblow message for target %TT, but we could " + "not get the player's positions", killer, victim);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
combat.sendCombatSpamMessage(killer, new string_id("cbt_spam", "invalid_target"));
|
|
showFlyTextPrivate(killer, killer, new string_id("combat_effects", "target_invalid_fly"), 1.5f, colors.WHITE);
|
|
}
|
|
return false;
|
|
}
|
|
public int cmdCoupDeGrace(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
if (canDeathBlow(self, target))
|
|
{
|
|
pclib.coupDeGrace(target, self);
|
|
}
|
|
else
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleCoupDeGrace(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (utils.hasScriptVar(self, COUPE_DE_GRACE_TARGET))
|
|
{
|
|
obj_id target = utils.getObjIdScriptVar(self, COUPE_DE_GRACE_TARGET);
|
|
utils.removeScriptVar(self, COUPE_DE_GRACE_TARGET);
|
|
debugServerConsoleMsg(null, "Performing deathblow on " + target);
|
|
if (isIdValid(target))
|
|
{
|
|
if (isIncapacitated(target))
|
|
{
|
|
location myPos = getLocation(self);
|
|
location targetPos = getLocation(target);
|
|
if (myPos != null && targetPos != null)
|
|
{
|
|
float distance = myPos.distance(targetPos);
|
|
float maxDistance = getCommandMaxRange((1917386623));
|
|
debugServerConsoleMsg(null, "Deathblow distance to target ");
|
|
if (distance < maxDistance)
|
|
{
|
|
CustomerServiceLog("Pvp", "Player %TU received deathblow message for target %TT, and is performing the blow");
|
|
pclib.coupDeGrace(target, self);
|
|
}
|
|
else
|
|
{
|
|
CustomerServiceLog("Pvp", "Player %TU received deathblow message for target %TT, but has moved too " + "far away (" + distance + ")", self, target);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
CustomerServiceLog("Pvp", "Player %TU received deathblow message for target %TT, but we could " + "not get the player's positions", self, target);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
CustomerServiceLog("Pvp", "Player %TU received deathblow message, but target %TT is no longer incapped ", self, target);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
CustomerServiceLog("Pvp", "Player %TU received deathblow message, but has invalid deathblow scriptvar " + target, self);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
CustomerServiceLog("Pvp", "Player %TU received deathblow message, but has no deathblow scriptvar ", self);
|
|
}
|
|
if (!isIncapacitated(self))
|
|
{
|
|
setCount(self, 0);
|
|
}
|
|
setState(self, STATE_PERFORM_DEATHBLOW, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdCorpse(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
queueCommand(self, (-304150016), target, "", COMMAND_PRIORITY_DEFAULT);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdConsent(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
if (params.equals(""))
|
|
{
|
|
target = getLookAtTarget(self);
|
|
if (isIdValid(target) && isPlayer(target))
|
|
{
|
|
pclib.consent(self, target);
|
|
}
|
|
else
|
|
{
|
|
if (hasObjVar(self, pclib.VAR_CONSENT_TO_ID))
|
|
{
|
|
obj_id[] consentTo = getObjIdArrayObjVar(self, pclib.VAR_CONSENT_TO_ID);
|
|
if ((consentTo == null) || (consentTo.length == 0))
|
|
{
|
|
sendSystemMessage(self, SID_CONSENT_TO_EMPTY);
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
Vector consentToName = new Vector();
|
|
consentToName.setSize(0);
|
|
for (obj_id consentTo1 : consentTo) {
|
|
consentToName = utils.addElement(consentToName, getPlayerFullName(consentTo1));
|
|
}
|
|
sui.listbox(self, "@" + SID_CONSENT_TO_LISTBOX_PROMPT, "@" + SID_CONSENT_TO_LISTBOX_TITLE, consentToName);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
sendSystemMessage(self, SID_CONSENT_TO_EMPTY);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (params.startsWith(">"))
|
|
{
|
|
java.util.StringTokenizer st = new java.util.StringTokenizer(params);
|
|
params = params.substring(1);
|
|
}
|
|
if (params.indexOf(",") > 0)
|
|
{
|
|
java.util.StringTokenizer st = new java.util.StringTokenizer(params);
|
|
do
|
|
{
|
|
String arg = st.nextToken();
|
|
if (arg.startsWith(">"))
|
|
{
|
|
arg = arg.substring(1);
|
|
}
|
|
obj_id playerId = getPlayerIdFromFirstName(arg);
|
|
if (isIdValid(playerId))
|
|
{
|
|
pclib.consent(self, playerId);
|
|
}
|
|
} while (st.hasMoreTokens());
|
|
}
|
|
else
|
|
{
|
|
obj_id playerId = getPlayerIdFromFirstName(params);
|
|
if (isIdValid(playerId))
|
|
{
|
|
pclib.consent(self, playerId);
|
|
}
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdUnconsent(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
if (params.equals(""))
|
|
{
|
|
target = getLookAtTarget(self);
|
|
if (isIdValid(target) && isPlayer(target))
|
|
{
|
|
pclib.unconsent(self, target);
|
|
}
|
|
else
|
|
{
|
|
if (hasObjVar(self, pclib.VAR_CONSENT_TO_ID))
|
|
{
|
|
obj_id[] consentTo = getObjIdArrayObjVar(self, pclib.VAR_CONSENT_TO_ID);
|
|
if ((consentTo == null) || (consentTo.length == 0))
|
|
{
|
|
sendSystemMessage(self, SID_CONSENT_TO_EMPTY);
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
Vector consentToName = new Vector();
|
|
consentToName.setSize(0);
|
|
for (obj_id consentTo1 : consentTo) {
|
|
consentToName = utils.addElement(consentToName, getPlayerFullName(consentTo1));
|
|
}
|
|
sui.listbox(self, self, "@" + SID_UNCONSENT_LISTBOX_PROMPT, sui.OK_CANCEL, "@" + SID_UNCONSENT_LISTBOX_TITLE, consentToName, HANDLER_UNCONSENT_MENU);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
sendSystemMessage(self, SID_CONSENT_TO_EMPTY);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (params.startsWith(">"))
|
|
{
|
|
params = params.substring(1);
|
|
}
|
|
if (params.indexOf(",") > 0)
|
|
{
|
|
java.util.StringTokenizer st = new java.util.StringTokenizer(params);
|
|
do
|
|
{
|
|
String arg = st.nextToken();
|
|
if (arg.startsWith(">"))
|
|
{
|
|
arg = arg.substring(1);
|
|
}
|
|
obj_id playerId = getPlayerIdFromFirstName(arg);
|
|
if (isIdValid(playerId))
|
|
{
|
|
pclib.unconsent(self, playerId);
|
|
}
|
|
} while (st.hasMoreTokens());
|
|
}
|
|
else
|
|
{
|
|
obj_id playerId = getPlayerIdFromFirstName(params);
|
|
if (isIdValid(playerId))
|
|
{
|
|
pclib.unconsent(self, playerId);
|
|
}
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdHaveConsent(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
if (params.equals(""))
|
|
{
|
|
target = getLookAtTarget(self);
|
|
if (isIdValid(target) && isPlayer(target))
|
|
{
|
|
pclib.hasConsent(self, target, true);
|
|
}
|
|
else
|
|
{
|
|
if (hasObjVar(self, pclib.VAR_CONSENT_FROM_ID))
|
|
{
|
|
obj_id[] consentFrom = getObjIdArrayObjVar(self, pclib.VAR_CONSENT_FROM_ID);
|
|
if ((consentFrom == null) || (consentFrom.length == 0))
|
|
{
|
|
sendSystemMessage(self, SID_CONSENT_TO_EMPTY);
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
Vector consentFromName = new Vector();
|
|
consentFromName.setSize(0);
|
|
for (obj_id obj_id : consentFrom) {
|
|
consentFromName = utils.addElement(consentFromName, getPlayerFullName(obj_id));
|
|
}
|
|
sui.listbox(self, "@" + SID_CONSENT_FROM_LISTBOX_PROMPT, "@" + SID_CONSENT_FROM_LISTBOX_TITLE, consentFromName);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
sendSystemMessage(self, SID_CONSENT_FROM_EMPTY);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (params.startsWith(">"))
|
|
{
|
|
java.util.StringTokenizer st = new java.util.StringTokenizer(params);
|
|
params = params.substring(1);
|
|
}
|
|
if (params.indexOf(",") > 0)
|
|
{
|
|
java.util.StringTokenizer st = new java.util.StringTokenizer(params);
|
|
do
|
|
{
|
|
String arg = st.nextToken();
|
|
if (arg.startsWith(">"))
|
|
{
|
|
arg = arg.substring(1);
|
|
}
|
|
obj_id playerId = getPlayerIdFromFirstName(arg);
|
|
if (isIdValid(playerId))
|
|
{
|
|
pclib.hasConsent(self, playerId, true);
|
|
}
|
|
} while (st.hasMoreTokens());
|
|
}
|
|
else
|
|
{
|
|
obj_id playerId = getPlayerIdFromFirstName(params);
|
|
if (isIdValid(playerId))
|
|
{
|
|
pclib.hasConsent(self, playerId, true);
|
|
}
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int startTraceLogging(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
enableTraceLogging();
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int stopTraceLogging(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
disableTraceLogging();
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int createCreature(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
String strCreatureType = params;
|
|
location locSpawnLocation = getLocation(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int createNPC(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
String strNPCType = params;
|
|
location locSpawnLocation = getLocation(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdStartLogout(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
if (!hasScript(self, "player.player_logout"))
|
|
{
|
|
attachScript(self, "player.player_logout");
|
|
dictionary d = new dictionary();
|
|
if (isGod(self))
|
|
{
|
|
d.put("timeLeft", 1);
|
|
}
|
|
else
|
|
{
|
|
d.put("timeLeft", LOGOUT_TIME);
|
|
}
|
|
d.put("countInterval", LOGOUT_COUNT_INTERVAL);
|
|
messageTo(self, "OnLogoutPulse", d, 0.1f, false);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int maskscent(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int failMaskscent(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int milkCreature(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
obj_id playerCurrentMount = getMountId(self);
|
|
obj_id intendedTarget = getIntendedTarget(self);
|
|
obj_id lookAtTarget = getLookAtTarget(self);
|
|
String milkType_lookAt = ai_lib.getMilkType(lookAtTarget);
|
|
String milkType_intended = ai_lib.getMilkType(intendedTarget);
|
|
if (milkType_lookAt != null && !milkType_lookAt.equals("none"))
|
|
{
|
|
target = lookAtTarget;
|
|
}
|
|
else if (milkType_intended != null && !milkType_intended.equals("none"))
|
|
{
|
|
target = intendedTarget;
|
|
}
|
|
else if (!isIdValid(lookAtTarget) && !isIdValid(intendedTarget))
|
|
{
|
|
sendSystemMessage(self, MILK_NO_TARGET);
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
else
|
|
{
|
|
sendSystemMessage(self, SID_NO_ALLOW_MILK);
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
if (vehicle.isVehicle(target) || (ai_lib.aiGetNiche(target) == NICHE_DROID) || (ai_lib.aiGetNiche(target) == NICHE_ANDROID))
|
|
{
|
|
sendSystemMessage(self, SID_NO_ALLOW_MILK);
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
if (isIdValid(playerCurrentMount))
|
|
{
|
|
sendSystemMessage(self, SID_CANT_MILK_MOUNTED);
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
if (pet_lib.isPet(target))
|
|
{
|
|
sendSystemMessage(self, SID_CANT_MILK);
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
float distStart = utils.getDistance2D(self, target);
|
|
if ((distStart < -3) || (distStart > 3))
|
|
{
|
|
sendSystemMessage(self, MILK_TOO_FAR_START);
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
if (!ai_lib.isAiDead(target) && !hasScript(target, "ai.pet_advance") && !ai_lib.isInCombat(target))
|
|
{
|
|
dictionary dict = new dictionary();
|
|
dict.put("player", self);
|
|
messageTo(target, "attemptMilkHandler", dict, 0, false);
|
|
}
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
public int searchLair(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
obj_id intendedTarget = getIntendedTarget(self);
|
|
obj_id lookAtTarget = getLookAtTarget(self);
|
|
int GOT_type_intended = getGameObjectType(intendedTarget);
|
|
int GOT_type_look = getGameObjectType(lookAtTarget);
|
|
if (GOT_type_intended == GOT_lair)
|
|
{
|
|
target = intendedTarget;
|
|
}
|
|
else if (GOT_type_look == GOT_lair)
|
|
{
|
|
target = lookAtTarget;
|
|
}
|
|
else
|
|
{
|
|
sendSystemMessage(self, LAIR_NOT_TARGETED);
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
float maxDistance = 10.0f;
|
|
float distanceToLair = utils.getDistance2D(self, target);
|
|
if (hasScript(target, "theme_park.dungeon.mustafar_trials.valley_battleground.battlefield_destructable"))
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
if (distanceToLair > maxDistance)
|
|
{
|
|
sendSystemMessage(self, TOO_FAR_FROM_LAIR);
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
else
|
|
{
|
|
if (!utils.hasScriptVar(target, "lair.searched") && !isIncapacitated(self))
|
|
{
|
|
collection.collectionResource(self, "egg");
|
|
dictionary dict = new dictionary();
|
|
dict.put("player", self);
|
|
messageTo(target, "searchLair", dict, 0, false);
|
|
}
|
|
else
|
|
{
|
|
sendSystemMessage(self, SID_FOUND_NOTHING);
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int removeScentMask(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int scentMasked = getState(self, STATE_MASK_SCENT);
|
|
if (scentMasked == 0)
|
|
{
|
|
buff.removeBuff(self, "mask_scent");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int scount = params.getInt("count");
|
|
int count = utils.getIntScriptVar(self, "scentmask.count");
|
|
if (count != scount)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
setState(self, STATE_MASK_SCENT, false);
|
|
buff.removeBuff(self, "mask_scent");
|
|
sendSystemMessage(self, SID_SYS_SCENTMASK_STOP);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int removeScentMaskNoNotify(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int concealEnable(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int failConceal(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int removeConceal(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public boolean itemIsRare(obj_id self, int skillMod) throws InterruptedException
|
|
{
|
|
boolean rare = false;
|
|
if (skillMod >= 65)
|
|
{
|
|
int difficultyCheck = (skillMod - 50) + 30;
|
|
int dieRoll = rand(1, 100);
|
|
if (dieRoll > difficultyCheck)
|
|
{
|
|
dieRoll = rand(1, 4);
|
|
if (dieRoll == 1)
|
|
{
|
|
rare = true;
|
|
}
|
|
}
|
|
}
|
|
return rare;
|
|
}
|
|
public int sysGroup(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
if (hasSkill(self, "class_officer_phase1_master"))
|
|
{
|
|
squad_leader.sendSquadLeaderCommand(self, params);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int groupWaypoint(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
if (hasSkill(self, "class_officer_phase1_master"))
|
|
{
|
|
if (params.equals("a") || params.equals("c"))
|
|
{
|
|
squad_leader.sendSquadWaypoint(self, getLocation(self));
|
|
}
|
|
else
|
|
{
|
|
location wayLoc = combat.getCommandGroundTargetLocation(params);
|
|
squad_leader.sendSquadWaypoint(self, wayLoc);
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int createOfficerGroupWaypoint(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (params == null || params.isEmpty())
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
location wayLoc = params.getLocation("wayLoc");
|
|
obj_id groupWaypoint = createWaypointInDatapad(self, wayLoc);
|
|
setWaypointColor(groupWaypoint, "green");
|
|
setWaypointName(groupWaypoint, "Group Waypoint");
|
|
setWaypointActive(groupWaypoint, true);
|
|
dictionary dict = new dictionary();
|
|
dict.put("groupWaypoint", groupWaypoint);
|
|
messageTo(self, "removeOfficerGroupWaypoint", dict, 600, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int removeOfficerGroupWaypoint(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (params == null || params.isEmpty())
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id groupWaypoint = params.getObjId("groupWaypoint");
|
|
if (!isIdValid(groupWaypoint) || !exists(groupWaypoint))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
destroyWaypointInDatapad(groupWaypoint, self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnSurveyDataReceived(obj_id self, float[] xVals, float[] zVals, float[] efficiencies) throws InterruptedException
|
|
{
|
|
if (efficiencies == null)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int highest = -1;
|
|
float highVal = 0.0f;
|
|
for (int i = 0; i < efficiencies.length; i++)
|
|
{
|
|
if (efficiencies[i] > highVal)
|
|
{
|
|
highest = i;
|
|
highVal = efficiencies[i];
|
|
}
|
|
}
|
|
if ((highest > -1) && (highVal > 0.1))
|
|
{
|
|
location point = new location();
|
|
point.x = xVals[highest];
|
|
point.y = 0;
|
|
point.z = zVals[highest];
|
|
obj_id waypoint = getSurveyWaypoint(self);
|
|
boolean newWpCreated = false;
|
|
if (!isIdValid(waypoint))
|
|
{
|
|
waypoint = createWaypointInDatapad(self, point);
|
|
newWpCreated = true;
|
|
}
|
|
if (isIdValid(waypoint))
|
|
{
|
|
setWaypointVisible(waypoint, true);
|
|
setWaypointActive(waypoint, true);
|
|
setWaypointLocation(waypoint, point);
|
|
setWaypointName(waypoint, "Resource Survey");
|
|
if (newWpCreated)
|
|
{
|
|
setWaypointColor(waypoint, "orange");
|
|
}
|
|
setObjVar(self, "survey_waypoint", waypoint);
|
|
}
|
|
sendSystemMessage(self, SID_SURVEY_WAYPOINT);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public obj_id getSurveyWaypoint(obj_id self) throws InterruptedException
|
|
{
|
|
obj_id[] data = getWaypointsInDatapad(self);
|
|
if (data != null)
|
|
{
|
|
for (obj_id datum : data) {
|
|
if (!isIdValid(datum)) {
|
|
continue;
|
|
}
|
|
String waypointName = getWaypointName(datum);
|
|
if ((waypointName != null) && waypointName.equals("Resource Survey")) {
|
|
return datum;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
public int OnChangedPosture(obj_id self, int before, int after) throws InterruptedException
|
|
{
|
|
if (meditation.isMeditating(self))
|
|
{
|
|
meditation.endMeditation(self);
|
|
}
|
|
if (before == POSTURE_CROUCHED)
|
|
{
|
|
if (utils.hasScriptVar(self, "surveying.takingSamples"))
|
|
{
|
|
obj_id tool = utils.getObjIdScriptVar(self, "surveying.tool");
|
|
resource.cleanupTool(self, tool);
|
|
sendSystemMessage(self, SID_SAMPLE_CANCEL);
|
|
}
|
|
else if (utils.hasScriptVar(self, "trapdrop.settrap"))
|
|
{
|
|
obj_id trap = utils.getObjIdScriptVar(self, "trapdrop.settrap");
|
|
messageTo(trap, "stopDeploy", null, 0.0f, false);
|
|
sendSystemMessage(self, SID_TRAP_CANCEL);
|
|
utils.removeScriptVar(self, "trapdrop.settrap");
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnCreatureDamaged(obj_id self, obj_id attacker, obj_id weapon, int[] damage) throws InterruptedException
|
|
{
|
|
if (meditation.isMeditating(self))
|
|
{
|
|
meditation.endMeditation(self);
|
|
}
|
|
if (utils.hasScriptVar(self, "surveying.takingSamples"))
|
|
{
|
|
obj_id tool = utils.getObjIdScriptVar(self, "surveying.tool");
|
|
resource.cleanupTool(self, tool);
|
|
sendSystemMessage(self, SID_SAMPLE_CANCEL_ATTACK);
|
|
}
|
|
else if (utils.hasScriptVar(self, "trapdrop.settrap"))
|
|
{
|
|
obj_id trap = utils.getObjIdScriptVar(self, "trapdrop.settrap");
|
|
messageTo(trap, "stopDeploy", null, 0.0f, false);
|
|
sendSystemMessage(self, SID_TRAP_CANCEL_ATTACK);
|
|
utils.removeScriptVar(self, "trapdrop.settrap");
|
|
}
|
|
metrics.logArmorStatus(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnTargeted(obj_id self, obj_id attacker) throws InterruptedException
|
|
{
|
|
if (utils.hasScriptVar(self, "surveying.takingSamples"))
|
|
{
|
|
obj_id tool = utils.getObjIdScriptVar(self, "surveying.tool");
|
|
resource.cleanupTool(self, tool);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleSurveyNodeChoice(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (!sui.hasPid(self, resource.PID_NAME))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
sui.removePid(self, resource.PID_NAME);
|
|
if (!utils.hasScriptVar(self, "surveying.takingSamples"))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id curtool = utils.getObjIdScriptVar(self, "surveying.tool");
|
|
obj_id tool = utils.getObjIdScriptVar(self, "survey_event.tool");
|
|
if (tool != curtool)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int idx = sui.getListboxSelectedRow(params);
|
|
if (idx < 0)
|
|
{
|
|
idx = 0;
|
|
}
|
|
obj_id player = sui.getPlayerId(params);
|
|
int btn = sui.getIntButtonPressed(params);
|
|
if ((btn == sui.BP_CANCEL) || (idx == 0))
|
|
{
|
|
dictionary outparams = new dictionary();
|
|
outparams.put("player", self);
|
|
messageTo(tool, "continueSampleLoop", outparams, 0.0f, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
else if (idx == 2)
|
|
{
|
|
if (!hasCompletedCollection(player, "sampling_pet_collection"))
|
|
{
|
|
modifyCollectionSlotValue(player, "col_pet_resource_sampling", 1);
|
|
}
|
|
int dieRoll = rand(1, 100);
|
|
if (dieRoll < 75)
|
|
{
|
|
utils.setScriptVar(player, "survey_event.gamble", 3);
|
|
}
|
|
else
|
|
{
|
|
utils.setScriptVar(player, "survey_event.gamble", 4);
|
|
}
|
|
dictionary outparams = new dictionary();
|
|
outparams.put("player", self);
|
|
messageTo(tool, "continueSampleLoop", outparams, 0.0f, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
dictionary outparams = new dictionary();
|
|
outparams.put("player", self);
|
|
messageTo(tool, "stopSampleEvent", outparams, 0.0f, false);
|
|
location point = locations.getGoodLocationAroundLocation(getLocation(self), 10, 10, 50, 50, true, false);
|
|
if (point == null)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id waypoint = getSurveyWaypoint(self);
|
|
if (!isIdValid(waypoint))
|
|
{
|
|
waypoint = createWaypointInDatapad(self, point);
|
|
}
|
|
if (isIdValid(waypoint))
|
|
{
|
|
setWaypointVisible(waypoint, true);
|
|
setWaypointActive(waypoint, true);
|
|
setWaypointLocation(waypoint, point);
|
|
setWaypointName(waypoint, "Resource Survey");
|
|
setWaypointColor(waypoint, "blue");
|
|
}
|
|
sendSystemMessage(self, SID_NODE_WAYPOINT);
|
|
utils.setScriptVar(self, "survey_event.location", point);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleSurveyGambleChoice(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (!sui.hasPid(self, resource.PID_NAME))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
sui.removePid(self, resource.PID_NAME);
|
|
if (!utils.hasScriptVar(self, "surveying.takingSamples"))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id curtool = utils.getObjIdScriptVar(self, "surveying.tool");
|
|
obj_id tool = utils.getObjIdScriptVar(self, "survey_event.tool");
|
|
if (tool != curtool)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int idx = sui.getListboxSelectedRow(params);
|
|
if (idx < 0)
|
|
{
|
|
idx = 0;
|
|
}
|
|
obj_id player = sui.getPlayerId(params);
|
|
int btn = sui.getIntButtonPressed(params);
|
|
if ((btn == sui.BP_CANCEL) || (idx == 0))
|
|
{
|
|
dictionary outparams = new dictionary();
|
|
outparams.put("player", self);
|
|
messageTo(tool, "continueSampleLoop", outparams, 0.0f, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int action = getAttrib(player, ACTION);
|
|
int actioncost = 2000;
|
|
if (!drainAttributes(player, actioncost, 0))
|
|
{
|
|
sendSystemMessage(player, SID_GAMBLE_NO_ACTION);
|
|
dictionary outparams = new dictionary();
|
|
outparams.put("player", self);
|
|
messageTo(tool, "continueSampleLoop", outparams, 0.0f, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (idx == 2)
|
|
{
|
|
String resource_class = getStringObjVar(tool, resource.VAR_SURVEY_CLASS);
|
|
String collectionName = "col_resource_" + resource_class + "_01";
|
|
modifyCollectionSlotValue(player, collectionName, 1);
|
|
utils.setScriptVar(player, "survey_event.gamble", 5);
|
|
dictionary outparams = new dictionary();
|
|
outparams.put("player", self);
|
|
messageTo(tool, "continueSampleLoop", outparams, 0.0f, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int dieRoll = rand(1, 100);
|
|
if (dieRoll < 75)
|
|
{
|
|
utils.setScriptVar(player, "survey_event.gamble", 1);
|
|
}
|
|
else
|
|
{
|
|
utils.setScriptVar(player, "survey_event.gamble", 2);
|
|
}
|
|
dictionary outparams = new dictionary();
|
|
outparams.put("player", self);
|
|
messageTo(tool, "continueSampleLoop", outparams, 0.0f, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdHarvestDNA(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
if (!isIdValid(target))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
bio_engineer.harvestCreatureDNA(self, target);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdHarvestDNAFail(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
if (!isIdValid(target))
|
|
{
|
|
sendSystemMessage(self, bio_engineer.SID_HARVEST_DNA_FAILED);
|
|
}
|
|
else
|
|
{
|
|
prose_package pp = prose.getPackage(bio_engineer.PROSE_HARVEST_DNA_FAILED, target);
|
|
sendSystemMessageProse(self, pp);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int completeHarvestDNA(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
bio_engineer.completeHarvest(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdWaypoint(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
String wpColor = null;
|
|
float displayCoordX = 0.0f;
|
|
float displayCoordZ = 0.0f;
|
|
boolean wpDifferentPlanet = false;
|
|
obj_id lookAtTarget = null;
|
|
obj_id intendedTarget = null;
|
|
int parsedIndex = 0;
|
|
Vector parsedParams = new Vector();
|
|
parsedParams.setSize(0);
|
|
if (params != null && !params.equals(""))
|
|
{
|
|
java.util.StringTokenizer st = new java.util.StringTokenizer(params);
|
|
while (st.hasMoreTokens())
|
|
{
|
|
String token = st.nextToken();
|
|
if (wpColor == null)
|
|
{
|
|
for (int i = 0; i < utils.WAYPOINT_COLORS.length; ++i)
|
|
{
|
|
if ((token.toLowerCase()).equals(utils.WAYPOINT_COLORS[i]))
|
|
{
|
|
wpColor = utils.WAYPOINT_COLORS[i];
|
|
break;
|
|
}
|
|
}
|
|
if (wpColor == null)
|
|
{
|
|
utils.addElement(parsedParams, token);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
utils.addElement(parsedParams, token);
|
|
}
|
|
}
|
|
}
|
|
location spot = null;
|
|
if (parsedParams == null || (parsedParams.size() <= 0))
|
|
{
|
|
spot = getWorldLocation(self);
|
|
if (spot != null)
|
|
{
|
|
displayCoordX = spot.x;
|
|
displayCoordZ = spot.z;
|
|
float[] baInfo = getBuildoutAreaSizeAndCenter(spot.x, spot.z, spot.area, true, true);
|
|
if ((baInfo != null) && (baInfo.length == 4))
|
|
{
|
|
displayCoordX -= baInfo[2];
|
|
displayCoordZ -= baInfo[3];
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
String wpGroundPlanet = null;
|
|
vector wpGroundPLanetBuildoutCoords = null;
|
|
String wpSpaceZone = null;
|
|
float wpCoord1 = Float.NEGATIVE_INFINITY;
|
|
float wpCoord2 = Float.NEGATIVE_INFINITY;
|
|
float wpCoord3 = Float.NEGATIVE_INFINITY;
|
|
boolean useTarget = false;
|
|
wpCoord1 = utils.stringToFloat(((String)parsedParams.get(parsedIndex)));
|
|
if (wpCoord1 == Float.NEGATIVE_INFINITY)
|
|
{
|
|
String planet = ((String)parsedParams.get(parsedIndex)).toLowerCase();
|
|
if (planet.equals("-target"))
|
|
{
|
|
useTarget = true;
|
|
++parsedIndex;
|
|
}
|
|
else
|
|
{
|
|
for (int i = 0; i < WAYPOINT_GROUND_PLANETS_EXTERNAL.length; ++i)
|
|
{
|
|
if ((planet.equals(WAYPOINT_GROUND_PLANETS_EXTERNAL[i])) && (i < WAYPOINT_GROUND_PLANETS_INTERNAL.length))
|
|
{
|
|
wpGroundPlanet = WAYPOINT_GROUND_PLANETS_INTERNAL[i];
|
|
if (i < WAYPOINT_GROUND_PLANETS_BUILDOUT_COORDS.length)
|
|
{
|
|
wpGroundPLanetBuildoutCoords = WAYPOINT_GROUND_PLANETS_BUILDOUT_COORDS[i];
|
|
}
|
|
++parsedIndex;
|
|
break;
|
|
}
|
|
}
|
|
if (wpGroundPlanet == null)
|
|
{
|
|
for (int i = 0; i < WAYPOINT_SPACE_ZONES_EXTERNAL.length; ++i)
|
|
{
|
|
if ((planet.equals(WAYPOINT_SPACE_ZONES_EXTERNAL[i])) && (i < WAYPOINT_SPACE_ZONES_INTERNAL.length))
|
|
{
|
|
wpSpaceZone = WAYPOINT_SPACE_ZONES_INTERNAL[i];
|
|
++parsedIndex;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (((wpGroundPlanet != null) || (wpSpaceZone != null)) && (parsedIndex < parsedParams.size()))
|
|
{
|
|
wpCoord1 = utils.stringToFloat(((String)parsedParams.get(parsedIndex)));
|
|
}
|
|
}
|
|
if (wpCoord1 != Float.NEGATIVE_INFINITY)
|
|
{
|
|
++parsedIndex;
|
|
if (parsedIndex < parsedParams.size())
|
|
{
|
|
wpCoord2 = utils.stringToFloat(((String)parsedParams.get(parsedIndex)));
|
|
if (wpCoord2 != Float.NEGATIVE_INFINITY)
|
|
{
|
|
++parsedIndex;
|
|
if (parsedIndex < parsedParams.size())
|
|
{
|
|
wpCoord3 = utils.stringToFloat(((String)parsedParams.get(parsedIndex)));
|
|
if (wpCoord3 != Float.NEGATIVE_INFINITY)
|
|
{
|
|
++parsedIndex;
|
|
}
|
|
else if (wpSpaceZone != null)
|
|
{
|
|
wpCoord1 = Float.NEGATIVE_INFINITY;
|
|
wpCoord2 = Float.NEGATIVE_INFINITY;
|
|
--parsedIndex;
|
|
--parsedIndex;
|
|
}
|
|
}
|
|
else if (wpSpaceZone != null)
|
|
{
|
|
wpCoord1 = Float.NEGATIVE_INFINITY;
|
|
wpCoord2 = Float.NEGATIVE_INFINITY;
|
|
--parsedIndex;
|
|
--parsedIndex;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
wpCoord1 = Float.NEGATIVE_INFINITY;
|
|
--parsedIndex;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
wpCoord1 = Float.NEGATIVE_INFINITY;
|
|
--parsedIndex;
|
|
}
|
|
}
|
|
if ((wpGroundPlanet != null) && ((wpCoord1 == Float.NEGATIVE_INFINITY) || (wpCoord2 == Float.NEGATIVE_INFINITY)))
|
|
{
|
|
wpGroundPlanet = null;
|
|
wpCoord1 = Float.NEGATIVE_INFINITY;
|
|
wpCoord2 = Float.NEGATIVE_INFINITY;
|
|
wpCoord3 = Float.NEGATIVE_INFINITY;
|
|
parsedIndex = 0;
|
|
}
|
|
if ((wpSpaceZone != null) && ((wpCoord1 == Float.NEGATIVE_INFINITY) || (wpCoord2 == Float.NEGATIVE_INFINITY) || (wpCoord3 == Float.NEGATIVE_INFINITY)))
|
|
{
|
|
wpSpaceZone = null;
|
|
wpCoord1 = Float.NEGATIVE_INFINITY;
|
|
wpCoord2 = Float.NEGATIVE_INFINITY;
|
|
wpCoord3 = Float.NEGATIVE_INFINITY;
|
|
parsedIndex = 0;
|
|
}
|
|
if (wpCoord1 == Float.NEGATIVE_INFINITY)
|
|
{
|
|
if (useTarget)
|
|
{
|
|
intendedTarget = getIntendedTarget(self);
|
|
if (isIdValid(intendedTarget))
|
|
{
|
|
spot = getWorldLocation(intendedTarget);
|
|
}
|
|
if (spot == null)
|
|
{
|
|
intendedTarget = null;
|
|
lookAtTarget = getLookAtTarget(self);
|
|
if (isIdValid(lookAtTarget))
|
|
{
|
|
spot = getWorldLocation(lookAtTarget);
|
|
}
|
|
}
|
|
}
|
|
if (spot == null)
|
|
{
|
|
intendedTarget = null;
|
|
lookAtTarget = null;
|
|
spot = getWorldLocation(self);
|
|
}
|
|
if (spot != null)
|
|
{
|
|
displayCoordX = spot.x;
|
|
displayCoordZ = spot.z;
|
|
float[] baInfo = getBuildoutAreaSizeAndCenter(spot.x, spot.z, spot.area, true, true);
|
|
if ((baInfo != null) && (baInfo.length == 4))
|
|
{
|
|
displayCoordX -= baInfo[2];
|
|
displayCoordZ -= baInfo[3];
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (wpCoord3 == Float.NEGATIVE_INFINITY)
|
|
{
|
|
spot = new location(wpCoord1, 0.0f, wpCoord2);
|
|
}
|
|
else
|
|
{
|
|
spot = new location(wpCoord1, wpCoord2, wpCoord3);
|
|
}
|
|
if (spot != null)
|
|
{
|
|
displayCoordX = spot.x;
|
|
displayCoordZ = spot.z;
|
|
float[] baInfo = null;
|
|
if ((wpGroundPlanet != null) && (!wpGroundPlanet.equals(spot.area)))
|
|
{
|
|
if (wpGroundPLanetBuildoutCoords != null)
|
|
{
|
|
baInfo = getBuildoutAreaSizeAndCenter(wpGroundPLanetBuildoutCoords.x, wpGroundPLanetBuildoutCoords.z, wpGroundPlanet, true, true);
|
|
}
|
|
wpDifferentPlanet = true;
|
|
spot.area = wpGroundPlanet;
|
|
}
|
|
else if ((wpSpaceZone != null) && (!wpSpaceZone.equals(spot.area)))
|
|
{
|
|
wpDifferentPlanet = true;
|
|
spot.area = wpSpaceZone;
|
|
}
|
|
else
|
|
{
|
|
location currentLoc = getWorldLocation(self);
|
|
if (currentLoc != null)
|
|
{
|
|
baInfo = getBuildoutAreaSizeAndCenter(currentLoc.x, currentLoc.z, currentLoc.area, true, true);
|
|
}
|
|
}
|
|
if ((baInfo != null) && (baInfo.length == 4))
|
|
{
|
|
final float halfWidth = baInfo[0] / 2;
|
|
if (displayCoordX > halfWidth)
|
|
{
|
|
displayCoordX = halfWidth;
|
|
}
|
|
else if (displayCoordX < -halfWidth)
|
|
{
|
|
displayCoordX = -halfWidth;
|
|
}
|
|
final float halfHeight = baInfo[1] / 2;
|
|
if (displayCoordZ > halfHeight)
|
|
{
|
|
displayCoordZ = halfHeight;
|
|
}
|
|
else if (displayCoordZ < -halfHeight)
|
|
{
|
|
displayCoordZ = -halfHeight;
|
|
}
|
|
spot.x = displayCoordX + baInfo[2];
|
|
spot.z = displayCoordZ + baInfo[3];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (spot == null)
|
|
{
|
|
sendSystemMessageTestingOnly(self, "Waypoint: The system was unable to parse a valid waypoint location.");
|
|
}
|
|
else
|
|
{
|
|
obj_id wp = createWaypointInDatapadWithLimits(self, spot);
|
|
if (isIdValid(wp))
|
|
{
|
|
if (!wpDifferentPlanet)
|
|
{
|
|
setWaypointActive(wp, true);
|
|
}
|
|
setWaypointVisible(wp, true);
|
|
String wpName = null;
|
|
for (int i = parsedIndex; i < parsedParams.size(); ++i)
|
|
{
|
|
if (wpName == null)
|
|
{
|
|
wpName = ((String)parsedParams.get(i));
|
|
}
|
|
else
|
|
{
|
|
wpName += " ";
|
|
wpName += ((String)parsedParams.get(i));
|
|
}
|
|
}
|
|
if (wpName == null)
|
|
{
|
|
wpName = "Waypoint";
|
|
}
|
|
setWaypointName(wp, wpName);
|
|
if (wpColor != null && !wpColor.equals(""))
|
|
{
|
|
setWaypointColor(wp, wpColor);
|
|
}
|
|
if (!wpDifferentPlanet)
|
|
{
|
|
if (isIdValid(intendedTarget))
|
|
{
|
|
sendSystemMessageTestingOnly(self, "Waypoint: New waypoint \"" + wpName + "\" created for intended target location (" + (int)displayCoordX + ", " + (int)spot.y + ", " + (int)displayCoordZ + ")");
|
|
}
|
|
else if (isIdValid(lookAtTarget))
|
|
{
|
|
sendSystemMessageTestingOnly(self, "Waypoint: New waypoint \"" + wpName + "\" created for look at target location (" + (int)displayCoordX + ", " + (int)spot.y + ", " + (int)displayCoordZ + ")");
|
|
}
|
|
else
|
|
{
|
|
sendSystemMessageTestingOnly(self, "Waypoint: New waypoint \"" + wpName + "\" created for location (" + (int)displayCoordX + ", " + (int)spot.y + ", " + (int)displayCoordZ + ")");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
final String localizedPlanetName = localize(new string_id("planet_n", spot.area));
|
|
sendSystemMessageTestingOnly(self, "Waypoint: New waypoint \"" + wpName + "\" created for location " + localizedPlanetName + " (" + (int)displayCoordX + ", " + (int)spot.y + ", " + (int)displayCoordZ + ")");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
string_id errorMessage = new string_id("base_player", "too_many_waypoints");
|
|
sendSystemMessage(self, errorMessage);
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdSpaceWaypoint(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
String wpColor = null;
|
|
float displayCoordX = 0.0f;
|
|
float displayCoordZ = 0.0f;
|
|
boolean wpDifferentPlanet = false;
|
|
int parsedIndex = 0;
|
|
Vector parsedParams = new Vector();
|
|
parsedParams.setSize(0);
|
|
if (params != null && !params.equals(""))
|
|
{
|
|
java.util.StringTokenizer st = new java.util.StringTokenizer(params);
|
|
while (st.hasMoreTokens())
|
|
{
|
|
String token = st.nextToken();
|
|
if (wpColor == null)
|
|
{
|
|
for (int i = 0; i < utils.WAYPOINT_COLORS.length; ++i)
|
|
{
|
|
if ((token.toLowerCase()).equals(utils.WAYPOINT_COLORS[i]))
|
|
{
|
|
wpColor = utils.WAYPOINT_COLORS[i];
|
|
break;
|
|
}
|
|
}
|
|
if (wpColor == null)
|
|
{
|
|
utils.addElement(parsedParams, token);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
utils.addElement(parsedParams, token);
|
|
}
|
|
}
|
|
}
|
|
location spot = null;
|
|
if (parsedParams == null || (parsedParams.size() <= 0))
|
|
{
|
|
if (!isIdValid(target))
|
|
{
|
|
target = space_transition.getContainingShip(self);
|
|
}
|
|
else
|
|
{
|
|
obj_id objContainer = getTopMostContainer(target);
|
|
if (isIdValid(objContainer))
|
|
{
|
|
target = objContainer;
|
|
}
|
|
}
|
|
spot = getWorldLocation(target);
|
|
if (spot != null)
|
|
{
|
|
displayCoordX = spot.x;
|
|
displayCoordZ = spot.z;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
String wpGroundPlanet = null;
|
|
vector wpGroundPLanetBuildoutCoords = null;
|
|
String wpSpaceZone = null;
|
|
float wpCoord1 = Float.NEGATIVE_INFINITY;
|
|
float wpCoord2 = Float.NEGATIVE_INFINITY;
|
|
float wpCoord3 = Float.NEGATIVE_INFINITY;
|
|
wpCoord1 = utils.stringToFloat(((String)parsedParams.get(parsedIndex)));
|
|
if (wpCoord1 == Float.NEGATIVE_INFINITY)
|
|
{
|
|
String planet = ((String)parsedParams.get(parsedIndex)).toLowerCase();
|
|
for (int i = 0; i < WAYPOINT_GROUND_PLANETS_EXTERNAL.length; ++i)
|
|
{
|
|
if ((planet.equals(WAYPOINT_GROUND_PLANETS_EXTERNAL[i])) && (i < WAYPOINT_GROUND_PLANETS_INTERNAL.length))
|
|
{
|
|
wpGroundPlanet = WAYPOINT_GROUND_PLANETS_INTERNAL[i];
|
|
if (i < WAYPOINT_GROUND_PLANETS_BUILDOUT_COORDS.length)
|
|
{
|
|
wpGroundPLanetBuildoutCoords = WAYPOINT_GROUND_PLANETS_BUILDOUT_COORDS[i];
|
|
}
|
|
++parsedIndex;
|
|
break;
|
|
}
|
|
}
|
|
if (wpGroundPlanet == null)
|
|
{
|
|
for (int i = 0; i < WAYPOINT_SPACE_ZONES_EXTERNAL.length; ++i)
|
|
{
|
|
if ((planet.equals(WAYPOINT_SPACE_ZONES_EXTERNAL[i])) && (i < WAYPOINT_SPACE_ZONES_INTERNAL.length))
|
|
{
|
|
wpSpaceZone = WAYPOINT_SPACE_ZONES_INTERNAL[i];
|
|
++parsedIndex;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (((wpGroundPlanet != null) || (wpSpaceZone != null)) && (parsedIndex < parsedParams.size()))
|
|
{
|
|
wpCoord1 = utils.stringToFloat(((String)parsedParams.get(parsedIndex)));
|
|
}
|
|
}
|
|
if (wpCoord1 != Float.NEGATIVE_INFINITY)
|
|
{
|
|
++parsedIndex;
|
|
if (parsedIndex < parsedParams.size())
|
|
{
|
|
wpCoord2 = utils.stringToFloat(((String)parsedParams.get(parsedIndex)));
|
|
if (wpCoord2 != Float.NEGATIVE_INFINITY)
|
|
{
|
|
++parsedIndex;
|
|
if (parsedIndex < parsedParams.size())
|
|
{
|
|
wpCoord3 = utils.stringToFloat(((String)parsedParams.get(parsedIndex)));
|
|
if (wpCoord3 != Float.NEGATIVE_INFINITY)
|
|
{
|
|
++parsedIndex;
|
|
}
|
|
else if (wpGroundPlanet == null)
|
|
{
|
|
wpCoord1 = Float.NEGATIVE_INFINITY;
|
|
wpCoord2 = Float.NEGATIVE_INFINITY;
|
|
--parsedIndex;
|
|
--parsedIndex;
|
|
}
|
|
}
|
|
else if (wpGroundPlanet == null)
|
|
{
|
|
wpCoord1 = Float.NEGATIVE_INFINITY;
|
|
wpCoord2 = Float.NEGATIVE_INFINITY;
|
|
--parsedIndex;
|
|
--parsedIndex;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
wpCoord1 = Float.NEGATIVE_INFINITY;
|
|
--parsedIndex;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
wpCoord1 = Float.NEGATIVE_INFINITY;
|
|
--parsedIndex;
|
|
}
|
|
}
|
|
if ((wpGroundPlanet != null) && ((wpCoord1 == Float.NEGATIVE_INFINITY) || (wpCoord2 == Float.NEGATIVE_INFINITY)))
|
|
{
|
|
wpGroundPlanet = null;
|
|
wpCoord1 = Float.NEGATIVE_INFINITY;
|
|
wpCoord2 = Float.NEGATIVE_INFINITY;
|
|
wpCoord3 = Float.NEGATIVE_INFINITY;
|
|
parsedIndex = 0;
|
|
}
|
|
if ((wpSpaceZone != null) && ((wpCoord1 == Float.NEGATIVE_INFINITY) || (wpCoord2 == Float.NEGATIVE_INFINITY) || (wpCoord3 == Float.NEGATIVE_INFINITY)))
|
|
{
|
|
wpSpaceZone = null;
|
|
wpCoord1 = Float.NEGATIVE_INFINITY;
|
|
wpCoord2 = Float.NEGATIVE_INFINITY;
|
|
wpCoord3 = Float.NEGATIVE_INFINITY;
|
|
parsedIndex = 0;
|
|
}
|
|
if (wpCoord1 == Float.NEGATIVE_INFINITY)
|
|
{
|
|
if (!isIdValid(target))
|
|
{
|
|
target = space_transition.getContainingShip(self);
|
|
}
|
|
else
|
|
{
|
|
obj_id objContainer = getTopMostContainer(target);
|
|
if (isIdValid(objContainer))
|
|
{
|
|
target = objContainer;
|
|
}
|
|
}
|
|
spot = getWorldLocation(target);
|
|
if (spot != null)
|
|
{
|
|
displayCoordX = spot.x;
|
|
displayCoordZ = spot.z;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (wpCoord3 == Float.NEGATIVE_INFINITY)
|
|
{
|
|
spot = new location(wpCoord1, 0.0f, wpCoord2);
|
|
}
|
|
else
|
|
{
|
|
spot = new location(wpCoord1, wpCoord2, wpCoord3);
|
|
}
|
|
if (spot != null)
|
|
{
|
|
displayCoordX = spot.x;
|
|
displayCoordZ = spot.z;
|
|
if ((wpGroundPlanet != null) && (!wpGroundPlanet.equals(spot.area)))
|
|
{
|
|
if (wpGroundPLanetBuildoutCoords != null)
|
|
{
|
|
float[] baInfo = getBuildoutAreaSizeAndCenter(wpGroundPLanetBuildoutCoords.x, wpGroundPLanetBuildoutCoords.z, wpGroundPlanet, true, true);
|
|
if ((baInfo != null) && (baInfo.length == 4))
|
|
{
|
|
final float halfWidth = baInfo[0] / 2;
|
|
if (displayCoordX > halfWidth)
|
|
{
|
|
displayCoordX = halfWidth;
|
|
}
|
|
else if (displayCoordX < -halfWidth)
|
|
{
|
|
displayCoordX = -halfWidth;
|
|
}
|
|
final float halfHeight = baInfo[1] / 2;
|
|
if (displayCoordZ > halfHeight)
|
|
{
|
|
displayCoordZ = halfHeight;
|
|
}
|
|
else if (displayCoordZ < -halfHeight)
|
|
{
|
|
displayCoordZ = -halfHeight;
|
|
}
|
|
spot.x = displayCoordX + baInfo[2];
|
|
spot.z = displayCoordZ + baInfo[3];
|
|
}
|
|
}
|
|
wpDifferentPlanet = true;
|
|
spot.area = wpGroundPlanet;
|
|
}
|
|
else if ((wpSpaceZone != null) && (!wpSpaceZone.equals(spot.area)))
|
|
{
|
|
wpDifferentPlanet = true;
|
|
spot.area = wpSpaceZone;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (spot == null)
|
|
{
|
|
sendSystemMessageTestingOnly(self, "Waypoint: The system was unable to parse a valid waypoint location.");
|
|
}
|
|
else
|
|
{
|
|
obj_id wp = createWaypointInDatapadWithLimits(self, spot);
|
|
if (isIdValid(wp))
|
|
{
|
|
if (!wpDifferentPlanet)
|
|
{
|
|
setWaypointActive(wp, true);
|
|
}
|
|
setWaypointVisible(wp, true);
|
|
String wpName = null;
|
|
for (int i = parsedIndex; i < parsedParams.size(); ++i)
|
|
{
|
|
if (wpName == null)
|
|
{
|
|
wpName = ((String)parsedParams.get(i));
|
|
}
|
|
else
|
|
{
|
|
wpName += " ";
|
|
wpName += ((String)parsedParams.get(i));
|
|
}
|
|
}
|
|
if (wpName == null)
|
|
{
|
|
wpName = "Waypoint";
|
|
}
|
|
setWaypointName(wp, wpName);
|
|
if ((wpColor == null) && !wpDifferentPlanet)
|
|
{
|
|
wpColor = "space";
|
|
}
|
|
if (wpColor != null && !wpColor.equals(""))
|
|
{
|
|
setWaypointColor(wp, wpColor);
|
|
}
|
|
if (!wpDifferentPlanet)
|
|
{
|
|
sendSystemMessageTestingOnly(self, "Waypoint: New waypoint \"" + wpName + "\" created for location (" + (int)displayCoordX + ", " + (int)spot.y + ", " + (int)displayCoordZ + ")");
|
|
}
|
|
else
|
|
{
|
|
final String localizedPlanetName = localize(new string_id("planet_n", spot.area));
|
|
sendSystemMessageTestingOnly(self, "Waypoint: New waypoint \"" + wpName + "\" created for location " + localizedPlanetName + " (" + (int)displayCoordX + ", " + (int)spot.y + ", " + (int)displayCoordZ + ")");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
string_id errorMessage = new string_id("base_player", "too_many_waypoints");
|
|
sendSystemMessage(self, errorMessage);
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdClearQueue(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
queueClear(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int getPrototype(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
if (!isIdValid(target))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!hasObjVar(target, "crafting.tool"))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
messageTo(target, "getPrototype", null, 0, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdCityban(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
if (target == self)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!isPlayer(target))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int city_id = city.checkCity(self, true);
|
|
if (city_id == 0)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id mayor = cityGetLeader(city_id);
|
|
if (!city.isMilitiaOfCity(self, city_id) && (self != mayor))
|
|
{
|
|
sendSystemMessage(self, SID_NOT_MILITIA);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (isGod(target) || hasObjVar(target, "gm"))
|
|
{
|
|
sendSystemMessage(self, SID_NOT_CSR_BAN);
|
|
prose_package pp = prose.getPackage(SID_CSR_BAN_ATTEMPT_MSG, getFirstName(self), cityGetName(city_id));
|
|
sendSystemMessageProse(target, pp);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (target == mayor)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (city.isCitizenOfCity(target, city_id))
|
|
{
|
|
sendSystemMessage(self, SID_NOT_CITIZEN_BAN);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
sendSystemMessage(target, SID_CITY_BANNED);
|
|
int[] banCities = getIntArrayObjVar(target, "city.banlist");
|
|
if (banCities == null)
|
|
{
|
|
int[] newBanCities = new int[1];
|
|
newBanCities[0] = city_id;
|
|
setObjVar(target, "city.banlist", newBanCities);
|
|
}
|
|
else
|
|
{
|
|
for (int banCity : banCities) {
|
|
if (banCity == city_id) {
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
int[] newBanCities = new int[banCities.length + 1];
|
|
for (int i = 0; i < banCities.length; i++)
|
|
{
|
|
newBanCities[i + 1] = banCities[i];
|
|
}
|
|
newBanCities[0] = city_id;
|
|
setObjVar(target, "city.banlist", newBanCities);
|
|
}
|
|
prose_package pp = prose.getPackage(SID_CITY_BAN_DONE, target);
|
|
sendSystemMessageProse(self, pp);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdCitypardon(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
if (target == self)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!isPlayer(target))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int city_id = city.checkCity(self, true);
|
|
if (city_id == 0)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id mayor = cityGetLeader(city_id);
|
|
if (!city.isMilitiaOfCity(self, city_id) && (self != mayor))
|
|
{
|
|
sendSystemMessage(self, SID_NOT_MILITIA);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (target == mayor)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int[] banCities = getIntArrayObjVar(target, "city.banlist");
|
|
if (banCities != null)
|
|
{
|
|
int found = 0;
|
|
for (int banCity1 : banCities) {
|
|
if (banCity1 == city_id) {
|
|
found = 1;
|
|
break;
|
|
}
|
|
}
|
|
if (found == 0)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (banCities.length == 1)
|
|
{
|
|
removeObjVar(target, "city.banlist");
|
|
}
|
|
else
|
|
{
|
|
int j = 0;
|
|
int[] newBanCities = new int[banCities.length - 1];
|
|
for (int banCity : banCities) {
|
|
if (banCity != city_id) {
|
|
newBanCities[j] = banCity;
|
|
j++;
|
|
}
|
|
}
|
|
setObjVar(target, "city.banlist", newBanCities);
|
|
}
|
|
}
|
|
sendSystemMessage(target, SID_CITY_PARDONED);
|
|
prose_package pp = prose.getPackage(SID_CITY_PARDON_DONE, target);
|
|
sendSystemMessageProse(self, pp);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnCityChanged(obj_id self, int oldCityId, int newCityId) throws InterruptedException
|
|
{
|
|
if ((oldCityId != 0) && cityExists(oldCityId)) {
|
|
sendSystemMessageProse(self, prose.getPackage(SID_LEAVE_CITY, cityGetName(oldCityId)));
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
String cityName = cityGetName(newCityId);
|
|
int city_rank = city.getCityRank(newCityId);
|
|
string_id rank_name = new string_id("city/city", "rank" + city_rank);
|
|
String spec = city.cityGetSpecString(newCityId);
|
|
prose_package pp = new prose_package();
|
|
pp.stringId = SID_ENTER_CITY;
|
|
pp.target.set(cityName);
|
|
|
|
String specpart = localize(rank_name);
|
|
if (spec != null && !spec.equals("null")) {
|
|
specpart = specpart + ", " + localize(new string_id("city/city", spec));
|
|
}
|
|
int factionId = cityGetFaction(newCityId);
|
|
if ((-615855020) == factionId) {
|
|
specpart = specpart + ", Imperial aligned";
|
|
} else if ((370444368) == factionId) {
|
|
specpart = specpart + ", Rebel aligned";
|
|
}
|
|
pp.other.set(specpart);
|
|
sendSystemMessageProse(self, pp);
|
|
|
|
obj_id cityHallId = cityGetCityHall(newCityId);
|
|
if(cityHallId != null && cityName != null && hasObjVar(cityHallId, "city_visitor_message")) {
|
|
String cityVisitorMessage = getStringObjVar(cityHallId, "city_visitor_message");
|
|
sendConsoleMessage(self, "City(" + cityName + ") Message: " + cityVisitorMessage + "\\#DFDFDF");
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdGrantZoningRights(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
if (target == self)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!isPlayer(target))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
utils.setScriptVar(self, "zoning_rights_target", target);
|
|
sui.listbox(self, self, "@city/city:zoning_rights_p", sui.OK_CANCEL, "@city/city:zoning_rights_t", ZONING_RIGHTS_ARRAY, "handleZoningRightsSelect", true);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleZoningRightsSelect(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id player = sui.getPlayerId(params);
|
|
int btn = sui.getIntButtonPressed(params);
|
|
if (btn == sui.BP_CANCEL)
|
|
{
|
|
utils.removeScriptVar(player, "zoning_rights_target");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!utils.hasScriptVar(player, "zoning_rights_target"))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id target = utils.getObjIdScriptVar(player, "zoning_rights_target");
|
|
utils.removeScriptVar(player, "zoning_rights_target");
|
|
obj_id top = getTopMostContainer(player);
|
|
int city_id = getCityAtLocation(getLocation(top), 0);
|
|
if (city_id <= 0)
|
|
{
|
|
sendSystemMessage(player, SID_NOT_IN_CITY_LIMITS);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int idx = sui.getListboxSelectedRow(params);
|
|
if (idx < 0)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
switch (idx)
|
|
{
|
|
case 0:
|
|
handleCmdGrantZoningRights(player, target, city_id);
|
|
break;
|
|
case 1:
|
|
handleStorytellerZoningRights(player, target, city_id);
|
|
break;
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public void handleCmdGrantZoningRights(obj_id player, obj_id target, int city_id) throws InterruptedException
|
|
{
|
|
if (!isIdValid(player) || !isIdValid(target))
|
|
{
|
|
return;
|
|
}
|
|
if (target == player)
|
|
{
|
|
return;
|
|
}
|
|
if (!isPlayer(target))
|
|
{
|
|
return;
|
|
}
|
|
obj_id mayor = cityGetLeader(city_id);
|
|
if ((mayor != player) && !city.isMilitiaOfCity(player, city_id))
|
|
{
|
|
sendSystemMessage(player, SID_GRANT_RIGHTS_FAIL);
|
|
return;
|
|
}
|
|
if (hasObjVar(target, "city.zoning_rights"))
|
|
{
|
|
int other_city_id = getIntObjVar(target, "city.zoning_rights");
|
|
if (other_city_id == city_id)
|
|
{
|
|
int curt = getGameTime();
|
|
int rights_time = getIntObjVar(target, "city.zoning_rights_time");
|
|
if (curt - rights_time < 24 * 60 * 60)
|
|
{
|
|
removeObjVar(target, "city.zoning_rights");
|
|
removeObjVar(target, "city.zoning_rights_time");
|
|
sendSystemMessage(player, SID_RIGHTS_REVOKED);
|
|
sendSystemMessage(target, SID_RIGHTS_REVOKED_OTHER);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
setObjVar(target, "city.zoning_rights", city_id);
|
|
setObjVar(target, "city.zoning_rights_time", getGameTime());
|
|
prose_package pp = prose.getPackage(SID_RIGHTS_GRANTED, cityGetName(city_id));
|
|
sendSystemMessageProse(target, pp);
|
|
pp = prose.getPackage(SID_RIGHTS_GRANTED_SELF, getName(target));
|
|
sendSystemMessageProse(player, pp);
|
|
return;
|
|
}
|
|
public void handleStorytellerZoningRights(obj_id player, obj_id target, int city_id) throws InterruptedException
|
|
{
|
|
if (!isIdValid(player) || !isIdValid(target))
|
|
{
|
|
return;
|
|
}
|
|
if (target == player)
|
|
{
|
|
return;
|
|
}
|
|
if (!isPlayer(target))
|
|
{
|
|
return;
|
|
}
|
|
obj_id mayor = cityGetLeader(city_id);
|
|
if ((mayor != player) && !city.isMilitiaOfCity(player, city_id))
|
|
{
|
|
sendSystemMessage(player, SID_ST_GRANT_RIGHTS_FAIL);
|
|
return;
|
|
}
|
|
if (hasObjVar(target, "city.st_zoning_rights"))
|
|
{
|
|
int[] city_id_array = getIntArrayObjVar(target, "city.st_zoning_rights");
|
|
int[] zoning_time_array = getIntArrayObjVar(target, "city.st_zoning_rights_time");
|
|
Vector ids = new Vector();
|
|
if (ids != null)
|
|
{
|
|
ids.setSize(city_id_array.length);
|
|
for (int _i = 0; _i < city_id_array.length; ++_i)
|
|
{
|
|
ids.set(_i, city_id_array[_i]);
|
|
}
|
|
}
|
|
Vector times = new Vector();
|
|
if (times != null)
|
|
{
|
|
times.setSize(zoning_time_array.length);
|
|
for (int _i = 0; _i < zoning_time_array.length; ++_i)
|
|
{
|
|
times.set(_i, zoning_time_array[_i]);
|
|
}
|
|
}
|
|
for (int i = 0; i < city_id_array.length; i++)
|
|
{
|
|
if (city_id_array[i] == city_id)
|
|
{
|
|
int curt = getGameTime();
|
|
if (curt - zoning_time_array[i] < 24 * 60 * 60)
|
|
{
|
|
ids.removeElementAt(i);
|
|
times.removeElementAt(i);
|
|
sendSystemMessage(player, SID_ST_RIGHTS_REVOKED);
|
|
sendSystemMessage(target, SID_ST_RIGHTS_REVOKED_OTHER);
|
|
int[] stampIdsArray = new int[0];
|
|
if (ids != null)
|
|
{
|
|
stampIdsArray = new int[ids.size()];
|
|
for (int _i = 0; _i < ids.size(); ++_i)
|
|
{
|
|
stampIdsArray[_i] = (Integer) ids.get(_i);
|
|
}
|
|
}
|
|
int[] stampTimesArray = new int[0];
|
|
if (times != null)
|
|
{
|
|
stampTimesArray = new int[times.size()];
|
|
for (int _i = 0; _i < times.size(); ++_i)
|
|
{
|
|
stampTimesArray[_i] = (Integer) times.get(_i);
|
|
}
|
|
}
|
|
setObjVar(target, "city.st_zoning_rights", stampIdsArray);
|
|
setObjVar(target, "city.st_zoning_rights_time", stampTimesArray);
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
ids.removeElementAt(i);
|
|
times.removeElementAt(i);
|
|
int[] stampIdsArray = new int[0];
|
|
if (ids != null)
|
|
{
|
|
stampIdsArray = new int[ids.size()];
|
|
for (int _i = 0; _i < ids.size(); ++_i)
|
|
{
|
|
stampIdsArray[_i] = (Integer) ids.get(_i);
|
|
}
|
|
}
|
|
int[] stampTimesArray = new int[0];
|
|
if (times != null)
|
|
{
|
|
stampTimesArray = new int[times.size()];
|
|
for (int _i = 0; _i < times.size(); ++_i)
|
|
{
|
|
stampTimesArray[_i] = (Integer) times.get(_i);
|
|
}
|
|
}
|
|
setObjVar(target, "city.st_zoning_rights", stampIdsArray);
|
|
setObjVar(target, "city.st_zoning_rights_time", stampTimesArray);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
prose_package pp = prose.getPackage(SID_ST_RIGHTS_GRANTED, cityGetName(city_id));
|
|
sendSystemMessageProse(target, pp);
|
|
pp = prose.getPackage(SID_ST_RIGHTS_GRANTED_SELF, getName(target));
|
|
sendSystemMessageProse(player, pp);
|
|
utils.addElement(ids, city_id);
|
|
utils.addElement(times, getGameTime());
|
|
int[] stampIdsArray = new int[0];
|
|
if (ids != null)
|
|
{
|
|
stampIdsArray = new int[ids.size()];
|
|
for (int _i = 0; _i < ids.size(); ++_i)
|
|
{
|
|
stampIdsArray[_i] = (Integer) ids.get(_i);
|
|
}
|
|
}
|
|
int[] stampTimesArray = new int[0];
|
|
if (times != null)
|
|
{
|
|
stampTimesArray = new int[times.size()];
|
|
for (int _i = 0; _i < times.size(); ++_i)
|
|
{
|
|
stampTimesArray[_i] = (Integer) times.get(_i);
|
|
}
|
|
}
|
|
setObjVar(target, "city.st_zoning_rights", stampIdsArray);
|
|
setObjVar(target, "city.st_zoning_rights_time", stampTimesArray);
|
|
}
|
|
else
|
|
{
|
|
int[] id_array = new int[]
|
|
{
|
|
city_id
|
|
};
|
|
int[] time_array = new int[]
|
|
{
|
|
getGameTime()
|
|
};
|
|
setObjVar(target, "city.st_zoning_rights", id_array);
|
|
setObjVar(target, "city.st_zoning_rights_time", time_array);
|
|
prose_package pp = prose.getPackage(SID_ST_RIGHTS_GRANTED, cityGetName(city_id));
|
|
sendSystemMessageProse(target, pp);
|
|
pp = prose.getPackage(SID_ST_RIGHTS_GRANTED_SELF, getName(target));
|
|
sendSystemMessageProse(player, pp);
|
|
}
|
|
return;
|
|
}
|
|
public int cmdGrantStorytellerZoningRights(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
if (!isIdValid(self) || !isIdValid(target))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id player = self;
|
|
obj_id top = getTopMostContainer(player);
|
|
int city_id = getCityAtLocation(getLocation(top), 0);
|
|
if (city_id <= 0)
|
|
{
|
|
sendSystemMessage(player, SID_NOT_IN_CITY_LIMITS);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
handleStorytellerZoningRights(player, target, city_id);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdInstallMissionTerminal(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
int city_id = city.checkMayorCity(self, true);
|
|
if (city_id == 0)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
String[] rawTerminalTypes = dataTableGetStringColumn(CITY_MISSION_TERMINALS, "STRING");
|
|
String[] terminalTypes = new String[rawTerminalTypes.length + 1];
|
|
terminalTypes[0] = "@city/city:current_mt " + city.getMTCount(city_id) + "/" + city.getMaxMTCount(city_id);
|
|
for (int i = 0; i < rawTerminalTypes.length; i++)
|
|
{
|
|
terminalTypes[i + 1] = rawTerminalTypes[i];
|
|
}
|
|
sui.listbox(self, self, "@city/city:job_d", sui.OK_CANCEL, "@city/city:job_n", terminalTypes, "handleInstallMissionTerminal");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleInstallMissionTerminal(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int idx = sui.getListboxSelectedRow(params);
|
|
if (idx < 0)
|
|
{
|
|
idx = 0;
|
|
}
|
|
int btn = sui.getIntButtonPressed(params);
|
|
if (btn == sui.BP_CANCEL)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (idx == 0)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int city_id = city.checkMayorCity(self, true);
|
|
if (city_id == 0)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int maxmt = city.getMaxMTCount(city_id);
|
|
int curmt = city.getMTCount(city_id);
|
|
if (curmt + 1 > maxmt)
|
|
{
|
|
sendSystemMessage(self, SID_NO_MORE_MT);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int factional = dataTableGetInt(CITY_MISSION_TERMINALS, idx - 1, "FACTION");
|
|
if ((factional == 1) && !hasSkill(self, "social_politician_martial_04"))
|
|
{
|
|
sendSystemMessage(self, SID_NO_FACTIONAL);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id structure = getTopMostContainer(self);
|
|
if (isIdValid(structure) && (structure != self))
|
|
{
|
|
if (!player_structure.isCivic(structure))
|
|
{
|
|
sendSystemMessage(self, SID_CIVIC_ONLY);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
int cost = 1000;
|
|
dictionary payparams = new dictionary();
|
|
payparams.put("city_id", city_id);
|
|
payparams.put("cost", cost);
|
|
payparams.put("idx", idx);
|
|
transferBankCreditsToNamedAccount(cityGetCityHall(city_id), money.ACCT_CITY, cost, "handleMTFeeSuccess", "handleMTFeeFail", payparams);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleMTFeeSuccess(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int city_id = params.getInt("city_id");
|
|
int idx = params.getInt("idx");
|
|
String[] terminalTemplates = dataTableGetStringColumn(CITY_MISSION_TERMINALS, "TEMPLATE");
|
|
city.addMissionTerminal(city_id, self, terminalTemplates[idx - 1]);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleMTFeeFail(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int cost = params.getInt("cost");
|
|
prose_package pp = prose.getPackage(SID_CITY_NO_MONEY, cost);
|
|
sendSystemMessageProse(self, pp);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleSTFeeSuccess(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int city_id = params.getInt("city_id");
|
|
int idx = params.getInt("idx");
|
|
String[] trainerTemplates = dataTableGetStringColumn(CITY_SKILL_TRAINERS, "TEMPLATE");
|
|
city.addSkillTrainer(city_id, self, trainerTemplates[idx - 1]);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleSTFeeFail(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int cost = params.getInt("cost");
|
|
prose_package pp = prose.getPackage(SID_CITY_NO_MONEY, cost);
|
|
sendSystemMessageProse(self, pp);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdCityInfo(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
int[] cities = getAllCityIds();
|
|
if ((cities == null) || (cities.length == 0))
|
|
{
|
|
sendSystemMessage(self, new string_id("city/city", "csr_no_cities"));
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
String[] planets =
|
|
{
|
|
"corellia",
|
|
"dantooine",
|
|
"lok",
|
|
"naboo",
|
|
"rori",
|
|
"talus",
|
|
"tatooine"
|
|
};
|
|
java.util.Map counts = new java.util.HashMap();
|
|
String[] cityPlanet = new String[cities.length];
|
|
String[] cityName = new String[cities.length];
|
|
for (int i = 0; i < cities.length; i++)
|
|
{
|
|
location cityLoc = cityGetLocation(cities[i]);
|
|
cityPlanet[i] = cityLoc.area;
|
|
cityName[i] = cityGetName(cities[i]);
|
|
int count = 0;
|
|
Integer icount = (Integer)counts.get(cityPlanet[i]);
|
|
if (icount != null)
|
|
{
|
|
count = icount;
|
|
}
|
|
count++;
|
|
counts.put(cityPlanet[i], count);
|
|
}
|
|
String[] planetList = new String[planets.length];
|
|
for (int i = 0; i < planets.length; i++)
|
|
{
|
|
Integer count = (Integer)counts.get(planets[i]);
|
|
if (count == null)
|
|
{
|
|
planetList[i] = "\\#888888 " + planets[i] + " (0)";
|
|
}
|
|
else
|
|
{
|
|
planetList[i] = "\\#00FF00 " + planets[i] + "\\#FFFFFF (" + count + ")";
|
|
}
|
|
}
|
|
utils.setScriptVar(self, "planetList", planetList);
|
|
sui.listbox(self, self, "@city/city:cityplanets_d", sui.OK_CANCEL, "@city/city:cityinfo_n", planetList, "handleSelectPlanet");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleSelectPlanet(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int idx = sui.getListboxSelectedRow(params);
|
|
if (idx < 0)
|
|
{
|
|
idx = 0;
|
|
}
|
|
int btn = sui.getIntButtonPressed(params);
|
|
if (btn == sui.BP_CANCEL)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
String[] planets =
|
|
{
|
|
"corellia",
|
|
"dantooine",
|
|
"lok",
|
|
"naboo",
|
|
"rori",
|
|
"talus",
|
|
"tatooine"
|
|
};
|
|
String planet = planets[idx];
|
|
int[] cities = getAllCityIds();
|
|
int count = 0;
|
|
int[] planetCities = new int[cities.length];
|
|
for (int i = 0; i < cities.length; i++)
|
|
{
|
|
location cityLoc = cityGetLocation(cities[i]);
|
|
if (cityLoc.area.equals(planet))
|
|
{
|
|
planetCities[i] = 1;
|
|
count++;
|
|
}
|
|
else
|
|
{
|
|
planetCities[i] = 0;
|
|
}
|
|
}
|
|
String[] cityList = new String[count];
|
|
int[] planetCityIds = new int[count];
|
|
int j = 0;
|
|
for (int i = 0; i < planetCities.length; i++)
|
|
{
|
|
if (planetCities[i] == 1)
|
|
{
|
|
int cityRank = city.getCityRank(cities[i]);
|
|
String cityName = cityGetName(cities[i]);
|
|
planetCityIds[j] = cities[i];
|
|
cityList[j++] = "\\#00FF00 " + cityName + "\\#FFFFFF (" + cities[i] + ")" + "\\#BBBBBB Rank " + cityRank;
|
|
}
|
|
}
|
|
utils.setScriptVar(self, "cities", planetCityIds);
|
|
utils.setScriptVar(self, "cityList", cityList);
|
|
sui.listbox(self, self, "@city/city:cityinfo_d", sui.OK_CANCEL, "@city/city:cityinfo_n", cityList, "handleSelectCity", true, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleSelectCity(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int idx = sui.getListboxSelectedRow(params);
|
|
if (idx < 0)
|
|
{
|
|
idx = 0;
|
|
}
|
|
int btn = sui.getIntButtonPressed(params);
|
|
if (btn == sui.BP_CANCEL)
|
|
{
|
|
String[] planetList = utils.getStringArrayScriptVar(self, "planetList");
|
|
sui.listbox(self, self, "@city/city:cityplanets_d", sui.OK_CANCEL, "@city/city:cityinfo_n", planetList, "handleSelectPlanet");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int[] cities = utils.getIntArrayScriptVar(self, "cities");
|
|
int city_id = cities[idx];
|
|
String cityName = cityGetName(city_id);
|
|
obj_id cityHall = cityGetCityHall(city_id);
|
|
location cityLoc = cityGetLocation(city_id);
|
|
obj_id mayor = cityGetLeader(city_id);
|
|
String mayorName = cityGetCitizenName(city_id, mayor);
|
|
obj_id[] citizens = cityGetCitizenIds(city_id);
|
|
obj_id[] structures = cityGetStructureIds(city_id);
|
|
int cityRank = city.getCityRank(city_id);
|
|
int numCitizens = citizens.length;
|
|
int numStructures = structures.length;
|
|
int incomeTax = cityGetIncomeTax(city_id);
|
|
int propertyTax = cityGetPropertyTax(city_id);
|
|
int salesTax = cityGetSalesTax(city_id);
|
|
String[] cityInfo = new String[9];
|
|
cityInfo[0] = "\\#00FF00 Name: \\#FFFFFF " + cityName;
|
|
cityInfo[1] = "\\#00FF00 Hall ID: \\#FFFFFF " + cityHall;
|
|
cityInfo[2] = "\\#00FF00 Location: \\#FFFFFF " + cityLoc;
|
|
cityInfo[3] = "\\#00FF00 Mayor: \\#FFFFFF " + mayorName + " (" + mayor + ")";
|
|
cityInfo[4] = "\\#00FF00 Rank: \\#FFFFFF " + cityRank;
|
|
cityInfo[5] = "\\#00FF00 # Citizens: \\#FFFFFF " + numCitizens;
|
|
cityInfo[6] = "\\#00FF00 # Structures: \\#FFFFFF " + numStructures;
|
|
cityInfo[7] = "\\#00FF00 Taxes (Income/Property/Sales): \\#FFFFFF " + incomeTax + "/" + propertyTax + "/" + salesTax;
|
|
cityInfo[8] = "\\#00FF00 Voting Information";
|
|
utils.setScriptVar(self, "cityinfo", city_id);
|
|
utils.setScriptVar(self, "cityloc", cityLoc);
|
|
utils.setScriptVar(self, "cityInfo", cityInfo);
|
|
sui.listbox(self, self, "@city/city:cityinfos_d", sui.OK_CANCEL, "@city/city:cityinfos_n", cityInfo, "handleSelectCityInfo");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleSelectCityInfo(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int idx = sui.getListboxSelectedRow(params);
|
|
if (idx < 0)
|
|
{
|
|
idx = 0;
|
|
}
|
|
int btn = sui.getIntButtonPressed(params);
|
|
if (btn == sui.BP_CANCEL)
|
|
{
|
|
String[] cityList = utils.getStringArrayScriptVar(self, "cityList");
|
|
sui.listbox(self, self, "@city/city:cityinfo_d", sui.OK_CANCEL, "@city/city:cityinfo_n", cityList, "handleSelectCity", true, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int city_id = utils.getIntScriptVar(self, "cityinfo");
|
|
if (idx == 2)
|
|
{
|
|
location loc = utils.getLocationScriptVar(self, "cityloc");
|
|
warpPlayer(self, loc.area, loc.x, loc.y, loc.z, loc.cell, 0, 0, 0, null, false);
|
|
}
|
|
else if (idx == 5)
|
|
{
|
|
obj_id[] citizens = cityGetCitizenIds(city_id);
|
|
String[] civInfo = new String[citizens.length];
|
|
for (int i = 0; i < citizens.length; i++)
|
|
{
|
|
String militia = "";
|
|
if (city.hasMilitiaFlag(citizens[i], city_id))
|
|
{
|
|
militia = "\\#FF0000 Militia";
|
|
}
|
|
String citName = cityGetCitizenName(city_id, citizens[i]);
|
|
civInfo[i] = "\\#00FF00 " + citName + "\\#FFFFFF (" + citizens[i] + ")" + militia;
|
|
}
|
|
sui.listbox(self, self, "@city/city:civinfo_d", sui.OK_CANCEL, "@city/city:cityinfo_n", civInfo, "handleNothing", true, false);
|
|
}
|
|
else if (idx == 6)
|
|
{
|
|
obj_id[] structures = cityGetStructureIds(city_id);
|
|
String[] strInfo = new String[structures.length];
|
|
for (int i = 0; i < structures.length; i++)
|
|
{
|
|
int typeflags = cityGetStructureType(city_id, structures[i]);
|
|
String typestring = "";
|
|
if (0 != (typeflags & city.SF_MISSION_TERMINAL))
|
|
{
|
|
typestring = "\\#AAAAAA (Mission Terminal)";
|
|
}
|
|
else if (0 != (typeflags & city.SF_SKILL_TRAINER))
|
|
{
|
|
typestring = "\\#AAAAAA (Skill Trainer)";
|
|
}
|
|
else if (0 != (typeflags & city.SF_DECORATION))
|
|
{
|
|
typestring = "\\#AAAAAA (Decoration)";
|
|
}
|
|
else if (0 != (typeflags & city.SF_COST_CITY_HALL))
|
|
{
|
|
typestring = "\\#AAAAAA (City Hall)";
|
|
}
|
|
strInfo[i] = "\\#00FF00 " + getTemplateName(structures[i]) + "\\#FFFFFF (" + structures[i] + ")" + typestring;
|
|
}
|
|
sui.listbox(self, self, "@city/city:strinfo_d", sui.OK_CANCEL, "@city/city:cityinfo_n", strInfo, "handleNothing", true, false);
|
|
}
|
|
else if (idx == 8)
|
|
{
|
|
Vector vote_names = new Vector();
|
|
vote_names.setSize(0);
|
|
Vector vote_ids = new Vector();
|
|
vote_ids.setSize(0);
|
|
Vector vote_counts = new Vector();
|
|
vote_counts.setSize(0);
|
|
obj_id[] citizens = cityGetCitizenIds(city_id);
|
|
for (obj_id citizen : citizens) {
|
|
if (!isIdValid(citizen)) {
|
|
continue;
|
|
}
|
|
boolean found = false;
|
|
obj_id vote = cityGetCitizenAllegiance(city_id, citizen);
|
|
if (isIdValid(vote)) {
|
|
for (int j = 0; (j < vote_ids.size()); j++) {
|
|
if (((obj_id) vote_ids.get(j)) == vote) {
|
|
vote_counts.set(j, (Integer) vote_counts.get(j) + 1);
|
|
found = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!found) {
|
|
utils.addElement(vote_ids, vote);
|
|
utils.addElement(vote_counts, 1);
|
|
utils.addElement(vote_names, cityGetCitizenName(city_id, citizen));
|
|
}
|
|
}
|
|
}
|
|
utils.setScriptVar(self, "votes_ids", vote_ids);
|
|
obj_id mayor = cityGetLeader(city_id);
|
|
String[] voteInfo = new String[vote_names.size()];
|
|
for (int i = 0; i < voteInfo.length; i++)
|
|
{
|
|
if (((obj_id)vote_ids.get(i)) == mayor)
|
|
{
|
|
voteInfo[i] = "\\#00FF00 " + ((String)vote_names.get(i)) + "\\#AAAAFF Votes: " + (Integer) vote_counts.get(i) + "\\#FFFFFF (" + ((obj_id)vote_ids.get(i)) + ") " + "\\#AAAAAA (Incumbent)";
|
|
}
|
|
else
|
|
{
|
|
voteInfo[i] = "\\#00FF00 " + ((String)vote_names.get(i)) + "\\#AAAAFF Votes: " + (Integer) vote_counts.get(i) + "\\#FFFFFF (" + ((obj_id)vote_ids.get(i)) + ")";
|
|
}
|
|
}
|
|
sui.listbox(self, self, "@city/city:voteinfo_d", sui.OK_CANCEL, "@city/city:cityinfo_n", voteInfo, "handleSelectRunner", true, false);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleSelectRunner(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int idx = sui.getListboxSelectedRow(params);
|
|
if (idx < 0)
|
|
{
|
|
idx = 0;
|
|
}
|
|
int btn = sui.getIntButtonPressed(params);
|
|
if (btn == sui.BP_CANCEL)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int city_id = utils.getIntScriptVar(self, "cityinfo");
|
|
obj_id[] runners = utils.getObjIdArrayScriptVar(self, "votes_ids");
|
|
obj_id runner = runners[idx];
|
|
Vector vote_names = new Vector();
|
|
vote_names.setSize(0);
|
|
Vector vote_ids = new Vector();
|
|
vote_ids.setSize(0);
|
|
obj_id[] citizens = cityGetCitizenIds(city_id);
|
|
for (obj_id citizen : citizens) {
|
|
if (!isIdValid(citizen)) {
|
|
continue;
|
|
}
|
|
boolean found = false;
|
|
obj_id vote = cityGetCitizenAllegiance(city_id, citizen);
|
|
if (vote == runner) {
|
|
utils.addElement(vote_ids, citizen);
|
|
utils.addElement(vote_names, cityGetCitizenName(city_id, citizen));
|
|
}
|
|
}
|
|
String[] voteInfo = new String[vote_names.size()];
|
|
for (int i = 0; i < voteInfo.length; i++)
|
|
{
|
|
voteInfo[i] = "\\#00FF00 " + ((String)vote_names.get(i)) + "\\#FFFFFF (" + ((obj_id)vote_ids.get(i)) + ")";
|
|
}
|
|
sui.listbox(self, self, "@city/city:voterinfo_d", sui.OK_CANCEL, "@city/city:cityinfo_n", voteInfo, "handleNothing", true, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnSkillGranted(obj_id self, String skillName) throws InterruptedException
|
|
{
|
|
if (!hasObjVar(self, "clickRespec.granting") && !hasObjVar(self, "npcRespec.inProgress"))
|
|
{
|
|
if (getLevel(self) <= 1)
|
|
{
|
|
playClientEffectObj(self, "clienteffect/skill_granted.cef", self, null);
|
|
showFlyText(self, new string_id("cbt_spam", "skill_up"), 2.5f, colors.YELLOWGREEN);
|
|
}
|
|
}
|
|
badge.grantMasterSkillBadge(self, skillName);
|
|
static_item.validateWornEffects(self);
|
|
if (skillName.endsWith("_novice"))
|
|
{
|
|
if (!setupNovicePilotSkill(self, skillName))
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
}
|
|
if (!allowedBySpaceExpansion(self, skillName))
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
if (skillName.startsWith("expertise_"))
|
|
{
|
|
expertise.cacheExpertiseProcReacList(self);
|
|
armor.recalculateArmorForPlayer(self);
|
|
if (utils.isProfession(self, utils.SMUGGLER))
|
|
{
|
|
messageTo(self, "applySmugglingBonuses", null, 1.0f, false);
|
|
}
|
|
if (utils.isProfession(self, utils.FORCE_SENSITIVE))
|
|
{
|
|
if (buff.isInStance(self))
|
|
{
|
|
buff.removeBuff(self, jedi.JEDI_STANCE);
|
|
buff.applyBuff(self, jedi.JEDI_STANCE);
|
|
}
|
|
if (buff.isInFocus(self))
|
|
{
|
|
buff.removeBuff(self, jedi.JEDI_FOCUS);
|
|
buff.applyBuff(self, jedi.JEDI_FOCUS);
|
|
}
|
|
}
|
|
if (!expertise.isProfAllowedSkill(self, skillName))
|
|
{
|
|
revokeSkillSilent(self, skillName);
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
obj_id tempWeapon = getObjectInSlot(self, "hold_r");
|
|
if (isIdValid(tempWeapon))
|
|
{
|
|
weapons.adjustWeaponRangeForExpertise(self, tempWeapon, true);
|
|
}
|
|
skill.recalcPlayerPools(self, false);
|
|
}
|
|
// when we learn our first beast master skill, store the current expertise version we're learning from
|
|
if(skillName.equalsIgnoreCase("expertise_bm_incubation_base_1")) {
|
|
int row = dataTableSearchColumnForString("beast_master", "profession", respec.EXPERTISE_VERSION_TABLE);
|
|
int bmExpertiseVersion = dataTableGetInt(respec.EXPERTISE_VERSION_TABLE, row, "version");
|
|
setObjVar(self, respec.BEAST_MASTER_EXPERTISE_VERSION_OBJVAR, bmExpertiseVersion);
|
|
}
|
|
recomputeCommandSeries(self);
|
|
beast_lib.verifyAndUpdateCalledBeastStats(self);
|
|
trial.bumpSession(self, "displayDefensiveMods");
|
|
messageTo(self, "setDisplayOnlyDefensiveMods", trial.getSessionDict(self, "displayDefensiveMods"), 5, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleStartJediKnightTrials(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (!hasScript(self, jedi_trials.KNIGHT_TRIALS_SCRIPT))
|
|
{
|
|
attachScript(self, jedi_trials.KNIGHT_TRIALS_SCRIPT);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnStartCharacterUpload(obj_id self, byte[] results, modifiable_int resultSize, boolean w, boolean ao) throws InterruptedException
|
|
{
|
|
Boolean withItems = w;
|
|
dictionary params = new dictionary();
|
|
params.put("withItems", w);
|
|
params.put("allowOverride", ao);
|
|
Object[] triggerParams = new Object[2];
|
|
triggerParams[0] = self;
|
|
triggerParams[1] = params;
|
|
CustomerServiceLog("CharacterTransfer", "OnStartCharacterUpload(withItems=" + withItems + ", allowOverride=" + ao + ")");
|
|
resultSize.set(0);
|
|
String result = null;
|
|
try
|
|
{
|
|
int err = script_entry.runScripts("OnUploadCharacter", triggerParams);
|
|
if (err == SCRIPT_CONTINUE)
|
|
{
|
|
byte[] tmp = params.pack();
|
|
if (tmp.length < results.length)
|
|
{
|
|
int i;
|
|
for (i = 0; i < tmp.length; ++i)
|
|
{
|
|
results[i] = tmp[i];
|
|
}
|
|
resultSize.set(tmp.length);
|
|
}
|
|
else
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "OnStartCharacterUpload(withItems=" + withItems + ") tmp.length=" + tmp.length + " is >= results.length=" + results.length + ", not enough buffer space to pack the dictionary! character transfer will FAIL");
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "OnStartCharacterUpload(withItems=" + withItems + ") runScripts(\"OnUploadCharacter\") returned SCRIPT_OVERRIDE, character transfer will FAIL");
|
|
final string_id mailTransferFailedScriptError = new string_id("character_transfer", "failed_internal_script_error");
|
|
final string_id mailTransferFailedSubject = new string_id("character_transfer", "failed_subject");
|
|
utils.sendMail(mailTransferFailedScriptError, mailTransferFailedScriptError, self, "System");
|
|
resultSize.set(0);
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
}
|
|
catch(Throwable t)
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "OnStartCharacterUpload(withItems=" + withItems + ") : an exception was thrown, character transfer will FAIL : " + t);
|
|
final string_id mailTransferFailedScriptError = new string_id("character_transfer", "failed_internal_script_error");
|
|
final string_id mailTransferFailedSubject = new string_id("character_transfer", "failed_subject");
|
|
utils.sendMail(mailTransferFailedScriptError, mailTransferFailedScriptError, self, "System");
|
|
result = null;
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public boolean ctsCheckAndLogUniqueStaticItemAlreadyExists(obj_id container, dictionary itemDictionary) throws InterruptedException
|
|
{
|
|
if (isIdNull(container) || (itemDictionary == null))
|
|
{
|
|
return false;
|
|
}
|
|
if (itemDictionary.containsKey("staticItemName"))
|
|
{
|
|
String staticItemName = itemDictionary.getString("staticItemName");
|
|
if (staticItemName == null)
|
|
{
|
|
return false;
|
|
}
|
|
if (!static_item.isUniqueStaticItem(staticItemName))
|
|
{
|
|
return false;
|
|
}
|
|
obj_id containerOwnerId = getOwner(container);
|
|
if (isIdNull(containerOwnerId))
|
|
{
|
|
return false;
|
|
}
|
|
if (!isPlayer(containerOwnerId))
|
|
{
|
|
return false;
|
|
}
|
|
if (utils.playerHasStaticItemInBankOrInventory(containerOwnerId, staticItemName))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "unique static item " + staticItemName + " already exists");
|
|
return true;
|
|
}
|
|
if (utils.playerHasStaticItemInAppearanceInventory(containerOwnerId, staticItemName))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "unique static item " + staticItemName + " already exists");
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
public boolean ctsHasExceededResourceTransferLimit(int crateCountLimit, int currentCrateCount, long unitCountLimit, long currentUnitCount) throws InterruptedException
|
|
{
|
|
if ((crateCountLimit > 0) && (currentCrateCount >= crateCountLimit))
|
|
{
|
|
return true;
|
|
}
|
|
if ((unitCountLimit > 0L) && (currentUnitCount >= unitCountLimit))
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
public obj_id unpackItem(obj_id container, dictionary itemDictionary) throws InterruptedException
|
|
{
|
|
obj_id newItem = null;
|
|
try
|
|
{
|
|
obj_id self = getSelf();
|
|
if (!isIdValid(self))
|
|
{
|
|
return null;
|
|
}
|
|
LIVE_LOG("CharacterTransfer", "unpackItem(" + container + ", " + itemDictionary + ")");
|
|
if (!itemDictionary.containsKey("objectTemplateCrc"))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() : could not retrieve object template crc from item dictionary. TRANSFER FAILED");
|
|
return null;
|
|
}
|
|
int objectTemplateCrc = itemDictionary.getInt("objectTemplateCrc");
|
|
String objectTemplateName = "UNKNOWN ITEM";
|
|
if (itemDictionary.containsKey("objectTemplateName"))
|
|
{
|
|
objectTemplateName = itemDictionary.getString("objectTemplateName");
|
|
}
|
|
boolean isEquipped = false;
|
|
if (itemDictionary.containsKey("isEquipped"))
|
|
{
|
|
isEquipped = itemDictionary.getBoolean("isEquipped");
|
|
}
|
|
boolean isAppearanceEquipped = false;
|
|
if (itemDictionary.containsKey("isAppearanceEquipped"))
|
|
{
|
|
isAppearanceEquipped = itemDictionary.getBoolean("isAppearanceEquipped");
|
|
}
|
|
if (itemDictionary.containsKey("staticItemName"))
|
|
{
|
|
String staticItemName = itemDictionary.getString("staticItemName");
|
|
newItem = static_item.createNewItemFunction(staticItemName, container);
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() : createNewItemFunction(" + staticItemName + ", " + container + ") = " + newItem);
|
|
}
|
|
else if (itemDictionary.containsKey("msoDraftSchematicCrc"))
|
|
{
|
|
int schematicCrc = itemDictionary.getInt("msoDraftSchematicCrc");
|
|
newItem = createSchematic(schematicCrc, container);
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() : createSchematic(" + schematicCrc + ", " + container + ") = " + newItem);
|
|
}
|
|
else if (itemDictionary.containsKey("schematicTemplateCrc"))
|
|
{
|
|
return null;
|
|
}
|
|
else
|
|
{
|
|
if (isEquipped || isAppearanceEquipped)
|
|
{
|
|
newItem = createObjectInInventoryAllowOverload(objectTemplateCrc, self);
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() : createObjectInInventoryAllowOverload(" + objectTemplateCrc + "=" + objectTemplateName + ", " + self + ") = " + newItem);
|
|
}
|
|
else if (itemDictionary.containsKey("bypassVolumeCheck"))
|
|
{
|
|
newItem = createObjectInInventoryAllowOverload(objectTemplateCrc, self);
|
|
}
|
|
else
|
|
{
|
|
int containerType = getContainerType(container);
|
|
if (containerType == 2)
|
|
{
|
|
newItem = createObjectOverloaded(objectTemplateCrc, container);
|
|
}
|
|
else
|
|
{
|
|
newItem = createObject(objectTemplateCrc, container, "");
|
|
}
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() : createObjectOverloaded(" + objectTemplateCrc + "=" + objectTemplateName + ", " + container + ") = " + newItem);
|
|
}
|
|
}
|
|
if (!isIdValid(newItem))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() : FAILED to create object in container " + container + ": " + itemDictionary);
|
|
return null;
|
|
}
|
|
else
|
|
{
|
|
setOwner(newItem, self);
|
|
utils.setLocalVar(newItem, "ctsBeingUnpacked", true);
|
|
}
|
|
if (!itemDictionary.containsKey("packedObjvars"))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() : FAILED to retrieve packedObjvars from item dictionary: " + itemDictionary);
|
|
return null;
|
|
}
|
|
String packedObjvars = itemDictionary.getString("packedObjvars");
|
|
if (packedObjvars == null)
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() : FAILED to get a non-null packedObjvars value from item dictionary: " + itemDictionary);
|
|
return null;
|
|
}
|
|
setPackedObjvars(newItem, packedObjvars);
|
|
int objectType = getGameObjectType(newItem);
|
|
if (!static_item.isStaticItem(newItem))
|
|
{
|
|
if (itemDictionary.containsKey("attribute_types") && itemDictionary.containsKey("attribute_values"))
|
|
{
|
|
int[] itemAttribTypes = itemDictionary.getIntArray("attribute_types");
|
|
int[] itemAttribValues = itemDictionary.getIntArray("attribute_values");
|
|
if (itemAttribTypes != null && itemAttribValues != null)
|
|
{
|
|
attribute[] itemAttribs = new attribute[itemAttribTypes.length];
|
|
int itemAttribsIter;
|
|
for (itemAttribsIter = 0; itemAttribsIter < itemAttribTypes.length; ++itemAttribsIter)
|
|
{
|
|
itemAttribs[itemAttribsIter] = new attribute(itemAttribTypes[itemAttribsIter], itemAttribValues[itemAttribsIter]);
|
|
}
|
|
if (!setMaxAttribs(newItem, itemAttribs))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "setMaxAttribs( " + newItem + ", ...) FAILED");
|
|
}
|
|
if (!setAttribs(newItem, itemAttribs))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "setAttribs( " + newItem + ", ...) FAILED");
|
|
}
|
|
}
|
|
}
|
|
if (itemDictionary.containsKey("maxHitpoints"))
|
|
{
|
|
int maxHitpoints = itemDictionary.getInt("maxHitpoints");
|
|
if (!setMaxHitpoints(newItem, maxHitpoints))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "setMaxHitpoints( " + newItem + ", " + maxHitpoints + ") FAILED");
|
|
}
|
|
}
|
|
if (itemDictionary.containsKey("hitpoints"))
|
|
{
|
|
int hitpoints = itemDictionary.getInt("hitpoints");
|
|
if (!setInvulnerableHitpoints(newItem, hitpoints))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "setInvulnerableHitpoints( " + newItem + ", " + hitpoints + ") FAILED");
|
|
}
|
|
}
|
|
if (itemDictionary.containsKey("conditionFlags"))
|
|
{
|
|
int conditionFlags = itemDictionary.getInt("conditionFlags");
|
|
if (!setCondition(newItem, conditionFlags))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "setCondition( " + newItem + ", " + conditionFlags + ") FAILED");
|
|
}
|
|
}
|
|
if (itemDictionary.containsKey("scripts"))
|
|
{
|
|
String[] itemScripts = itemDictionary.getStringArray("scripts");
|
|
if (itemScripts != null && itemScripts.length > 0)
|
|
{
|
|
int scriptIter;
|
|
for (scriptIter = 0; scriptIter < itemScripts.length; ++scriptIter)
|
|
{
|
|
if (!hasScript(newItem, itemScripts[scriptIter]))
|
|
{
|
|
attachScript(newItem, itemScripts[scriptIter]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (itemDictionary.containsKey("objectName"))
|
|
{
|
|
String objectName = itemDictionary.getString("objectName");
|
|
setName(newItem, objectName);
|
|
}
|
|
if (itemDictionary.containsKey("isWeaponItem"))
|
|
{
|
|
boolean isWeaponItem = itemDictionary.getBoolean("isWeaponItem");
|
|
if (isWeaponItem)
|
|
{
|
|
if (itemDictionary.containsKey("currentVersion"))
|
|
{
|
|
int currentVersion = itemDictionary.getInt("currentVersion");
|
|
setConversionId(newItem, currentVersion);
|
|
}
|
|
int minDamage = itemDictionary.getInt("minDamage");
|
|
if (!setWeaponMinDamage(newItem, minDamage))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "setWeaponMinDamage( " + newItem + ", " + minDamage + ") FAILED");
|
|
}
|
|
int maxDamage = itemDictionary.getInt("maxDamage");
|
|
if (!setWeaponMaxDamage(newItem, maxDamage))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "setWeaponMaxDamage( " + newItem + ", " + maxDamage + ") FAILED");
|
|
}
|
|
float attackSpeed = itemDictionary.getFloat("attackSpeed");
|
|
if (!setWeaponAttackSpeed(newItem, attackSpeed))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "setWeaponAttackSpeed( " + newItem + ", " + attackSpeed + ") FAILED");
|
|
}
|
|
range_info rangeInfo = new range_info();
|
|
rangeInfo.minRange = itemDictionary.getFloat("rangeInfoMinRange");
|
|
rangeInfo.maxRange = itemDictionary.getFloat("rangeInfoMaxRange");
|
|
if (!setWeaponRangeInfo(newItem, rangeInfo))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "setWeaponRangeInfo( " + newItem + ", " + rangeInfo + ") FAILED");
|
|
}
|
|
float woundChance = itemDictionary.getFloat("woundChance");
|
|
if (!setWeaponWoundChance(newItem, woundChance))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "setWeaponWoundChance( " + newItem + ", " + woundChance + ") FAILED");
|
|
}
|
|
float damageRadius = itemDictionary.getFloat("damageRadius");
|
|
if (!setWeaponDamageRadius(newItem, damageRadius))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "setWeaponDamageRadius( " + newItem + ", " + damageRadius + ") FAILED");
|
|
}
|
|
int accuracy = itemDictionary.getInt("accuracy");
|
|
if (!setWeaponAccuracy(newItem, accuracy))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "setWeaponAccuracy( " + newItem + ", " + accuracy + ") FAILED");
|
|
}
|
|
int elementalType = itemDictionary.getInt("elementalType");
|
|
if (!setWeaponElementalType(newItem, elementalType))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "setWeaponElemetalType( " + newItem + ", " + elementalType + ") FAILED");
|
|
}
|
|
int elementalValue = itemDictionary.getInt("elementalValue");
|
|
if (!setWeaponElementalValue(newItem, elementalValue))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "setWeaponElemetalValue( " + newItem + ", " + elementalValue + ") FAILED");
|
|
}
|
|
int damageType = itemDictionary.getInt("damageType");
|
|
if (!setWeaponDamageType(newItem, damageType))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "setWeaponDamageType( " + newItem + ", " + damageType + ") FAILED");
|
|
}
|
|
int attackCost = itemDictionary.getInt("attackCost");
|
|
if (!setWeaponAttackCost(newItem, attackCost))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "setWeaponAttackCost( " + newItem + ", " + attackCost + ") FAILED");
|
|
}
|
|
weapons.setWeaponData(newItem);
|
|
}
|
|
}
|
|
if (itemDictionary.containsKey("colorData"))
|
|
{
|
|
dictionary colorData = itemDictionary.getDictionary("colorData");
|
|
hue.setPalcolorData(newItem, colorData);
|
|
}
|
|
if (itemDictionary.containsKey("customAppearance"))
|
|
{
|
|
byte[] customAppearance = itemDictionary.getByteArray("customAppearance");
|
|
setAutoVariableFromByteStream(newItem, "customAppearance", customAppearance);
|
|
}
|
|
if (itemDictionary.containsKey("appearanceData"))
|
|
{
|
|
byte[] appearanceData = itemDictionary.getByteArray("appearanceData");
|
|
setAutoVariableFromByteStream(newItem, "appearanceData", appearanceData);
|
|
}
|
|
}
|
|
if (hasCondition(newItem, CONDITION_LOCKED))
|
|
{
|
|
clearUserAccessList(newItem);
|
|
clearGuildAccessList(newItem);
|
|
addUserToAccessList(newItem, self);
|
|
if (hasObjVar(newItem, "lock_owner"))
|
|
{
|
|
setObjVar(newItem, "lock_owner", self);
|
|
}
|
|
if (hasObjVar(newItem, "lock_owner_name"))
|
|
{
|
|
setObjVar(newItem, "lock_owner_name", getName(self));
|
|
}
|
|
}
|
|
if (itemDictionary.containsKey("count"))
|
|
{
|
|
int count = itemDictionary.getInt("count");
|
|
if (!setCount(newItem, count))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "setCount( " + newItem + ", " + count + ") FAILED");
|
|
}
|
|
}
|
|
if (itemDictionary.containsKey("bankBalance"))
|
|
{
|
|
byte[] bankBalance = itemDictionary.getByteArray("bankBalance");
|
|
setAutoVariableFromByteStream(newItem, "bankBalance", bankBalance);
|
|
}
|
|
if (isGameObjectTypeOf(objectType, GOT_ship))
|
|
{
|
|
if ((objectTemplateName != null) && (objectTemplateName.endsWith("player_sorosuub_space_yacht.iff")))
|
|
{
|
|
}
|
|
else
|
|
{
|
|
space_crafting.uninstallAll(newItem);
|
|
}
|
|
float mass = itemDictionary.getFloat("ship_mass");
|
|
float maxHp = itemDictionary.getFloat("ship_hp");
|
|
float currentHp = itemDictionary.getFloat("ship_current_hp");
|
|
setChassisComponentMassMaximum(newItem, mass);
|
|
setShipMaximumChassisHitPoints(newItem, maxHp);
|
|
setShipCurrentChassisHitPoints(newItem, currentHp);
|
|
if (itemDictionary.containsKey("droid_control_device"))
|
|
{
|
|
obj_id objDroidControlDevice = itemDictionary.getObjId("droid_control_device");
|
|
if (isIdValid(objDroidControlDevice))
|
|
{
|
|
utils.setLocalVar(newItem, "droid_control_device", objDroidControlDevice);
|
|
}
|
|
}
|
|
if (itemDictionary.containsKey("shipComponents"))
|
|
{
|
|
obj_id datapad = getContainedBy(container);
|
|
obj_id player = getOwner(datapad);
|
|
if (isIdValid(player))
|
|
{
|
|
dictionary componentsDictionary = itemDictionary.getDictionary("shipComponents");
|
|
if (componentsDictionary != null)
|
|
{
|
|
Set keySet = componentsDictionary.keySet();
|
|
Integer[] slots = new Integer[keySet.size()];
|
|
keySet.toArray(slots);
|
|
for (Integer slot : slots) {
|
|
dictionary componentDictionary = componentsDictionary.getDictionary(slot);
|
|
if (ctsCheckAndLogUniqueStaticItemAlreadyExists(player, componentDictionary)) {
|
|
continue;
|
|
}
|
|
componentDictionary.put("bypassVolumeCheck", 1);
|
|
obj_id newComponent = unpackItem(player, componentsDictionary.getDictionary(slot));
|
|
if (isIdValid(newComponent)) {
|
|
shipInstallComponent(player, newItem, slot, newComponent);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (itemDictionary.containsKey("isCrystalOwner"))
|
|
{
|
|
if (hasObjVar(self, "preserve_existing_lightsaber_crystal_owner_objvar"))
|
|
{
|
|
String namePrefix = getStringObjVar(self, "preserve_existing_lightsaber_crystal_owner_objvar");
|
|
if ((namePrefix != null) && (namePrefix.length() > 0) && !namePrefix.equals("none"))
|
|
{
|
|
String existingName = getStringObjVar(newItem, jedi.VAR_CRYSTAL_OWNER_NAME);
|
|
if ((existingName != null) && (existingName.length() > 0))
|
|
{
|
|
setObjVar(newItem, jedi.VAR_CRYSTAL_OWNER_NAME, namePrefix + existingName);
|
|
}
|
|
}
|
|
setObjVar(newItem, jedi.VAR_CRYSTAL_OWNER_ID, 0);
|
|
}
|
|
else
|
|
{
|
|
if (itemDictionary.getBoolean("isCrystalOwner"))
|
|
{
|
|
setObjVar(newItem, jedi.VAR_CRYSTAL_OWNER_ID, self);
|
|
setObjVar(newItem, jedi.VAR_CRYSTAL_OWNER_NAME, getName(self));
|
|
}
|
|
else
|
|
{
|
|
setObjVar(newItem, jedi.VAR_CRYSTAL_OWNER_ID, 0);
|
|
setObjVar(newItem, jedi.VAR_CRYSTAL_OWNER_NAME, "None");
|
|
}
|
|
}
|
|
String name = getEncodedName(newItem);
|
|
if (name.startsWith("@"))
|
|
{
|
|
name = localize(getNameStringId(newItem));
|
|
}
|
|
name = "\\" + colors_hex.GREEN + "" + name + " (tuned)\\#.";
|
|
setName(newItem, name);
|
|
}
|
|
if (itemDictionary.containsKey("biolink"))
|
|
{
|
|
obj_id biolink = itemDictionary.getObjId("biolink");
|
|
if (itemDictionary.getBoolean("isBiolinkOwner"))
|
|
{
|
|
biolink = self;
|
|
}
|
|
if (!setBioLink(newItem, biolink))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "setBioLink( " + newItem + ", " + biolink + ") FAILED");
|
|
}
|
|
}
|
|
if (isGameObjectTypeOf(objectType, GOT_resource_container))
|
|
{
|
|
if (objectType != GOT_resource_container_pseudo)
|
|
{
|
|
if (itemDictionary.containsKey("resourceQuantity") && itemDictionary.containsKey("resourceData"))
|
|
{
|
|
int quantity = itemDictionary.getInt("resourceQuantity");
|
|
String resourceData = itemDictionary.getString("resourceData");
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() : created resource container " + newItem + ": resourceQuantity=" + quantity + ", resourceData=" + resourceData);
|
|
setResourceCtsData(newItem, quantity, resourceData);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() : created pseudo resource container " + newItem);
|
|
}
|
|
}
|
|
if (objectType == GOT_misc_factory_crate)
|
|
{
|
|
recomputeCrateAttributes(newItem);
|
|
}
|
|
if ((objectType == GOT_data_manufacturing_schematic) && itemDictionary.containsKey("msoCtsPackUnpack"))
|
|
{
|
|
byte[] data = itemDictionary.getByteArray("msoCtsPackUnpack");
|
|
setAutoVariableFromByteStream(newItem, "msoCtsPackUnpack", data);
|
|
if (itemDictionary.containsKey("msoConversionId"))
|
|
{
|
|
setConversionId(newItem, itemDictionary.getInt("msoConversionId"));
|
|
}
|
|
}
|
|
if (objectType == GOT_data_mission_object)
|
|
{
|
|
if (itemDictionary.containsKey("moCtsPackUnpack"))
|
|
{
|
|
byte[] data = itemDictionary.getByteArray("moCtsPackUnpack");
|
|
setAutoVariableFromByteStream(newItem, "moCtsPackUnpack", data);
|
|
}
|
|
if (itemDictionary.containsKey("missionAge"))
|
|
{
|
|
int timeCreated = (getGameTime() - itemDictionary.getInt("missionAge"));
|
|
if (timeCreated <= 0)
|
|
{
|
|
timeCreated = 1;
|
|
}
|
|
setObjVar(newItem, "time_created", timeCreated);
|
|
}
|
|
}
|
|
if (objectType == GOT_chronicles_quest_holocron || objectType == GOT_chronicles_quest_holocron_recipe)
|
|
{
|
|
if (itemDictionary.containsKey("PGCPacked"))
|
|
{
|
|
byte[] data = itemDictionary.getByteArray("PGCPacked");
|
|
setAutoVariableFromByteStream(newItem, "PGCPacked", data);
|
|
}
|
|
if (objectType == GOT_chronicles_quest_holocron_recipe)
|
|
{
|
|
setPlayerQuestCreator(newItem, self);
|
|
setObjVar(newItem, pgc_quests.PCG_QUEST_CREATOR_ID_OBJVAR, self);
|
|
setObjVar(newItem, pgc_quests.PCG_QUEST_CREATOR_STATIONID_OBJVAR, getPlayerStationId(self));
|
|
setObjVar(newItem, pgc_quests.PCG_QUEST_CREATOR_NAME_OBJVAR, getName(self));
|
|
}
|
|
}
|
|
if ((objectTemplateCrc == (2082993503)) && (hasObjVar(newItem, incubator.RESOURCE_POWER_NAME)))
|
|
{
|
|
if (itemDictionary.containsKey("incubatorResourceData"))
|
|
{
|
|
byte[] data = itemDictionary.getByteArray("incubatorResourceData");
|
|
setAutoVariableFromByteStream(newItem, "incubatorResourceData", data);
|
|
}
|
|
}
|
|
if (objectType == GOT_installation_factory)
|
|
{
|
|
setObjVar(newItem, player_structure.VAR_OWNER, getPlayerName(self));
|
|
String[] admin_list = new String[1];
|
|
admin_list[0] = self.toString();
|
|
setObjVar(newItem, player_structure.VAR_ADMIN_LIST, admin_list);
|
|
setObjVar(newItem, player_structure.VAR_HOPPER_LIST, admin_list);
|
|
removeObjVar(newItem, player_structure.VAR_ENTER_LIST);
|
|
removeObjVar(newItem, player_structure.VAR_BAN_LIST);
|
|
removeObjVar(newItem, player_structure.VAR_VENDOR_LIST);
|
|
removeObjVar(newItem, "city_id");
|
|
removeObjVar(newItem, player_structure.VAR_IS_GUILD_HALL);
|
|
if (itemDictionary.containsKey("powerValue"))
|
|
{
|
|
byte[] powerValue = itemDictionary.getByteArray("powerValue");
|
|
setAutoVariableFromByteStream(newItem, "powerValue", powerValue);
|
|
}
|
|
if (itemDictionary.containsKey("powerRate"))
|
|
{
|
|
byte[] powerRate = itemDictionary.getByteArray("powerRate");
|
|
setAutoVariableFromByteStream(newItem, "powerRate", powerRate);
|
|
}
|
|
if (itemDictionary.containsKey("manf_schematic"))
|
|
{
|
|
dictionary dictManfSchematic = itemDictionary.getDictionary("manf_schematic");
|
|
if (dictManfSchematic != null)
|
|
{
|
|
obj_id manfSchematic = unpackItem(utils.getPlayerDatapad(self), dictManfSchematic);
|
|
if (isIdValid(manfSchematic))
|
|
{
|
|
transferManufactureSchematicToStation(manfSchematic, newItem);
|
|
}
|
|
}
|
|
}
|
|
if (itemDictionary.containsKey("ingr_hopper_contents"))
|
|
{
|
|
dictionary dictIngrHopperContents = itemDictionary.getDictionary("ingr_hopper_contents");
|
|
if (dictIngrHopperContents != null)
|
|
{
|
|
obj_id ingrHopper = getObjectInSlot(newItem, "ingredient_hopper");
|
|
if (isIdValid(ingrHopper))
|
|
{
|
|
Set keySet = dictIngrHopperContents.keySet();
|
|
for (Object o : keySet) {
|
|
obj_id key = (obj_id) o;
|
|
dictionary containedItemDict = dictIngrHopperContents.getDictionary(key);
|
|
if (containedItemDict == null) {
|
|
continue;
|
|
}
|
|
if (ctsCheckAndLogUniqueStaticItemAlreadyExists(ingrHopper, containedItemDict)) {
|
|
continue;
|
|
}
|
|
unpackItem(ingrHopper, containedItemDict);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (itemDictionary.containsKey("output_hopper_contents"))
|
|
{
|
|
dictionary dictOutputHopperContents = itemDictionary.getDictionary("output_hopper_contents");
|
|
if (dictOutputHopperContents != null)
|
|
{
|
|
obj_id outputHopper = getObjectInSlot(newItem, "output_hopper");
|
|
if (isIdValid(outputHopper))
|
|
{
|
|
Set keySet = dictOutputHopperContents.keySet();
|
|
for (Object o : keySet) {
|
|
obj_id key = (obj_id) o;
|
|
dictionary containedItemDict = dictOutputHopperContents.getDictionary(key);
|
|
if (containedItemDict == null) {
|
|
continue;
|
|
}
|
|
if (ctsCheckAndLogUniqueStaticItemAlreadyExists(outputHopper, containedItemDict)) {
|
|
continue;
|
|
}
|
|
unpackItem(outputHopper, containedItemDict);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (objectType == GOT_misc_crafting_station)
|
|
{
|
|
if (itemDictionary.containsKey("input_hopper_contents"))
|
|
{
|
|
dictionary dictInputHopperContents = itemDictionary.getDictionary("input_hopper_contents");
|
|
if (dictInputHopperContents != null)
|
|
{
|
|
obj_id inputHopper = getObjectInSlot(newItem, "ingredient_hopper");
|
|
if (isIdValid(inputHopper))
|
|
{
|
|
Set keySet = dictInputHopperContents.keySet();
|
|
for (Object o : keySet) {
|
|
obj_id key = (obj_id) o;
|
|
dictionary containedItemDict = dictInputHopperContents.getDictionary(key);
|
|
if (containedItemDict == null) {
|
|
continue;
|
|
}
|
|
if (ctsCheckAndLogUniqueStaticItemAlreadyExists(inputHopper, containedItemDict)) {
|
|
continue;
|
|
}
|
|
unpackItem(inputHopper, containedItemDict);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (itemDictionary.containsKey("isBlueprintDesigner"))
|
|
{
|
|
if (itemDictionary.getBoolean("isBlueprintDesigner"))
|
|
{
|
|
setObjVar(newItem, storyteller.BLUEPRINT_AUTHOR_OBJVAR, self);
|
|
}
|
|
else
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "Player is not blueprint's designer: player = " + self + "; blueprint = " + newItem);
|
|
}
|
|
}
|
|
if (isGameObjectTypeOf(objectType, GOT_building))
|
|
{
|
|
if (itemDictionary.containsKey("lotOverlimitStructureId"))
|
|
{
|
|
obj_id lotOverlimitStructureOnCharacter = getObjIdObjVar(self, "lotOverlimit.structure_id");
|
|
if (isIdValid(lotOverlimitStructureOnCharacter))
|
|
{
|
|
obj_id lotOverlimitStructure = itemDictionary.getObjId("lotOverlimitStructureId");
|
|
if (isIdValid(lotOverlimitStructure) && (lotOverlimitStructure == lotOverlimitStructureOnCharacter))
|
|
{
|
|
setObjVar(self, "lotOverlimit.structure_id", newItem);
|
|
setObjVar(self, "lotOverlimit.structure_location", "Datapad");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (itemDictionary.containsKey("house_contents"))
|
|
{
|
|
setObjVar(newItem, player_structure.VAR_OWNER, getPlayerName(self));
|
|
String[] admin_list = new String[1];
|
|
admin_list[0] = self.toString();
|
|
setObjVar(newItem, player_structure.VAR_ADMIN_LIST, admin_list);
|
|
removeObjVar(newItem, player_structure.VAR_ENTER_LIST);
|
|
removeObjVar(newItem, player_structure.VAR_BAN_LIST);
|
|
removeObjVar(newItem, player_structure.VAR_VENDOR_LIST);
|
|
removeObjVar(newItem, player_structure.VAR_HOPPER_LIST);
|
|
removeObjVar(newItem, player_structure.VAR_IS_GUILD_HALL);
|
|
dictionary contentsDict = itemDictionary.getDictionary("house_contents");
|
|
Set keySet = contentsDict.keySet();
|
|
for (Object o : keySet) {
|
|
obj_id key = (obj_id) o;
|
|
if (isIdNull(key)) {
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() FAILED: key " + key + " not valid in house contents dictionary: " + contentsDict);
|
|
return null;
|
|
}
|
|
dictionary containedItemDict = contentsDict.getDictionary(key);
|
|
if (containedItemDict == null) {
|
|
continue;
|
|
}
|
|
if (ctsCheckAndLogUniqueStaticItemAlreadyExists(utils.getInventoryContainer(self), containedItemDict)) {
|
|
continue;
|
|
}
|
|
containedItemDict.put("bypassVolumeCheck", 1);
|
|
obj_id house_item = unpackItem(utils.getInventoryContainer(self), containedItemDict);
|
|
if (isIdValid(house_item)) {
|
|
location loc = containedItemDict.getLocation("house_cell_loc");
|
|
String cell_name = containedItemDict.getString("house_cell");
|
|
obj_id cellid = getCellId(newItem, cell_name);
|
|
if (isIdValid(cellid)) {
|
|
loc.cell = cellid;
|
|
setLocation(house_item, loc);
|
|
}
|
|
float[] quaternion = containedItemDict.getFloatArray("quaternion");
|
|
if ((quaternion != null) && (quaternion.length == 4)) {
|
|
setQuaternion(house_item, quaternion[0], quaternion[1], quaternion[2], quaternion[3]);
|
|
}
|
|
requestSendPositionUpdate(house_item);
|
|
}
|
|
}
|
|
if (isGameObjectTypeOf(objectType, GOT_building))
|
|
{
|
|
loadBuildingContents(self, newItem);
|
|
}
|
|
}
|
|
if ((objectType == GOT_installation_factory) || isGameObjectTypeOf(objectType, GOT_building))
|
|
{
|
|
if (hasObjVar(newItem, player_structure.VAR_LAST_MAINTANENCE))
|
|
{
|
|
setObjVar(newItem, player_structure.VAR_LAST_MAINTANENCE, getGameTime());
|
|
}
|
|
}
|
|
int containerType = itemDictionary.getInt("containerType");
|
|
if (containerType > 0 || jedi.isLightsaber(newItem) || isGameObjectTypeOf(objectType, GOT_data_ship_control_device))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() : unpacking contents of container " + newItem + "(type " + containerType + ")");
|
|
if (itemDictionary.containsKey("contents"))
|
|
{
|
|
if (objectTemplateName.equals("object/intangible/ship/navicomputer_1.iff") || objectTemplateName.equals("object/intangible/ship/navicomputer_2.iff") || objectTemplateName.equals("object/intangible/ship/navicomputer_3.iff") || objectTemplateName.equals("object/intangible/ship/navicomputer_4.iff") || objectTemplateName.equals("object/intangible/ship/navicomputer_5.iff") || objectTemplateName.equals("object/intangible/ship/navicomputer_6.iff"))
|
|
{
|
|
obj_id datapad = utils.getDatapad(newItem);
|
|
if (isIdValid(datapad))
|
|
{
|
|
destroyObject(datapad);
|
|
}
|
|
}
|
|
dictionary contentsDict = itemDictionary.getDictionary("contents");
|
|
Set keySet = contentsDict.keySet();
|
|
for (Object o : keySet) {
|
|
obj_id key = (obj_id) o;
|
|
if (isIdNull(key)) {
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() FAILED: key " + key + " not valid in container contents dictionary: " + contentsDict);
|
|
return null;
|
|
}
|
|
dictionary containedItemDict = contentsDict.getDictionary(key);
|
|
obj_id unpackedItem = null;
|
|
obj_id saberInv = null;
|
|
if (jedi.isLightsaber(newItem)) {
|
|
if (ctsCheckAndLogUniqueStaticItemAlreadyExists(container, containedItemDict)) {
|
|
continue;
|
|
}
|
|
saberInv = getObjectInSlot(newItem, "saber_inv");
|
|
unpackedItem = unpackItem(container, containedItemDict);
|
|
} else {
|
|
if (ctsCheckAndLogUniqueStaticItemAlreadyExists(newItem, containedItemDict)) {
|
|
continue;
|
|
}
|
|
unpackedItem = unpackItem(newItem, containedItemDict);
|
|
}
|
|
if (!isIdValid(unpackedItem)) {
|
|
if (isIdNull(unpackedItem)) {
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() : unpackItem() returned NULL id for item: " + containedItemDict);
|
|
return null;
|
|
} else {
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() : unpackItem() returned invalid id " + unpackedItem + " for item: " + containedItemDict);
|
|
continue;
|
|
}
|
|
}
|
|
if (isIdValid(saberInv)) {
|
|
if (jedi.hasColorCrystal(newItem) && jedi.isColorCrystal(unpackedItem)) {
|
|
removeObjVar(newItem, jedi.VAR_SABER_BASE + "." + jedi.VAR_COLOR);
|
|
}
|
|
if (!putIn(unpackedItem, saberInv)) {
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() : FAILED to move lightsaber crystal " + unpackedItem + " into saber " + saberInv);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (objectType == GOT_misc_factory_crate)
|
|
{
|
|
boolean factoryCrateHasCreator = false;
|
|
if (itemDictionary.containsKey("factoryCrateHasCreator"))
|
|
{
|
|
factoryCrateHasCreator = itemDictionary.getBoolean("factoryCrateHasCreator");
|
|
}
|
|
boolean factoryCrateCreatorIsSelf = false;
|
|
if (itemDictionary.containsKey("factoryCrateCreatorIsSelf"))
|
|
{
|
|
factoryCrateCreatorIsSelf = itemDictionary.getBoolean("factoryCrateCreatorIsSelf");
|
|
}
|
|
obj_id factoryCrateCreator = (factoryCrateCreatorIsSelf ? self : obj_id.getObjId(10000000));
|
|
if (factoryCrateHasCreator)
|
|
{
|
|
setCrafter(newItem, factoryCrateCreator);
|
|
}
|
|
obj_id[] factoryCrateContents = getContents(newItem);
|
|
if ((factoryCrateContents != null) && (factoryCrateContents.length > 0))
|
|
{
|
|
for (obj_id factoryCrateContent : factoryCrateContents) {
|
|
setCrafter(factoryCrateContent, factoryCrateCreator);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (isEquipped)
|
|
{
|
|
if (equip(newItem, self))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() : equipped item (" + newItem + ")");
|
|
}
|
|
else
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() : FAILED to equip item (" + newItem + ")");
|
|
}
|
|
}
|
|
if (isAppearanceEquipped)
|
|
{
|
|
obj_id appearanceInventory = getAppearanceInventory(self);
|
|
if (!isIdValid(appearanceInventory))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() : Failed to equip appearance item (" + newItem + "). Character has no valid appearance inventory.");
|
|
return null;
|
|
}
|
|
if (putIn(newItem, appearanceInventory))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() : equipped appearance item (" + newItem + ")");
|
|
}
|
|
else
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() : FAILED to equip appearance item (" + newItem + ")");
|
|
}
|
|
}
|
|
if (isGameObjectTypeOf(objectType, GOT_data_ship_control_device))
|
|
{
|
|
obj_id ship = space_transition.getShipFromShipControlDevice(newItem);
|
|
setObjVar(newItem, "ship", ship);
|
|
setObjVar(ship, "shipControlDevice", newItem);
|
|
if (!isIdValid(ship))
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
catch(Throwable t)
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() FAILED : container=" + container + ", itemDictionary=" + itemDictionary + " EXCEPTION: " + t);
|
|
return null;
|
|
}
|
|
utils.removeLocalVar(newItem, "ctsBeingUnpacked");
|
|
return newItem;
|
|
}
|
|
public obj_id unpackWaypoint(dictionary waypointDictionary) throws InterruptedException
|
|
{
|
|
obj_id self = getSelf();
|
|
if (!isIdValid(self))
|
|
{
|
|
return null;
|
|
}
|
|
obj_id newWaypoint = null;
|
|
location loc = waypointDictionary.getLocation("location");
|
|
if (!isIdNull(loc.cell))
|
|
{
|
|
return null;
|
|
}
|
|
location newloc = new location(loc.x, loc.y, loc.z, loc.area);
|
|
String name = waypointDictionary.getString("name");
|
|
newWaypoint = createWaypointInDatapad(self, newloc);
|
|
setWaypointName(newWaypoint, name);
|
|
return newWaypoint;
|
|
}
|
|
public boolean itemIsAllowedToTransfer(obj_id item, obj_id player) throws InterruptedException
|
|
{
|
|
if (!isValidId(item) || !isValidId(player))
|
|
{
|
|
return false;
|
|
}
|
|
if (utils.hasScriptVar(player, cts.SCRIPTVAR_CTS_ITEM_ID))
|
|
{
|
|
final obj_id ctsItem = utils.getObjIdScriptVar(player, cts.SCRIPTVAR_CTS_ITEM_ID);
|
|
if (isValidId(ctsItem) && (ctsItem == item))
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
public dictionary packWaypoint(obj_id waypoint) throws InterruptedException
|
|
{
|
|
obj_id self = getSelf();
|
|
dictionary waypointDictionary = null;
|
|
try
|
|
{
|
|
waypointDictionary = new dictionary();
|
|
if (!isValidId(waypoint))
|
|
{
|
|
return null;
|
|
}
|
|
location loc = getWaypointLocation(waypoint);
|
|
waypointDictionary.put("location", loc);
|
|
String name = getWaypointName(waypoint);
|
|
waypointDictionary.put("name", name);
|
|
}
|
|
catch(Throwable t)
|
|
{
|
|
return null;
|
|
}
|
|
return waypointDictionary;
|
|
}
|
|
public void doItemPrepack(obj_id item) throws InterruptedException
|
|
{
|
|
if (!isValidId(item))
|
|
{
|
|
return;
|
|
}
|
|
|
|
{
|
|
dictionary d = new dictionary();
|
|
int result = script_entry.callMessageHandlers("OnPack", item, d);
|
|
if (result != SCRIPT_CONTINUE)
|
|
{
|
|
utils.setScriptVar(item, "do_not_pack", 1);
|
|
return;
|
|
}
|
|
}
|
|
obj_id[] contents = null;
|
|
contents = getContents(item);
|
|
if (contents != null)
|
|
{
|
|
for (obj_id content : contents) {
|
|
doItemPrepack(content);
|
|
}
|
|
}
|
|
}
|
|
public dictionary packItem(obj_id item, int objectType, boolean allowOverride, int resourceCrateCountLimit, int[] resourceCurrentCrateCount, long resourceUnitCountLimit, long[] resourceCurrentUnitCount) throws InterruptedException
|
|
{
|
|
dictionary itemDictionary = null;
|
|
try
|
|
{
|
|
final obj_id self = getSelf();
|
|
if ((getName(item)).equalsIgnoreCase("object/cell/cell.iff"))
|
|
{
|
|
return null;
|
|
}
|
|
if (hasCondition(item, CONDITION_VENDOR))
|
|
{
|
|
return null;
|
|
}
|
|
if (utils.hasScriptVar(item, "do_not_pack"))
|
|
{
|
|
return null;
|
|
}
|
|
String name = getName(item);
|
|
String objectTypeName = getGameObjectTypeName(objectType);
|
|
String objectTemplateName = getTemplateName(item);
|
|
int objectTemplateCrc = getObjectTemplateCrc(objectTemplateName);
|
|
if (objectType == GOT_misc_factory_crate)
|
|
{
|
|
int factoryCrateCount = getCount(item);
|
|
if (factoryCrateCount <= 0)
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "packItem(" + item + ") skipping factory crate because it has a count of " + factoryCrateCount);
|
|
return null;
|
|
}
|
|
obj_id[] factoryCrateContents = getContents(item);
|
|
if ((factoryCrateContents == null) || (factoryCrateContents.length <= 0))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "packItem(" + item + ") skipping factory crate because it is empty");
|
|
return null;
|
|
}
|
|
String crateItemTemplateName = getTemplateName(factoryCrateContents[0]);
|
|
if (crateItemTemplateName == null || crateItemTemplateName.length() <= 0)
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "packItem(" + item + ") skipping factory crate because its contents returned a null string as a template name.");
|
|
return null;
|
|
}
|
|
if (crateItemTemplateName.equals("object/tangible/food/crafted/dessert_felbar.iff") || crateItemTemplateName.equals("object/tangible/food/crafted/dessert_blap_biscuit.iff") || crateItemTemplateName.equals("object/tangible/food/crafted/dessert_pastebread.iff") || crateItemTemplateName.equals("object/tangible/food/crafted/dessert_sweesonberry_rolls.iff"))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "packItem(" + item + ") skipping factory crate because it contained old pet food(" + crateItemTemplateName + "), that is supposed to be deleted.");
|
|
return null;
|
|
}
|
|
}
|
|
itemDictionary = new dictionary();
|
|
itemDictionary.put("objectTemplateCrc", objectTemplateCrc);
|
|
itemDictionary.put("objectTemplateName", objectTemplateName);
|
|
String packedObjvars = getPackedObjvars(item);
|
|
itemDictionary.put("packedObjvars", packedObjvars);
|
|
String staticItemName = getStaticItemName(item);
|
|
if (static_item.isStaticItem(item) && !staticItemName.equals("item_respec_token_01_01"))
|
|
{
|
|
itemDictionary.put("staticItemName", staticItemName);
|
|
CustomerServiceLog("CharacterTransfer", "packItem(" + item + ", " + allowOverride + ") staticItemName=" + staticItemName);
|
|
}
|
|
else
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "packItem(" + item + ", " + allowOverride + ") objectTemplateName=" + objectTemplateName + ", name=" + name);
|
|
String[] itemScripts = getScriptList(item);
|
|
if (itemScripts != null && itemScripts.length > 0)
|
|
{
|
|
for (int i = 0; i < itemScripts.length; ++i)
|
|
{
|
|
if (itemScripts[i].startsWith("script."))
|
|
{
|
|
itemScripts[i] = itemScripts[i].substring(7);
|
|
}
|
|
}
|
|
itemDictionary.put("scripts", itemScripts);
|
|
}
|
|
String objectName = getAssignedName(item);
|
|
if (objectName == null || objectName.equals(""))
|
|
{
|
|
objectName = utils.packStringId(getNameStringId(item));
|
|
}
|
|
if (objectName == null)
|
|
{
|
|
objectName = "";
|
|
}
|
|
itemDictionary.put("objectName", objectName);
|
|
dictionary colorData = hue.getPalcolorData(item);
|
|
if (colorData != null)
|
|
{
|
|
itemDictionary.put("colorData", colorData);
|
|
}
|
|
if (isTangible(item))
|
|
{
|
|
byte[] customAppearance = getByteStreamFromAutoVariable(item, "customAppearance");
|
|
if (customAppearance != null && customAppearance.length > 0)
|
|
{
|
|
itemDictionary.put("customAppearance", customAppearance);
|
|
}
|
|
byte[] appearanceData = getByteStreamFromAutoVariable(item, "appearanceData");
|
|
if (appearanceData != null && appearanceData.length > 0)
|
|
{
|
|
itemDictionary.put("appearanceData", appearanceData);
|
|
}
|
|
if (isMob(item))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "packItem() : getAttribs(" + item + ") on a creature object");
|
|
attribute[] itemAttribs = getAttribs(item);
|
|
if (itemAttribs != null)
|
|
{
|
|
int[] itemAttribTypes = new int[itemAttribs.length];
|
|
int[] itemAttribValues = new int[itemAttribs.length];
|
|
int itemAttribsIter;
|
|
CustomerServiceLog("CharacterTransfer", "packItem() : retrieving " + itemAttribs.length + " attributes");
|
|
for (itemAttribsIter = 0; itemAttribsIter < itemAttribs.length; ++itemAttribsIter)
|
|
{
|
|
itemAttribTypes[itemAttribsIter] = itemAttribs[itemAttribsIter].getType();
|
|
itemAttribValues[itemAttribsIter] = getUnmodifiedMaxAttrib(item, itemAttribsIter);
|
|
CustomerServiceLog("CharacterTransfer", "packItem() : itemAttribTypes[" + itemAttribsIter + "] = " + itemAttribTypes[itemAttribsIter] + ", itemAttribsValues[" + itemAttribsIter + "] = " + itemAttribValues[itemAttribsIter]);
|
|
}
|
|
itemDictionary.put("attribute_types", itemAttribTypes);
|
|
itemDictionary.put("attribute_values", itemAttribValues);
|
|
}
|
|
else
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "packItem() FAILED: getAttribs(" + item + ") = null.");
|
|
return null;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
int maxHitpoints = getMaxHitpoints(item);
|
|
if (maxHitpoints != ATTRIB_ERROR)
|
|
{
|
|
itemDictionary.put("maxHitpoints", maxHitpoints);
|
|
}
|
|
else
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "packItem() FAILED: getMaxHitpoints(" + item + ") failed!");
|
|
return null;
|
|
}
|
|
int hitpoints = getHitpoints(item);
|
|
if (hitpoints != ATTRIB_ERROR)
|
|
{
|
|
itemDictionary.put("hitpoints", hitpoints);
|
|
}
|
|
else
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "packItem() FAILED: getHitpoints(" + item + ") failed!");
|
|
return null;
|
|
}
|
|
itemDictionary.put("conditionFlags", getCondition(item));
|
|
boolean isWeaponItem = isWeapon(item);
|
|
itemDictionary.put("isWeaponItem", isWeaponItem);
|
|
if (isWeaponItem)
|
|
{
|
|
int currentVersion = getConversionId(item);
|
|
if (currentVersion > 0)
|
|
{
|
|
itemDictionary.put("currentVersion", currentVersion);
|
|
}
|
|
int minDamage = getWeaponMinDamage(item);
|
|
itemDictionary.put("minDamage", minDamage);
|
|
int maxDamage = getWeaponMaxDamage(item);
|
|
itemDictionary.put("maxDamage", maxDamage);
|
|
float attackSpeed = getWeaponAttackSpeed(item);
|
|
itemDictionary.put("attackSpeed", attackSpeed);
|
|
range_info rangeInfo = getWeaponRangeInfo(item);
|
|
itemDictionary.put("rangeInfoMinRange", rangeInfo.minRange);
|
|
itemDictionary.put("rangeInfoMaxRange", rangeInfo.maxRange);
|
|
float woundChance = getWeaponWoundChance(item);
|
|
itemDictionary.put("woundChance", woundChance);
|
|
float damageRadius = getWeaponDamageRadius(item);
|
|
itemDictionary.put("damageRadius", damageRadius);
|
|
int accuracy = getWeaponAccuracy(item);
|
|
itemDictionary.put("accuracy", accuracy);
|
|
int elementalType = getWeaponElementalType(item);
|
|
itemDictionary.put("elementalType", elementalType);
|
|
int elementalValue = getWeaponElementalValue(item);
|
|
itemDictionary.put("elementalValue", elementalValue);
|
|
int damageType = getWeaponDamageType(item);
|
|
itemDictionary.put("damageType", damageType);
|
|
int attackCost = getWeaponAttackCost(item);
|
|
itemDictionary.put("attackCost", attackCost);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
int count = getCount(item);
|
|
if (count > 0)
|
|
{
|
|
itemDictionary.put("count", count);
|
|
}
|
|
if (getBankBalance(item) > 0)
|
|
{
|
|
byte[] bankBalance = getByteStreamFromAutoVariable(item, "bankBalance");
|
|
if (bankBalance != null && bankBalance.length > 0)
|
|
{
|
|
itemDictionary.put("bankBalance", bankBalance);
|
|
}
|
|
}
|
|
if (hasScript(item, "systems.jedi.jedi_saber_component"))
|
|
{
|
|
if (jedi.isCrystalTuned(item))
|
|
{
|
|
if (jedi.isCrystalOwner(self, item))
|
|
{
|
|
itemDictionary.put("isCrystalOwner", true);
|
|
}
|
|
else
|
|
{
|
|
itemDictionary.put("isCrystalOwner", false);
|
|
}
|
|
}
|
|
}
|
|
obj_id biolink = getBioLink(item);
|
|
if (isIdValid(biolink))
|
|
{
|
|
itemDictionary.put("biolink", biolink);
|
|
if (biolink == self)
|
|
{
|
|
itemDictionary.put("isBiolinkOwner", true);
|
|
}
|
|
else
|
|
{
|
|
itemDictionary.put("isBiolinkOwner", false);
|
|
}
|
|
}
|
|
if (hasObjVar(item, storyteller.BLUEPRINT_AUTHOR_OBJVAR))
|
|
{
|
|
obj_id blueprintDesigner = getObjIdObjVar(item, storyteller.BLUEPRINT_AUTHOR_OBJVAR);
|
|
if (isIdValid(blueprintDesigner))
|
|
{
|
|
if (blueprintDesigner == self)
|
|
{
|
|
itemDictionary.put("isBlueprintDesigner", true);
|
|
}
|
|
else
|
|
{
|
|
itemDictionary.put("isBlueprintDesigner", false);
|
|
}
|
|
}
|
|
}
|
|
if (getContainedBy(item) == self)
|
|
{
|
|
itemDictionary.put("isEquipped", true);
|
|
}
|
|
else
|
|
{
|
|
itemDictionary.put("isEquipped", false);
|
|
}
|
|
obj_id appearanceInventory = getAppearanceInventory(self);
|
|
if (isIdValid(appearanceInventory) && getContainedBy(item) == appearanceInventory)
|
|
{
|
|
itemDictionary.put("isAppearanceEquipped", true);
|
|
}
|
|
else
|
|
{
|
|
itemDictionary.put("isAppearanceEquipped", false);
|
|
}
|
|
if (isGameObjectTypeOf(objectType, GOT_resource_container))
|
|
{
|
|
if (objectType != GOT_resource_container_pseudo)
|
|
{
|
|
int quantity = getResourceContainerQuantity(item);
|
|
if (quantity <= 0)
|
|
{
|
|
return null;
|
|
}
|
|
String resourceData = getResourceCtsData(item);
|
|
if ((resourceData == null) || (resourceData.length() <= 0))
|
|
{
|
|
return null;
|
|
}
|
|
if ((resourceUnitCountLimit > 0L) && ((resourceCurrentUnitCount[0] + quantity) > resourceUnitCountLimit))
|
|
{
|
|
quantity = (int)(resourceUnitCountLimit - resourceCurrentUnitCount[0]);
|
|
if (quantity <= 0)
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
resourceCurrentCrateCount[0] = resourceCurrentCrateCount[0] + 1;
|
|
resourceCurrentUnitCount[0] = resourceCurrentUnitCount[0] + quantity;
|
|
CustomerServiceLog("CharacterTransfer", "packItem(" + item + ") packed resource container (" + resourceCurrentCrateCount[0] + "/" + resourceCrateCountLimit + ") (" + resourceCurrentUnitCount[0] + "/" + resourceUnitCountLimit + "): resourceQuantity=" + quantity + ", resourceData=" + resourceData);
|
|
itemDictionary.put("resourceQuantity", quantity);
|
|
itemDictionary.put("resourceData", resourceData);
|
|
}
|
|
else
|
|
{
|
|
resourceCurrentCrateCount[0] = resourceCurrentCrateCount[0] + 1;
|
|
CustomerServiceLog("CharacterTransfer", "packItem(" + item + ") packed pseudo resource container (" + resourceCurrentCrateCount[0] + "/" + resourceCrateCountLimit + ") (" + resourceCurrentUnitCount[0] + "/" + resourceUnitCountLimit + ")");
|
|
}
|
|
}
|
|
if (objectType == GOT_misc_factory_crate)
|
|
{
|
|
obj_id factoryCrateCreator = getCrafter(item);
|
|
if (isIdValid(factoryCrateCreator))
|
|
{
|
|
itemDictionary.put("factoryCrateHasCreator", true);
|
|
if (factoryCrateCreator == self)
|
|
{
|
|
itemDictionary.put("factoryCrateCreatorIsSelf", true);
|
|
}
|
|
else
|
|
{
|
|
itemDictionary.put("factoryCrateCreatorIsSelf", false);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
itemDictionary.put("factoryCrateHasCreator", false);
|
|
}
|
|
}
|
|
if (objectType == GOT_data_manufacturing_schematic)
|
|
{
|
|
byte[] data = getByteStreamFromAutoVariable(item, "msoCtsPackUnpack");
|
|
if (data != null && data.length > 0)
|
|
{
|
|
itemDictionary.put("msoCtsPackUnpack", data);
|
|
}
|
|
itemDictionary.put("msoDraftSchematicCrc", getDraftSchematicCrc(item));
|
|
int conversionId = getConversionId(item);
|
|
if (conversionId > 0)
|
|
{
|
|
itemDictionary.put("msoConversionId", conversionId);
|
|
}
|
|
}
|
|
if (objectType == GOT_data_mission_object)
|
|
{
|
|
byte[] data = getByteStreamFromAutoVariable(item, "moCtsPackUnpack");
|
|
if (data != null && data.length > 0)
|
|
{
|
|
itemDictionary.put("moCtsPackUnpack", data);
|
|
}
|
|
if (hasObjVar(item, "time_created"))
|
|
{
|
|
int secondsSinceCreated = (getGameTime() - getIntObjVar(item, "time_created"));
|
|
if (secondsSinceCreated < 0)
|
|
{
|
|
secondsSinceCreated = 0;
|
|
}
|
|
itemDictionary.put("missionAge", secondsSinceCreated);
|
|
}
|
|
}
|
|
if (objectType == GOT_chronicles_quest_holocron || objectType == GOT_chronicles_quest_holocron_recipe)
|
|
{
|
|
byte[] data = getByteStreamFromAutoVariable(item, "PGCPacked");
|
|
if (data != null && data.length > 0)
|
|
{
|
|
itemDictionary.put("PGCPacked", data);
|
|
}
|
|
}
|
|
if ((objectTemplateCrc == (2082993503)) && (hasObjVar(item, incubator.RESOURCE_POWER_NAME)))
|
|
{
|
|
byte[] data = getByteStreamFromAutoVariable(item, "incubatorResourceData");
|
|
if (data != null && data.length > 0)
|
|
{
|
|
itemDictionary.put("incubatorResourceData", data);
|
|
}
|
|
}
|
|
if (isGameObjectTypeOf(objectType, GOT_ship))
|
|
{
|
|
float mass = getChassisComponentMassMaximum(item);
|
|
float hp = getShipMaximumChassisHitPoints(item);
|
|
float currentHp = getShipCurrentChassisHitPoints(item);
|
|
itemDictionary.put("ship_mass", mass);
|
|
itemDictionary.put("ship_hp", hp);
|
|
itemDictionary.put("ship_current_hp", currentHp);
|
|
obj_id objDroidControlDevice = getDroidControlDeviceForShip(item);
|
|
if (isIdValid(objDroidControlDevice))
|
|
{
|
|
itemDictionary.put("droid_control_device", objDroidControlDevice);
|
|
}
|
|
if ((objectTemplateName != null) && (objectTemplateName.endsWith("player_sorosuub_space_yacht.iff")))
|
|
{
|
|
}
|
|
else
|
|
{
|
|
dictionary shipDict = new dictionary();
|
|
int[] shipSlots = getShipChassisSlots(item);
|
|
for (int shipSlot : shipSlots) {
|
|
if (isShipSlotInstalled(item, shipSlot)) {
|
|
obj_id component = shipUninstallComponentAllowOverload(getOwner(item), item, shipSlot, utils.getInventoryContainer(self));
|
|
if (isIdValid(component)) {
|
|
int ot = getGameObjectType(component);
|
|
if (itemIsAllowedToTransfer(component, self) && (!isGameObjectTypeOf(ot, GOT_resource_container) || !ctsHasExceededResourceTransferLimit(resourceCrateCountLimit, resourceCurrentCrateCount[0], resourceUnitCountLimit, resourceCurrentUnitCount[0]))) {
|
|
dictionary component_dict = packItem(component, ot, true, resourceCrateCountLimit, resourceCurrentCrateCount, resourceUnitCountLimit, resourceCurrentUnitCount);
|
|
if (component_dict != null) {
|
|
shipDict.put(shipSlot, component_dict);
|
|
}
|
|
}
|
|
}
|
|
shipInstallComponent(getOwner(item), item, shipSlot, component);
|
|
}
|
|
}
|
|
itemDictionary.put("shipComponents", shipDict);
|
|
}
|
|
}
|
|
if (objectType == GOT_installation_factory)
|
|
{
|
|
byte[] powerValue = getByteStreamFromAutoVariable(item, "powerValue");
|
|
if (powerValue != null && powerValue.length > 0)
|
|
{
|
|
itemDictionary.put("powerValue", powerValue);
|
|
}
|
|
byte[] powerRate = getByteStreamFromAutoVariable(item, "powerRate");
|
|
if (powerRate != null && powerRate.length > 0)
|
|
{
|
|
itemDictionary.put("powerRate", powerRate);
|
|
}
|
|
obj_id manfSchematic = getObjectInSlot(item, "manf_schematic");
|
|
if (isIdValid(manfSchematic))
|
|
{
|
|
int ot = getGameObjectType(manfSchematic);
|
|
if (itemIsAllowedToTransfer(manfSchematic, self) && (!isGameObjectTypeOf(ot, GOT_resource_container) || !ctsHasExceededResourceTransferLimit(resourceCrateCountLimit, resourceCurrentCrateCount[0], resourceUnitCountLimit, resourceCurrentUnitCount[0])))
|
|
{
|
|
dictionary dictManfSchematic = packItem(manfSchematic, ot, true, resourceCrateCountLimit, resourceCurrentCrateCount, resourceUnitCountLimit, resourceCurrentUnitCount);
|
|
if (dictManfSchematic != null)
|
|
{
|
|
itemDictionary.put("manf_schematic", dictManfSchematic);
|
|
}
|
|
}
|
|
}
|
|
obj_id ingrHopper = getObjectInSlot(item, "ingredient_hopper");
|
|
if (isIdValid(ingrHopper))
|
|
{
|
|
obj_id ingrHopperContents[] = getContents(ingrHopper);
|
|
if (ingrHopperContents != null && ingrHopperContents.length > 0)
|
|
{
|
|
dictionary dictIngrHopperContents = new dictionary();
|
|
for (obj_id ingrHopperContent : ingrHopperContents) {
|
|
if (!isObjectPersisted(ingrHopperContent)) {
|
|
continue;
|
|
}
|
|
int ot = getGameObjectType(ingrHopperContent);
|
|
if (itemIsAllowedToTransfer(ingrHopperContent, self) && (!isGameObjectTypeOf(ot, GOT_resource_container) || !ctsHasExceededResourceTransferLimit(resourceCrateCountLimit, resourceCurrentCrateCount[0], resourceUnitCountLimit, resourceCurrentUnitCount[0]))) {
|
|
dictionary dictIngrHopperContent = packItem(ingrHopperContent, ot, true, resourceCrateCountLimit, resourceCurrentCrateCount, resourceUnitCountLimit, resourceCurrentUnitCount);
|
|
if (dictIngrHopperContent != null) {
|
|
dictIngrHopperContents.put(ingrHopperContent, dictIngrHopperContent);
|
|
}
|
|
}
|
|
}
|
|
itemDictionary.put("ingr_hopper_contents", dictIngrHopperContents);
|
|
}
|
|
}
|
|
obj_id outputHopper = getObjectInSlot(item, "output_hopper");
|
|
if (isIdValid(outputHopper))
|
|
{
|
|
obj_id outputHopperContents[] = getContents(outputHopper);
|
|
if (outputHopperContents != null && outputHopperContents.length > 0)
|
|
{
|
|
dictionary dictOutputHopperContents = new dictionary();
|
|
for (obj_id outputHopperContent : outputHopperContents) {
|
|
if (!isObjectPersisted(outputHopperContent)) {
|
|
continue;
|
|
}
|
|
int ot = getGameObjectType(outputHopperContent);
|
|
if (itemIsAllowedToTransfer(outputHopperContent, self) && (!isGameObjectTypeOf(ot, GOT_resource_container) || !ctsHasExceededResourceTransferLimit(resourceCrateCountLimit, resourceCurrentCrateCount[0], resourceUnitCountLimit, resourceCurrentUnitCount[0]))) {
|
|
dictionary dictOutputHopperContent = packItem(outputHopperContent, ot, true, resourceCrateCountLimit, resourceCurrentCrateCount, resourceUnitCountLimit, resourceCurrentUnitCount);
|
|
if (dictOutputHopperContent != null) {
|
|
dictOutputHopperContents.put(outputHopperContent, dictOutputHopperContent);
|
|
}
|
|
}
|
|
}
|
|
itemDictionary.put("output_hopper_contents", dictOutputHopperContents);
|
|
}
|
|
}
|
|
}
|
|
if (objectType == GOT_misc_crafting_station)
|
|
{
|
|
obj_id inputHopper = getObjectInSlot(item, "ingredient_hopper");
|
|
if (isIdValid(inputHopper))
|
|
{
|
|
obj_id inputHopperContents[] = getContents(inputHopper);
|
|
if (inputHopperContents != null && inputHopperContents.length > 0)
|
|
{
|
|
dictionary dictInputHopperContents = new dictionary();
|
|
for (obj_id inputHopperContent : inputHopperContents) {
|
|
if (!isObjectPersisted(inputHopperContent)) {
|
|
continue;
|
|
}
|
|
int ot = getGameObjectType(inputHopperContent);
|
|
if (itemIsAllowedToTransfer(inputHopperContent, self) && (!isGameObjectTypeOf(ot, GOT_resource_container) || !ctsHasExceededResourceTransferLimit(resourceCrateCountLimit, resourceCurrentCrateCount[0], resourceUnitCountLimit, resourceCurrentUnitCount[0]))) {
|
|
dictionary dictInputHopperContent = packItem(inputHopperContent, ot, true, resourceCrateCountLimit, resourceCurrentCrateCount, resourceUnitCountLimit, resourceCurrentUnitCount);
|
|
if (dictInputHopperContent != null) {
|
|
dictInputHopperContents.put(inputHopperContent, dictInputHopperContent);
|
|
}
|
|
}
|
|
}
|
|
itemDictionary.put("input_hopper_contents", dictInputHopperContents);
|
|
}
|
|
}
|
|
}
|
|
|
|
{
|
|
if (isGameObjectTypeOf(objectType, GOT_building) || space_utils.isPobType(objectTemplateName))
|
|
{
|
|
if (isGameObjectTypeOf(objectType, GOT_building))
|
|
{
|
|
obj_id lotOverlimitStructure = getObjIdObjVar(self, "lotOverlimit.structure_id");
|
|
if (isIdValid(lotOverlimitStructure) && (lotOverlimitStructure == item))
|
|
{
|
|
itemDictionary.put("lotOverlimitStructureId", item);
|
|
}
|
|
}
|
|
String[] cells = getCellNames(item);
|
|
if (cells != null)
|
|
{
|
|
dictionary house_contents = new dictionary();
|
|
for (String cell : cells) {
|
|
obj_id cellid = getCellId(item, cell);
|
|
obj_id contents[] = getContents(cellid);
|
|
if (contents != null && contents.length > 0) {
|
|
for (obj_id house_item : contents) {
|
|
if (!isObjectPersisted(house_item)) {
|
|
continue;
|
|
}
|
|
int ot = getGameObjectType(house_item);
|
|
if (itemIsAllowedToTransfer(house_item, self) && (!isGameObjectTypeOf(ot, GOT_resource_container) || !ctsHasExceededResourceTransferLimit(resourceCrateCountLimit, resourceCurrentCrateCount[0], resourceUnitCountLimit, resourceCurrentUnitCount[0]))) {
|
|
dictionary house_item_dict = packItem(house_item, ot, true, resourceCrateCountLimit, resourceCurrentCrateCount, resourceUnitCountLimit, resourceCurrentUnitCount);
|
|
if (house_item_dict != null) {
|
|
house_item_dict.put("house_cell", cell);
|
|
house_item_dict.put("house_cell_loc", getLocation(house_item));
|
|
float[] quaternion = getQuaternion(house_item);
|
|
if ((quaternion != null) && (quaternion.length == 4)) {
|
|
house_item_dict.put("quaternion", quaternion);
|
|
}
|
|
house_contents.put(house_item, house_item_dict);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
itemDictionary.put("house_contents", house_contents);
|
|
}
|
|
}
|
|
}
|
|
int containerType = getContainerType(item);
|
|
itemDictionary.put("containerType", containerType);
|
|
obj_id[] contents = null;
|
|
obj_id saberInv = null;
|
|
boolean b_is_ship = false;
|
|
if (containerType == 2 && !isGameObjectTypeOf(objectType, GOT_building))
|
|
{
|
|
contents = getContents(item);
|
|
}
|
|
else if (jedi.isLightsaber(item))
|
|
{
|
|
saberInv = getObjectInSlot(item, "saber_inv");
|
|
if (isIdValid(saberInv))
|
|
{
|
|
contents = getContents(saberInv);
|
|
}
|
|
}
|
|
else if (isGameObjectTypeOf(objectType, GOT_data_ship_control_device))
|
|
{
|
|
contents = getContents(item);
|
|
}
|
|
else if (isGameObjectTypeOf(objectType, GOT_ship))
|
|
{
|
|
contents = getContents(item);
|
|
}
|
|
else if (isGameObjectTypeOf(objectType, GOT_data_droid_control_device))
|
|
{
|
|
contents = getContents(item);
|
|
}
|
|
else if (isGameObjectTypeOf(objectType, GOT_data_house_control_device))
|
|
{
|
|
contents = getContents(item);
|
|
}
|
|
if (contents != null && contents.length > 0)
|
|
{
|
|
dictionary container = new dictionary();
|
|
int i = 0;
|
|
for (i = 0; i < contents.length; ++i)
|
|
{
|
|
if (guild.STR_GUILD_REMOTE_DEVICE.equals(getTemplateName(contents[i])))
|
|
{
|
|
continue;
|
|
}
|
|
int ot = getGameObjectType(contents[i]);
|
|
if (itemIsAllowedToTransfer(contents[i], self) && (!isGameObjectTypeOf(ot, GOT_resource_container) || !ctsHasExceededResourceTransferLimit(resourceCrateCountLimit, resourceCurrentCrateCount[0], resourceUnitCountLimit, resourceCurrentUnitCount[0])))
|
|
{
|
|
dictionary containedItem = packItem(contents[i], ot, allowOverride, resourceCrateCountLimit, resourceCurrentCrateCount, resourceUnitCountLimit, resourceCurrentUnitCount);
|
|
if (containedItem != null)
|
|
{
|
|
container.put(contents[i], containedItem);
|
|
if (objectType == GOT_misc_factory_crate)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (!allowOverride)
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
itemDictionary.put("contents", container);
|
|
}
|
|
}
|
|
catch(Throwable t)
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "packItem() FAILED: item=" + item + ", allowOverride=" + allowOverride + ", itemDictionary= " + itemDictionary + " EXCEPTION: " + t);
|
|
return null;
|
|
}
|
|
return itemDictionary;
|
|
}
|
|
public int OnUploadCharacter(obj_id self, dictionary characterData) throws InterruptedException
|
|
{
|
|
int resourceCrateCountLimit = 0;
|
|
String config = getConfigSetting("GameServer", "ctsResourceCrateCountLimit");
|
|
if (config != null)
|
|
{
|
|
resourceCrateCountLimit = utils.stringToInt(config);
|
|
}
|
|
int[] resourceCurrentCrateCount = new int[1];
|
|
resourceCurrentCrateCount[0] = 0;
|
|
long resourceUnitCountLimit = 0L;
|
|
config = getConfigSetting("GameServer", "ctsResourceUnitCountLimit");
|
|
if (config != null)
|
|
{
|
|
resourceUnitCountLimit = utils.stringToLong(config);
|
|
}
|
|
long[] resourceCurrentUnitCount = new long[1];
|
|
resourceCurrentUnitCount[0] = 0L;
|
|
try
|
|
{
|
|
final boolean withItems = characterData.getBoolean("withItems");
|
|
final boolean allowOverride = characterData.getBoolean("allowOverride");
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter(withItems=" + withItems + ", allowOverride=" + allowOverride + ") begin");
|
|
if (hasObjVar(self, "disableLoginCtsInProgress"))
|
|
{
|
|
int timeOut = getIntObjVar(self, "disableLoginCtsInProgress");
|
|
if (timeOut > getGameTime())
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter() : FAILED because of CTS completed or in progress for character");
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
else
|
|
{
|
|
removeObjVar(self, "disableLoginCtsInProgress");
|
|
}
|
|
}
|
|
if (hasObjVar(self, "disableLoginCtsCompleted"))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter() : FAILED because of CTS completed or in progress for character");
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
String skillTemplate = getSkillTemplate(self);
|
|
if (skillTemplate == null || skillTemplate.equals("") || skillTemplate.equals("a"))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter() : skillTemplate not set! (pre-NGE source characters must choose profession prior to transfer) TRANSFER FAILED");
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
characterData.put("skillTemplate", skillTemplate);
|
|
int combatLevel = getLevel(self);
|
|
characterData.put("combatLevel", combatLevel);
|
|
String workingSkill = getWorkingSkill(self);
|
|
if (workingSkill == null || workingSkill.equals(""))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter() : workingSkill not set! (pre-NGE source characters must choose profession prior to transfer) TRANSFER FAILED");
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
characterData.put("workingSkill", workingSkill);
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter() : skillTemplate == " + skillTemplate + ", workingSkill == " + workingSkill + ", combatLevel == " + combatLevel);
|
|
characterData.put("commands", getCommandListingForPlayer(self));
|
|
characterData.put("skills", getSkillListingForPlayer(self));
|
|
final String[] strObjVarLists =
|
|
{
|
|
"badge",
|
|
factions.FACTION,
|
|
groundquests.questBaseObjVar,
|
|
"live_conversions",
|
|
space_flags.IMPERIAL_CORELLIA,
|
|
space_flags.IMPERIAL_NABOO,
|
|
space_flags.IMPERIAL_TATOOINE,
|
|
space_flags.PRIVATEER_CORELLIA,
|
|
space_flags.PRIVATEER_NABOO,
|
|
space_flags.PRIVATEER_TATOOINE,
|
|
space_flags.REBEL_CORELLIA,
|
|
space_flags.REBEL_NABOO,
|
|
space_flags.REBEL_TATOOINE,
|
|
space_quest.QUEST_STATUS,
|
|
township.OBJVAR_NOVA_ORION_FACTION,
|
|
pgc_quests.PGC_GRANTED_ROADMAP_REWARDS_OBJVAR,
|
|
"spaceTrackFlagListName",
|
|
"veteran_rewards",
|
|
"_notskill.schematics",
|
|
"_notskill.mods",
|
|
"respec_voucher",
|
|
"mand.acknowledge",
|
|
respec.EXPERTISE_VERSION_OBJVAR,
|
|
"publish_gift",
|
|
"legacy",
|
|
temp_schematic.VAR_TEMP_SCHEMATIC_BASE,
|
|
"cts",
|
|
"ctsHistory",
|
|
utils.CTS_OBJVAR_HISTORY,
|
|
"hoth.flawless_reward",
|
|
"instance_player_protected_data",
|
|
"bornOnGalaxyTitleSet",
|
|
"beast_master",
|
|
"playerRespec",
|
|
"respecsBought",
|
|
player_structure.HOUSE_PACKUP_ARRAY_OBJVAR,
|
|
"space.dantooine_landing_permission",
|
|
"lotOverlimit",
|
|
"renameCharacterRequest.requestTime",
|
|
"galactic_reserve",
|
|
"preserve_existing_lightsaber_crystal_owner_objvar",
|
|
"testing_only_force_cts_failure_testing_only"
|
|
};
|
|
dictionary experiencePoints = getExperiencePoints(self);
|
|
if (experiencePoints != null)
|
|
{
|
|
characterData.put("experience_points", experiencePoints);
|
|
}
|
|
characterData.put("pvp_type", pvpGetType(self));
|
|
characterData.put("pvp_aligned_faction", pvpGetAlignedFaction(self));
|
|
characterData.put("gcw_current_point", pvpGetCurrentGcwPoints(self));
|
|
characterData.put("gcw_current_rating", pvpGetCurrentGcwRating(self));
|
|
characterData.put("gcw_current_pvp_kill", pvpGetCurrentPvpKills(self));
|
|
characterData.put("gcw_lifetime_point", pvpGetLifetimeGcwPoints(self));
|
|
characterData.put("gcw_max_imperial_rating", pvpGetMaxGcwImperialRating(self));
|
|
characterData.put("gcw_max_rebel_rating", pvpGetMaxGcwRebelRating(self));
|
|
characterData.put("gcw_lifetime_pvp_kill", pvpGetLifetimePvpKills(self));
|
|
characterData.put("gcw_next_rating_calc_time", pvpGetNextGcwRatingCalcTime(self));
|
|
characterData.put("source_character_oid", self);
|
|
characterData.put("source_character_name", getName(self));
|
|
characterData.put("source_cluster", getClusterName());
|
|
if (hasObjVar(self, "freeCtsTransactionRuleName"))
|
|
{
|
|
characterData.put("freeCtsTransactionRuleName", getStringObjVar(self, "freeCtsTransactionRuleName"));
|
|
}
|
|
obj_id playerObject = getPlayerObject(self);
|
|
if (isIdValid(playerObject))
|
|
{
|
|
byte[] quests = getByteStreamFromAutoVariable(playerObject, "quests");
|
|
if (quests != null && quests.length > 0)
|
|
{
|
|
characterData.put("quests", quests);
|
|
}
|
|
byte[] activeQuests = getByteStreamFromAutoVariable(playerObject, "activeQuests");
|
|
if (activeQuests != null && activeQuests.length > 0)
|
|
{
|
|
characterData.put("activeQuests", activeQuests);
|
|
}
|
|
byte[] completedQuests = getByteStreamFromAutoVariable(playerObject, "completedQuests");
|
|
if (completedQuests != null && completedQuests.length > 0)
|
|
{
|
|
characterData.put("completedQuests", completedQuests);
|
|
}
|
|
byte[] currentQuest = getByteStreamFromAutoVariable(playerObject, "currentQuest");
|
|
if (currentQuest != null && currentQuest.length > 0)
|
|
{
|
|
characterData.put("currentQuest", currentQuest);
|
|
}
|
|
byte[] bornDate = getByteStreamFromAutoVariable(playerObject, "bornDate");
|
|
if (bornDate != null && bornDate.length > 0)
|
|
{
|
|
characterData.put("bornDate", bornDate);
|
|
}
|
|
byte[] playedTime = getByteStreamFromAutoVariable(playerObject, "playedTime");
|
|
if (playedTime != null && playedTime.length > 0)
|
|
{
|
|
characterData.put("playedTime", playedTime);
|
|
}
|
|
byte[] food = getByteStreamFromAutoVariable(playerObject, "food");
|
|
if (food != null && food.length > 0)
|
|
{
|
|
characterData.put("food", food);
|
|
}
|
|
byte[] maxFood = getByteStreamFromAutoVariable(playerObject, "maxFood");
|
|
if (maxFood != null && maxFood.length > 0)
|
|
{
|
|
characterData.put("maxFood", maxFood);
|
|
}
|
|
byte[] drink = getByteStreamFromAutoVariable(playerObject, "drink");
|
|
if (drink != null && drink.length > 0)
|
|
{
|
|
characterData.put("drink", drink);
|
|
}
|
|
byte[] maxDrink = getByteStreamFromAutoVariable(playerObject, "maxDrink");
|
|
if (maxDrink != null && maxDrink.length > 0)
|
|
{
|
|
characterData.put("maxDrink", maxDrink);
|
|
}
|
|
byte[] meds = getByteStreamFromAutoVariable(playerObject, "meds");
|
|
if (meds != null && meds.length > 0)
|
|
{
|
|
characterData.put("meds", meds);
|
|
}
|
|
byte[] maxMeds = getByteStreamFromAutoVariable(playerObject, "maxMeds");
|
|
if (maxMeds != null && maxMeds.length > 0)
|
|
{
|
|
characterData.put("maxMeds", maxMeds);
|
|
}
|
|
byte[] matchMakingPersonalProfileId = getByteStreamFromAutoVariable(playerObject, "matchMakingPersonalProfileId");
|
|
if (matchMakingPersonalProfileId != null && matchMakingPersonalProfileId.length > 0)
|
|
{
|
|
characterData.put("matchMakingPersonalProfileId", matchMakingPersonalProfileId);
|
|
}
|
|
byte[] matchMakingCharacterProfileId = getByteStreamFromAutoVariable(playerObject, "matchMakingCharacterProfileId");
|
|
if (matchMakingCharacterProfileId != null && matchMakingCharacterProfileId.length > 0)
|
|
{
|
|
characterData.put("matchMakingCharacterProfileId", matchMakingCharacterProfileId);
|
|
}
|
|
byte[] playerObjectWorkingSkill = getByteStreamFromAutoVariable(playerObject, "workingSkill");
|
|
if (playerObjectWorkingSkill != null && playerObjectWorkingSkill.length > 0)
|
|
{
|
|
characterData.put("workingSkill", playerObjectWorkingSkill);
|
|
}
|
|
byte[] playerObjectSkillTemplate = getByteStreamFromAutoVariable(playerObject, "skillTemplate");
|
|
if (playerObjectSkillTemplate != null && playerObjectSkillTemplate.length > 0)
|
|
{
|
|
characterData.put("skillTemplate", playerObjectSkillTemplate);
|
|
}
|
|
byte[] collections = getByteStreamFromAutoVariable(playerObject, "collections");
|
|
if (collections != null && collections.length > 0)
|
|
{
|
|
characterData.put("collections", collections);
|
|
}
|
|
byte[] collections2 = getByteStreamFromAutoVariable(playerObject, "collections2");
|
|
if (collections2 != null && collections2.length > 0)
|
|
{
|
|
characterData.put("collections2", collections2);
|
|
}
|
|
}
|
|
int[] quests = questGetAllActiveQuestIds(self);
|
|
dictionary questWaypoints = new dictionary();
|
|
for (int questCrc : quests) {
|
|
for (int taskId = 0; taskId < 16; ++taskId) {
|
|
obj_id waypoint = groundquests.getObjIdForWaypoint(questCrc, taskId, self);
|
|
obj_id entryWaypoint = groundquests.getObjIdForEntranceWaypoint(questCrc, taskId, self);
|
|
if (isIdValid(waypoint)) {
|
|
questWaypoints.put(waypoint, 1);
|
|
}
|
|
if (isIdValid(entryWaypoint)) {
|
|
questWaypoints.put(entryWaypoint, 1);
|
|
}
|
|
}
|
|
}
|
|
dictionary staticQuestWaypoints = new dictionary();
|
|
String[] questIDs = dataTableGetStringColumnNoDefaults("datatables/npc/static_quest/all_quest_names.iff", "quest_ids");
|
|
if ((questIDs != null) && (questIDs.length > 0))
|
|
{
|
|
for (String questID : questIDs) {
|
|
if (hasObjVar(self, questID + ".waypoint")) {
|
|
obj_id waypoint = getObjIdObjVar(self, questID + ".waypoint");
|
|
if (isIdValid(waypoint)) {
|
|
staticQuestWaypoints.put(waypoint, 1);
|
|
}
|
|
}
|
|
if (hasObjVar(self, questID + ".waypointhome")) {
|
|
obj_id waypoint = getObjIdObjVar(self, questID + ".waypointhome");
|
|
if (isIdValid(waypoint)) {
|
|
staticQuestWaypoints.put(waypoint, 1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
obj_id[] waypoints = getWaypointsInDatapad(self);
|
|
if (waypoints != null && waypoints.length > 0)
|
|
{
|
|
dictionary waypointDictionaries = new dictionary();
|
|
for (obj_id waypoint : waypoints) {
|
|
if (questWaypoints.containsKey(waypoint)) {
|
|
continue;
|
|
}
|
|
if (staticQuestWaypoints.containsKey(waypoint)) {
|
|
continue;
|
|
}
|
|
waypointDictionaries.put(waypoint, packWaypoint(waypoint));
|
|
}
|
|
characterData.put("waypoints", waypointDictionaries);
|
|
}
|
|
if (withItems == true)
|
|
{
|
|
int moneyFromCash = getCashBalance(self);
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter : packing " + moneyFromCash + " credits from cash");
|
|
characterData.put("moneyFromCash", moneyFromCash);
|
|
int moneyFromBank = getBankBalance(self);
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter : packing " + moneyFromBank + " credits from bank");
|
|
characterData.put("moneyFromBank", moneyFromBank);
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter() : packing inventory items");
|
|
dictionary inventoryDictionary = new dictionary();
|
|
obj_id[] inventoryItems = getInventoryAndEquipment(self);
|
|
obj_id playerInventory = getObjectInSlot(self, "inventory");
|
|
if (inventoryItems != null && inventoryItems.length > 0)
|
|
{
|
|
int inventoryIter = 0;
|
|
for (inventoryIter = 0; inventoryIter < inventoryItems.length; ++inventoryIter)
|
|
{
|
|
doItemPrepack(inventoryItems[inventoryIter]);
|
|
}
|
|
for (inventoryIter = 0; inventoryIter < inventoryItems.length; ++inventoryIter)
|
|
{
|
|
if (!isValidId(inventoryItems[inventoryIter]))
|
|
{
|
|
continue;
|
|
}
|
|
if (hasScript(inventoryItems[inventoryIter], "event.housepackup.cts_greeter"))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter() : SKIPPING pack of inventory item " + inventoryItems[inventoryIter] + ". This item was a unique object for Free CTS and cannot be transfered to another server.");
|
|
continue;
|
|
}
|
|
if (getContainedBy(inventoryItems[inventoryIter]) != self && getContainedBy(inventoryItems[inventoryIter]) != playerInventory)
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter() : SKIPPING pack of inventory item " + inventoryItems[inventoryIter] + " due to incorrect containment");
|
|
continue;
|
|
}
|
|
if (hasCondition(inventoryItems[inventoryIter], CONDITION_VENDOR))
|
|
{
|
|
continue;
|
|
}
|
|
int ot = getGameObjectType(inventoryItems[inventoryIter]);
|
|
if (itemIsAllowedToTransfer(inventoryItems[inventoryIter], self) && (!isGameObjectTypeOf(ot, GOT_resource_container) || !ctsHasExceededResourceTransferLimit(resourceCrateCountLimit, resourceCurrentCrateCount[0], resourceUnitCountLimit, resourceCurrentUnitCount[0])))
|
|
{
|
|
dictionary itemDictionary = packItem(inventoryItems[inventoryIter], ot, allowOverride, resourceCrateCountLimit, resourceCurrentCrateCount, resourceUnitCountLimit, resourceCurrentUnitCount);
|
|
if (itemDictionary != null)
|
|
{
|
|
inventoryDictionary.put(inventoryItems[inventoryIter], itemDictionary);
|
|
}
|
|
else
|
|
{
|
|
if (!allowOverride)
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
characterData.put("inventoryDictionary", inventoryDictionary);
|
|
LIVE_LOG("CharacterTransfer", "OnUploadCharacter() : inventory items packed (" + inventoryDictionary.toString() + ")");
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter() : packing bank items");
|
|
dictionary bankDictionary = new dictionary();
|
|
obj_id playerBank = utils.getPlayerBank(self);
|
|
if (isIdValid(playerBank))
|
|
{
|
|
obj_id[] bankItems = getContents(playerBank);
|
|
if (bankItems != null && bankItems.length > 0)
|
|
{
|
|
int bankIter = 0;
|
|
for (bankIter = 0; bankIter < bankItems.length; ++bankIter)
|
|
{
|
|
doItemPrepack(bankItems[bankIter]);
|
|
}
|
|
for (bankIter = 0; bankIter < bankItems.length; ++bankIter)
|
|
{
|
|
if (!isValidId(bankItems[bankIter]))
|
|
{
|
|
continue;
|
|
}
|
|
if (getContainedBy(bankItems[bankIter]) != self && getContainedBy(bankItems[bankIter]) != playerBank)
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter() : SKIPPING pack of bank item " + bankItems[bankIter] + " due to incorrect containment");
|
|
continue;
|
|
}
|
|
if (hasCondition(bankItems[bankIter], CONDITION_VENDOR))
|
|
{
|
|
continue;
|
|
}
|
|
int ot = getGameObjectType(bankItems[bankIter]);
|
|
if (itemIsAllowedToTransfer(bankItems[bankIter], self) && (!isGameObjectTypeOf(ot, GOT_resource_container) || !ctsHasExceededResourceTransferLimit(resourceCrateCountLimit, resourceCurrentCrateCount[0], resourceUnitCountLimit, resourceCurrentUnitCount[0])))
|
|
{
|
|
dictionary itemDictionary = packItem(bankItems[bankIter], ot, allowOverride, resourceCrateCountLimit, resourceCurrentCrateCount, resourceUnitCountLimit, resourceCurrentUnitCount);
|
|
if (itemDictionary != null)
|
|
{
|
|
bankDictionary.put(bankItems[bankIter], itemDictionary);
|
|
}
|
|
else
|
|
{
|
|
if (!allowOverride)
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
characterData.put("bankDictionary", bankDictionary);
|
|
LIVE_LOG("CharacterTransfer", "OnUploadCharacter() : bank items packed (" + bankDictionary.toString() + ")");
|
|
}
|
|
else
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter() : FAILED to pack bank items. bank object is not valid. TRANSFER FAILED");
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter() : packing datapad items");
|
|
dictionary datapadDictionary = new dictionary();
|
|
obj_id playerDatapad = utils.getPlayerDatapad(self);
|
|
if (isIdValid(playerDatapad))
|
|
{
|
|
obj_id[] datapadItems = getContents(playerDatapad);
|
|
if (datapadItems != null && datapadItems.length > 0)
|
|
{
|
|
int datapadIter = 0;
|
|
for (datapadIter = 0; datapadIter < datapadItems.length; ++datapadIter)
|
|
{
|
|
doItemPrepack(datapadItems[datapadIter]);
|
|
}
|
|
for (datapadIter = 0; datapadIter < datapadItems.length; ++datapadIter)
|
|
{
|
|
if (!isValidId(datapadItems[datapadIter]))
|
|
{
|
|
continue;
|
|
}
|
|
if (getContainedBy(datapadItems[datapadIter]) != self && getContainedBy(datapadItems[datapadIter]) != playerDatapad)
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter() : SKIPPING pack of datapad item " + datapadItems[datapadIter] + " due to incorrect containment");
|
|
continue;
|
|
}
|
|
if (guild.STR_GUILD_REMOTE_DEVICE.equals(getTemplateName(datapadItems[datapadIter])))
|
|
{
|
|
continue;
|
|
}
|
|
if (hasCondition(datapadItems[datapadIter], CONDITION_VENDOR))
|
|
{
|
|
continue;
|
|
}
|
|
int objtype = getGameObjectType(datapadItems[datapadIter]);
|
|
if (isGameObjectTypeOf(objtype, GOT_data_house_control_device))
|
|
{
|
|
}
|
|
if (isGameObjectTypeOf(objtype, GOT_data_ship_control_device) && (TRANSFER_SHIPS == 0))
|
|
{
|
|
continue;
|
|
}
|
|
if (isGameObjectTypeOf(objtype, GOT_data_droid_control_device) && (TRANSFER_DROIDS == 0))
|
|
{
|
|
continue;
|
|
}
|
|
if (isGameObjectTypeOf(objtype, GOT_data_manufacturing_schematic))
|
|
{
|
|
}
|
|
if (isGameObjectTypeOf(objtype, GOT_data_vendor_control_device))
|
|
{
|
|
continue;
|
|
}
|
|
if (objtype == GOT_data_mission_object)
|
|
{
|
|
String missionType = getMissionType(datapadItems[datapadIter]);
|
|
if ((missionType != null) && missionType.equals("bounty"))
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
if (itemIsAllowedToTransfer(datapadItems[datapadIter], self) && (!isGameObjectTypeOf(objtype, GOT_resource_container) || !ctsHasExceededResourceTransferLimit(resourceCrateCountLimit, resourceCurrentCrateCount[0], resourceUnitCountLimit, resourceCurrentUnitCount[0])))
|
|
{
|
|
dictionary itemDictionary = packItem(datapadItems[datapadIter], objtype, allowOverride, resourceCrateCountLimit, resourceCurrentCrateCount, resourceUnitCountLimit, resourceCurrentUnitCount);
|
|
if (itemDictionary != null)
|
|
{
|
|
datapadDictionary.put(datapadItems[datapadIter], itemDictionary);
|
|
}
|
|
else
|
|
{
|
|
if (!allowOverride)
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
characterData.put("datapadDictionary", datapadDictionary);
|
|
LIVE_LOG("CharacterTransfer", "OnUploadCharacter() : datapad items packed (" + datapadDictionary.toString() + ")");
|
|
}
|
|
else
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter() : FAILED to pack datapad items. datapad object is not valid. TRANSFER FAILED");
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter() : packing appearance buy back items");
|
|
dictionary buyBackDictionary = new dictionary();
|
|
obj_id buyBackContainer = getObjIdObjVar(self, smuggler.BUYBACK_CONTAINER_VAR);
|
|
if (!isIdValid(buyBackContainer))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter() : FAILED to find a buy back container object.");
|
|
}
|
|
else
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter() : SUCCESS finding a buy back container object.");
|
|
obj_id[] buyBackItems = getContents(buyBackContainer);
|
|
if (buyBackItems != null && buyBackItems.length > 0)
|
|
{
|
|
int buyBackIter = 0;
|
|
for (buyBackIter = 0; buyBackIter < buyBackItems.length; ++buyBackIter)
|
|
{
|
|
doItemPrepack(buyBackItems[buyBackIter]);
|
|
}
|
|
for (buyBackIter = 0; buyBackIter < buyBackItems.length; ++buyBackIter)
|
|
{
|
|
if (!isValidId(buyBackItems[buyBackIter]))
|
|
{
|
|
continue;
|
|
}
|
|
if (getContainedBy(buyBackItems[buyBackIter]) != self && getContainedBy(buyBackItems[buyBackIter]) != buyBackContainer)
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter() : SKIPPING pack of buy back item " + buyBackItems[buyBackIter] + " due to incorrect containment");
|
|
continue;
|
|
}
|
|
int objtype = getGameObjectType(buyBackItems[buyBackIter]);
|
|
if (isGameObjectTypeOf(objtype, GOT_data_ship_control_device) && (TRANSFER_SHIPS == 0))
|
|
{
|
|
continue;
|
|
}
|
|
if (itemIsAllowedToTransfer(buyBackItems[buyBackIter], self) && (!isGameObjectTypeOf(objtype, GOT_resource_container) || !ctsHasExceededResourceTransferLimit(resourceCrateCountLimit, resourceCurrentCrateCount[0], resourceUnitCountLimit, resourceCurrentUnitCount[0])))
|
|
{
|
|
dictionary itemDictionary = packItem(buyBackItems[buyBackIter], objtype, allowOverride, resourceCrateCountLimit, resourceCurrentCrateCount, resourceUnitCountLimit, resourceCurrentUnitCount);
|
|
if (itemDictionary != null)
|
|
{
|
|
buyBackDictionary.put(buyBackItems[buyBackIter], itemDictionary);
|
|
}
|
|
else
|
|
{
|
|
if (!allowOverride)
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
characterData.put("buyBackDictionary", buyBackDictionary);
|
|
LIVE_LOG("CharacterTransfer", "OnUploadCharacter() : buy back items packed (" + buyBackDictionary.toString() + ")");
|
|
}
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter() : packing hangar items");
|
|
dictionary hangarDictionary = new dictionary();
|
|
obj_id playerHangar = utils.getPlayerHangar(self);
|
|
if (isIdValid(playerHangar))
|
|
{
|
|
obj_id[] hangarItems = getContents(playerHangar);
|
|
if (hangarItems != null && hangarItems.length > 0)
|
|
{
|
|
int hangarIter = 0;
|
|
for (hangarIter = 0; hangarIter < hangarItems.length; ++hangarIter)
|
|
{
|
|
doItemPrepack(hangarItems[hangarIter]);
|
|
}
|
|
for (hangarIter = 0; hangarIter < hangarItems.length; ++hangarIter)
|
|
{
|
|
if (!isValidId(hangarItems[hangarIter]))
|
|
{
|
|
continue;
|
|
}
|
|
if (getContainedBy(hangarItems[hangarIter]) != self && getContainedBy(hangarItems[hangarIter]) != playerHangar)
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter() : SKIPPING pack of hangar item " + hangarItems[hangarIter] + " due to incorrect containment");
|
|
continue;
|
|
}
|
|
int objtype = getGameObjectType(hangarItems[hangarIter]);
|
|
if (isGameObjectTypeOf(objtype, GOT_data_ship_control_device) && (TRANSFER_SHIPS == 0))
|
|
{
|
|
continue;
|
|
}
|
|
if (itemIsAllowedToTransfer(hangarItems[hangarIter], self) && (!isGameObjectTypeOf(objtype, GOT_resource_container) || !ctsHasExceededResourceTransferLimit(resourceCrateCountLimit, resourceCurrentCrateCount[0], resourceUnitCountLimit, resourceCurrentUnitCount[0])))
|
|
{
|
|
dictionary itemDictionary = packItem(hangarItems[hangarIter], objtype, allowOverride, resourceCrateCountLimit, resourceCurrentCrateCount, resourceUnitCountLimit, resourceCurrentUnitCount);
|
|
if (itemDictionary != null)
|
|
{
|
|
hangarDictionary.put(hangarItems[hangarIter], itemDictionary);
|
|
}
|
|
else
|
|
{
|
|
if (!allowOverride)
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
characterData.put("hangarDictionary", hangarDictionary);
|
|
LIVE_LOG("CharacterTransfer", "OnUploadCharacter() : hangar items packed (" + hangarDictionary.toString() + ")");
|
|
}
|
|
else
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter() : FAILED to pack hangar items. hangar object is not valid. The player doesnt have a hangar object, transfer continuing.");
|
|
}
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter() : packing appearance inventory items");
|
|
dictionary appearanceDictionary = new dictionary();
|
|
obj_id playerAppearance = getAppearanceInventory(self);
|
|
if (isIdValid(playerAppearance))
|
|
{
|
|
obj_id[] appearanceItems = getContents(playerAppearance);
|
|
if (appearanceItems != null && appearanceItems.length > 0)
|
|
{
|
|
int appearanceIter = 0;
|
|
for (appearanceIter = 0; appearanceIter < appearanceItems.length; ++appearanceIter)
|
|
{
|
|
doItemPrepack(appearanceItems[appearanceIter]);
|
|
}
|
|
for (appearanceIter = 0; appearanceIter < appearanceItems.length; ++appearanceIter)
|
|
{
|
|
if (!isValidId(appearanceItems[appearanceIter]))
|
|
{
|
|
continue;
|
|
}
|
|
int objtype = getGameObjectType(appearanceItems[appearanceIter]);
|
|
if (itemIsAllowedToTransfer(appearanceItems[appearanceIter], self) && (!isGameObjectTypeOf(objtype, GOT_resource_container) || !ctsHasExceededResourceTransferLimit(resourceCrateCountLimit, resourceCurrentCrateCount[0], resourceUnitCountLimit, resourceCurrentUnitCount[0])))
|
|
{
|
|
dictionary itemDictionary = packItem(appearanceItems[appearanceIter], objtype, allowOverride, resourceCrateCountLimit, resourceCurrentCrateCount, resourceUnitCountLimit, resourceCurrentUnitCount);
|
|
if (itemDictionary != null)
|
|
{
|
|
appearanceDictionary.put(appearanceItems[appearanceIter], itemDictionary);
|
|
}
|
|
else
|
|
{
|
|
if (!allowOverride)
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
characterData.put("appearanceDictionary", appearanceDictionary);
|
|
LIVE_LOG("CharacterTransfer", "OnUploadCharacter() : appearance inventory items packed (" + appearanceDictionary.toString() + ")");
|
|
}
|
|
else
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter() : FAILED to pack appearance inventory items. appearance inventory object is not valid. TRANSFER FAILED");
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
}
|
|
if (hasScript(self, "space.quest_logic.player_spacequest"))
|
|
{
|
|
characterData.put("attachSpacequestScript", true);
|
|
}
|
|
String[] strObjVars = new String[strObjVarLists.length];
|
|
for (int intI = 0; intI < strObjVarLists.length; intI++)
|
|
{
|
|
String strObjVar = getPackedObjvars(self, strObjVarLists[intI]);
|
|
strObjVars[intI] = strObjVar;
|
|
}
|
|
characterData.put("strObjVars", strObjVars);
|
|
}
|
|
catch(Throwable t)
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter() : an exception was thrown! characterData(" + characterData + ") TRANSFER FAILED : " + t);
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
removeObjVar(self, "cts");
|
|
CustomerServiceLog("CharacterTransfer", "OnUploadCharacter() complete");
|
|
setObjVar(self, "disableLoginCtsInProgress", (getGameTime() + 600));
|
|
messageTo(self, "disconnectPlayerCtsCompletedOrInProgress", null, 0.1f, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public static final String[][] STARTING_CLOTHES =
|
|
{
|
|
|
|
{
|
|
"object/tangible/wearables/shirt/shirt_s14.iff",
|
|
"object/tangible/wearables/jacket/jacket_s16.iff",
|
|
"object/tangible/wearables/pants/pants_s14.iff",
|
|
"object/tangible/wearables/boots/boots_s05.iff"
|
|
},
|
|
|
|
{
|
|
"object/tangible/wearables/shirt/shirt_s27.iff",
|
|
"object/tangible/wearables/pants/pants_s07.iff",
|
|
"object/tangible/wearables/boots/boots_s05.iff",
|
|
"object/tangible/wearables/gloves/gloves_s03.iff"
|
|
},
|
|
|
|
{
|
|
"object/tangible/wearables/shirt/shirt_s27.iff",
|
|
"object/tangible/wearables/pants/pants_s07.iff",
|
|
"object/tangible/wearables/boots/boots_s05.iff",
|
|
"object/tangible/wearables/gloves/gloves_s02.iff"
|
|
},
|
|
|
|
{
|
|
"object/tangible/wearables/shirt/shirt_s14.iff",
|
|
"object/tangible/wearables/jacket/jacket_s16.iff",
|
|
"object/tangible/wearables/pants/pants_s14.iff"
|
|
},
|
|
|
|
{
|
|
"object/tangible/wearables/shirt/shirt_s27.iff",
|
|
"object/tangible/wearables/pants/pants_s07.iff",
|
|
"object/tangible/wearables/gloves/gloves_s03.iff"
|
|
}
|
|
};
|
|
public void createStartingEquipment(obj_id objPlayer) throws InterruptedException
|
|
{
|
|
obj_id playerInv = utils.getInventoryContainer(objPlayer);
|
|
int gender = getGender(objPlayer);
|
|
int species = getSpecies(objPlayer);
|
|
int idx = -1;
|
|
if (gender == GENDER_MALE)
|
|
{
|
|
if (species == SPECIES_HUMAN || species == SPECIES_ZABRAK || species == SPECIES_BOTHAN || species == SPECIES_MON_CALAMARI || species == SPECIES_RODIAN || species == SPECIES_TWILEK)
|
|
{
|
|
idx = 0;
|
|
}
|
|
if (species == SPECIES_TRANDOSHAN)
|
|
{
|
|
idx = 3;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (species == SPECIES_HUMAN || species == SPECIES_ZABRAK || species == SPECIES_BOTHAN || species == SPECIES_RODIAN || species == SPECIES_TWILEK)
|
|
{
|
|
idx = 1;
|
|
}
|
|
if (species == SPECIES_MON_CALAMARI)
|
|
{
|
|
idx = 2;
|
|
}
|
|
if (species == SPECIES_TRANDOSHAN)
|
|
{
|
|
idx = 4;
|
|
}
|
|
}
|
|
if (idx >= 0)
|
|
{
|
|
for (int i = 0; i < STARTING_CLOTHES[idx].length; i++)
|
|
{
|
|
obj_id newItem = createObject(STARTING_CLOTHES[idx][i], playerInv, "");
|
|
if (isIdValid(newItem))
|
|
{
|
|
equip(newItem, playerInv);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
public int OnDownloadCharacter(obj_id self, byte[] packedData) throws InterruptedException
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter() begin");
|
|
try
|
|
{
|
|
if (hasObjVar(self, "hasTransferred"))
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
utils.setLocalVar(self, "ctsBeingUnpacked", true);
|
|
setObjVar(self, "hasTransferred", 1);
|
|
dictionary characterData = dictionary.unpack(packedData);
|
|
if (characterData != null)
|
|
{
|
|
String skillTemplate = characterData.getString("skillTemplate");
|
|
String workingSkill = characterData.getString("workingSkill");
|
|
int combatLevel = characterData.getInt("combatLevel");
|
|
CustomerServiceLog("CharacterTransfer", "setSkillTemplate(" + self + ", " + skillTemplate + ") (combatLevel == " + combatLevel + ", workingSkill == " + workingSkill + ")");
|
|
setObjVar(self, "clickRespec.combatLevel", combatLevel);
|
|
setObjVar(self, "clickRespec.workingSkill", workingSkill);
|
|
setObjVar(self, "clickRespec.cts", true);
|
|
setSkillTemplate(self, skillTemplate);
|
|
String[] skills = characterData.getStringArray("skills");
|
|
for (String skill : skills) {
|
|
if (!hasSkill(self, skill)) {
|
|
if (grantSkill(self, skill)) {
|
|
CustomerServiceLog("CharacterTransfer", "grantSkill(" + self + ", " + skill + ")");
|
|
} else {
|
|
CustomerServiceLog("CharacterTransfer", "grantSkill(" + self + ", " + skill + ") FAILED");
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
}
|
|
}
|
|
String[] commands = characterData.getStringArray("commands");
|
|
for (String command : commands) {
|
|
if (!hasCommand(self, command)) {
|
|
if (grantCommand(self, command)) {
|
|
CustomerServiceLog("CharacterTransfer", "grantCommand(" + self + ", " + command + ")");
|
|
} else {
|
|
CustomerServiceLog("CharacterTransfer", "grantCommand(" + self + ", " + command + ") FAILED");
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
}
|
|
}
|
|
dictionary experiencePoints = characterData.getDictionary("experience_points");
|
|
if (experiencePoints != null)
|
|
{
|
|
Set keySet = experiencePoints.keySet();
|
|
for (Object o : keySet) {
|
|
String expType = (String) o;
|
|
if (expType != null) {
|
|
int expValue = experiencePoints.getInt(expType);
|
|
if (getExperiencePoints(self, expType) != expValue) {
|
|
int result = grantExperiencePoints(self, expType, expValue);
|
|
if (result == XP_ERROR) {
|
|
CustomerServiceLog("CharacterTransfer", "grantExperiencePoints(" + self + ", " + expType + ", " + expValue + ") FAILED");
|
|
return SCRIPT_OVERRIDE;
|
|
} else {
|
|
CustomerServiceLog("CharacterTransfer", "grantExperiencePoints(" + self + ", " + expType + ", " + expValue + ") (non-roadmap exp)");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
String[] strObjVars = characterData.getStringArray("strObjVars");
|
|
for (String strObjVar : strObjVars) {
|
|
setPackedObjvars(self, strObjVar);
|
|
}
|
|
removeObjVar(self, "galactic_reserve_cooldown");
|
|
if (hasObjVar(self, CTS_LOT_COUNT))
|
|
{
|
|
int lot_count = getIntObjVar(self, CTS_LOT_COUNT);
|
|
CustomerServiceLog("CharacterTransfer", "adjusting lot count(" + self + ", " + lot_count + ")");
|
|
player_structure.adjustLotCount(getPlayerObject(self), lot_count);
|
|
}
|
|
int sourceCharacterAlignedFaction = characterData.getInt("pvp_aligned_faction");
|
|
int sourceCharacterPvpType = characterData.getInt("pvp_type");
|
|
switch (sourceCharacterPvpType)
|
|
{
|
|
case PVPTYPE_NEUTRAL:
|
|
if (sourceCharacterAlignedFaction == 0)
|
|
{
|
|
pvpMakeNeutral(self);
|
|
}
|
|
break;
|
|
case PVPTYPE_COVERT:
|
|
pvpMakeCovert(self);
|
|
break;
|
|
case PVPTYPE_DECLARED:
|
|
pvpMakeDeclared(self);
|
|
break;
|
|
}
|
|
pvpSetAlignedFaction(self, sourceCharacterAlignedFaction);
|
|
if ((sourceCharacterAlignedFaction != 0) && (sourceCharacterPvpType == PVPTYPE_NEUTRAL))
|
|
{
|
|
pvpMakeOnLeave(self);
|
|
}
|
|
ctsUseOnlySetGcwInfo(self, characterData.getInt("gcw_current_point"), characterData.getInt("gcw_current_rating"), characterData.getInt("gcw_current_pvp_kill"), characterData.getLong("gcw_lifetime_point"), characterData.getInt("gcw_max_imperial_rating"), characterData.getInt("gcw_max_rebel_rating"), characterData.getInt("gcw_lifetime_pvp_kill"), characterData.getInt("gcw_next_rating_calc_time"));
|
|
obj_id[] old_waypoints = getWaypointsInDatapad(self);
|
|
if (old_waypoints != null && old_waypoints.length > 0)
|
|
{
|
|
for (obj_id old_waypoint : old_waypoints) {
|
|
destroyWaypointInDatapad(old_waypoint, self);
|
|
}
|
|
}
|
|
dictionary waypoints = characterData.getDictionary("waypoints");
|
|
if (waypoints != null)
|
|
{
|
|
Set keySet = waypoints.keySet();
|
|
for (Object o : keySet) {
|
|
obj_id key = (obj_id) o;
|
|
dictionary waypointDict = waypoints.getDictionary(key);
|
|
unpackWaypoint(waypointDict);
|
|
}
|
|
}
|
|
obj_id playerObject = getPlayerObject(self);
|
|
if (isIdValid(playerObject))
|
|
{
|
|
if (characterData.containsKey("quests"))
|
|
{
|
|
byte[] quests = characterData.getByteArray("quests");
|
|
setAutoVariableFromByteStream(playerObject, "quests", quests);
|
|
}
|
|
if (characterData.containsKey("activeQuests"))
|
|
{
|
|
byte[] activeQuests = characterData.getByteArray("activeQuests");
|
|
setAutoVariableFromByteStream(playerObject, "activeQuests", activeQuests);
|
|
}
|
|
if (characterData.containsKey("completedQuests"))
|
|
{
|
|
byte[] completedQuests = characterData.getByteArray("completedQuests");
|
|
setAutoVariableFromByteStream(playerObject, "completedQuests", completedQuests);
|
|
}
|
|
if (characterData.containsKey("currentQuest"))
|
|
{
|
|
byte[] currentQuest = characterData.getByteArray("currentQuest");
|
|
setAutoVariableFromByteStream(playerObject, "currentQuest", currentQuest);
|
|
}
|
|
groundquests.reattachQuestScripts(self);
|
|
if (characterData.containsKey("bornDate"))
|
|
{
|
|
byte[] bornDate = characterData.getByteArray("bornDate");
|
|
setAutoVariableFromByteStream(playerObject, "bornDate", bornDate);
|
|
}
|
|
if (characterData.containsKey("playedTime"))
|
|
{
|
|
byte[] playedTime = characterData.getByteArray("playedTime");
|
|
setAutoVariableFromByteStream(playerObject, "playedTime", playedTime);
|
|
}
|
|
if (characterData.containsKey("food"))
|
|
{
|
|
byte[] food = characterData.getByteArray("food");
|
|
setAutoVariableFromByteStream(playerObject, "food", food);
|
|
}
|
|
if (characterData.containsKey("maxFood"))
|
|
{
|
|
byte[] maxFood = characterData.getByteArray("maxFood");
|
|
setAutoVariableFromByteStream(playerObject, "maxFood", maxFood);
|
|
}
|
|
if (characterData.containsKey("drink"))
|
|
{
|
|
byte[] drink = characterData.getByteArray("drink");
|
|
setAutoVariableFromByteStream(playerObject, "drink", drink);
|
|
}
|
|
if (characterData.containsKey("maxDrink"))
|
|
{
|
|
byte[] maxDrink = characterData.getByteArray("maxDrink");
|
|
setAutoVariableFromByteStream(playerObject, "maxDrink", maxDrink);
|
|
}
|
|
if (characterData.containsKey("meds"))
|
|
{
|
|
byte[] meds = characterData.getByteArray("meds");
|
|
setAutoVariableFromByteStream(playerObject, "meds", meds);
|
|
}
|
|
if (characterData.containsKey("maxMeds"))
|
|
{
|
|
byte[] maxMeds = characterData.getByteArray("maxMeds");
|
|
setAutoVariableFromByteStream(playerObject, "maxMeds", maxMeds);
|
|
}
|
|
if (characterData.containsKey("matchMakingPersonalProfileId"))
|
|
{
|
|
byte[] matchMakingPersonalProfileId = characterData.getByteArray("matchMakingPersonalProfileId");
|
|
setAutoVariableFromByteStream(playerObject, "matchMakingPersonalProfileId", matchMakingPersonalProfileId);
|
|
}
|
|
if (characterData.containsKey("matchMakingCharacterProfileId"))
|
|
{
|
|
byte[] matchMakingCharacterProfileId = characterData.getByteArray("matchMakingCharacterProfileId");
|
|
setAutoVariableFromByteStream(playerObject, "matchMakingCharacterProfileId", matchMakingCharacterProfileId);
|
|
}
|
|
if (characterData.containsKey("workingSkill"))
|
|
{
|
|
byte[] playerObjectWorkingSkill = characterData.getByteArray("workingSkill");
|
|
setAutoVariableFromByteStream(playerObject, "workingSkill", playerObjectWorkingSkill);
|
|
}
|
|
if (characterData.containsKey("skillTemplate"))
|
|
{
|
|
byte[] playerObjectSkillTemplate = characterData.getByteArray("skillTemplate");
|
|
setAutoVariableFromByteStream(playerObject, "skillTemplate", playerObjectSkillTemplate);
|
|
}
|
|
if (characterData.containsKey("collections"))
|
|
{
|
|
byte[] collections = characterData.getByteArray("collections");
|
|
setAutoVariableFromByteStream(playerObject, "collections", collections);
|
|
}
|
|
if (characterData.containsKey("collections2"))
|
|
{
|
|
byte[] collections2 = characterData.getByteArray("collections2");
|
|
setAutoVariableFromByteStream(playerObject, "collections2", collections2);
|
|
}
|
|
if (characterData.containsKey("source_cluster"))
|
|
{
|
|
String sourceCluster = characterData.getString("source_cluster");
|
|
if (characterData.containsKey("source_character_oid") && characterData.containsKey("source_character_name"))
|
|
{
|
|
int ctsHistoryIndex = 1;
|
|
while (true)
|
|
{
|
|
if (!hasObjVar(self, "ctsHistory." + ctsHistoryIndex))
|
|
{
|
|
setObjVar(self, "ctsHistory." + ctsHistoryIndex, "" + getCalendarTime() + " " + sourceCluster + " " + characterData.getObjId("source_character_oid") + " " + characterData.getString("source_character_name"));
|
|
break;
|
|
}
|
|
++ctsHistoryIndex;
|
|
}
|
|
}
|
|
String currentCluster = getClusterName();
|
|
boolean grantCtsTitle = !sourceCluster.equals(currentCluster);
|
|
sourceCluster = toLower(sourceCluster);
|
|
sourceCluster = sourceCluster.replace('-', '_');
|
|
if (grantCtsTitle)
|
|
{
|
|
modifyCollectionSlotValue(self, "cts_from_" + sourceCluster, 1L);
|
|
}
|
|
if (characterData.containsKey("freeCtsTransactionRuleName"))
|
|
{
|
|
setObjVar(self, characterData.getString("freeCtsTransactionRuleName") + "." + sourceCluster, currentCluster);
|
|
}
|
|
}
|
|
int[] quests = questGetAllActiveQuestIds(self);
|
|
for (int questId : quests) {
|
|
for (int taskId = 0; taskId < 16; ++taskId) {
|
|
if (questIsTaskActive(questId, taskId, self)) {
|
|
groundquests.refreshQuestWaypoints(questId, taskId, true, self);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
boolean withItems = characterData.getBoolean("withItems");
|
|
if (withItems == true)
|
|
{
|
|
obj_id[] existingItems = getInventoryAndEquipment(self);
|
|
obj_id inv = utils.getInventoryContainer(self);
|
|
if (existingItems != null)
|
|
{
|
|
int existingIter;
|
|
for (existingIter = 0; existingIter < existingItems.length; ++existingIter)
|
|
{
|
|
if (existingItems[existingIter] != self && existingItems[existingIter] != inv)
|
|
{
|
|
LIVE_LOG("CharacterTransfer", "OnDownloadCharacter() : destroying unwanted pre-existing destination item : " + getTemplateName(existingItems[existingIter]));
|
|
destroyObject(existingItems[existingIter]);
|
|
}
|
|
}
|
|
}
|
|
int maxMoneyTransferAmount = 100000000;
|
|
|
|
{
|
|
int tempMaxMoneyTransferAmount = utils.stringToInt(getConfigSetting("GameServer", "maxMoneyTransfer"));
|
|
if (tempMaxMoneyTransferAmount > 0)
|
|
{
|
|
maxMoneyTransferAmount = tempMaxMoneyTransferAmount;
|
|
}
|
|
}
|
|
if (characterData.containsKey("moneyFromCash"))
|
|
{
|
|
int moneyFromCash = characterData.getInt("moneyFromCash");
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter : unpacking " + moneyFromCash + " credits to cash");
|
|
while (moneyFromCash > 0)
|
|
{
|
|
int transferAmount = utils.clipRange(moneyFromCash, 0, maxMoneyTransferAmount);
|
|
if (!transferBankCreditsFromNamedAccount("characterTransfer", self, transferAmount, null, null, null))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "transferBankCreditsFromNamedAccount(characterTransfer, " + self + ", " + transferAmount + ", null, null, null) FAILED");
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
if (!withdrawCashFromBank(self, transferAmount, null, null, null))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "withdrawCashFromBank(characterTransfer, " + self + ", " + transferAmount + ", null, null, null) FAILED");
|
|
break;
|
|
}
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter : +" + transferAmount + " credits to cash");
|
|
}
|
|
moneyFromCash -= maxMoneyTransferAmount;
|
|
}
|
|
}
|
|
if (characterData.containsKey("moneyFromBank"))
|
|
{
|
|
int moneyFromBank = characterData.getInt("moneyFromBank");
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter : unpacking " + moneyFromBank + " credits to bank");
|
|
while (moneyFromBank > 0)
|
|
{
|
|
int transferAmount = utils.clipRange(moneyFromBank, 0, maxMoneyTransferAmount);
|
|
if (!transferBankCreditsFromNamedAccount("characterTransfer", self, transferAmount, null, null, null))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "transferBankCreditsFromNamedAccount(characterTransfer, " + self + ", " + transferAmount + ", null, null, null) FAILED");
|
|
break;
|
|
}
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter : +" + transferAmount + " credits to bank");
|
|
moneyFromBank -= maxMoneyTransferAmount;
|
|
}
|
|
}
|
|
obj_id playerInventory = utils.getInventoryContainer(self);
|
|
obj_id playerBank = utils.getPlayerBank(self);
|
|
utils.setScriptVar(self, "autostack.ignoreitems", true);
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter : unpacking inventory items");
|
|
dictionary inventoryDictionary = characterData.getDictionary("inventoryDictionary");
|
|
if (inventoryDictionary == null)
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
else
|
|
{
|
|
Set keySet = inventoryDictionary.keySet();
|
|
for (Object o : keySet) {
|
|
obj_id key = (obj_id) o;
|
|
if (isIdNull(key)) {
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter() : could not retrieve a key from the inventory dictionary iterator. TRANSFER FAILED");
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
dictionary itemDictionary = inventoryDictionary.getDictionary(key);
|
|
if (ctsCheckAndLogUniqueStaticItemAlreadyExists(playerInventory, itemDictionary)) {
|
|
continue;
|
|
}
|
|
obj_id unpackedItem = unpackItem(playerInventory, itemDictionary);
|
|
if (!isIdValid(unpackedItem)) {
|
|
if (isIdNull(unpackedItem)) {
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter() : unpackItem() returned NULL id for item: " + itemDictionary);
|
|
return SCRIPT_OVERRIDE;
|
|
} else {
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter() : unpackItem() returned invalid id " + unpackedItem + " for item: " + itemDictionary);
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter : unpacking bank items");
|
|
dictionary bankDictionary = characterData.getDictionary("bankDictionary");
|
|
if (bankDictionary == null)
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
else
|
|
{
|
|
Set keySet = bankDictionary.keySet();
|
|
for (Object o : keySet) {
|
|
obj_id key = (obj_id) o;
|
|
if (isIdNull(key)) {
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter() : could not retrieve a key from the bank dictionary iterator. TRANSFER FAILED");
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
dictionary itemDictionary = bankDictionary.getDictionary(key);
|
|
if (ctsCheckAndLogUniqueStaticItemAlreadyExists(playerInventory, itemDictionary)) {
|
|
continue;
|
|
}
|
|
obj_id unpackedItem = unpackItem(playerInventory, itemDictionary);
|
|
if (!isIdValid(unpackedItem)) {
|
|
if (isIdNull(unpackedItem)) {
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter() : unpackItem() returned NULL id for item: " + itemDictionary);
|
|
return SCRIPT_OVERRIDE;
|
|
} else {
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter() : unpackItem() returned invalid id " + unpackedItem + " for item: " + itemDictionary);
|
|
continue;
|
|
}
|
|
}
|
|
if (putIn(unpackedItem, playerBank)) {
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() : moved item " + unpackedItem + " into bank " + playerBank);
|
|
} else {
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() : FAILED to move item " + unpackedItem + " into bank " + playerBank);
|
|
}
|
|
}
|
|
}
|
|
obj_id playerDatapad = utils.getPlayerDatapad(self);
|
|
obj_id datapadObjects[] = getContents(playerDatapad);
|
|
for (obj_id datapadObject : datapadObjects) {
|
|
destroyObject(datapadObject);
|
|
}
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter : unpacking datapad items");
|
|
dictionary datapadDictionary = characterData.getDictionary("datapadDictionary");
|
|
if (datapadDictionary == null)
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
else
|
|
{
|
|
dictionary datapadItemOidTranslation = new dictionary();
|
|
Vector shipsWithDroidControlDevice = new Vector();
|
|
shipsWithDroidControlDevice.setSize(0);
|
|
Set keySet = datapadDictionary.keySet();
|
|
for (Object o1 : keySet) {
|
|
obj_id key = (obj_id) o1;
|
|
if (isIdNull(key)) {
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter() : could not retrieve a key from the datapad dictionary iterator. TRANSFER FAILED");
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
dictionary itemDictionary = datapadDictionary.getDictionary(key);
|
|
if (ctsCheckAndLogUniqueStaticItemAlreadyExists(playerDatapad, itemDictionary)) {
|
|
continue;
|
|
}
|
|
obj_id unpackedItem = unpackItem(playerDatapad, itemDictionary);
|
|
if (!isIdValid(unpackedItem)) {
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() : FAILED to unpack datapad item (original oid " + key + ") into datapad " + playerDatapad);
|
|
} else {
|
|
datapadItemOidTranslation.put(key, unpackedItem);
|
|
if (utils.hasScript(unpackedItem, "space.ship_control_device.ship_control_device")) {
|
|
obj_id ship = space_transition.getShipFromShipControlDevice(unpackedItem);
|
|
if (isIdValid(ship) && utils.hasLocalVar(ship, "droid_control_device")) {
|
|
utils.addElement(shipsWithDroidControlDevice, ship);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for (Object o : shipsWithDroidControlDevice) {
|
|
obj_id originalDroidControlDevice = utils.getObjIdLocalVar(((obj_id) o), "droid_control_device");
|
|
if (isIdValid(originalDroidControlDevice) && datapadItemOidTranslation.containsKey(originalDroidControlDevice)) {
|
|
obj_id newDroidControlDevice = datapadItemOidTranslation.getObjId(originalDroidControlDevice);
|
|
if (isIdValid(newDroidControlDevice)) {
|
|
associateDroidControlDeviceWithShip(((obj_id) o), newDroidControlDevice);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
obj_id buyBackContainer = getObjIdObjVar(self, smuggler.BUYBACK_CONTAINER_VAR);
|
|
if (isIdValid(buyBackContainer))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter : source character had an existing buy back container: " + buyBackContainer);
|
|
obj_id buyBackObjects[] = getContents(buyBackContainer);
|
|
if (buyBackObjects != null && buyBackObjects.length > 0)
|
|
{
|
|
for (obj_id buyBackObject : buyBackObjects) {
|
|
destroyObject(buyBackObject);
|
|
}
|
|
}
|
|
}
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter : unpacking buy back items");
|
|
dictionary buyBackDictionary = characterData.getDictionary("buyBackDictionary");
|
|
if (buyBackDictionary == null || buyBackDictionary.isEmpty())
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter : source character did not have a buy back dictionary data!!");
|
|
}
|
|
else
|
|
{
|
|
if (!isIdValid(buyBackContainer))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter : source character did not have a valid buy back container.");
|
|
buyBackContainer = smuggler.getBuyBackContainerObjVar(self);
|
|
}
|
|
if (!isIdValid(buyBackContainer))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter : source character could not create buy back container. TRANSFER FAILED");
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
Set keySet = buyBackDictionary.keySet();
|
|
for (Object o : keySet) {
|
|
obj_id key = (obj_id) o;
|
|
if (isIdNull(key)) {
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter() : could not retrieve a key from the buy back dictionary iterator. TRANSFER FAILED");
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
dictionary itemDictionary = buyBackDictionary.getDictionary(key);
|
|
obj_id unpackedItem = unpackItem(buyBackContainer, itemDictionary);
|
|
if (!isIdValid(unpackedItem)) {
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() : FAILED to unpack buy back item (original oid " + key + ") into buy back container " + buyBackContainer);
|
|
}
|
|
}
|
|
}
|
|
obj_id playerHangar = utils.getPlayerHangar(self);
|
|
if (isIdValid(playerHangar))
|
|
{
|
|
obj_id hangarObjects[] = getContents(playerHangar);
|
|
for (obj_id hangarObject : hangarObjects) {
|
|
destroyObject(hangarObject);
|
|
}
|
|
}
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter : unpacking hangar items");
|
|
dictionary hangarDictionary = characterData.getDictionary("hangarDictionary");
|
|
if (hangarDictionary == null || hangarDictionary.isEmpty())
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter : source character did not have a hangar object.");
|
|
}
|
|
else
|
|
{
|
|
if (!isIdValid(playerHangar))
|
|
{
|
|
playerHangar = createObject("object/tangible/datapad/character_hangar_datapad.iff", self, "hangar");
|
|
}
|
|
if (!isIdValid(playerHangar))
|
|
{
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter : source character could not create hangar. TRANSFER FAILED");
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
setObjVar(self, player_structure.OBJVAR_HANGAR_CREATED, playerHangar);
|
|
persistObject(playerHangar);
|
|
dictionary hangarItemOidTranslation = new dictionary();
|
|
Vector shipsWithDroidControlDevice = new Vector();
|
|
shipsWithDroidControlDevice.setSize(0);
|
|
Set keySet = hangarDictionary.keySet();
|
|
for (Object o1 : keySet) {
|
|
obj_id key = (obj_id) o1;
|
|
if (isIdNull(key)) {
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter() : could not retrieve a key from the hangar dictionary iterator. TRANSFER FAILED");
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
dictionary itemDictionary = hangarDictionary.getDictionary(key);
|
|
if (ctsCheckAndLogUniqueStaticItemAlreadyExists(playerDatapad, itemDictionary)) {
|
|
continue;
|
|
}
|
|
obj_id unpackedItem = unpackItem(playerHangar, itemDictionary);
|
|
if (!isIdValid(unpackedItem)) {
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() : FAILED to unpack hangar item (original oid " + key + ") into hangar " + playerHangar);
|
|
} else {
|
|
hangarItemOidTranslation.put(key, unpackedItem);
|
|
if (utils.hasScript(unpackedItem, "space.ship_control_device.ship_control_device")) {
|
|
obj_id ship = space_transition.getShipFromShipControlDevice(unpackedItem);
|
|
if (isIdValid(ship) && utils.hasLocalVar(ship, "droid_control_device")) {
|
|
utils.addElement(shipsWithDroidControlDevice, ship);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for (Object o : shipsWithDroidControlDevice) {
|
|
obj_id originalDroidControlDevice = utils.getObjIdLocalVar(((obj_id) o), "droid_control_device");
|
|
if (isIdValid(originalDroidControlDevice) && hangarItemOidTranslation.containsKey(originalDroidControlDevice)) {
|
|
obj_id newDroidControlDevice = hangarItemOidTranslation.getObjId(originalDroidControlDevice);
|
|
if (isIdValid(newDroidControlDevice)) {
|
|
associateDroidControlDeviceWithShip(((obj_id) o), newDroidControlDevice);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
obj_id playerAppearance = getAppearanceInventory(self);
|
|
obj_id appearanceObjects[] = getContents(playerAppearance);
|
|
for (obj_id appearanceObject : appearanceObjects) {
|
|
destroyObject(appearanceObject);
|
|
}
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter : unpacking appearance inventory items");
|
|
dictionary appearanceDictionary = characterData.getDictionary("appearanceDictionary");
|
|
if (appearanceDictionary == null)
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
else
|
|
{
|
|
Set keySet = appearanceDictionary.keySet();
|
|
for (Object o : keySet) {
|
|
obj_id key = (obj_id) o;
|
|
if (isIdNull(key)) {
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter() : could not retrieve a key from the appearance dictionary iterator. TRANSFER FAILED");
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
dictionary itemDictionary = appearanceDictionary.getDictionary(key);
|
|
if (ctsCheckAndLogUniqueStaticItemAlreadyExists(playerAppearance, itemDictionary)) {
|
|
continue;
|
|
}
|
|
obj_id unpackedItem = unpackItem(playerInventory, itemDictionary);
|
|
if (!isIdValid(unpackedItem)) {
|
|
CustomerServiceLog("CharacterTransfer", "unpackItem() : FAILED to unpack appearance inventory item (original oid " + key + ") into appearance inventory " + playerAppearance);
|
|
}
|
|
}
|
|
}
|
|
utils.removeScriptVar(self, "autostack.ignoreitems");
|
|
}
|
|
else
|
|
{
|
|
obj_id inventory = getObjectInSlot(self, "inventory");
|
|
if (isIdValid(inventory))
|
|
{
|
|
weapons.createWeapon("object/weapon/ranged/pistol/pistol_cdef.iff", inventory, 0.90f);
|
|
createObject("object/tangible/survey_tool/survey_tool_mineral.iff", inventory, "");
|
|
weapons.createWeapon("object/weapon/melee/knife/knife_survival.iff", inventory, 0.90f);
|
|
createObject("object/tangible/crafting/station/generic_tool.iff", inventory, "");
|
|
if (utils.isProfession(self, utils.ENTERTAINER))
|
|
{
|
|
createObject("object/tangible/instrument/slitherhorn.iff", inventory, "");
|
|
}
|
|
createStartingEquipment(self);
|
|
}
|
|
}
|
|
if (characterData.containsKey("attachSpacequestScript") && characterData.getBoolean("attachSpacequestScript"))
|
|
{
|
|
attachScript(self, "space.quest_logic.player_spacequest");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
}
|
|
catch(Throwable t)
|
|
{
|
|
removeObjVar(self, "cts");
|
|
utils.removeLocalVar(self, "ctsBeingUnpacked");
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter() : an exception was thrown! TRANSFER FAILED : " + t);
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
CustomerServiceLog("CharacterTransfer", "OnDownloadCharacter() complete");
|
|
removeObjVar(self, "cts");
|
|
removeObjVar(self, "preserve_existing_lightsaber_crystal_owner_objvar");
|
|
utils.removeLocalVar(self, "ctsBeingUnpacked");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnSkillModDone(obj_id self, String modName, boolean isDead) throws InterruptedException
|
|
{
|
|
if (modName == null)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (modName.indexOf("food_") == 0)
|
|
{
|
|
utils.removeScriptVar(self, modName);
|
|
}
|
|
trial.bumpSession(self, "displayDefensiveMods");
|
|
messageTo(self, "setDisplayOnlyDefensiveMods", trial.getSessionDict(self, "displayDefensiveMods"), 5, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int removeDelayedFoodEffect(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (params == null)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
String type = params.getString("type");
|
|
if (!utils.hasScriptVar(self, "food." + type + ".dur"))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int time = utils.getIntScriptVar(self, "food." + type + ".time");
|
|
if (getGameTime() - time < 1799)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
utils.removeScriptVarTree(self, "food." + type);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int removeDurationFoodEffect(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (params == null)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
String type = params.getString("type");
|
|
if (!utils.hasScriptVar(self, "food." + type + ".dur"))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int time = utils.getIntScriptVar(self, "food." + type + ".time");
|
|
if (getGameTime() - time < 1799)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
utils.removeScriptVarTree(self, "food." + type);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleSpiceDownerEffect(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (buff.hasBuff(self, "spice_downer"))
|
|
{
|
|
buff.removeBuff(self, "spice_downer");
|
|
}
|
|
float duration = buff.getDuration("spice_downer");
|
|
float downerModified = getEnhancedSkillStatisticModifierUncapped(self, "resistance_spice_downer");
|
|
if (downerModified > 0)
|
|
{
|
|
duration -= downerModified;
|
|
if (duration <= 0)
|
|
{
|
|
sendSystemMessage(self, SID_SPICE_DOWNER_DURATION_NEGATED);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
sendSystemMessage(self, SID_SPICE_DOWNER_DURATION_REDUCED);
|
|
}
|
|
if (buff.applyBuff(self, "spice_downer", duration))
|
|
{
|
|
doAnimationAction(self, anims.PLAYER_HEAVY_COUGH_VOMIT);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleGenericDownerEffect(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (buff.hasBuff(self, "generic_downer"))
|
|
{
|
|
buff.removeBuff(self, "generic_downer");
|
|
}
|
|
float duration = buff.getDuration("generic_downer");
|
|
if (buff.applyBuff(self, "generic_downer", duration))
|
|
{
|
|
doAnimationAction(self, anims.PLAYER_HEAVY_COUGH_VOMIT);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnStomachUpdate(obj_id self) throws InterruptedException
|
|
{
|
|
player_stomach.getStomach(self, 0);
|
|
player_stomach.getStomach(self, 1);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int grantUnmodifiedExperienceOnSelf(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (npe.hasReachedMaxTutorialLevel(self))
|
|
{
|
|
int hadNotif = utils.getIntScriptVar(self, "npe.level_capped");
|
|
if (hadNotif == 0)
|
|
{
|
|
string_id chat = new string_id("npe", "pop_level_cap");
|
|
obj_id building = getTopMostContainer(self);
|
|
obj_id droid = utils.getObjIdScriptVar(building, "objDroidInvis");
|
|
npe.commTutorialPlayer(droid, self, 10, chat, "sound/dro_r2_3_danger.snd", "object/mobile/r2.iff");
|
|
utils.setScriptVar(self, "npe.level_capped", 1);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int playerLevel = getLevel(self);
|
|
if (isFreeTrialAccount(self))
|
|
{
|
|
if (playerLevel >= xp.TRIAL_LEVEL_CAP)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
String xp_type = params.getString("xp_type");
|
|
int amt = params.getInt("amt");
|
|
String fromCallback = params.getString("fromCallback");
|
|
dictionary fromCallbackData = params.getDictionary("fromCallbackData");
|
|
obj_id fromId = params.getObjId("fromId");
|
|
if (luck.isLucky(self, 0.001f))
|
|
{
|
|
float bonus = amt * 0.1f;
|
|
if (bonus < 1.0f)
|
|
{
|
|
bonus = 1.0f;
|
|
}
|
|
amt += bonus;
|
|
}
|
|
xp._grantUnmodifiedExperience(self, xp_type, amt, fromCallback, fromCallbackData, fromId);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int grantSquadLeaderXpResult(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int granted = params.getInt(xp.GRANT_XP_RESULT_VALUE);
|
|
dictionary data = params.getDictionary(xp.GRANT_XP_RETURN_DATA);
|
|
obj_id player = data.getObjId("player");
|
|
int amt = data.getInt("amt");
|
|
xp.grantSquadLeaderXpResult(player, granted, amt);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdSetExperienceResult(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (isGod(self))
|
|
{
|
|
int granted = params.getInt(xp.GRANT_XP_RESULT_VALUE);
|
|
dictionary data = params.getDictionary(xp.GRANT_XP_RETURN_DATA);
|
|
obj_id target = data.getObjId("target");
|
|
String xp_type = data.getString("xp_type");
|
|
sendSystemMessageTestingOnly(self, "/setExperience: granted (" + target + ")" + utils.getStringName(target) + " " + granted + "pts of " + getString(new string_id("exp_n", xp_type)) + " (" + xp_type + ") experience");
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnPerformEmote(obj_id self, String emote) throws InterruptedException
|
|
{
|
|
int[] emotes = dataTableGetIntColumn(veteran_deprecated.EMOTES_DATATABLE, veteran_deprecated.EMOTES_COLUMN_EMOTE);
|
|
if (emotes == null)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int emoteCrc = getStringCrc(emote);
|
|
for (int i = 0; i < emotes.length; ++i)
|
|
{
|
|
if (emoteCrc == emotes[i])
|
|
{
|
|
int[] playerEmotes = getIntArrayObjVar(self, veteran_deprecated.OBJVAR_VETERAN_EMOTES);
|
|
if (playerEmotes != null)
|
|
{
|
|
int emoteGroup = dataTableGetInt(veteran_deprecated.EMOTES_DATATABLE, i, veteran_deprecated.EMOTES_COLUMN_GROUP);
|
|
for (int playerEmote : playerEmotes) {
|
|
if (emoteGroup == playerEmote) {
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
}
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdGetVeteranRewardTime(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
if (!VETERAN_REWARDS_ENABLED)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (isGod(self))
|
|
{
|
|
if (!isIdValid(target))
|
|
{
|
|
target = self;
|
|
}
|
|
if (veteran_deprecated.checkVeteranTarget(target))
|
|
{
|
|
int veteranTime = getIntObjVar(target, veteran_deprecated.OBJVAR_TIME_ACTIVE);
|
|
prose_package pp = new prose_package();
|
|
pp.stringId = veteran_deprecated.SID_VETERAN_TIME_ACTIVE;
|
|
pp.target.id = target;
|
|
pp.digitInteger = veteranTime;
|
|
sendSystemMessageProse(self, pp);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (hasObjVar(self, veteran_deprecated.OBJVAR_TIME_ACTIVE))
|
|
{
|
|
int veteranTime = getIntObjVar(self, veteran_deprecated.OBJVAR_TIME_ACTIVE);
|
|
prose_package pp = new prose_package();
|
|
pp.stringId = veteran_deprecated.SID_VETERAN_SELF_TIME_ACTIVE;
|
|
pp.digitInteger = veteranTime;
|
|
sendSystemMessageProse(self, pp);
|
|
}
|
|
else
|
|
{
|
|
sendSystemMessage(self, veteran_deprecated.SID_SYSTEM_INACTIVE);
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdListVeteranRewards(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
if (!VETERAN_REWARDS_ENABLED)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!isGod(self) && !hasObjVar(self, veteran_deprecated.OBJVAR_TIME_ACTIVE))
|
|
{
|
|
sendSystemMessage(self, veteran_deprecated.SID_SYSTEM_INACTIVE);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int[] templateCrcs = dataTableGetIntColumn(veteran_deprecated.REWARDS_DATATABLE, veteran_deprecated.REWARDS_COLUMN_TEMPLATE);
|
|
if (templateCrcs == null)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int[] milestones = dataTableGetIntColumn(veteran_deprecated.REWARDS_DATATABLE, veteran_deprecated.REWARDS_COLUMN_MILESTONE);
|
|
if (milestones == null)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
string_id[] nameIds = getNamesFromTemplates(templateCrcs);
|
|
if (nameIds == null)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (milestones.length != nameIds.length)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
String[] milestonesText = new String[nameIds.length];
|
|
String daysText = getString(veteran_deprecated.SID_DAYS);
|
|
for (int i = 0; i < nameIds.length; ++i)
|
|
{
|
|
if (nameIds[i] != null)
|
|
{
|
|
milestonesText[i] = "@" + nameIds[i] + " :\\>200" + (milestones[i] * veteran_deprecated.DAYS_PER_MILESTONE) + daysText;
|
|
}
|
|
else
|
|
{
|
|
milestonesText[i] = "<error>";
|
|
}
|
|
}
|
|
int pid = sui.listbox(self, "", milestonesText);
|
|
if (pid < 0)
|
|
{
|
|
CustomerServiceLog("veteran", "Could not create sui reward list, error = " + pid);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleVeteranMilestoneSelected(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if ((params == null) || (params.isEmpty()))
|
|
{
|
|
veteran_deprecated.cleanupPlayerData(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int bp = sui.getIntButtonPressed(params);
|
|
if (bp == sui.BP_CANCEL)
|
|
{
|
|
veteran_deprecated.cleanupPlayerData(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int rowSelected = sui.getListboxSelectedRow(params);
|
|
int[] milestones = (self.getScriptVars()).getIntArray(veteran_deprecated.SCRIPTVAR_AVAILABLE_MILESTONES);
|
|
if (milestones == null || milestones.length < 1 || rowSelected < 0)
|
|
{
|
|
veteran_deprecated.cleanupPlayerData(self);
|
|
sendSystemMessage(self, veteran_deprecated.SID_BAD_MILESTONE);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
rowSelected = 1;
|
|
for (int milestone : milestones) {
|
|
if ((rowSelected + 1) == milestone) {
|
|
veteran_deprecated.requestVeteranRewards(self, milestone);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
veteran_deprecated.cleanupPlayerData(self);
|
|
sendSystemMessage(self, veteran_deprecated.SID_BAD_MILESTONE);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleVeteranRewardSelected(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if ((params == null) || (params.isEmpty()))
|
|
{
|
|
veteran_deprecated.cleanupPlayerData(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int bp = sui.getIntButtonPressed(params);
|
|
if (bp == sui.BP_CANCEL)
|
|
{
|
|
veteran_deprecated.cleanupPlayerData(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int rowSelected = sui.getListboxSelectedRow(params);
|
|
if (rowSelected < 0)
|
|
{
|
|
veteran_deprecated.cleanupPlayerData(self);
|
|
sendSystemMessage(self, veteran_deprecated.SID_BAD_REWARD);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int result = veteran_deprecated.givePlayerReward(self, rowSelected, true);
|
|
if (result == veteran_deprecated.GIVE_PLAYER_REWARD_SUCCESS)
|
|
{
|
|
veteran_deprecated.cleanupPlayerData(self);
|
|
sendSystemMessage(self, veteran_deprecated.SID_REWARD_GIVEN);
|
|
}
|
|
else if (result == veteran_deprecated.GIVE_PLAYER_REWARD_FAILED)
|
|
{
|
|
veteran_deprecated.cleanupPlayerData(self);
|
|
sendSystemMessage(self, veteran_deprecated.SID_REWARD_ERROR);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleVeteranRewardConfirmed(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if ((params == null) || (params.isEmpty()))
|
|
{
|
|
veteran_deprecated.cleanupPlayerData(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int bp = sui.getIntButtonPressed(params);
|
|
if (bp == sui.BP_CANCEL)
|
|
{
|
|
if (!(self.getScriptVars()).hasKey(veteran_deprecated.SCRIPTVAR_SELECTED_MILESTONE))
|
|
{
|
|
veteran_deprecated.cleanupPlayerData(self);
|
|
}
|
|
else
|
|
{
|
|
(self.getScriptVars()).remove(veteran_deprecated.SCRIPTVAR_SELECTED_REWARD);
|
|
int milestone = (self.getScriptVars()).getInt(veteran_deprecated.SCRIPTVAR_SELECTED_MILESTONE);
|
|
veteran_deprecated.requestVeteranRewards(self, milestone);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!(self.getScriptVars()).hasKey(veteran_deprecated.SCRIPTVAR_SELECTED_REWARD))
|
|
{
|
|
CustomerServiceLog("veteran", "handleVeteranRewardConfirmed could not find SCRIPTVAR_SELECTED_REWARD for player %TU", self);
|
|
veteran_deprecated.cleanupPlayerData(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int rewardIndex = (self.getScriptVars()).getInt(veteran_deprecated.SCRIPTVAR_SELECTED_REWARD);
|
|
int result = veteran_deprecated.givePlayerReward(self, rewardIndex, false);
|
|
if (result == veteran_deprecated.GIVE_PLAYER_REWARD_SUCCESS)
|
|
{
|
|
veteran_deprecated.cleanupPlayerData(self);
|
|
sendSystemMessage(self, veteran_deprecated.SID_REWARD_GIVEN);
|
|
}
|
|
else
|
|
{
|
|
veteran_deprecated.cleanupPlayerData(self);
|
|
sendSystemMessage(self, veteran_deprecated.SID_REWARD_ERROR);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdFlashSpeeder(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
if (!VETERAN_REWARDS_ENABLED) {
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int sub_bits = getGameFeatureBits(self);
|
|
if (hasObjVar(self, "flash_speeder.eligible"))
|
|
{
|
|
sub_bits = getIntObjVar(self, "flash_speeder.eligible");
|
|
}
|
|
if (features.isSpaceEdition(self) && utils.checkBit(sub_bits, 3) || features.isJPCollectorEdition(self))
|
|
{
|
|
if (!hasObjVar(self, "flash_speeder.granted"))
|
|
{
|
|
obj_id inv = getObjectInSlot(self, "inventory");
|
|
int free_space = getVolumeFree(inv);
|
|
if (free_space < 1)
|
|
{
|
|
sendSystemMessage(self, new string_id(veteran_deprecated.VETERAN_STRING_TABLE, "flash_speeder_no_inv_space"));
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (veteran_deprecated.checkFlashSpeederReward(self))
|
|
{
|
|
sendSystemMessage(self, new string_id(veteran_deprecated.VETERAN_STRING_TABLE, "flash_speeder_granted"));
|
|
}
|
|
else
|
|
{
|
|
sendSystemMessage(self, new string_id(veteran_deprecated.VETERAN_STRING_TABLE, "flash_speeder_grant_failed"));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
sui.msgbox(self, self, "@" + veteran_deprecated.VETERAN_STRING_TABLE + ":flash_speeder_replace_prompt", sui.YES_NO, "msgFlashSpeederConfirmed");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
sendSystemMessage(self, new string_id(veteran_deprecated.VETERAN_STRING_TABLE, "flash_speeder_not_eligible"));
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int msgFlashSpeederConfirmed(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
String button = params.getString("buttonPressed");
|
|
if (button.equals("Cancel"))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (getTotalMoney(self) < veteran_deprecated.FLASH_SPEEDER_COST)
|
|
{
|
|
sendSystemMessage(self, new string_id(veteran_deprecated.VETERAN_STRING_TABLE, "flash_speeder_no_credits"));
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id inv = getObjectInSlot(self, "inventory");
|
|
int free_space = getVolumeFree(inv);
|
|
if (free_space < 1)
|
|
{
|
|
sendSystemMessage(self, new string_id(veteran_deprecated.VETERAN_STRING_TABLE, "flash_speeder_no_inv_space"));
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
money.pay(self, money.ACCT_VEHICLE_REPAIRS, veteran_deprecated.FLASH_SPEEDER_COST, "msgFlashSpeederPaid", null);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int msgFlashSpeederPaid(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int result = money.getReturnCode(params);
|
|
if (result == money.RET_SUCCESS)
|
|
{
|
|
createObjectInInventoryAllowOverload("object/tangible/deed/vehicle_deed/speederbike_flash_deed.iff", self);
|
|
CustomerServiceLog("flash_speeder", "%TU has purchased a new JtL pre-order Flash Speeder.", self);
|
|
sendSystemMessage(self, new string_id(veteran_deprecated.VETERAN_STRING_TABLE, "flash_speeder_granted"));
|
|
}
|
|
else
|
|
{
|
|
sendSystemMessage(self, new string_id(veteran_deprecated.VETERAN_STRING_TABLE, "flash_speeder_grant_failed"));
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int playDelayedClientEffect(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
String clientEffect = params.getString("effect");
|
|
obj_id target = params.getObjId("target");
|
|
playClientEffectObj(target, clientEffect, target, "");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int clearScriptVar(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
String scriptVarName = params.getString("name");
|
|
utils.removeScriptVar(self, scriptVarName);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnEnterRegion(obj_id self, String planetName, String regionName) throws InterruptedException
|
|
{
|
|
obj_id pvpRegionController = gcw.getPvpRegionControllerIdByName(self, regionName);
|
|
if (isIdValid(pvpRegionController) && exists(pvpRegionController))
|
|
{
|
|
gcw.notifyPvpRegionControllerOfPlayerEnter(pvpRegionController, self);
|
|
}
|
|
if (regionName.equals(restuss_event.PVP_REGION_NAME))
|
|
{
|
|
if ((!factions.isImperial(self) && !factions.isRebel(self)) || !factions.isCovert(self) || getLevel(self) < 75)
|
|
{
|
|
if (getLevel(self) < 75)
|
|
{
|
|
sendSystemMessage(self, new string_id("gcw", "pvp_advanced_region_level_low"));
|
|
}
|
|
else
|
|
{
|
|
sendSystemMessage(self, new string_id("gcw", "pvp_advanced_region_not_allowed"));
|
|
}
|
|
int attempts = 0;
|
|
String enterAttempt = "enterRestussAttempt";
|
|
if (utils.hasScriptVar(self, enterAttempt))
|
|
{
|
|
attempts = utils.getIntScriptVar(self, enterAttempt);
|
|
}
|
|
if (attempts > 5)
|
|
{
|
|
utils.removeScriptVar(self, enterAttempt);
|
|
warpPlayer(self, "rori", 5305, 80, 6188, null, 0, 0, 0);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
attempts++;
|
|
utils.setScriptVar(self, enterAttempt, attempts);
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
sendSystemMessage(self, new string_id("gcw", "pvp_advanced_region_entered"));
|
|
pvpMakeDeclared(self);
|
|
utils.setScriptVar(self, factions.IN_ADHOC_PVP_AREA, true);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
else if (regionName.startsWith(gcw.PVP_BATTLEFIELD_REGION))
|
|
{
|
|
obj_id controllerOnPlayer = utils.getObjIdScriptVar(self, "battlefield.active");
|
|
if (!isIdValid(controllerOnPlayer))
|
|
{
|
|
if (utils.hasObjIdBatchScriptVar(pvpRegionController, "battlefield.active_players"))
|
|
{
|
|
obj_id[] allPlayers = utils.getObjIdBatchScriptVar(pvpRegionController, "battlefield.active_players");
|
|
if (allPlayers != null && allPlayers.length > 0)
|
|
{
|
|
boolean found = false;
|
|
for (obj_id allPlayer : allPlayers) {
|
|
if (allPlayer == self) {
|
|
utils.setScriptVar(self, "battlefield.active", pvpRegionController);
|
|
found = true;
|
|
pvp.bfLog(pvpRegionController, "Player " + getName(self) + "(" + self + ") Entered the Battlefield and was missing the 'battlefield.active_players' scriptvar. Player was just found and the scriptvar was added.");
|
|
break;
|
|
}
|
|
}
|
|
if (!found)
|
|
{
|
|
pvp.bfLog(pvpRegionController, "Player " + getName(self) + "(" + self + ") Entered the Battlefield and was missing the 'battlefield.active_players' scriptvar. After reviewing the list of players allowed, they were not found. They need to be removed from the Battlefield");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
sendSystemMessage(self, new string_id("gcw", "pvp_advanced_region_entered"));
|
|
pvpMakeDeclared(self);
|
|
utils.setScriptVar(self, factions.IN_ADHOC_PVP_AREA, true);
|
|
buff.applyBuff(self, "battlefield_radar_invisibility");
|
|
}
|
|
else if (regionName.startsWith(gcw.PVP_PUSHBACK_REGION))
|
|
{
|
|
if (((!factions.isImperial(self) && !factions.isRebel(self)) || getLevel(self) < 75) && !isGod(self))
|
|
{
|
|
if (getLevel(self) < 75)
|
|
{
|
|
sendSystemMessage(self, new string_id("gcw", "pvp_advanced_region_level_low"));
|
|
}
|
|
else
|
|
{
|
|
sendSystemMessage(self, new string_id("gcw", "pvp_advanced_region_not_allowed"));
|
|
}
|
|
String enterAttempt = "enterBattlefieldAttempt";
|
|
int attempts = utils.getIntScriptVar(self, enterAttempt);
|
|
if (attempts > 5)
|
|
{
|
|
utils.removeScriptVar(self, enterAttempt);
|
|
}
|
|
else
|
|
{
|
|
attempts++;
|
|
utils.setScriptVar(self, enterAttempt, attempts);
|
|
playMusic(self, "sound/wall_of_mist_barrier_os.snd");
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
}
|
|
obj_id controller = gcw.getPushbackControllerByPlayer(self);
|
|
if (isIdValid(controller))
|
|
{
|
|
dictionary params = new dictionary();
|
|
params.put("player", self);
|
|
messageTo(controller, "validateTeamPlayer", params, 1.0f, false);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
else if (regionName.equals("dathomir_fs_village_unpassable"))
|
|
{
|
|
if(WALL_OF_MIST_DISABLED) {
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!township.isTownshipEligible(self) || ai_lib.isInCombat(self))
|
|
{
|
|
boolean playEffect = false;
|
|
int gameTime = getGameTime();
|
|
if (utils.hasScriptVar(self, "lastTownshipUnpassable"))
|
|
{
|
|
int lastNotice = utils.getIntScriptVar(self, "lastTownshipUnpassable");
|
|
if (gameTime - 30 > lastNotice)
|
|
{
|
|
playEffect = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
playEffect = true;
|
|
}
|
|
if (playEffect)
|
|
{
|
|
playMusic(self, "sound/wall_of_mist_barrier_os.snd");
|
|
string_id sid = null;
|
|
if (!fs_quests.isVillageEligible(self))
|
|
{
|
|
sid = new string_id("base_player", "fs_village_unavailable");
|
|
}
|
|
else if (ai_lib.isInCombat(self))
|
|
{
|
|
sid = new string_id("base_player", "fs_village_no_combat");
|
|
}
|
|
if (sid != null)
|
|
{
|
|
sendSystemMessage(self, sid);
|
|
}
|
|
utils.setScriptVar(self, "lastFsUnpassable", gameTime);
|
|
}
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
}
|
|
else if (regionName.equals("@dathomir_region_names:black_mesa") && hasObjVar(self, "outbreak.usedGate"))
|
|
{
|
|
buff.applyBuff(self, "death_troopers_no_vehicle");
|
|
}
|
|
else if (regionName.equals("outbreak_infected_area_01") || regionName.equals("outbreak_infected_area_02") || regionName.equals("outbreak_infected_area_03") || regionName.equals("outbreak_infected_area_04"))
|
|
{
|
|
if (!isGod(self))
|
|
{
|
|
if (needsBlackwingLightInfection(self))
|
|
{
|
|
messageTo(self, "death_troopers_apply_virus", null, 3.0f, false);
|
|
}
|
|
if (!buff.hasBuff(self, "death_troopers_no_vehicle"))
|
|
{
|
|
buff.applyBuff(self, "death_troopers_no_vehicle");
|
|
}
|
|
obj_id currentMount = getMountId(self);
|
|
if (isIdValid(currentMount))
|
|
{
|
|
sendSystemMessage(self, new string_id("base_player", "dismounting"));
|
|
utils.dismountRiderJetpackCheck(self);
|
|
if (exists(currentMount))
|
|
{
|
|
obj_id petControlDevice = callable.getCallableCD(currentMount);
|
|
vehicle.storeVehicle(petControlDevice, self);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
region enteredRegion = getRegion(planetName, regionName);
|
|
if (enteredRegion != null && enteredRegion.getPvPType() == regions.PVP_REGION_TYPE_ADVANCED)
|
|
{
|
|
if ((!factions.isImperial(self) && !factions.isRebel(self)) || !factions.isCovert(self))
|
|
{
|
|
sendSystemMessage(self, new string_id("gcw", "pvp_advanced_region_not_allowed"));
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
sendSystemMessage(self, new string_id("gcw", "pvp_advanced_region_entered"));
|
|
if (hasObjVar(self, "intChangingFactionStatus"))
|
|
{
|
|
sendSystemMessage(self, new string_id("gcw", "pvp_advanced_region_faction_type_change_cancel"));
|
|
}
|
|
pvpMakeDeclared(self);
|
|
utils.setScriptVar(self, factions.IN_ADHOC_PVP_AREA, true);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnExitRegion(obj_id self, String planetName, String regionName) throws InterruptedException
|
|
{
|
|
if (regionName.startsWith(gcw.PVP_BATTLEFIELD_REGION) && !utils.hasScriptVar(self, "battlefield.kicked_out"))
|
|
{
|
|
sendSystemMessage(self, new string_id("gcw", "pvp_advanced_region_leaving_battlefield"));
|
|
if (buff.hasBuff(self, "battlefield_communication_run"))
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
}
|
|
if (regionName.startsWith(gcw.PVP_BATTLEFIELD_REGION))
|
|
{
|
|
buff.removeBuff(self, "battlefield_radar_invisibility");
|
|
utils.removeScriptVar(self, factions.IN_ADHOC_PVP_AREA);
|
|
}
|
|
if (regionName.startsWith(gcw.PVP_PUSHBACK_REGION))
|
|
{
|
|
sendSystemMessage(self, new string_id("gcw", "pvp_advanced_region_leaving_pushback"));
|
|
}
|
|
if (utils.hasScriptVar(self, "battlefield.kicked_out"))
|
|
{
|
|
utils.removeScriptVar(self, "battlefield.kicked_out");
|
|
}
|
|
if (regionName.equals(restuss_event.PVP_REGION_NAME))
|
|
{
|
|
sendSystemMessage(self, restuss_event.SID_PVP_EXIT_MESSAGE);
|
|
if (utils.hasScriptVar(self, factions.IN_ADHOC_PVP_AREA))
|
|
{
|
|
utils.removeScriptVar(self, factions.IN_ADHOC_PVP_AREA);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
else if (regionName.equals("@dathomir_region_names:black_mesa"))
|
|
{
|
|
if (isGod(self))
|
|
{
|
|
sendSystemMessage(self, "[GodMode] Now Leaving the Infected Zone. We hope you enjoyed your visit.", "");
|
|
}
|
|
obj_id building = getTopMostContainer(self);
|
|
if (isIdValid(building) && (getTemplateName(building)).equals("object/building/dathomir/imperial_blackwing_facility.iff"))
|
|
{
|
|
if (isGod(self))
|
|
{
|
|
sendSystemMessage(self, "[GodMode] Please disregard that previous message as you are clearly still within the Blackwing facility. Be sure to enjoy your infection while you are here.", "");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
buff.removeBuff(self, "death_troopers_infection_1");
|
|
buff.removeBuff(self, "death_troopers_infection_2");
|
|
buff.removeBuff(self, "death_troopers_infection_3");
|
|
buff.removeBuff(self, "death_troopers_no_vehicle");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
region exitedRegion = getRegion(planetName, regionName);
|
|
if (exitedRegion != null && exitedRegion.getPvPType() == regions.PVP_REGION_TYPE_ADVANCED)
|
|
{
|
|
sendSystemMessage(self, new string_id("gcw", "pvp_advanced_region_exited"));
|
|
if (utils.hasScriptVar(self, factions.IN_ADHOC_PVP_AREA))
|
|
{
|
|
utils.removeScriptVar(self, factions.IN_ADHOC_PVP_AREA);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public boolean setupNovicePilotSkill(obj_id self, String skillName) throws InterruptedException
|
|
{
|
|
if (!skillName.startsWith("pilot_"))
|
|
{
|
|
return true;
|
|
}
|
|
if (skillName.equals("pilot_imperial_navy_novice"))
|
|
{
|
|
int intAlignedFaction = pvpGetAlignedFaction(self);
|
|
if (intAlignedFaction == (370444368))
|
|
{
|
|
sendSystemMessage(self, new string_id("faction_recruiter", "no_rebel_imp_pilots"));
|
|
if (!isGod(self))
|
|
{
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
sendSystemMessageTestingOnly(self, "GODMODE MSG: You can only acquire this skill BECAUSE you are in god mode");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pvpSetAlignedFaction(self, (-615855020));
|
|
if (pvpGetType(self) == PVPTYPE_NEUTRAL)
|
|
{
|
|
if (!factions.isOnLeave(self))
|
|
{
|
|
pvpMakeCovert(self);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
}
|
|
}
|
|
}
|
|
else if (skillName.equals("pilot_rebel_navy_novice"))
|
|
{
|
|
int intAlignedFaction = pvpGetAlignedFaction(self);
|
|
if (intAlignedFaction == (-615855020))
|
|
{
|
|
sendSystemMessage(self, new string_id("faction_recruiter", "no_imp_rebel_pilots"));
|
|
if (!isGod(self))
|
|
{
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
sendSystemMessageTestingOnly(self, "GODMODE MSG: You can only acquire this skill BECAUSE you are in god mode");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pvpSetAlignedFaction(self, (370444368));
|
|
if (pvpGetType(self) == PVPTYPE_NEUTRAL)
|
|
{
|
|
if (!factions.isOnLeave(self))
|
|
{
|
|
pvpMakeCovert(self);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
}
|
|
}
|
|
}
|
|
if (!hasObjVar(self, space_flags.SPACE_TRACK_FLAG))
|
|
{
|
|
if (skillName.equals("pilot_imperial_navy_novice"))
|
|
{
|
|
space_flags.setSpaceTrack(self, space_flags.IMPERIAL_TATOOINE);
|
|
}
|
|
else if (skillName.equals("pilot_rebel_navy_novice"))
|
|
{
|
|
space_flags.setSpaceTrack(self, space_flags.REBEL_TATOOINE);
|
|
}
|
|
else
|
|
{
|
|
space_flags.setSpaceTrack(self, space_flags.PRIVATEER_TATOOINE);
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
public boolean allowedBySpaceExpansion(obj_id self, String skillName) throws InterruptedException
|
|
{
|
|
if (skillName.startsWith("pilot_") || skillName.startsWith("crafting_shipwright_"))
|
|
{
|
|
if (!features.isSpaceEdition(self))
|
|
{
|
|
sendSystemMessage(self, new string_id("skl_use", "need_space_expansion"));
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
public int gmForceCommand(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
if ((params == null) || (params.equals("")))
|
|
{
|
|
sendSystemMessageTestingOnly(self, "Incorrect syntax. Syntax is /gmForceCommand <command> <target_object_id> <command parameters>. You can use 0 instead of a valid object_id if needed. Params are optionsl");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!isIdValid(target))
|
|
{
|
|
target = getLookAtTarget(self);
|
|
}
|
|
if (!isIdValid(target))
|
|
{
|
|
sendSystemMessageTestingOnly(self, "You must target the player you wish to call this command on");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
String[] strText = split(params, ',');
|
|
if (strText.length < 2)
|
|
{
|
|
sendSystemMessageTestingOnly(self, "Incorrect syntax. Syntax is /gmForceCommand <command> <target_object_id> <command parameters>. You can use 0 instead of a valid object_id if needed. Params are optionsl");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
String strCommand = strText[0];
|
|
if (strCommand.equals("gmForceCommand"))
|
|
{
|
|
sendSystemMessageTestingOnly(self, "You are not permitted to use this command to force this command. Don't do that");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
String strCommandTarget = strText[1];
|
|
String strParams = "";
|
|
if (strText.length == 3)
|
|
{
|
|
strParams = strText[2];
|
|
}
|
|
Long lngId;
|
|
try
|
|
{
|
|
lngId = Long.valueOf(strCommandTarget);
|
|
}
|
|
catch(NumberFormatException err)
|
|
{
|
|
sendSystemMessageTestingOnly(self, strCommandTarget + " is not a valid number to use. Please retry.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id objCommandTarget = obj_id.getObjId(lngId.longValue());
|
|
if (isIdValid(objCommandTarget) && (!exists(objCommandTarget)))
|
|
{
|
|
sendSystemMessageTestingOnly(self, "That command target does not exist and it is not 0. Object id was " + objCommandTarget);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
dictionary dctParams = new dictionary();
|
|
dctParams.put("objTarget", objCommandTarget);
|
|
int intCommand = getStringCrc(strCommand);
|
|
dctParams.put("intCommand", intCommand);
|
|
dctParams.put("strParams", strParams);
|
|
messageTo(target, "doForcedGmCommand", dctParams, 0, false);
|
|
sendSystemMessageTestingOnly(self, "Forcing " + target + " to do command " + strCommand + " to target " + objCommandTarget + " with Parameters " + strParams);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int doForcedGmCommand(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int intCommand = params.getInt("intCommand");
|
|
obj_id objTarget = params.getObjId("objTarget");
|
|
String strParams = params.getString("strParams");
|
|
queueCommand(self, intCommand, objTarget, strParams, COMMAND_PRIORITY_DEFAULT);
|
|
sendSystemMessageTestingOnly(self, "A GM Forced you to do a command");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int factionBaseLotRefund(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int baseLotRefund = params.getInt("baseLotRefund");
|
|
obj_id playerObject = getPlayerObject(self);
|
|
adjustLotCount(playerObject, (baseLotRefund * -1));
|
|
float baseFactionRefund = params.getFloat("baseFactionRefund");
|
|
int baseFaction = params.getInt("baseFaction");
|
|
factions.addFactionStanding(self, baseFaction, baseFactionRefund);
|
|
if ((int)(baseFactionRefund) > 0)
|
|
{
|
|
int intBaseFactionRefund = (int)(baseFactionRefund);
|
|
sendSystemMessageProse(self, prose.getPackage(new string_id("faction_perk", "old_fbase_refunded"), baseLotRefund, intBaseFactionRefund));
|
|
}
|
|
else
|
|
{
|
|
sendSystemMessageProse(self, prose.getPackage(new string_id("faction_perk", "new_old_fbase_refunded"), baseLotRefund));
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int transferMoneyToNamedAccount(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
transferBankCreditsToNamedAccount(self, params.getString("account"), params.getInt("amount"), "transferMoneyToNamedAccount_successCallback", "transferMoneyToNamedAccount_failCallback", params);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int transferMoneyToNamedAccount_successCallback(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
messageTo(params.getObjId("replyTo"), params.getString("successCallback"), params, 0, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int transferMoneyToNamedAccount_failCallback(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
messageTo(params.getObjId("replyTo"), params.getString("failCallback"), params, 0, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int sendSystemMessageProseAuthoritative(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if ((params == null) || (params.isEmpty()))
|
|
{
|
|
debugSpeakMsg(self, "sendSystemMessageProseAuthoritative called with no params");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
String stf = params.getString("stf");
|
|
String message = params.getString("message");
|
|
obj_id TO = params.getObjId("TO");
|
|
obj_id TT = params.getObjId("TT");
|
|
prose_package pp = new prose_package();
|
|
string_id msg = new string_id(stf, message);
|
|
pp = prose.setStringId(pp, msg);
|
|
pp = prose.setTO(pp, TO);
|
|
pp = prose.setTT(pp, TT);
|
|
sendSystemMessageProse(self, pp);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnRecapacitated(obj_id self) throws InterruptedException
|
|
{
|
|
dictionary params = new dictionary();
|
|
params.put("player", self);
|
|
broadcastMessage("handleSawRecapacitation", params);
|
|
final int aggroImmuneDuration = 12;
|
|
setAggroImmuneDuration(self, aggroImmuneDuration);
|
|
debugSpeakMsgc(aiLoggingEnabled(self), self, "AggroImmune(" + aggroImmuneDuration + "s)");
|
|
utils.removeScriptVar(self, "incap.timeStamp");
|
|
combat.clearCombatDebuffs(self);
|
|
static_item.validateWornEffects(self);
|
|
reverse_engineering.checkPowerUpReApply(self);
|
|
messageTo(self, "setDisplayOnlyDefensiveMods", trial.getSessionDict(self, "displayDefensiveMods"), 5, false);
|
|
if (utils.isProfession(self, utils.SMUGGLER))
|
|
{
|
|
messageTo(self, "applySmugglingBonuses", null, 1.0f, false);
|
|
}
|
|
if (utils.isProfession(self, utils.FORCE_SENSITIVE) && getLevel(self) > 3)
|
|
{
|
|
if (!buff.isInStance(self) && !buff.isInFocus(self))
|
|
{
|
|
messageTo(self, "applyJediStance", null, 1.0f, false);
|
|
}
|
|
}
|
|
if (factions.isInAdhocPvpArea(self))
|
|
{
|
|
pvpMakeDeclared(self);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleInstanceTimeRemainingMessage(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
String message = params.getString("message");
|
|
sendSystemMessageTestingOnly(self, message);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int setRespecVersion(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
respec.setRespecVersion(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int receiveCreditForKill(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
String creatureName = params.getString("creatureName");
|
|
if (creatureName != null && !creatureName.equals(""))
|
|
{
|
|
location creatureLoc = params.getLocation("location");
|
|
location playerLoc = getLocation(self);
|
|
if (!playerLoc.area.equals(creatureLoc.area))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
String col_faction = params.getString("col_faction");
|
|
int col_difficulty = params.getInt("difficultyClass");
|
|
if (col_faction != null && !col_faction.equals(""))
|
|
{
|
|
String[] col_factionArray = split(col_faction, ',');
|
|
for (int i = 0; i < col_factionArray.length; i++)
|
|
{
|
|
if (col_faction.equals("rebel"))
|
|
{
|
|
if (col_difficulty == 0)
|
|
{
|
|
modifyCollectionSlotValue(self, "kill_rebel_01", 1);
|
|
}
|
|
else
|
|
{
|
|
modifyCollectionSlotValue(self, "kill_rebel_boss_01", 1);
|
|
}
|
|
}
|
|
if (col_faction.equals("imperial"))
|
|
{
|
|
if (col_difficulty == 0)
|
|
{
|
|
modifyCollectionSlotValue(self, "kill_imperial_01", 1);
|
|
}
|
|
else
|
|
{
|
|
modifyCollectionSlotValue(self, "kill_imperial_boss_01", 1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (getDistance(getLocation(self), creatureLoc) <= xp.MAX_DISTANCE)
|
|
{
|
|
badge.checkForCombatTargetBadge(self, creatureName);
|
|
String[] slotNames = getAllCollectionSlotsInCategory("kill_" + creatureName);
|
|
if (slotNames == null || slotNames.length <= 0)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
for (String slotName : slotNames) {
|
|
if (!hasCompletedCollectionSlot(self, slotName)) {
|
|
modifyCollectionSlotValue(self, slotName, 1);
|
|
}
|
|
}
|
|
}
|
|
obj_id target = params.getObjId("target");
|
|
if (isValidId(target))
|
|
{
|
|
if (hasObjVar(target, gcw.GCW_PARTICIPATION_FLAG))
|
|
{
|
|
obj_id parent = trial.getParent(target);
|
|
if (isIdValid(parent))
|
|
{
|
|
trial.addNonInstanceFactionParticipant(self, parent);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (utils.hasScriptVar(self, "currentBounty") && utils.hasScriptVar(self, "currentBountyValue"))
|
|
{
|
|
obj_id target = params.getObjId("target");
|
|
obj_id storedTarget = utils.getObjIdScriptVar(self, "currentBounty");
|
|
if (storedTarget == target)
|
|
{
|
|
int amount = utils.getIntScriptVar(self, "currentBountyValue");
|
|
bounty_hunter.awardBounty(self, creatureName, amount);
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int HandleSetCoverCharge(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int bp = sui.getIntButtonPressed(params);
|
|
if (bp == sui.BP_CANCEL)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
String strAmount = sui.getInputBoxText(params);
|
|
int amount = utils.stringToInt(strAmount);
|
|
if (amount > 0)
|
|
{
|
|
performance.covercharge(self, amount);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int HandleCoverCharge(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int bp = sui.getIntButtonPressed(params);
|
|
obj_id audience = sui.getPlayerId(params);
|
|
int charge = utils.getIntScriptVar(audience, performance.VAR_PERFORM_PAY_WAIT);
|
|
if (bp == 0)
|
|
{
|
|
if (money.hasFunds(audience, money.MT_TOTAL, charge))
|
|
{
|
|
utils.removeScriptVar(audience, performance.VAR_PERFORM_PAY_WAIT);
|
|
utils.setScriptVar(audience, performance.VAR_PERFORM_PAY_AGREE, charge);
|
|
money.pay(audience, money.ACCT_PERFORM_ESCROW, charge, "handlePayment", null);
|
|
if (utils.hasScriptVar(audience, "dancerID"))
|
|
{
|
|
obj_id targetDancer = utils.getObjIdScriptVar(audience, "dancerID");
|
|
String audienceName = getFirstName(audience);
|
|
if ((audienceName == null) || (audienceName.equals("")))
|
|
{
|
|
audienceName = getPlayerName(audience);
|
|
}
|
|
prose_package dancerProse = new prose_package();
|
|
prose.setTU(dancerProse, audienceName);
|
|
prose.setDI(dancerProse, charge);
|
|
prose.setStringId(dancerProse, COVERCHARGE_DANCER_MESSAGE);
|
|
sendSystemMessageProse(targetDancer, dancerProse);
|
|
utils.removeScriptVar(audience, "dancerID");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
sendSystemMessage(audience, performance.SID_CC_NO_FUNDS);
|
|
utils.removeScriptVar(audience, performance.VAR_PERFORM_PAY_WAIT);
|
|
performance.stopListen(audience);
|
|
performance.stopWatch(audience);
|
|
if (utils.hasScriptVar(audience, "dancerID"))
|
|
{
|
|
utils.removeScriptVar(audience, "dancerID");
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
utils.removeScriptVar(audience, performance.VAR_PERFORM_PAY_WAIT);
|
|
utils.setScriptVar(audience, performance.VAR_PERFORM_PAY_DISAGREE, charge);
|
|
performance.stopListen(audience);
|
|
performance.stopWatch(audience);
|
|
if (utils.hasScriptVar(audience, "dancerID"))
|
|
{
|
|
utils.removeScriptVar(audience, "dancerID");
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int messageUpdateMissionCriticalObjects(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id[] addObjects = params.getObjIdArray("addObjects");
|
|
obj_id[] removeObjects = params.getObjIdArray("removeObjects");
|
|
if (addObjects != null && addObjects.length > 0)
|
|
{
|
|
for (obj_id addObject : addObjects) {
|
|
addMissionCriticalObject(self, addObject);
|
|
}
|
|
}
|
|
if (removeObjects != null && removeObjects.length > 0)
|
|
{
|
|
for (obj_id removeObject : removeObjects) {
|
|
removeMissionCriticalObject(self, removeObject);
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int messageSendQuestSystemMessage(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
string_id sid = params.getStringId("sid");
|
|
string_id to = params.getStringId("to");
|
|
prose_package pp = prose.getPackage(sid, to);
|
|
sendQuestSystemMessage(self, pp);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdShowLockout(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
space_dungeon.displayAllDungeonLockoutTimers(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnPvpTypeChanged(obj_id self, int oldType, int newType) throws InterruptedException
|
|
{
|
|
if (oldType == PVPTYPE_DECLARED)
|
|
{
|
|
if ((newType == PVPTYPE_COVERT) || (newType == PVPTYPE_NEUTRAL))
|
|
{
|
|
obj_id playerCurrentMount = getMountId(self);
|
|
if (isIdValid(playerCurrentMount))
|
|
{
|
|
if (group.isGrouped(self))
|
|
{
|
|
obj_id gid = getGroupObject(self);
|
|
obj_id[] members = getGroupMemberIds(gid);
|
|
for (obj_id member : members) {
|
|
if (isIdValid(member) && member.isLoaded() && isPlayer(member)) {
|
|
obj_id groupMemberCurrentMount = getMountId(member);
|
|
if (isIdValid(groupMemberCurrentMount)) {
|
|
if (groupMemberCurrentMount == playerCurrentMount) {
|
|
if (factions.isDeclared(member)) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnQuestActivated(obj_id self, int questCrc) throws InterruptedException
|
|
{
|
|
if (groundquests.isQuestVisible(questCrc))
|
|
{
|
|
String questCategory = groundquests.getQuestStringDataEntry(questCrc, groundquests.datatableColumnCategory);
|
|
String questTitle = groundquests.getQuestStringDataEntry(questCrc, groundquests.datatableColumnjournalEntryTitle);
|
|
prose_package pp = prose.getPackage(groundquests.SID_QUEST_RECEIVED);
|
|
prose.setTT(pp, questCategory);
|
|
prose.setTO(pp, questTitle);
|
|
sendQuestSystemMessage(self, pp);
|
|
play2dNonLoopingSound(self, groundquests.MUSIC_QUEST_ACTIVATED);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnQuestReceivedReward(obj_id self, int questCrc, String exclusiveItemChoice) throws InterruptedException
|
|
{
|
|
int questLevel = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnLevel);
|
|
int questTier = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnTier);
|
|
String experienceType = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExperienceType);
|
|
int experienceAmount = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExperienceAmount);
|
|
String factionName = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardFactionName);
|
|
int factionAmount = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnQuestRewardFactionAmount);
|
|
boolean grantGcwReward = groundquests.getQuestBoolDataEntry(questCrc, groundquests.dataTableColumnGcwGrant, false);
|
|
int grantGcwOverwriteAmt = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnGcwOverwriteAmt);
|
|
int grantGcwSFModifier = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnGcwOvrwrtSFMod);
|
|
String grantGcwRebReward = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnGcwRebReward);
|
|
int grantGcwRebRewardCount = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnGcwRebRewardCnt);
|
|
String grantGcwImpReward = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnGcwImpReward);
|
|
int grantGcwImpRewardCount = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnGcwImpRewardCnt);
|
|
int grantGcwSFRewardMultip = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnGcwRewardMultip);
|
|
int bankCredits = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnQuestRewardBankCredits);
|
|
String item = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardItem);
|
|
int itemCount = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnQuestRewardCount);
|
|
String weapon = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardWeapon);
|
|
int weaponCount = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnQuestRewardCountWeapon);
|
|
float weaponSpeed = utils.stringToFloat(groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardSpeed));
|
|
float weaponDamage = utils.stringToFloat(groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardDamage));
|
|
float weaponEfficiency = utils.stringToFloat(groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardEfficiency));
|
|
float weaponElementalValue = utils.stringToFloat(groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardElementalValue));
|
|
String armor = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardArmor);
|
|
int armorCount = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnQuestRewardCountArmor);
|
|
int armorQuality = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnQuestRewardQuality);
|
|
String[] inclusiveLootNames = new String[3];
|
|
int[] inclusiveLootCounts = new int[3];
|
|
inclusiveLootNames[0] = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardLootName);
|
|
inclusiveLootCounts[0] = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnQuestRewardLootCount);
|
|
inclusiveLootNames[1] = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardLootName2);
|
|
inclusiveLootCounts[1] = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnQuestRewardLootCount2);
|
|
inclusiveLootNames[2] = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardLootName3);
|
|
inclusiveLootCounts[2] = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnQuestRewardLootCount3);
|
|
String[] exclusiveLootNames = new String[10];
|
|
int[] exclusiveLootCounts = new int[10];
|
|
exclusiveLootNames[0] = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootName);
|
|
exclusiveLootCounts[0] = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootCount);
|
|
exclusiveLootNames[1] = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootName2);
|
|
exclusiveLootCounts[1] = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootCount2);
|
|
exclusiveLootNames[2] = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootName3);
|
|
exclusiveLootCounts[2] = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootCount3);
|
|
exclusiveLootNames[3] = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootName4);
|
|
exclusiveLootCounts[3] = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootCount4);
|
|
exclusiveLootNames[4] = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootName5);
|
|
exclusiveLootCounts[4] = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootCount5);
|
|
exclusiveLootNames[5] = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootName6);
|
|
exclusiveLootCounts[5] = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootCount6);
|
|
exclusiveLootNames[6] = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootName7);
|
|
exclusiveLootCounts[6] = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootCount7);
|
|
exclusiveLootNames[7] = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootName8);
|
|
exclusiveLootCounts[7] = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootCount8);
|
|
exclusiveLootNames[8] = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootName9);
|
|
exclusiveLootCounts[8] = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootCount9);
|
|
exclusiveLootNames[9] = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootName10);
|
|
exclusiveLootCounts[9] = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootCount10);
|
|
String badge = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnBadge);
|
|
int exclusiveLootCountChoice = groundquests.getExclusiveItemRewardCount(questGetQuestName(questCrc), exclusiveItemChoice);
|
|
groundquests.grantQuestReward(self, questCrc, questLevel, questTier, experienceType, experienceAmount, factionName, factionAmount, grantGcwReward, bankCredits, item, itemCount, weapon, weaponCount, weaponSpeed, weaponDamage, weaponEfficiency, weaponElementalValue, armor, armorCount, armorQuality, inclusiveLootNames, inclusiveLootCounts, exclusiveItemChoice, exclusiveLootCountChoice, badge, (questIsQuestForceAccept(questCrc) || !questDoesUseAcceptanceUI(questCrc)), grantGcwOverwriteAmt, grantGcwSFModifier, grantGcwRebReward, grantGcwRebRewardCount, grantGcwImpReward, grantGcwImpRewardCount, grantGcwSFRewardMultip);
|
|
experienceAmount = groundquests.getQuestExperienceReward(self, questLevel, questTier, experienceAmount);
|
|
metrics.doQuestMetrics(self, questCrc, questLevel, questTier, experienceType, experienceAmount);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnQuestCompleted(obj_id self, int questCrc) throws InterruptedException
|
|
{
|
|
String conditionalQuestToGrant = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnConditionQuestGrantQuest);
|
|
String listOfQuestsThatMustBeCompleted = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnConditionQuestGrantListOfCompletedQuests);
|
|
if (conditionalQuestToGrant != null && conditionalQuestToGrant.length() > 0 && listOfQuestsThatMustBeCompleted != null && listOfQuestsThatMustBeCompleted.length() > 0)
|
|
{
|
|
String[] completedQuestList = split(listOfQuestsThatMustBeCompleted, ',');
|
|
boolean grantQuest = completedQuestList.length > 0;
|
|
for (int i = 0; i < completedQuestList.length && grantQuest; ++i)
|
|
{
|
|
String quest = completedQuestList[i];
|
|
if (!groundquests.isValidQuestName(quest) || !groundquests.hasCompletedQuest(self, quest))
|
|
{
|
|
grantQuest = false;
|
|
}
|
|
}
|
|
if (groundquests.isValidQuestName(conditionalQuestToGrant) && grantQuest)
|
|
{
|
|
groundquests.requestGrantQuest(self, conditionalQuestToGrant);
|
|
}
|
|
}
|
|
if (groundquests.isQuestVisible(questCrc))
|
|
{
|
|
play2dNonLoopingSound(self, groundquests.MUSIC_QUEST_COMPLETED);
|
|
}
|
|
String questString = questGetQuestName(questCrc);
|
|
int tableRow = dataTableSearchColumnForString(questString, "questName", collection.QUEST__COMPLETED_COLLECTIONS);
|
|
if (tableRow > -1)
|
|
{
|
|
collection.grantQuestBasedCollections(questString, self);
|
|
}
|
|
smuggler.removeFromBountyTerminal(self, questCrc, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnQuestCleared(obj_id self, int questCrc) throws InterruptedException
|
|
{
|
|
String factionName = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestPenaltyFactionName);
|
|
int factionAmount = groundquests.getQuestIntDataEntry(questCrc, groundquests.dataTableColumnQuestPenaltyFactionAmount);
|
|
LOG("QUEST", "Quest " + questCrc + " cleared!");
|
|
groundquests.applyQuestPenalty(self, factionName, factionAmount);
|
|
smuggler.removeFromBountyTerminal(self, questCrc, true);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnRequestStaticItemData(obj_id self, String itemName) throws InterruptedException
|
|
{
|
|
dictionary itemData = static_item.getMergedItemDictionary(itemName);
|
|
if (itemData != null)
|
|
{
|
|
String[] keysStringVector = itemData.keysStringVector();
|
|
String[] valuesStringVector = itemData.valuesStringVector();
|
|
sendStaticItemDataToPlayer(self, keysStringVector, valuesStringVector);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleClientLogin(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
int[] quests = questGetAllActiveQuestIds(self);
|
|
for (int questCrc : quests) {
|
|
Vector objectsToTellClientAbout = new Vector();
|
|
objectsToTellClientAbout.setSize(0);
|
|
String item = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardLootName);
|
|
if (item != null) {
|
|
utils.addElement(objectsToTellClientAbout, item);
|
|
}
|
|
item = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardLootName2);
|
|
if (item != null) {
|
|
utils.addElement(objectsToTellClientAbout, item);
|
|
}
|
|
item = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardLootName3);
|
|
if (item != null) {
|
|
utils.addElement(objectsToTellClientAbout, item);
|
|
}
|
|
item = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootName);
|
|
if (item != null) {
|
|
utils.addElement(objectsToTellClientAbout, item);
|
|
}
|
|
item = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootName2);
|
|
if (item != null) {
|
|
utils.addElement(objectsToTellClientAbout, item);
|
|
}
|
|
item = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootName3);
|
|
if (item != null) {
|
|
utils.addElement(objectsToTellClientAbout, item);
|
|
}
|
|
item = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootName4);
|
|
if (item != null) {
|
|
utils.addElement(objectsToTellClientAbout, item);
|
|
}
|
|
item = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootName5);
|
|
if (item != null) {
|
|
utils.addElement(objectsToTellClientAbout, item);
|
|
}
|
|
item = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootName6);
|
|
if (item != null) {
|
|
utils.addElement(objectsToTellClientAbout, item);
|
|
}
|
|
item = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootName7);
|
|
if (item != null) {
|
|
utils.addElement(objectsToTellClientAbout, item);
|
|
}
|
|
item = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootName8);
|
|
if (item != null) {
|
|
utils.addElement(objectsToTellClientAbout, item);
|
|
}
|
|
item = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootName9);
|
|
if (item != null) {
|
|
utils.addElement(objectsToTellClientAbout, item);
|
|
}
|
|
item = groundquests.getQuestStringDataEntry(questCrc, groundquests.dataTableColumnQuestRewardExclusiveLootName10);
|
|
if (item != null) {
|
|
utils.addElement(objectsToTellClientAbout, item);
|
|
}
|
|
for (Object o : objectsToTellClientAbout) {
|
|
String itemName = ((String) o);
|
|
if (itemName != null && !itemName.equals("")) {
|
|
dictionary itemData = static_item.getMergedItemDictionary(itemName);
|
|
if (itemData != null) {
|
|
String[] keysStringVector = itemData.keysStringVector();
|
|
String[] valuesStringVector = itemData.valuesStringVector();
|
|
sendStaticItemDataToPlayer(self, keysStringVector, valuesStringVector);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
obj_id building = getTopMostContainer(self);
|
|
if (isIdValid(building) && (getTemplateName(building)).equals("object/building/dathomir/imperial_blackwing_facility.iff"))
|
|
{
|
|
if (needsBlackwingLightInfection(self))
|
|
{
|
|
buff.applyBuff(self, "death_troopers_infection_1");
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnGetStaticItemsAttributes(obj_id self, String staticItemName, String[] names, String[] attribs) throws InterruptedException
|
|
{
|
|
if ((names == null) || (attribs == null) || (names.length != attribs.length))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
static_item.getAttributes(self, staticItemName, names, attribs);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleSmugglerFenceAbility(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
smuggler.showSellJunkSui(self, self, true, true);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleSellJunkSui(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id player = sui.getPlayerId(params);
|
|
obj_id dealer = utils.getObjIdScriptVar(self, "junk_dealer_transaction");
|
|
if (!isIdValid(player))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (utils.outOfRange(dealer, self, 10.0f, true)) {
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int idx = sui.getListboxSelectedRow(params);
|
|
int bp = sui.getIntButtonPressed(params);
|
|
obj_id[] junk = utils.getObjIdBatchScriptVar(player, smuggler.SCRIPTVAR_JUNK_IDS);
|
|
boolean reshowSui = true;
|
|
if (junk.length < 1)
|
|
{
|
|
reshowSui = false;
|
|
}
|
|
boolean fence = utils.getBooleanScriptVar(self, "fence");
|
|
smuggler.cleanupSellJunkSui(player);
|
|
if (bp == sui.BP_CANCEL)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
else if (bp == sui.BP_REVERT)
|
|
{
|
|
if (idx >= 0 && idx <= junk.length - 1)
|
|
{
|
|
if ((junk != null) || (junk.length > 0))
|
|
{
|
|
openExamineWindow(player, junk[idx]);
|
|
}
|
|
}
|
|
if (fence)
|
|
{
|
|
smuggler.showSellJunkSui(player, self, true, false);
|
|
}
|
|
else
|
|
{
|
|
smuggler.showSellJunkSui(player, self, false, false);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
else
|
|
{
|
|
if (idx < 0)
|
|
{
|
|
if (reshowSui)
|
|
{
|
|
smuggler.showSellJunkSui(self, self, true, true);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if ((junk == null) || (junk.length == 0))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (idx > junk.length - 1)
|
|
{
|
|
if (reshowSui)
|
|
{
|
|
smuggler.showSellJunkSui(self, self, true, true);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
smuggler.sellJunkItem(player, junk[idx], fence, reshowSui);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleSoldJunk(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
blog("base_player.handleSoldJunk() - init");
|
|
if (params == null || params.isEmpty())
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id player = params.getObjId(money.DICT_TARGET_ID);
|
|
if (!isIdValid(player))
|
|
{
|
|
CustomerServiceLog("Junk_Dealer: ", "junk_dealer.handleSoldJunk() - Player: " + self + " cannot sell an item because the junk dealer failed to send a valid obj_id.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id item = params.getObjId("item");
|
|
if (!isIdValid(item))
|
|
{
|
|
CustomerServiceLog("Junk_Dealer: ", "junk_dealer.handleSoldJunk() - Player: " + self + " cannot sell an item because the item was found to be invalid.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
boolean fence = params.getBoolean("fence");
|
|
blog("base_player.handleSoldJunk() - fence: " + fence);
|
|
int retCode = params.getInt(money.DICT_CODE);
|
|
if (retCode == money.RET_FAIL)
|
|
{
|
|
prose_package ppNoSale = prose.getPackage(smuggler.PROSE_NO_SALE, self, item);
|
|
if (fence)
|
|
{
|
|
ppNoSale = prose.getPackage(smuggler.PROSE_NO_SALE_FENCE, self, item);
|
|
}
|
|
sendSystemMessageProse(player, ppNoSale);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int price = params.getInt("price");
|
|
prose_package ppSoldJunk = prose.getPackage(smuggler.PROSE_SOLD_JUNK, item, price);
|
|
if (fence)
|
|
{
|
|
ppSoldJunk = prose.getPackage(smuggler.PROSE_SOLD_JUNK_FENCE, item, price);
|
|
}
|
|
sendSystemMessageProse(player, ppSoldJunk);
|
|
setObjVar(item, smuggler.BUYBACK_OBJ_SOLD, getGameTime());
|
|
smuggler.moveBuyBackObjectIntoContainer(player, item, price);
|
|
CustomerServiceLog("Junk_Dealer: ", "junk_dealer.handleSoldJunk() - Player: " + self + " has sold item: " + item + " and the item has been marked sold. The item is about to be moved to the buy back container.");
|
|
boolean reshowSui = params.getBoolean("reshowSui");
|
|
if (reshowSui && fence)
|
|
{
|
|
if(utils.outOfRange(self, player, 10.0f, true)) {
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
smuggler.showSellJunkSui(player, self, true, false);
|
|
}
|
|
else if (reshowSui && !fence)
|
|
{
|
|
if(utils.outOfRange(self, player, 10.0f, true)) {
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
smuggler.showSellJunkSui(player, self, false, false);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnSkillModsChanged(obj_id self, String[] modNames, int[] modValues) throws InterruptedException
|
|
{
|
|
trial.bumpSession(self, "displayDefensiveMods");
|
|
messageTo(self, "setDisplayOnlyDefensiveMods", trial.getSessionDict(self, "displayDefensiveMods"), 5, false);
|
|
for (String modName : modNames) {
|
|
if ((modName.startsWith("constitution")) || (modName.startsWith("stamina"))) {
|
|
skill.recalcPlayerPools(self, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (modName.startsWith("movement_resist")) {
|
|
messageTo(self, "check_movement_immunity", null, 0.1f, false);
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handlePlayerBountyEngagement(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id target = params.getObjId("target");
|
|
pvpSetPermanentPersonalEnemyFlag(self, target);
|
|
messageTo(self, "handlePlayerBountyTimeout", params, bounty_hunter.BOUNTY_COLLECT_TIME_LIMIT, true);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handlePlayerBountyTimeout(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id target = params.getObjId("target");
|
|
int id = params.getInt("id");
|
|
if (utils.hasScriptVar(self, "bounty.id"))
|
|
{
|
|
int bounty_id = utils.getIntScriptVar(self, "bounty.id");
|
|
if (bounty_id != id)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
if (pvpHasPersonalEnemyFlag(self, target))
|
|
{
|
|
pvpRemovePersonalEnemyFlags(self, target);
|
|
sendSystemMessage(self, new string_id("bounty_hunter", "time_expired"));
|
|
}
|
|
utils.removeScriptVarTree(self, "bounty");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleAwardedBountyCheck(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (utils.hasScriptVar(self, "currentBounty"))
|
|
{
|
|
utils.removeScriptVar(self, "currentBounty");
|
|
}
|
|
if (utils.hasScriptVar(self, "currentBountyValue"))
|
|
{
|
|
utils.removeScriptVar(self, "currentBountyValue");
|
|
}
|
|
if (params == null || params.isEmpty())
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id player = params.getObjId(money.DICT_TARGET_ID);
|
|
if (!isIdValid(player))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int retCode = params.getInt(money.DICT_CODE);
|
|
if (retCode == money.RET_FAIL)
|
|
{
|
|
prose_package pp = new prose_package();
|
|
pp.stringId = new string_id("bounty_hunter", "no_reward_possible");
|
|
sendSystemMessageProse(player, pp);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int amount = params.getInt("amount");
|
|
String creatureName = params.getString("creatureName");
|
|
prose_package pp = new prose_package();
|
|
pp.stringId = new string_id("bounty_hunter", "reward");
|
|
pp.digitInteger = amount;
|
|
pp.other.set(creatureName);
|
|
sendSystemMessageProse(player, pp);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleAwardedPlayerBounty(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id target = params.getObjId("target");
|
|
int amount = params.getInt("bounty");
|
|
int retCode = params.getInt(money.DICT_CODE);
|
|
if (retCode == money.RET_FAIL)
|
|
{
|
|
sendSystemMessage(self, new string_id("bounty_hunter", "player_bounty_reward_fail"));
|
|
CustomerServiceLog("bounty", "%TU has defeated %TT but an error occured during the bounty (" + amount + " credits) payout!", self, target);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
CustomerServiceLog("bounty", "%TU has defeated %TT and collected a bounty worth " + amount + " credits", self, target);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleSurveyToolbarSetup(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id objInv = utils.getInventoryContainer(self);
|
|
createObject("object/tangible/survey_tool/survey_tool_mineral.iff", objInv, "");
|
|
newbieTutorialSetToolbarElement(self, 10, "/survey");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int factionBaseUnitRefund(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
debugServerConsoleMsg(null, "+++ base_player.factionBaseUnitRefund +++ entered message handler");
|
|
if (hasObjVar(self, "factionBaseCount"))
|
|
{
|
|
int factionBaseCount = getIntObjVar(self, "factionBaseCount");
|
|
int updatedFactionBaseCount = factionBaseCount - 1;
|
|
if (updatedFactionBaseCount > 0)
|
|
{
|
|
setObjVar(self, "factionBaseCount", updatedFactionBaseCount);
|
|
}
|
|
else
|
|
{
|
|
removeObjVar(self, "factionBaseCount");
|
|
}
|
|
if (updatedFactionBaseCount == player_structure.MAX_BASE_COUNT - 1)
|
|
{
|
|
sendSystemMessage(self, SID_CAN_PLACE_ONE_BASE);
|
|
}
|
|
else
|
|
{
|
|
sendSystemMessageProse(self, prose.getPackage(new string_id("faction_perk", "faction_base_unit_refunded"), (player_structure.MAX_BASE_COUNT - updatedFactionBaseCount)));
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnSkillTemplateChanged(obj_id self, String skillTemplateName, boolean clientSelected) throws InterruptedException
|
|
{
|
|
if (skillTemplateName == null || skillTemplateName.equals("") || skillTemplateName.equals("a"))
|
|
{
|
|
if (hasObjVar(self, "clickRespec.tokenId"))
|
|
{
|
|
removeObjVar(self, "clickRespec.tokenId");
|
|
}
|
|
if (hasObjVar(self, "npcRespec.inProgress"))
|
|
{
|
|
removeObjVar(self, "npcRespec.inProgress");
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!hasObjVar(self, "clickRespec") && !hasObjVar(self, "npcRespec.inProgress"))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (hasObjVar(self, "npcRespec.inProgress"))
|
|
{
|
|
respec.handleNpcRespec(self, skillTemplateName);
|
|
respec.setRespecVersion(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
else if (hasObjVar(self, "clickRespec.tokenId"))
|
|
{
|
|
obj_id token = getObjIdObjVar(self, "clickRespec.tokenId");
|
|
if (hasObjVar(self, "clickRespec.oldTemplate"))
|
|
{
|
|
String oldTemplate = getStringObjVar(self, "clickRespec.oldTemplate");
|
|
if (oldTemplate.equals(getSkillTemplate(self)))
|
|
{
|
|
removeObjVar(self, "clickRespec");
|
|
detachScript(self, "systems.respec.click_combat_respec");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
static_item.decrementStaticItem(token);
|
|
removeObjVar(self, "clickRespec.tokenId");
|
|
}
|
|
}
|
|
boolean withItems = true;
|
|
if (hasObjVar(self, "clickRespec.cts"))
|
|
{
|
|
withItems = false;
|
|
}
|
|
respec.earnProfessionSkills(self, skillTemplateName, withItems);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public void givePublishGift(obj_id self) throws InterruptedException
|
|
{
|
|
final String OBJVAR_PUBLISH_GIFT = "publish_gift";
|
|
final String GIFT_DATATABLE = "datatables/veteran_rewards/publish_gift.iff";
|
|
int currentBD = getCurrentBirthDate();
|
|
int playerBD = getPlayerBirthDate(self);
|
|
if (playerBD < 0)
|
|
{
|
|
return;
|
|
}
|
|
if ((currentBD - playerBD) < 10)
|
|
{
|
|
return;
|
|
}
|
|
if (isInTutorialArea(self))
|
|
{
|
|
return;
|
|
}
|
|
int old_publish = -1;
|
|
if (hasObjVar(self, OBJVAR_PUBLISH_GIFT))
|
|
{
|
|
old_publish = getIntObjVar(self, OBJVAR_PUBLISH_GIFT);
|
|
}
|
|
int[] publish_numbers = dataTableGetIntColumn(GIFT_DATATABLE, "PUBLISH");
|
|
if (publish_numbers == null || publish_numbers.length == 0)
|
|
{
|
|
return;
|
|
}
|
|
int last_publish = -1;
|
|
Vector gifts = new Vector();
|
|
for (int i = 0; i < publish_numbers.length; i++)
|
|
{
|
|
if (publish_numbers[i] > last_publish)
|
|
{
|
|
last_publish = publish_numbers[i];
|
|
gifts = new Vector();
|
|
gifts.addElement(dataTableGetString(GIFT_DATATABLE, i, "ITEM"));
|
|
}
|
|
else if (publish_numbers[i] == last_publish)
|
|
{
|
|
gifts.addElement(dataTableGetString(GIFT_DATATABLE, i, "ITEM"));
|
|
}
|
|
}
|
|
if (gifts == null || gifts.size() == 0)
|
|
{
|
|
return;
|
|
}
|
|
if (old_publish >= last_publish)
|
|
{
|
|
return;
|
|
}
|
|
obj_id inv = utils.getInventoryContainer(self);
|
|
Vector objects = new Vector();
|
|
boolean noGift = false;
|
|
for (Object gift : gifts) {
|
|
String item = (String) gift;
|
|
if (item.equals("none")) {
|
|
noGift = true;
|
|
continue;
|
|
}
|
|
obj_id new_gift = static_item.createNewItemFunction(item, inv);
|
|
if (isIdValid(new_gift)) {
|
|
objects.addElement(new_gift);
|
|
CustomerServiceLog("grantGift", "%TU has received the gift(s) for Publish " + last_publish + ". Item given was " + item + ". Item OID was " + new_gift, self);
|
|
}
|
|
}
|
|
obj_id[] object_array = utils.toStaticObjIdArray(objects);
|
|
if ((object_array == null || object_array.length == 0))
|
|
{
|
|
if (noGift)
|
|
{
|
|
setObjVar(self, OBJVAR_PUBLISH_GIFT, last_publish);
|
|
}
|
|
return;
|
|
}
|
|
sendSystemMessage(self, new string_id("base_player", "received_gift"));
|
|
setObjVar(self, OBJVAR_PUBLISH_GIFT, last_publish);
|
|
showLootBox(self, object_array);
|
|
}
|
|
public void respecNewEntertainerSkills(obj_id self) throws InterruptedException
|
|
{
|
|
String template = getSkillTemplate(self);
|
|
if (template == null)
|
|
{
|
|
return;
|
|
}
|
|
if (!template.equals("entertainer_2a"))
|
|
{
|
|
return;
|
|
}
|
|
String oldSkills = dataTableGetString(skill_template.TEMPLATE_TABLE, "entertainer_2a", "template");
|
|
String[] oldSkillList = split(oldSkills, ',');
|
|
if (oldSkillList == null || oldSkillList.length == 0)
|
|
{
|
|
return;
|
|
}
|
|
int oldSkillCount = 0;
|
|
float oldSkillPct = 0.0f;
|
|
for (String s : oldSkillList) {
|
|
if (hasSkill(self, s)) {
|
|
oldSkillCount++;
|
|
}
|
|
}
|
|
oldSkillPct = (float)oldSkillCount / oldSkillList.length;
|
|
skill.revokeAllProfessionSkills(self);
|
|
dictionary d = new dictionary();
|
|
d.put("oldSkillPct", oldSkillPct);
|
|
messageTo(self, "finishEntertainerRespec", d, 1.0f, true);
|
|
}
|
|
public void respecNewCrafterSkills(obj_id self) throws InterruptedException
|
|
{
|
|
String template = getSkillTemplate(self);
|
|
if (template == null)
|
|
{
|
|
return;
|
|
}
|
|
if (!template.startsWith("trader_1"))
|
|
{
|
|
return;
|
|
}
|
|
float pctDone = respec.getPercentageCompletion(self, template);
|
|
String newTemplate = getCorrectTraderTemplate(template);
|
|
skill.revokeAllProfessionSkills(self);
|
|
setSkillTemplate(self, newTemplate);
|
|
respec.setPercentageCompletion(self, newTemplate, pctDone, true);
|
|
skill.recalcPlayerPools(self, true);
|
|
trial.bumpSession(self, "displayDefensiveMods");
|
|
messageTo(self, "setDisplayOnlyDefensiveMods", trial.getSessionDict(self, "displayDefensiveMods"), 5, false);
|
|
}
|
|
public String getCorrectTraderTemplate(String template) throws InterruptedException
|
|
{
|
|
if (template.endsWith("1a"))
|
|
{
|
|
return "trader_0a";
|
|
}
|
|
if (template.endsWith("1b"))
|
|
{
|
|
return "trader_0b";
|
|
}
|
|
if (template.endsWith("1c"))
|
|
{
|
|
return "trader_0c";
|
|
}
|
|
if (template.endsWith("1d"))
|
|
{
|
|
return "trader_0d";
|
|
}
|
|
return "trader_0a";
|
|
}
|
|
public int finishEntertainerRespec(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
float oldSkillPct = params.getFloat("oldSkillPct");
|
|
String newSkills = dataTableGetString(skill_template.TEMPLATE_TABLE, "entertainer_1a", "template");
|
|
String[] newSkillList = split(newSkills, ',');
|
|
int newSkillCount = (int)Math.ceil(oldSkillPct * newSkillList.length);
|
|
setSkillTemplate(self, "entertainer_1a");
|
|
for (int i = 0; i < newSkillCount; i++)
|
|
{
|
|
skill.grantSkillToPlayer(self, newSkillList[i]);
|
|
}
|
|
if (newSkillCount < newSkillList.length)
|
|
{
|
|
setWorkingSkill(self, newSkillList[newSkillCount]);
|
|
}
|
|
skill.recalcPlayerPools(self, true);
|
|
trial.bumpSession(self, "displayDefensiveMods");
|
|
messageTo(self, "setDisplayOnlyDefensiveMods", trial.getSessionDict(self, "displayDefensiveMods"), 5, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleSetBounty(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int bp = sui.getIntButtonPressed(params);
|
|
if (bp == sui.BP_CANCEL)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!utils.hasScriptVar(self, "setbounty.killer"))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id killer = utils.getObjIdScriptVar(self, "setbounty.killer");
|
|
utils.removeScriptVar(self, "setbounty.killer");
|
|
int amount = utils.stringToInt(sui.getInputBoxText(params));
|
|
if (amount < 0)
|
|
{
|
|
sendSystemMessage(self, new string_id("bounty_hunter", "setbounty_invalid_number"));
|
|
bounty_hunter.showSetBountySUI(self, killer);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (amount > bounty_hunter.MAX_BOUNTY_SET)
|
|
{
|
|
sendSystemMessage(self, new string_id("bounty_hunter", "setbounty_cap"));
|
|
amount = bounty_hunter.MAX_BOUNTY_SET;
|
|
}
|
|
if (amount < bounty_hunter.MIN_BOUNTY_SET)
|
|
{
|
|
sendSystemMessage(self, new string_id("bounty_hunter", "setbounty_too_little"));
|
|
bounty_hunter.showSetBountySUI(self, killer);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (hasObjVar(killer, "bounty.amount"))
|
|
{
|
|
int bounty = getIntObjVar(killer, "bounty.amount");
|
|
if (bounty >= bounty_hunter.MAX_BOUNTY)
|
|
{
|
|
sendSystemMessage(self, new string_id("bounty_hunter", "max_bounty"));
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
else if ((bounty + amount) > bounty_hunter.MAX_BOUNTY)
|
|
{
|
|
amount = (bounty + amount) - bounty_hunter.MAX_BOUNTY;
|
|
}
|
|
}
|
|
int total = getTotalMoney(self);
|
|
if (amount > total)
|
|
{
|
|
sendSystemMessage(self, new string_id("bounty_hunter", "setbounty_too_much"));
|
|
bounty_hunter.showSetBountySUI(self, killer);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
dictionary d = new dictionary();
|
|
d.put("killer", killer);
|
|
d.put("amt", amount);
|
|
money.pay(self, money.ACCT_BOUNTY, amount, "handleSetBountyTransaction", d, true);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleSetBountyTransaction(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int code = money.getReturnCode(params);
|
|
if (code == money.RET_FAIL)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id killer = params.getObjId("killer");
|
|
int amount = params.getInt("amt");
|
|
int bounty = 0;
|
|
if (hasObjVar(killer, "bounty.amount"))
|
|
{
|
|
bounty = getIntObjVar(killer, "bounty.amount");
|
|
}
|
|
bounty += amount;
|
|
if (bounty >= 10000)
|
|
{
|
|
setJediBountyValue(killer, bounty);
|
|
}
|
|
setObjVar(killer, "bounty.amount", bounty);
|
|
CustomerServiceLog("bounty", "%TU has taken a bounty of " + amount + " credits out on %TT", self, killer);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleBountyMissionIncomplete(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id target = params.getObjId("target");
|
|
removeJediBounty(target, self);
|
|
obj_id mission = bounty_hunter.getBountyMission(self, target);
|
|
if (isIdValid(mission))
|
|
{
|
|
sendSystemMessage(self, new string_id("bounty_hunter", "bounty_incomplete"));
|
|
endMission(mission);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleUpdateBountyMissionTime(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int gameTime = params.getInt("gameTime");
|
|
int lastMission = 0;
|
|
if (hasObjVar(self, "bounty.lastMissionTime"))
|
|
{
|
|
lastMission = getIntObjVar(self, "bounty.lastMissionTime");
|
|
}
|
|
if (lastMission < gameTime)
|
|
{
|
|
setObjVar(self, "bounty.lastMissionTime", gameTime);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleBountyMissionTimeout(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int gameTime = getGameTime();
|
|
int lastMission = 0;
|
|
if (hasObjVar(self, "bounty.lastMissionTime"))
|
|
{
|
|
lastMission = getIntObjVar(self, "bounty.lastMissionTime");
|
|
}
|
|
if ((gameTime - lastMission) > bounty_hunter.BOUNTY_MISSION_TIME_LIMIT)
|
|
{
|
|
obj_id[] hunters = getJediBounties(self);
|
|
if (hunters != null && hunters.length > 0)
|
|
{
|
|
for (obj_id hunter : hunters) {
|
|
dictionary d = new dictionary();
|
|
d.put("target", self);
|
|
messageTo(hunter, "handleBountyMissionIncomplete", d, 0.0f, true);
|
|
}
|
|
}
|
|
removeAllJediBounties(self);
|
|
removeObjVar(self, "bounty.lastMissionTime");
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public boolean performCriticalHeal(obj_id self) throws InterruptedException
|
|
{
|
|
int[] buffs = buff.getAllBuffs(self);
|
|
if (buffs == null || buffs.length == 0)
|
|
{
|
|
return false;
|
|
}
|
|
for (int b : buffs) {
|
|
String type = buff.getEffectParam(b, 1);
|
|
if (type.equals("avoid_incap_heal")) {
|
|
String subType = dataTableGetString("datatables/buff/effect_mapping.iff", "avoid_incap_heal", "SUBTYPE");
|
|
float value = utils.getFloatScriptVar(self, "buff_handler." + subType);
|
|
healing.healDamage(self, self, HEALTH, (int) value);
|
|
buff.removeBuff(self, buff.getBuffNameFromCrc(b));
|
|
buff.applyBuff(self, "gcw_base_critical_heal_recourse");
|
|
string_id SID_INCAP_HEAL = new string_id("cbt_spam", "incap_heal");
|
|
prose_package pp = new prose_package();
|
|
pp = prose.setStringId(pp, SID_INCAP_HEAL);
|
|
pp = prose.setDF(pp, value);
|
|
pp = prose.setTU(pp, self);
|
|
sendCombatSpamMessageProse(self, self, pp, true, true, true, COMBAT_RESULT_MEDICAL);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
public void sendSmugglerSystemBootstrap(obj_id self) throws InterruptedException
|
|
{
|
|
if (utils.isProfession(self, utils.SMUGGLER))
|
|
{
|
|
if (isInTutorialArea(self))
|
|
{
|
|
return;
|
|
}
|
|
if (hasObjVar(self, "smuggler_bootstrap"))
|
|
{
|
|
return;
|
|
}
|
|
messageTo(self, "handleSendSmugglerBootstrapRequest", null, 120.0f, false);
|
|
}
|
|
}
|
|
public int handleSendSmugglerBootstrapRequest(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
string_id subject = new string_id("smuggler/messages", "bootstrap_subject");
|
|
string_id body = new string_id("smuggler/messages", "bootstrap_body");
|
|
String body_oob = chatMakePersistentMessageOutOfBandBody(null, body);
|
|
body_oob = chatAppendPersistentMessageWaypointData(body_oob, "tatooine", -1049.0f, -3538.0f, new string_id("mob/creature_names", "smuggler_broker_barak"), null);
|
|
String subject_str = "@" + subject.toString();
|
|
chatSendPersistentMessage("Barak", self, subject_str, null, body_oob);
|
|
setObjVar(self, "smuggler_bootstrap", 1);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleSmugglerMissionFailureSignal(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
groundquests.sendSignal(self, "smugglerEnemyIncap");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnClusterWideDataResponse(obj_id self, String manage_name, String data_name, int request_id, String[] element_name_list, dictionary[] dungeon_data, int lock_key) throws InterruptedException
|
|
{
|
|
if (dungeon_data == null || dungeon_data.length == 0)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (data_name.startsWith("base_cwdata_manager"))
|
|
{
|
|
int myBases = 0;
|
|
for (dictionary dungeon_datum : dungeon_data) {
|
|
if (dungeon_datum.getObjId("ownerId") == self) {
|
|
myBases++;
|
|
}
|
|
}
|
|
int recordedBases = getIntObjVar(self, "factionBaseCount");
|
|
if (recordedBases != myBases)
|
|
{
|
|
int correction = recordedBases - myBases;
|
|
prose_package pp = new prose_package();
|
|
pp = prose.setStringId(pp, new string_id("gcw", "faction_base_correction"));
|
|
pp = prose.setDI(pp, correction);
|
|
pp = prose.setTO(pp, "" + myBases);
|
|
sendSystemMessageProse(self, pp);
|
|
setObjVar(self, "factionBaseCount", myBases);
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int removeIncubatorFromUser(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id station = params.getObjId("station");
|
|
incubator.forceRemoveIncubatorFromUser(station, self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleStoryTellerAssistantRequest(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id storytellerPlayer = params.getObjId("storytellerPlayer");
|
|
String storytellerName = params.getString("storytellerName");
|
|
if (isIdValid(storytellerPlayer))
|
|
{
|
|
if (storyteller.doIAutoDeclineStorytellerInvites(self))
|
|
{
|
|
dictionary webster = new dictionary();
|
|
webster.put("targetName", getName(self));
|
|
messageTo(storytellerPlayer, "handleStorytellerAssistantDeclined", webster, 0, false);
|
|
}
|
|
else
|
|
{
|
|
if (!utils.hasScriptVar(self, "storytellerAssistant"))
|
|
{
|
|
storyteller.storyAssistantSui(storytellerPlayer, storytellerName, self);
|
|
}
|
|
else
|
|
{
|
|
boolean alreadyAStorytellersAssistant = false;
|
|
obj_id storytellerId = utils.getObjIdScriptVar(self, "storytellerAssistant");
|
|
if (storytellerId == storytellerPlayer)
|
|
{
|
|
alreadyAStorytellersAssistant = true;
|
|
}
|
|
dictionary webster = new dictionary();
|
|
webster.put("alreadyAStorytellersAssistant", alreadyAStorytellersAssistant);
|
|
webster.put("targetName", getName(self));
|
|
messageTo(storytellerPlayer, "handleStorytellerAlreadyAnAssistant", webster, 0, false);
|
|
}
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleTellStorytellerIDeclinedAssistant(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id storytellerPlayer = params.getObjId("storytellerPlayer");
|
|
if (isIdValid(storytellerPlayer))
|
|
{
|
|
dictionary webster = new dictionary();
|
|
webster.put("targetName", getName(self));
|
|
messageTo(storytellerPlayer, "handleStorytellerAssistantDeclined", webster, 0, false);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleStoryTellerAssistantAccepted(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id storytellerPlayer = params.getObjId("storytellerPlayer");
|
|
String storytellerName = params.getString("storytellerName");
|
|
if (isIdValid(storytellerPlayer))
|
|
{
|
|
storyteller.storyAssistantAcepted(storytellerPlayer, storytellerName, self);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleStoryTellerRemoveAssistant(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id storytellerPlayer = params.getObjId("storytellerPlayer");
|
|
String storytellerName = params.getString("storytellerName");
|
|
if (isIdValid(storytellerPlayer))
|
|
{
|
|
dictionary webster = new dictionary();
|
|
webster.put("removedPlayerName", getName(self));
|
|
if (utils.hasScriptVar(self, "storytellerAssistant"))
|
|
{
|
|
obj_id targetStorytellerId = utils.getObjIdScriptVar(self, "storytellerAssistant");
|
|
if (targetStorytellerId == storytellerPlayer)
|
|
{
|
|
storyteller.storyPlayerRemoveAssistant(storytellerPlayer, storytellerName, self);
|
|
}
|
|
else
|
|
{
|
|
messageTo(storytellerPlayer, "handleStorytellerRemovePlayerNotAssistant", webster, 0, false);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
messageTo(storytellerPlayer, "handleStorytellerRemovePlayerNotAssistant", webster, 0, false);
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleStoryTellerInviteRequest(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id storytellerPlayer = params.getObjId("storytellerPlayer");
|
|
String storytellerName = params.getString("storytellerName");
|
|
obj_id storytellerAssistant = params.getObjId("storytellerAssistant");
|
|
if (isIdValid(storytellerPlayer))
|
|
{
|
|
if (storyteller.doIAutoDeclineStorytellerInvites(self))
|
|
{
|
|
dictionary webster = new dictionary();
|
|
webster.put("targetName", getName(self));
|
|
messageTo(storytellerPlayer, "handleStorytellerInviteDeclined", webster, 0, false);
|
|
}
|
|
else
|
|
{
|
|
if (!utils.hasScriptVar(self, "storytellerid"))
|
|
{
|
|
if (isIdValid(storytellerAssistant))
|
|
{
|
|
storyteller.storyInviteSui(storytellerAssistant, storytellerName, self);
|
|
}
|
|
else
|
|
{
|
|
storyteller.storyInviteSui(storytellerPlayer, storytellerName, self);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
boolean alreadyInStorytellersStory = false;
|
|
obj_id storytellerId = utils.getObjIdScriptVar(self, "storytellerid");
|
|
if (storytellerId == storytellerPlayer)
|
|
{
|
|
alreadyInStorytellersStory = true;
|
|
}
|
|
dictionary webster = new dictionary();
|
|
webster.put("alreadyInStorytellersStory", alreadyInStorytellersStory);
|
|
webster.put("targetName", getName(self));
|
|
webster.put("storytellerName", storytellerName);
|
|
if (isIdValid(storytellerAssistant))
|
|
{
|
|
messageTo(storytellerAssistant, "handleStorytellerInviteAlreadyInAStory", webster, 0, false);
|
|
}
|
|
else
|
|
{
|
|
messageTo(storytellerPlayer, "handleStorytellerInviteAlreadyInAStory", webster, 0, false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleTellStorytellerIDeclinedInvite(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id storytellerPlayer = params.getObjId("storytellerPlayer");
|
|
if (isIdValid(storytellerPlayer))
|
|
{
|
|
dictionary webster = new dictionary();
|
|
webster.put("targetName", getName(self));
|
|
messageTo(storytellerPlayer, "handleStorytellerInviteDeclined", webster, 0, false);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleStoryTellerInviteAccepted(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id storytellerPlayer = params.getObjId("storytellerPlayer");
|
|
String storytellerName = params.getString("storytellerName");
|
|
obj_id storytellerAssistant = params.getObjId("storytellerAssistant");
|
|
if (isIdValid(storytellerPlayer))
|
|
{
|
|
storyteller.storyInviteAcepted(storytellerPlayer, storytellerName, self, storytellerAssistant);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleStoryTellerRemovedFromStory(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id storytellerPlayer = params.getObjId("storytellerPlayer");
|
|
String storytellerName = params.getString("storytellerName");
|
|
if (isIdValid(storytellerPlayer))
|
|
{
|
|
dictionary webster = new dictionary();
|
|
webster.put("removedPlayerName", getName(self));
|
|
if (utils.hasScriptVar(self, "storytellerid"))
|
|
{
|
|
obj_id targetStorytellerId = utils.getObjIdScriptVar(self, "storytellerid");
|
|
if (targetStorytellerId == storytellerPlayer)
|
|
{
|
|
storyteller.storyPlayerRemovedFromStory(storytellerPlayer, storytellerName, self);
|
|
}
|
|
else
|
|
{
|
|
messageTo(storytellerPlayer, "handleStorytellerRemovePlayerNotInStory", null, 0, false);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
messageTo(storytellerPlayer, "handleStorytellerRemovePlayerNotInStory", null, 0, false);
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int setDisplayOnlyDefensiveMods(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (!trial.verifySession(self, params, "displayDefensiveMods"))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
String[] variousMods =
|
|
{
|
|
"display_only_glancing_blow",
|
|
"display_only_dodge",
|
|
"display_only_parry",
|
|
"display_only_block",
|
|
"display_only_tohit",
|
|
"display_only_evasion",
|
|
"display_only_strikethrough",
|
|
"display_only_crit_resistance",
|
|
"display_only_critical",
|
|
"display_only_parry_reduction",
|
|
"display_only_opp_block_reduction",
|
|
"display_only_opp_dodge_reduction",
|
|
"display_only_expertise_critical_hit_reduction",
|
|
"display_only_expertise_critical_hit_pvp_reduction"
|
|
};
|
|
float glancingBlowChance = combat.getDefenderGlancingBlowChance(self) * 100;
|
|
float dodgeChance = combat.getDefenderDodgeChance(self) * 100;
|
|
float parryChance = combat.getDefenderParryChance(self) * 100;
|
|
float blockChance = combat.getDefenderBlockChance(self) * 100;
|
|
float evasionChance = combat.getDefenderEvasionChance(self) * 100;
|
|
float strikeThroughChance = combat.getAttackerStrikethroughChance(self) * 100;
|
|
float toHitBonus = combat.getToHitBonus(self) * 100;
|
|
float criticalChance = (combat.getAttackerCritMod(self)) * 100;
|
|
float parryRedcution = combat.getAttackerParryReduction(self) * 100;
|
|
float dodgeReduction = combat.getAttackerDodgeReduction(self) * 100;
|
|
float blockReduction = combat.getAttackerBlockReduction(self) * 100;
|
|
float hitReduction = combat.getDefenderCriticalChance(self) * 100;
|
|
float hitPvPReduction = (combat.getDefenderCriticalChance(self) + combat.getPvPHitReductionChance(self)) * 100;
|
|
for (String variousMod : variousMods) {
|
|
removeAttribOrSkillModModifier(self, variousMod);
|
|
}
|
|
addSkillModModifier(self, "display_only_glancing_blow", "display_only_glancing_blow", (int)glancingBlowChance, -1, false, false);
|
|
addSkillModModifier(self, "display_only_dodge", "display_only_dodge", (int)dodgeChance, -1, false, false);
|
|
addSkillModModifier(self, "display_only_parry", "display_only_parry", (int)parryChance, -1, false, false);
|
|
addSkillModModifier(self, "display_only_block", "display_only_block", (int)blockChance, -1, false, false);
|
|
addSkillModModifier(self, "display_only_tohit", "display_only_tohit", (int)toHitBonus, -1, false, false);
|
|
addSkillModModifier(self, "display_only_evasion", "display_only_evasion", (int)evasionChance, -1, false, false);
|
|
addSkillModModifier(self, "display_only_strikethrough", "display_only_strikethrough", (int)strikeThroughChance, -1, false, false);
|
|
addSkillModModifier(self, "display_only_critical", "display_only_critical", (int)criticalChance, -1, false, false);
|
|
addSkillModModifier(self, "display_only_parry_reduction", "display_only_parry_reduction", (int)parryRedcution, -1, false, false);
|
|
addSkillModModifier(self, "display_only_opp_dodge_reduction", "display_only_opp_dodge_reduction", (int)dodgeReduction, -1, false, false);
|
|
addSkillModModifier(self, "display_only_opp_block_reduction", "display_only_opp_block_reduction", (int)blockReduction, -1, false, false);
|
|
addSkillModModifier(self, "display_only_expertise_critical_hit_reduction", "display_only_expertise_critical_hit_reduction", (int)hitReduction, -1, false, false);
|
|
addSkillModModifier(self, "display_only_expertise_critical_hit_pvp_reduction", "display_only_expertise_critical_hit_pvp_reduction", (int)hitPvPReduction, -1, false, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnGetAttributes(obj_id self, obj_id player, String[] names, String[] attribs) throws InterruptedException
|
|
{
|
|
int idx = utils.getValidAttributeIndex(names);
|
|
if (idx == -1)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (utils.hasScriptVar(self, "storytellerName"))
|
|
{
|
|
String storytellerName = utils.getStringScriptVar(self, "storytellerName");
|
|
names[idx] = "storyteller_name";
|
|
attribs[idx] = storytellerName;
|
|
idx++;
|
|
if (idx >= names.length)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
if (utils.hasScriptVar(self, "storytellerAssistantName"))
|
|
{
|
|
String storytellerAssistantName = utils.getStringScriptVar(self, "storytellerAssistantName");
|
|
names[idx] = "storyteller_assistant_name";
|
|
attribs[idx] = storytellerAssistantName;
|
|
idx++;
|
|
if (idx >= names.length)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdGetGalaxyMessage(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
obj_id planetId = getPlanetByName("tatooine");
|
|
if (!isIdNull(planetId))
|
|
{
|
|
if (hasObjVar(planetId, "galaxyMessage"))
|
|
{
|
|
String strGalaxyMessage = "\\#FF0000" + utils.getStringObjVar(planetId, "galaxyMessage") + "\\#FFFFFF";
|
|
sendConsoleMessage(self, strGalaxyMessage);
|
|
}
|
|
else
|
|
{
|
|
String strGalaxyMessage = "\\#FF0000" + "Welcome to Star Wars Galaxies" + "\\#FFFFFF";
|
|
sendConsoleMessage(self, strGalaxyMessage);
|
|
}
|
|
boolean warden = isWarden(self);
|
|
if (warden || (getGodLevel(self) >= 10))
|
|
{
|
|
String strGalaxyMessage = "\\#FF0000";
|
|
if (!warden)
|
|
{
|
|
strGalaxyMessage += "Displaying warden MOTD to you even though you are not a warden, because you are of the appropriate god level:\n";
|
|
}
|
|
if (hasObjVar(planetId, "galaxyWardenMessage"))
|
|
{
|
|
strGalaxyMessage += utils.getStringObjVar(planetId, "galaxyWardenMessage");
|
|
}
|
|
else
|
|
{
|
|
strGalaxyMessage += "Welcome warden";
|
|
}
|
|
strGalaxyMessage += "\\#FFFFFF";
|
|
sendConsoleMessage(self, strGalaxyMessage);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
sendConsoleMessage(self, "Welcome to Star Wars Galaxies");
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int myCityMotdResponse(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
String city_motd = params.getString("city_motd");
|
|
if (city_motd != null && city_motd.length() > 0)
|
|
{
|
|
sendConsoleMessage(self, city_motd + "\\#DFDFDF");
|
|
}
|
|
utils.setScriptVar(self, "recieved_city_motd", 1);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
// public int stampDungeonArea(obj_id self, dictionary params) throws InterruptedException
|
|
// {
|
|
// LOG("space_dungeon", "base_player.stampDungeonArea -- Stamping player with obj vars.");
|
|
// String dungeon_area = params.getString("buildout_area");
|
|
//
|
|
// if (dungeon_area.equals("invalid"))
|
|
// {
|
|
// return SCRIPT_CONTINUE;
|
|
// }
|
|
// int buildout_row = params.getInt("buildout_row");
|
|
// if (buildout_row == -1)
|
|
// {
|
|
// return SCRIPT_CONTINUE;
|
|
// }
|
|
// setObjVar(self, space_dungeon.VAR_BUILDOUT_AREA, dungeon_area);
|
|
// setObjVar(self, space_dungeon.VAR_BUILDOUT_ROW, buildout_row);
|
|
// return SCRIPT_CONTINUE;
|
|
// }
|
|
public int removeDungeonArea(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
String dungeon_area = params.getString("buildout_area");
|
|
if (dungeon_area.equals("invalid"))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int buildout_row = params.getInt("buildout_row");
|
|
if (buildout_row == -1)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!hasObjVar(self, space_dungeon.VAR_BUILDOUT_AREA) || getStringObjVar(self, space_dungeon.VAR_BUILDOUT_AREA) != dungeon_area)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
removeObjVar(self, space_dungeon.VAR_BUILDOUT_AREA);
|
|
removeObjVar(self, space_dungeon.VAR_BUILDOUT_ROW);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleStopDanceMessage(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
utils.removeScriptVar(self, "stopDanceMessage");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int onGuildCreateTerminalDataObject(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
boolean hasTerminal = utils.playerHasItemByTemplateInDataPad(self, guild.STR_GUILD_REMOTE_DEVICE);
|
|
if (!hasTerminal)
|
|
{
|
|
obj_id pDataPad = utils.getPlayerDatapad(self);
|
|
createObjectOverloaded(guild.STR_GUILD_REMOTE_DEVICE, utils.getPlayerDatapad(self));
|
|
string_id stringMessage = new string_id("guild", "datapad_terminal_created");
|
|
sendSystemMessage(self, stringMessage);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int applyMountBuff(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id playerCurrentMount = getMountId(self);
|
|
if (isIdValid(playerCurrentMount))
|
|
{
|
|
vehicle.applyVehicleBuffs(self, playerCurrentMount);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleDailyMissionReset(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
missions.clearDailyObjVars(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdMeditate(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
if (getPosture(self) != POSTURE_SITTING)
|
|
{
|
|
sendSystemMessage(self, new string_id("jedi_spam", "meditate_not_sitting"));
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
stealth.checkForAndMakeVisibleNoRecourse(self);
|
|
if (getState(self, STATE_MEDITATE) == 1)
|
|
{
|
|
sendSystemMessage(self, new string_id("jedi_spam", "already_in_meditative_state"));
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
meditation.startMeditation(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cmdMeditateFail(obj_id self, obj_id target, String params, float defaultTime) throws InterruptedException
|
|
{
|
|
sendSystemMessage(self, meditation.SID_MED_FAIL);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleMeditationTick(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (!meditation.isMeditating(self))
|
|
{
|
|
meditation.endMeditation(self, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!trial.verifySession(self, params, meditation.HANDLER_MEDITATION_TICK))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (utils.isProfession(self, utils.FORCE_SENSITIVE))
|
|
{
|
|
int value = 0;
|
|
if (utils.hasScriptVar(self, meditation.VAR_MEDITATION_BASE))
|
|
{
|
|
value = utils.getIntScriptVar(self, meditation.VAR_MEDITATION_BASE);
|
|
value++;
|
|
if (value >= 3)
|
|
{
|
|
stealth.checkForAndMakeVisibleNoRecourse(self);
|
|
String meditateBuff = meditation.MEDITATE_BUFFS[rand(0, meditation.MEDITATE_BUFFS.length - 1)];
|
|
buff.applyBuff(self, meditateBuff);
|
|
value = 0;
|
|
}
|
|
}
|
|
utils.setScriptVar(self, meditation.VAR_MEDITATION_BASE, value);
|
|
}
|
|
messageTo(self, meditation.HANDLER_MEDITATION_TICK, trial.getSessionDict(self, meditation.HANDLER_MEDITATION_TICK), 10.0f, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int msgCoupDeGraceAuthoritativeCheck(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (!utils.hasScriptVar(self, "death.beingCoupDeGraced"))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (params == null || params.isEmpty())
|
|
{
|
|
utils.removeScriptVar(self, "death.beingCoupDeGraced");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int numberOfTries = params.getInt("numberOfTries");
|
|
obj_id victim = params.getObjId("victim");
|
|
obj_id killer = params.getObjId("killer");
|
|
boolean playAnim = params.getBoolean("playAnim");
|
|
boolean usePVPRules = params.getBoolean("usePVPRules");
|
|
if (victim.isAuthoritative() && killer.isAuthoritative())
|
|
{
|
|
utils.removeScriptVar(self, "death.beingCoupDeGraced");
|
|
pclib.coupDeGrace(victim, killer, playAnim, usePVPRules);
|
|
}
|
|
else
|
|
{
|
|
if (numberOfTries >= 5)
|
|
{
|
|
CustomerServiceLog("player_death", "coupDeGrace:Player %TU was Death Blowed by %TT, " + numberOfTries + " attempts have been made to force them onto the same process, and has failed. %TU may be perma-incapped", victim, killer);
|
|
utils.removeScriptVar(self, "death.beingCoupDeGraced");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
params.put("numberOfTries", ++numberOfTries);
|
|
messageTo(victim, "msgCoupDeGraceAuthoritativeCheck", params, 2, false);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public boolean lifeDayNewDay(obj_id player) throws InterruptedException
|
|
{
|
|
if (hasObjVar(player, "lifeday.time_stamp"))
|
|
{
|
|
int now = getCalendarTime();
|
|
int then = getIntObjVar(player, "lifeday.time_stamp");
|
|
if (now > then)
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
public boolean colorizeObject(obj_id self, obj_id object, obj_id tool, String params) throws InterruptedException
|
|
{
|
|
if (!isValidId(self) || !exists(self))
|
|
{
|
|
return false;
|
|
}
|
|
if (!isValidId(object) || !exists(object))
|
|
{
|
|
return false;
|
|
}
|
|
if (!isValidId(tool) || !exists(tool))
|
|
{
|
|
return false;
|
|
}
|
|
if (params == null || params.equals(""))
|
|
{
|
|
return false;
|
|
}
|
|
if (params == null || params.equals(""))
|
|
{
|
|
messageTo(tool, "cancelTool", null, 0, false);
|
|
return false;
|
|
}
|
|
String[] colorArray = split(params, ' ');
|
|
if (colorArray == null || colorArray.length <= 0)
|
|
{
|
|
return false;
|
|
}
|
|
for (int i = 0; i < colorArray.length; i += 2)
|
|
{
|
|
if (colorArray[i] == null || colorArray[i].equals(""))
|
|
{
|
|
break;
|
|
}
|
|
hue.setColor(object, colorArray[i], utils.stringToInt(colorArray[i + 1]));
|
|
}
|
|
messageTo(tool, "decrementTool", null, 0, false);
|
|
return true;
|
|
}
|
|
public boolean isPvpRelatedDeath(obj_id player) throws InterruptedException
|
|
{
|
|
if (!utils.hasScriptVar(player, "lastKiller"))
|
|
{
|
|
return false;
|
|
}
|
|
obj_id lastKillerOID = utils.getObjIdScriptVar(player, "lastKiller");
|
|
utils.removeScriptVar(player, "lastKiller");
|
|
if (!isIdValid(lastKillerOID))
|
|
{
|
|
return false;
|
|
}
|
|
if (isPlayer(lastKillerOID))
|
|
{
|
|
return true;
|
|
}
|
|
if (pet_lib.isPet(lastKillerOID) || pet_lib.isDroidPet(lastKillerOID) || pet_lib.isNpcPet(lastKillerOID) || pet_lib.isCombatDroid(lastKillerOID) || beast_lib.isBeast(lastKillerOID))
|
|
{
|
|
obj_id master = getMaster(lastKillerOID);
|
|
if (isIdValid(master) && isPlayer(master))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
public boolean needsBlackwingLightInfection(obj_id self) throws InterruptedException
|
|
{
|
|
if (!buff.hasBuff(self, "death_troopers_infection_1") && !buff.hasBuff(self, "death_troopers_infection_2") && !buff.hasBuff(self, "death_troopers_infection_3") && !buff.hasBuff(self, "death_troopers_inoculation"))
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
public int death_troopers_apply_virus(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (needsBlackwingLightInfection(self) && locations.isInRegion(self, "@dathomir_region_names:black_mesa"))
|
|
{
|
|
buff.applyBuff(self, "death_troopers_infection_1");
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleBuyBackSui(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (params == null || params.equals(""))
|
|
{
|
|
CustomerServiceLog("Junk_Dealer: ", "base_player.handleBuyBackSui() - Player: " + self + " attempted to get a list of buy back items but the message handler received not data.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id junkDealer = params.getObjId("dealer");
|
|
if (!isIdValid(junkDealer))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (utils.outOfRange(junkDealer, self, 10.0f, true))
|
|
{
|
|
CustomerServiceLog("Junk_Dealer: ", "base_player.handleBuyBackSui() - Player: " + self + " attempted to get a list of buy back items but the action failed. The player was too far away from the TERMINAL.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int idx = sui.getListboxSelectedRow(params);
|
|
int bp = sui.getIntButtonPressed(params);
|
|
obj_id[] junk = utils.getObjIdBatchScriptVar(self, smuggler.SCRIPTVAR_JUNK_IDS);
|
|
smuggler.cleanupSellJunkSui(self);
|
|
if (bp == sui.BP_CANCEL)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
else if (bp == sui.BP_REVERT)
|
|
{
|
|
if (idx >= 0 && idx <= junk.length - 1)
|
|
{
|
|
if ((junk != null) || (junk.length > 0))
|
|
{
|
|
openExamineWindow(self, junk[idx]);
|
|
}
|
|
}
|
|
obj_id[] buyBackItems = smuggler.getBuyBackItemsInContainer(self);
|
|
if (buyBackItems != null && buyBackItems.length > 0)
|
|
{
|
|
smuggler.showBuyBackSui(self, junkDealer);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
else
|
|
{
|
|
if (idx < 0)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if ((junk == null) || (junk.length == 0))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (idx > junk.length - 1)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
smuggler.buyBackJunkItem(self, junkDealer, junk[idx], true);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleTheBuyBack(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (params == null || params.equals(""))
|
|
{
|
|
CustomerServiceLog("Junk_Dealer: ", "base_player.handleBuyBackSui() - Player: " + self + " attempted to get a list of buy back items but the message handler received not data.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id junkDealer = params.getObjId("dealer");
|
|
if (!isIdValid(junkDealer))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (utils.outOfRange(junkDealer, self, 10.0f, true))
|
|
{
|
|
CustomerServiceLog("Junk_Dealer: ", "base_player.handleBuyBackSui() - Player: " + self + " attempted to get a list of buy back items but the action failed. The player was too far away from the TERMINAL.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id item = params.getObjId("item");
|
|
if (!isIdValid(item))
|
|
{
|
|
CustomerServiceLog("Junk_Dealer: ", "base_player.handleTheBuyBack() - Player (OID: " + self + ") could not sell item because the item parameter was invalid.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int price = params.getInt("price");
|
|
if (price <= 0)
|
|
{
|
|
CustomerServiceLog("Junk_Dealer: ", "base_player.handleTheBuyBack() - Player (OID: " + self + ") could not sell item because the price on the item was invalid.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int retCode = params.getInt(money.DICT_CODE);
|
|
if (retCode == money.RET_FAIL)
|
|
{
|
|
prose_package ppNoSale = prose.getPackage(smuggler.PROSE_NO_BUY_BACK, item);
|
|
sendSystemMessageProse(self, ppNoSale);
|
|
CustomerServiceLog("Junk_Dealer: ", "base_player.handleTheBuyBack() - Player (OID: " + self + ") could not sell item (" + item + ") for (" + price + ") because the player did not have the credits.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
prose_package ppSoldJunk = prose.getPackage(smuggler.PROSE_PURCHASED_JUNK, item, price);
|
|
sendSystemMessageProse(self, ppSoldJunk);
|
|
|
|
CustomerServiceLog("Junk_Dealer: ", "base_player.handleTheBuyBack() - Player (OID: " + self + ") has paid: " + price + " for a buy back item and is about to retrieve that item: " + item + " from their buy back container.");
|
|
smuggler.moveBuyBackObjectIntoInventory(self, item);
|
|
obj_id[] buyBackItems = smuggler.getBuyBackItemsInContainer(self);
|
|
if (buyBackItems != null && buyBackItems.length > 0)
|
|
{
|
|
smuggler.showBuyBackSui(self, junkDealer);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleFlagJunkSui(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (params == null || params.equals(""))
|
|
{
|
|
CustomerServiceLog("Junk_Dealer: ", "base_player.handleBuyBackSui() - Player: " + self + " attempted to get a list of buy back items but the message handler received not data.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id junkDealer = params.getObjId("dealer");
|
|
if (!isIdValid(junkDealer))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (utils.outOfRange(junkDealer, self, 10.0f, true))
|
|
{
|
|
CustomerServiceLog("Junk_Dealer: ", "base_player.handleBuyBackSui() - Player: " + self + " attempted to get a list of buy back items but the action failed. The player was too far away from the TERMINAL.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int idx = sui.getListboxSelectedRow(params);
|
|
int bp = sui.getIntButtonPressed(params);
|
|
obj_id[] junk = utils.getObjIdBatchScriptVar(self, smuggler.SCRIPTVAR_JUNK_IDS);
|
|
boolean reshowSui = true;
|
|
if (junk.length < 1)
|
|
{
|
|
reshowSui = false;
|
|
}
|
|
smuggler.cleanupSellJunkSui(self);
|
|
if (bp == sui.BP_CANCEL)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
else if (bp == sui.BP_REVERT)
|
|
{
|
|
if (idx >= 0 && idx <= junk.length - 1)
|
|
{
|
|
if ((junk != null) || (junk.length > 0))
|
|
{
|
|
openExamineWindow(self, junk[idx]);
|
|
smuggler.flagJunkSaleSui(self, junkDealer);
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
else
|
|
{
|
|
if (idx < 0)
|
|
{
|
|
if (junk != null && junk.length > 0)
|
|
{
|
|
smuggler.flagJunkSaleSui(self, junkDealer);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (idx > junk.length - 1)
|
|
{
|
|
if (junk != null && junk.length > 0)
|
|
{
|
|
smuggler.flagJunkSaleSui(self, junkDealer);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (hasObjVar(junk[idx], smuggler.JUNK_DEALKER_NO_SALE_FLAG))
|
|
{
|
|
removeObjVar(junk[idx], smuggler.JUNK_DEALKER_NO_SALE_FLAG);
|
|
}
|
|
else
|
|
{
|
|
setObjVar(junk[idx], smuggler.JUNK_DEALKER_NO_SALE_FLAG, getGameTime());
|
|
}
|
|
smuggler.flagJunkSaleSui(self, junkDealer);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int setupLotteryListener(obj_id self, dictionary params) throws InterruptedException{
|
|
listenToMessage(getObjIdObjVar(self, "lottery.broker"), "updateLotteryStatus");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int removeLotteryListener(obj_id self, dictionary params) throws InterruptedException{
|
|
stopListeningToMessage(getObjIdObjVar(self, "lottery.broker"), "updateLotteryStatus");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int updateLotteryStatus(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
setObjVar(self, "lottery.availableTickets", params.getInt("available"));
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public boolean blog(String txt) throws InterruptedException
|
|
{
|
|
if (LOGGING_ON)
|
|
{
|
|
LOG(LOGNAME, txt);
|
|
}
|
|
return true;
|
|
}
|
|
public int OnWaypointWarpRequested(obj_id self, obj_id waypoint) throws InterruptedException {
|
|
if(!isGod(self)) {
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
location loc = getWaypointLocation(waypoint);
|
|
sendSystemMessageTestingOnly(self, "Teleporting you to the location of Waypoint: "+getWaypointName(waypoint)+" ("+waypoint+") at "+loc+"...");
|
|
warpPlayer(self, loc.area, loc.x, loc.y, loc.z, loc.cell, 0, 0, 0, "noHandler", false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int playerFactionalPresenceHeartbeat(obj_id self, dictionary params) throws InterruptedException {
|
|
gcw.grantGcwFactionalPresenceScore(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|