Files
dsrc/sku.0/sys.server/compiled/game/script/library/player_structure.java
2021-08-20 00:52:30 -04:00

7061 lines
311 KiB
Java
Executable File

package script.library;
import script.*;
import java.util.*;
public class player_structure extends script.base_script
{
public player_structure()
{
}
public static final boolean LOGGING_ON = false;
public static final String LOGGING_CATEGORY = "special_sign";
public static final String SCRIPT_TERMINAL_STRUCTURE = "terminal.terminal_structure";
public static final String SCRIPT_PERMANENT_STRUCTURE = "structure.permanent_structure";
public static final String PLAYER_STRUCTURE_DATATABLE = "datatables/structure/player_structure.iff";
public static final String PLAYER_STRUCTURE_VALIDATION_DATATABLE = "datatables/structure/player_structure_validation.iff";
public static final String TBL_SIGN = "datatables/structure/player_structure_sign.iff";
public static final String TBL_SPECIAL_SIGNS = "datatables/structure/special_sign.iff";
public static final String SIGN_ADJUST_SIGN_BY_TEMPLATE = "datatables/structure/sign_adjust_by_template.iff";
public static final String DATATABLE_COL_STRUCTURE = "STRUCTURE";
public static final String DATATABLE_COL_TEMP_STRUCTURE = "TEMP_STRUCTURE";
public static final String DATATABLE_COL_FOOTPRINT = "FOOTPRINT_TEMPLATE";
public static final String DATATABLE_COL_EJECT_RANGE = "EJECT_RANGE";
public static final String DATATABLE_COL_X = "X";
public static final String DATATABLE_COL_Y = "Y";
public static final String DATATABLE_COL_Z = "Z";
public static final String DATATABLE_COL_CELL = "CELL";
public static final String DATATABLE_COL_HEADING = "HEADING";
public static final String DATATABLE_COL_OBJECT = "OBJECT";
public static final String DATATABLE_COL_CIVIC = "CIVIC";
public static final String DATATABLE_COL_CITY_RANK = "CITY_RANK";
public static final String DATATABLE_COL_CITY_COST = "CITY_COST";
public static final String DATATABLE_COL_MAINT_RATE = "MAINT_RATE";
public static final String DATATABLE_COL_DECAY_RATE = "DECAY_RATE";
public static final String DATATABLE_COL_REDEED_COST = "REDEED_COST";
public static final String DATATABLE_COL_CONDITION = "CONDITION";
public static final String DATATABLE_COL_SKILL_MOD = "SKILLMOD";
public static final String DATATABLE_COL_SKILL_MOD_VALUE = "SKILLMODVALUE";
public static final String DATATABLE_COL_SKILL_MOD_MESSAGE = "SKILLMOD_MESSAGE";
public static final String DATATABLE_COL_VERSION = "VERSION";
public static final String DATATABLE_COL_NO_LOT_REQ = "NO_LOT_REQUIREMENT";
public static final String DATATABLE_COL_LOT_REDUCTION = "LOT_REDUCTION";
public static final String DATATABLE_COL_HAS_SIGN = "HAS_SIGN";
public static final String DATATABLE_COL_POWER_RATE = "POWER_RATE";
public static final String WORLD_DELTA = "WORLD_DELTA";
public static final String DATATABLE_COL_TEMPLATE = "TEMPLATE";
public static final String DATATABLE_COL_HOPPER_MIN = "HOPPER_MIN";
public static final String DATATABLE_COL_HOPPER_MAX = "HOPPER_MAX";
public static final String VAR_PLAYER_STRUCTURE = "player_structure";
public static final String VAR_TERMINAL_HEADING = "player_structure.intendedHeading";
public static final String OBJVAR_STORED_HANGAR_LITE = "hangar_lite.storedInHangarLite";
public static final String VAR_OWNER = "player_structure.owner";
public static final String VAR_OWNER_FACTION = "player_structure.faction";
public static final String VAR_ENTER_LIST = "player_structure.enter.enterList";
public static final String VAR_BAN_LIST = "player_structure.ban.banList";
public static final String VAR_ADMIN_LIST = "player_structure.admin.adminList";
public static final String VAR_VENDOR_LIST = "player_structure.vendor.vendorList";
public static final String VAR_HOPPER_LIST = "player_structure.hopper.hopperList";
public static final String VAR_CIVIC = "player_structure.civic";
public static final String VAR_CITY_RANK = "player_structure.city_rank";
public static final String VAR_CITY_COST = "player_structure.city_cost";
public static final String VAR_MAINTENANCE_MOD = "player_structure.maintanence.mod";
public static final String VAR_DECAY_RATE = "player_structure.maintanence.decay";
public static final String VAR_LAST_MAINTANENCE = "player_structure.last_maintanence";
public static final String VAR_CONDITION = "player_structure.condition";
public static final String VAR_MAX_CONDITION = "player_structure.max_condition";
public static final String VAR_BASE_OBJECT = "player_structure.base_objects";
public static final String VAR_MAX_EXTRACTION = "player_structure.maxExtraction";
public static final String VAR_CURRENT_EXTRACTION = "player_structure.currentExtraction";
public static final String VAR_MAX_HOPPER = "player_structure.maxHopper";
public static final String VAR_VERSION = "player_structure.version";
public static final String VAR_IS_GUILD_HALL = "player_structure.is_guild_hall";
public static final String VAR_LAST_MESSAGE = "player_structure.last_message";
public static final String VAR_PERMISSIONS_CONVERTED = "player_structure.permissions_converted";
public static final String VAR_ABANDONED = "player_structure.abandoned";
public static final String OBJVAR_HANGAR_CREATED = "hangar.created";
public static final String VAR_MAINTENANCE_MODIFIERS = "player_structure.maintanence.modifiers";
public static final String VAR_MAINTENANCE_MOD_FACTORY = VAR_MAINTENANCE_MODIFIERS + ".factory";
public static final String VAR_MAINTENANCE_MOD_HARVESTER = VAR_MAINTENANCE_MODIFIERS + ".harvester";
public static final String VAR_MAINTENANCE_MOD_MERCHANT = VAR_MAINTENANCE_MODIFIERS + ".merchant";
public static final String VAR_MAINTENANCE_MOD_TAX = VAR_MAINTENANCE_MODIFIERS + ".tax";
public static final String VAR_POWER_MOD_FACTORY = "player_structure.power.modifiers.factory";
public static final String VAR_POWER_MOD_HARVESTER = "player_structure.power.modifiers.harvester";
public static final String VAR_SIGN_BASE = "player_structure.sign";
public static final String VAR_SIGN_ID = VAR_SIGN_BASE + ".id";
public static final String VAR_SIGN_NAME = VAR_SIGN_BASE + ".name";
public static final String VAR_SIGN_TYPE = VAR_SIGN_BASE + ".type";
public static final String SCRIPT_TEMPORARY_STRUCTURE = "structure.temporary_structure";
public static final String VAR_DEED_TEMPLATE = "player_structure.deed.template";
public static final String VAR_DEED_TEMPLATE_CRC = "player_structure.deed.template_crc";
public static final String VAR_DEED_BUILDTIME = "player_structure.deed.buildtime";
public static final String VAR_DEED_SCENE = "player_structure.deed.scene";
public static final String VAR_DEED_TIMESTAMP = "player_structure.deed.timestamp";
public static final String VAR_DEED_MAX_EXTRACTION = "player_structure.deed.maxExtractionRate";
public static final String VAR_DEED_CURRENT_EXTRACTION = "player_structure.deed.currentExtractionRate";
public static final String VAR_DEED_MAX_HOPPER = "player_structure.deed.maxHopperSize";
public static final String VAR_DEED_SURPLUS_BASE = "player_structure.deed.surplus";
public static final String VAR_DEED_SURPLUS_POWER = "player_structure.deed.surplus.power";
public static final String VAR_DEED_SURPLUS_MAINTENANCE = "player_structure.deed.surplus.maintenance";
public static final String VAR_TEMP_TEMPLATE = "player_structure.construction.template";
public static final String VAR_TEMP_OWNER = "player_structure.construction.owner";
public static final String VAR_TEMP_OWNER_NAME = "player_structure.construction.ownerName";
public static final String VAR_TEMP_OWNER_FACTION = "player_structure.construction.ownerFaction";
public static final String VAR_TEMP_ROTATION = "player_structure.construction.rotation";
public static final String VAR_TEMP_PLACEMENT_HEIGHT = "player_structure.construction.placementHeight";
public static final String VAR_LOTS_USED = "player_structure.lotsUsed";
public static final String VAR_RESIDENCE_BUILDING = "player_structure.residence.building";
public static final String VAR_RESIDENCE_CAN_DECLARE = "player_structure.residence.canDeclare";
public static final String VAR_CONFIRM_DESTROY = "player_structure.confirmDestroy";
public static final String VAR_IS_PLACED_OBJECT = "player_structure.is_placed_object";
public static final String VAR_WAYPOINT_STRUCTURE = "player_structure.waypoint";
public static final float INSTALLATION_RANGE = 30.0f;
public static final float CIVIC_INSTALLATION_RANGE = 30.0f;
public static final float RATE_POWER_MIN = 1.0f;
public static final float MERCHANT_SALES_MODIFIER = -0.2f;
public static final int MIN_RESIDENCE_DURATION = 86400;
public static final int MAX_LOTS = 10;
public static final int MAX_LIST_SIZE = 50;
public static final int MAIL_WARNING_INTERVAL = 86400;
public static final int TIME_TO_NEXT_PACKUP = 86400;
public static final float HOUSE_PACKUP_FAILURE_TIMER = 0.0f;
public static final float HOUSE_PACKUP_LOCKOUT_TIMER = 300.0f;
public static final int ARRAY_LENGTH_FOR_HOUSE_PACKUP = 2;
public static final String SCRIPTVAR_HOUSE_PACKUP_TREE_PREFIX = "packup_structure";
public static final String SCRIPTVAR_HOUSE_PACKUP_LOCKOUT_TIME = SCRIPTVAR_HOUSE_PACKUP_TREE_PREFIX + ".time_started";
public static final String HOUSE_PACKUP_ARRAY_OBJVAR = "housePackup";
public static final String HOUSE_PACKUP_DAILY_TALLY_OBJVAR = "dailyHousePackup";
public static final String HOUSE_PACKUP_DAILY_TIMER_OBJVAR = "maxHousePackupTimer";
public static final string_id SID_LOCKOUT_MESSAGE = new string_id("player_structure", "house_lockout_remaining");
public static final String[] SIGN_TYPE =
{
"object/tangible/sign/player/house_address.iff",
"object/tangible/sign/player/shop_sign_s01.iff",
"object/tangible/sign/player/shop_sign_s02.iff",
"object/tangible/sign/player/shop_sign_s03.iff",
"object/tangible/sign/player/shop_sign_s04.iff",
"object/tangible/sign/player/house_address_naboo.iff",
"object/tangible/sign/player/house_address_corellia.iff",
"object/tangible/sign/player/house_address_tatooine.iff"
};
public static final string_id[] SIGN_NAMES =
{
new string_id("player_structure", "house_address"),
new string_id("player_structure", "shop_sign1"),
new string_id("player_structure", "shop_sign2"),
new string_id("player_structure", "shop_sign3"),
new string_id("player_structure", "shop_sign4")
};
public static final String MODIFIED_HOUSE_SIGN = "structure.modifiedSign";
public static final String MODIFIED_HOUSE_SIGN_MODEL = "structure.modifiedSignModel";
public static final String SPECIAL_SIGN = "structure.special_sign.hasSpecialSign";
public static final String SPECIAL_SIGN_TEMPLATE = "structure.special_sign.specialSignTemplate";
public static final String SPECIAL_SIGN_SKILLMOD = "structure.special_sign.specialSignSkillMod";
public static final String SPECIAL_SIGN_DECREMENT_MOD = "structure.special_sign.specialSignDecrementSkillMod";
public static final String SPECIAL_SIGN_OWNER_ONLY = "structure.special_sign.specialSignOwnerOnly";
public static final String VAR_SPECIAL_SIGN_TREE = "special_sign";
public static final String VAR_SPECIAL_SIGN_LIST = VAR_SPECIAL_SIGN_TREE + ".sign_list";
public static final String VAR_SPECIAL_SIGN_NAMES = VAR_SPECIAL_SIGN_TREE + ".sign_name";
public static final String VAR_SPECIAL_SIGN_MENU = VAR_SPECIAL_SIGN_TREE + ".sign_menu";
public static final String VAR_SPECIAL_SIGN_MENU_PID = VAR_SPECIAL_SIGN_TREE + ".sign_menu_pid";
public static final string_id SID_MAIL_STRUCTURE_DAMAGE_CONDEMN = new string_id("player_structure", "mail_structure_damage_condemn");
public static final string_id SID_MAIL_STRUCTURE_DAMAGE_SUB = new string_id("player_structure", "mail_structure_damage_sub");
public static final string_id SID_MAIL_STRUCTURE_DAMAGE = new string_id("player_structure", "mail_structure_damage");
public static final string_id SID_BUILD_NO_CITY = new string_id("city/city", "build_no_city");
public static final string_id SID_RANK_REQ = new string_id("city/city", "rank_req");
public static final string_id SID_NO_RIGHTS = new string_id("player_structure", "no_rights");
public static final string_id SID_CIVIC_COUNT = new string_id("city/city", "civic_count");
public static final string_id CANNOT_PLACE_MINEFIELD = new string_id("player_structure", "cannot_place_minefield");
public static final string_id CANNOT_PLACE_TURRET = new string_id("player_structure", "cannot_place_turret");
public static final string_id SID_CANNOT_BUILD_GARAGE_TOO_CLOSE = new string_id("player_structure", "cannot_build_garage_too_close");
public static final string_id SID_SUI_CONFIRM_PLACEMENT_TITLE = new string_id("player_structure", "sui_confirm_placement_title");
public static final string_id SID_SUI_CONFIRM_PLACEMENT_PROMPT = new string_id("player_structure", "sui_confirm_placement_prompt");
public static final string_id SID_NO_FREE_TRIAL = new string_id("player_structure", "no_free_trial");
public static final string_id PACKUP_EMAIL_TITLE = new string_id("spam", "packup_email_title");
public static final string_id PACKUP_EMAIL_BODY = new string_id("spam", "packup_email_body");
public static final string_id SELF_PACKUP_EMAIL_TITLE = new string_id("spam", "packup_email_title_self");
public static final string_id SELF_PACKUP_EMAIL_BODY = new string_id("spam", "packup_email_body_self");
public static final string_id CANT_APPLY_SKILLMOD = new string_id("base_player", "cant_use_item");
public static final string_id SID_SPECIAL_SIGN_FAILED = new string_id("base_player", "special_sign_failed");
public static final string_id SID_SPECIAL_SIGN_SUCCESS = new string_id("base_player", "special_sign_success");
public static final string_id SID_SPECIAL_SIGN_REVERT_SUCCESS = new string_id("base_player", "special_sign_revert_success");
public static final string_id SID_SPECIAL_SIGN_REMOVED = new string_id("base_player", "special_sign_removed");
public static final string_id SID_SPECIAL_SIGN_UI_TITLE = new string_id("base_player", "special_sign_ui_title");
public static final string_id SID_SPECIAL_SIGN_UI_PROMPT = new string_id("base_player", "special_sign_ui_prompt");
public static final string_id SID_REMOVE_SPCIAL_SIGN_TO_DESTROY = new string_id("player_structure", "remove_sign_before_structure_destroy");
public static final string_id SID_SPECIAL_SIGN_NO_TRANSFER = new string_id("player_structure", "remove_sign_before_structure_transfer");
public static final string_id SID_HALLOWEEN_SIGN_UPDATED = new string_id("player_structure", "halloween_sign_updated");
public static final string_id SID_ONLY_OWNER_CAN_REMOVE = new string_id("player_structure", "only_owner_can_remove_sign");
public static final String STF_FILE = "player_structure";
public static final String SELFPOWERED_DEED = "object/tangible/veteran_reward/harvester.iff";
public static final String SELFPOWERED_DEED_ELITE = "object/tangible/veteran_reward/harvester_elite.iff";
public static final int MAX_BASE_COUNT = 3;
public static final int HARVESTER_MAX_EXTRACTION_RATE = 70;
public static final int HARVESTER_MAX_HOPPER_SIZE = 600000;
public static final int DESTROY_RESULT_SUCCESS = 0;
public static final int DESTROY_RESULT_SUCCESS_SELFPOWERED = 1;
public static final int DESTROY_RESULT_FAIL_COULD_NOT_CREATE_DEED = 2;
public static final int DESTROY_RESULT_FAIL_COULD_NOT_DETERMINE_DEED_FOR_STRUCTURE = 3;
public static final int DESTROY_RESULT_FAIL_TARGET_CONTAINER_FULL = 4;
public static final int DESTROY_RESULT_FAIL_TARGET_CONTAINER_FULL_SELFPOWERED = 5;
public static final int DESTROY_RESULT_INVALID_STRUCTURE = 6;
public static final int DESTROY_RESULT_INVALID_STATIC_ITEM = 7;
public static final int DESTROY_RESULT_INVALID_CONTAINER = 8;
public static final int PLAYER_STRUCTURE_PRE_ABANDONED = 2;
public static final int PLAYER_STRUCTURE_ABANDONED = 1;
public static final int MAX_PACKUP_PER_DAY = 5;
public static final int NUM_NEEDED_PACKUP_FIRST_BADGE = 10;
public static final int NUM_NEEDED_PACKUP_SECOND_BADGE = 50;
public static final int NUM_NEEDED_PACKUP_THIRD_BADGE = 100;
public static final String ABANDONED_TEXT = "\\#ff0000 (Abandoned)\\#.";
public static final String CITY_ABANDONED_TEXT = "\\#ff0000 (Zoning Violation)\\#.";
public static final string_id MSG_STORAGE_OVER_CAP = new string_id(STF_FILE, "msg_over_cap");
public static final String OBJVAR_STRUCTURE_STORAGE_INCREASE = "structureChange.storageIncrease";
public static final String OBJVAR_STORAGE_AMOUNT = "increaseAmount";
public static final int STORAGE_AMOUNT_CAP = 5000;
public static final int STORAGE_AMOUNT_DECREASE_UNIT = 100;
public static final String NON_GENERIC_STORAGE_ITEM_OBJVAR = "nonGenericStorageType";
public static final String TCG_STATIC_ITEM_DEED_OBJVAR = "tcg.static_item_deed";
public static final String VAR_CITY_ABANDONED = "player_structure.city_abandoned";
public static final int PLAYER_STRUCTURE_CITY_ABANDONED = 1;
public static final int HOUSE_ITEMS_SEARCH_LOCKOUT = 5 * 60;
public static final string_id SID_NOT_CITY_ABANDONED = new string_id("city/city", "not_city_abandoned");
public static final string_id SID_NO_CITY = new string_id("city/city", "no_city_during_packup");
public static final string_id SID_GENERIC_CITY_PACKUP_ERROR = new string_id("city/city", "city_packup_generic_fail");
public static final string_id SID_MAYOR_PROTECTED = new string_id("city/city", "city_packup_mayor_protected");
private static final boolean STRUCTURE_FEES_DISABLED = utils.checkConfigFlag("GameServer", "disableStructureFees");
private static final int STRUCTURE_MAINTENANCE_HEARTBEAT = utils.getIntConfigSetting("GameServer", "maintenanceHeartbeat", 1800);
private static final boolean ENABLE_ABANDONED_STRUCTURES_SYSTEM = utils.checkConfigFlag("GameServer", "enableAbandonedHousePackup");
private static final boolean ALLOW_PACKING_ABANDONED_STRUCTURES = utils.checkConfigFlag("GameServer", "allowPlayersToPackAbandonedStructures");
public static final String VAR_ADMIN_ALL_CHARACTERS_ON_ACCOUNT = "player_structure.admin_all_characters";
public static obj_id createPlayerStructure(String template, obj_id owner, location loc, int rotation, dictionary deed_info) throws InterruptedException
{
if (template == null)
{
return null;
}
if (!isIdValid(owner))
{
return null;
}
if (loc == null)
{
return null;
}
if (!canPlaceGarage(loc, 120.0f, template))
{
sendSystemMessage(owner, new string_id(STF_FILE, "proximity_build_failed"));
return null;
}
obj_id structure = createObject(template, loc);
if (structure == null || structure == obj_id.NULL_ID)
{
return null;
}
setYaw(structure, (90 * rotation));
persistObject(structure);
initializeStructure(structure, owner, deed_info);
dictionary outparams = new dictionary();
outparams.put("rotation", rotation);
messageTo(structure, "createStructureObjects", outparams, 10.0f, false);
if (!isBuilding(structure))
{
if (!isCivic(structure))
{
attachScript(structure, SCRIPT_TERMINAL_STRUCTURE);
}
}
dictionary params = new dictionary();
params.put("structure_name", getNameStringId(structure));
messageTo(owner, "OnConstructionComplete", params, 30.0f, true);
CustomerServiceLog("playerStructure", "Structure " + structure + "(" + getName(structure) + ") placed by " + owner + " at location " + loc);
float ejectRange = dataTableGetFloat(PLAYER_STRUCTURE_DATATABLE, template, DATATABLE_COL_EJECT_RANGE);
if (ejectRange > 0.0f)
{
dictionary ejectmsg = new dictionary();
ejectmsg.put("sender", structure);
messageToRange(ejectRange, "handleEjection", ejectmsg, 1);
}
return structure;
}
public static obj_id createTemporaryStructure(obj_id deed, obj_id owner, location loc, int rot, float placementHeight) throws InterruptedException
{
if (!isIdValid(deed) || !exists(deed) || deed == null || deed == obj_id.NULL_ID)
{
return null;
}
if (!isIdValid(owner))
{
return null;
}
if (loc == null)
{
return null;
}
int max_extraction = -1;
int current_extraction = -1;
int max_hopper = -1;
if (hasObjVar(deed, VAR_DEED_MAX_EXTRACTION))
{
max_extraction = getIntObjVar(deed, VAR_DEED_MAX_EXTRACTION);
}
if (hasObjVar(deed, VAR_DEED_CURRENT_EXTRACTION))
{
current_extraction = getIntObjVar(deed, VAR_DEED_CURRENT_EXTRACTION);
}
if (hasObjVar(deed, VAR_DEED_MAX_HOPPER))
{
max_hopper = getIntObjVar(deed, VAR_DEED_MAX_HOPPER);
}
int storageIncrease = 0;
if (hasObjVar(deed, "structureChange.storageIncrease"))
{
storageIncrease = getIntObjVar(deed, "structureChange.storageIncrease");
}
float surplusPower = getFloatObjVar(deed, VAR_DEED_SURPLUS_POWER);
int maintPool = getIntObjVar(deed, VAR_DEED_SURPLUS_MAINTENANCE);
if (maintPool > 0)
{
CustomerServiceLog("playerStructure", "Deed " + deed + " with suplus maintenance used. Amount: " + maintPool + ". Owner is %TU.", owner, null);
}
String template = getDeedTemplate(deed);
if (template == null)
{
return null;
}
int build_time = getDeedBuildTime(deed);
if (build_time == -1)
{
return null;
}
String deed_template = getTemplateName(deed);
String scene = getDeedScene(deed);
String cityName = getStringObjVar(deed, "cityName");
if (!destroyObject(deed))
{
return null;
}
int idx = getStructureTableIndex(template);
if (idx == -1)
{
return null;
}
loc.y = getHeightAtLocation(loc.x, loc.z);
obj_id structure = createObject(dataTableGetString(PLAYER_STRUCTURE_DATATABLE, idx, DATATABLE_COL_TEMP_STRUCTURE), loc);
if (!isIdValid(structure))
{
structure = createObject("object/building/player/construction_structure.iff", loc);
if (!isIdValid(structure))
{
return null;
}
}
persistObject(structure);
setYaw(structure, (rot * 90));
int time_stamp = getGameTime();
setObjVar(structure, VAR_DEED_BUILDTIME, build_time);
setObjVar(structure, VAR_DEED_TIMESTAMP, time_stamp);
String owner_name = getPlayerName(owner);
addStructure(structure, template, localize(getNameStringId(structure)), loc, owner, owner_name, true, true);
int maintenance_mod = getSkillStatMod(owner, "structure_maintenance_mod");
int factory_mod = getSkillStatMod(owner, "factory_efficiency");
dictionary deed_info = new dictionary();
deed_info.put("template", deed_template);
deed_info.put("build_time", build_time);
deed_info.put("owner_name", owner_name);
if (storageIncrease > 0)
{
deed_info.put("structure_storage", storageIncrease);
}
if (surplusPower > 0)
{
deed_info.put("power", surplusPower);
}
if (maintPool > 0)
{
deed_info.put("maintenance_pool", maintPool);
}
setObjVar(structure, VAR_TEMP_TEMPLATE, template);
setObjVar(structure, VAR_TEMP_OWNER, owner);
setObjVar(structure, VAR_TEMP_OWNER_NAME, owner_name);
setObjVar(structure, VAR_TEMP_ROTATION, rot);
setObjVar(structure, VAR_TEMP_PLACEMENT_HEIGHT, placementHeight);
setDeedTemplate(structure, deed_template);
setObjVar(structure, VAR_DEED_BUILDTIME, build_time);
setObjVar(structure, VAR_DEED_SCENE, scene);
if (cityName != null && !cityName.equals(""))
{
setObjVar(structure, "cityName", cityName);
deed_info.put("cityName", cityName);
}
String owner_faction = factions.getFaction(owner);
if (owner_faction != null && !owner_faction.equals(""))
{
deed_info.put("owner_faction", owner_faction);
setObjVar(structure, VAR_TEMP_OWNER_FACTION, owner_faction);
}
if (scene != null)
{
deed_info.put("scene", scene);
}
if (max_extraction != -1)
{
deed_info.put("max_extraction", max_extraction);
setObjVar(structure, VAR_DEED_MAX_EXTRACTION, max_extraction);
}
if (current_extraction != -1)
{
deed_info.put("current_extraction", current_extraction);
setObjVar(structure, VAR_DEED_CURRENT_EXTRACTION, current_extraction);
}
if (max_hopper != -1)
{
deed_info.put("max_hopper", max_hopper);
setObjVar(structure, VAR_DEED_MAX_HOPPER, max_hopper);
}
if (maintenance_mod > 0)
{
deed_info.put("maintenance_mod", maintenance_mod);
}
if (factory_mod > 0)
{
deed_info.put("factory_mod", factory_mod);
}
if (hasCommand(owner, "place_merchant_tent"))
{
deed_info.put("merchant_mod", MERCHANT_SALES_MODIFIER);
}
dictionary params = new dictionary();
params.put("template", template);
params.put("owner", owner);
params.put("deed_info", deed_info);
params.put("buildTime", build_time);
params.put("rotation", rot);
params.put("timestamp", time_stamp);
params.put("placementHeight", placementHeight);
messageTo(structure, "OnBuildingComplete", params, 5.0f, true);
return structure;
}
public static boolean createStructureObjects(obj_id structure, int rotation) throws InterruptedException
{
if (structure == obj_id.NULL_ID)
{
return false;
}
String sceneName = getCurrentSceneName();
int numItems;
if (dataTableOpen(PLAYER_STRUCTURE_DATATABLE))
{
numItems = dataTableGetNumRows(PLAYER_STRUCTURE_DATATABLE);
}
else
{
return false;
}
if (numItems == 0)
{
return false;
}
boolean object_set = false;
boolean object_mode = false;
obj_id object;
Vector base_object_list = new Vector();
base_object_list.setSize(0);
String buildingTemplate;
dictionary item;
String TEMPLATE;
float X;
float Y;
float Z;
float HEADING;
String CELL_NAME;
obj_id CELL_ID;
location s_loc;
float[] delta_trans;
location spot;
for (int i = 0; i < numItems; i++)
{
buildingTemplate = dataTableGetString(PLAYER_STRUCTURE_DATATABLE, i, DATATABLE_COL_STRUCTURE);
if (buildingTemplate.equals(getTemplateName(structure)))
{
object_mode = true;
continue;
}
if (object_mode)
{
if (buildingTemplate.length() != 0)
{
break;
}
item = dataTableGetRow(PLAYER_STRUCTURE_DATATABLE, i);
TEMPLATE = item.getString(DATATABLE_COL_OBJECT);
X = item.getFloat(DATATABLE_COL_X);
Y = item.getFloat(DATATABLE_COL_Y);
Z = item.getFloat(DATATABLE_COL_Z);
HEADING = item.getFloat(DATATABLE_COL_HEADING);
CELL_NAME = item.getString(DATATABLE_COL_CELL);
s_loc = getLocation(structure);
if (CELL_NAME.equals(WORLD_DELTA))
{
if (rotation != 0)
{
delta_trans = transformDeltaWorldCoord(X, Z, rotation);
X = delta_trans[0];
Z = delta_trans[1];
HEADING = HEADING + (rotation * 90);
if (HEADING > 360)
{
HEADING = HEADING - 360;
}
}
object = createObject(TEMPLATE, new location(s_loc.x - X, s_loc.y - Y, s_loc.z - Z, sceneName, obj_id.NULL_ID));
if (isCivic(structure))
{
setOwner(object, structure);
}
}
else
{
CELL_ID = getCellId(structure, CELL_NAME);
if (CELL_ID == null || CELL_ID == obj_id.NULL_ID)
{
continue;
}
else
{
spot = new location(X, Y, Z, sceneName, CELL_ID);
object = createObjectInCell(TEMPLATE, structure, CELL_NAME, spot);
}
}
if ((object != null) && (object != obj_id.NULL_ID))
{
setYaw(object, HEADING);
base_object_list = utils.addElement(base_object_list, object);
object_set = true;
}
}
}
if (!object_set)
{
return false;
}
else
{
if (base_object_list.size() > 0)
{
setObjVar(structure, VAR_BASE_OBJECT, base_object_list);
return true;
}
else
{
return false;
}
}
}
public static boolean initializeStructure(obj_id structure, obj_id owner, dictionary deed_info) throws InterruptedException
{
if (structure == obj_id.NULL_ID)
{
return false;
}
if (owner == obj_id.NULL_ID)
{
return false;
}
LOG("player_structure", "deed_info = " + deed_info.toString());
String template = getTemplateName(structure);
String owner_name = getPlayerName(owner);
if (owner_name == null)
{
return false;
}
String[] adminList = new String[1];
adminList[0] = owner.toString();
int decay_rate = 10;
int condition = 1000;
int civic = 0;
int city_rank = 0;
int city_cost = 0;
float power_rate = getBasePowerRate(structure);
int idx = getStructureTableIndex(template);
if (idx != -1) {
decay_rate = dataTableGetInt(PLAYER_STRUCTURE_DATATABLE, idx, DATATABLE_COL_DECAY_RATE);
condition = dataTableGetInt(PLAYER_STRUCTURE_DATATABLE, idx, DATATABLE_COL_CONDITION);
civic = dataTableGetInt(PLAYER_STRUCTURE_DATATABLE, idx, DATATABLE_COL_CIVIC);
city_rank = dataTableGetInt(PLAYER_STRUCTURE_DATATABLE, idx, DATATABLE_COL_CITY_RANK);
city_cost = dataTableGetInt(PLAYER_STRUCTURE_DATATABLE, idx, DATATABLE_COL_CITY_COST);
}
setOwner(structure, owner);
setObjVar(structure, VAR_OWNER, owner_name);
String owner_faction = deed_info.getString("owner_faction");
if (owner_faction != null && !owner_faction.equals(""))
{
factions.setFaction(structure, owner_faction);
}
String cityName = deed_info.getString("cityName");
if (cityName != null && !cityName.equals(""))
{
setObjVar(structure, "cityName", cityName);
}
setObjVar(structure, VAR_CIVIC, civic);
if (city_rank > 0)
{
setObjVar(structure, VAR_CITY_RANK, city_rank);
}
if (city_cost > 0)
{
setObjVar(structure, VAR_CITY_COST, city_cost);
}
setObjVar(structure, VAR_ADMIN_LIST, adminList);
permissionsAddAllowed(structure, owner_name);
setObjVar(structure, VAR_DECAY_RATE, decay_rate);
if (condition > 0)
{
setMaxHitpoints(structure, condition);
setInvulnerableHitpoints(structure, condition);
}
setObjVar(structure, VAR_VERSION, dataTableGetInt(PLAYER_STRUCTURE_DATATABLE, idx, DATATABLE_COL_VERSION));
if (isBuilding(structure))
{
setObjVar(structure, "healing.canhealwound", 1);
setObjVar(structure, "healing.canhealshock", 1);
setObjVar(structure, "safeLogout", 1);
}
int got = getGameObjectType(structure);
if (isInstallation(structure) && got != GOT_installation_turret)
{
String[] hopperList = new String[1];
hopperList[0] = owner.toString();
setObjVar(structure, VAR_HOPPER_LIST, hopperList);
if (got == GOT_installation_factory || got == GOT_installation_harvester)
{
if (deed_info.containsKey("power"))
{
setPowerValue(structure, deed_info.getFloat("power"));
}
else
{
setPowerValue(structure, 0.0f);
}
power_rate = expertiseModifyPowerRate(structure, owner, power_rate);
if (power_rate < 0)
{
power_rate = 0;
}
setPowerRate(structure, power_rate);
}
}
setDeedTemplate(structure, deed_info.getString("template"));
setObjVar(structure, VAR_DEED_BUILDTIME, deed_info.getInt("build_time"));
setObjVar(structure, VAR_DEED_SCENE, deed_info.getString("scene"));
if (deed_info.containsKey("current_extraction") && (isHarvester(structure) || isGenerator(structure)))
{
int expertiseExtractionIncrease = getSkillStatisticModifier(owner, "expertise_harvester_collection_increase");
int currentExtraction = deed_info.getInt("current_extraction");
int maxExtraction = deed_info.getInt("max_extraction");
setObjVar(structure, "current_extraction", currentExtraction);
setObjVar(structure, "max_extraction", maxExtraction);
if (expertiseExtractionIncrease > 0)
{
currentExtraction += (int)(currentExtraction * expertiseExtractionIncrease / 100.0f);
maxExtraction += (int)(maxExtraction * expertiseExtractionIncrease / 100.0f);
}
if (currentExtraction > HARVESTER_MAX_EXTRACTION_RATE)
{
currentExtraction = HARVESTER_MAX_EXTRACTION_RATE;
}
if (maxExtraction > HARVESTER_MAX_EXTRACTION_RATE)
{
maxExtraction = HARVESTER_MAX_EXTRACTION_RATE;
}
setCurrentExtractionRate(structure, currentExtraction);
setMaxExtractionRate(structure, maxExtraction);
}
if (deed_info.containsKey("max_hopper"))
{
int max_hopper = deed_info.getInt("max_hopper");
setObjVar(structure, VAR_DEED_MAX_HOPPER, max_hopper);
if (isHarvester(structure) || isGenerator(structure))
{
int expertiseHopperIncrease = getSkillStatisticModifier(owner, "expertise_havester_storage_increase");
if (expertiseHopperIncrease > 0)
{
max_hopper += (int)(max_hopper * expertiseHopperIncrease / 100.0f);
}
}
if (max_hopper > HARVESTER_MAX_HOPPER_SIZE)
{
max_hopper = HARVESTER_MAX_HOPPER_SIZE;
}
setMaxHopperAmount(structure, max_hopper);
}
if (deed_info.containsKey("maintenance_pool"))
{
int maintPool = deed_info.getInt("maintenance_pool");
transferBankCreditsFromNamedAccount(money.ACCT_STRUCTURE_DESTROYED, structure, maintPool, "noHandler", "noHandler", new dictionary());
CustomerServiceLog("playerStructure", "Structure " + structure + " was created with surplus maintenance. Amount: " + maintPool + ". Owner is %TU.", owner, null);
}
if (deed_info.containsKey("merchant_mod") && got != GOT_building_factional)
{
setObjVar(structure, VAR_MAINTENANCE_MOD_MERCHANT, deed_info.getFloat("merchant_mod"));
}
if (deed_info.containsKey("structure_storage"))
{
setObjVar(structure, "structureChange.storageIncrease", deed_info.getInt("structure_storage"));
}
if (civic == 1 || hasObjVar(structure, "force_public"))
{
permissionsMakePublic(structure);
}
else if (got != GOT_building_factional)
{
permissionsMakePrivate(structure);
}
attachScript(structure, SCRIPT_PERMANENT_STRUCTURE);
dictionary new_params = new dictionary();
new_params.put("structure", structure);
new_params.put("structure_name", localize(getNameStringId(structure)));
new_params.put("structure_loc", getLocation(structure));
new_params.put("template", template);
messageTo(owner, "OnAddStructure", new_params, 0, true);
dictionary params = new dictionary();
int time_stamp = getGameTime();
setObjVar(structure, VAR_LAST_MAINTANENCE, time_stamp);
if (civic == 0)
{
params.put("timestamp", time_stamp);
LOG("LOG_CHANNEL", "Messaging " + structure + " to run maintenance loop");
messageTo(structure, "OnMaintenanceLoop", params, 30, false);
}
return true;
}
public static float getBasePowerRate(obj_id structure) throws InterruptedException
{
int idx = getStructureTableIndex(getTemplateName(structure));
float power_rate = dataTableGetFloat(PLAYER_STRUCTURE_DATATABLE, idx, DATATABLE_COL_POWER_RATE);
if (power_rate < 0.0f)
{
power_rate = 0;
}
if (hasObjVar(structure, "selfpowered"))
{
power_rate = 0.0f;
}
return power_rate;
}
public static float expertiseModifyPowerRate(obj_id structure, obj_id owner, float power_rate) throws InterruptedException
{
if (!isIdValid(structure))
{
return power_rate;
}
if (power_rate <= 0)
{
return 0;
}
int got = getGameObjectType(structure);
int expertisePowerReduction = 0;
if (!isIdValid(owner) || !exists(owner))
{
if (got == GOT_installation_factory && hasObjVar(structure, VAR_POWER_MOD_FACTORY))
{
expertisePowerReduction = getIntObjVar(structure, VAR_POWER_MOD_FACTORY);
}
if (got == GOT_installation_harvester && hasObjVar(structure, VAR_POWER_MOD_HARVESTER))
{
expertisePowerReduction = getIntObjVar(structure, VAR_POWER_MOD_HARVESTER);
}
}
else
{
if (got == GOT_installation_factory)
{
expertisePowerReduction = getSkillStatisticModifier(owner, "expertise_factory_energy_decrease");
setObjVar(structure, VAR_POWER_MOD_FACTORY, expertisePowerReduction);
}
if (got == GOT_installation_harvester)
{
expertisePowerReduction = getSkillStatisticModifier(owner, "expertise_harvester_energy_decrease");
setObjVar(structure, VAR_POWER_MOD_HARVESTER, expertisePowerReduction);
}
}
if (expertisePowerReduction > 0)
{
power_rate -= (int)(power_rate * expertisePowerReduction / 100.0f);
}
return power_rate;
}
public static boolean addStructure(obj_id structure, String template, String structure_name, location structure_location, obj_id player, String player_name, boolean struct_loaded, boolean player_loaded) throws InterruptedException
{
if (structure == null || structure == obj_id.NULL_ID)
{
return false;
}
if (player == null || player == obj_id.NULL_ID)
{
return false;
}
String fp_template = getFootprintTemplate(template);
if (fp_template == null || fp_template.equals(""))
{
return false;
}
if (player_loaded)
{
int idx = getStructureTableIndex(template);
if (idx == -1)
{
return false;
}
int ignore_lots = dataTableGetInt(PLAYER_STRUCTURE_DATATABLE, idx, DATATABLE_COL_NO_LOT_REQ);
if (ignore_lots != 1)
{
int struct_lots = (getNumberOfLots(fp_template) / 4) - dataTableGetInt(PLAYER_STRUCTURE_DATATABLE, idx, DATATABLE_COL_LOT_REDUCTION);
if (struct_lots < 1)
{
struct_lots = 1;
}
flagConverted(template, structure);
if ((getAccountNumLots(getPlayerObject(player)) + struct_lots) > MAX_LOTS)
{
String realStructureTemplate = template;
if (exists(structure))
{
realStructureTemplate = getTemplateName(structure);
}
if ((realStructureTemplate != null) && (realStructureTemplate.length() > 0) && (realStructureTemplate.indexOf("object/building/player/player_house_") == 0))
{
setObjVar(player, "lotOverlimit.structure_id", structure);
if ((structure_name != null) && (structure_name.length() > 0))
{
setObjVar(player, "lotOverlimit.structure_name", structure_name);
}
if (structure_location != null)
{
setObjVar(player, "lotOverlimit.structure_location", localize(new string_id("planet_n", structure_location.area)) + " (" + (int)structure_location.x + ", " + (int)structure_location.z + ")");
}
setObjVar(player, "lotOverlimit.violation_time", getCalendarTime());
}
}
adjustLotCount(getPlayerObject(player), struct_lots);
}
}
if (struct_loaded)
{
setObjVar(structure, VAR_OWNER, getPlayerName(player));
setOwner(structure, player);
if (!isAdmin(structure, getPlayerName(player)))
{
modifyList(structure, getPlayerName(player), null, VAR_ADMIN_LIST, false);
}
}
city.addStructureToCity(structure);
return true;
}
public static boolean addStructure(obj_id structure, obj_id player) throws InterruptedException
{
return addStructure(
structure,
getTemplateName(structure),
localize(getNameStringId(structure)),
getWorldLocation(structure),
player,
getPlayerName(player),
true,
true
);
}
public static boolean removeStructure(obj_id structure, String template, obj_id player, String player_name, boolean struct_loaded, boolean player_loaded) throws InterruptedException
{
if (structure == null || structure == obj_id.NULL_ID)
{
return false;
}
if (player == null || player == obj_id.NULL_ID)
{
return false;
}
String fp_template = getFootprintTemplate(template);
if (fp_template == null || fp_template.equals(""))
{
return false;
}
if (player_loaded)
{
int idx = getStructureTableIndex(template);
if (idx == -1)
{
return false;
}
if (dataTableGetInt(PLAYER_STRUCTURE_DATATABLE, idx, DATATABLE_COL_NO_LOT_REQ) != 1)
{
int struct_lots = (getNumberOfLots(fp_template) / 4) - dataTableGetInt(PLAYER_STRUCTURE_DATATABLE, idx, DATATABLE_COL_LOT_REDUCTION);
if (struct_lots < 1)
{
struct_lots = 1;
}
CustomerServiceLog("playerStructure", "Structure " + template + " " + structure + "(" + ") REMOVED by " + player + " at location " + getLocation(player));
adjustLotCount(getPlayerObject(player), -struct_lots);
int current_lots = getAccountNumLots(getPlayerObject(player));
if (current_lots < 0)
{
adjustLotCount(getPlayerObject(player), -current_lots);
}
}
if (isResidence(structure, player))
{
setHouseId(player, obj_id.NULL_ID);
removeObjVar(structure, VAR_RESIDENCE_BUILDING);
city.removeCitizen(player, structure);
}
}
if (struct_loaded)
{
removeObjVar(structure, VAR_OWNER);
if (isAdmin(structure, getPlayerName(player)))
{
modifyList(structure, getPlayerName(player), null, VAR_ADMIN_LIST, false);
}
}
return true;
}
public static boolean removeStructure(obj_id structure, obj_id player) throws InterruptedException
{
return removeStructure(structure, getTemplateName(structure), player, getPlayerName(player), true, true);
}
public static boolean updateStructureVersion(obj_id structure) throws InterruptedException
{
if (!isIdValid(structure))
{
return false;
}
String template = getTemplateName(structure);
if (template == null)
{
return false;
}
if (getStructureTableIndex(template) == -1)
{
return false;
}
float yaw = getYaw(structure);
if (yaw < 0.0f)
{
yaw = yaw + 360.0f;
}
updateStructureData(structure);
createStructureObjects(structure, (int)(yaw + 1) / 90);
createStructureSign(structure);
return true;
}
public static boolean updateStructureData(obj_id structure) throws InterruptedException
{
if (!isIdValid(structure))
{
return false;
}
String template = getTemplateName(structure);
if (template == null)
{
return false;
}
int idx = getStructureTableIndex(template);
if (idx == -1)
{
return false;
}
dictionary row = dataTableGetRow(PLAYER_STRUCTURE_DATATABLE, idx);
int condition = row.getInt(DATATABLE_COL_CONDITION);
setObjVar(structure, VAR_DECAY_RATE, row.getInt(DATATABLE_COL_DECAY_RATE));
float power_rate = 0.0f;
if (!hasObjVar(structure, "selfpowered"))
{
power_rate = row.getFloat(DATATABLE_COL_POWER_RATE);
power_rate = expertiseModifyPowerRate(structure, null, power_rate);
}
setPowerRate(structure, power_rate);
if (condition > 0)
{
setMaxHitpoints(structure, condition);
if (getHitpoints(structure) == getMaxHitpoints(structure))
{
setInvulnerableHitpoints(structure, condition);
}
}
return true;
}
public static boolean canPlaceStructure(obj_id player, String template, location loc, obj_id deed) throws InterruptedException
{
int template_idx = getStructureTableIndex(template);
LOG("LOG_CHANNEL", "player_structure::canPlaceStructure -- template_idx ->" + template_idx);
if (template_idx == -1)
{
LOG("LOG_CHANNEL", "player_structure::OnObjectMenuSelect -- Unable to find template on datatable.");
return false;
}
String strPlanet = loc.area;
if (strPlanet == null)
{
return false;
}
if ((strPlanet.equals("yavin4")) || (strPlanet.equals("dathomir")) || (strPlanet.equals("endor")))
{
if (!template.contains("installation"))
{
sendSystemMessage(player, new string_id(STF_FILE, "cannot_use_deed_here"));
return false;
}
}
if (isIdValid(deed))
{
if (hasObjVar(deed, VAR_DEED_SCENE))
{
String scene = getCurrentSceneName();
String deed_scene = getDeedScene(deed);
String curScene;
boolean match = false;
java.util.StringTokenizer st = new java.util.StringTokenizer(deed_scene, ",");
while (st.hasMoreTokens())
{
curScene = st.nextToken();
if (scene.equals(curScene))
{
match = true;
break;
}
}
if (!match)
{
if (!isGod(player))
{
sendSystemMessage(player, new string_id(STF_FILE, "cannot_use_deed_here"));
return false;
}
else
{
sendSystemMessageTestingOnly(player, "God-Mode Placement Override: Structure is not native to this planet!");
}
}
}
}
if (hasScript(deed, "faction_perk.minefield.field_deed"))
{
sendSystemMessage(player, CANNOT_PLACE_MINEFIELD);
return false;
}
if (hasScript(deed, "faction_perk.turret.turret_deed"))
{
sendSystemMessage(player, CANNOT_PLACE_TURRET);
return false;
}
if (loc.cell != null && loc.cell != obj_id.NULL_ID)
{
sendSystemMessage(player, new string_id(STF_FILE, "not_inside"));
return false;
}
if (getRegionsWithBuildableAtPoint(loc, regions.BUILD_FALSE) != null)
{
sendSystemMessage(player, new string_id(STF_FILE, "not_permitted"));
return false;
}
if (!isGameObjectTypeOf(getGameObjectType(deed), GOT_data_house_control_device))
{
if (!canOwnStructure(template, player, true))
{
return false;
}
}
if (template.contains("cityhall"))
{
int cities_on_planet = 0;
String planet_name = getCurrentSceneName();
int[] city_ids = getAllCityIds();
location city_loc;
for (int city_id : city_ids) {
city_loc = cityGetLocation(city_id);
if (city_loc.area.equals(planet_name)) {
cities_on_planet++;
}
}
int max_cities = 0;
String[] planets = dataTableGetStringColumn("datatables/city/city_limits.iff", "SCENE");
for (int i = 0; i < planets.length; i++)
{
if (planets[i].equals(planet_name))
{
max_cities = dataTableGetInt("datatables/city/city_limits.iff", i, "MAX_CITIES");
break;
}
}
int godLevel = getGodLevel(player);
if (godLevel < 9)
{
if (cities_on_planet >= max_cities)
{
sendSystemMessage(player, new string_id(STF_FILE, "max_cities"));
return false;
}
}
int blocking_city = city.canBuildCityHere(player, loc);
if (blocking_city > -1)
{
sendSystemMessageProse(player, prose.getPackage(new string_id(STF_FILE, "city_too_close"), cityGetName(blocking_city)));
return false;
}
}
int city_rank_req = dataTableGetInt(PLAYER_STRUCTURE_DATATABLE, template_idx, DATATABLE_COL_CITY_RANK);
if (city_rank_req > 0)
{
int city_id = getCityAtLocation(loc, 0);
if (!cityExists(city_id))
{
sendSystemMessage(player, SID_BUILD_NO_CITY);
return false;
}
int city_rank = city.getCityRank(city_id);
if (city_rank < city_rank_req)
{
prose_package pp = prose.getPackage(SID_RANK_REQ, new string_id("city/city", "rank" + city_rank_req), city_rank_req);
sendSystemMessageProse(player, pp);
return false;
}
}
int city_id = getCityAtLocation(loc, 0);
if (cityExists(city_id) && city.isCityZoned(city_id) && isIdValid(player))
{
if (!city.hasZoningRights(player, city_id))
{
sendSystemMessage(player, SID_NO_RIGHTS);
return false;
}
}
if (dataTableGetInt(PLAYER_STRUCTURE_DATATABLE, template_idx, DATATABLE_COL_CIVIC) == 1)
{
int max_civic = city.getMaxCivicCount(city_id);
if (city.getCivicCount(city_id) >= max_civic)
{
sendSystemMessageProse(player, prose.getPackage(SID_CIVIC_COUNT, max_civic));
return false;
}
}
return true;
}
public static boolean canPlaceStructure(obj_id player, String template) throws InterruptedException
{
return canPlaceStructure(player, template, getLocation(player), null);
}
public static boolean canOwnStructure(String template, obj_id player, boolean allowOverLotLimitIfPlayerHouse) throws InterruptedException
{
if (player == null || player == obj_id.NULL_ID)
{
return false;
}
int idx = getStructureTableIndex(template);
if (idx == -1)
{
return false;
}
if (dataTableGetInt(PLAYER_STRUCTURE_DATATABLE, idx, DATATABLE_COL_NO_LOT_REQ) != 1)
{
int lots = getAccountNumLots(getPlayerObject(player));
int lots_needed = (getNumberOfLots(template) / 4) - dataTableGetInt(PLAYER_STRUCTURE_DATATABLE, idx, DATATABLE_COL_LOT_REDUCTION);
if (lots_needed < 1)
{
lots_needed = 1;
}
if (lots > MAX_LOTS)
{
sendSystemMessageProse(player, prose.getPackage(new string_id(STF_FILE, "not_enough_lots"), lots_needed));
return false;
}
if ((lots + lots_needed) > MAX_LOTS)
{
if (!allowOverLotLimitIfPlayerHouse || (template.indexOf("object/building/player/player_house_") != 0)) {
sendSystemMessageProse(player, prose.getPackage(new string_id(STF_FILE, "not_enough_lots"), lots_needed));
return false;
}
}
}
else if (isFactionPerkBase(template))
{
if (hasObjVar(player, "factionBaseCount"))
{
if (getIntObjVar(player, "factionBaseCount") > MAX_BASE_COUNT - 1)
{
sendSystemMessage(player, new string_id("faction_perk", "not_enough_base_units"));
getClusterWideData("gcw_player_base", "base_cwdata_manager*", true, player);
return false;
}
}
}
String skill_mod = dataTableGetString(PLAYER_STRUCTURE_DATATABLE, idx, DATATABLE_COL_SKILL_MOD);
if (skill_mod.length() > 0)
{
if (getSkillStatMod(player, skill_mod) < dataTableGetInt(PLAYER_STRUCTURE_DATATABLE, idx, DATATABLE_COL_SKILL_MOD_VALUE))
{
String msg = dataTableGetString(PLAYER_STRUCTURE_DATATABLE, idx, DATATABLE_COL_SKILL_MOD_MESSAGE);
if ((msg == null) || (msg.equals("")))
{
sendSystemMessage(player, new string_id(STF_FILE, "no_skill"));
}
else
{
sendSystemMessage(player, new string_id(STF_FILE, msg));
}
return false;
}
}
return true;
}
public static boolean canOwnStructure(obj_id structure, obj_id player) throws InterruptedException
{
if (structure == null || structure == obj_id.NULL_ID)
{
return false;
}
return canOwnStructure(getTemplateName(structure), player, false);
}
public static String getFootprintTemplate(String template) throws InterruptedException
{
if (template == null || template.equals(""))
{
return null;
}
String fp_template = dataTableGetString(PLAYER_STRUCTURE_DATATABLE, template, DATATABLE_COL_FOOTPRINT);
LOG("LOG_CHANNEL", "retrieved fp_template = " + fp_template);
if (fp_template == null || fp_template.equals(""))
{
return template;
}
return fp_template;
}
public static boolean canPlaceObject(obj_id structure, obj_id player) throws InterruptedException
{
if (structure == null || structure == obj_id.NULL_ID)
{
return false;
}
if (player == null || player == obj_id.NULL_ID)
{
return false;
}
if (!isAdmin(structure, player))
{
sendSystemMessage(player, new string_id(STF_FILE, "admin_only"));
return false;
}
return true;
}
public static boolean isInAdminRange(obj_id structure, obj_id player) throws InterruptedException
{
if (structure == null || structure == obj_id.NULL_ID)
{
return false;
}
if (player == null || player == obj_id.NULL_ID)
{
return false;
}
if (pclib.isContainedByPlayer(player, structure))
{
return true;
}
location loc_player = getLocation(player);
if (getTopMostContainer(loc_player.cell) == structure)
{
return true;
}
if (getLocation(structure).distance(loc_player) < getInstallationRange(structure))
{
return true;
}
else
{
sendSystemMessage(player, new string_id(STF_FILE, "too_far"));
return false;
}
}
public static float getInstallationRange(obj_id structure) throws InterruptedException
{
if (isCivic(structure))
{
return CIVIC_INSTALLATION_RANGE;
}
else
{
return INSTALLATION_RANGE;
}
}
public static String getDeedTemplate(obj_id deed) throws InterruptedException
{
if (!hasObjVar(deed, VAR_DEED_TEMPLATE))
{
if (hasObjVar(deed, VAR_DEED_TEMPLATE_CRC))
{
return getObjectTemplateName(getDeedTemplateCrc(deed));
}
return null;
}
return getStringObjVar(deed, VAR_DEED_TEMPLATE);
}
public static int getDeedTemplateCrc(obj_id deed) throws InterruptedException
{
return getIntObjVar(deed, VAR_DEED_TEMPLATE_CRC);
}
public static boolean setDeedTemplate(obj_id deed, String template) throws InterruptedException
{
if (!isIdValid(deed) || template == null || template.equals(""))
{
return false;
}
removeObjVar(deed, VAR_DEED_TEMPLATE);
return setObjVar(deed, VAR_DEED_TEMPLATE_CRC, getObjectTemplateCrc(template));
}
public static int getDeedBuildTime(obj_id deed) throws InterruptedException
{
if (!hasObjVar(deed, VAR_DEED_BUILDTIME))
{
return -1;
}
return getIntObjVar(deed, VAR_DEED_BUILDTIME);
}
public static String getDeedScene(obj_id deed) throws InterruptedException
{
if (!hasObjVar(deed, VAR_DEED_SCENE))
{
return null;
}
return getStringObjVar(deed, VAR_DEED_SCENE);
}
public static int getDeedMaxExtraction(obj_id deed) throws InterruptedException
{
if (!hasObjVar(deed, VAR_DEED_MAX_EXTRACTION))
{
return -1;
}
return getIntObjVar(deed, VAR_DEED_MAX_EXTRACTION);
}
public static int getDeedCurrentExtraction(obj_id deed) throws InterruptedException
{
if (!hasObjVar(deed, VAR_DEED_CURRENT_EXTRACTION))
{
return -1;
}
return getIntObjVar(deed, VAR_DEED_CURRENT_EXTRACTION);
}
public static int getDeedMaxHopper(obj_id deed) throws InterruptedException
{
if (!hasObjVar(deed, VAR_DEED_MAX_HOPPER))
{
return -1;
}
return getIntObjVar(deed, VAR_DEED_MAX_HOPPER);
}
public static String getStructureOwner(obj_id structure) throws InterruptedException
{
return getPlayerName(getOwner(structure));
}
public static obj_id getStructureOwnerObjId(obj_id structure) throws InterruptedException
{
return getOwner(structure);
}
public static int getMaintenanceRate(obj_id structure) throws InterruptedException
{
if (getIntObjVar(structure, VAR_CIVIC) == 1)
{
return 0;
}
int maint = getBaseMaintenanceRate(structure);
float merchant_mod = getMaintenanceMerchantMod(structure);
if (merchant_mod != 0.0f)
{
maint = Math.round(maint * (1.0f + merchant_mod));
}
float factory_mod = getMaintenanceFactoryMod(structure);
if (factory_mod != 0.0f)
{
maint -= Math.round(maint * (factory_mod / 100.0f));
}
float harvester_mod = getMaintenanceHarvesterMod(structure);
if (harvester_mod != 0.0f)
{
maint -= Math.round(maint * (harvester_mod / 100.0f));
}
int tax = getMaintenancePropertyTax(structure);
if (tax > 0)
{
maint += tax;
}
return maint;
}
public static int getBaseMaintenanceRate(obj_id structure) throws InterruptedException
{
return dataTableGetInt(PLAYER_STRUCTURE_DATATABLE, getStructureTableIndex(getTemplateName(structure)), DATATABLE_COL_MAINT_RATE);
}
public static int getRedeedCost(obj_id structure) throws InterruptedException
{
return dataTableGetInt(PLAYER_STRUCTURE_DATATABLE, getStructureTableIndex(getTemplateName(structure)), DATATABLE_COL_REDEED_COST);
}
public static float getMaintenanceMerchantMod(obj_id structure) throws InterruptedException
{
if (!isIdValid(structure))
{
return 0.0f;
}
return getFloatObjVar(structure, VAR_MAINTENANCE_MOD_MERCHANT);
}
public static float getMaintenanceFactoryMod(obj_id structure) throws InterruptedException
{
if (!isIdValid(structure))
{
return 0.0f;
}
return getFloatObjVar(structure, VAR_MAINTENANCE_MOD_FACTORY);
}
public static float getMaintenanceHarvesterMod(obj_id structure) throws InterruptedException
{
if (!isIdValid(structure))
{
return 0.0f;
}
return getFloatObjVar(structure, VAR_MAINTENANCE_MOD_HARVESTER);
}
public static int getMaintenancePropertyTax(obj_id structure) throws InterruptedException
{
if (!isIdValid(structure))
{
return -1;
}
int maint = getBaseMaintenanceRate(structure);
if (maint > 0)
{
return Math.round(maint * city.getPropertyTax(structure) / 100.0f);
}
return 0;
}
public static int getMaintenancePool(obj_id structure) throws InterruptedException
{
return getBankBalance(structure);
}
public static int getDecayRate(obj_id structure) throws InterruptedException
{
return getIntObjVar(structure, VAR_DECAY_RATE);
}
public static int getStructureCondition(obj_id structure) throws InterruptedException
{
return getHitpoints(structure);
}
public static int getMaxCondition(obj_id structure) throws InterruptedException
{
return getMaxHitpoints(structure);
}
public static int getMaxExtraction(obj_id structure) throws InterruptedException
{
if (!hasObjVar(structure, VAR_MAX_EXTRACTION))
{
return -1;
}
return getIntObjVar(structure, VAR_MAX_EXTRACTION);
}
public static int getCurrentExtraction(obj_id structure) throws InterruptedException
{
if (!hasObjVar(structure, VAR_CURRENT_EXTRACTION))
{
return -1;
}
return getIntObjVar(structure, VAR_CURRENT_EXTRACTION);
}
public static int getMaxHopper(obj_id structure) throws InterruptedException
{
if (!hasObjVar(structure, VAR_MAX_HOPPER))
{
return -1;
}
return getIntObjVar(structure, VAR_MAX_HOPPER);
}
public static int getStructureVersion(obj_id structure) throws InterruptedException
{
return getIntObjVar(structure, VAR_VERSION);
}
public static obj_id getResidence(obj_id player) throws InterruptedException
{
if (player == null || player == obj_id.NULL_ID)
{
return null;
}
return getHouseId(player);
}
public static int getStructureNumItems(obj_id structure) throws InterruptedException
{
if (structure == null || structure == obj_id.NULL_ID)
{
return -1;
}
return getIntObjVar(structure, "itemLimit");
}
public static obj_id[] getStructureBaseObjects(obj_id structure) throws InterruptedException
{
if (structure == null || structure == obj_id.NULL_ID)
{
return null;
}
return getObjIdArrayObjVar(structure, VAR_BASE_OBJECT);
}
public static String[] getEntryList(obj_id structure) throws InterruptedException
{
if (!isIdValid(structure))
{
return null;
}
String[] fullEntryList = permissionsGetAllowed(structure);
List<String> cleanEntryList = new ArrayList<>();
for(String entry : fullEntryList)
{
if(entry.startsWith("guild:"))
{
cleanEntryList.add("guild:"+entry.substring(6));
continue;
}
if(entry.startsWith("city:"))
{
cleanEntryList.add("city:"+entry.substring(5));
continue;
}
if(entry.startsWith("faction:"))
{
cleanEntryList.add("faction:"+entry.substring(8));
continue;
}
if(!entry.startsWith("account:")) // do not show account: entries to players
{
cleanEntryList.add(entry);
}
}
return cleanEntryList.toArray(new String[0]);
}
public static String[] getCompleteEntryList(obj_id structure) throws InterruptedException
{
if (!isIdValid(structure))
{
return null;
}
return permissionsGetAllowed(structure);
}
public static boolean isNameOnEntryList(obj_id structure, String player_or_guild_name) throws InterruptedException
{
String[] entry_list = getCompleteEntryList(structure);
if (entry_list != null)
{
if (isNameOnPermissionList(entry_list, player_or_guild_name))
{
return true;
}
}
return false;
}
public static String[] getBanList(obj_id structure) throws InterruptedException
{
if (!isIdValid(structure))
{
return null;
}
return permissionsGetBanned(structure);
}
public static boolean isNameOnBanList(obj_id structure, String player_or_guild_name) throws InterruptedException
{
String[] ban_list = getBanList(structure);
if (ban_list != null)
{
if (isNameOnPermissionList(ban_list, player_or_guild_name))
{
return true;
}
}
return false;
}
public static String[] getAdminListRaw(obj_id structure) throws InterruptedException
{
if (!isIdValid(structure))
{
return null;
}
return getStringArrayObjVar(structure, VAR_ADMIN_LIST);
}
public static String[] getAdminListNames(obj_id structure) throws InterruptedException
{
return convertRawListToNames(getAdminListRaw(structure));
}
public static boolean isNameOnAdminList(obj_id structure, String player_or_guild_name) throws InterruptedException
{
if(isAdminToAccountEnabled(structure))
{
if(getPlayerStationId(getPlayerIdFromFirstName(player_or_guild_name)) == getPlayerStationId(getOwner(structure)))
{
return true;
}
}
String[] admin_list = getAdminListRaw(structure);
if (admin_list != null)
{
if (isNameOnRawList(admin_list, player_or_guild_name))
{
return true;
}
}
return false;
}
public static boolean adminListAddName(obj_id structure, String nameToAdd) throws InterruptedException
{
if (isIdValid(structure))
{
Vector adminList = getResizeableStringArrayObjVar(structure, VAR_ADMIN_LIST);
if (adminList == null)
{
adminList = new Vector();
}
if (addNameToRawList(adminList, nameToAdd))
{
if (adminList.size() > 0)
{
setObjVar(structure, VAR_ADMIN_LIST, adminList);
return true;
}
}
}
return false;
}
public static boolean adminListRemoveName(obj_id structure, String nameToRemove) throws InterruptedException
{
if (isIdValid(structure))
{
Vector adminList = getResizeableStringArrayObjVar(structure, VAR_ADMIN_LIST);
if (removeNameFromRawList(adminList, nameToRemove))
{
if (adminList.size() == 0)
{
removeObjVar(structure, VAR_ADMIN_LIST);
}
else
{
setObjVar(structure, VAR_ADMIN_LIST, adminList);
}
return true;
}
}
return false;
}
public static String[] getVendorList(obj_id structure) throws InterruptedException
{
if (!isIdValid(structure))
{
return null;
}
return new String[0];
}
public static String[] getHopperListRaw(obj_id structure) throws InterruptedException
{
if (!isIdValid(structure))
{
return null;
}
return getStringArrayObjVar(structure, VAR_HOPPER_LIST);
}
public static String[] getHopperListNames(obj_id structure) throws InterruptedException
{
return convertRawListToNames(getHopperListRaw(structure));
}
public static boolean isNameOnHopperList(obj_id structure, String player_or_guild_name) throws InterruptedException
{
String[] hopper_list = getHopperListRaw(structure);
if (hopper_list != null)
{
if (isNameOnRawList(hopper_list, player_or_guild_name))
{
return true;
}
}
return false;
}
public static boolean hopperListAddName(obj_id structure, String nameToAdd) throws InterruptedException
{
if (isIdValid(structure))
{
Vector hopperList = getResizeableStringArrayObjVar(structure, VAR_HOPPER_LIST);
if (hopperList == null)
{
hopperList = new Vector();
}
if (addNameToRawList(hopperList, nameToAdd))
{
if (hopperList.size() > 0)
{
setObjVar(structure, VAR_HOPPER_LIST, hopperList);
return true;
}
}
}
return false;
}
public static boolean hopperListRemoveName(obj_id structure, String nameToRemove) throws InterruptedException
{
if (isIdValid(structure))
{
Vector hopperList = getResizeableStringArrayObjVar(structure, VAR_HOPPER_LIST);
if (removeNameFromRawList(hopperList, nameToRemove))
{
if (hopperList.size() == 0)
{
removeObjVar(structure, VAR_HOPPER_LIST);
}
else
{
setObjVar(structure, VAR_HOPPER_LIST, hopperList);
}
return true;
}
}
return false;
}
public static obj_id getStructure(obj_id object) throws InterruptedException
{
location loc = getLocation(object);
obj_id structure = getContainedBy(loc.cell);
if ((structure == null) || (structure == obj_id.NULL_ID))
{
obj_id obj_owner = getOwner(object);
if (isInstallation(obj_owner) && isCivic(obj_owner))
{
return obj_owner;
}
if (isPlayer(object))
{
structure = getLookAtTarget(object);
if (!isInstallation(structure))
{
obj_id target = structure;
structure = obj_id.NULL_ID;
obj_id[] items = getObjectsInRange(loc, INSTALLATION_RANGE);
if (items == null)
{
return null;
}
obj_id[] base_objects;
for (obj_id item : items) {
if (isInstallation(item)) {
if (isAdmin(item, object)) {
base_objects = getObjIdArrayObjVar(item, "player_structure.base_objects");
if (base_objects != null && base_objects.length > 0) {
for (obj_id base_object : base_objects) {
if (base_object == target) {
return item;
}
}
}
if ((!isIdValid(structure)) || ((getLocation(item)).distance(loc) < (getLocation(structure)).distance(loc))) {
structure = item;
}
}
}
}
}
}
}
return structure;
}
public static obj_id[] getObjectsInBuilding(obj_id structure) throws InterruptedException
{
if (structure == null || structure == obj_id.NULL_ID)
{
return null;
}
if (!isBuilding(structure))
{
return null;
}
obj_id[] cells = getCellIds(structure);
Vector objects = new Vector();
objects.setSize(0);
if (cells != null)
{
obj_id[] cell_contents;
for (obj_id cell : cells) {
if (isIdValid(cell)) {
cell_contents = getContents(cell);
if (cell_contents.length > 0) {
objects = utils.concatArrays(objects, cell_contents);
}
}
}
}
obj_id[] _objects = new obj_id[0];
if (objects != null)
{
_objects = new obj_id[objects.size()];
objects.toArray(_objects);
}
return _objects;
}
public static obj_id[] getPlayersInBuilding(obj_id structure) throws InterruptedException
{
if (structure == null || structure == obj_id.NULL_ID)
{
return null;
}
if (!isBuilding(structure))
{
return null;
}
Vector players = new Vector();
players.setSize(0);
obj_id[] objects = getObjectsInBuilding(structure);
if (objects != null && objects.length > 0)
{
for (obj_id object : objects) {
if (isIdValid(object) && isPlayer(object)) {
players = utils.addElement(players, object);
}
}
}
obj_id[] _players = new obj_id[0];
if (players != null)
{
_players = new obj_id[players.size()];
players.toArray(_players);
}
return _players;
}
public static obj_id[] getPlayersNearInstallation(obj_id structure) throws InterruptedException
{
if (structure == null || structure == obj_id.NULL_ID)
{
return null;
}
Vector players = new Vector();
players.setSize(0);
obj_id[] items = getObjectsInRange(getLocation(structure), getInstallationRange(structure));
obj_id[] _players = new obj_id[0];
if (items != null)
{
for (obj_id item : items) {
if (isPlayer(item)) {
players = utils.addElement(players, item);
}
}
if (players != null) {
_players = new obj_id[players.size()];
}
else{
players = new Vector();
players.setSize(0);
}
}
players.toArray(_players);
return _players;
}
public static void confirmNoReclaimPlacement(obj_id deedOrScd, obj_id player, String template) throws InterruptedException
{
if (utils.hasScriptVar(deedOrScd, "noreclaim.pid"))
{
obj_id oldplayer = utils.getObjIdScriptVar(deedOrScd, "noreclaim.player");
utils.removeScriptVarTree(deedOrScd, "noreclaim");
if (isIdValid(oldplayer))
{
sui.closeSUI(oldplayer, utils.getIntScriptVar(deedOrScd, "noreclaim.pid"));
}
}
int pid = sui.msgbox(deedOrScd, player, utils.packStringId(SID_SUI_CONFIRM_PLACEMENT_PROMPT), sui.YES_NO, utils.packStringId(SID_SUI_CONFIRM_PLACEMENT_TITLE), "handleNoReclaimConfirm");
if (pid > -1)
{
utils.setScriptVar(deedOrScd, "noreclaim.pid", pid);
utils.setScriptVar(deedOrScd, "noreclaim.player", player);
utils.setScriptVar(deedOrScd, "noreclaim.deedOrScd", deedOrScd);
}
}
public static boolean tryQueueStructurePlacement(obj_id deedOrScd, obj_id player) throws InterruptedException
{
String template = player_structure.getDeedTemplate(deedOrScd);
if (!player_structure.canReclaimDeed(template))
{
if (!player_structure.isFactionPerkBase(template))
{
confirmNoReclaimPlacement(deedOrScd, player, template);
return false;
}
}
if (!player_structure.canPlaceGarage(getLocation(player), 200.0f, template))
{
sendSystemMessage(player, SID_CANNOT_BUILD_GARAGE_TOO_CLOSE);
return false;
}
if (!player_structure.canPlaceFactionPerkDeed(deedOrScd, player))
{
return false;
}
queueCommand(player, (123886506), deedOrScd, "", COMMAND_PRIORITY_DEFAULT);
return true;
}
public static boolean tryEnterPlacementMode(obj_id deedOrScd, obj_id player) throws InterruptedException
{
if (!isIdValid(deedOrScd))
{
return false;
}
if (!isGameObjectTypeOf(getGameObjectType(deedOrScd), GOT_deed) && !isGameObjectTypeOf(getGameObjectType(deedOrScd), GOT_data_house_control_device))
{
sendSystemMessage(player, new string_id("player_structure", "not_a_deed"));
return false;
}
String template = player_structure.getDeedTemplate(deedOrScd);
if (template == null)
{
return false;
}
location here = getLocation(player);
if (!player_structure.canPlaceStructure(player, template, here, deedOrScd))
{
return false;
}
String fp_template = player_structure.getFootprintTemplate(template);
if (!fp_template.equals(template))
{
if (!player_structure.canPlaceStructure(player, fp_template, here, null))
{
return false;
}
}
enterClientStructurePlacementMode(player, deedOrScd, fp_template);
return true;
}
public static boolean canPackBuilding(obj_id player, obj_id structure) throws InterruptedException
{
return !isCivic(structure) && !isHarvester(structure) && !isGenerator(structure) && isOwner(structure, player);
}
public static void packBuilding(obj_id player, obj_id structure) throws InterruptedException
{
utils.setScriptVar(player, "packup.structure", structure);
if (utils.hasScriptVar(player, "packup.suiconfirm"))
{
sui.closeSUI(player, utils.getIntScriptVar(player, "packup.suiconfirm"));
}
String stringId = vendor_lib.isVendorPackUpEnabled() ? "confirm_packup" : "confirm_packup_no_vendors";
if (isInstallation(structure))
{
stringId += "_factory";
}
if (!isOwner(structure, player))
{
stringId += "_abandoned";
}
utils.setScriptVar(player, "packup.suiconfirm", sui.msgbox(player, player, utils.packStringId(new string_id("sui", stringId)), sui.YES_NO, "msgConfirmHousePackup"));
}
public static void finalizePackUp(obj_id player, obj_id structure) throws InterruptedException
{
blog("player_structure.finalizePackUp init.");
final boolean isAbandoned = isAbandoned(structure);
blog("player_structure.finalizePackUp isAbandoned: " + isAbandoned);
obj_id structure_owner = getOwner(structure);
if (structure_owner != player && isAbandoned)
{
CustomerServiceLog("housepackup", "Structure (" + structure + ") was abandoned and was not being packed by Owner (" + getPlayerName(structure_owner) + ") " + structure_owner + ". A player ( " + getPlayerName(player) + " is packing this structure. Sending job to the Abandoned Structure Pack Up function.");
finalizeAbandonedStructurePackUp(player, structure);
return;
}
blog("player_structure.finalizePackUp PLAYER IS THE OWNER.");
if (!structure_owner.isLoaded() || !structure_owner.isAuthoritative())
{
CustomerServiceLog("housepackup", "Structure (" + structure + ") could not be packed by player/owner (" + getPlayerName(player) + ") OID (" + player + ") The cause: Player/owner -" + " isLoaded = " + player.isLoaded() + " isAuthoritative = " + player.isAuthoritative());
return;
}
CustomerServiceLog("housepackup", "Player/Owner " + getPlayerName(player) + " OID (" + player + ") is attempting to pack structure (" + structure + ",abandoned=" + isAbandoned + ") Structure is loaded and is Authoritative.");
if (!structure.isLoaded() || !structure.isAuthoritative())
{
blog("player_structure.finalizePackUp structure NOT LOADED or NOT AUTHORITATIVE.");
CustomerServiceLog("housepackup", "Structure (" + structure + ") could not be packed by player/owner (" + getPlayerName(player) + ") OID (" + player + ") because structure -" + " isLoaded = " + structure.isLoaded() + " isAuthoritative = " + structure.isAuthoritative());
return;
}
blog("player_structure.finalizePackUp getting datapad");
obj_id datapad = utils.getPlayerDatapad(player);
if (!isIdValid(datapad))
{
blog("player_structure.finalizePackUp datapad not valid.");
CustomerServiceLog("housepackup", "Structure (" + structure + ") could not be packed by player/owner (" + getPlayerName(player) + ") - datapad was not valid");
return;
}
blog("player_structure.finalizePackUp creating SCD");
obj_id scd = createObjectOverloaded("object/intangible/house/generic_house_control_device.iff", datapad);
if (!isIdValid(scd))
{
CustomerServiceLog("housepackup", "Structure (" + structure + ") could not be packed by player/owner (" + getPlayerName(player) + ") - scd was not valid");
return;
}
attachScript(scd, "structure.house_control_device");
if (player_structure.isFactory(structure) && isHarvesterActive(structure))
{
CustomerServiceLog("housepackup", "Structure (" + structure + ") was a factory that was active. Turning off factory for player/owner (" + getPlayerName(player) + ") OID (" + player + ")");
deactivate(structure);
}
obj_id[] players = getPlayersInBuilding(structure);
if (players != null)
{
blog("player_structure.finalizePackUp Players are in the building that is about to be packed.");
for (obj_id player1 : players) {
expelFromBuilding(player1);
}
}
String[] cells = getCellNames(structure);
if (cells != null)
{
obj_id owner;
obj_id contents[];
for (String cell : cells) {
contents = getContents(getCellId(structure, cell));
if (contents != null) {
for (obj_id content : contents) {
if (hasCondition(content, CONDITION_VENDOR)) {
owner = getObjIdObjVar(content, "vendor_owner");
if (!isIdValid(owner)) {
owner = getOwner(content);
}
vendor_lib.finalizePackUp(owner, content, player, isAbandoned);
}
if (isIdValid(content)) {
messageTo(content, "OnPack", null, 1.0f, false);
}
}
}
}
}
String structName = getStructureName(structure);
if (structName == null || structName.length() < 1)
{
structName = "Building";
}
if (hasObjVar(structure, VAR_WAYPOINT_STRUCTURE))
{
obj_id waypoint = getObjIdObjVar(structure, VAR_WAYPOINT_STRUCTURE);
if (isIdValid(waypoint))
{
destroyWaypointInDatapad(waypoint, structure_owner);
removeObjVar(structure, VAR_WAYPOINT_STRUCTURE);
}
}
destroyStructureSign(structure);
setName(scd, structName);
if (hasBeenDeclaredResidence(structure))
{
obj_id resident = getResidentPlayer(structure);
setHouseId(resident, obj_id.NULL_ID);
removeObjVar(structure, VAR_RESIDENCE_BUILDING);
int cityId = getCitizenOfCityId(resident);
if (cityId != 0)
{
cityRemoveCitizen(cityId, resident);
}
}
city.removeStructureFromCity(structure);
setDeedTemplate(scd, getTemplateName(structure));
if (hasObjVar(structure, VAR_DEED_SCENE))
{
setObjVar(scd, VAR_DEED_SCENE, getDeedScene(structure));
}
location where = getLocation(structure);
if (isIdValid(structure_owner) && exists(structure_owner))
{
obj_id lotOverlimitStructure = getObjIdObjVar(structure_owner, "lotOverlimit.structure_id");
if (isIdValid(lotOverlimitStructure) && (lotOverlimitStructure == structure))
{
setObjVar(structure_owner, "lotOverlimit.structure_location", "Datapad");
}
}
putIn(structure, scd);
if (!structure_owner.isLoaded())
{
final int maxDepth = isFactory(structure) ? 101 : 1;
moveToOfflinePlayerDatapadAndUnload(scd, structure_owner, maxDepth + 1);
fixLoadWith(structure, structure_owner, maxDepth);
}
CustomerServiceLog("housepackup", "Player/Owner " + getPlayerName(player) + " (" + player + ") packed structure (" + structure + ",abandoned=" + isAbandoned + "," + where.toString() + " into device (" + scd + ")");
}
public static void finalizeAbandonedStructurePackUp(obj_id player, obj_id structure) throws InterruptedException
{
blog("player_structure.finalizeAbandonedStructurePackUp init.");
final boolean isAbandoned = isAbandoned(structure);
if (!isAbandoned)
{
return;
}
obj_id structure_owner = getOwner(structure);
CustomerServiceLog("housepackup", "Player " + getPlayerName(player) + " (" + player + ") is attempting to pack structure (" + structure + ",abandoned=true) owned by player " + getPlayerName(structure_owner) + " (" + structure_owner + ")");
if (!structure.isLoaded() || !structure.isAuthoritative())
{
blog("player_structure.finalizeAbandonedStructurePackUp structure NOT LOADED or NOT AUTHORITATIVE.");
CustomerServiceLog("housepackup", "Structure (" + structure + ") could not be packed by player (" + getPlayerName(player) + ") structure -" + " isLoaded = " + structure.isLoaded() + " isAuthoritative = " + structure.isAuthoritative());
return;
}
obj_id datapad = utils.getPlayerDatapad(player);
if (!isIdValid(datapad))
{
blog("player_structure.finalizeAbandonedStructurePackUp datapad not valid.");
CustomerServiceLog("housepackup", "Structure (" + structure + ") could not be packed by player (" + getPlayerName(player) + ") - datapad was not valid");
return;
}
if (structure_owner.isLoaded() && structure_owner.isAuthoritative())
{
blog("player_structure.finalizeAbandonedStructurePackUp The owner is loaded in game.");
}
else if (!player.isLoaded() || !player.isAuthoritative())
{
blog("player_structure.finalizeAbandonedStructurePackUp The owner is NOT loaded in game and the player packing is not loaded or not authoritative.");
CustomerServiceLog("housepackup", "Structure (" + structure + ") could not be packed by player (" + getPlayerName(player) + ") player -" + " isLoaded = " + player.isLoaded() + " isAuthoritative = " + player.isAuthoritative());
return;
}
location where = getLocation(structure);
dictionary params = new dictionary();
params.put("structure", structure);
params.put("structure_owner", structure_owner);
blog("player_structure.finalizePackUp STRUCTURE WAS ABANDONED. Sending message back to player to send animation, tally success.");
messageTo(player, "callAirStrikePackAbandonedStructure", params, 0, false);
CustomerServiceLog("housepackup", "Player " + getPlayerName(player) + " (" + player + ") is ABOUT to pack abandoned structure (" + structure + ",abandoned=" + true + "," + where.toString() + ") owned by player " + getPlayerName(structure_owner) + " (" + structure_owner + ")");
}
public static void confirmCityAbandonedAndPack(obj_id structure, obj_id player) throws InterruptedException
{
if (!isIdValid(player))
{
if (hasObjVar(player, "qa.city_packup"))
{
sendSystemMessageTestingOnly(player, "Packup Failed to confirm due to player(you) Obj_ID being invalid");
}
LOG("sissynoid", "City Pack Up System - Player (" + player + ")" + getPlayerFullName(player) + " attempted to pack a structure(" + structure + "), but the Player ID is invalid");
CustomerServiceLog("city_house_packup", "City Pack Up System - Player (" + player + ")" + getPlayerFullName(player) + " attempted to pack a structure(" + structure + "), but the Player ID is invalid");
return;
}
if (!isIdValid(structure))
{
if (hasObjVar(player, "qa.city_packup"))
{
sendSystemMessageTestingOnly(player, "Packup Failed to confirm due to structure Obj_ID being invalid");
}
LOG("sissynoid", "City Pack Up System - Player (" + player + ")" + getPlayerFullName(player) + " attempted to pack a structure(" + structure + "), but the house ID is invalid");
CustomerServiceLog("city_house_packup", "City Pack Up System - Player (" + player + ")" + getPlayerFullName(player) + " attempted to pack a structure(" + structure + "), but the house ID is invalid");
sendSystemMessage(player, SID_GENERIC_CITY_PACKUP_ERROR);
return;
}
obj_id owner = getOwner(structure);
if (!isPlayer(owner))
{
if (hasObjVar(player, "qa.city_packup"))
{
sendSystemMessageTestingOnly(player, "Packup Failed to confirm due to owner Obj_ID not existing - he has likely been deleted.");
}
LOG("sissynoid", "City Pack Up System - Player (" + player + ")" + getPlayerFullName(player) + " attempted to pack structure(" + structure + ") but the owner(" + getOwner(structure) + ") Obj ID is not a player - Character has been deleted.");
CustomerServiceLog("city_house_packup", "City Pack Up System - Player (" + player + ")" + getPlayerFullName(player) + " attempted to pack structure(" + structure + ") but the owner(" + getOwner(structure) + ") Obj ID is not a player - Character has been deleted.");
sendSystemMessage(player, SID_GENERIC_CITY_PACKUP_ERROR);
return;
}
if (!isIdValid(owner))
{
if (hasObjVar(player, "qa.city_packup"))
{
sendSystemMessageTestingOnly(player, "Packup Failed to confirm due to invalid owner Obj_ID");
}
LOG("sissynoid", "City Pack Up System - Player (" + player + ")" + getPlayerFullName(player) + " attempted to pack structure(" + structure + ") owned by Player(" + getOwner(structure) + ") - but owner ID of the structure is invalid.");
CustomerServiceLog("city_house_packup", "City Pack Up System - Player (" + player + ")" + getPlayerFullName(player) + " attempted to pack structure(" + structure + ") owned by Player(" + getOwner(structure) + ") - but owner ID of the structure is invalid.");
sendSystemMessage(player, SID_GENERIC_CITY_PACKUP_ERROR);
return;
}
if ((getCalendarTime() - getPlayerLastLoginTime(owner)) < cityGetInactivePackupInactiveTimeSeconds())
{
if (hasObjVar(player, "qa.city_packup"))
{
sendSystemMessageTestingOnly(player, "Packup Failed to confirm due to the owner not being in violation (has not been logged out long enough)");
}
LOG("sissynoid", "City Pack Up System - Player (" + player + ")" + getPlayerFullName(player) + " attempted to pack structure(" + structure + ") owned by Player(" + getOwner(structure) + ") - but owner has not been offline for 90 days - Removing City Abandoned Flag.");
CustomerServiceLog("city_house_packup", "City Pack Up System - Player (" + player + ")" + getPlayerFullName(player) + " attempted to pack structure(" + structure + ") owned by Player(" + getOwner(structure) + ") - but owner has not been offline for 90 days - Removing City Abandoned Flag.");
player_structure.removeCityAbandoned(structure);
sendSystemMessage(player, SID_NOT_CITY_ABANDONED);
return;
}
int city_id = getCityAtLocation(getLocation(structure), 0);
if (!cityExists(city_id))
{
if (hasObjVar(player, "qa.city_packup"))
{
sendSystemMessageTestingOnly(player, "Packup Failed to confirm due to the offending structure no longer residing inside of a player city.");
}
LOG("sissynoid", "City Pack Up System - Player (" + player + ")" + getPlayerFullName(player) + " attempted to pack structure(" + structure + ") owned by Player(" + getOwner(structure) + ") but the structure is no longer in a valid Player City. Removing City Abandoned Tag.");
CustomerServiceLog("city_house_packup", "City Pack Up System - Player (" + player + ")" + getPlayerFullName(player) + " attempted to pack structure(" + structure + ") owned by Player(" + getOwner(structure) + ") but the structure is no longer in a valid Player City. Removing City Abandoned Tag.");
player_structure.removeCityAbandoned(structure);
sendSystemMessage(player, SID_NO_CITY);
return;
}
if (city.hasMayorProtectionFlag(owner, city_id))
{
if (hasObjVar(player, "qa.city_packup"))
{
sendSystemMessageTestingOnly(player, "Packup Failed to confirm due to the Mayor protecting this Player's House.");
}
LOG("sissynoid", "City Pack Up System - Player (" + player + ")" + getPlayerFullName(player) + " attempted to pack structure(" + structure + ") owned by Player(" + getOwner(structure) + ") - but owner is protected by the Mayor(" + cityGetLeader(city_id) + ") of City(" + city_id + ")");
CustomerServiceLog("city_house_packup", "City Pack Up System - Player (" + player + ")" + getPlayerFullName(player) + " attempted to pack structure(" + structure + ") owned by Player(" + getOwner(structure) + ") - but owner is protected by the Mayor(" + cityGetLeader(city_id) + ") of City(" + city_id + ")");
sendSystemMessage(player, SID_MAYOR_PROTECTED);
return;
}
if (player_structure.isOwner(structure, player))
{
if (hasObjVar(player, "qa.city_packup"))
{
sendSystemMessageTestingOnly(player, "Packup Failed to confirm due to YOU being the OWNER! (God Mode makes you the owner of everything - '/setGod 0' please)");
}
LOG("sissynoid", "City Pack Up System - Player (" + player + ")" + getPlayerFullName(player) + " attempted to pack his own structure - Removing City Abandoned Tag.");
CustomerServiceLog("city_house_packup", "City Pack Up System - Player (" + player + ")" + getPlayerFullName(player) + " attempted to pack his own structure - Removing City Abandoned Tag.");
player_structure.removeCityAbandoned(structure);
return;
}
if (!player_structure.isCityAbandoned(structure))
{
if (hasObjVar(player, "qa.city_packup"))
{
sendSystemMessageTestingOnly(player, "Packup Failed to confirm due to Structure no longer being CityAbandoned");
}
LOG("sissynoid", "City Pack Up System - Player (" + player + ")" + getPlayerFullName(player) + " attempted to pack this structure(" + structure + ") - but it is not abandoned - bail");
CustomerServiceLog("city_house_packup", "City Pack Up System - Player (" + player + ")" + getPlayerFullName(player) + " attempted to pack this structure(" + structure + ") - but it is not abandoned - bail");
sendSystemMessage(player, SID_NOT_CITY_ABANDONED);
return;
}
if (!player_structure.isCityPackupAuthoritative(player, structure))
{
if (hasObjVar(player, "qa.city_packup"))
{
sendSystemMessageTestingOnly(player, "Packup Failed to confirm due to Player and House being on different game servers.");
}
LOG("sissynoid", "City Pack Up System - Player (" + player + ")" + getPlayerFullName(player) + " attempted to pack this structure - but the structure(" + structure + ") is on a different server than the player.");
CustomerServiceLog("city_house_packup", "City Pack Up System - Player (" + player + ")" + getPlayerFullName(player) + " attempted to pack this structure - but the structure(" + structure + ") is on a different server than the player.");
sendSystemMessage(player, SID_GENERIC_CITY_PACKUP_ERROR);
return;
}
if (!player_structure.canPackStructureWithVendors(player, structure))
{
if (hasObjVar(player, "qa.city_packup"))
{
sendSystemMessageTestingOnly(player, "Packup Failed to confirm due to Server Vendor Config preventing Vendor Packups.");
}
LOG("sissynoid", "City Pack Up System - Player (" + player + ")" + getPlayerFullName(player) + " attempted to pack structure - but the structure(" + structure + ") can't be packed due to Vendors Config");
CustomerServiceLog("city_house_packup", "City Pack Up System - Player (" + player + ")" + getPlayerFullName(player) + " attempted to pack structure - but the structure(" + structure + ") can't be packed due to Vendors Config");
sendSystemMessage(player, SID_GENERIC_CITY_PACKUP_ERROR);
return;
}
LOG("sissynoid", "CHECKING NULL: SIGN CALL: HOUSE(" + structure + "), PLAYER(PACKER)(" + player + ")");
dictionary params = new dictionary();
params.put("house", structure);
params.put("player", player);
messageTo(player, "packUpCityAbandonedStructure", params, 1.0f, false);
}
public static void finalizeCityPackUp(obj_id player, obj_id structure) throws InterruptedException
{
LOG("sissynoid", "Entered: finalizeCityPackUp");
if (!isIdValid(player))
{
LOG("sissynoid", "finalizeCityPackUp - Player is Invalid");
return;
}
if (!isIdValid(structure))
{
LOG("sissynoid", "finalizeCityPackUp - Structure is Invalid");
return;
}
if (!isCityAbandoned(structure))
{
LOG("sissynoid", "finalizeCityPackUp - Is NOT CITY ABANDONED!");
CustomerServiceLog("city_house_packup", "City House Packup was called on Structure(" + structure + ") by player(" + player + ") but house was not City Abandoned!");
return;
}
int city_id = getCityAtLocation(getLocation(structure), 0);
if (!cityExists(city_id))
{
LOG("sissynoid", "finalizeCityPackUp: No Longer inside of a City - Remove isCityAbandoned!");
CustomerServiceLog("city_house_packup", "City House Packup was called on Structure(" + structure + ") by player(" + player + ") but house is no longer in a City - Removing isCityAbandoned Flag.");
removeCityAbandoned(structure);
return;
}
obj_id structure_owner = getOwner(structure);
CustomerServiceLog("city_house_packup", "Player " + getPlayerName(player) + " (" + player + ") is attempting to pack structure (" + structure + ", City Abandoned = " + isCityAbandoned(structure) + ") owned by player " + getPlayerName(structure_owner) + " (" + structure_owner + ")");
obj_id datapad = utils.getPlayerDatapad(player);
if (!isIdValid(datapad))
{
LOG("sissynoid", "finalizeCityPackUp: Datapad ID is Invalid");
CustomerServiceLog("city_house_packup", "Structure (" + structure + ") could not be packed by player (" + getPlayerName(player) + ") - datapad was not valid");
return;
}
if (!player_structure.isCityPackupAuthoritative(player, structure))
{
LOG("sissynoid", "finalizeCityPackUp: Player(Packer) is not Loaded or Authoritative");
CustomerServiceLog("city_house_packup", "'finalizeCityPackUp' - Structure (" + structure + ") could not be packed by player (" + getPlayerName(player) + ") player -" + " isLoaded(Player) = " + player.isLoaded() + " isAuthoritative(Player) = " + player.isAuthoritative() + " isLoaded(Structure) = " + structure.isLoaded() + " isAuthoritative(Structure) = " + structure.isAuthoritative());
return;
}
location where = getLocation(structure);
CustomerServiceLog("city_house_packup", "Player " + getPlayerName(player) + " (" + player + ") is ABOUT to pack abandoned structure (" + structure + ",abandoned=" + isCityAbandoned(structure) + "," + where.toString() + ") owned by player " + getPlayerName(structure_owner) + " (" + structure_owner + ")");
if (cityExists(city_id))
{
LOG("sissynoid", "Mailing Mayor");
obj_id mayor = cityGetLeader(city_id);
String mayor_name = cityGetCitizenName(city_id, mayor);
String structure_name = localize(getNameStringId(structure));
String ownerName = player_structure.getStructureOwner(structure);
LOG("sissynoid", "CHECKING MAIL FOR NULL: MAYOR(" + mayor + "), MAYOR_NAME(" + mayor_name + "), STRUCTURE_NAME(" + structure_name + "), STRUCTURE_OWNER(" + ownerName + ")");
prose_package pp = new prose_package();
prose.setStringId(pp, PACKUP_EMAIL_BODY);
prose.setTT(pp, ownerName);
prose.setTU(pp, structure_name);
utils.sendMail(PACKUP_EMAIL_TITLE, pp, mayor, "Galactic Housing Authority");
}
LOG("sissynoid", "checking for Null Value: PLAYER(" + player + "), STRUCTURE(" + structure + "), STRUCTURE_OWNER(" + structure_owner + ")");
dictionary params = new dictionary();
params.put("player", player);
params.put("structure", structure);
params.put("structure_owner", structure_owner);
messageTo(structure, "cityMoveStructureToSCD", params, 1.0f, false);
LOG("sissynoid", "Calling cityMoveStructureToSCD - Finally starting the packup procedure.");
}
public static int getPlayerPackUpMeritPoints(obj_id player) throws InterruptedException
{
int noMerit = 0;
if (!isValidId(player) || !exists(player))
{
return noMerit;
}
if (!hasObjVar(player, HOUSE_PACKUP_ARRAY_OBJVAR))
{
return noMerit;
}
int[] housePackingTally = getIntArrayObjVar(player, HOUSE_PACKUP_ARRAY_OBJVAR);
if (housePackingTally == null || housePackingTally.length != ARRAY_LENGTH_FOR_HOUSE_PACKUP)
{
return noMerit;
}
int currentAmountAvailable = housePackingTally[0];
if (currentAmountAvailable <= 0)
{
return noMerit;
}
return currentAmountAvailable;
}
public static boolean housePackingPointDecrease(obj_id player) throws InterruptedException
{
return housePackingPointDecrease(player, 1);
}
public static boolean housePackingPointDecrease(obj_id player, int changeAmount) throws InterruptedException
{
if (!isValidId(player) || !exists(player))
{
return false;
}
if (changeAmount == 0)
{
return false;
}
if (changeAmount < 0)
{
changeAmount = Math.abs(changeAmount);
}
if (!hasObjVar(player, HOUSE_PACKUP_ARRAY_OBJVAR))
{
return false;
}
int[] housePackingTally = getIntArrayObjVar(player, HOUSE_PACKUP_ARRAY_OBJVAR);
if (housePackingTally == null || housePackingTally.length != ARRAY_LENGTH_FOR_HOUSE_PACKUP)
{
return false;
}
int currentAmountAvailable = housePackingTally[0];
if (currentAmountAvailable <= 0)
{
return false;
}
if (currentAmountAvailable < changeAmount)
{
changeAmount = currentAmountAvailable;
}
for (int i = 0; i < changeAmount; i++)
{
housePackingTally[0]--;
}
setObjVar(player, HOUSE_PACKUP_ARRAY_OBJVAR, housePackingTally);
return true;
}
public static boolean housePackingPointIncrease(obj_id player) throws InterruptedException
{
return housePackingPointIncrease(player, 1);
}
public static boolean housePackingPointIncrease(obj_id player, int changeAmount) throws InterruptedException
{
blog("player_structure.housePackingPointIncrease init - changeAmount: " + changeAmount);
if (!isValidId(player) || !exists(player))
{
return false;
}
if (changeAmount <= 0)
{
return false;
}
if (!hasObjVar(player, HOUSE_PACKUP_ARRAY_OBJVAR))
{
blog("player_structure.housePackingPointIncrease HOUSE_PACKUP_ARRAY_OBJVAR first time today packing house");
int[] newPackUpTrackingArray = new int[ARRAY_LENGTH_FOR_HOUSE_PACKUP];
for (int i = 0; i < ARRAY_LENGTH_FOR_HOUSE_PACKUP; i++)
{
newPackUpTrackingArray[i] = 0;
}
setObjVar(player, HOUSE_PACKUP_ARRAY_OBJVAR, newPackUpTrackingArray);
}
int[] housePackUpTrackingArray = getIntArrayObjVar(player, HOUSE_PACKUP_ARRAY_OBJVAR);
if (housePackUpTrackingArray.length != ARRAY_LENGTH_FOR_HOUSE_PACKUP)
{
return false;
}
for (int s = 0; s < ARRAY_LENGTH_FOR_HOUSE_PACKUP; s++)
{
blog("player_structure.housePackingPointIncrease changing housePackUpTrackingArray[" + s + "] from: " + housePackUpTrackingArray[s]);
housePackUpTrackingArray[s] += changeAmount;
blog("to: " + housePackUpTrackingArray[s]);
}
setObjVar(player, HOUSE_PACKUP_ARRAY_OBJVAR, housePackUpTrackingArray);
if (!hasObjVar(player, HOUSE_PACKUP_DAILY_TALLY_OBJVAR))
{
setObjVar(player, HOUSE_PACKUP_DAILY_TALLY_OBJVAR, 1);
int resetTime = getGameTime() + player_structure.TIME_TO_NEXT_PACKUP;
blog("housePackingPointIncrease - resetting time to next packup: " + resetTime);
setObjVar(player, HOUSE_PACKUP_DAILY_TIMER_OBJVAR, resetTime);
}
else
{
int tally = getIntObjVar(player, HOUSE_PACKUP_DAILY_TALLY_OBJVAR);
tally += changeAmount;
setObjVar(player, HOUSE_PACKUP_DAILY_TALLY_OBJVAR, tally);
}
if (!badge.hasBadge(player, "house_packup_badge"))
{
if (housePackUpTrackingArray[1] >= player_structure.NUM_NEEDED_PACKUP_FIRST_BADGE)
{
badge.grantBadge(player, "house_packup_badge");
}
return true;
}
if (!badge.hasBadge(player, "house_packup_badge_master"))
{
if (housePackUpTrackingArray[1] >= player_structure.NUM_NEEDED_PACKUP_SECOND_BADGE)
{
badge.grantBadge(player, "house_packup_badge_master");
}
return true;
}
if (!badge.hasBadge(player, "house_packup_badge_mogul"))
{
if (housePackUpTrackingArray[1] >= player_structure.NUM_NEEDED_PACKUP_THIRD_BADGE)
{
badge.grantBadge(player, "house_packup_badge_mogul");
}
return true;
}
return true;
}
public static boolean hasBeenDeclaredResidence(obj_id structure) throws InterruptedException
{
return hasObjVar(structure, VAR_RESIDENCE_BUILDING);
}
public static obj_id getResidentPlayer(obj_id structure) throws InterruptedException
{
if (!hasBeenDeclaredResidence(structure))
{
return null;
}
return getObjIdObjVar(structure, VAR_RESIDENCE_BUILDING);
}
public static boolean replacePackedStructure(obj_id scd, obj_id owner, location loc, int rot, float placementHeight) throws InterruptedException
{
obj_id[] contents = getContents(scd);
if (contents.length != 1)
{
trace.log("housepackup", "%TU attempted to unpack a house, but the SCD did not contain one.", owner, trace.TL_CS_LOG | trace.TL_ERROR_LOG);
return false;
}
obj_id house = contents[0];
if (isIdValid(house))
{
String houseTemplateName = getTemplateName(house);
if ((houseTemplateName != null) && player_structure.isBuildingName(houseTemplateName))
{
loc.y = placementHeight;
}
}
if (!setLocation(house, loc))
{
return false;
}
if (isIdValid(owner) && exists(owner))
{
obj_id lotOverlimitStructure = getObjIdObjVar(owner, "lotOverlimit.structure_id");
if (isIdValid(lotOverlimitStructure) && (lotOverlimitStructure == house))
{
setObjVar(owner, "lotOverlimit.structure_location", localize(new string_id("planet_n", loc.area)) + " (" + (int)loc.x + ", " + (int)loc.z + ")");
}
}
if (hasObjVar(house, "packed_house.fix_contained_scene_ids"))
{
removeObjVar(house, "packed_house.fix_contained_scene_ids");
}
if (player_structure.isAbandoned(house))
{
removeObjVar(house, "player_structure.abandoned");
if (hasObjVar(house, "player_structure.name.original"))
{
setName(house, getObjVar(house, "player_structure.name.original").getStringData());
}
}
if (player_structure.isCityAbandoned(house))
{
removeObjVar(house, "player_structure.city_abandoned");
if (hasObjVar(house, "player_structure.name.original"))
{
setName(house, getObjVar(house, "player_structure.name.original").getStringData());
}
}
float rot_float = (90 * rot);
setYaw(house, rot_float);
persistObject(house);
createStructureSign(house, rot_float);
addStructureWaypoint(owner, loc, getStructureName(house), house);
city.addStructureToCity(house);
trace.log("housepackup", "%TU unpacked their house (" + house + ") from structure control device ( " + scd + ") to new location " + loc.toString(), owner, trace.TL_CS_LOG);
obj_id[] houseContents = trial.getAllObjectsInDungeon(house);
if(houseContents != null) {
for (obj_id houseContent : houseContents) {
messageTo(houseContent, "OnUnpack", null, 1.0f, false);
}
}
return true;
}
public static boolean hasVendors(obj_id structure) throws InterruptedException
{
String[] cells = getCellNames(structure);
if (cells != null)
{
obj_id contents[];
for (String cell : cells) {
contents = getContents(getCellId(structure, cell));
if (contents != null) {
for (obj_id content : contents) {
if (hasCondition(content, CONDITION_VENDOR)) {
return true;
}
}
}
}
}
return false;
}
public static boolean isBuilding(obj_id object) throws InterruptedException
{
return isGameObjectTypeOf(getGameObjectType(object), GOT_building);
}
public static boolean isBuildingName(String objectTemplateName) throws InterruptedException
{
return objectTemplateName.contains("building");
}
public static boolean isInstallation(obj_id object) throws InterruptedException {
return !(object == null || object == obj_id.NULL_ID) && isGameObjectTypeOf(getGameObjectType(object), GOT_installation);
}
public static boolean isGuildHall(obj_id object) throws InterruptedException
{
if (!isIdValid(object))
{
return false;
}
if (!isBuilding(object))
{
return false;
}
if (hasObjVar(object, VAR_IS_GUILD_HALL))
{
return true;
}
String templateName = getTemplateName(object);
return templateName.indexOf("guildhall") > 0 || templateName.indexOf("player_mustafar_house_lg") > 0 || templateName.indexOf("player_house_mustafar_lg") > 0;
}
public static boolean isCivic(obj_id object) throws InterruptedException {
return isIdValid(object) && exists(object) && getIntObjVar(object, VAR_CIVIC) == 1;
}
public static boolean isAbandoned(obj_id object) throws InterruptedException {
return isIdValid(object) && (getIntObjVar(object, VAR_ABANDONED) == PLAYER_STRUCTURE_ABANDONED);
}
public static void setAbandoned(obj_id object) throws InterruptedException
{
setObjVar(object, VAR_ABANDONED, PLAYER_STRUCTURE_ABANDONED);
}
public static boolean isPreAbandoned(obj_id object) throws InterruptedException {
return isIdValid(object) && (getIntObjVar(object, VAR_ABANDONED) == PLAYER_STRUCTURE_PRE_ABANDONED);
}
public static void setPreAbandoned(obj_id object) throws InterruptedException
{
setObjVar(object, VAR_ABANDONED, PLAYER_STRUCTURE_PRE_ABANDONED);
}
public static void setStructureAsNotAbandoned(obj_id object) throws InterruptedException
{
removeObjVar(object, VAR_ABANDONED);
}
public static boolean isCityAbandoned(obj_id object) throws InterruptedException {
return isIdValid(object) && hasObjVar(object, VAR_CITY_ABANDONED);
}
public static void setCityAbandoned(obj_id object) throws InterruptedException
{
if (!isIdValid(object))
{
return;
}
setObjVar(object, VAR_CITY_ABANDONED, PLAYER_STRUCTURE_CITY_ABANDONED);
}
public static void removeCityAbandoned(obj_id object) throws InterruptedException
{
if (!isIdValid(object))
{
return;
}
removeCityAbandonedTagFromHouse(object);
if (hasObjVar(object, VAR_CITY_ABANDONED))
{
removeObjVar(object, VAR_CITY_ABANDONED);
}
}
public static boolean isCityPackupAuthoritative(obj_id player, obj_id structure) throws InterruptedException {
return !(!player.isLoaded() || !player.isAuthoritative()) && !(!structure.isLoaded() || !structure.isAuthoritative());
}
public static void removeCityAbandonedTagFromHouse(obj_id structure) throws InterruptedException
{
LOG("sissynoid", "Removing Zoning Violation Text.");
if (!isIdValid(structure))
{
return;
}
if (player_structure.isFactory(structure))
{
if (hasObjVar(structure, "player_structure.name.original"))
{
String signOriginal = getStringObjVar(structure, "player_structure.name.original");
setName(structure, signOriginal);
}
return;
}
if (!hasObjVar(structure, "player_structure.sign.id"))
{
LOG("playerStructure", "Structure(" + structure + ") at location [" + getLocation(structure).toString() + "] does not have a House Sign ObjVar");
return;
}
obj_id signId = getObjIdObjVar(structure, "player_structure.sign.id");
if(!isValidId(signId)){
LOG("playerStructure", "Structure (" + structure + ") at location [" + getLocation(structure).toString() + "] has an invalid value for player_structure.sign.id.");
return;
}
String signText = getName(signId);
if(signText == null){
LOG("playerStructure", "WARNING: Structure (" + structure + ") at location [" + getLocation(structure).toString() + "] has a sign (" + signId + "), but the sign name could not be retrieved.");
return;
}
int indexOfAbandonedText = signText.indexOf(player_structure.CITY_ABANDONED_TEXT);
if (indexOfAbandonedText > -1)
{
signText = signText.substring(0, indexOfAbandonedText);
setName(signId, signText);
LOG("sissynoid", "Removed Zoning Violation - New Text: " + signText);
}
}
public static void updateCityAbandonedFactoryName(obj_id factory) throws InterruptedException
{
if (player_structure.isFactory(factory))
{
LOG("sissynoid", "Factory - Updating Sign");
String assignedName = getAssignedName(factory);
if (!hasObjVar(factory, "player_structure.name.original"))
{
setObjVar(factory, "player_structure.name.original", assignedName == null ? "" : assignedName);
}
else
{
if (assignedName != null && assignedName.contains(player_structure.CITY_ABANDONED_TEXT))
{
assignedName = getStringObjVar(factory, "player_structure.name.original");
}
else
{
setObjVar(factory, "player_structure.name.original", assignedName == null ? "" : assignedName);
}
}
if (assignedName == null || assignedName.length() == 0)
{
switch (getTemplateName(factory)) {
case "object/installation/manufacture/food_factory.iff":
assignedName = "Food and Chemical Factory";
break;
case "object/installation/manufacture/clothing_factory.iff":
assignedName = "Wearables Factory";
break;
case "object/installation/manufacture/weapon_factory.iff":
assignedName = "Equipment Factory";
break;
case "object/installation/manufacture/structure_factory.iff":
assignedName = "Structure Factory";
break;
default:
assignedName = "Factory";
break;
}
}
setName(factory, assignedName + player_structure.CITY_ABANDONED_TEXT);
}
}
public static boolean isCommercial(obj_id object) throws InterruptedException {
return isIdValid(object) && !isCivic(object) && getStructureCityRank(object) > 0;
}
public static int getStructureCityRank(obj_id object) throws InterruptedException
{
if (!isIdValid(object))
{
return 0;
}
return getIntObjVar(object, VAR_CITY_RANK);
}
public static int getStructureCityCost(obj_id object) throws InterruptedException
{
if (!isIdValid(object))
{
return 0;
}
return getIntObjVar(object, VAR_CITY_COST);
}
public static boolean isCivicTemplate(String template) throws InterruptedException
{
String[] structures = dataTableGetStringColumn(PLAYER_STRUCTURE_DATATABLE, "STRUCTURE");
for (int i = 0; i < structures.length; i++)
{
if (structures[i].equals(template))
{
return dataTableGetInt(PLAYER_STRUCTURE_DATATABLE, i, "CIVIC") == 1;
}
}
return false;
}
public static boolean isShuttleportTemplate(String template) throws InterruptedException
{
String[] structures = dataTableGetStringColumn(PLAYER_STRUCTURE_DATATABLE, "STRUCTURE");
for (int i = 0; i < structures.length; i++)
{
if (structures[i].equals(template))
{
return dataTableGetInt(PLAYER_STRUCTURE_DATATABLE, i, "SHUTTLEPORT") == 1;
}
}
return false;
}
public static boolean isCloneTemplate(String template) throws InterruptedException
{
String[] structures = dataTableGetStringColumn(PLAYER_STRUCTURE_DATATABLE, "STRUCTURE");
for (int i = 0; i < structures.length; i++)
{
if (structures[i].equals(template))
{
return dataTableGetInt(PLAYER_STRUCTURE_DATATABLE, i, "CLONE_FACILITY") == 1;
}
}
return false;
}
public static boolean isGarageTemplate(String template) throws InterruptedException
{
String[] structures = dataTableGetStringColumn(PLAYER_STRUCTURE_DATATABLE, "GARAGE");
for (int i = 0; i < structures.length; i++)
{
if (structures[i].equals(template))
{
return dataTableGetInt(PLAYER_STRUCTURE_DATATABLE, i, "GARAGE") == 1;
}
}
return false;
}
public static boolean isFactory(obj_id object) throws InterruptedException {
return !(object == null || object == obj_id.NULL_ID) && getGameObjectType(object) == GOT_installation_factory;
}
public static boolean isHarvester(obj_id object) throws InterruptedException {
return !(object == null || object == obj_id.NULL_ID) && getGameObjectType(object) == GOT_installation_harvester;
}
public static boolean isGenerator(obj_id object) throws InterruptedException {
return !(object == null || object == obj_id.NULL_ID) && getGameObjectType(object) == GOT_installation_generator;
}
public static boolean isAdmin(obj_id structure, String player_or_guild_name) throws InterruptedException
{
if (!isIdValid(structure))
{
return false;
}
String[] admin_list = getAdminListRaw(structure);
if (admin_list != null)
{
return isNameOnRawList(admin_list, player_or_guild_name);
}
return false;
}
public static boolean isAdmin(obj_id structure, obj_id player) throws InterruptedException
{
if (!isIdValid(structure))
{
return false;
}
if (!isIdValid(player))
{
return false;
}
if (isGod(player))
{
return true;
}
String player_name = getPlayerName(player);
boolean admin = isAdmin(structure, player_name) || isAdminByAccountFlag(structure, player);
if (!admin)
{
if (isOwner(structure, player))
{
setObjVar(structure, VAR_OWNER, player_name);
modifyList(structure, player_name, null, VAR_ADMIN_LIST, false);
return true;
}
}
return admin;
}
public static boolean isAdminByAccountFlag(obj_id structure, obj_id player) throws InterruptedException
{
if(hasObjVar(structure, VAR_ADMIN_ALL_CHARACTERS_ON_ACCOUNT))
{
return (getPlayerStationId(getOwner(structure)) == getPlayerStationId(player));
}
return false;
}
public static boolean isVendor(obj_id structure, String player_name) throws InterruptedException
{
if (structure == null || structure == obj_id.NULL_ID)
{
return false;
}
String[] vendor_list = getVendorList(structure);
if (vendor_list != null)
{
for (String vendor : vendor_list) {
if (player_name.toUpperCase().equals(vendor.toUpperCase())) {
return true;
}
}
}
return false;
}
public static boolean isVendor(obj_id structure, obj_id player) throws InterruptedException {
return isIdValid(player) && isVendor(structure, getPlayerName(player));
}
public static boolean canEnter(obj_id structure, String player_or_guild_name) throws InterruptedException
{
if (!isIdValid(structure))
{
return false;
}
String[] entry_list = getCompleteEntryList(structure);
if (entry_list != null)
{
if (isNameOnPermissionList(entry_list, player_or_guild_name))
{
return true;
}
}
return false;
}
public static boolean canEnter(obj_id structure, obj_id player) throws InterruptedException {
return isIdValid(player) && canEnter(structure, getPlayerName(player));
}
public static boolean canHopper(obj_id structure, String player_or_guild_name) throws InterruptedException
{
if (!isIdValid(structure))
{
return false;
}
String[] hopper_list = getHopperListRaw(structure);
if (hopper_list != null)
{
if (isNameOnRawList(hopper_list, player_or_guild_name))
{
return true;
}
}
return false;
}
public static boolean canHopper(obj_id structure, obj_id player) throws InterruptedException {
return isIdValid(player) && canHopper(structure, getPlayerName(player));
}
public static boolean isBanned(obj_id structure, String player_or_guild_name) throws InterruptedException
{
if (!isIdValid(structure))
{
return false;
}
String[] ban_list = getBanList(structure);
if (ban_list != null)
{
if (isNameOnPermissionList(ban_list, player_or_guild_name))
{
return true;
}
}
return false;
}
public static boolean isBanned(obj_id structure, obj_id player) throws InterruptedException {
return isIdValid(player) && isBanned(structure, getPlayerName(player));
}
public static boolean isOwner(obj_id structure, String player_name) throws InterruptedException {
return !(structure == null || structure == obj_id.NULL_ID) && (getStructureOwner(structure).toUpperCase()).equals(player_name.toUpperCase());
}
public static boolean isOwner(obj_id structure, obj_id player) throws InterruptedException {
return !(player == null || player == obj_id.NULL_ID) && (isGod(player) || getOwner(structure) == player);
}
public static boolean isResidence(obj_id structure, obj_id player) throws InterruptedException {
return !(structure == null || structure == obj_id.NULL_ID) && !(player == null || player == obj_id.NULL_ID) && getResidence(player) == structure;
}
public static boolean applyManagementMods(obj_id structure, dictionary mods) throws InterruptedException
{
if (structure == null || structure == obj_id.NULL_ID)
{
return false;
}
int mm = 0;
if (mods.containsKey("maintenance_mod"))
{
mm = mm + mods.getInt("maintenance_mod");
}
if (isFactory(structure))
{
if (mods.containsKey("factory_mod"))
{
mm = mm + mods.getInt("factory_mod");
}
}
if (mm > 0)
{
setObjVar(structure, VAR_MAINTENANCE_MOD, mm);
}
return true;
}
public static boolean applyManagementMods(obj_id structure, obj_id player) throws InterruptedException
{
if (player == null || player == obj_id.NULL_ID)
{
return false;
}
dictionary mods = new dictionary();
int maintenance_mod = getSkillStatMod(player, "structure_maintenance_mod");
if (maintenance_mod > 0)
{
mods.put("maintenance_mod", maintenance_mod);
}
if (isFactory(structure))
{
maintenance_mod += getSkillStatisticModifier(player, "expertise_factory_maintenance_decrease");
}
if (isHarvester(structure))
{
maintenance_mod += getSkillStatisticModifier(player, "expertise_harvester_maintenance_decrease");
}
if (getSkillStatMod(player, "factory_efficiency") > 0)
{
mods.put("factory_mod", maintenance_mod);
}
return applyManagementMods(structure, mods);
}
public static boolean applyManagementMods(obj_id structure, int mods) throws InterruptedException
{
if (!isIdValid(structure))
{
return false;
}
if (mods < 1)
{
return false;
}
dictionary mods_dict = new dictionary();
mods_dict.put("maintenance_mod", mods);
return applyManagementMods(structure, mods_dict);
}
public static boolean removeManagementMods(obj_id structure) throws InterruptedException
{
return true;
}
public static boolean isGuildIdOnRawList(String[] nameList, int guildId) throws InterruptedException {
return (nameList != null) && (guildId != 0) && (utils.getElementPositionInArray(nameList, "guild:" + guildId) != -1);
}
public static boolean isGuildNameOnRawList(String[] nameList, String guildNameToFind) throws InterruptedException {
return guildNameToFind != null && isGuildIdOnRawList(nameList, findGuild((guildNameToFind.trim()).toLowerCase()));
}
public static boolean isPlayerObjIdOnRawList(String[] nameList, obj_id playerObjId) throws InterruptedException {
return (nameList != null) && isIdValid(playerObjId) && (utils.getElementPositionInArray(nameList, playerObjId.toString()) != -1);
}
public static boolean isPlayerNameOnRawList(String[] nameList, String playerNameToFind) throws InterruptedException {
return playerNameToFind != null && isPlayerObjIdOnRawList(nameList, getPlayerIdFromFirstName((playerNameToFind.trim()).toLowerCase()));
}
public static boolean isNameOnRawList(String[] nameList, String nameToFind) throws InterruptedException
{
if (nameToFind != null)
{
if ((nameToFind.toLowerCase()).contains("guild:"))
{
return isGuildNameOnRawList(nameList, ((nameToFind.substring(6)).toLowerCase()).trim());
}
else
{
return isPlayerNameOnRawList(nameList, nameToFind);
}
}
return false;
}
public static boolean isNameOnPermissionList(String[] permissionList, String nameToFind) throws InterruptedException
{
if ((permissionList != null) && (nameToFind != null))
{
if ((nameToFind.toLowerCase()).contains("guild:"))
{
String guildName = ((nameToFind.substring(6)).toLowerCase()).trim();
int guildId = findGuild(guildName);
String permissionListGuildName;
for (String aPermissionList : permissionList) {
if ((aPermissionList.toLowerCase()).contains("guild:")) {
permissionListGuildName = ((aPermissionList.substring(6)).toLowerCase()).trim();
if (guildId == 0) {
if (guildName.equals(permissionListGuildName)) {
return true;
}
} else {
if (guildId == findGuild(permissionListGuildName)) {
return true;
}
}
}
}
}
else
{
String playerName = (nameToFind.toLowerCase()).trim();
for (String aPermissionList : permissionList) {
if (((aPermissionList.toLowerCase()).trim()).equals(playerName)) {
return true;
}
}
}
}
return false;
}
public static boolean addGuildIdToRawList(Vector nameList, int guildId) throws InterruptedException
{
if (guildId != 0)
{
if (nameList == null)
{
return false;
}
String guildIdAsString = "guild:" + guildId;
if (utils.getElementPositionInArray(nameList, guildIdAsString) == -1)
{
nameList.add(guildIdAsString);
return true;
}
return true;
}
return false;
}
public static boolean addGuildNameToRawList(Vector nameList, String guildNameToAdd) throws InterruptedException {
return guildNameToAdd != null && addGuildIdToRawList(nameList, findGuild((guildNameToAdd.trim()).toLowerCase()));
}
public static boolean addPlayerObjIdToRawList(Vector nameList, obj_id playerObjId) throws InterruptedException
{
if (isIdValid(playerObjId))
{
if (nameList == null)
{
return false;
}
String playerObjIdAsString = playerObjId.toString();
if (utils.getElementPositionInArray(nameList, playerObjIdAsString) == -1)
{
nameList.add(playerObjIdAsString);
return true;
}
}
return false;
}
public static boolean addPlayerNameToRawList(Vector nameList, String playerNameToAdd) throws InterruptedException {
return playerNameToAdd != null && addPlayerObjIdToRawList(nameList, getPlayerIdFromFirstName((playerNameToAdd.trim()).toLowerCase()));
}
public static boolean addNameToRawList(Vector nameList, String nameToAdd) throws InterruptedException
{
if (nameToAdd != null)
{
if ((nameToAdd.toLowerCase()).contains("guild:"))
{
return addGuildNameToRawList(nameList, ((nameToAdd.substring(6)).toLowerCase()).trim());
}
else
{
return addPlayerNameToRawList(nameList, nameToAdd);
}
}
return false;
}
public static boolean removeGuildIdFromRawList(Vector nameList, int guildId) throws InterruptedException
{
if ((nameList != null) && (guildId != 0))
{
int deleteIndex = utils.getElementPositionInArray(nameList, "guild:" + guildId);
if (deleteIndex != -1)
{
nameList.remove(deleteIndex);
return true;
}
}
return false;
}
public static boolean removeGuildNameFromRawList(Vector nameList, String guildNameToRemove) throws InterruptedException {
return guildNameToRemove != null && removeGuildIdFromRawList(nameList, findGuild((guildNameToRemove.trim()).toLowerCase()));
}
public static boolean removePlayerObjIdFromRawList(Vector nameList, obj_id playerObjId) throws InterruptedException
{
if ((nameList != null) && isIdValid(playerObjId))
{
int deleteIndex = utils.getElementPositionInArray(nameList, playerObjId.toString());
if (deleteIndex != -1)
{
nameList.remove(deleteIndex);
return true;
}
}
return false;
}
public static boolean removePlayerNameFromRawList(Vector nameList, String playerNameToRemove) throws InterruptedException {
return playerNameToRemove != null && removePlayerObjIdFromRawList(nameList, getPlayerIdFromFirstName((playerNameToRemove.trim()).toLowerCase()));
}
public static boolean removeNameFromRawList(Vector nameList, String nameToRemove) throws InterruptedException
{
if (nameToRemove != null)
{
if ((nameToRemove.toLowerCase()).contains("guild:"))
{
return removeGuildNameFromRawList(nameList, ((nameToRemove.substring(6)).toLowerCase()).trim());
}
else
{
return removePlayerNameFromRawList(nameList, nameToRemove);
}
}
return false;
}
public static String[] convertRawListToNames(String[] nameListToConvert) throws InterruptedException
{
Vector converted_list = new Vector();
converted_list.setSize(0);
if (nameListToConvert != null)
{
int guildId;
obj_id player;
String player_full_name;
StringTokenizer st;
for (String aNameListToConvert : nameListToConvert) {
if ((aNameListToConvert.toLowerCase()).contains("guild:")) {
guildId = utils.stringToInt(((aNameListToConvert.substring(6)).toLowerCase()).trim());
if (guildId > 0) {
String guildAbbrev = guildGetAbbrev(guildId);
if ((guildAbbrev != null) && (!guildAbbrev.equals(""))) {
converted_list.add("Guild: " + guildAbbrev);
}
}
} else {
player = utils.stringToObjId(aNameListToConvert);
if (isIdValid(player)) {
player_full_name = getPlayerFullName(player);
if (player_full_name != null) {
st = new StringTokenizer(player_full_name);
if (st.hasMoreTokens()) {
converted_list.add(st.nextToken());
}
}
}
}
}
}
String[] _converted_list = new String[converted_list.size()];
converted_list.toArray(_converted_list);
return _converted_list;
}
public static boolean modifyList(obj_id structure, String player_or_guild_name, obj_id admin, String objvar, boolean verbose) throws InterruptedException
{
if (!isIdValid(structure))
{
return false;
}
if (!isIdValid(admin) && verbose)
{
return false;
}
if (isIdValid(admin))
{
if (!isAdmin(structure, admin))
{
if (verbose)
{
sendSystemMessage(admin, new string_id(STF_FILE, "must_be_admin"));
}
return false;
}
}
if (player_or_guild_name == null)
{
return false;
}
boolean is_name_on_list = false;
switch (objvar) {
case VAR_ENTER_LIST:
is_name_on_list = isNameOnEntryList(structure, player_or_guild_name);
break;
case VAR_BAN_LIST:
is_name_on_list = isNameOnBanList(structure, player_or_guild_name);
break;
case VAR_ADMIN_LIST:
is_name_on_list = isNameOnAdminList(structure, player_or_guild_name);
break;
case VAR_HOPPER_LIST:
is_name_on_list = isNameOnHopperList(structure, player_or_guild_name);
break;
default:
return false;
}
if (!is_name_on_list)
{
{
String[] listOfNames = new String[0];
switch (objvar) {
case VAR_ENTER_LIST:
listOfNames = getEntryList(structure);
break;
case VAR_BAN_LIST:
listOfNames = getBanList(structure);
break;
case VAR_ADMIN_LIST:
listOfNames = getAdminListRaw(structure);
break;
case VAR_HOPPER_LIST:
listOfNames = getHopperListRaw(structure);
break;
}
if (listOfNames != null)
{
if (listOfNames.length >= MAX_LIST_SIZE)
{
if (verbose && isIdValid(admin))
{
sendSystemMessage(admin, new string_id(STF_FILE, "too_many_entries"));
}
return false;
}
}
}
// Check adds of special access groups (guild:, city:, faction:)
if (isSpecialAccessPermissionGroup(player_or_guild_name))
{
// Access groups cannot be added to the Admin List or a Hopper
if (objvar.equals(VAR_ADMIN_LIST) || objvar.equals(VAR_HOPPER_LIST))
{
if (verbose && isIdValid(admin))
{
sendSystemMessageProse(admin, prose.getPackage(new string_id(STF_FILE, "modify_list_invalid_player"), player_or_guild_name));
}
return false;
}
// If adding a guild, make sure it exists
if(player_or_guild_name.contains("guild:"))
{
if (findGuild(((player_or_guild_name.substring(6)).toLowerCase()).trim()) == 0)
{
if (verbose && isIdValid(admin))
{
sendSystemMessageProse(admin, prose.getPackage(new string_id(STF_FILE, "modify_list_invalid_guild"), (player_or_guild_name.substring(6)).trim()));
}
return false;
}
}
// If adding a city, make sure it exists
if(player_or_guild_name.contains("city:"))
{
if(findCityByName(player_or_guild_name.substring(5).toLowerCase().trim()) == 0)
{
if (verbose && isIdValid(admin))
{
sendSystemMessageTestingOnly(admin, "The City Name you entered is not valid.");
}
return false;
}
}
// If adding a faction, make sure it's actually a faction
if(player_or_guild_name.contains("faction:"))
{
if(!player_or_guild_name.equalsIgnoreCase("faction:imperial") &&
!player_or_guild_name.equalsIgnoreCase("faction:rebel"))
{
if(verbose && isIdValid(admin))
{
sendSystemMessageTestingOnly(admin, "Invalid entry. You must enter either \"faction:imperial\" or \"faction:rebel\"");
}
return false;
}
else
{
// replace the value with the hash code for processing in SRC
if(player_or_guild_name.toLowerCase().contains("imperial"))
{
player_or_guild_name = "faction:" + FACTION_HASH_IMPERIAL;
}
else
{
player_or_guild_name = "faction:" + FACTION_HASH_REBEL;
}
}
}
}
// Just trying to add a regular name
else
{
if (!isIdValid(utils.stringToObjId(player_or_guild_name)))
{
obj_id player_objId = getPlayerIdFromFirstName((player_or_guild_name.toLowerCase()).trim());
if (!isIdValid(player_objId))
{
if (verbose && isIdValid(admin))
{
sendSystemMessageProse(admin, prose.getPackage(new string_id(STF_FILE, "modify_list_invalid_player"), player_or_guild_name));
}
return false;
}
}
}
switch (objvar) {
case VAR_ENTER_LIST:
permissionsAddAllowed(structure, player_or_guild_name);
break;
case VAR_BAN_LIST:
permissionsAddBanned(structure, player_or_guild_name);
break;
case VAR_ADMIN_LIST:
adminListAddName(structure, player_or_guild_name);
break;
case VAR_HOPPER_LIST:
hopperListAddName(structure, player_or_guild_name);
break;
}
// Success message back to player
if (verbose && isIdValid(admin))
{
if(player_or_guild_name.contains("faction:"))
{
player_or_guild_name = player_or_guild_name.contains(String.valueOf(FACTION_HASH_IMPERIAL)) ? "The Imperial Faction" : "The Rebel Faction";
}
sendListChangeMessage(admin, player_or_guild_name, true);
}
if (objvar.equals(VAR_ADMIN_LIST))
{
if (isBuilding(structure))
{
if (!isNameOnEntryList(structure, player_or_guild_name))
{
modifyList(structure, player_or_guild_name, admin, VAR_ENTER_LIST, false);
}
}
if (isInstallation(structure))
{
if (!isNameOnHopperList(structure, player_or_guild_name))
{
modifyList(structure, player_or_guild_name, admin, VAR_HOPPER_LIST, false);
}
}
}
if (objvar.equals(VAR_BAN_LIST))
{
if (isBuilding(structure))
{
if (isNameOnEntryList(structure, player_or_guild_name))
{
modifyList(structure, player_or_guild_name, admin, VAR_ENTER_LIST, false);
}
}
if (isInstallation(structure))
{
if (isNameOnHopperList(structure, player_or_guild_name))
{
modifyList(structure, player_or_guild_name, admin, VAR_HOPPER_LIST, false);
}
}
}
}
// We are REMOVING an entry from the list
else
{
// need to do special handling for faction/account here because of how it's stored
if(player_or_guild_name.contains("faction:"))
{
if(player_or_guild_name.toLowerCase().contains("imperial"))
{
player_or_guild_name = "faction:" + FACTION_HASH_IMPERIAL;
}
else
{
player_or_guild_name = "faction:" + FACTION_HASH_REBEL;
}
}
switch (objvar) {
case VAR_ENTER_LIST:
permissionsRemoveAllowed(structure, player_or_guild_name);
break;
case VAR_BAN_LIST:
permissionsRemoveBanned(structure, player_or_guild_name);
break;
case VAR_ADMIN_LIST:
adminListRemoveName(structure, player_or_guild_name);
break;
case VAR_HOPPER_LIST:
hopperListRemoveName(structure, player_or_guild_name);
break;
}
if (verbose && isIdValid(admin))
{
// reverse what we just did for displaying it back in a system message
if(player_or_guild_name.contains("faction:"))
{
player_or_guild_name = player_or_guild_name.contains(String.valueOf(FACTION_HASH_IMPERIAL)) ? "The Imperial Faction" : "The Rebel Faction";
}
sendListChangeMessage(admin, player_or_guild_name, false);
}
}
return true;
}
public static boolean modifyEntryList(obj_id structure, obj_id player, obj_id admin) throws InterruptedException {
return isIdValid(player) && modifyEntryList(structure, getPlayerName(player), admin);
}
public static boolean modifyEntryList(obj_id structure, String player_or_guild_name, obj_id admin) throws InterruptedException
{
if (!isBuilding(structure))
{
sendSystemMessage(admin, new string_id(STF_FILE, "no_entry_list"));
return false;
}
if (canEnter(structure, player_or_guild_name))
{
if (isAdmin(structure, player_or_guild_name))
{
sendSystemMessage(admin, new string_id(STF_FILE, "no_remove_admin"));
return false;
}
}
else
{
if (isBanned(structure, player_or_guild_name))
{
sendSystemMessage(admin, new string_id(STF_FILE, "no_banned"));
return false;
}
}
return modifyList(structure, player_or_guild_name, admin, VAR_ENTER_LIST, true);
}
public static boolean modifyBanList(obj_id structure, String player_or_guild_name, obj_id admin) throws InterruptedException
{
if (!isBuilding(structure))
{
sendSystemMessage(admin, new string_id(STF_FILE, "no_banned"));
return false;
}
if (!isAdmin(structure, admin))
{
sendSystemMessage(admin, new string_id(STF_FILE, "admin_only_modify"));
return false;
}
if (isAdmin(structure, player_or_guild_name))
{
sendSystemMessage(admin, new string_id(STF_FILE, "cannot_ban_admin"));
return false;
}
return modifyList(structure, player_or_guild_name, admin, VAR_BAN_LIST, true);
}
public static boolean modifyBanList(obj_id structure, obj_id player, obj_id admin) throws InterruptedException
{
if (isIdValid(player))
{
boolean result = modifyBanList(structure, getPlayerName(player), admin);
if (result)
{
if (player.isLoaded() && player.isAuthoritative())
{
obj_id ban_structure = getStructure(player);
if (ban_structure.equals(structure))
{
expelFromBuilding(player);
}
}
}
return result;
}
else
{
return false;
}
}
public static boolean modifyAdminList(obj_id structure, obj_id player, obj_id admin) throws InterruptedException
{
return modifyAdminList(structure, getPlayerName(player), admin);
}
public static boolean modifyAdminList(obj_id structure, String player_or_guild_name, obj_id admin) throws InterruptedException
{
if (player_or_guild_name.equals(getPlayerName(admin)))
{
sendSystemMessage(admin, new string_id(STF_FILE, "cannot_remove_self"));
return false;
}
if (isOwner(structure, player_or_guild_name))
{
sendSystemMessage(admin, new string_id(STF_FILE, "cannot_remove_owner"));
return false;
}
if (isBanned(structure, player_or_guild_name))
{
sendSystemMessageProse(admin, prose.getPackage(new string_id(STF_FILE, "cannot_add_banned"), player_or_guild_name));
return false;
}
return modifyList(structure, player_or_guild_name, admin, VAR_ADMIN_LIST, true);
}
public static boolean modifyVendorList(obj_id structure, String player_name, obj_id admin) throws InterruptedException
{
return false;
}
public static boolean modifyVendorList(obj_id structure, obj_id player, obj_id admin) throws InterruptedException
{
return modifyVendorList(structure, getPlayerName(player), admin);
}
public static boolean modifyHopperList(obj_id structure, obj_id player, obj_id admin) throws InterruptedException
{
return modifyHopperList(structure, getPlayerName(player), admin);
}
public static boolean modifyHopperList(obj_id structure, String player_or_guild_name, obj_id admin) throws InterruptedException
{
if (!isInstallation(structure))
{
sendSystemMessage(admin, new string_id(STF_FILE, "only_installations"));
return false;
}
if (canHopper(structure, player_or_guild_name))
{
if (isAdmin(structure, player_or_guild_name))
{
sendSystemMessage(admin, new string_id(STF_FILE, "hopper_cannot_remove_admin"));
return false;
}
}
else
{
if (isBanned(structure, player_or_guild_name))
{
sendSystemMessage(admin, new string_id(STF_FILE, "no_banned_vendors"));
return false;
}
}
return modifyList(structure, player_or_guild_name, admin, VAR_HOPPER_LIST, true);
}
public static int getStructureTableIndex(String template) throws InterruptedException
{
if (template == null || template.equals(""))
{
return -1;
}
int idx = dataTableSearchColumnForString(template, DATATABLE_COL_STRUCTURE, PLAYER_STRUCTURE_DATATABLE);
if (idx == -1)
{
idx = dataTableSearchColumnForString(template, DATATABLE_COL_FOOTPRINT, PLAYER_STRUCTURE_DATATABLE);
}
return idx;
}
public static obj_id addStructureWaypoint(obj_id player, location loc, String name, obj_id structure) throws InterruptedException
{
LOG("LOG_CHANNEL", "player_structure.addStructureWaypoint -- " + name);
if (!isIdValid(player))
{
return null;
}
if (loc == null)
{
return null;
}
if (name == null)
{
return null;
}
obj_id waypoint = createWaypointInDatapad(player, loc);
if (!isIdValid(waypoint))
{
return null;
}
setWaypointVisible(waypoint, true);
setWaypointActive(waypoint, true);
setWaypointName(waypoint, name);
if (structure.isLoaded())
{
setObjVar(structure, VAR_WAYPOINT_STRUCTURE, waypoint);
}
else
{
dictionary params = new dictionary();
params.put("waypoint", waypoint);
messageTo(structure, "msgAddWaypointData", params, 0.0f, true);
}
return waypoint;
}
public static boolean payMaintenance(obj_id player, obj_id structure, int amt) throws InterruptedException
{
if (!isIdValid(player) || !isIdValid(structure))
{
return false;
}
if (amt < 1 || amt > 100000)
{
return false;
}
if (isOwner(structure, player))
{
doOldToNewLotConversion(player, structure);
}
return money.pay(player, structure, amt, "handlePayment", null);
}
public static boolean withdrawMaintenance(obj_id player, obj_id structure, int amt) throws InterruptedException
{
if (!isIdValid(player) || !isIdValid(structure))
{
return false;
}
if (amt < 1)
{
return false;
}
dictionary d = new dictionary();
d.put("player", player);
d.put("structure", structure);
d.put("amount", amt);
CustomerServiceLog("playerStructure", "%TU has initiated a withdraw of " + amt + " from structure " + structure + ".", player, null);
return transferBankCreditsTo(structure, player, amt, "msgPAWithdrawSuccess", "msgPAWithdrawFail", d);
}
public static int decrementMaintenancePool(obj_id structure, int amt) throws InterruptedException
{
if (STRUCTURE_FEES_DISABLED)
{
return 1;
}
if (!isIdValid(structure))
{
return -1;
}
if (amt < 1)
{
return -1;
}
int pool = getBankBalance(structure);
if (amt > pool)
{
return -2;
}
int property_tax = city.getPropertyTax(structure);
int pretax_amt = 0, tax_amt = 0;
if (property_tax > 0)
{
pretax_amt = Math.round(amt / (1 + (property_tax / 100.0f)));
tax_amt = amt - pretax_amt;
if (money.bankTo(structure, money.ACCT_STRUCTURE_MAINTENANCE, pretax_amt))
{
pool -= pretax_amt;
if ((tax_amt > 0) && money.bankTo(structure, city.getCityHall(structure), tax_amt))
{
pool -= tax_amt;
}
return pool;
}
}
else
{
if (money.bankTo(structure, money.ACCT_STRUCTURE_MAINTENANCE, amt))
{
pool -= amt;
return pool;
}
}
return -1;
}
public static int damageStructure(obj_id structure, int amt, boolean boolCondemn) throws InterruptedException
{
if (structure == null || structure == obj_id.NULL_ID)
{
return -1;
}
if (amt < 1)
{
return -1;
}
int condition = getStructureCondition(structure);
condition = condition - amt;
if (condition < 1)
{
condition = 0;
if (hasCondition(structure, CONDITION_VENDOR))
{
destroyObject(structure);
}
else
{
if (isBuilding(structure) || isFactory(structure))
{
if (boolCondemn)
{
setInvulnerableHitpoints(structure, 1);
return 0;
}
}
CustomerServiceLog("playerStructure", "Structure " + structure + " destroyed for lack of maintenance.");
destroyStructure(structure);
}
}
else
{
setInvulnerableHitpoints(structure, condition);
}
return condition;
}
public static int damageStructure(obj_id structure, int amt) throws InterruptedException
{
return damageStructure(structure, amt, false);
}
public static int repairStructure(obj_id structure, int amt) throws InterruptedException
{
if (structure == null || structure == obj_id.NULL_ID)
{
LOG("building", "Returning 1");
return -1;
}
if (amt < 1)
{
LOG("building", "Returning 12");
return -1;
}
int condition = getStructureCondition(structure) + amt;
int max_condition = getMaxCondition(structure);
LOG("building", "new condition is " + condition);
if (condition > max_condition)
{
condition = max_condition;
}
setInvulnerableHitpoints(structure, condition);
if (isStructureCondemned(structure))
{
removeObjVar(structure, "player_structure.condemned");
}
return condition;
}
public static boolean initiateRepairCheck(obj_id structure) throws InterruptedException
{
if (!isIdValid(structure))
{
return false;
}
int condition = getStructureCondition(structure);
int max_condition = getMaxCondition(structure);
if (condition != max_condition)
{
int damage = max_condition - condition;
int maint_pool = getBankBalance(structure);
float per_point_cost = getBaseMaintenanceRate(structure) / 3.0f;
int repair_cost = (int)(damage * per_point_cost);
int amt_paid = 0;
int amt_repaired = 0;
if (maint_pool >= per_point_cost)
{
LOG("LOG_CHANNEL", "permanent_structure::OnMaintenanceLoop -- initiating repairs.");
LOG("LOG_CHANNEL", "cond ->" + condition);
if (maint_pool < repair_cost)
{
amt_repaired = (int)(maint_pool / per_point_cost);
amt_paid = maint_pool;
}
else
{
amt_paid = (int)(damage * per_point_cost);
amt_repaired = damage;
}
int result = decrementMaintenancePool(structure, amt_paid);
if (result > -1)
{
LOG("LOG_CHANNEL", "amt_paid ->" + amt_paid + " amt_repaired ->" + amt_repaired);
condition = repairStructure(structure, amt_repaired);
LOG("LOG_CHANNEL", "2cond ->" + condition);
}
else
{
LOG("LOG_CHANNEL", "permanent_structure::OnMaintenanceLoop -- unable to pay repair costs.");
}
}
}
return true;
}
public static boolean sendMaintenanceMail(obj_id structure) throws InterruptedException
{
if (!isIdValid(structure))
{
return false;
}
int last_message = 0;
if (hasObjVar(structure, VAR_LAST_MESSAGE))
{
last_message = getIntObjVar(structure, VAR_LAST_MESSAGE);
}
if (last_message <= getGameTime() && !isStructureCondemned(structure))
{
int perc_condition = (player_structure.getStructureCondition(structure) * 100) / player_structure.getMaxCondition(structure);
if (perc_condition <= 90)
{
obj_id owner = getStructureOwnerObjId(structure);
if (isIdValid(owner))
{
location loc = getLocation(structure);
String loc_str = "(" + loc.x + ", " + loc.z + " " + loc.area + ")";
string_id strSpam = player_structure.SID_MAIL_STRUCTURE_DAMAGE;
utils.sendMail(player_structure.SID_MAIL_STRUCTURE_DAMAGE_SUB, prose.getPackage(strSpam, null, structure, loc_str, perc_condition), getPlayerName(owner), "@player_structure:management");
utils.setObjVar(structure, VAR_LAST_MESSAGE, getGameTime() + MAIL_WARNING_INTERVAL);
return true;
}
}
else if (hasObjVar(structure, VAR_LAST_MESSAGE))
{
removeObjVar(structure, VAR_LAST_MESSAGE);
}
}
return false;
}
public static int destroyStructure(obj_id structure, obj_id containerForDeed, boolean reclaim, boolean overloaded) throws InterruptedException
{
if (!isValidId(structure) || !exists(structure))
{
return DESTROY_RESULT_INVALID_STRUCTURE;
}
String template = getTemplateName(structure);
obj_id owner = getStructureOwnerObjId(structure);
obj_id self = getSelf();
String sname = getStructureName(structure);
CustomerServiceLog("playerStructure", "Initiating destroy for structure " + structure + " (Template: " + template + " Name: " + sname + "). Owner is " + getStructureOwner(structure) + " (" + owner + ") Location: " + getLocation(structure) + " Reclaim: " + reclaim);
boolean bGetSelfPowered = false;
if (hasObjVar(structure, "selfpowered"))
{
bGetSelfPowered = true;
}
if (reclaim)
{
obj_id deed = null;
boolean isStaticItemDeed = false;
String deed_template = getDeedTemplate(structure);
if (deed_template == null || deed_template.equals(""))
{
CustomerServiceLog("playerStructure", "Attempting to reclaim deed, but can't find deed information for " + structure + ". Owner is " + getStructureOwner(structure) + "(" + owner + ") Location: " + getLocation(structure));
return DESTROY_RESULT_FAIL_COULD_NOT_DETERMINE_DEED_FOR_STRUCTURE;
}
if (!overloaded && getVolumeFree(containerForDeed) < 1)
{
return DESTROY_RESULT_FAIL_TARGET_CONTAINER_FULL;
}
if (!overloaded && getVolumeFree(containerForDeed) < 2 && bGetSelfPowered)
{
return DESTROY_RESULT_FAIL_TARGET_CONTAINER_FULL_SELFPOWERED;
}
if (hasObjVar(structure, TCG_STATIC_ITEM_DEED_OBJVAR))
{
CustomerServiceLog("playerStructure", "DestroyStructure -- Player has TCG STRUCTURE: " + structure + ". Owner is %TU. destroyStructure initiated by %TT", owner, self);
String staticItemDeed = getStringObjVar(structure, TCG_STATIC_ITEM_DEED_OBJVAR);
if (staticItemDeed == null || staticItemDeed.equals(""))
{
return DESTROY_RESULT_INVALID_STATIC_ITEM;
}
if (!static_item.isStaticItem(staticItemDeed))
{
return DESTROY_RESULT_INVALID_STATIC_ITEM;
}
deed = static_item.createNewItemFunction(staticItemDeed, containerForDeed);
isStaticItemDeed = true;
CustomerServiceLog("playerStructure", "DestroyStructure -- Owner has TCG STRUCTURE: " + structure + " and has the correct static item: " + staticItemDeed + ". Owner is %TU. destroyStructure initiated by %TT", owner, self);
}
else
{
deed = overloaded ? createObjectOverloaded(deed_template, containerForDeed) : createObject(deed_template, containerForDeed, "");
}
if (!isValidId(deed) || !exists(deed))
{
CustomerServiceLog("playerStructure", "structure(" + structure + ")|owner(" + owner + ") was unable to create the deed for caller(" + self + ") and is dumping out without destroying the structure");
return DESTROY_RESULT_FAIL_COULD_NOT_CREATE_DEED;
}
if (!isStaticItemDeed)
{
setDeedTemplate(deed, template);
setObjVar(deed, VAR_DEED_BUILDTIME, getDeedBuildTime(structure));
String deed_scene = getDeedScene(structure);
if (deed_scene != null)
{
switch (deed_scene) {
case "tatooine":
deed_scene = "tatooine,lok,dantooine";
break;
case "naboo":
deed_scene = "naboo,rori,dantooine";
break;
case "corellia":
deed_scene = "corellia,talus";
break;
}
}
setObjVar(deed, VAR_DEED_SCENE, deed_scene);
}
if (hasObjVar(structure, "structureChange.storageIncrease"))
{
setObjVar(deed, "structureChange.storageIncrease", getIntObjVar(structure, "structureChange.storageIncrease"));
setObjVar(deed, "noTrade", 1);
attachScript(deed, "item.special.nomove");
}
int maxExtractionRate = getIntObjVar(structure, "max_extraction");
if (maxExtractionRate != -1 && isHarvester(structure) || isGenerator(structure))
{
setObjVar(deed, VAR_DEED_MAX_EXTRACTION, maxExtractionRate);
}
int currentExtractionRate = getIntObjVar(structure, "current_extraction");
if (currentExtractionRate != -1 && isHarvester(structure) || isGenerator(structure))
{
setObjVar(deed, VAR_DEED_CURRENT_EXTRACTION, currentExtractionRate);
}
int maxHopperAmount = getIntObjVar(structure, VAR_DEED_MAX_HOPPER);
if (maxHopperAmount > 0)
{
setObjVar(deed, VAR_DEED_MAX_HOPPER, maxHopperAmount);
}
int reclaimCost = getRedeedCost(structure);
transferBankCreditsToNamedAccount(structure, money.ACCT_DEED_RECLAIM, reclaimCost, "noHandler", "noHandler", new dictionary());
int surplus = getBankBalance(structure) - reclaimCost;
if (surplus > 0)
{
setObjVar(deed, VAR_DEED_SURPLUS_MAINTENANCE, surplus);
transferBankCreditsToNamedAccount(structure, money.ACCT_STRUCTURE_DESTROYED, surplus, "noHandler", "noHandler", new dictionary());
CustomerServiceLog("playerStructure", "DestroyStructure -- transferring maintenance to deed " + deed + " from structure " + structure + " Amount: " + surplus + ". Owner is %TU. destroyStructure initiated by %TT", owner, self);
}
float power = getPowerValue(structure);
if (power > 0.0f && (isFactory(structure) || isHarvester(structure) || isGenerator(structure)))
{
setObjVar(deed, VAR_DEED_SURPLUS_POWER, power);
}
}
else
{
if (isIdValid(containerForDeed) && getVolumeFree(containerForDeed) < 1 && bGetSelfPowered)
{
return DESTROY_RESULT_FAIL_TARGET_CONTAINER_FULL_SELFPOWERED;
}
transferBankCreditsToNamedAccount(structure, money.ACCT_STRUCTURE_DESTROYED, getBankBalance(structure), "noHandler", "noHandler", new dictionary());
}
if (bGetSelfPowered)
{
String veteranRewardDeedToReturn = null;
if (isEliteHarvester(structure))
{
veteranRewardDeedToReturn = SELFPOWERED_DEED_ELITE;
}
else
{
veteranRewardDeedToReturn = SELFPOWERED_DEED;
}
if (overloaded)
{
createObjectOverloaded(veteranRewardDeedToReturn, containerForDeed);
}
else
{
createObject(veteranRewardDeedToReturn, containerForDeed, "");
}
}
city.removeStructureFromCity(structure);
if (isBuilding(structure))
{
obj_id[] players = getPlayersInBuilding(structure);
if (players != null)
{
for (obj_id player : players) {
expelFromBuilding(player);
}
}
}
destroyBaseObjects(structure);
destroyStructureSign(structure);
dictionary params = new dictionary();
params.put("structure", structure);
params.put("template", template);
if (hasObjVar(structure, VAR_WAYPOINT_STRUCTURE))
{
params.put("waypoint", getObjIdObjVar(structure, VAR_WAYPOINT_STRUCTURE));
}
adjustLotsForOfflinePlayer(self, structure);
messageTo(owner, "OnRemoveStructure", params, 0.1f, true);
if (vendor_lib.isVendorPackUpEnabled())
{
String[] cells = getCellNames(structure);
if (cells != null)
{
obj_id[] contents;
obj_id vendorOwner;
for (String cell : cells) {
contents = getContents(getCellId(structure, cell));
if (contents != null) {
for (obj_id content : contents) {
if (hasCondition(content, CONDITION_VENDOR)) {
vendorOwner = getObjIdObjVar(content, "vendor_owner");
if (!isIdValid(vendorOwner)) {
vendorOwner = getOwner(content);
}
vendor_lib.finalizePackUp(vendorOwner, content, self, false);
}
}
}
}
}
}
destroyObject(structure);
return bGetSelfPowered ? DESTROY_RESULT_SUCCESS_SELFPOWERED : DESTROY_RESULT_SUCCESS;
}
public static boolean destroyStructure(obj_id structure, boolean reclaim) throws InterruptedException
{
return destroyStructure(structure, reclaim, false);
}
public static boolean destroyStructure(obj_id structure, boolean reclaim, boolean overrideOwner) throws InterruptedException
{
obj_id owner = overrideOwner ? getSelf() : getStructureOwnerObjId(structure);
if (!isIdValid(owner))
{
return false;
}
obj_id self = getSelf();
if (isPlayer(self) && !isGod(self) && self != owner)
{
sendSystemMessage(self, new string_id(STF_FILE, "destroy_must_be_owner"));
return false;
}
int resultCode = destroyStructure(structure, utils.getInventoryContainer(self), reclaim, false);
switch (resultCode)
{
case DESTROY_RESULT_FAIL_COULD_NOT_CREATE_DEED:
sendSystemMessage(self, new string_id(STF_FILE, "repack_design_error"));
return false;
case DESTROY_RESULT_FAIL_COULD_NOT_DETERMINE_DEED_FOR_STRUCTURE:
sendSystemMessage(self, new string_id(STF_FILE, "contact_cs"));
return false;
case DESTROY_RESULT_FAIL_TARGET_CONTAINER_FULL:
sendSystemMessage(self, new string_id(STF_FILE, "inventory_full"));
return false;
case DESTROY_RESULT_FAIL_TARGET_CONTAINER_FULL_SELFPOWERED:
sendSystemMessage(self, new string_id(STF_FILE, "inventory_full_selfpowered"));
return false;
case DESTROY_RESULT_SUCCESS_SELFPOWERED:
sendSystemMessage(self, new string_id(STF_FILE, "selfpowered"));
break;
case DESTROY_RESULT_INVALID_STATIC_ITEM:
sendSystemMessage(self, new string_id(STF_FILE, "invalid_static_item"));
return false;
case DESTROY_RESULT_INVALID_CONTAINER:
sendSystemMessage(self, new string_id(STF_FILE, "inventory_invalid"));
return false;
}
return true;
}
public static boolean destroyStructure(obj_id structure) throws InterruptedException
{
return destroyStructure(structure, false);
}
public static boolean destroyBaseObjects(obj_id structure) throws InterruptedException
{
if (structure == null || structure == obj_id.NULL_ID)
{
return false;
}
obj_id[] base_objects = getObjIdArrayObjVar(structure, VAR_BASE_OBJECT);
if (base_objects == null)
{
return false;
}
for (obj_id base_object : base_objects) {
if (isIdValid(base_object)) {
destroyObject(base_object);
}
}
return true;
}
public static boolean validateBaseObjects(obj_id structure) throws InterruptedException
{
if (!isIdValid(structure))
{
return false;
}
boolean create_objects = false;
obj_id[] base_objects = getStructureBaseObjects(structure);
if (base_objects != null)
{
obj_id container;
for (obj_id base_object : base_objects) {
if (!isIdValid(base_object) || !base_object.isLoaded()) {
create_objects = true;
} else {
container = getTopMostContainer(base_object);
if (container == null || structure != container) {
create_objects = true;
}
}
}
}
if (create_objects)
{
destroyBaseObjects(structure);
float yaw = getYaw(structure);
if (yaw < 0.0f)
{
yaw = yaw + 360.0f;
}
createStructureObjects(structure, (int)(yaw + 1) / 90);
}
return true;
}
public static int[] convertSecondsTime(int time) throws InterruptedException
{
if (time < 1)
{
return null;
}
if (time == Integer.MAX_VALUE)
{
return new int[]{
Integer.MAX_VALUE
};
}
int mod_day = time % 86400;
int mod_hour = mod_day % 3600;
int days = time / 86400;
int hours = mod_day / 3600;
int minutes = mod_hour / 60;
int seconds = mod_hour % 60;
return new int[]{
days,
hours,
minutes,
seconds
};
}
public static String assembleTimeRemaining(int[] time_values) throws InterruptedException
{
if (time_values == null || time_values.length == 0 || time_values.length > 4)
{
return "error";
}
if (time_values.length == 1 && time_values[0] == Integer.MAX_VALUE)
{
return "3550+ weeks";
}
String[] time_strings =
{
"day",
"hour",
"minute",
"second"
};
int num_times = 0;
for (int time_value : time_values) {
if (time_value != 0) {
num_times++;
}
}
int num_left = num_times;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < time_values.length; i++)
{
if (time_values[i] > 0)
{
sb.append(time_values[i]).append(" ").append(time_strings[i]);
if (time_values[i] > 1)
{
sb.append("s");
}
if (num_left == 1)
{
sb.append(".");
}
else if (num_left == 2)
{
if (num_times > 2)
{
sb.append(", and ");
}
else
{
sb.append(" and ");
}
}
else
{
sb.append(", ");
}
num_left--;
}
}
return sb.toString();
}
public static boolean convertPermissionsLists(obj_id structure) throws InterruptedException
{
if (!isIdValid(structure))
{
LOG("player_structure", "player_structure.convertPermissionsLists -- structure is invalid.");
return false;
}
if (!hasObjVar(structure, VAR_PERMISSIONS_CONVERTED))
{
obj_id[] admin_list_as_objIds = getObjIdArrayObjVar(structure, VAR_ADMIN_LIST);
if (admin_list_as_objIds != null)
{
String[] new_admin_list = convertObjIdPermissionList(admin_list_as_objIds);
if (new_admin_list != null)
{
if (new_admin_list.length > 0)
{
setObjVar(structure, VAR_ADMIN_LIST, new_admin_list);
}
else
{
removeObjVar(structure, VAR_ADMIN_LIST);
}
}
}
else
{
String[] admin_list_as_strings = getStringArrayObjVar(structure, VAR_ADMIN_LIST);
if (admin_list_as_strings != null)
{
String[] new_admin_list = convertStringPermissionList(admin_list_as_strings);
if (new_admin_list != null)
{
if (new_admin_list.length > 0)
{
setObjVar(structure, VAR_ADMIN_LIST, new_admin_list);
}
else
{
removeObjVar(structure, VAR_ADMIN_LIST);
}
}
}
}
obj_id[] hopper_list_as_objIds = getObjIdArrayObjVar(structure, VAR_HOPPER_LIST);
if (hopper_list_as_objIds != null)
{
String[] new_hopper_list = convertObjIdPermissionList(hopper_list_as_objIds);
if (new_hopper_list != null)
{
if (new_hopper_list.length > 0)
{
setObjVar(structure, VAR_HOPPER_LIST, new_hopper_list);
}
else
{
removeObjVar(structure, VAR_HOPPER_LIST);
}
}
}
else
{
String[] hopper_list_as_strings = getStringArrayObjVar(structure, VAR_HOPPER_LIST);
if (hopper_list_as_strings != null)
{
String[] new_hopper_list = convertStringPermissionList(hopper_list_as_strings);
if (new_hopper_list != null)
{
if (new_hopper_list.length > 0)
{
setObjVar(structure, VAR_HOPPER_LIST, new_hopper_list);
}
else
{
removeObjVar(structure, VAR_HOPPER_LIST);
}
}
}
}
setObjVar(structure, VAR_PERMISSIONS_CONVERTED, 1);
}
return true;
}
public static String[] convertObjIdPermissionList(obj_id[] objId_list) throws InterruptedException
{
if (objId_list == null || objId_list.length < 1)
{
LOG("player_structure", "player_structure.objIdListToNameList -- obj_id_list is null or empty.");
return null;
}
Vector new_name_list = new Vector();
new_name_list.setSize(0);
for (obj_id objId : objId_list) {
if (!addPlayerObjIdToRawList(new_name_list, objId)) {
LOG("player_structure", "player_structure.convertObjIdPermissionList -- invalid object ID " + objId.toString());
}
}
if (new_name_list.size() > 0)
{
String[] _new_name_list = new String[0];
_new_name_list = new String[new_name_list.size()];
new_name_list.toArray(_new_name_list);
return _new_name_list;
}
else
{
return null;
}
}
public static String[] convertStringPermissionList(String[] name_list) throws InterruptedException
{
if (name_list == null || name_list.length < 1)
{
LOG("player_structure", "player_structure.objIdListToNameList -- obj_id_list is null or empty.");
return null;
}
Vector new_name_list = new Vector();
new_name_list.setSize(0);
for (String name : name_list) {
if (!addNameToRawList(new_name_list, name)) {
LOG("player_structure", "player_structure.convertStringPermissionList -- couldn't convert the name " + name);
}
}
if (new_name_list.size() > 0)
{
String[] _new_name_list = new String[new_name_list.size()];
new_name_list.toArray(_new_name_list);
return _new_name_list;
}
else
{
return null;
}
}
public static float[] transformDeltaWorldCoord(float X, float Z, int rotation) throws InterruptedException
{
float x = X;
float z = Z;
switch (rotation)
{
case 0:
break;
case 1:
X = z;
Z = -x;
break;
case 2:
Z = -z;
X = -x;
break;
case 3:
X = -z;
Z = x;
break;
}
return new float[]{
X,
Z
};
}
public static location transformDeltaWorldCoord(location here, float dx, float dz, float yaw) throws InterruptedException
{
yaw = yaw % 360.0f;
if (yaw < 0)
{
yaw += 360.0f;
}
int rotation = java.lang.Math.round(yaw / 90.0f);
float[] xz = transformDeltaWorldCoord(dx, dz, rotation);
if (xz != null && xz.length == 2)
{
location there = (location)here.clone();
there.x += xz[0];
there.z += xz[1];
return there;
}
return null;
}
public static boolean hasSign(obj_id structure) throws InterruptedException {
return isIdValid(structure) && hasObjVar(structure, VAR_SIGN_ID);
}
public static boolean isPackedUp(obj_id structure) throws InterruptedException {
obj_id container = getContainedBy(structure);
return isIdValid(container) && getTemplateName(container).equals("object/intangible/house/generic_house_control_device.iff");
}
public static obj_id createStructureSign(obj_id structure, float sYaw) throws InterruptedException
{
if (!isIdValid(structure))
{
return null;
}
if (isPackedUp(structure))
{
return null;
}
String structureTemplate = getTemplateName(structure);
int needSign = dataTableGetInt(PLAYER_STRUCTURE_DATATABLE, structureTemplate, DATATABLE_COL_HAS_SIGN);
if (needSign == 1)
{
destroyStructureSign(structure);
location here = getLocation(structure);
obj_id[] nc;
for (String aSIGN_TYPE : SIGN_TYPE) {
nc = getAllObjectsWithTemplate(here, 64.0f, aSIGN_TYPE);
if (nc != null && nc.length > 0) {
for (obj_id aNc : nc) {
if (isObjectPersisted(aNc) && !utils.hasScriptVar(aNc, "player_structure.parent")) {
CustomerServiceLog("sign_destruction", "destroying sign " + aNc + " whose name is '" + getName(aNc) + "'");
destroyObject(aNc);
}
}
}
}
dictionary params = dataTableGetRow(TBL_SIGN, structureTemplate);
if ((params != null) && (!params.isEmpty()))
{
int signType = 0;
float x = params.getFloat("X");
float y = params.getFloat("Y");
float z = params.getFloat("Z");
float heading = params.getFloat("HEADING");
String signTemplate = params.getString("DEFAULT_SIGN");
String signName = "Unnamed Structure";
if (isCivic(structure))
{
signName = utils.getStringName(structure);
}
else
{
String[] admins = getAdminListNames(structure);
if ((admins != null) && (admins.length != 0))
{
String admin_name = admins[0];
if (admin_name != null)
{
if (structureTemplate.contains("guild"))
{
signName = admin_name + "'s Guildhall";
}
else if (structureTemplate.contains("barn"))
{
signName = admin_name + "'s Barn";
}
else if (structureTemplate.contains("diner"))
{
signName = admin_name + "'s Diner";
}
else if (structureTemplate.contains("cantina"))
{
signName = admin_name + "'s Cantina";
}
else if (structureTemplate.contains("hospital"))
{
signName = admin_name + "'s Medical Center";
}
else if (structureTemplate.contains("pgc_merchant_tent"))
{
signName = admin_name + "'s Chronicles Tent";
}
else if (structureTemplate.contains("merchant_tent"))
{
signName = admin_name + "'s Merchant Tent";
}
else if (structureTemplate.contains("theater"))
{
signName = admin_name + "'s Theater";
}
else if (structureTemplate.contains("garage"))
{
signName = admin_name + "'s Garage";
}
else
{
signName = admin_name + "'s House";
}
}
else
{
if (structureTemplate.contains("guild"))
{
signName = "Guildhall";
}
else if (structureTemplate.contains("barn"))
{
signName = "Barn";
}
else if (structureTemplate.contains("diner"))
{
signName = "Diner";
}
else if (structureTemplate.contains("cantina"))
{
signName = "Cantina";
}
else if (structureTemplate.contains("hospital"))
{
signName = "Medical Center";
}
else if (structureTemplate.contains("pgc_merchant_tent"))
{
signName = "Chronicles Tent";
}
else if (structureTemplate.contains("merchant_tent"))
{
signName = "Merchant Tent";
}
else if (structureTemplate.contains("theater"))
{
signName = "Theater";
}
else if (structureTemplate.contains("garage"))
{
signName = "Garage";
}
else
{
signName = "House";
}
}
}
}
if (hasObjVar(structure, VAR_SIGN_BASE))
{
if (hasObjVar(structure, VAR_SIGN_NAME))
{
String storedName = getStringObjVar(structure, VAR_SIGN_NAME);
if (storedName != null && !storedName.equals(""))
{
signName = storedName;
}
}
if (hasObjVar(structure, VAR_SIGN_TYPE))
{
signType = getIntObjVar(structure, VAR_SIGN_TYPE);
if (structureTemplate.equals("object/building/player/player_house_mustafar_lg.iff") && hasObjVar(structure, VAR_ABANDONED))
{
signType = 0;
}
if (signType > 0)
{
signTemplate = SIGN_TYPE[signType];
x = params.getFloat("ALT_X");
y = params.getFloat("ALT_Y");
z = params.getFloat("ALT_Z");
heading = params.getFloat("ALT_HEADING");
}
}
}
location there = new location(here.x + x, here.y + y, here.z + z, here.area, here.cell);
if (hasObjVar(structure, MODIFIED_HOUSE_SIGN))
{
signTemplate = getStringObjVar(structure, MODIFIED_HOUSE_SIGN);
if (structureTemplate.equals("object/building/player/player_house_mustafar_lg.iff") && signTemplate.startsWith("object/tangible/sign/player/house_address") && !signTemplate.startsWith("object/tangible/sign/player/house_address_corellia"))
{
there.z -= 0.4f;
z -= 0.4f;
}
else if (structureTemplate.equals("object/building/player/player_house_generic_large_style_01.iff"))
{
if (signTemplate.startsWith("object/tangible/sign/player/shop_sign_") && !signTemplate.startsWith("object/tangible/sign/player/shop_sign_s0"))
{
there.z += 0.8f;
z += 0.8f;
}
}
else if (structureTemplate.startsWith("object/building/player/city/cantina_naboo") && signTemplate.startsWith("object/tangible/sign/player/house_address") && !signTemplate.startsWith("object/tangible/sign/municipal/municipal_sign_hanging_cantina"))
{
there.z += 0.3f;
z += 0.3f;
}
else if (structureTemplate.startsWith("object/building/player/city/cantina_corellia") && signTemplate.startsWith("object/tangible/sign/player/house_address") && !signTemplate.startsWith("object/tangible/sign/municipal/municipal_sign_hanging_cantina"))
{
there.z += 0.1f;
z += 0.1f;
}
}
else if (hasObjVar(structure, SPECIAL_SIGN))
{
signTemplate = getStringObjVar(structure, player_structure.SPECIAL_SIGN_TEMPLATE);
if (signTemplate.startsWith("object/tangible/tcg/series5/house_sign_tcg_hanging"))
{
there.y += 1.5f;
y += 1.5f;
}
else if (signTemplate.startsWith("object/tangible/sign/player/pgc_sign_hanging.iff"))
{
there.x -= 0.45f;
x -= 0.45f;
}
else if (structureTemplate.startsWith("object/building/player/player_merchant_tent"))
{
if (!signTemplate.startsWith("object/tangible/tcg/series3/house_sign_tcg_s02") && signTemplate.startsWith("object/tangible/tcg/"))
{
there.x -= 0.4f;
there.z -= 0.4f;
x -= 0.4f;
z -= 0.4f;
}
else if (signTemplate.startsWith("object/tangible/tcg/series3/house_sign_tcg_s02"))
{
there.x += 0.6f;
there.z += 0.1f;
x += 0.6f;
z += 0.1f;
}
else if (signTemplate.startsWith("object/tangible/sign/player/house_address_halloween"))
{
there.x -= 0.2f;
there.z -= 0.2f;
x -= 0.2f;
z -= 0.2f;
}
else if (signTemplate.startsWith("object/tangible/sign/player/imperial_empire_day_2009_sign_hanging") || signTemplate.startsWith("object/tangible/sign/player/rebel_remembrance_day_2009_sign_hanging"))
{
there.x -= 0.37f;
there.z -= 0.37f;
x -= 0.37f;
z -= 0.37f;
}
else if (signTemplate.startsWith("object/tangible/sign/player/imperial_empire_day_2009_sign_standing") || signTemplate.startsWith("object/tangible/sign/player/rebel_remembrance_day_2009_sign_standing"))
{
there.x += 0.6f;
there.z += 0.1f;
x += 0.6f;
z += 0.1f;
}
}
else if (structureTemplate.startsWith("object/building/player/player_house_mustafar_lg"))
{
if (signTemplate.startsWith("object/tangible/tcg/series3/house_sign_tcg_s01"))
{
there.z -= 0.4f;
z -= 0.4f;
}
else if (signTemplate.startsWith("object/tangible/sign/player/imperial_empire_day_2009_sign_hanging") || signTemplate.startsWith("object/tangible/sign/player/rebel_remembrance_day_2009_sign_hanging"))
{
there.z -= 0.4f;
z -= 0.4f;
}
else if (signTemplate.startsWith("object/tangible/tcg/series5/house_sign_tcg_hanging"))
{
there.z -= 0.4f;
z -= 0.4f;
}
}
if (structureTemplate.startsWith("object/building/player/city/theater_corellia"))
{
if (signTemplate.startsWith("object/tangible/tcg/series5/house_sign_tcg_hanging"))
{
there.x -= 0.4f;
x -= 0.4f;
}
}
if (structureTemplate.startsWith("object/building/player/player_guildhall_corellia"))
{
if (signTemplate.startsWith("object/tangible/tcg/series5/house_sign_tcg_hanging"))
{
there.z -= 0.4f;
there.y -= 0.1f;
z -= 0.4f;
}
else if (signTemplate.startsWith("object/tangible/sign/player/rebel_remembrance_day_2009_sign_hanging") || signTemplate.startsWith("object/tangible/sign/player/imperial_empire_day_2009_sign_hanging"))
{
heading += 90.0f;
there.z -= 0.4f;
z -= 0.4f;
}
}
if (structureTemplate.startsWith("object/building/player/city/theater_tatooine"))
{
if (signTemplate.startsWith("object/tangible/sign/player/imperial_empire_day_2009_sign_hanging"))
{
there.x -= 0.4f;
x -= 0.4f;
}
else if (signTemplate.startsWith("object/tangible/sign/player/rebel_remembrance_day_2009_sign_hanging"))
{
there.x -= 0.4f;
x -= 0.4f;
}
}
if (structureTemplate.startsWith("object/building/player/player_guildhall_tatooine"))
{
if (signTemplate.startsWith("object/tangible/sign/player/rebel_remembrance_day_2009_sign_hanging") || signTemplate.startsWith("object/tangible/sign/player/imperial_empire_day_2009_sign_hanging"))
{
there.z -= 0.1f;
z -= 0.1f;
}
}
if (structureTemplate.equals("object/building/player/player_house_generic_large_style_01.iff") || structureTemplate.equals("object/building/player/player_house_corellia_large_style_01.iff"))
{
if (signTemplate.startsWith("object/tangible/tcg/series5/house_sign_tcg_standing"))
{
there.z += 1.2f;
z += 1.2f;
}
else if (signTemplate.startsWith("object/tangible/sign/player/rebel_remembrance_day_2009_sign_standing.iff") || signTemplate.startsWith("object/tangible/sign/player/imperial_empire_day_2009_sign_standing.iff"))
{
there.z += 0.6f;
z += 0.6f;
}
else if (signTemplate.startsWith("object/tangible/sign/player/rebel_remembrance_day_2009_sign_hanging.iff") || signTemplate.startsWith("object/tangible/sign/player/imperial_empire_day_2009_sign_hanging.iff"))
{
there.z -= 0.3f;
z -= 0.3f;
}
}
if (structureTemplate.startsWith("object/building/player/player_house_generic_medium_windowed_s02.iff"))
{
if (signTemplate.startsWith("object/tangible/tcg/series5/house_sign_tcg_hanging.iff"))
{
there.z -= 0.25f;
z -= 0.25f;
}
else if (signTemplate.startsWith("object/tangible/sign/player/rebel_remembrance_day_2009_sign_hanging.iff") || signTemplate.startsWith("object/tangible/sign/player/imperial_empire_day_2009_sign_hanging.iff"))
{
there.z -= 0.25f;
z -= 0.25f;
}
}
if (signTemplate.startsWith("object/tangible/sign/player/pgc_sign_hanging.iff"))
{
if (structureTemplate.startsWith("object/building/player/player_house_naboo_small_style_02.iff"))
{
there.x += 0.5f;
x += 0.5f;
}
else if (structureTemplate.startsWith("object/building/player/player_house_corellia_large_style_01.iff"))
{
heading += 90;
there.z -= 0.5f;
z -= 0.5f;
}
else if (structureTemplate.startsWith("object/building/player/player_house_corellia_large_style_02.iff") || structureTemplate.startsWith("object/building/player/player_house_corellia_small_style_02.iff") || structureTemplate.startsWith("object/building/player/player_house_corellia_small_style_02_floorplan_02.iff"))
{
heading += 90;
there.z -= 0.1f;
z -= 0.1f;
}
else if (structureTemplate.startsWith("object/building/player/player_house_corellia_medium_style_01.iff"))
{
heading += 90;
}
else if (structureTemplate.startsWith("object/building/player/player_house_corellia_small_style_01.iff") || structureTemplate.startsWith("object/building/player/player_house_corellia_small_style_01_floorplan_02.iff"))
{
heading += 90;
there.x += 0.5f;
x += 0.5f;
}
else if (structureTemplate.startsWith("object/building/player/player_merchant_tent_style_01.iff") || structureTemplate.startsWith("object/building/player/player_merchant_tent_style_02.iff") || structureTemplate.startsWith("object/building/player/player_merchant_tent_style_03.iff") || structureTemplate.startsWith("object/building/player/player_pgc_merchant_tent_s01.iff"))
{
heading += 100;
there.z -= 0.1f;
z -= 0.1f;
}
else if (structureTemplate.startsWith("object/building/player/player_house_tatooine_large_style_01.iff"))
{
there.z -= 0.1f;
z -= 0.1f;
}
else if (structureTemplate.startsWith("object/building/player/player_house_mustafar_lg.iff"))
{
heading += 180;
there.x -= 0.3f;
x -= 0.3f;
}
else if (structureTemplate.startsWith("object/building/player/player_house_generic_large_style_01.iff") || structureTemplate.startsWith("object/building/player/player_house_generic_large_style_02.iff") || structureTemplate.startsWith("object/building/player/player_house_generic_medium_style_02.iff") || structureTemplate.startsWith("object/building/player/player_house_generic_small_style_02.iff"))
{
there.z += 0.2f;
z += 0.2f;
}
else if (structureTemplate.startsWith("object/building/player/player_house_generic_medium_windowed_s02.iff"))
{
there.z -= 0.2f;
z -= 0.2f;
}
else if (structureTemplate.startsWith("object/building/player/player_house_generic_small_style_01.iff"))
{
there.z += 0.2f;
there.x += 0.7f;
z += 0.2f;
x += 0.7f;
}
else if (structureTemplate.startsWith("object/building/player/player_house_naboo_small_style_01.iff"))
{
heading -= 10;
there.x += 0.4f;
x += 0.4f;
}
else if (structureTemplate.startsWith("object/building/player/player_house_generic_small_windowed.iff"))
{
there.x += 0.5f;
x += 0.5f;
}
else if (structureTemplate.startsWith("object/building/player/player_house_generic_small_window_style_03.iff"))
{
there.x += 1;
there.z -= 0.2f;
x += 1;
z -= 0.2f;
}
else if (structureTemplate.startsWith("object/building/player/player_house_naboo_small_window_style_01.iff"))
{
heading -= 12;
there.x += 0.6f;
x += 0.6f;
}
}
if (structureTemplate.startsWith("object/building/player/player_house_corellia_small_style_02_floorplan_02.iff") || structureTemplate.startsWith("object/building/player/player_house_corellia_small_style_02.iff") || structureTemplate.startsWith("object/building/player/player_house_tatooine_small_style_02.iff") || structureTemplate.startsWith("object/building/player/player_house_tatooine_large_style_01.iff"))
{
if (signTemplate.startsWith("object/tangible/sign/player/rebel_remembrance_day_2009_sign_hanging.iff") || signTemplate.startsWith("object/tangible/sign/player/imperial_empire_day_2009_sign_hanging.iff"))
{
there.z -= 0.2f;
z -= 0.2f;
}
}
if (structureTemplate.startsWith("object/building/player/player_house_naboo_large_style_01.iff"))
{
if (signTemplate.startsWith("object/tangible/sign/player/rebel_remembrance_day_2009_sign_hanging.iff") || signTemplate.startsWith("object/tangible/sign/player/imperial_empire_day_2009_sign_hanging.iff"))
{
there.z += 0.1f;
z += 0.1f;
}
}
if (structureTemplate.startsWith("object/building/player/player_house_tcg_vehicle_garage.iff"))
{
if (signTemplate.startsWith("object/tangible/tcg/series3/house_sign_tcg_s01.iff") || signTemplate.startsWith("object/tangible/sign/player/house_address_halloween_sign.iff") || signTemplate.startsWith("object/tangible/sign/player/imperial_empire_day_2009_sign_hanging.iff") || signTemplate.startsWith("object/tangible/sign/player/rebel_remembrance_day_2009_sign_hanging.iff") || signTemplate.startsWith("object/tangible/tcg/series5/house_sign_tcg_hanging.iff") || signTemplate.startsWith("object/tangible/sign/player/pgc_sign_hanging.iff"))
{
heading += 90;
there.z -= 0.3f;
z -= 0.3f;
}
}
if (structureTemplate.startsWith("object/building/player/player_house_tcg_vip_bunker.iff"))
{
if (signTemplate.startsWith("object/tangible/tcg/series3/house_sign_tcg_s01.iff") || signTemplate.startsWith("object/tangible/sign/player/house_address_halloween_sign.iff") || signTemplate.startsWith("object/tangible/sign/player/imperial_empire_day_2009_sign_hanging.iff") || signTemplate.startsWith("object/tangible/sign/player/rebel_remembrance_day_2009_sign_hanging.iff") || signTemplate.startsWith("object/tangible/tcg/series5/house_sign_tcg_hanging.iff") || signTemplate.startsWith("object/tangible/sign/player/pgc_sign_hanging.iff"))
{
heading += 90;
there.z += 0.3f;
z += 0.3f;
}
}
if (structureTemplate.startsWith("object/building/player/player_house_tcg_commando_bunker.iff"))
{
if (signTemplate.startsWith("object/tangible/tcg/series3/house_sign_tcg_s01.iff") || signTemplate.startsWith("object/tangible/sign/player/house_address_halloween_sign.iff") || signTemplate.startsWith("object/tangible/sign/player/imperial_empire_day_2009_sign_hanging.iff") || signTemplate.startsWith("object/tangible/sign/player/rebel_remembrance_day_2009_sign_hanging.iff") || signTemplate.startsWith("object/tangible/tcg/series5/house_sign_tcg_hanging.iff") || signTemplate.startsWith("object/tangible/sign/player/pgc_sign_hanging.iff"))
{
heading += 90;
there.z -= 0.6f;
z -= 0.6f;
}
}
}
location spawn = (location)there.clone();
if (sYaw != 0.0f)
{
location newspawn = transformDeltaWorldCoord(here, x, z, sYaw);
newspawn.y = there.y;
spawn = (location)newspawn.clone();
}
if ((signTemplate != null) && (!signTemplate.equals("")))
{
obj_id sign = createObject(signTemplate, spawn);
if (isIdValid(sign))
{
String preSignName = "";
String postSignName = "";
String viewSignName = signName;
if (isAbandoned(structure) || isPreAbandoned(structure))
{
int indexOfAbandonedText = signName.indexOf(ABANDONED_TEXT);
String filteredSignName = "";
boolean foundAbandonedText = false;
while (indexOfAbandonedText != -1)
{
filteredSignName += signName.substring(0, indexOfAbandonedText);
signName = signName.substring(indexOfAbandonedText + ABANDONED_TEXT.length());
indexOfAbandonedText = signName.indexOf(ABANDONED_TEXT);
foundAbandonedText = true;
}
if (foundAbandonedText)
{
signName = filteredSignName + signName;
viewSignName = signName;
}
postSignName = ABANDONED_TEXT;
if (viewSignName.length() > 100)
{
viewSignName = viewSignName.substring(0, 99);
}
}
if (isCityAbandoned(structure) && cityIsInactivePackupActive())
{
int indexOfAbandonedText = signName.indexOf(CITY_ABANDONED_TEXT);
String filteredSignName = "";
boolean foundAbandonedText = false;
while (indexOfAbandonedText != -1)
{
filteredSignName += signName.substring(0, indexOfAbandonedText);
signName = signName.substring(indexOfAbandonedText + CITY_ABANDONED_TEXT.length());
indexOfAbandonedText = signName.indexOf(CITY_ABANDONED_TEXT);
foundAbandonedText = true;
}
if (foundAbandonedText)
{
signName = filteredSignName + signName;
viewSignName = signName;
}
postSignName = CITY_ABANDONED_TEXT;
if (viewSignName.length() > 100)
{
viewSignName = viewSignName.substring(0, 99);
}
}
setName(sign, preSignName + viewSignName + postSignName);
setObjVar(structure, VAR_SIGN_ID, sign);
setObjVar(structure, VAR_SIGN_NAME, signName);
setObjVar(structure, VAR_SIGN_TYPE, signType);
float tYaw = sYaw + heading;
if (tYaw != 0.0f)
{
setYaw(sign, tYaw);
}
String[] allStructures = dataTableGetStringColumn(SIGN_ADJUST_SIGN_BY_TEMPLATE, "structure_template");
if (allStructures != null && allStructures.length > 0)
{
Vector thisStructure = new Vector();
thisStructure.setSize(0);
for (String struct : allStructures) {
if (structureTemplate.equals(struct)) {
thisStructure = utils.addElement(thisStructure, struct);
}
}
}
utils.setScriptVar(sign, "player_structure.parent", structure);
return sign;
}
}
}
}
return null;
}
public static obj_id createStructureSign(obj_id structure) throws InterruptedException
{
if (!isIdValid(structure))
{
return null;
}
return createStructureSign(structure, (Math.round(getYaw(structure))));
}
public static void destroyStructureSign(obj_id structure) throws InterruptedException
{
if (!isIdValid(structure))
{
return;
}
obj_id sign = getObjIdObjVar(structure, VAR_SIGN_ID);
if (isIdValid(sign) && exists(sign))
{
destroyObject(sign);
}
removeObjVar(structure, VAR_SIGN_ID);
}
public static float powerInstallation(obj_id bldg, obj_id energon) throws InterruptedException
{
if (!isIdValid(bldg) || !isIdValid(energon))
{
return -1.0f;
}
if (isGameObjectTypeOf(getGameObjectType(energon), GOT_resource_container))
{
return -1.0f;
}
if (!isGameObjectTypeOf(getGameObjectType(bldg), GOT_installation))
{
return -1.0f;
}
obj_id rId = getResourceContainerResourceType(energon);
if (!isIdValid(rId))
{
return -1.0f;
}
if (!isResourceDerivedFrom(rId, "energy") || !isResourceDerivedFrom(rId, "radioactive"))
{
return -1.0f;
}
int amt = resource.getPotentialEnergyValue(energon);
if (amt > 0.0f)
{
return powerInstallation(bldg, amt);
}
return -1.0f;
}
public static float powerInstallation(obj_id bldg, int amt) throws InterruptedException
{
if (!isIdValid(bldg) || (amt <= 0.0f))
{
return -1.0f;
}
incrementPowerValue(bldg, amt);
return getPowerValue(bldg);
}
public static void validateHarvestedResources(obj_id structure) throws InterruptedException
{
if (!isIdValid(structure))
{
return;
}
if (utils.hasScriptVar(structure, "validatedResources"))
{
return;
}
if (!isHarvester(structure) && !isGenerator(structure))
{
return;
}
String listPath = "resource";
if (hasObjVar(structure, listPath))
{
obj_var_list ovl = getObjVarList(structure, listPath);
if (ovl != null)
{
int numItems = ovl.getNumItems();
obj_var ov;
String ovName;
obj_id rId;
float amt;
String mType;
obj_id newId;
for (int i = 0; i < numItems; i++)
{
ov = ovl.getObjVar(i);
if (ov != null)
{
ovName = ov.getName();
rId = utils.stringToObjId(ovName);
if (!isValidResourceId(rId))
{
amt = ov.getFloatData();
mType = getHarvesterMasterResource(structure);
if (mType != null && !mType.equals(""))
{
newId = pickRandomNonDepeletedResource(mType);
if (isIdValid(newId))
{
setObjVar(structure, "resource." + newId, amt);
}
else
{
CustomerServiceLog("trade", "bad resouce found in installation #" + structure + " and the system was unable to find a suitable replacement!");
CustomerServiceLog("trade", "installation #" + structure + " report: bad resource id = " + ovName + " amt = " + Math.round(amt));
}
}
else
{
CustomerServiceLog("trade", "bad resouce found in installation #" + structure + " and the system was unable to determine a suitable resource type for replacement!");
CustomerServiceLog("trade", "installation #" + structure + " report: bad resource id = " + ovName + " amt = " + Math.round(amt));
}
removeObjVar(structure, listPath + "." + ovName);
}
}
}
}
}
utils.setScriptVar(structure, "validatedResources", true);
}
public static String getHarvesterMasterResource(obj_id structure) throws InterruptedException
{
if (!isIdValid(structure))
{
return null;
}
if (!isHarvester(structure) && !isGenerator(structure))
{
return null;
}
String template = getTemplateName(structure);
if (template == null || template.equals(""))
{
return null;
}
if (isHarvester(structure))
{
if (template.contains("mining_ore"))
{
return "mineral";
}
if (template.contains("mining_gas"))
{
return "gas";
}
if (template.contains("mining_liquid"))
{
if (template.contains("moisture"))
{
return "water";
}
return "chemical";
}
if (template.contains("mining_organic"))
{
if (template.contains("creature"))
{
return "creature_resources";
}
return "flora_resources";
}
}
else if (isGenerator(structure))
{
if (template.contains("fusion"))
{
return "radioactive";
}
if (template.contains("solar"))
{
return "energy_renewable_unlimited_solar";
}
if (template.contains("wind"))
{
return "energy_renewable_unlimited_wind";
}
}
return null;
}
public static boolean canReclaimDeed(obj_id structure) throws InterruptedException {
return isIdValid(structure) && canReclaimDeed(getTemplateName(structure));
}
public static boolean canReclaimDeed(String structureTemplate) throws InterruptedException {
return !(structureTemplate == null || structureTemplate.equals("")) && dataTableGetInt(PLAYER_STRUCTURE_DATATABLE, structureTemplate, "CAN_RECLAIM") == 1;
}
public static void showChangeSignSui(obj_id structure, obj_id player) throws InterruptedException
{
if (!isIdValid(structure) || !isIdValid(player))
{
return;
}
int skillmod = getSkillStatMod(player, "shop_sign");
if (skillmod < 1)
{
return;
}
Vector entries = new Vector();
entries.setSize(0);
for (int i = 0; i <= skillmod; i++)
{
if (i < SIGN_NAMES.length)
{
entries = utils.addElement(entries, utils.packStringId(SIGN_NAMES[i]));
}
else
{
break;
}
}
if (entries != null && entries.size() > 0)
{
sui.listbox(structure, player, "@player_structure:changesign_prompt", sui.OK_CANCEL, "@player_structure:changesign_title", entries, "handleChangeSignSui");
}
}
public static String getStructureName(obj_id structure) throws InterruptedException
{
if (!isIdValid(structure))
{
return null;
}
if (isBuilding(structure) && hasObjVar(structure, VAR_SIGN_NAME))
{
String signName = getStringObjVar(structure, VAR_SIGN_NAME);
if (signName != null && !signName.equals(""))
{
return signName;
}
}
return utils.getStringName(structure);
}
public static boolean canPlaceGarage(location loc, float range, String template) throws InterruptedException
{
if (1 == dataTableGetInt(player_structure.PLAYER_STRUCTURE_DATATABLE, template, "GARAGE"))
{
if (getFirstObjectWithTemplate(loc, range, template) != null)
{
return false;
}
}
return true;
}
public static boolean hasMaintenanceDroid(obj_id player) throws InterruptedException
{
for (obj_id datapad : getContents(utils.getPlayerDatapad(player))) {
if (hasObjVar(datapad, "module_data.struct_maint")) {
return true;
}
}
return false;
}
public static obj_id[] getMaintenanceDroids(obj_id player) throws InterruptedException
{
Vector droids = new Vector();
droids.setSize(0);
obj_id[] datapads = getContents(utils.getPlayerDatapad(player));
for (obj_id datapad : datapads) {
if (hasObjVar(datapad, "module_data.struct_maint")) {
droids = utils.addElement(droids, datapad);
}
}
obj_id[] _droids = new obj_id[0];
if (droids != null)
{
_droids = new obj_id[droids.size()];
droids.toArray(_droids);
}
return _droids;
}
public static void flagConverted(String template, obj_id structure) throws InterruptedException
{
if (template.contains("_guildhall_"))
{
setObjVar(structure, "newBuilding", true);
setObjVar(structure, "newBuildPartTwo", true);
}
else if (template.contains("structure_factory"))
{
setObjVar(structure, "newBuilding", true);
setObjVar(structure, "newBuildPartTwo", true);
}
else if (template.contains("player_house_"))
{
if (template.contains("_large_style_"))
{
setObjVar(structure, "newBuilding", true);
setObjVar(structure, "newBuildPartTwo", true);
}
}
}
public static int convertLotCosts(obj_id structure, String template, int struct_lots) throws InterruptedException
{
if (!hasObjVar(structure, "newBuilding") || !hasObjVar(structure, "newBuildPartTwo"))
{
if (template.contains("_guildhall_"))
{
if (!template.contains("_guildhall_tatooine_"))
{
struct_lots = 9;
}
else
{
struct_lots = 7;
}
}
else if (template.contains("structure_factory"))
{
struct_lots = 2;
}
else if (template.contains("player_house_"))
{
if (template.contains("_large_style_"))
{
struct_lots = 6;
}
}
}
return struct_lots;
}
public static void doOldToNewLotConversion(obj_id player, obj_id structure) throws InterruptedException
{
if (!isOwner(structure, player))
{
return;
}
if (!hasObjVar(structure, "newBuilding"))
{
String template = getTemplateName(structure);
if (template.contains("_guildhall_"))
{
if (!template.contains("_guildhall_tatooine_"))
{
adjustLotCount(getPlayerObject(player), -4);
setObjVar(structure, "newBuilding", true);
setObjVar(structure, "newBuildPartTwo", true);
}
else
{
adjustLotCount(getPlayerObject(player), -2);
setObjVar(structure, "newBuilding", true);
setObjVar(structure, "newBuildPartTwo", true);
}
}
else if (template.contains("structure_factory"))
{
adjustLotCount(getPlayerObject(player), -1);
setObjVar(structure, "newBuilding", true);
}
else if (template.contains("player_house_"))
{
if (template.contains("_large_style_"))
{
adjustLotCount(getPlayerObject(player), -1);
setObjVar(structure, "newBuilding", true);
setObjVar(structure, "newBuildPartTwo", true);
}
}
}
else if (!hasObjVar(structure, "newBuildPartTwo"))
{
String template = getTemplateName(structure);
if (template.contains("_guildhall_"))
{
adjustLotCount(getPlayerObject(player), -2);
setObjVar(structure, "newBuildPartTwo", true);
}
else if (template.contains("player_house_"))
{
if (template.contains("_large_style_"))
{
adjustLotCount(getPlayerObject(player), -1);
setObjVar(structure, "newBuildPartTwo", true);
}
}
}
}
public static void adjustLotsForOfflinePlayer(obj_id owner, obj_id structure) throws InterruptedException
{
dictionary params = new dictionary();
if (!hasObjVar(structure, "newBuilding"))
{
String template = getTemplateName(structure);
if (template.contains("_guildhall_"))
{
if (!template.contains("_guildhall_tatooine_"))
{
params.put("lotAdjust", -4);
setObjVar(structure, "newBuilding", true);
setObjVar(structure, "newBuildPartTwo", true);
messageTo(owner, "handleAdjustLotCount", params, 0, true);
}
else
{
params.put("lotAdjust", -2);
setObjVar(structure, "newBuilding", true);
setObjVar(structure, "newBuildPartTwo", true);
messageTo(owner, "handleAdjustLotCount", params, 0, true);
}
}
else if (template.contains("structure_factory"))
{
params.put("lotAdjust", -1);
setObjVar(structure, "newBuilding", true);
setObjVar(structure, "newBuildPartTwo", true);
messageTo(owner, "handleAdjustLotCount", params, 0, true);
}
else if (template.contains("player_house_"))
{
if (template.contains("_large_style_"))
{
params.put("lotAdjust", -1);
setObjVar(structure, "newBuilding", true);
setObjVar(structure, "newBuildPartTwo", true);
messageTo(owner, "handleAdjustLotCount", params, 0, true);
}
}
}
else if (!hasObjVar(structure, "newBuildPartTwo"))
{
String template = getTemplateName(structure);
if (template.contains("_guildhall_"))
{
params.put("lotAdjust", -2);
setObjVar(structure, "newBuildPartTwo", true);
messageTo(owner, "handleAdjustLotCount", params, 0, true);
}
else if (template.contains("player_house_"))
{
if (template.contains("_large_style_"))
{
params.put("lotAdjust", -1);
setObjVar(structure, "newBuildPartTwo", true);
messageTo(owner, "handleAdjustLotCount", params, 0, true);
}
}
}
}
public static void doCondemnedSui(obj_id objStructure, obj_id objItem) throws InterruptedException
{
obj_id objOwner = getStructureOwnerObjId(objStructure);
LOG("test", "objOwner is " + objOwner + " and item is " + objItem);
if (isPlayer(objItem))
{
if (objOwner == objItem || player_structure.isAdmin(objStructure, objItem))
{
int intRepairCost = getStructureRepairCost(objStructure);
int intBankCredits = getBankBalance(objItem);
if (intRepairCost <= intBankCredits)
{
String strTitle = "@player_structure:fix_condemned_title";
string_id strPrompt = new string_id(STF_FILE, "structure_condemned_owner_has_credits");
prose_package pp = new prose_package();
prose.setStringId(pp, strPrompt);
prose.setDI(pp, intRepairCost);
int pid = sui.msgbox(objStructure, objItem, pp, sui.OK_CANCEL, strTitle, "payCondemnedFees");
if (pid > -1)
{
showSUIPage(pid);
}
}
else
{
string_id strSpam = new string_id(STF_FILE, "structure_condemned_owner_no_credits");
prose_package pp = new prose_package();
prose.setStringId(pp, strSpam);
prose.setDI(pp, intRepairCost);
sendSystemMessageProse(objItem, pp);
}
}
else
{
sendSystemMessage(objItem, new string_id(STF_FILE, "structure_condemned_not_owner"));
}
}
}
public static int getStructureRepairCost(obj_id structure) throws InterruptedException
{
int damage = getMaxCondition(structure) - getStructureCondition(structure);
float per_point_cost = getBaseMaintenanceRate(structure) / 3.0f;
return (int)(damage * per_point_cost);
}
public static boolean isStructureCondemned(obj_id objStructure) throws InterruptedException
{
return hasObjVar(objStructure, "player_structure.condemned");
}
public static void sendCondemnedMail(obj_id objStructure) throws InterruptedException
{
location loc = getLocation(objStructure);
String loc_str = "(" + loc.x + ", " + loc.z + " " + loc.area + ")";
prose_package pp = new prose_package();
prose.setStringId(pp, new string_id(STF_FILE, "structure_condemned_body"));
prose.setTO(pp, loc_str);
prose.setTT(pp, objStructure);
prose.setDI(pp, getStructureRepairCost(objStructure));
utils.sendMail(new string_id(STF_FILE, "structure_condemned_subject"), pp, getPlayerName(getOwner(objStructure)), "@player_structure:management");
}
public static int getMaintenanceHeartbeat() throws InterruptedException
{
return STRUCTURE_MAINTENANCE_HEARTBEAT;
}
public static void sendOutOfMaintenanceMail(obj_id objStructure) throws InterruptedException
{
location loc = getLocation(objStructure);
String loc_str = "(" + loc.x + ", " + loc.z + " " + loc.area + ")";
prose_package pp = new prose_package();
prose.setStringId(pp, new string_id(STF_FILE, "structure_maintenance_empty_body"));
prose.setTO(pp, loc_str);
prose.setTT(pp, objStructure);
utils.sendMail(new string_id(STF_FILE, "structure_maintenance_empty_subject"), pp, getPlayerName(getOwner(objStructure)), "@player_structure:management");
}
public static boolean isFactionPerkBase(String objectTemplateName) throws InterruptedException
{
return objectTemplateName.contains("object/building/faction_perk/hq/");
}
public static boolean isFactionPerkBaseDeed(obj_id objDeed) throws InterruptedException
{
return isFactionPerkBaseDeed(getTemplateName(objDeed));
}
public static boolean isFactionPerkBaseDeed(String deedObjectTemplateName) throws InterruptedException
{
return deedObjectTemplateName.contains("object/tangible/deed/faction_perk/hq/");
}
public static boolean canPlaceFactionPerkDeed(obj_id objDeed, obj_id objPlayer) throws InterruptedException
{
final float CHECK_RANGE = 600.0f;
final int BASES_ALLOWED = 3;
if (player_structure.isFactionPerkBaseDeed(objDeed))
{
obj_id[] objBases = getAllObjectsWithScript(getLocation(objPlayer), CHECK_RANGE, "faction_perk.hq.loader");
if ((objBases != null) && (objBases.length >= BASES_ALLOWED))
{
sendSystemMessage(objPlayer, new string_id("gcw", "too_many_bases"));
return false;
}
}
return true;
}
public static int validateHopperSize(obj_id structureObject) throws InterruptedException
{
if (!isIdValid(structureObject))
{
return 0;
}
String templateName = getTemplateName(structureObject);
if (templateName == null || templateName.length() <= 0)
{
return 0;
}
dictionary dict = utils.dataTableGetRow(PLAYER_STRUCTURE_VALIDATION_DATATABLE, templateName);
if (dict == null)
{
return -1;
}
int minHopper = dataTableGetInt(PLAYER_STRUCTURE_VALIDATION_DATATABLE, templateName, DATATABLE_COL_HOPPER_MIN);
int maxHopper = dataTableGetInt(PLAYER_STRUCTURE_VALIDATION_DATATABLE, templateName, DATATABLE_COL_HOPPER_MAX);
if (minHopper <= 0 || maxHopper <= 0)
{
return 0;
}
int objvar_hopper;
if (hasObjVar(structureObject, VAR_DEED_MAX_HOPPER))
{
objvar_hopper = getIntObjVar(structureObject, VAR_DEED_MAX_HOPPER);
}
else
{
objvar_hopper = (minHopper + maxHopper) / 2;
return objvar_hopper;
}
if (objvar_hopper <= minHopper)
{
objvar_hopper = (minHopper + maxHopper) / 2;
}
if (objvar_hopper > HARVESTER_MAX_HOPPER_SIZE)
{
objvar_hopper = HARVESTER_MAX_HOPPER_SIZE;
}
return objvar_hopper;
}
public static boolean doesUnmarkedStructureQualifyForHousePackup(obj_id structure) throws InterruptedException
{
if (!isBuilding(structure) && !isInstallation(structure))
{
return false;
}
if (isInstallation(structure) && !isFactory(structure))
{
return false;
}
if (isCivic(structure))
{
return false;
}
String templateName = getTemplateName(structure);
return !(templateName == null || isFactionPerkBase(templateName));
}
public static boolean needsPreAbandonCheck(obj_id structure) throws InterruptedException
{
if (!isIdValid(structure))
{
return false;
}
//if (!utils.checkConfigFlag("GameServer", "enableHousePackup"))
//{
// return false;
//}
if (isAbandoned(structure) || isPreAbandoned(structure))
{
return true;
}
return doesUnmarkedStructureQualifyForHousePackup(structure);
}
public static boolean needsAbandonCheck(obj_id structure) throws InterruptedException
{
if (!isIdValid(structure))
{
return false;
}
if (!ENABLE_ABANDONED_STRUCTURES_SYSTEM)
{
return false;
}
if (isPreAbandoned(structure) || isAbandoned(structure))
{
return true;
}
return doesUnmarkedStructureQualifyForHousePackup(structure);
}
public static boolean needsCityAbandonCheck(obj_id structure) throws InterruptedException
{
if (!isIdValid(structure))
{
LOG("sissynoid", "Failed 'needsCityAbandonedCheck - Invalid STructure");
return false;
}
if (!cityIsInactivePackupActive())
{
LOG("sissynoid", "Failed 'needsCityAbandonedCheck - cityIsInactivePackupActive Config Inactive");
return false;
}
if (!doesUnmarkedStructureQualifyForHousePackup(structure))
{
LOG("sissynoid", "Failed 'needsCityAbandonedCheck - Structure is unpackable");
return false;
}
if (!cityExists(getCityAtLocation(getLocation(structure), 0)))
{
LOG("sissynoid", "Failed 'needsCityAbandonedCheck - No City Exists at this Location");
return false;
}
return true;
}
public static String getStructureInfo(obj_id structure) throws InterruptedException
{
final String yes = "Y|";
final String no = "N|";
final String blank = "|";
final String templateName = getTemplateName(structure);
final obj_id ownerId = getOwner(structure);
String result = "|" + structure + "|" + ownerId + "|" + templateName + "|";
result += needsPreAbandonCheck(structure) ? yes : no;
result += needsAbandonCheck(structure) ? yes : no;
result += doesUnmarkedStructureQualifyForHousePackup(structure) ? yes : no;
result += isIdValid(structure) ? yes : no;
result += isAccountQualifiedForHousePackup(ownerId) ? yes : no;
result += isBuilding(structure) ? yes : no;
result += isInstallation(structure) ? yes : no;
result += isFactory(structure) ? yes : no;
result += isFactionPerkBase(templateName) ? yes : no;
result += isCivic(structure) ? yes : no;
result += isInWorld(structure) ? yes : no;
result += isInWorldCell(structure) ? yes : no;
if (hasObjVar(structure, VAR_CIVIC))
{
result += getIntObjVar(structure, VAR_CIVIC) + "|";
}
else
{
result += blank;
}
if (hasObjVar(structure, VAR_ABANDONED))
{
result += getIntObjVar(structure, VAR_ABANDONED);
}
else
{
result += blank;
}
if (hasObjVar(structure, VAR_LAST_MAINTANENCE))
{
result += getIntObjVar(structure, VAR_LAST_MAINTANENCE) + "|";
}
else
{
result += blank;
}
return result;
}
public static boolean isEliteHarvester(obj_id structure) throws InterruptedException
{
if (isIdValid(structure))
{
String templateName = getTemplateName(structure);
if (templateName.endsWith("_style_4.iff") || templateName.endsWith("_elite.iff"))
{
return true;
}
}
return false;
}
public static boolean canShowPackOption(obj_id player, obj_id structure) throws InterruptedException
{
if (!isIdValid(structure) || !isIdValid(player))
{
return false;
}
if (!ALLOW_PACKING_ABANDONED_STRUCTURES)
{
return false;
}
if (!player_structure.isAbandoned(structure))
{
return false;
}
return isCommoditiesServerAvailable();
}
public static boolean canPlayerPackAbandonedStructure(obj_id player, obj_id structure) throws InterruptedException
{
if (!canShowPackOption(player, structure))
{
return false;
}
if (isAtPendingLoadRequestLimit())
{
return false;
}
if (!player.isLoaded() || !player.isAuthoritative())
{
return false;
}
return !(!structure.isLoaded() || !structure.isAuthoritative());
}
public static boolean canPackStructureWithVendors(obj_id player, obj_id structure) throws InterruptedException
{
final boolean hasVendors = hasVendors(structure);
if (hasVendors && !vendor_lib.isVendorPackUpEnabled())
{
sendSystemMessage(player, new string_id("sui", "cant_pack_vendors"));
return false;
}
if (hasVendors && !isCommoditiesServerAvailable())
{
sendSystemMessage(player, new string_id("sui", "cannot_pack_now"));
return false;
}
return true;
}
public static void packAbandonedBuilding(obj_id player, obj_id structure, dictionary params) throws InterruptedException
{
if (hasObjVar(player, HOUSE_PACKUP_DAILY_TIMER_OBJVAR))
{
if (getGameTime() >= getIntObjVar(player, HOUSE_PACKUP_DAILY_TIMER_OBJVAR))
{
removeObjVar(player, HOUSE_PACKUP_DAILY_TIMER_OBJVAR);
removeObjVar(player, HOUSE_PACKUP_DAILY_TALLY_OBJVAR);
params.put("structure", structure);
messageTo(player, "msgFinalizePackup", params, 0, false);
return;
}
}
if (!hasObjVar(player, HOUSE_PACKUP_DAILY_TALLY_OBJVAR))
{
params.put("structure", structure);
messageTo(player, "msgFinalizePackup", params, 0, false);
return;
}
int dailyHousePacking = getIntObjVar(player, HOUSE_PACKUP_DAILY_TALLY_OBJVAR);
if (dailyHousePacking < 0)
{
dailyHousePacking = 0;
}
if (dailyHousePacking > MAX_PACKUP_PER_DAY)
{
dailyHousePacking = MAX_PACKUP_PER_DAY;
}
if (dailyHousePacking < MAX_PACKUP_PER_DAY)
{
if (!hasObjVar(player, HOUSE_PACKUP_DAILY_TIMER_OBJVAR))
{
removeObjVar(player, HOUSE_PACKUP_DAILY_TALLY_OBJVAR);
}
params.put("structure", structure);
messageTo(player, "msgFinalizePackup", params, 0, false);
}
else if (!canPackMoreToday(player))
{
if (!hasObjVar(player, HOUSE_PACKUP_DAILY_TIMER_OBJVAR))
{
int resetTime = getGameTime() + TIME_TO_NEXT_PACKUP;
blog("packAbandonedBuilding - resetting time to next packup: " + resetTime);
setObjVar(player, HOUSE_PACKUP_DAILY_TIMER_OBJVAR, resetTime);
}
int timeLeft = getIntObjVar(player, HOUSE_PACKUP_DAILY_TIMER_OBJVAR);
timeLeft -= getGameTime();
prose_package p = new prose_package();
prose.setStringId(p, new string_id("spam", "wait_twenty_four"));
prose.setDI(p, MAX_PACKUP_PER_DAY);
prose.setTT(p, utils.assembleTimeRemainToUse(timeLeft, false));
commPlayers(player, "object/mobile/dressed_hiddendagger_pilot_m_01.iff", "sound/sys_comm_other.snd", 5.0f, player, p);
messageTo(player, "handleFailedStructurePackup", null, 0, false);
messageTo(player, "handlePlayerStructurePackupLockoutRemoval", null, 0, false);
}
else
{
blog("player_structure.packAbandonedBuilding I HAVER FALLEN THROUGH THE NORMAL CONDITIONS!!!!");
removeObjVar(player, HOUSE_PACKUP_DAILY_TIMER_OBJVAR);
removeObjVar(player, HOUSE_PACKUP_DAILY_TALLY_OBJVAR);
messageTo(structure, "packAbandonedBuilding", params, 4, false);
}
}
public static boolean canPackMoreToday(obj_id player) throws InterruptedException
{
blog("canPackMoreToday - Init.");
if (!isIdValid(player))
{
return false;
}
if (!hasObjVar(player, HOUSE_PACKUP_DAILY_TALLY_OBJVAR))
{
blog("canPackMoreToday - Player has no tally at all and can pack more.");
return true;
}
blog("canPackMoreToday - Player has pack up DAILY TALLY objvar");
if (!hasObjVar(player, HOUSE_PACKUP_DAILY_TIMER_OBJVAR))
{
blog("canPackMoreToday - The Player CAN PACK MORE");
return true;
}
blog("canPackMoreToday - Player has pack up DAILY TIMER objvar");
int dailyHousePacking = getIntObjVar(player, HOUSE_PACKUP_DAILY_TALLY_OBJVAR);
if (dailyHousePacking < 0)
{
CustomerServiceLog("playerStructure", "House Pack Up - Player " + player + "(" + getName(player) + ") had an INVALID pack up tally amount of less than zero. We are correcting by setting to ZERO");
dailyHousePacking = 0;
}
blog("canPackMoreToday - Player has dailyHousePacking: " + dailyHousePacking);
if (dailyHousePacking > MAX_PACKUP_PER_DAY)
{
dailyHousePacking = MAX_PACKUP_PER_DAY;
}
blog("canPackMoreToday - Player has dailyHousePacking: " + MAX_PACKUP_PER_DAY);
if (dailyHousePacking < MAX_PACKUP_PER_DAY)
{
blog("canPackMoreToday - The Player CAN PACK MORE");
return true;
}
blog("canPackMoreToday - the player has met or exceeded the MAX_PACKUP_PER_DAY but we need to check to make sure that wasn't yesterday's timer.");
int resetTime = getIntObjVar(player, HOUSE_PACKUP_DAILY_TIMER_OBJVAR);
blog("canPackMoreToday - timer resetTime: " + resetTime);
blog("canPackMoreToday - timer resetTime - gameTime: " + (resetTime - getGameTime()));
if (resetTime - getGameTime() <= 0)
{
blog("canPackMoreToday - timer has expired.");
return true;
}
blog("canPackMoreToday - timer has not expired.");
return false;
}
public static boolean isPlayerGatedFromHousePackUp(obj_id player) throws InterruptedException
{
blog("player_structure.isPlayerGatedFromHousePackUp init");
if (!isValidId(player) || !exists(player))
{
return true;
}
blog("player_structure.isPlayerGatedFromHousePackUp is calling canPackMoreToday(player)");
boolean canPackMore = canPackMoreToday(player);
boolean playerLockedOut = isPlayerLockedOutOfHousePackup(player);
if (canPackMore && !playerLockedOut)
{
blog("player_structure.isPlayerGatedFromHousePackUp - canPackMoreToday(player) && !utils.hasScriptVar(player, SCRIPTVAR_HOUSE_PACKUP_LOCKOUT_TIME)");
return false;
}
else if (playerLockedOut && canPackMore)
{
blog("player_structure.isPlayerLockedOutOfHousePackup PLAYER HAS BEEN LOCKED OUT");
int timeNeeded = utils.getIntScriptVar(player, SCRIPTVAR_HOUSE_PACKUP_LOCKOUT_TIME) + (int)HOUSE_PACKUP_LOCKOUT_TIMER;
int timeNow = getGameTime();
blog("player_structure.isPlayerLockedOutOfHousePackup timeNeeded: " + timeNeeded);
blog("player_structure.isPlayerLockedOutOfHousePackup timeNow: " + timeNow);
blog("player_structure.isPlayerLockedOutOfHousePackup timeNow - timeNeeded: " + (timeNow - timeNeeded));
int timeDiff = timeNeeded - timeNow;
if (timeDiff <= 0)
{
blog("player_structure.isPlayerLockedOutOfHousePackup THE LOCK OUT TIME EXPIRED ALREADY");
messageTo(player, "handlePlayerStructurePackupLockoutRemoval", null, 0, false);
return false;
}
prose_package pp = new prose_package();
pp = prose.setStringId(pp, SID_LOCKOUT_MESSAGE);
pp = prose.setTO(pp, utils.formatTimeVerbose(timeDiff));
sendSystemMessageProse(player, pp);
}
else {
blog("player_structure.isPlayerGatedFromHousePackUp - !canPackMoreToday(player)");
if (!hasObjVar(player, HOUSE_PACKUP_DAILY_TIMER_OBJVAR))
{
int resetTime = getGameTime() + TIME_TO_NEXT_PACKUP;
blog("isPlayerGatedFromHousePackUp - resetting time to next packup: " + resetTime);
setObjVar(player, HOUSE_PACKUP_DAILY_TIMER_OBJVAR, resetTime);
}
int timeLeft = getIntObjVar(player, HOUSE_PACKUP_DAILY_TIMER_OBJVAR);
timeLeft -= getGameTime();
prose_package p = new prose_package();
prose.setStringId(p, new string_id("spam", "wait_twenty_four"));
prose.setDI(p, MAX_PACKUP_PER_DAY);
prose.setTT(p, utils.assembleTimeRemainToUse(timeLeft, false));
commPlayers(player, "object/mobile/dressed_hiddendagger_pilot_m_01.iff", "sound/sys_comm_other.snd", 5.0f, player, p);
messageTo(player, "handleFailedStructurePackup", null, 0, false);
messageTo(player, "handlePlayerStructurePackupLockoutRemoval", null, 0, false);
}
return true;
}
public static boolean isPlayerLockedOutOfHousePackup(obj_id player) throws InterruptedException
{
blog("player_structure.isPlayerLockedOutOfHousePackup init");
if (!isValidId(player) || !exists(player))
{
return true;
}
if (utils.hasScriptVar(player, SCRIPTVAR_HOUSE_PACKUP_LOCKOUT_TIME))
{
return true;
}
blog("player_structure.isPlayerLockedOutOfHousePackup FALSE........FALSE on LOCKOUT");
return false;
}
public static int getTotalIncreasedStorageAmountStructure(obj_id structure) throws InterruptedException
{
if (isIdValid(structure))
{
if (hasObjVar(structure, OBJVAR_STRUCTURE_STORAGE_INCREASE))
{
return getIntObjVar(structure, OBJVAR_STRUCTURE_STORAGE_INCREASE);
}
}
return 0;
}
public static boolean validSafeStorageRemoval(obj_id structure, int decreaseAmount) throws InterruptedException
{
int baseItemLimit = getPobBaseItemLimit(structure);
int projectedAmount = baseItemLimit + (getTotalIncreasedStorageAmountStructure(structure) - decreaseAmount);
return !((player_structure.getStructureNumItems(structure) > projectedAmount) || (projectedAmount < baseItemLimit));
}
public static boolean incrementStorageAmount(obj_id player, obj_id structure, obj_id deed, int increaseAmount) throws InterruptedException
{
if (isIdValid(structure) && increaseAmount > 0)
{
int baseStorageIncrease = getTotalIncreasedStorageAmountStructure(structure);
int newStrucStorage = baseStorageIncrease + increaseAmount;
if (newStrucStorage > STORAGE_AMOUNT_CAP)
{
sendSystemMessage(player, MSG_STORAGE_OVER_CAP);
return false;
}
if (newStrucStorage > baseStorageIncrease)
{
setObjVar(structure, OBJVAR_STRUCTURE_STORAGE_INCREASE, newStrucStorage);
if (isNonGenericLootItem(deed))
{
setNonGenericStorageIncreaseOfTypeObjVar(structure, deed, increaseAmount);
}
return true;
}
}
return false;
}
public static boolean decrementStorageAmount(obj_id player, obj_id structure, obj_id terminal, int selectedRedeedTypeIndex) throws InterruptedException
{
if (isIdValid(structure) && isIdValid(terminal))
{
String crate = "item_storage_increase_05_03";
if (utils.hasScriptVar(terminal, "storageTypeNamesRef"))
{
String[] storageTypeNamesArrayRef = utils.getStringBatchScriptVar(terminal, "storageTypeNamesRef");
crate = storageTypeNamesArrayRef[selectedRedeedTypeIndex];
}
int decreaseAmount = STORAGE_AMOUNT_DECREASE_UNIT;
String nonGenericStorageTypeObjVar = NON_GENERIC_STORAGE_ITEM_OBJVAR + "." + crate;
if (hasObjVar(structure, nonGenericStorageTypeObjVar))
{
decreaseAmount = getIntObjVar(structure, nonGenericStorageTypeObjVar);
}
int newStrucStorage = getTotalIncreasedStorageAmountStructure(structure) - decreaseAmount;
if (newStrucStorage >= 0 && validSafeStorageRemoval(structure, decreaseAmount))
{
obj_id pInv = utils.getInventoryContainer(player);
if (!isIdValid(pInv))
{
return false;
}
static_item.createNewItemFunction(crate, pInv);
removeNonGenericStorageIncreaseOfTypeObjVar(structure, crate);
if (newStrucStorage == 0)
{
removeObjVar(structure, OBJVAR_STRUCTURE_STORAGE_INCREASE);
return true;
}
setObjVar(structure, OBJVAR_STRUCTURE_STORAGE_INCREASE, newStrucStorage);
return true;
}
else
{
sendSystemMessage(player, new string_id("player_structure", "storage_item_cannot_remove"));
player_structure.displayAvailableNonGenericStorageTypes(player, terminal, structure);
}
}
return false;
}
public static boolean isNonGenericLootItem(obj_id deed) throws InterruptedException
{
return hasObjVar(deed, "nonGenericStorageItem");
}
public static boolean alreadyHasNonGenericStorageIncreaseOfType(obj_id structure, obj_id deed) throws InterruptedException
{
return hasObjVar(structure, NON_GENERIC_STORAGE_ITEM_OBJVAR + "." + getStaticItemName(deed));
}
public static void setNonGenericStorageIncreaseOfTypeObjVar(obj_id structure, obj_id deed, int increaseAmount) throws InterruptedException
{
setObjVar(structure, NON_GENERIC_STORAGE_ITEM_OBJVAR + "." + getStaticItemName(deed), increaseAmount);
}
public static void removeNonGenericStorageIncreaseOfTypeObjVar(obj_id structure, String type) throws InterruptedException
{
String nonGenericStorageTypeObjVar = NON_GENERIC_STORAGE_ITEM_OBJVAR + "." + type;
if (hasObjVar(structure, nonGenericStorageTypeObjVar))
{
removeObjVar(structure, nonGenericStorageTypeObjVar);
}
}
public static void displayAvailableNonGenericStorageTypes(obj_id player, obj_id terminal, obj_id structure) throws InterruptedException
{
if (utils.hasScriptVar(player, "structureStorageRedeedPid"))
{
forceCloseSUIPage(utils.getIntScriptVar(player, "structureStorageRedeedPid"));
}
String[] storageTypeNamesArrayRef = getStorageTypeNamesArray(structure);
if (!hasObjVar(structure, NON_GENERIC_STORAGE_ITEM_OBJVAR))
{
if (validSafeStorageRemoval(structure, STORAGE_AMOUNT_DECREASE_UNIT))
{
handleStorageReclaimConfirmation(player, terminal);
}
else
{
sendSystemMessage(player, new string_id("sui", "storage_item_count_over_base"));
}
}
else
{
String[] storageTypeNamesArrayStrings = new String[storageTypeNamesArrayRef.length];
for (int i = 0; i < storageTypeNamesArrayRef.length; i++)
{
String nonGenericStorateType = storageTypeNamesArrayRef[i];
int decreaseAmount = STORAGE_AMOUNT_DECREASE_UNIT;
String nonGenericStorageTypeObjVar = NON_GENERIC_STORAGE_ITEM_OBJVAR + "." + nonGenericStorateType;
if (hasObjVar(structure, nonGenericStorageTypeObjVar))
{
decreaseAmount = getIntObjVar(structure, nonGenericStorageTypeObjVar);
}
if (validSafeStorageRemoval(structure, decreaseAmount))
{
storageTypeNamesArrayStrings[i] = utils.packStringId(new string_id("static_item_n", nonGenericStorateType));
}
else
{
String greyedOut = utils.packStringId(new string_id("static_item_n", nonGenericStorateType));
string_id contrastText_sid = new string_id("faction_recruiter", "rank_list_empty");
prose_package pp = prose.getPackage(contrastText_sid);
prose.setTO(pp, greyedOut);
storageTypeNamesArrayStrings[i] = "\0" + packOutOfBandProsePackage(null, pp);
}
}
int newSui = sui.listbox(
terminal,
player,
utils.packStringId(new string_id("player_structure", "sui_storage_nongeneric_redeed_prompt")),
sui.OK_CANCEL,
utils.packStringId(new string_id("player_structure", "sui_storage_nongeneric_redeed_title")),
storageTypeNamesArrayStrings, "handleStorageRedeedChoice"
);
utils.setScriptVar(player, "structureStorageRedeedPid", newSui);
}
utils.setBatchScriptVar(terminal, "storageTypeNamesRef", storageTypeNamesArrayRef);
}
public static String[] getStorageTypeNamesArray(obj_id structure) throws InterruptedException
{
Vector storageIncreaseTypes = new Vector();
storageIncreaseTypes.setSize(0);
int totalNonGenericStorageIncrease = 0;
if (hasObjVar(structure, NON_GENERIC_STORAGE_ITEM_OBJVAR))
{
obj_var_list nonGenericStorageObjvarList = getObjVarList(structure, NON_GENERIC_STORAGE_ITEM_OBJVAR);
if (nonGenericStorageObjvarList != null)
{
int numItem = nonGenericStorageObjvarList.getNumItems();
obj_var nonGenericStorageObjvar;
String nonGenericStorageObjvarName;
for (int i = 0; i < numItem; i++)
{
nonGenericStorageObjvar = nonGenericStorageObjvarList.getObjVar(i);
nonGenericStorageObjvarName = nonGenericStorageObjvar.getName();
totalNonGenericStorageIncrease = totalNonGenericStorageIncrease + nonGenericStorageObjvar.getIntData();
if (nonGenericStorageObjvarName != null && nonGenericStorageObjvarName.length() > 0)
{
storageIncreaseTypes = utils.addElement(storageIncreaseTypes, nonGenericStorageObjvarName);
}
}
}
}
if (getTotalIncreasedStorageAmountStructure(structure) > totalNonGenericStorageIncrease)
{
storageIncreaseTypes = utils.addElement(storageIncreaseTypes, "item_storage_increase_05_03");
}
String[] _storageIncreaseTypes = new String[0];
if (storageIncreaseTypes != null)
{
_storageIncreaseTypes = new String[storageIncreaseTypes.size()];
storageIncreaseTypes.toArray(_storageIncreaseTypes);
}
return _storageIncreaseTypes;
}
public static boolean handleStorageReclaimConfirmation(obj_id player, obj_id terminal) throws InterruptedException
{
sui.msgbox(
terminal,
player,
utils.packStringId(new string_id("player_structure", "sui_storage_redeed_prompt")),
sui.YES_NO,
utils.packStringId(new string_id("player_structure", "sui_storage_redeed_title")),
"handleStorageRedeedChoice"
);
return false;
}
public static boolean canRotateFurnitureInPitchRollAxes(obj_id player) throws InterruptedException {
return isIdValid(player) && hasCompletedCollection(player, "force_shui_tier_02");
}
public static boolean isPlayerStructure(obj_id target) throws InterruptedException
{
if (!isValidId(target) || !exists(target))
{
return false;
}
if (!isBuilding(target))
{
return false;
}
if (!hasObjVar(target, "player_structure"))
{
return false;
}
String template = getTemplateName(target);
if (template == null || template.equals(""))
{
return false;
}
if (!template.startsWith("object/building/player/"))
{
return false;
}
return isGameObjectTypeOf(target, GOT_building_player);
}
public static boolean hasSpecialSignSkillMod(obj_id player, obj_id structure) throws InterruptedException
{
blog("player_structure.hasSpecialSignSkillMod: init");
if (!isValidId(player) || !exists(player))
{
return false;
}
blog("player_structure.hasSpecialSignSkillMod: initial validation passes");
String[] specialSignSkillMods = dataTableGetStringColumn(TBL_SPECIAL_SIGNS, "skillmod_name");
if (specialSignSkillMods == null || specialSignSkillMods.length <= 0)
{
return false;
}
int[] adminSpecialSign = dataTableGetIntColumn(TBL_SPECIAL_SIGNS, "admin_placement");
blog("player_structure.hasSpecialSignSkillMod: about to test each of the special signs to see if I have the necessary skill mods.");
for (int i = 0; i < specialSignSkillMods.length; i++)
{
if (getSkillStatMod(player, specialSignSkillMods[i]) <= 0)
{
continue;
}
if (!isOwner(structure, player) && adminSpecialSign[i] == 0)
{
continue;
}
blog("player_structure.hasSpecialSignSkillMod: Found a skill mod I have: " + specialSignSkillMods[i]);
return true;
}
return false;
}
public static boolean getSpecialSignList(obj_id player, obj_id structure) throws InterruptedException
{
blog("player_structure.getSpecialSignList: init");
if (!isValidId(player) || !exists(player))
{
return false;
}
boolean owner = isOwner(structure, player);
blog("player_structure.getSpecialSignList: initial validation passes");
String[] specialSignSkillMods = dataTableGetStringColumn(TBL_SPECIAL_SIGNS, "skillmod_name");
int[] adminSpecialSign = dataTableGetIntColumn(TBL_SPECIAL_SIGNS, "admin_placement");
if (specialSignSkillMods == null || specialSignSkillMods.length <= 0)
{
return false;
}
String[] specialSignTemplates = dataTableGetStringColumn(TBL_SPECIAL_SIGNS, "sign_template");
if (specialSignTemplates == null || specialSignTemplates.length <= 0)
{
return false;
}
if (specialSignSkillMods.length != specialSignTemplates.length)
{
return false;
}
Vector allSignTemplates = new Vector();
allSignTemplates.setSize(0);
Vector allSignStrings = new Vector();
allSignStrings.setSize(0);
blog("player_structure.getSpecialSignList: about to test each of the special signs to see if I have the necessary skill mods.");
String[] specialSignNames = dataTableGetStringColumn(TBL_SPECIAL_SIGNS, "string_mapping");
for (int i = 0; i < specialSignSkillMods.length; i++)
{
if (getSkillStatMod(player, specialSignSkillMods[i]) <= 0)
{
continue;
}
if (!owner && adminSpecialSign[i] <= 0)
{
continue;
}
blog("player_structure.getSpecialSignList: Found a skill mod I have: " + specialSignSkillMods[i]);
utils.addElement(allSignTemplates, specialSignTemplates[i]);
utils.addElement(allSignStrings, "@" + specialSignNames[i]);
}
if (allSignTemplates.size() <= 0)
{
return false;
}
if (allSignStrings.size() <= 0)
{
return false;
}
String[] signList = new String[allSignTemplates.size()];
allSignTemplates.toArray(signList);
String[] signName = new String[allSignStrings.size()];
allSignStrings.toArray(signName);
utils.setScriptVar(player, VAR_SPECIAL_SIGN_LIST, signList);
utils.setScriptVar(player, VAR_SPECIAL_SIGN_NAMES, signName);
return true;
}
public static boolean removeSpecialSign(obj_id player, obj_id structure, boolean revertMessage) throws InterruptedException
{
blog("player_structure.removeSpecialSign - init");
if (!isValidId(player) || !isValidId(structure))
{
return false;
}
if (hasObjVar(structure, MODIFIED_HOUSE_SIGN_MODEL))
{
revertCustomSign(player, structure);
return true;
}
if (hasObjVar(structure, SPECIAL_SIGN_OWNER_ONLY))
{
boolean needsOwnerToRemove = getBooleanObjVar(structure, SPECIAL_SIGN_OWNER_ONLY);
if (!isOwner(structure, player) && needsOwnerToRemove)
{
sendSystemMessage(player, SID_ONLY_OWNER_CAN_REMOVE);
return false;
}
}
String skillmod = getStringObjVar(structure, SPECIAL_SIGN_SKILLMOD);
if (skillmod == null || skillmod.length() <= 0)
{
return false;
}
blog("player_structure.removeSpecialSign - validation completed");
boolean ownerOnlyRecovery = false;
if (hasObjVar(structure, SPECIAL_SIGN_OWNER_ONLY) && getBooleanObjVar(structure, SPECIAL_SIGN_OWNER_ONLY))
{
ownerOnlyRecovery = true;
}
String signTemplateRecovery = getStringObjVar(structure, SPECIAL_SIGN_TEMPLATE);
int signTypeRecovery = 0;
if (hasObjVar(structure, VAR_SIGN_TYPE))
{
signTypeRecovery = getIntObjVar(structure, VAR_SIGN_TYPE);
}
if (signTemplateRecovery == null || signTemplateRecovery.length() <= 0 || signTypeRecovery <= -1)
{
blog("player_structure.removeSpecialSign - signTemplateRecovery failed");
sendSystemMessage(player, SID_SPECIAL_SIGN_FAILED);
CustomerServiceLog("playerStructure", "Special Sign could not be removed and replaced with default sign on structure " + structure + ". The player: " + player + ". Reason: signTemplateRecovery failed.");
return false;
}
removeObjVar(structure, SPECIAL_SIGN);
removeObjVar(structure, SPECIAL_SIGN_TEMPLATE);
removeObjVar(structure, VAR_SIGN_TYPE);
removeObjVar(structure, SPECIAL_SIGN_SKILLMOD);
removeObjVar(structure, SPECIAL_SIGN_OWNER_ONLY);
if (!isValidId(player_structure.createStructureSign(structure)))
{
setObjVar(structure, SPECIAL_SIGN, true);
setObjVar(structure, SPECIAL_SIGN_TEMPLATE, signTemplateRecovery);
setObjVar(structure, VAR_SIGN_TYPE, signTypeRecovery);
setObjVar(structure, VAR_SIGN_TYPE, getStringObjVar(structure, SPECIAL_SIGN_SKILLMOD));
setObjVar(structure, SPECIAL_SIGN_OWNER_ONLY, ownerOnlyRecovery);
blog("player_structure.removeSpecialSign - Default Sign Creation failed!!!!!!!!!!!!!!!!!");
sendSystemMessage(player, SID_SPECIAL_SIGN_FAILED);
CustomerServiceLog("playerStructure", "Special Sign could not be removed and replaced with default sign on structure " + structure + ". The player: " + player + ". Reason: createStructureSign failed.");
return false;
}
if (hasObjVar(structure, SPECIAL_SIGN_DECREMENT_MOD))
{
if (!applySkillStatisticModifier(player, skillmod, 1))
{
blog("player_structure.removeSpecialSign - Applying skillmod failed!!!!!!!!!!!!!!!!!");
CustomerServiceLog("playerStructure", "Player: " + player + " attempted to remove special sign from structure: " + structure + ". During the destroy process the skillmod: " + skillmod + " failed to be reimbursed so the process was aborted.");
sendSystemMessage(player, SID_SPECIAL_SIGN_FAILED);
return false;
}
removeObjVar(structure, player_structure.SPECIAL_SIGN_DECREMENT_MOD);
}
blog("player_structure.removeSpecialSign - skillmod reimbursed and default sign created");
if (revertMessage)
{
sendSystemMessage(player, SID_SPECIAL_SIGN_REVERT_SUCCESS);
}
CustomerServiceLog("playerStructure", "Player: " + player + " removed special sign from structure: " + structure + ". During the destroy process the skillmod: " + skillmod + " was reimbursed.");
return true;
}
public static boolean blog(String msg) throws InterruptedException
{
if (LOGGING_ON && msg != null && !msg.equals(""))
{
LOG(LOGGING_CATEGORY, msg);
}
return true;
}
public static void revertCustomSign(obj_id player, obj_id structure) throws InterruptedException
{
blog("revertCustomSign - revertCustomSign init");
player_structure.destroyStructureSign(structure);
removeObjVar(structure, player_structure.MODIFIED_HOUSE_SIGN);
String customSign = getStringObjVar(structure, player_structure.MODIFIED_HOUSE_SIGN_MODEL);
String newSign = "";
blog("revertCustomSign - customSign: " + customSign);
if (customSign.equals("item_event_halloween_house_sign"))
{
blog("revertCustomSign - customSign: item_event_halloween_house_sign " + customSign);
newSign = "item_special_sign_halloween_hanging_sign";
}
else if (customSign.equals("item_event_halloween_house_sign_standing"))
{
blog("revertCustomSign - customSign: item_event_halloween_house_sign_standing " + customSign);
newSign = "item_special_sign_halloween_standing_sign";
}
if (newSign.length() <= 0)
{
blog("revertCustomSign - customSign: FAIL!!!!!!!!!!!");
obj_id sign = static_item.createNewItemFunction(customSign, player);
if (isValidId(sign))
{
CustomerServiceLog("playerStructure", "Player: " + player + " attempted to remove their old Galactic Moon Festival Sign: " + customSign + " from structure: " + structure + " but it failed to update to the new special sign system. The player was reimbursed with the old sign object: " + sign + ".");
}
else
{
CustomerServiceLog("playerStructure", "Player: " + player + " attempted to remove their old Galactic Moon Festival Sign: " + customSign + " from structure: " + structure + " but it failed to update to the new special sign system. The player was reimbursed with the old sign object: " + sign + ".");
}
}
else
{
blog("revertCustomSign - customSign: SUCCESS: " + newSign);
obj_id sign = static_item.createNewItemFunction(newSign, player);
if (isValidId(sign))
{
blog("revertCustomSign - customSign: Object ID: " + sign);
CustomerServiceLog("playerStructure", "Player: " + player + " remove their old Galactic Moon Festival Sign: " + customSign + " from structure: " + structure + " and received a new skillmod sign object: " + sign + ".");
sendSystemMessage(player, SID_HALLOWEEN_SIGN_UPDATED);
}
else
{
blog("revertCustomSign - customSign: Object COULD NOT BE CREATED");
CustomerServiceLog("playerStructure", "Player: " + player + " attempted to remove their old Galactic Moon Festival Sign: " + customSign + " from structure: " + structure + " but it failed to update to the new special sign system. The player was reimbursed with the old sign object: " + sign + ".");
}
}
removeObjVar(structure, player_structure.MODIFIED_HOUSE_SIGN_MODEL);
player_structure.createStructureSign(structure);
}
public static void initializeFindAllItemsInHouse(obj_id self, obj_id player) throws InterruptedException
{
cleanupFindItemScriptVars(player);
cleanupFindItemScriptVars(self);
showFindItemsListboxPage(self, player, 0);
}
public static void initializeItemSearchInHouse(obj_id self, obj_id player) throws InterruptedException
{
int pid = sui.inputbox(
self,
player,
getString(new string_id("player_structure", "find_items_search_keyword_prompt")),
sui.OK_CANCEL,
utils.packStringId(new string_id("player_structure","find_items_search_keyword_title")),
sui.INPUT_NORMAL,
null,
"handlePlayerStructureSearchItemsGetKeyword"
);
if (pid > -1)
{
sui.showSUIPage(pid);
utils.setScriptVar(player, "findItems.pid", pid);
}
}
public static void showFindItemsListboxPage(obj_id self, obj_id player, int startingIndex) throws InterruptedException
{
cleanupFindItemScriptVars(player);
cleanupFindItemScriptVars(self);
Vector myItemsInBuilding = getMyItemsInBuilding(player);
if (myItemsInBuilding != null && myItemsInBuilding.size() > 0)
{
int totalNumItems = myItemsInBuilding.size();
if (totalNumItems <= 49)
{
startingIndex = 0;
}
int endingIndex = startingIndex + 49;
if (endingIndex >= totalNumItems)
{
endingIndex = totalNumItems - 1;
}
String[] itemsPageNamesList = new String[(endingIndex + 1) - startingIndex];
obj_id[] itemsPageList = new obj_id[(endingIndex + 1) - startingIndex];
int j = 0;
obj_id item;
for (int i = startingIndex; i <= endingIndex; i++)
{
item = ((obj_id)myItemsInBuilding.get(i));
itemsPageNamesList[j] = getEncodedName(item);
itemsPageList[j] = item;
++j;
}
showFindItemsListboxSui(self, player, startingIndex, totalNumItems, itemsPageList, itemsPageNamesList);
}
else
{
sendSystemMessage(player, new string_id("player_structure", "find_items_no_items_found"));
cleanupFindItemScriptVars(player);
cleanupFindItemScriptVars(self);
}
}
public static void repeatFindItemsListboxPage(obj_id self, obj_id player, int startingIndex, int totalNumItems, obj_id[] itemsPageList) throws InterruptedException
{
cleanupFindItemScriptVars(player);
cleanupFindItemScriptVars(self);
String[] itemsPageNamesList = new String[itemsPageList.length];
for (int i = 0; i < itemsPageList.length; i++)
{
itemsPageNamesList[i] = getEncodedName(itemsPageList[i]);
}
showFindItemsListboxSui(self, player, startingIndex, totalNumItems, itemsPageList, itemsPageNamesList);
}
public static void showFindItemsListboxSui(obj_id self, obj_id player, int startingIndex, int totalNumItems, obj_id[] itemsPageList, String[] itemsPageNamesList) throws InterruptedException
{
String prompt = utils.packStringId(new string_id("player_structure", "find_items_prompt"));
prompt += target_dummy.addLineBreaks(2) + target_dummy.ORANGE + "Number of Items Found: " + target_dummy.WHITE + totalNumItems;
int endingIndex = startingIndex + 49;
if (endingIndex >= totalNumItems)
{
endingIndex = totalNumItems - 1;
}
prompt += target_dummy.addLineBreaks(1);
prompt += target_dummy.ORANGE + "Displaying Items: " + target_dummy.WHITE + (startingIndex + 1) + " through " + (endingIndex + 1);
int pid = sui.listbox(self, player, prompt, sui.OK_CANCEL_REFRESH, utils.packStringId(new string_id("player_structure", "find_items_title")), itemsPageNamesList, "handlePlayerStructureFindItemsListResponse");
if (pid > -1)
{
if (totalNumItems > 50)
{
sui.listboxUseOtherButton(pid, "Change Page");
}
else
{
sui.listboxUseOtherButton(pid, "Refresh Page");
}
sui.setSUIProperty(pid, sui.LISTBOX_BTN_OK, sui.PROP_TEXT, "Retrieve Object");
sui.showSUIPage(pid);
utils.setScriptVar(player, "findItems.pid", pid);
utils.setScriptVar(player, "findItems.startingIndex", startingIndex);
utils.setScriptVar(player, "findItems.totalNumItems", totalNumItems);
utils.setScriptVar(self, "findItems.itemsPageList", itemsPageList);
}
}
public static Vector getMyItemsInBuilding(obj_id player) throws InterruptedException
{
Vector myItemsInBuilding = new Vector();
myItemsInBuilding.setSize(0);
location here = getLocation(player);
obj_id myCell = here.cell;
if (isIdValid(myCell))
{
obj_id building = getContainedBy(myCell);
if (isIdValid(building))
{
obj_id buildingOwner = getOwner(building);
if ((isIdValid(buildingOwner) && player == buildingOwner) || isGod(player))
{
obj_id[] cellList = getContents(building);
if (cellList != null && cellList.length > 0)
{
for (obj_id buildingCell : cellList) {
if ((getTemplateName(buildingCell)).equals(structure.TEMPLATE_CELL)) {
addPlayerItemsFromContainerToList(buildingCell, player, myItemsInBuilding);
}
}
}
}
else
{
sendSystemMessage(player, new string_id("player_structure", "find_items_not_building_owner"));
}
}
else
{
sendSystemMessage(player, new string_id("player_structure", "find_items_not_in_a_cell"));
}
}
else
{
sendSystemMessage(player, new string_id("player_structure", "find_items_not_in_a_building"));
}
if (myItemsInBuilding.size() > 0)
{
return myItemsInBuilding;
}
return null;
}
public static void addPlayerItemsFromContainerToList(obj_id container, obj_id player, Vector myItemsInBuilding) throws InterruptedException
{
obj_id[] contents = getContents(container);
if (contents != null && contents.length > 0)
{
boolean isValidPlayerOwnedObject;
obj_id ship;
obj_id lootBox;
for (obj_id thing : contents) {
if (isIdValid(thing)) {
isValidPlayerOwnedObject = !(player != getOwner(thing) && !isGod(player));
if (!isObjectPersisted(thing)) {
isValidPlayerOwnedObject = false;
}
if (isPlayer(thing)) {
isValidPlayerOwnedObject = false;
}
if (isMob(thing)) {
isValidPlayerOwnedObject = false;
}
ship = space_transition.getContainingShip(thing);
if (isIdValid(ship)) {
lootBox = obj_id.NULL_ID;
if (hasObjVar(ship, "objLootBox")) {
lootBox = getObjIdObjVar(ship, "objLootBox");
}
if (isIdValid(lootBox) && lootBox == thing) {
isValidPlayerOwnedObject = false;
}
}
if (hasCondition(thing, CONDITION_VENDOR)) {
isValidPlayerOwnedObject = false;
}
if (isValidPlayerOwnedObject) {
if (getContainerType(thing) != 0 && getGameObjectType(thing) != GOT_misc_factory_crate) {
addPlayerItemsFromContainerToList(thing, player, myItemsInBuilding);
}
utils.addElement(myItemsInBuilding, thing);
}
}
}
}
}
public static boolean moveItemInBuildingToPlayer(obj_id player, obj_id selectedItem) throws InterruptedException
{
location here = getLocation(player);
obj_id myCell = here.cell;
if (isIdValid(myCell))
{
obj_id building = getContainedBy(myCell);
if (isIdValid(building))
{
obj_id buildingOwner = getOwner(building);
if ((isIdValid(buildingOwner) && player == buildingOwner) || isGod(player))
{
if (exists(selectedItem))
{
if (!utils.isNestedWithinAPlayer(selectedItem))
{
if (getTopMostContainer(selectedItem) == getTopMostContainer(player))
{
obj_id topNonCellContainer = getTopNonCellContainer(selectedItem);
string_id message = new string_id("player_structure", "find_items_item_moved");
if (topNonCellContainer != selectedItem)
{
message = new string_id("player_structure", "find_items_item_container_moved");
}
prose_package pp = prose.getPackage(message);
prose.setTO(pp, getEncodedName(selectedItem));
prose.setTT(pp, getEncodedName(topNonCellContainer));
sendQuestSystemMessage(player, pp);
setLocation(topNonCellContainer, here);
return true;
}
else
{
sendSystemMessage(player, new string_id("player_structure", "find_items_failed_not_in_same_building"));
}
}
else
{
if (utils.isNestedWithin(selectedItem, player))
{
sendSystemMessage(player, new string_id("player_structure", "find_items_failed_nested_within_you"));
}
else
{
sendSystemMessage(player, new string_id("player_structure", "find_items_failed_nested_within_other_player"));
}
}
}
else
{
sendSystemMessage(player, new string_id("player_structure", "find_items_failed_no_longer_exists"));
}
}
else
{
sendSystemMessage(player, new string_id("player_structure", "find_items_failed_not_owner"));
}
}
else
{
sendSystemMessage(player, new string_id("player_structure", "find_items_failed_uncontained_cell"));
}
}
else
{
sendSystemMessage(player, new string_id("player_structure", "find_items_failed_not_outside"));
}
return false;
}
public static obj_id getTopNonCellContainer(obj_id item) throws InterruptedException
{
obj_id container = getContainedBy(item);
if (!isIdValid(container))
{
return item;
}
else if ((getTemplateName(container)).equals(structure.TEMPLATE_CELL))
{
return item;
}
else
{
return getTopNonCellContainer(container);
}
}
public static void cleanupFindItemScriptVars(obj_id target) throws InterruptedException
{
utils.removeScriptVarTree(target, "findItems");
}
public static void handleFindItemsListResponse(obj_id self, dictionary params) throws InterruptedException
{
if (params == null || params.isEmpty())
{
return;
}
obj_id player = sui.getPlayerId(params);
if (!isIdValid(player))
{
return;
}
int button = sui.getIntButtonPressed(params);
if (button == sui.BP_CANCEL)
{
sendSystemMessage(player, new string_id("player_structure", "find_items_search_cancelled"));
cleanupFindItemScriptVars(player);
cleanupFindItemScriptVars(self);
return;
}
int startingIndex = utils.getIntScriptVar(player, "findItems.startingIndex");
int totalNumItems = utils.getIntScriptVar(player, "findItems.totalNumItems");
obj_id[] itemsPageList = utils.getObjIdArrayScriptVar(self, "findItems.itemsPageList");
if (itemsPageList == null || itemsPageList.length < 1)
{
sendSystemMessage(player, new string_id("player_structure", "find_items_no_items_found"));
cleanupFindItemScriptVars(player);
cleanupFindItemScriptVars(self);
return;
}
if (button == sui.BP_REVERT)
{
if (totalNumItems > 50)
{
String title = utils.packStringId(new string_id("player_structure", "find_items_page_title"));
String prompt;
int pid = sui.createSUIPage(sui.SUI_MSGBOX, self, player, "handlePlayerStructureFindItemsPageResponse");
if (startingIndex == 0)
{
if (pid > -1)
{
setSUIProperty(pid, sui.MSGBOX_TITLE, sui.PROP_TEXT, title);
prompt = utils.packStringId(new string_id("player_structure", "find_items_page_next_prompt"));
setSUIProperty(pid, sui.MSGBOX_PROMPT, sui.PROP_TEXT, prompt);
sui.msgboxButtonSetup(pid, sui.YES_NO);
setSUIProperty(pid, sui.MSGBOX_BTN_OK, sui.PROP_TEXT, "Next Page");
setSUIProperty(pid, sui.MSGBOX_BTN_CANCEL, sui.PROP_TEXT, "Cancel");
sui.showSUIPage(pid);
}
}
else if (startingIndex + 50 >= totalNumItems)
{
if (pid > -1)
{
setSUIProperty(pid, sui.MSGBOX_TITLE, sui.PROP_TEXT, title);
prompt = utils.packStringId(new string_id("player_structure", "find_items_page_previous_prompt"));
setSUIProperty(pid, sui.MSGBOX_PROMPT, sui.PROP_TEXT, prompt);
sui.msgboxButtonSetup(pid, sui.YES_NO);
setSUIProperty(pid, sui.MSGBOX_BTN_OK, sui.PROP_TEXT, "Previous Page");
setSUIProperty(pid, sui.MSGBOX_BTN_CANCEL, sui.PROP_TEXT, "Cancel");
utils.setScriptVar(player, "findItems.lastPage", 1);
sui.showSUIPage(pid);
}
}
else
{
if (pid > -1)
{
setSUIProperty(pid, sui.MSGBOX_TITLE, sui.PROP_TEXT, title);
prompt = utils.packStringId(new string_id("player_structure", "find_items_page_next_previous_prompt"));
setSUIProperty(pid, sui.MSGBOX_PROMPT, sui.PROP_TEXT, prompt);
sui.msgboxButtonSetup(pid, sui.YES_NO_CANCEL);
setSUIProperty(pid, sui.MSGBOX_BTN_REVERT, sui.PROP_TEXT, "Previous Page");
setSUIProperty(pid, sui.MSGBOX_BTN_OK, sui.PROP_TEXT, "Next Page");
setSUIProperty(pid, sui.MSGBOX_BTN_CANCEL, sui.PROP_TEXT, "Cancel");
setSUIProperty(pid, sui.MSGBOX_BTN_REVERT, "OnPress", "RevertWasPressed=1\r\nparent.btnOk.press=t");
subscribeToSUIProperty(pid, sui.MSGBOX_BTN_REVERT, "RevertWasPressed");
sui.showSUIPage(pid);
}
}
}
else
{
repeatFindItemsListboxPage(self, player, startingIndex, totalNumItems, itemsPageList);
}
return;
}
int item_selected = sui.getListboxSelectedRow(params);
if (item_selected < 0)
{
sendSystemMessage(player, new string_id("player_structure", "find_items_no_selection"));
cleanupFindItemScriptVars(player);
cleanupFindItemScriptVars(self);
return;
}
obj_id selectedItem = itemsPageList[item_selected];
if (isIdValid(selectedItem))
{
moveItemInBuildingToPlayer(player, selectedItem);
repeatFindItemsListboxPage(self, player, startingIndex, totalNumItems, itemsPageList);
return;
}
cleanupFindItemScriptVars(player);
cleanupFindItemScriptVars(self);
}
public static void handleFindItemsChangePageResponse(obj_id self, dictionary params) throws InterruptedException
{
if (params == null || params.isEmpty())
{
return;
}
obj_id player = sui.getPlayerId(params);
if (!isIdValid(player))
{
return;
}
String revert = params.getString(sui.MSGBOX_BTN_REVERT + ".RevertWasPressed");
int button = sui.getIntButtonPressed(params);
if (button == sui.BP_CANCEL)
{
sendSystemMessage(player, new string_id("player_structure", "find_items_search_cancelled"));
cleanupFindItemScriptVars(player);
cleanupFindItemScriptVars(self);
return;
}
int startingIndex = utils.getIntScriptVar(player, "findItems.startingIndex");
if (revert != null && !revert.equals(""))
{
startingIndex = startingIndex - 50;
}
else if (utils.hasScriptVar(player, "findItems.lastPage"))
{
startingIndex = startingIndex - 50;
}
else
{
startingIndex = startingIndex + 50;
}
if (startingIndex < 0)
{
startingIndex = 0;
}
cleanupFindItemScriptVars(player);
cleanupFindItemScriptVars(self);
showFindItemsListboxPage(self, player, startingIndex);
}
public static void handleSearchItemsGetKeyword(obj_id self, dictionary params) throws InterruptedException
{
if (params == null || params.isEmpty())
{
return;
}
obj_id player = sui.getPlayerId(params);
if (!isIdValid(player))
{
return;
}
int btn = sui.getIntButtonPressed(params);
if (btn == sui.BP_CANCEL)
{
sendSystemMessage(player, new string_id("player_structure", "find_items_search_cancelled"));
return;
}
String keyword = toLower(sui.getInputBoxText(params));
if (keyword == null || keyword.length() < 1)
{
sendSystemMessage(player, new string_id("player_structure", "find_items_search_no_keyword"));
return;
}
Vector myItemsInBuilding = player_structure.getMyItemsInBuilding(player);
Vector keywordMatchedIds = new Vector();
keywordMatchedIds.setSize(0);
Vector keywordMatchedNames = new Vector();
keywordMatchedNames.setSize(0);
int numMatches = 0;
String prompt = utils.packStringId(new string_id("player_structure", "find_items_search_list_prompt"));
obj_id thing;
String name;
string_id sidName;
for (Object myItem : myItemsInBuilding) {
thing = ((obj_id) myItem);
name = getAssignedName(thing);
if (name == null || name.length() < 1) {
sidName = getNameStringId(thing);
if (sidName != null && !sidName.isEmpty()) {
sidName = utils.unpackString("@" + sidName.toString());
name = getString(sidName);
if (name.startsWith("@")) {
CustomerServiceLog("findItemInStructure", "Server localization for this item failed: " + getTemplateName(thing) + " (" + thing + ").");
}
}
}
if (toLower(name).contains(keyword)) {
utils.addElement(keywordMatchedIds, thing);
utils.addElement(keywordMatchedNames, name);
++numMatches;
}
if (numMatches >= 50) {
prompt = utils.packStringId(new string_id("player_structure", "find_items_search_list_too_long_prompt"));
break;
}
}
if (keywordMatchedIds.size() < 1)
{
sendSystemMessage(player, new string_id("player_structure", "find_items_search_not_found"));
return;
}
if (keywordMatchedNames.size() < 1 || keywordMatchedIds.size() != keywordMatchedNames.size())
{
return;
}
showSearchItemsListboxSui(self, player, utils.toStaticObjIdArray(keywordMatchedIds), utils.toStaticStringArray(keywordMatchedNames), prompt);
}
public static void repeatSearchItemsKeywordList(obj_id self, obj_id player, obj_id[] matchingItemsList) throws InterruptedException
{
cleanupFindItemScriptVars(player);
cleanupFindItemScriptVars(self);
String[] matchingItemsNamesList = new String[matchingItemsList.length];
for (int i = 0; i < matchingItemsList.length; i++)
{
matchingItemsNamesList[i] = getEncodedName(matchingItemsList[i]);
}
String prompt = utils.packStringId(new string_id("player_structure", "find_items_search_list_prompt"));
if (matchingItemsList.length >= 50)
{
prompt = utils.packStringId(new string_id("player_structure", "find_items_search_list_too_long_prompt"));
}
showSearchItemsListboxSui(self, player, matchingItemsList, matchingItemsNamesList, prompt);
}
public static void showSearchItemsListboxSui(obj_id self, obj_id player, obj_id[] matchingItemsList, String[] matchingItemsNamesList, String prompt) throws InterruptedException
{
int pid = sui.listbox(
self,
player,
prompt,
sui.OK_CANCEL,
utils.packStringId(new string_id("player_structure", "find_items_search_list_title")),
matchingItemsNamesList,
"handlePlayerStructureSearchItemsSelectedResponse"
);
if (pid > -1)
{
sui.setSUIProperty(pid, sui.LISTBOX_BTN_OK, sui.PROP_TEXT, "Retrieve Object");
sui.showSUIPage(pid);
utils.setScriptVar(player, "findItems.pid", pid);
utils.setScriptVar(self, "findItems.searchList", matchingItemsList);
}
}
public static void handleSearchItemsSelectedResponse(obj_id self, dictionary params) throws InterruptedException
{
if (params == null || params.isEmpty())
{
return;
}
obj_id player = sui.getPlayerId(params);
if (!isIdValid(player))
{
return;
}
if (sui.getIntButtonPressed(params) == sui.BP_CANCEL)
{
sendSystemMessage(player, new string_id("player_structure", "find_items_search_cancelled"));
cleanupFindItemScriptVars(player);
cleanupFindItemScriptVars(self);
return;
}
obj_id[] searchList = utils.getObjIdArrayScriptVar(self, "findItems.searchList");
if (searchList == null || searchList.length < 1)
{
cleanupFindItemScriptVars(player);
cleanupFindItemScriptVars(self);
return;
}
int item_selected = sui.getListboxSelectedRow(params);
if (item_selected < 0)
{
sendSystemMessage(player, new string_id("player_structure", "find_items_no_selection"));
cleanupFindItemScriptVars(player);
cleanupFindItemScriptVars(self);
return;
}
obj_id selectedItem = searchList[item_selected];
if (isIdValid(selectedItem))
{
moveItemInBuildingToPlayer(player, selectedItem);
repeatSearchItemsKeywordList(self, player, searchList);
return;
}
cleanupFindItemScriptVars(player);
cleanupFindItemScriptVars(self);
}
public static void removeStructureFromMaintenance(obj_id droid, obj_id pcd, int indexOfStructure) throws InterruptedException
{
if (!isIdValid(pcd))
{
return;
}
obj_id[] struct_list = getObjIdArrayObjVar(pcd, "module_data.maint_list.ids");
if (struct_list == null || struct_list.length <= 0)
{
return;
}
if (indexOfStructure < 0 || indexOfStructure >= struct_list.length)
{
return;
}
obj_id[] new_struct_list = new obj_id[struct_list.length - 1];
for (int i = 0; i < struct_list.length; i++)
{
if (i == indexOfStructure)
{
if (isIdValid(droid))
{
removeObjVar(droid, "module_data.maint_list.loc_" + i);
}
removeObjVar(pcd, "module_data.maint_list.loc_" + i);
continue;
}
if (i < indexOfStructure)
{
new_struct_list[i] = struct_list[i];
}
else
{
new_struct_list[i - 1] = struct_list[i];
if (hasObjVar(pcd, "module_data.maint_list.loc_" + i))
{
if (isIdValid(droid))
{
setObjVar(droid, "module_data.maint_list.loc_" + (i - 1), getLocationObjVar(droid, "module_data.maint_list.loc_" + i));
}
setObjVar(pcd, "module_data.maint_list.loc_" + (i - 1), getLocationObjVar(pcd, "module_data.maint_list.loc_" + i));
}
else
{
if (isIdValid(droid))
{
removeObjVar(droid, "module_data.maint_list.loc_" + (i - 1));
}
removeObjVar(pcd, "module_data.maint_list.loc_" + (i - 1));
}
}
}
if (isIdValid(droid))
{
setObjVar(droid, "module_data.maint_list.ids", new_struct_list);
}
setObjVar(pcd, "module_data.maint_list.ids", new_struct_list);
}
public static void sendListChangeMessage(obj_id to, String type, boolean isAdd)
{
sendSystemMessageTestingOnly(to, type + (isAdd ? " was added to " : " was removed from ") + "the list successfully");
}
public static boolean isSpecialAccessPermissionGroup(String toCheck)
{
toCheck = toCheck.toLowerCase();
return toCheck.contains("guild:") || toCheck.contains("city:") || toCheck.contains("faction:");
}
public static boolean isAdminToAccountEnabled(obj_id structure) throws InterruptedException
{
return hasObjVar(structure, VAR_ADMIN_ALL_CHARACTERS_ON_ACCOUNT);
}
public static void addAccountToAdminList(obj_id structure, obj_id player) throws InterruptedException
{
if(!isIdValid(structure) || !isIdValid(player) || !isOwner(structure, player))
{
return;
}
setObjVar(structure, VAR_ADMIN_ALL_CHARACTERS_ON_ACCOUNT, getPlayerStationId(player));
permissionsAddAllowed(structure, "account:"+getPlayerStationId(player));
sendSystemMessageTestingOnly(player, "All characters on your account will now have entry and admin access to this structure. You can remove this access any time from the Structure Permissions menu.");
}
public static void removeAccountFromAdminList(obj_id structure, obj_id player) throws InterruptedException
{
if(!isIdValid(structure) || !isIdValid(player) || !isOwner(structure, player))
{
return;
}
removeObjVar(structure, VAR_ADMIN_ALL_CHARACTERS_ON_ACCOUNT);
permissionsRemoveAllowed(structure, "account:"+getPlayerStationId(player));
sendSystemMessageTestingOnly(player, "All characters on your account will no longer have entry or admin access to this structure. You will need to separately add your characters to the list if you wish for them to gain access.");
}
}