mirror of
https://github.com/SWG-Source/dsrc.git
synced 2026-07-13 22:01:04 -04:00
1946 lines
89 KiB
Java
1946 lines
89 KiB
Java
package script.structure;
|
|
|
|
import script.*;
|
|
import script.base_class.*;
|
|
import script.combat_engine.*;
|
|
import java.util.Arrays;
|
|
import java.util.Hashtable;
|
|
import java.util.Vector;
|
|
import script.base_script;
|
|
|
|
import script.library.city;
|
|
import script.library.money;
|
|
import script.library.player_structure;
|
|
import script.library.prose;
|
|
import script.library.sui;
|
|
import script.library.utils;
|
|
import script.library.vendor_lib;
|
|
import script.library.xp;
|
|
|
|
public class permanent_structure extends script.base_script
|
|
{
|
|
public permanent_structure()
|
|
{
|
|
}
|
|
public static final boolean LOGGING_ON = true;
|
|
public static final String LOGGING_CATEGORY = "special_sign";
|
|
public static final String SCRIPT_ITEM_STRUCTURE = "structure.item_structure";
|
|
public static final string_id SID_YOURE_CITY_BANNED = new string_id("city/city", "youre_city_banned");
|
|
public static final string_id SID_BEACON_MISSING = new string_id("space/space_interaction", "homing_beacon_missing");
|
|
public static final string_id SID_NEW_CITY_FIXUP_CITIZEN_SUBJECT = new string_id("city/city", "city_fixup_add_citizens_subject");
|
|
public static final string_id SID_NEW_CITY_FIXUP_CITIZEN_BODY = new string_id("city/city", "city_fixup_add_citizen_at_login_body");
|
|
public static final string_id SID_INACTIVE_CITIZEN_WARNING_BODY = new string_id("city/city", "inactive_citizen_warning_body");
|
|
public static final string_id SID_INACTIVE_CITIZEN_WARNING_SUBJECT = new string_id("city/city", "inactive_citizen_warning_subject");
|
|
public static final string_id SID_PACKING_CITY_ABANDONED_STRUCTURE = new string_id("city/city", "packing_city_abandoned_structure");
|
|
public int OnAttach(obj_id self) throws InterruptedException
|
|
{
|
|
dictionary params = new dictionary();
|
|
params.put("sender", self);
|
|
params.put("senderLoc", getLocation(self));
|
|
messageToRange(20f, "handleRequestCorpseMove", params, 0f);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnInitialize(obj_id self) throws InterruptedException
|
|
{
|
|
messageTo(self, "validateStructureStorageOverride", null, 2, false);
|
|
if (hasObjVar(self, "guildId"))
|
|
{
|
|
removeObjVar(self, "guildId");
|
|
}
|
|
if (player_structure.isHarvester(self) || player_structure.isGenerator(self))
|
|
{
|
|
if (player_structure.isStructureCondemned(self))
|
|
{
|
|
player_structure.destroyStructure(self);
|
|
CustomerServiceLog("playerStructure", "Structure " + self + " was old and Condemed, now is DESTROYED.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
if (utils.checkConfigFlag("GameServer", "enableLogStructureInfo"))
|
|
{
|
|
messageTo(self, "logStructureInfo", null, 60, false);
|
|
}
|
|
if (player_structure.needsPreAbandonCheck(self))
|
|
{
|
|
messageTo(self, "checkAndMarkForPreAbandon", null, 60, false);
|
|
}
|
|
if (player_structure.needsAbandonCheck(self))
|
|
{
|
|
messageTo(self, "checkAndMarkForAbandon", null, 60, false);
|
|
}
|
|
if (player_structure.needsCityAbandonCheck(self))
|
|
{
|
|
LOG("sissynoid", "Checking House: " + self);
|
|
messageTo(self, "checkCityHousePackupStatus", null, 0.0f, false);
|
|
}
|
|
if (player_structure.isHarvester(self))
|
|
{
|
|
messageTo(self, "validateHopper", null, 1.0f, false);
|
|
}
|
|
if (hasObjVar(self, "player_structure.maintanence.rate"))
|
|
{
|
|
removeObjVar(self, "player_structure.maintanence.rate");
|
|
}
|
|
player_structure.convertPermissionsLists(self);
|
|
float fltDistance = 80f;
|
|
obj_id[] objLairs = getAllObjectsWithTemplate(getLocation(self), fltDistance, "object/tangible/lair/npc_lair.iff");
|
|
if (objLairs != null)
|
|
{
|
|
for (int intI = 0; intI < objLairs.length; intI++)
|
|
{
|
|
messageTo(objLairs[intI], "proximityCleanup", null, 1, true);
|
|
}
|
|
}
|
|
LOG("LOG_CHANNEL", "permanent_structure::OnIntialize -- " + self);
|
|
if (hasObjVar(self, player_structure.VAR_VENDOR_LIST))
|
|
{
|
|
removeObjVar(self, player_structure.VAR_VENDOR_LIST);
|
|
}
|
|
player_structure.updateStructureVersion(self);
|
|
int rate = player_structure.getMaintenanceRate(self);
|
|
LOG("LOG_CHANNEL", "Rate is " + rate);
|
|
if (rate > 0)
|
|
{
|
|
int time_stamp = getIntObjVar(self, player_structure.VAR_LAST_MAINTANENCE);
|
|
if (time_stamp < 1)
|
|
{
|
|
time_stamp = getGameTime();
|
|
setObjVar(self, player_structure.VAR_LAST_MAINTANENCE, time_stamp);
|
|
}
|
|
messageTo(self, "OnMaintenanceLoop", null, 30.0f, false);
|
|
}
|
|
if (player_structure.isCivic(self))
|
|
{
|
|
permissionsMakePublic(self);
|
|
}
|
|
city.validateCityStructure(self);
|
|
int city_id = getCityAtLocation(getLocation(self), 0);
|
|
obj_id mayor = cityGetLeader(city_id);
|
|
updateOwnerAndAdmin(self, mayor);
|
|
LOG("LOG_CHANNEL", "permanent_structure::OnInitialize -- complete");
|
|
if (player_structure.isHarvester(self) || player_structure.isGenerator(self))
|
|
{
|
|
player_structure.validateHarvestedResources(self);
|
|
}
|
|
if (!player_structure.isInstallation(self))
|
|
{
|
|
if (hasObjVar(self, player_structure.VAR_SIGN_NAME))
|
|
{
|
|
String signName = getStringObjVar(self, player_structure.VAR_SIGN_NAME);
|
|
if (signName != null && !signName.equals(""))
|
|
{
|
|
if (!isAppropriateText(signName))
|
|
{
|
|
removeObjVar(self, player_structure.VAR_SIGN_NAME);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (!isAppropriateText(getName(self)))
|
|
{
|
|
setName(self, "");
|
|
}
|
|
}
|
|
player_structure.createStructureSign(self);
|
|
if (hasObjVar(self, "structure.player.pack"))
|
|
{
|
|
removeObjVar(self, "structure.player.pack");
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnAboutToReceiveItem(obj_id self, obj_id srcContainer, obj_id transferer, obj_id item) throws InterruptedException
|
|
{
|
|
LOG("LOG_CHANNEL", "permanent_structure::OnAboutToReceiveItem --" + transferer + " - " + item);
|
|
int myGot = getGameObjectType(self);
|
|
if (isGameObjectTypeOf(myGot, GOT_building))
|
|
{
|
|
if (!isPlayer(item) && !isMob(item))
|
|
{
|
|
obj_id structure = getTopMostContainer(self);
|
|
if (isIdValid(transferer))
|
|
{
|
|
if (isPlayer(transferer))
|
|
{
|
|
if (player_structure.canPlaceObject(structure, transferer))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
else
|
|
{
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
else if (isPlayer(item))
|
|
{
|
|
if (player_structure.isCivic(self) && city.isCityBanned(item, self) && !player_structure.isOwner(item, self) && !isIdValid(srcContainer))
|
|
{
|
|
sendSystemMessage(item, SID_YOURE_CITY_BANNED);
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
if (player_structure.isStructureCondemned(self))
|
|
{
|
|
player_structure.doCondemnedSui(self, item);
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnAboutToLoseItem(obj_id self, obj_id srcContainer, obj_id transferer, obj_id item) throws InterruptedException
|
|
{
|
|
LOG("LOG_CHANNEL", "permanent_structure::OnAboutToLooseItem --" + transferer + " - " + item);
|
|
int myGot = getGameObjectType(self);
|
|
if (isGameObjectTypeOf(myGot, GOT_building))
|
|
{
|
|
if (!isPlayer(item) && !isMob(item))
|
|
{
|
|
obj_id structure = getTopMostContainer(self);
|
|
if (hasObjVar(item, player_structure.VAR_IS_PLACED_OBJECT))
|
|
{
|
|
if (isPlayer(transferer))
|
|
{
|
|
if (player_structure.isAdmin(structure, transferer))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
else
|
|
{
|
|
LOG("LOG_CHANNEL", transferer + "-> You must be an admin to pick up an item here.");
|
|
sendSystemMessageTestingOnly(transferer, "You must be an admin to pick up an item here.");
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnReceivedItem(obj_id self, obj_id srcContainer, obj_id transferer, obj_id item) throws InterruptedException
|
|
{
|
|
LOG("LOG_CHANNEL", "permanent_structure::OnReceivedItem --" + transferer + " - " + item);
|
|
int myGot = getGameObjectType(self);
|
|
if (isGameObjectTypeOf(myGot, GOT_building))
|
|
{
|
|
LOG("LOG_CHANNEL", "permanent_structure::OnReceivedItem --" + item);
|
|
if (!isPlayer(item) && !isMob(item))
|
|
{
|
|
String template = getTemplateName(item);
|
|
if (template == null || template.equals(""))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (template.equals("object/tangible/terminal/terminal_guild.iff"))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
else if (template.equals("object/tangible/terminal/terminal_player_structure.iff"))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
else if (isPlayer(item))
|
|
{
|
|
if (player_structure.isOwner(self, item))
|
|
{
|
|
if (player_structure.isResidence(self, item))
|
|
{
|
|
if (!hasObjVar(self, player_structure.VAR_RESIDENCE_BUILDING))
|
|
{
|
|
setObjVar(self, player_structure.VAR_RESIDENCE_BUILDING, item);
|
|
}
|
|
if (city.isInCity(self))
|
|
{
|
|
city.addCitizen(item, self);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (hasObjVar(self, player_structure.VAR_RESIDENCE_BUILDING))
|
|
{
|
|
obj_id resident = getObjIdObjVar(self, player_structure.VAR_RESIDENCE_BUILDING);
|
|
if (resident == item)
|
|
{
|
|
removeObjVar(self, player_structure.VAR_RESIDENCE_BUILDING);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnLostItem(obj_id self, obj_id srcContainer, obj_id transferer, obj_id item) throws InterruptedException
|
|
{
|
|
int myGot = getGameObjectType(self);
|
|
if (isGameObjectTypeOf(myGot, GOT_building_player))
|
|
{
|
|
if (isPlayer(item))
|
|
{
|
|
if (!isIdValid(getLocation(item).cell))
|
|
{
|
|
setAggroImmuneDuration(item, 30);
|
|
}
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnDestroy(obj_id self) throws InterruptedException
|
|
{
|
|
if (player_structure.isBuilding(self))
|
|
{
|
|
player_structure.destroyStructureSign(self);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int OnMaintenanceLoop(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
LOG("LOG_CHANNEL", "permanent_structure::OnMaintenanceLoop");
|
|
obj_id objSender = params.getObjId("objSender");
|
|
boolean boolSender = false;
|
|
boolean boolResetTimeStamp = false;
|
|
if (isIdValid(objSender))
|
|
{
|
|
boolSender = true;
|
|
utils.setScriptVar(self, "objSender", objSender);
|
|
}
|
|
if (boolSender)
|
|
{
|
|
sendSystemMessageTestingOnly(objSender, "Received loop");
|
|
}
|
|
int time_stamp = getIntObjVar(self, player_structure.VAR_LAST_MAINTANENCE);
|
|
int current_time = getGameTime();
|
|
if (!player_structure.isStructureCondemned(self))
|
|
{
|
|
if (boolSender)
|
|
{
|
|
sendSystemMessageTestingOnly(objSender, "structure is Not condemned");
|
|
sendSystemMessageTestingOnly(objSender, "Timestamp is " + time_stamp);
|
|
sendSystemMessageTestingOnly(objSender, "Current Time is " + current_time);
|
|
}
|
|
if (time_stamp < 1)
|
|
{
|
|
setObjVar(self, player_structure.VAR_LAST_MAINTANENCE, current_time);
|
|
time_stamp = current_time;
|
|
}
|
|
int delta_time = current_time - time_stamp;
|
|
if (delta_time < 0)
|
|
{
|
|
CustomerServiceLog("playerStructure", "***TIME WARP WARNING: (" + self + ") owned by " + player_structure.getStructureOwner(self) + " -> cycles prepaid = " + (-delta_time / player_structure.getMaintenanceHeartbeat()));
|
|
}
|
|
if (boolSender)
|
|
{
|
|
sendSystemMessageTestingOnly(objSender, "delta time is " + delta_time);
|
|
}
|
|
LOG("LOG", "delta_time is " + delta_time + " and heartbeat is " + player_structure.getMaintenanceHeartbeat());
|
|
int loops = delta_time / player_structure.getMaintenanceHeartbeat();
|
|
if (boolSender)
|
|
{
|
|
sendSystemMessageTestingOnly(objSender, "Loops 1 is " + loops);
|
|
}
|
|
if (loops < 0)
|
|
{
|
|
CustomerServiceLog("playerStructure", "Structure " + self + " has a loop of less than zero (" + loops + ") Owner is " + player_structure.getStructureOwner(self));
|
|
loops = 0;
|
|
}
|
|
if (loops > 200)
|
|
{
|
|
CustomerServiceLog("playerStructure", "Structure " + self + " has a suspicious number of unpaid maintenance loops (" + loops + ") Owner is " + player_structure.getStructureOwner(self));
|
|
loops = 200;
|
|
}
|
|
if (boolSender)
|
|
{
|
|
sendSystemMessageTestingOnly(objSender, "Loops 2 is " + loops);
|
|
}
|
|
int cost = player_structure.getMaintenanceRate(self) * loops;
|
|
LOG("LOG_CHANNEL", current_time + "/" + time_stamp + "/" + player_structure.getMaintenanceHeartbeat() + " loops ->" + loops + " cost ->" + cost);
|
|
if (boolSender)
|
|
{
|
|
sendSystemMessageTestingOnly(objSender, "Raw per loop cost is " + player_structure.getMaintenanceRate(self));
|
|
sendSystemMessageTestingOnly(objSender, "Cost is " + cost);
|
|
}
|
|
if ((cost > 0) && !player_structure.isCivic(self))
|
|
{
|
|
boolResetTimeStamp = true;
|
|
if (boolSender)
|
|
{
|
|
sendSystemMessageTestingOnly(objSender, "Checkign pools ");
|
|
}
|
|
int pool_remaining = player_structure.decrementMaintenancePool(self, cost);
|
|
if (boolSender)
|
|
{
|
|
sendSystemMessageTestingOnly(objSender, "Pool remaing is " + pool_remaining);
|
|
}
|
|
obj_id objOwner = player_structure.getStructureOwnerObjId(self);
|
|
if (boolSender)
|
|
{
|
|
sendSystemMessageTestingOnly(objSender, "Owner is " + objOwner);
|
|
}
|
|
if (player_structure.isBuilding(self))
|
|
{
|
|
CustomerServiceLog("playerStructure", "Paying maintenance of " + cost + " on structure " + self + ". Pool remaining is " + pool_remaining + ". Owner is " + player_structure.getStructureOwner(self));
|
|
}
|
|
if (pool_remaining == -1)
|
|
{
|
|
LOG("LOG_CHANNEL", "permanent_structure::OnMaintenanceLoop -- unable to decrement maintenance pool.");
|
|
}
|
|
else if (pool_remaining == -2)
|
|
{
|
|
if (player_structure.isBuilding(self) || player_structure.isFactory(self))
|
|
{
|
|
LOG("LOG_CHANNEL", "permanent_structure::OnMaintenanceLoop:BUILDING-HOUSE/FACTORY " + self + "-- insufficient funds. Attempting to take money out of owner: " + objOwner + " bank account.");
|
|
if (!hasObjVar(self, "structure.intNoMaintenance"))
|
|
{
|
|
setObjVar(self, "structure.intNoMaintenance", 1);
|
|
player_structure.sendOutOfMaintenanceMail(self);
|
|
}
|
|
dictionary dctParams = new dictionary();
|
|
dctParams.put("intLoops", loops);
|
|
int weeklyCost = (60 * 60 * 24 * 7 / player_structure.getMaintenanceHeartbeat()) * player_structure.getMaintenanceRate(self);
|
|
dctParams.put("intCost", weeklyCost);
|
|
dctParams.put("amount", weeklyCost);
|
|
dctParams.put("offlineAmount", weeklyCost);
|
|
dctParams.put("account", money.ACCT_STRUCTURE_MAINTENANCE);
|
|
dctParams.put("failCallback", "handleBankTransferError");
|
|
dctParams.put("successCallback", "moneyTransferredFromOwner");
|
|
dctParams.put("replyTo", self);
|
|
dctParams.put("owner", objOwner);
|
|
messageTo(objOwner, "transferMoneyToNamedAccount", dctParams, 0, false, self, "ownerNotOnline");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
else
|
|
{
|
|
LOG("LOG_CHANNEL", "permanent_structure::OnMaintenanceLoop:HARVESTER-GENERATOR " + self + "-- insufficient funds. Applying damage instead.");
|
|
int damage = player_structure.getDecayRate(self) * loops;
|
|
int condition = player_structure.damageStructure(self, damage);
|
|
LOG("LOG_CHANNEL", "damage ->" + damage + " condition ->" + condition);
|
|
if (condition == 0)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (hasObjVar(self, "structure.intNoMaintenance"))
|
|
{
|
|
removeObjVar(self, "structure.intNoMaintenance");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (boolResetTimeStamp)
|
|
{
|
|
if (boolSender)
|
|
{
|
|
sendSystemMessageTestingOnly(self, "Resetting timestamp");
|
|
}
|
|
setObjVar(self, player_structure.VAR_LAST_MAINTANENCE, current_time);
|
|
}
|
|
else
|
|
{
|
|
if (boolSender)
|
|
{
|
|
sendSystemMessageTestingOnly(self, "No loops, so not resetting timestamp.");
|
|
}
|
|
}
|
|
doHouseMaintenanceHousekeeping(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public void doHouseMaintenanceHousekeeping(obj_id self) throws InterruptedException
|
|
{
|
|
messageTo(self, "OnMaintenanceLoop", null, player_structure.getMaintenanceHeartbeat(), false);
|
|
LOG("LOG_CHANNEL", "New Maintenance Loop set. -----");
|
|
player_structure.initiateRepairCheck(self);
|
|
player_structure.validateBaseObjects(self);
|
|
xp.grantCraftingXpChance(self, player_structure.getStructureOwnerObjId(self), 40);
|
|
city.validateCityStructure(self);
|
|
player_structure.sendMaintenanceMail(self);
|
|
return;
|
|
}
|
|
public int handlePayment(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id player = params.getObjId("player_id");
|
|
obj_id structure = params.getObjId("target_id");
|
|
int amt = params.getInt("amount");
|
|
CustomerServiceLog("playerStructure", amt + " credits paid into " + structure + " by " + player + ". Owner is " + player_structure.getStructureOwner(self));
|
|
player_structure.initiateRepairCheck(self);
|
|
int hiringSkillMod = getSkillStatisticModifier(player, "hiring");
|
|
if (isIdValid(player) && exists(player) && player.isLoaded() && hiringSkillMod >= 90)
|
|
{
|
|
setObjVar(self, player_structure.VAR_MAINTENANCE_MOD_MERCHANT, player_structure.MERCHANT_SALES_MODIFIER);
|
|
}
|
|
else
|
|
{
|
|
removeObjVar(self, player_structure.VAR_MAINTENANCE_MOD_MERCHANT);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int msgDestroyStructure(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
CustomerServiceLog("playerStructure", "Intiating destroy for " + self + " due to character deletion of its owner " + player_structure.getStructureOwner(self));
|
|
player_structure.destroyStructure(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int removeResidentVar(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
removeObjVar(self, player_structure.VAR_RESIDENCE_BUILDING);
|
|
city.removeStructureFromCity(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int setNewMayor(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (params == null || params.isEmpty())
|
|
{
|
|
CustomerServiceLog("player_city_transfer", "Failed to transfer Structure(" + self + ") to New Mayor due to Empty Params.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!player_structure.isCivic(self))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id new_mayor = params.getObjId("mayor");
|
|
obj_id ousted_mayor = params.getObjId("ousted_mayor");
|
|
if (!isIdValid(new_mayor) || !isIdValid(self) || !isIdValid(ousted_mayor))
|
|
{
|
|
CustomerServiceLog("player_city_transfer", "Failed to transfer Structure(" + self + ") to New Mayor (" + new_mayor + ") due to Invalid Mayor/Self ID.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int city_id = getCityAtLocation(getLocation(self), 0);
|
|
if (city_id <= 0)
|
|
{
|
|
CustomerServiceLog("player_city_transfer", "Failed to transfer Structure(" + self + ") to New Mayor (" + new_mayor + ") due to Invalid City ID (" + city_id + "). Used getCityAtLocation - using Self");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
boolean itemTransfer = false;
|
|
String template = getTemplateName(self);
|
|
if (template.indexOf("cloning_") > -1 || template.indexOf("cityhall_") > -1)
|
|
{
|
|
itemTransfer = true;
|
|
LOG("sissynoid", "City Hall/Cloning Center Found - itemTransfer == true");
|
|
CustomerServiceLog("player_city_transfer", "City Hall/Cloning Center Found - Checking for noTrade Items to Transfer. Structure ID (" + self + ")");
|
|
city.moveNoTradeItemsInStructureToOwner(self, ousted_mayor, city_id);
|
|
}
|
|
dictionary transferParams = new dictionary();
|
|
transferParams.put("new_mayor", new_mayor);
|
|
transferParams.put("structure", self);
|
|
if (itemTransfer)
|
|
{
|
|
LOG("sissynoid", "City Hall/Cloning Center(" + self + ") Found - Messaging to transfer - 10 second delay");
|
|
messageTo(self, "transferStructureToNewMayor", transferParams, 10.0f, false);
|
|
}
|
|
else
|
|
{
|
|
messageTo(self, "transferStructureToNewMayor", transferParams, 0.0f, false);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int transferStructureToNewMayor(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
LOG("sissynoid", "Entered transferStructureToNewMayor");
|
|
if (params == null || params.isEmpty())
|
|
{
|
|
LOG("sissynoid", "transferStructureToNewMayor was NULL or EMPTY");
|
|
CustomerServiceLog("player_city_transfer", "Failed to transfer Structure(" + self + ") to New Mayor due to Invalid/Empty Params - transferParams");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id new_mayor = params.getObjId("new_mayor");
|
|
obj_id structure = params.getObjId("structure");
|
|
if (!isIdValid(new_mayor) || !isIdValid(structure))
|
|
{
|
|
LOG("sissynoid", "Invalid ID - New Mayor(" + new_mayor + ")/Structure(" + structure + ") - Failing Structure Transfer");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
setOwner(structure, new_mayor);
|
|
obj_id[] adminList = new obj_id[1];
|
|
adminList[0] = new_mayor;
|
|
setObjVar(self, player_structure.VAR_ADMIN_LIST, adminList);
|
|
LOG("sissynoid", "Successful Transfer of Structure(" + structure + ") to New Mayor(" + new_mayor + ")");
|
|
CustomerServiceLog("player_city_transfer", "Success - Structure(" + structure + ") has successfully transferred to New Mayor(" + new_mayor + ").");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public void updateOwnerAndAdmin(obj_id self, obj_id new_mayor) throws InterruptedException
|
|
{
|
|
if (!player_structure.isCivic(self))
|
|
{
|
|
return;
|
|
}
|
|
if (!isIdValid(new_mayor) || !isIdValid(self))
|
|
{
|
|
return;
|
|
}
|
|
int city_id = getCityAtLocation(getLocation(self), 0);
|
|
if (city_id <= 0)
|
|
{
|
|
return;
|
|
}
|
|
obj_id mayor = cityGetLeader(city_id);
|
|
if (mayor == new_mayor)
|
|
{
|
|
return;
|
|
}
|
|
setOwner(self, new_mayor);
|
|
obj_id[] adminList = new obj_id[1];
|
|
adminList[0] = new_mayor;
|
|
setObjVar(self, player_structure.VAR_ADMIN_LIST, adminList);
|
|
return;
|
|
}
|
|
public int handleChangeSignSui(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
blog("permanent_structure.handleChangeSignSui INITIALIZED");
|
|
if (params == null || params.isEmpty())
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int bp = sui.getIntButtonPressed(params);
|
|
if (bp == sui.BP_CANCEL)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int idx = sui.getListboxSelectedRow(params);
|
|
if (idx < 0)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id player = sui.getPlayerId(params);
|
|
if (!isIdValid(player))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
boolean owner = player_structure.isOwner(self, player);
|
|
if (hasObjVar(self, player_structure.MODIFIED_HOUSE_SIGN_MODEL))
|
|
{
|
|
blog("permanent_structure.handleChangeSignSui REMOVING OLD HALLOWEEN SIGN");
|
|
player_structure.revertCustomSign(player, self);
|
|
}
|
|
blog("permanent_structure.handleChangeSignSui checking to see if special sign exists as objvar");
|
|
if (hasObjVar(self, player_structure.SPECIAL_SIGN))
|
|
{
|
|
if (hasObjVar(self, player_structure.SPECIAL_SIGN_OWNER_ONLY))
|
|
{
|
|
boolean needsOwnerToRemove = getBooleanObjVar(self, player_structure.SPECIAL_SIGN_OWNER_ONLY);
|
|
if (!owner && needsOwnerToRemove)
|
|
{
|
|
sendSystemMessage(player, player_structure.SID_ONLY_OWNER_CAN_REMOVE);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
if (!player_structure.removeSpecialSign(player, self, false))
|
|
{
|
|
blog("permanent_structure.handleSpecialSignManagementSelection removeSpecialSign failed!!!!");
|
|
}
|
|
}
|
|
setObjVar(self, player_structure.VAR_SIGN_TYPE, idx);
|
|
player_structure.createStructureSign(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cityMapRegister(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (player_structure.isCivic(self) || player_structure.isCommercial(self))
|
|
{
|
|
String template = getTemplateName(self);
|
|
if ((template != null) || (!template.equals("")))
|
|
{
|
|
if (template.indexOf("object/building/player/city/garden_") != -1)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
if (!hasScript(self, "planet_map.map_loc_both"))
|
|
{
|
|
attachScript(self, "planet_map.map_loc_both");
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cityMapUnregister(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (player_structure.isCivic(self) || player_structure.isCommercial(self))
|
|
{
|
|
if (hasScript(self, "planet_map.map_loc_both"))
|
|
{
|
|
detachScript(self, "planet_map.map_loc_both");
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int takeCityDamage(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int city_id = getCityAtLocation(getLocation(self), 0);
|
|
if (!cityExists(city_id))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id mayor = cityGetLeader(city_id);
|
|
String mayor_name = cityGetCitizenName(city_id, mayor);
|
|
String structure_name = localize(getNameStringId(self));
|
|
int condition = player_structure.damageStructure(self, 300);
|
|
if (condition <= 0)
|
|
{
|
|
prose_package bodypp = prose.getPackage(city.STRUCTURE_DESTROYED_MAINT_BODY, structure_name, mayor_name);
|
|
utils.sendMail(city.STRUCTURE_DESTROYED_MAINT_SUBJECT, bodypp, mayor_name, "City Hall");
|
|
}
|
|
else
|
|
{
|
|
int cost = params.getInt("cost");
|
|
prose_package bodypp = prose.getPackage(city.STRUCTURE_DAMAGED_BODY, null, null, null, null, mayor_name, null, null, structure_name, null, cost, 0.f);
|
|
utils.sendMail(city.STRUCTURE_DAMAGED_SUBJECT, bodypp, mayor_name, "City Hall");
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int repairCityDamage(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int city_id = getCityAtLocation(getLocation(self), 0);
|
|
if (!cityExists(city_id))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int condition = player_structure.getStructureCondition(self);
|
|
int max_condition = player_structure.getMaxCondition(self);
|
|
if (condition < max_condition)
|
|
{
|
|
player_structure.repairStructure(self, 300);
|
|
obj_id mayor = cityGetLeader(city_id);
|
|
String mayor_name = cityGetCitizenName(city_id, mayor);
|
|
String structure_name = localize(getNameStringId(self));
|
|
prose_package bodypp = prose.getPackage(city.STRUCTURE_REPAIRED_BODY, structure_name, mayor_name);
|
|
utils.sendMail(city.STRUCTURE_REPAIRED_SUBJECT, bodypp, mayor_name, "City Hall");
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int createStructureObjects(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int rotation = params.getInt("rotation");
|
|
player_structure.createStructureObjects(self, rotation);
|
|
float rot_float = (float)(90 * rotation);
|
|
player_structure.createStructureSign(self, rot_float);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int requestBankBalance(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id requestingObj = params.getObjId("requestingObj");
|
|
int balance = getBankBalance(self);
|
|
dictionary newParam = new dictionary();
|
|
newParam.put("balance", balance);
|
|
newParam.put("structure", self);
|
|
messageTo(requestingObj, "returnRequestedBankBalance", newParam, 0, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int requestName(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id requestingObj = params.getObjId("requestingObj");
|
|
String name = "";
|
|
if (!player_structure.isInstallation(self))
|
|
{
|
|
if (hasObjVar(self, player_structure.VAR_SIGN_NAME))
|
|
{
|
|
name = getStringObjVar(self, player_structure.VAR_SIGN_NAME);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
name = getEncodedName(self);
|
|
}
|
|
dictionary newParam = new dictionary();
|
|
newParam.put("name", name);
|
|
newParam.put("structure", self);
|
|
messageTo(requestingObj, "returnRequestedName", newParam, 0, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleBankTransferError(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id objSender = null;
|
|
if (utils.hasScriptVar(self, "objSender"))
|
|
{
|
|
objSender = utils.getObjIdScriptVar(self, "objSender");
|
|
if (!exists(objSender))
|
|
{
|
|
objSender = null;
|
|
}
|
|
}
|
|
int loops = params.getInt("intLoops");
|
|
int cost = params.getInt("intCost");
|
|
if ((loops == 0) && (cost == 0))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int current_time = getGameTime();
|
|
if (isIdValid(objSender))
|
|
{
|
|
sendSystemMessageTestingOnly(self, "FAILED BANK TRANSFER!");
|
|
sendSystemMessageTestingOnly(self, "loops " + loops);
|
|
sendSystemMessageTestingOnly(self, "Cost " + cost);
|
|
sendSystemMessageTestingOnly(self, "current_time " + current_time);
|
|
}
|
|
int damage = player_structure.getDecayRate(self) * loops;
|
|
int condition = player_structure.damageStructure(self, damage, true);
|
|
if (isIdValid(objSender))
|
|
{
|
|
sendSystemMessageTestingOnly(self, "Damaging Structure to " + damage);
|
|
}
|
|
LOG("LOG_CHANNEL", "damage ->" + damage + " condition ->" + condition);
|
|
if (condition == 0)
|
|
{
|
|
if (isIdValid(objSender))
|
|
{
|
|
sendSystemMessageTestingOnly(self, "COndemning " + self);
|
|
}
|
|
CustomerServiceLog("playerStructure", "Condemning (" + self + ") owned by " + player_structure.getStructureOwner(self));
|
|
if (!hasObjVar(self, "player_structurestructure.condemned"))
|
|
{
|
|
player_structure.sendCondemnedMail(self);
|
|
setObjVar(self, "player_structure.condemned", current_time);
|
|
}
|
|
}
|
|
setObjVar(self, player_structure.VAR_LAST_MAINTANENCE, current_time);
|
|
if (isIdValid(objSender))
|
|
{
|
|
sendSystemMessageTestingOnly(self, "Doing housekeeping");
|
|
}
|
|
doHouseMaintenanceHousekeeping(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleBankSuccess(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id objSender = null;
|
|
if (utils.hasScriptVar(self, "objSender"))
|
|
{
|
|
objSender = utils.getObjIdScriptVar(self, "objSender");
|
|
if (!exists(objSender))
|
|
{
|
|
objSender = null;
|
|
}
|
|
}
|
|
if (isIdValid(objSender))
|
|
{
|
|
sendSystemMessageTestingOnly(objSender, "Succesfully took maintenance, resetting timestamp");
|
|
}
|
|
int loops = params.getInt("intLoops");
|
|
int cost = params.getInt("intCost");
|
|
if ((loops == 0) && (cost == 0))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int current_time = getGameTime();
|
|
setObjVar(self, player_structure.VAR_LAST_MAINTANENCE, current_time);
|
|
doHouseMaintenanceHousekeeping(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int payCondemnedFees(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (!player_structure.isStructureCondemned(self))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id objPlayer = sui.getPlayerId(params);
|
|
if (!isIdValid(objPlayer))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int idx = sui.getListboxSelectedRow(params);
|
|
int bp = sui.getIntButtonPressed(params);
|
|
if (bp != sui.BP_OK)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
float fltDistance = getDistance(objPlayer, self);
|
|
if (fltDistance > 32)
|
|
{
|
|
string_id strSpam = new string_id("player_structure", "too_far");
|
|
sendSystemMessage(objPlayer, strSpam);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int intRepairCost = player_structure.getStructureRepairCost(self);
|
|
int intBankCredits = getBankBalance(objPlayer);
|
|
if (intBankCredits >= intRepairCost)
|
|
{
|
|
int max_condition = player_structure.getMaxCondition(self);
|
|
LOG("building", "max_condition is " + max_condition);
|
|
player_structure.repairStructure(self, max_condition);
|
|
money.bankTo(objPlayer, money.ACCT_STRUCTURE_MAINTENANCE, intRepairCost);
|
|
CustomerServiceLog("playerStructure", "UNCOMDEMNING (" + self + ") owned by " + player_structure.getStructureOwner(self) + " -> Becuase they paid = " + intRepairCost);
|
|
string_id strSpam = new string_id("player_structure", "structure_uncondemned");
|
|
sendSystemMessage(objPlayer, strSpam);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int moneyTransferredFromOwner(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int transferredAmount = params.getInt("amount");
|
|
transferBankCreditsFromNamedAccount(money.ACCT_STRUCTURE_MAINTENANCE, self, transferredAmount, null, null, null);
|
|
utils.removeScriptVar(self, "maint.dontCheckDB");
|
|
messageTo(self, "OnMaintenanceLoop", null, player_structure.getMaintenanceHeartbeat(), false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int ownerNotOnline(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (!utils.hasScriptVar(self, "maint.dontCheckDB"))
|
|
{
|
|
int amount = params.getInt("offlineAmount");
|
|
params.put("amount", amount);
|
|
obj_id owner = params.getObjId("owner");
|
|
getMoneyFromOfflineObject(owner, amount, money.ACCT_STRUCTURE_MAINTENANCE, "moneyTransferredFromOwner", "ownerNSF", params);
|
|
}
|
|
else
|
|
{
|
|
messageTo(self, "handleBankTransferError", params, 0, false);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int ownerNSF(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
utils.setScriptVar(self, "maint.dontCheckDB", 1);
|
|
messageTo(self, "handleBankTransferError", params, 0, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int validateHopper(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
int objvar_hopper = getIntObjVar(self, player_structure.VAR_DEED_MAX_HOPPER);
|
|
int hopperSize = player_structure.validateHopperSize(self);
|
|
if (objvar_hopper != hopperSize)
|
|
{
|
|
setObjVar(self, player_structure.VAR_DEED_MAX_HOPPER, hopperSize);
|
|
setMaxHopperAmount(self, hopperSize);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public void updateFactoryName(obj_id factory) throws InterruptedException
|
|
{
|
|
if (player_structure.isFactory(factory))
|
|
{
|
|
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.indexOf(player_structure.ABANDONED_TEXT) != -1)
|
|
{
|
|
assignedName = getStringObjVar(factory, "player_structure.name.original");
|
|
}
|
|
else
|
|
{
|
|
setObjVar(factory, "player_structure.name.original", assignedName == null ? "" : assignedName);
|
|
}
|
|
}
|
|
if (assignedName == null || assignedName.length() == 0)
|
|
{
|
|
String templateName = getTemplateName(factory);
|
|
if (templateName.equals("object/installation/manufacture/food_factory.iff"))
|
|
{
|
|
assignedName = "Food and Chemical Factory";
|
|
}
|
|
else if (templateName.equals("object/installation/manufacture/clothing_factory.iff"))
|
|
{
|
|
assignedName = "Wearables Factory";
|
|
}
|
|
else if (templateName.equals("object/installation/manufacture/weapon_factory.iff"))
|
|
{
|
|
assignedName = "Equipment Factory";
|
|
}
|
|
else if (templateName.equals("object/installation/manufacture/structure_factory.iff"))
|
|
{
|
|
assignedName = "Structure Factory";
|
|
}
|
|
else
|
|
{
|
|
assignedName = "Factory";
|
|
}
|
|
}
|
|
setName(factory, assignedName + player_structure.ABANDONED_TEXT);
|
|
}
|
|
}
|
|
public int checkAndMarkForPreAbandon(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (isInWorldCell(self) && player_structure.needsPreAbandonCheck(self))
|
|
{
|
|
obj_id ownerId = getOwner(self);
|
|
final boolean isPreAbandoned = player_structure.isPreAbandoned(self);
|
|
final boolean isAbandoned = player_structure.isAbandoned(self);
|
|
if (isAccountQualifiedForHousePackup(ownerId))
|
|
{
|
|
if (isPreAbandoned || isAbandoned)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
player_structure.setPreAbandoned(self);
|
|
CustomerServiceLog("house_packup", "Structure (" + self + ") marked as preabandoned for player (" + getPlayerName(ownerId) + ") station_id (" + getPlayerStationId(ownerId) + ")");
|
|
updateFactoryName(self);
|
|
player_structure.createStructureSign(self);
|
|
String[] adminList = player_structure.getAdminListRaw(self);
|
|
if (adminList != null)
|
|
{
|
|
String admins = "";
|
|
for (int i = 0; i < adminList.length; ++i)
|
|
{
|
|
if (adminList[i] != null && (adminList[i].toLowerCase()).indexOf("guild:") <= -1)
|
|
{
|
|
admins += "|" + getPlayerStationId(utils.stringToObjId(adminList[i]));
|
|
if (admins.length() > 256)
|
|
{
|
|
CustomerServiceLog("house_packup_adminlist", admins + "|");
|
|
admins = "";
|
|
}
|
|
}
|
|
}
|
|
if (admins.length() > 0)
|
|
{
|
|
CustomerServiceLog("house_packup_adminlist", admins + "|");
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (!isPreAbandoned && !isAbandoned)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
final String abandonedState = isPreAbandoned ? "preabandoned" : isAbandoned ? "abandoned" : "none";
|
|
player_structure.setStructureAsNotAbandoned(self);
|
|
CustomerServiceLog("house_packup", "Structure (" + self + ") cleared for player (" + getPlayerName(ownerId) + ") station_id (" + getPlayerStationId(ownerId) + ") state (" + abandonedState + ")");
|
|
if (player_structure.isFactory(self) && hasObjVar(self, "player_structure.name.original"))
|
|
{
|
|
final String assignedName = getAssignedName(self);
|
|
if (assignedName != null && assignedName.indexOf(player_structure.ABANDONED_TEXT) != -1)
|
|
{
|
|
final String originalName = getStringObjVar(self, "player_structure.name.original");
|
|
setName(self, originalName);
|
|
}
|
|
removeObjVar(self, "player_structure.name.original");
|
|
}
|
|
player_structure.createStructureSign(self);
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int checkAndMarkForAbandon(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (isInWorldCell(self) && player_structure.needsAbandonCheck(self))
|
|
{
|
|
obj_id ownerId = getOwner(self);
|
|
final boolean isPreAbandoned = player_structure.isPreAbandoned(self);
|
|
final boolean isAbandoned = player_structure.isAbandoned(self);
|
|
final String abandonedState = isPreAbandoned ? "preabandoned" : isAbandoned ? "abandoned" : "none";
|
|
if (!isAccountQualifiedForHousePackup(ownerId))
|
|
{
|
|
if (isPreAbandoned || isAbandoned)
|
|
{
|
|
player_structure.setStructureAsNotAbandoned(self);
|
|
CustomerServiceLog("house_packup", "Structure (" + self + ") saved for player (" + getPlayerName(ownerId) + ") station_id (" + getPlayerStationId(ownerId) + ") state (" + abandonedState + ")");
|
|
if (player_structure.isFactory(self) && hasObjVar(self, "player_structure.name.original"))
|
|
{
|
|
final String assignedName = getAssignedName(self);
|
|
if (assignedName != null && assignedName.indexOf(player_structure.ABANDONED_TEXT) != -1)
|
|
{
|
|
final String originalName = getStringObjVar(self, "player_structure.name.original");
|
|
setName(self, originalName);
|
|
}
|
|
removeObjVar(self, "player_structure.name.original");
|
|
}
|
|
player_structure.createStructureSign(self);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (!isAbandoned)
|
|
{
|
|
player_structure.setAbandoned(self);
|
|
CustomerServiceLog("house_packup", "Structure (" + self + ") marked as abandoned for player (" + getPlayerName(ownerId) + ") station_id (" + getPlayerStationId(ownerId) + ") state (" + abandonedState + ")");
|
|
}
|
|
updateFactoryName(self);
|
|
if (!isPreAbandoned && !isAbandoned)
|
|
{
|
|
player_structure.createStructureSign(self);
|
|
}
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int logStructureInfo(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
CustomerServiceLog("house_packup_info", player_structure.getStructureInfo(self));
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleStructurePackupLockoutRemoval(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
blog("permanent_structure.handleStructurePackupLockoutRemoval() Message received by player to remove lockout timer.");
|
|
utils.removeScriptVarTree(self, player_structure.SCRIPTVAR_HOUSE_PACKUP_TREE_PREFIX);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int packAbandonedBuilding(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (params == null || params.isEmpty())
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id player = params.getObjId("player");
|
|
player_structure.packAbandonedBuilding(player, self, params);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int moveStructureToSCD(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if ((params == null) || (params.isEmpty()))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!params.containsKey("structure") || !params.containsKey("structure_owner"))
|
|
{
|
|
blog("player_building.moveStructureToSCD() did not have the needed params to function");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id player = params.getObjId("player");
|
|
if (!isValidId(player) || !exists(player))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id structure = params.getObjId("structure");
|
|
if (player_structure.isPackedUp(structure))
|
|
{
|
|
blog("player_buidling.moveStructureToSCD() ALREADY PACKED!!!! removing lockout from player.");
|
|
messageTo(player, "handlePlayerStructurePackupLockoutRemoval", null, 1, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id structure_owner = params.getObjId("structure_owner");
|
|
if (!isValidId(structure) || !isValidId(structure_owner))
|
|
{
|
|
blog("player_building.moveStructureToSCD() MISSING PARAMS. ABORTING AIRSTRIKE");
|
|
messageTo(player, "handlePlayerStructurePackupLockoutRemoval", null, 0, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
location where = getLocation(structure);
|
|
boolean isAbandoned = true;
|
|
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 SCRIPT_CONTINUE;
|
|
}
|
|
if (structure_owner.isLoaded() && structure_owner.isAuthoritative())
|
|
{
|
|
blog("player_structure.finalizeAbandonedStructurePackUp The owner is loaded in game.");
|
|
obj_id owner_datapad = utils.getPlayerDatapad(structure_owner);
|
|
if (isIdValid(owner_datapad))
|
|
{
|
|
datapad = owner_datapad;
|
|
}
|
|
}
|
|
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 SCRIPT_CONTINUE;
|
|
}
|
|
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 (" + getPlayerName(player) + ") - scd was not valid");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
attachScript(scd, "structure.house_control_device");
|
|
setObjVar(scd, "abandoned.packer", player);
|
|
setObjVar(scd, "abandoned.owner", structure_owner);
|
|
setObjVar(scd, "abandoned.structure", structure);
|
|
if (player_structure.isFactory(structure) && isHarvesterActive(structure))
|
|
{
|
|
CustomerServiceLog("housepackup", "Structure (" + structure + ") was a factory that was active. Turning off factory for non-owner player (" + getPlayerName(player) + ") OID (" + player + ")");
|
|
deactivate(structure);
|
|
}
|
|
obj_id[] players = player_structure.getPlayersInBuilding(structure);
|
|
if (players != null)
|
|
{
|
|
blog("player_structure.finalizeAbandonedStructurePackUp Players are in the building that is about to be packed.");
|
|
for (int i = 0; i < players.length; i++)
|
|
{
|
|
expelFromBuilding(players[i]);
|
|
}
|
|
}
|
|
String[] cells = getCellNames(structure);
|
|
if (cells != null)
|
|
{
|
|
for (int i = 0; i < cells.length; i++)
|
|
{
|
|
obj_id cellid = getCellId(structure, cells[i]);
|
|
obj_id contents[] = getContents(cellid);
|
|
if (contents != null)
|
|
{
|
|
for (int j = 0; j < contents.length; j++)
|
|
{
|
|
if (hasCondition(contents[j], CONDITION_VENDOR))
|
|
{
|
|
obj_id owner = getObjIdObjVar(contents[j], "vendor_owner");
|
|
if (!isIdValid(owner))
|
|
{
|
|
owner = getOwner(contents[j]);
|
|
}
|
|
vendor_lib.finalizePackUp(owner, contents[j], player, isAbandoned);
|
|
}
|
|
if (isIdValid(contents[j]))
|
|
{
|
|
messageTo(contents[j], "OnPack", null, 1.0f, false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
String structName = player_structure.getStructureName(structure);
|
|
if (structName == null || structName.length() < 1)
|
|
{
|
|
structName = "Building";
|
|
}
|
|
if (hasObjVar(structure, player_structure.VAR_WAYPOINT_STRUCTURE))
|
|
{
|
|
obj_id waypoint = getObjIdObjVar(structure, player_structure.VAR_WAYPOINT_STRUCTURE);
|
|
if (isIdValid(waypoint))
|
|
{
|
|
destroyWaypointInDatapad(waypoint, structure_owner);
|
|
removeObjVar(structure, player_structure.VAR_WAYPOINT_STRUCTURE);
|
|
}
|
|
}
|
|
player_structure.destroyStructureSign(structure);
|
|
setName(scd, structName);
|
|
if (player_structure.hasBeenDeclaredResidence(structure))
|
|
{
|
|
obj_id resident = player_structure.getResidentPlayer(structure);
|
|
setHouseId(resident, obj_id.NULL_ID);
|
|
removeObjVar(structure, player_structure.VAR_RESIDENCE_BUILDING);
|
|
int cityId = getCitizenOfCityId(resident);
|
|
if (cityId != 0)
|
|
{
|
|
cityRemoveCitizen(cityId, resident);
|
|
}
|
|
}
|
|
city.removeStructureFromCity(structure);
|
|
String template = getTemplateName(structure);
|
|
player_structure.setDeedTemplate(scd, template);
|
|
if (hasObjVar(structure, player_structure.VAR_DEED_SCENE))
|
|
{
|
|
setObjVar(scd, player_structure.VAR_DEED_SCENE, player_structure.getDeedScene(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 = player_structure.isFactory(structure) ? 101 : 1;
|
|
moveToOfflinePlayerDatapadAndUnload(scd, structure_owner, maxDepth + 1);
|
|
fixLoadWith(structure, structure_owner, maxDepth);
|
|
}
|
|
CustomerServiceLog("housepackup", "Player " + getPlayerName(player) + " (" + player + ") packed structure (" + structure + ",abandoned=true," + where.toString() + ") owned by player " + getPlayerName(structure_owner) + " (" + structure_owner + ") into device (" + scd + ")");
|
|
blog("player_buidling.moveStructureToSCD() all params accounted for. removing lockout.");
|
|
messageTo(player, "handlePlayerStructurePackupLockoutRemoval", null, 1, false);
|
|
blog("player_buidling.moveStructureToSCD() Point Increase for player.");
|
|
player_structure.housePackingPointIncrease(player);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int cityMoveStructureToSCD(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
LOG("sissynoid", "Entered: cityMoveStructureToSCD");
|
|
if ((params == null) || (params.isEmpty()))
|
|
{
|
|
LOG("sissynoid", "cityMoveStructureToSCD: Params were empty - Failing");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!params.containsKey("structure") || !params.containsKey("structure_owner"))
|
|
{
|
|
LOG("sissynoid", "cityMoveStructureToSCD: Did not contain all keys needed to packup a house - Missing either 'structure' or 'structure_owner' key.");
|
|
CustomerServiceLog("city_house_packup", "Failing Packup - Unable to Pack at this time due to 'structure/structure_owner' params missing.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id player = params.getObjId("player");
|
|
if (!isValidId(player) || !exists(player))
|
|
{
|
|
CustomerServiceLog("city_house_packup", "Failing Packup - Unable to pack at this time - Player ID (" + player + ") is attempting to pack a structure, but his ID is invalid.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id structure = params.getObjId("structure");
|
|
if (player_structure.isPackedUp(structure))
|
|
{
|
|
CustomerServiceLog("city_house_packup", "Failing Packup - Unable to pack at this time - Player ID (" + player + ") is attempting to pack a structure (" + structure + "), but the structure ID is invalid.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id structure_owner = params.getObjId("structure_owner");
|
|
if (!isValidId(structure) || !isValidId(structure_owner))
|
|
{
|
|
CustomerServiceLog("city_house_packup", "Failing Packup - Unable to pack at this time - Player ID (" + player + ") is attempting to pack a structure (" + structure + "), but the structure OWNER ID(" + structure_owner + ") is invalid.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
location where = getLocation(structure);
|
|
boolean isCityAbandoned = player_structure.isCityAbandoned(structure);
|
|
obj_id datapad = utils.getPlayerDatapad(player);
|
|
if (!isIdValid(datapad))
|
|
{
|
|
LOG("sissynoid", "cityMoveStructureToSCD: Invalid Datapad ID");
|
|
CustomerServiceLog("city_house_packup", "Structure (" + structure + ") could not be packed by player (" + getPlayerName(player) + ") - datapad was not valid");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!player_structure.isCityPackupAuthoritative(player, structure))
|
|
{
|
|
LOG("sissynoid", "cityMoveStructureToSCD: Player is not Loaded");
|
|
CustomerServiceLog("city_house_packup", "'cityMoveStructureToSCD' - 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 SCRIPT_CONTINUE;
|
|
}
|
|
obj_id scd = createObjectOverloaded("object/intangible/house/generic_house_control_device.iff", datapad);
|
|
if (!isIdValid(scd))
|
|
{
|
|
LOG("sissynoid", "cityMoveStructureToSCD: SCD is not valid");
|
|
CustomerServiceLog("city_house_packup", "Structure (" + structure + ") could not be packed by player (" + getPlayerName(player) + ") - scd was not valid");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
attachScript(scd, "structure.house_control_device");
|
|
setObjVar(scd, "abandoned.packer", player);
|
|
setObjVar(scd, "abandoned.owner", structure_owner);
|
|
setObjVar(scd, "abandoned.structure", structure);
|
|
if (player_structure.isFactory(structure) && isHarvesterActive(structure))
|
|
{
|
|
LOG("sissynoid", "cityMoveStructureToSCD: We are packing a harvester/factory");
|
|
CustomerServiceLog("city_house_packup", "Structure (" + structure + ") was a factory that was active. Turning off factory for non-owner player (" + getPlayerName(player) + ") OID (" + player + ")");
|
|
deactivate(structure);
|
|
}
|
|
sendSystemMessage(player, SID_PACKING_CITY_ABANDONED_STRUCTURE);
|
|
obj_id[] players = player_structure.getPlayersInBuilding(structure);
|
|
if (players != null)
|
|
{
|
|
LOG("sissynoid", "cityMoveStructureToSCD: Ejecting Players from the house.");
|
|
for (int i = 0; i < players.length; i++)
|
|
{
|
|
expelFromBuilding(players[i]);
|
|
}
|
|
}
|
|
String[] cells = getCellNames(structure);
|
|
if (cells != null)
|
|
{
|
|
LOG("sissynoid", "cityMoveStructureToSCD: Removing Vendors");
|
|
for (int i = 0; i < cells.length; i++)
|
|
{
|
|
obj_id cellid = getCellId(structure, cells[i]);
|
|
obj_id contents[] = getContents(cellid);
|
|
if (contents != null)
|
|
{
|
|
for (int j = 0; j < contents.length; j++)
|
|
{
|
|
if (hasCondition(contents[j], CONDITION_VENDOR))
|
|
{
|
|
obj_id owner = getObjIdObjVar(contents[j], "vendor_owner");
|
|
if (!isIdValid(owner))
|
|
{
|
|
owner = getOwner(contents[j]);
|
|
}
|
|
vendor_lib.finalizePackUp(owner, contents[j], player, isCityAbandoned);
|
|
}
|
|
if (isIdValid(contents[j]))
|
|
{
|
|
messageTo(contents[j], "OnPack", null, 1.0f, false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
String structName = player_structure.getStructureName(structure);
|
|
if (structName == null || structName.length() < 1)
|
|
{
|
|
LOG("sissynoid", "cityMoveStructureToSCD: Getting Structure Name");
|
|
structName = "Building";
|
|
}
|
|
if (hasObjVar(structure, player_structure.VAR_WAYPOINT_STRUCTURE))
|
|
{
|
|
LOG("sissynoid", "cityMoveStructureToSCD: Destroying Waypoint.");
|
|
obj_id waypoint = getObjIdObjVar(structure, player_structure.VAR_WAYPOINT_STRUCTURE);
|
|
if (isIdValid(waypoint))
|
|
{
|
|
destroyWaypointInDatapad(waypoint, structure_owner);
|
|
removeObjVar(structure, player_structure.VAR_WAYPOINT_STRUCTURE);
|
|
}
|
|
}
|
|
player_structure.destroyStructureSign(structure);
|
|
setName(scd, structName);
|
|
if (player_structure.hasBeenDeclaredResidence(structure))
|
|
{
|
|
LOG("sissynoid", "cityMoveStructureToSCD: Removing Residency.");
|
|
obj_id resident = player_structure.getResidentPlayer(structure);
|
|
setHouseId(resident, obj_id.NULL_ID);
|
|
removeObjVar(structure, player_structure.VAR_RESIDENCE_BUILDING);
|
|
int cityId = getCitizenOfCityId(resident);
|
|
if (cityId != 0)
|
|
{
|
|
cityRemoveCitizen(cityId, resident);
|
|
}
|
|
}
|
|
city.removeStructureFromCity(structure);
|
|
String template = getTemplateName(structure);
|
|
player_structure.setDeedTemplate(scd, template);
|
|
if (hasObjVar(structure, player_structure.VAR_DEED_SCENE))
|
|
{
|
|
LOG("sissynoid", "cityMoveStructureToSCD: Deed Scene Initialization");
|
|
setObjVar(scd, player_structure.VAR_DEED_SCENE, player_structure.getDeedScene(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);
|
|
final int maxDepth = player_structure.isFactory(structure) ? 101 : 1;
|
|
moveToOfflinePlayerDatapadAndUnload(scd, structure_owner, maxDepth + 1);
|
|
fixLoadWith(structure, structure_owner, maxDepth);
|
|
CustomerServiceLog("housepackup", "Player " + getPlayerName(player) + " (" + player + ") packed structure (" + structure + ",abandoned=true," + where.toString() + ") owned by player " + getPlayerName(structure_owner) + " (" + structure_owner + ") into device (" + scd + ")");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int checkResidenceLinks(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id player = params.getObjId("player");
|
|
boolean confirmedResidenceOfPlayer = false;
|
|
if (hasObjVar(self, player_structure.VAR_RESIDENCE_BUILDING))
|
|
{
|
|
obj_id resident = getObjIdObjVar(self, player_structure.VAR_RESIDENCE_BUILDING);
|
|
if (resident == player)
|
|
{
|
|
confirmedResidenceOfPlayer = true;
|
|
}
|
|
}
|
|
if (!confirmedResidenceOfPlayer)
|
|
{
|
|
messageTo(player, "residentLinkFalse", null, 1, false);
|
|
}
|
|
else if (isInWorldCell(self))
|
|
{
|
|
int city_id = getCityAtLocation(getLocation(self), 0);
|
|
if (city_id > 0)
|
|
{
|
|
if (getCitizenOfCityId(player) <= 0)
|
|
{
|
|
String playerName = params.getString("playerName");
|
|
if ((playerName != null) && (playerName.length() > 0))
|
|
{
|
|
citySetCitizenInfo(city_id, player, playerName, null, city.CP_CITIZEN);
|
|
CustomerServiceLog("CityFixup", "added " + player + " (" + playerName + ") (logged in and has declared residence) as citizen of city " + city_id + " (" + cityGetName(city_id) + ").");
|
|
obj_id mayorId = cityGetLeader(city_id);
|
|
if (isIdValid(mayorId))
|
|
{
|
|
String mayorName = cityGetCitizenName(city_id, mayorId);
|
|
if ((mayorName != null) && (mayorName.length() > 0))
|
|
{
|
|
prose_package bodypp = prose.getPackage(SID_NEW_CITY_FIXUP_CITIZEN_BODY, playerName);
|
|
utils.sendMail(SID_NEW_CITY_FIXUP_CITIZEN_SUBJECT, bodypp, mayorName, "City Hall");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int houseCheck(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
location landingSpot = params.getLocation("landingSpot");
|
|
String groundScene = params.getString("groundScene");
|
|
obj_id player = params.getObjId("player");
|
|
obj_id house = params.getObjId("house");
|
|
String myPlanet = getCurrentSceneName();
|
|
obj_id[] testHouses = getAllObjectsWithObjVar(landingSpot, 250, "player_structure.admin.adminList");
|
|
Vector houses = new Vector(Arrays.asList(testHouses));
|
|
if (myPlanet.equals(groundScene))
|
|
{
|
|
if (houses != null)
|
|
{
|
|
if (houses.contains(house))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
else
|
|
{
|
|
removeObjVar(player, "homingBeacon");
|
|
sendSystemMessage(player, SID_BEACON_MISSING);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
removeObjVar(player, "homingBeacon");
|
|
sendSystemMessage(player, SID_BEACON_MISSING);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleUnloadedCityStructureReportData(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
obj_id player = params.getObjId("player");
|
|
obj_id city_terminal = params.getObjId("city_terminal");
|
|
int city_id = params.getInt("city_id");
|
|
if (!isIdValid(player) || !isIdValid(city_terminal))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!city.isNormalStructure(city_id, self))
|
|
{
|
|
location structureLocation = getLocation(self);
|
|
String structureName = localize(getNameStringId(self));
|
|
dictionary dict = new dictionary();
|
|
dict.put("player", player);
|
|
dict.put("city_id", city_id);
|
|
dict.put("city_terminal", city_terminal);
|
|
dict.put("unloadedStructureId", self);
|
|
dict.put("unloadedStructureName", structureName);
|
|
dict.put("unloadedStructureLocation", structureLocation);
|
|
messageTo(city_terminal, "RecievedUnloadedStructureResponse", dict, 0.0f, false);
|
|
}
|
|
else if (player_structure.isCivic(self))
|
|
{
|
|
location structureLocation = getLocation(self);
|
|
float cond = ((float)player_structure.getStructureCondition(self)) / ((float)player_structure.getMaxCondition(self));
|
|
int outcond = (int)(cond * 100);
|
|
String structureName = getEncodedName(self) + " (Condition : " + outcond + "%)";
|
|
dictionary dict = new dictionary();
|
|
dict.put("player", player);
|
|
dict.put("city_id", city_id);
|
|
dict.put("city_terminal", city_terminal);
|
|
dict.put("unloadedStructureId", self);
|
|
dict.put("unloadedStructureName", structureName);
|
|
dict.put("unloadedStructureLocation", structureLocation);
|
|
messageTo(city_terminal, "RecievedUnloadedStructureResponse", dict, 0.0f, false);
|
|
}
|
|
else
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int getStructureCitizenInformation(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (params == null || params.isEmpty())
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int city_id = params.getInt("city_id");
|
|
if (city.isNormalStructure(city_id, self) && !player_structure.isCivic(self))
|
|
{
|
|
obj_id terminal = params.getObjId("terminal_id");
|
|
if (hasObjVar(self, player_structure.VAR_RESIDENCE_BUILDING))
|
|
{
|
|
obj_id citizenId = getObjIdObjVar(self, player_structure.VAR_RESIDENCE_BUILDING);
|
|
params.put("house_id", self);
|
|
params.put("house_name", getEncodedName(self));
|
|
params.put("house_loc", getLocation(self));
|
|
params.put("citizen_id", citizenId);
|
|
messageTo(terminal, "getStructureCitizenInformationReturn", params, 0.0f, false);
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleSpecialSignManagementSelection(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
blog("permanent_structure.handleSpecialSignManagementSelection init");
|
|
if (params == null || params.isEmpty())
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id player = sui.getPlayerId(params);
|
|
if (!isIdValid(player))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
blog("permanent_structure.handleSpecialSignManagementSelection getting button press");
|
|
int bp = sui.getIntButtonPressed(params);
|
|
if (bp == sui.BP_CANCEL)
|
|
{
|
|
removeSpecialSignScriptVars(player);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int idx = sui.getListboxSelectedRow(params);
|
|
if (idx < 0)
|
|
{
|
|
removeSpecialSignScriptVars(player);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
blog("permanent_structure.handleSpecialSignManagementSelection finding selection");
|
|
String[] menu = utils.getStringArrayScriptVar(player, player_structure.VAR_SPECIAL_SIGN_MENU);
|
|
if (menu == null || menu.length <= 0)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
blog("permanent_structure.handleSpecialSignManagementSelection retrieved scriptvar list of menu selections");
|
|
String selection = menu[idx];
|
|
if (selection == null || selection.length() <= 0)
|
|
{
|
|
removeSpecialSignScriptVars(player);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
blog("permanent_structure.handleSpecialSignManagementSelection the selection was: " + selection);
|
|
boolean owner = player_structure.isOwner(self, player);
|
|
if (hasObjVar(self, player_structure.SPECIAL_SIGN_OWNER_ONLY))
|
|
{
|
|
boolean needsOwnerToRemove = getBooleanObjVar(self, player_structure.SPECIAL_SIGN_OWNER_ONLY);
|
|
if (!owner && needsOwnerToRemove)
|
|
{
|
|
sendSystemMessage(player, player_structure.SID_ONLY_OWNER_CAN_REMOVE);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
blog("permanent_structure.handleSpecialSignManagementSelection Checking for data.");
|
|
if (hasObjVar(self, player_structure.MODIFIED_HOUSE_SIGN_MODEL))
|
|
{
|
|
blog("permanent_structure.handleSpecialSignSelection REMOVING OLD HALLOWEEN SIGN");
|
|
player_structure.revertCustomSign(player, self);
|
|
}
|
|
if (hasObjVar(self, player_structure.SPECIAL_SIGN) && selection.startsWith("remove"))
|
|
{
|
|
if (!player_structure.removeSpecialSign(player, self, true))
|
|
{
|
|
blog("permanent_structure.handleSpecialSignManagementSelection removeSpecialSign failed!!!!");
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
else if (hasObjVar(self, player_structure.SPECIAL_SIGN) && !selection.startsWith("remove"))
|
|
{
|
|
blog("permanent_structure.handleSpecialSignManagementSelection case was replace");
|
|
if (!player_structure.removeSpecialSign(player, self, false))
|
|
{
|
|
blog("permanent_structure.handleSpecialSignManagementSelection removeSpecialSign failed!!!!");
|
|
}
|
|
}
|
|
if (sui.hasPid(player, player_structure.VAR_SPECIAL_SIGN_MENU_PID))
|
|
{
|
|
int pid = sui.getPid(player, player_structure.VAR_SPECIAL_SIGN_MENU_PID);
|
|
forceCloseSUIPage(pid);
|
|
}
|
|
blog("permanent_structure.handleSpecialSignManagementSelection getting specialSignList");
|
|
String[] specialSignList = utils.getStringArrayScriptVar(player, player_structure.VAR_SPECIAL_SIGN_NAMES);
|
|
if (specialSignList == null || specialSignList.length <= 0)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
blog("permanent_structure.handleSpecialSignManagementSelection: specialSignList received, sending player to next menu");
|
|
int pid = sui.listbox(self, player, "@base_player:special_sign_ui_prompt", sui.OK_CANCEL, "@base_player:special_sign_ui_title", specialSignList, "handleSpecialSignSelection", true);
|
|
sui.setPid(player, pid, player_structure.VAR_SPECIAL_SIGN_MENU_PID);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public int handleSpecialSignSelection(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
blog("permanent_structure.handleSpecialSignSelection: init");
|
|
if (params == null || params.isEmpty())
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id player = sui.getPlayerId(params);
|
|
if (!isIdValid(player))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int bp = sui.getIntButtonPressed(params);
|
|
if (bp == sui.BP_CANCEL)
|
|
{
|
|
removeSpecialSignScriptVars(player);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int idx = sui.getListboxSelectedRow(params);
|
|
if (idx < 0)
|
|
{
|
|
removeSpecialSignScriptVars(player);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (hasObjVar(self, player_structure.MODIFIED_HOUSE_SIGN_MODEL))
|
|
{
|
|
blog("permanent_structure.handleSpecialSignSelection REMOVING OLD HALLOWEEN SIGN");
|
|
player_structure.revertCustomSign(player, self);
|
|
}
|
|
blog("permanent_structure.handleSpecialSignSelection: validation completed");
|
|
String[] specialSignList = utils.getStringArrayScriptVar(player, player_structure.VAR_SPECIAL_SIGN_LIST);
|
|
if (specialSignList == null || specialSignList.length <= 0)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
blog("permanent_structure.handleSpecialSignSelection retrieved scriptvar list of menu selections");
|
|
String selection = specialSignList[idx];
|
|
if (selection == null || selection.length() <= 0)
|
|
{
|
|
removeSpecialSignScriptVars(player);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
blog("permanent_structure.handleSpecialSignSelection the selection was: " + selection);
|
|
int row = dataTableSearchColumnForString(selection, "sign_template", player_structure.TBL_SPECIAL_SIGNS);
|
|
if (row < 0)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
dictionary dict = dataTableGetRow(player_structure.TBL_SPECIAL_SIGNS, row);
|
|
if (dict == null)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int signType = dict.getInt("sign_type");
|
|
if (signType < 0)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int decrementSkillFlag = dict.getInt("decrement_skillmod");
|
|
if (decrementSkillFlag < 0)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
String skillmod = dict.getString("skillmod_name");
|
|
if (skillmod == null || skillmod.length() <= 0)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int adminPlacement = dict.getInt("admin_placement");
|
|
if (adminPlacement < 0)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (decrementSkillFlag > 0)
|
|
{
|
|
blog("permanent_structure.handleSpecialSignManagementSelection decrementSkillFlag GREATER THAN ZERO");
|
|
if (!applySkillStatisticModifier(player, skillmod, -1))
|
|
{
|
|
CustomerServiceLog("playerStructure", "Special Sign could not be applied to structure " + self + ". The player: " + player + ". Reason: skillmod could not be decremented.");
|
|
sendSystemMessage(player, player_structure.SID_SPECIAL_SIGN_FAILED);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
setObjVar(self, player_structure.SPECIAL_SIGN_DECREMENT_MOD, true);
|
|
}
|
|
blog("permanent_structure.handleSpecialSignManagementSelection applyign the data to the structure");
|
|
setObjVar(self, player_structure.SPECIAL_SIGN, true);
|
|
setObjVar(self, player_structure.SPECIAL_SIGN_TEMPLATE, selection);
|
|
setObjVar(self, player_structure.VAR_SIGN_TYPE, signType);
|
|
setObjVar(self, player_structure.SPECIAL_SIGN_SKILLMOD, skillmod);
|
|
if (adminPlacement == 0)
|
|
{
|
|
setObjVar(self, player_structure.SPECIAL_SIGN_OWNER_ONLY, true);
|
|
}
|
|
if (!isValidId(player_structure.createStructureSign(self)))
|
|
{
|
|
blog("permanent_structure.handleSpecialSignManagementSelection THIS DID NOT WORK CORRECTLY!! GIVING PLAYER STUFF BACK");
|
|
CustomerServiceLog("playerStructure", "Special Sign could not be applied to structure " + self + ". The player: " + player);
|
|
sendSystemMessage(player, player_structure.SID_SPECIAL_SIGN_FAILED);
|
|
if (decrementSkillFlag > 0)
|
|
{
|
|
applySkillStatisticModifier(self, skillmod, 1);
|
|
}
|
|
removeObjVar(self, player_structure.SPECIAL_SIGN);
|
|
removeObjVar(self, player_structure.SPECIAL_SIGN_TEMPLATE);
|
|
removeObjVar(self, player_structure.VAR_SIGN_TYPE);
|
|
removeObjVar(self, player_structure.SPECIAL_SIGN_SKILLMOD);
|
|
removeObjVar(self, player_structure.SPECIAL_SIGN_DECREMENT_MOD);
|
|
removeObjVar(self, player_structure.SPECIAL_SIGN_OWNER_ONLY);
|
|
removeSpecialSignScriptVars(player);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
blog("permanent_structure.handleSpecialSignManagementSelection Looks like it all went ok");
|
|
removeSpecialSignScriptVars(player);
|
|
CustomerServiceLog("playerStructure", "Player: " + player + " has used Special Sign skillmod: " + skillmod + " on structure: " + self + ". The special sign was created on the structure and the skillmod has been decremented by 1.");
|
|
sendSystemMessage(player, player_structure.SID_SPECIAL_SIGN_SUCCESS);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public boolean removeSpecialSignScriptVars(obj_id player) throws InterruptedException
|
|
{
|
|
utils.removeScriptVarTree(player, player_structure.VAR_SPECIAL_SIGN_TREE);
|
|
return true;
|
|
}
|
|
public int checkCityHousePackupStatus(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
LOG("sissynoid", "Checking Pack Status of HOuse " + self);
|
|
if (!cityIsInactivePackupActive())
|
|
{
|
|
LOG("sissynoid", "City Packup is not active yet.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id owner = player_structure.getStructureOwnerObjId(self);
|
|
if (!isIdValid(owner))
|
|
{
|
|
LOG("sissynoid", "City Pack Up System - Owner of Structure(" + self + ") was invalid");
|
|
CustomerServiceLog("city_house_packup", "City Pack Up System - Owner of Structure(" + self + ") was invalid");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!isPlayer(owner))
|
|
{
|
|
LOG("sissynoid", "City Pack Up System - Owner of Structure(" + self + ") no longer exists in the DB");
|
|
CustomerServiceLog("city_house_packup", "City Pack Up System - Owner of Structure(" + self + ") no longer exists in the DB");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
int curTime = getCalendarTime();
|
|
if (player_structure.doesUnmarkedStructureQualifyForHousePackup(self))
|
|
{
|
|
int city_id = getCityAtLocation(getLocation(self), 0);
|
|
if (cityExists(city_id))
|
|
{
|
|
int createTime = cityGetCreationTime(city_id);
|
|
if ((curTime - createTime) > 1814400)
|
|
{
|
|
obj_id city_mayor = cityGetLeader(city_id);
|
|
if (!city.hasMayorProtectionFlag(owner, city_id))
|
|
{
|
|
int loginTime = getPlayerLastLoginTime(owner);
|
|
if ((curTime - loginTime) > cityGetInactivePackupInactiveTimeSeconds())
|
|
{
|
|
if (!player_structure.isCityAbandoned(self))
|
|
{
|
|
player_structure.setCityAbandoned(self);
|
|
player_structure.updateCityAbandonedFactoryName(self);
|
|
LOG("sissynoid", "City Pack Up System - Structure(" + self + ") Owner(" + owner + ") has been offline for more than 90 Days. Setting House to be Packed Up!");
|
|
CustomerServiceLog("city_house_packup", "City Pack Up System - Structure(" + self + ") Owner(" + owner + ") has been offline for more than 90 Days. Setting House to be Packed Up!");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
if ((curTime - loginTime) > (60 * 24 * 60 * 60))
|
|
{
|
|
if (hasObjVar(self, "city_packup.inactive_citizen_mail_sent"))
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
else
|
|
{
|
|
sendMayorInactiveCitizenMail(self, owner, city_mayor, city_id);
|
|
LOG("sissynoid", "City Pack Up System - Structure(" + self + ") Owner(" + owner + ") has been offline for more than 60 Days. Sending Mayor In-Game Mail");
|
|
CustomerServiceLog("city_house_packup", "City Pack Up System - Structure(" + self + ") Owner(" + owner + ") has been offline for more than 60 Days. Sending Mayor In-Game Mail");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
if (player_structure.isCityAbandoned(self))
|
|
{
|
|
player_structure.removeCityAbandoned(self);
|
|
if (hasObjVar(self, "city_packup.inactive_citizen_mail_sent"))
|
|
{
|
|
removeObjVar(self, "city_packup.inactive_citizen_mail_sent");
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
LOG("sissynoid", "City Pack Up System - Structure(" + self + ") Owner(" + owner + ") is PROTECTED by the Mayor of City(" + city_id + ") " + cityGetName(city_id) + ".");
|
|
CustomerServiceLog("city_house_packup", "City Pack Up System - Structure(" + self + ") Owner(" + owner + ") is PROTECTED by the Mayor of City(" + city_id + ") " + cityGetName(city_id) + ".");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
LOG("sissynoid", "City Pack Up System - Structure(" + self + ") Owner(" + owner + ") can not be flagged at this time due to City(" + city_id + ") " + cityGetName(city_id) + " being too young (less than 3 weeks old).");
|
|
CustomerServiceLog("city_house_packup", "City Pack Up System - Structure(" + self + ") Owner(" + owner + ") can not be flagged at this time due to City(" + city_id + ") " + cityGetName(city_id) + " being too young (less than 3 weeks old).");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
LOG("sissynoid", "City Pack Up System - Structure(" + self + ") Owner(" + owner + ") is not currently within City Limits and is not eligible for City Pack Up System.");
|
|
CustomerServiceLog("city_house_packup", "City Pack Up System - Structure(" + self + ") Owner(" + owner + ") is not currently within City Limits and is not eligible for City Pack Up System.");
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public void sendMayorInactiveCitizenMail(obj_id house, obj_id owner, obj_id city_mayor, int city_id) throws InterruptedException
|
|
{
|
|
prose_package bodypp = prose.getPackage(SID_INACTIVE_CITIZEN_WARNING_BODY);
|
|
prose.setTT(bodypp, cityGetCitizenName(city_id, owner));
|
|
utils.sendMail(SID_INACTIVE_CITIZEN_WARNING_SUBJECT, bodypp, city_mayor, "City Hall");
|
|
setObjVar(house, "city_packup.inactive_citizen_mail_sent", 1);
|
|
}
|
|
public boolean blog(String msg) throws InterruptedException
|
|
{
|
|
if (LOGGING_ON && msg != null && !msg.equals(""))
|
|
{
|
|
LOG(LOGGING_CATEGORY, msg);
|
|
}
|
|
return true;
|
|
}
|
|
public int retrieveHouseCoords(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
if (params == null || params.isEmpty())
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
obj_id requester = params.getObjId("requestingObject");
|
|
obj_id homeOwner = params.getObjId("homeOwner");
|
|
if (!isIdValid(homeOwner))
|
|
{
|
|
CustomerServiceLog("travel", "TCG HOME ITV: Invalid Home Owner when using Home ITV.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!isIdValid(requester))
|
|
{
|
|
CustomerServiceLog("travel", "TCG HOME ITV: Invalid Requester when using Home ITV.");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (!hasObjVar(self, "player_structure.residence.building"))
|
|
{
|
|
int city_id = getCityAtLocation(getLocation(self), 0);
|
|
if (city.isTheCityMayor(homeOwner, city_id))
|
|
{
|
|
sendCoordsToRequester(self, homeOwner, requester);
|
|
}
|
|
else
|
|
{
|
|
CustomerServiceLog("travel", "TCG HOME ITV: Player(" + homeOwner + ") did not have a residence set when using the Home ITV");
|
|
sendSystemMessage(homeOwner, new string_id("tcg", "no_residence_home_itv"));
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
obj_id residenceObjVarOwner = getObjIdObjVar(self, "player_structure.residence.building");
|
|
if (residenceObjVarOwner != homeOwner)
|
|
{
|
|
CustomerServiceLog("travel", "TCG HOME ITV: Home Owner(" + homeOwner + ") and ITV user(" + residenceObjVarOwner + ") do not match.");
|
|
sendSystemMessage(homeOwner, new string_id("tcg", "no_residence_home_itv"));
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
sendCoordsToRequester(self, homeOwner, requester);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
public void sendCoordsToRequester(obj_id structure, obj_id homeOwner, obj_id requester) throws InterruptedException
|
|
{
|
|
location residenceLoc = getBuildingEjectLocation(structure);
|
|
String homePlanet = getCurrentSceneName();
|
|
dictionary dict = new dictionary();
|
|
dict.put("residenceLocation", residenceLoc);
|
|
dict.put("homePlanet", homePlanet);
|
|
dict.put("homeOwner", homeOwner);
|
|
dict.put("itv", requester);
|
|
messageTo(requester, "ownerResidenceLocationResponse", dict, 0.0f, false);
|
|
}
|
|
public int validateStructureStorageOverride(obj_id self, dictionary params) throws InterruptedException
|
|
{
|
|
String datatable = "datatables/structure/structure_storage_override.iff";
|
|
String structureTemplate = getTemplateName(self);
|
|
dictionary structureStorageOverrideData = dataTableGetRow(datatable, structureTemplate);
|
|
if (structureStorageOverrideData != null && !structureStorageOverrideData.isEmpty())
|
|
{
|
|
int expectedStorageOverrideValue = structureStorageOverrideData.getInt("OVERRIDE_STORAGE_VALUE");
|
|
if (expectedStorageOverrideValue <= 0)
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if (hasObjVar(self, "structure.capacity_override"))
|
|
{
|
|
int currentStorageOverrideValue = getIntObjVar(self, "structure.capacity_override");
|
|
if (expectedStorageOverrideValue != currentStorageOverrideValue)
|
|
{
|
|
setObjVar(self, "structure.capacity_override", expectedStorageOverrideValue);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
setObjVar(self, "structure.capacity_override", expectedStorageOverrideValue);
|
|
}
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|