Files
dsrc/sku.0/sys.server/compiled/game/script/library/house_pet.scriptlib
T
2013-09-10 23:17:15 -07:00

503 lines
16 KiB
Plaintext

/**
* Copyright (c)2008 Sony Online Entertainment Inc.
* All Rights Reserved
*
* Title: house_pet.scriptlib
* Description:
* @author $Author:jhaskell$
* @version $Revision:$
*/
//Library to be used for any mob that resides inside a player
//structure such as the TCG Greeter, Target Creature, Target Dummy,
//CTS Sarlaac, etc.
include java.util.Vector;
include library.create;
include library.player_structure;
include library.static_item;
include library.utils;
//------------------------------------------------
// Constants
//------------------------------------------------
//LOGGING
const boolean LOGGING_ON = true;
const string LOGGING_CATEGORY = "massiff_pet";
const string SARLACC_LOOT_TABLE = "datatables/loot/sarlacc_cts_housepet_loot.iff";
const string SARLACC_CTS_CRC_TABLE = "datatables/minigame/sarlacc_cts_crc.iff";
const string HOUSE_PET_TEMPLATE_OBJVAR = "house_pet";
const string CONTROLLER_PREFIX = "controller";
const string STATIC_ITEM_DEED_NAME = CONTROLLER_PREFIX + ".static_item_deed_name";
const string CHILD_OBJ_ID = CONTROLLER_PREFIX + ".child_id";
const string PET_HAS_BEEN_CALLED = CONTROLLER_PREFIX + ".pet_called";
const string PET_HUE_INDEX1 = CONTROLLER_PREFIX + ".pet_hue_index1";
const string HOUSEPET_PREFIX = "house_pet";
const string PARENT_OBJ_ID = HOUSEPET_PREFIX + ".parent_id";
const string SARLACC_BASE_LOCATION = HOUSEPET_PREFIX + ".last_location";
const string PET_NAME = HOUSEPET_PREFIX + ".name";
const string PET_MOVING = HOUSEPET_PREFIX + ".is_moving";
const string BEING_FED = HOUSEPET_PREFIX + ".being_fed";
const string MASSIFF_CURRENT_PHASE = HOUSEPET_PREFIX + ".current_phase";
const string MASSIFF_LAST_FED = HOUSEPET_PREFIX + ".last_fed";
const string MASSIFF_FOOD_OBJ = HOUSEPET_PREFIX + ".food_object";
const string MASSIFF_EGG_COUNT = HOUSEPET_PREFIX + ".egg_count";
//Scurrier Mini-Game Constants
const int SCURRIER_SNACK_DELAY = 259200;
const string SCURRIER_ITEM_01 = "item_tcg_scurrier_trash_item_02_01";
const string SCURRIER_ITEM_02 = "item_tcg_scurrier_trash_item_02_02";
const string SCURRIER_ITEM_03 = "item_tcg_scurrier_trash_item_02_03";
const string SCURRIER_ITEM_04 = "item_tcg_scurrier_trash_item_02_04";
const string SCURRIER_SNACK_LAST_FED = "scurrier_last_snack";
const string PET_SNACK_OID = CONTROLLER_PREFIX + ".pet_snack_oid";
const string SCURRIER_SNACK_OBJ = HOUSEPET_PREFIX + ".snack_object";
//SARLACC MINI GAME PHASES
const int SARLACC_FED = 0;
const int SARLACC_HUNGRY = 1;
const int SARLACC_STARVING = 2;
const int SARLACC_DEATH = 3;
const string[] SARLACC_PHASES =
{
"phase_fed",
"phase_hungry",
"phase_starving",
"phase_death"
};
const string[] MASSIFF_PHASES =
{
"phase_fed",
"phase_hungry",
"dirt_nap"
};
//OTHER SARLACC SPECIFIC CONST
const string SARLACC_PREFIX = "sarlacc_minigame";
const string SARLACC_BORN = SARLACC_PREFIX + ".born_time";
const string EDIBLES_PREFIX = SARLACC_PREFIX + ".edibles";
const string EDIBLES_SUI = EDIBLES_PREFIX + ".sui";
const string EDIBLES_IDS = EDIBLES_PREFIX + ".ids";
const string SARLACC_CRC = SARLACC_PREFIX + ".sarlacc_stomach";
const string SARLACC_FEED_ARRAY = SARLACC_PREFIX + ".feed_array";
const string SARLACC_CURRENT_PHASE = SARLACC_PREFIX + ".current_phase";
const string SARLACC_LAST_FED = SARLACC_PREFIX + ".last_fed";
const string SARLACC_FEEDING_ITERATION = SARLACC_PREFIX + ".feeding_iteration";
const string SARLACC_PHASE_START = SARLACC_PREFIX + ".phase_start";
const string SARLACC_PHASE_WEEK = SARLACC_PREFIX + ".phase_week";
const string SARLACC_OWNER_AFFECTION = SARLACC_PREFIX + ".last_affection";
const string SARLACC_REWARD_AVAILABLE = SARLACC_PREFIX + ".reward_radial";
const string SARLACC_REWARD_COLUMN = SARLACC_PREFIX + ".reward_column";
const string SARLACC_PENALTY_VAR = SARLACC_PREFIX + ".penalty_delivered";
const string SARLACC_AVOID_REPEATED_UPDATES = SARLACC_PREFIX + ".no_updated_duplicates";
const string SARLACC_FAST_UPDATE_RATE = SARLACC_PREFIX + ".god_hax";
const string SARLACC_DAILY_UPDATE_RATE = SARLACC_PREFIX + ".god_hax_daily";
const string MASSIFF_FIVE_MIN_UPDATE_RATE = SARLACC_PREFIX + ".god_hax_five_min";
const int SARLACC_UPDATE_WEEK = 604800; // ONE WEEK FROM BIRTH
const int SARLACC_UPDATE_DAY = 86400; // ONE WEEK FROM BIRTH
const int SARLACC_PHASE_WEEKS = 4; // Total Weeks before reward
const int SARLACC_DAYS_IN_WEEK = 7; //
const int SARLACC_REWARD_WEEK = SARLACC_PHASE_WEEKS + 1; // Reward window
const int SARLACC_UPDATED_SECONDS = 300; // Minimum time player can see new status on sarlacc
const int SARLACC_GOD_WEEK = 35; //week lasts 35 seconds
const int SARLACC_GOD_DAY = 5; //day lasts 5 seconds
const int SARLACC_GOD_DAILY_WEEK = 86400; //week lasts 1 24 hour day
const int SARLACC_GOD_DAILY_DAY = 12342; //day lasts 3.4 hours
const int MASSIFF_GOD_DAILY_WEEK = 300;
const int MASSIFF_GOD_DAILY_DAY = 30;
const string SOUND_SILENCE = "sound/music_silence.snd";
const string MUSIC_RANGE = "music_range";
const string PET_TRIG_VOLUME = "petTriggerVol";
const string PET_SOUND_LABEL = "petSoundLabel";
const string HOUSE_PET_MENU_PID = HOUSEPET_PREFIX + "housePetMenuPID";
const string MASSIFF_SCRIPT = "systems.tcg.tcg_massif_creature";
const string[] ALL_MASSIF_ANIMATIONS =
{
"alert",
"ashamed",
"confused",
"drink",
"eat",
"fidget",
"happy",
"look",
"look_left",
"look_right",
"nervous",
"scratch",
"sniff",
"stretch",
"threaten",
"trick_1",
"trick_2",
"vocalize"
};
const string MASSIF_ANIMATION_ALERT = "alert";
const string MASSIF_ANIMATION_ASHAMED = "ashamed";
const string MASSIF_ANIMATION_CONFUSED = "confused";
const string MASSIF_ANIMATION_DRINK = "drink";
const string MASSIF_ANIMATION_EAT = "eat";
const string MASSIF_ANIMATION_FIDGET = "fidget";
const string MASSIF_ANIMATION_HAPPY = "happy";
const string MASSIF_ANIMATION_LOOK = "look";
const string MASSIF_ANIMATION_LOOK_LEFT = "look_left";
const string MASSIF_ANIMATION_LOOK_RIGHT = "look_right";
const string MASSIF_ANIMATION_NERVOUS = "nervous";
const string MASSIF_ANIMATION_SCRATCH = "scratch";
const string MASSIF_ANIMATION_SNIFF = "sniff";
const string MASSIF_ANIMATION_STRETCH = "stretch";
const string MASSIF_ANIMATION_THREATEN = "threaten";
const string MASSIF_ANIMATION_TRICK1 = "trick_1";
const string MASSIF_ANIMATION_TRICK2 = "trick_2";
const string MASSIF_ANIMATION_VOCALIZE = "vocalize";
const string[] ALL_MASSIF_STATES =
{
"none",
"sleeping",
"lying",
"sitting_ground",
"test"
};
const int SARLACC_VERSION = 2;
const string SARLACC_VERSION_VAR = SARLACC_PREFIX + ".sarlacc_version";
const string SARLACC_FREE_CHANCE = SARLACC_PREFIX + ".used_free_chance";
const string NO_SARLACC_SOUND = SARLACC_PREFIX + ".no_sound";
const string MASSIF_STATE_COMBAT = "combat";
const string MASSIF_STATE_SLEEPING = "sleeping";
const string MASSIF_STATE_LYING = "lying";
const string MASSIF_STATE_SITTING = "sitting_ground";
//MORE MASSIF CONST
const string SIT = "sit";
const string TRICK = "trick";
const string EAT = "eat";
const string DRINK = "drink";
const string BAD = "bad";
const string COME = "come";
const string GOOD = "good";
const string HEEL = "heel";
const string UP = "up";
const string DOWN = "down";
const string SLEEP = "sleep";
const string TAKE = "take";
const string BED = "bed";
const string QUIET = "quiet";
const string STAY = "stay";
const string HERE = "here";
const string BACK = "back";
const string POTTY = "potty";
const string BREAK = "break";
const string POODOO = "poodoo";
const string POOP = "poop";
const string FETCH = "fetch";
const string SPEAK = "speak";
const string BARK = "bark";
const string DEAD = "dead";
const string PLAYDEAD = "playdead";
const string DIE = "die";
const string CONFUSED = "confused";
const string BEG = "beg";
//MASSIFF SOUNDS
const string SOUND_GROWL_RANDOM_MASSIFF = "sound/cr_massiff_random_growl.snd";
const string SOUND_WHINE_RANDOM_MASSIFF = "sound/cr_massiff_random_whine.snd";
const string SOUND_GROWL_RANDOM_NUNA = "sound/cr_nuna_random_growl.snd";
const string SOUND_WHINE_RANDOM_NUNA = "sound/cr_nuna_vocalize.snd";
const string SOUND_GROWL_RANDOM_SCURRIER = "sound/cr_blistmok_emote.snd";
const string SOUND_WHINE_RANDOM_SCURRIER = "sound/cr_blistmok_attack_light.snd";
const string HOUSE_PET_OBJVAR = "house_pet_creature";
const string HOUSE_PET_SCRIPT = "house_pet_script";
const string MASSIFF_CREATURE = "tcg_massiff_pet";
const string PET_FEEDABLE = "pet_feedable";
const string PET_FOOD_OID = CONTROLLER_PREFIX + ".pet_food_oid";
const int MASSIFF_FED = 0;
const int MASSIFF_HUNGRY = 1;
const int MASSIFF_DEAD = 2;
const string PET_KNOCKED_OUT = CONTROLLER_PREFIX + ".pet_knocked_out";
const string MASSIFF_HUNGRY_EMOTE = "appearance/pt_massiff_hungry_emote.prt";
const string NUNA_HUNGRY_EMOTE = "appearance/pt_nuna_hungry_emote.prt";
const string SCURRIER_HUNGRY_EMOTE = "appearance/pt_scurrier_hungry_emote.prt";
const string MASSIFF_POO_STATIC_ITEM = "item_tcg_nuna_rotten_egg_02_01";
//set the owner upon receiving the controller object
boolean setObjectOwner(obj_id controller)
{
if(!isValidId(controller) || !exists(controller))
return false;
if(!utils.isNestedWithinAPlayer(controller))
return false;
obj_id owner = utils.getContainingPlayer(controller);
if(!isValidId(owner) && !exists(owner))
return false;
setOwner(controller, owner);
return true;
}
//used by the greeter/non-vendor deed to get the owner of the deed/controller object
obj_id getObjectOwner(obj_id controller)
{
if(!isValidId(controller) || !exists(controller))
return null;
obj_id owner = getOwner(controller);
if(!isValidId(owner))
{
if(!setObjectOwner(controller))
return null;
}
return owner;
}
obj_id recreateSarlaccObjectAtLocationFromObjVar(obj_id controller)
{
if(!isValidId(controller) || !exists(controller))
return null;
location where = getLocation(controller);
if(where == null)
return null;
if(!hasObjVar(controller, HOUSE_PET_TEMPLATE_OBJVAR))
return null;
string mobileTemplate = getStringObjVar(controller, HOUSE_PET_TEMPLATE_OBJVAR);
if(mobileTemplate == null || mobileTemplate.equals(""))
return null;
obj_id housePetObj = create.staticObject(mobileTemplate, where);
if(!isValidId(housePetObj) || !exists(housePetObj))
return null;
//give the controller the greeter oid
setObjVar(controller, CHILD_OBJ_ID, housePetObj);
//give the greeter the controller oid
setObjVar(housePetObj, PARENT_OBJ_ID, controller);
// Set flags.
setInvulnerable(housePetObj, true);
if(mobileTemplate.indexOf("s02.iff") > -1)
attachScript(housePetObj, "event.housepackup.sarlacc_mini_game");
return housePetObj;
}
boolean recreateObjectFromObjVar(obj_id controller)
{
if(!isValidId(controller) || !exists(controller))
return false;
location where = getLocation(controller);
if(where == null)
return false;
string npcType = "";
if(!hasObjVar(controller, HOUSE_PET_TEMPLATE_OBJVAR))
return false;
string mobileTemplate = getStringObjVar(controller, HOUSE_PET_TEMPLATE_OBJVAR);
if(mobileTemplate == null || mobileTemplate.equals(""))
return false;
return buildHousePetInPlayerStructure(controller, mobileTemplate, where);
}
boolean buildHousePetInPlayerStructure(obj_id controller, string mobileTemplate, location spawnLoc)
{
if(!isValidId(controller) || !exists(controller))
return false;
if(mobileTemplate == null || mobileTemplate.equals(""))
return false;
if(spawnLoc == null)
return false;
if(!validateNpcPlacementInStructure(controller))
return false;
obj_id housePetObj = create.staticObject(mobileTemplate, spawnLoc);
if(!isValidId(housePetObj) || !exists(housePetObj))
return false;
//give the controller the greeter oid
setObjVar(controller, CHILD_OBJ_ID, housePetObj);
//give the greeter the controller oid
setObjVar(housePetObj, PARENT_OBJ_ID, controller);
// Set flags.
setInvulnerable(housePetObj, true);
if(mobileTemplate.indexOf("s02.iff") > -1)
attachScript(housePetObj, "event.housepackup.sarlacc_mini_game");
return true;
}
boolean validateNpcPlacementInStructure(obj_id object)
{
return validateNpcPlacementInStructure(object, obj_id.NULL_ID);
}
boolean validateNpcPlacementInStructure(obj_id object, obj_id operator)
{
if(!isValidId(object) || !exists(object))
return false;
obj_id structure = getTopMostContainer(object);
if(!isValidId(structure) || !exists(structure))
return false;
if(!player_structure.isPlayerStructure(structure) || player_structure.isCivic(structure))
return false;
if(isIdNull(operator))
return true;
//If there is an operator, go ahead and
//validate the following
if(player_structure.isOwner(structure, operator))
return true;
if(player_structure.isAdmin(structure, operator))
return true;
return false;
}
boolean cleanUpHousePet(obj_id housePet)
{
return cleanUpHousePet(obj_id.NULL_ID, housePet);
}
boolean cleanUpHousePet(obj_id controller, obj_id housePet)
{
if(!isValidId(housePet) || !exists(housePet))
return false;
if(hasTriggerVolume(housePet, PET_TRIG_VOLUME))
removeTriggerVolume(PET_TRIG_VOLUME);
stopPlayingMusic(housePet);
destroyObject(housePet);
if(isValidId(controller) && exists(controller))
removeObjVar(controller, house_pet.CHILD_OBJ_ID);
return true;
}
int getUpdateWeekly(obj_id controller)
{
if(hasObjVar(controller, house_pet.SARLACC_FAST_UPDATE_RATE))
return house_pet.SARLACC_GOD_WEEK;
else if(hasObjVar(controller, house_pet.SARLACC_DAILY_UPDATE_RATE))
return house_pet.SARLACC_GOD_DAILY_WEEK;
else if(hasObjVar(controller, house_pet.MASSIFF_FIVE_MIN_UPDATE_RATE))
return house_pet.MASSIFF_GOD_DAILY_WEEK;
else
return house_pet.SARLACC_UPDATE_WEEK;
}
int getUpdateDaily(obj_id controller)
{
if(hasObjVar(controller, house_pet.SARLACC_FAST_UPDATE_RATE))
return house_pet.SARLACC_GOD_DAY;
else if(hasObjVar(controller, house_pet.SARLACC_DAILY_UPDATE_RATE))
return house_pet.SARLACC_GOD_DAILY_DAY;
else if(hasObjVar(controller, house_pet.MASSIFF_FIVE_MIN_UPDATE_RATE))
return house_pet.MASSIFF_GOD_DAILY_DAY;
else
return house_pet.SARLACC_UPDATE_DAY;
}
boolean stopPlayingMusic(obj_id self)
{
//must have MUSIC_RANGE objvar
if(!hasObjVar(self, MUSIC_RANGE))
return false;
location here = getLocation(self);
if(here == null)
return false;
float range = getFloatObjVar(self, MUSIC_RANGE) + 10;
if(range <= 0)
return false;
obj_id[] playersList = getPlayerCreaturesInRange(here, range);
if(playersList == null || playersList.length <= 0)
return false;
for(int i = 0; i < playersList.length; i++)
{
obj_id player = playersList[i];
if (!isIdValid(player))
continue;
stopClientEffectObjByLabel(player, self, PET_SOUND_LABEL);
}
return true;
}
//House or POB ship check.
boolean isInAPlayerHouse(obj_id device)
{
if(!isValidId(device) || !exists(device))
return false;
if(utils.isNestedWithinAPlayer(device))
return false;
obj_id selfContainer = getContainedBy(device);
obj_id ship = space_transition.getContainingShip(selfContainer);
if(isIdValid(ship))
{
string templateName = getTemplateName(ship);
if(space_utils.isPobType(templateName))
return true;
return false;
}
obj_id house = getTopMostContainer(device);
if(isIdValid(house) && !player_structure.isBuilding(house))
return false;
if(player_structure.isPackedUp(house))
return false;
if(utils.isInHouseCellSpace(device))
return true;
return false;
}
boolean blog(string msg)
{
if(LOGGING_ON && msg != null && !msg.equals(""))
LOG(LOGGING_CATEGORY, msg);
return true;
}