mirror of
https://github.com/SWG-Source/dsrc.git
synced 2026-07-31 00:15:54 -04:00
9640 lines
226 KiB
Plaintext
9640 lines
226 KiB
Plaintext
/**
|
|
* Title: scriptlib
|
|
* Description: A library containing public general utility functions.
|
|
*/
|
|
|
|
/***** INCLUDES ********************************************************/
|
|
include java.util.Arrays;
|
|
include java.lang.System;
|
|
include java.lang.Math;
|
|
|
|
//include java.lang.reflect.Arrays;
|
|
include java.util.Arrays;
|
|
include java.util.Enumeration;
|
|
include java.util.HashSet;
|
|
include java.util.Iterator;
|
|
include java.util.List;
|
|
include java.util.Vector;
|
|
|
|
include java.io.ByteArrayInputStream;
|
|
include java.io.ByteArrayOutputStream;
|
|
include java.io.IOException;
|
|
include java.io.ObjectInputStream;
|
|
include java.io.ObjectOutputStream;
|
|
|
|
include script_entry;
|
|
|
|
include library.player_structure;
|
|
include library.healing;
|
|
include library.ai_lib;
|
|
include library.pclib;
|
|
include library.armor;
|
|
include library.chat;
|
|
include library.performance;
|
|
include library.trial;
|
|
include library.cloninglib;
|
|
include library.static_item;
|
|
|
|
/***** CONSTANTS *******************************************************/
|
|
const string VERSION = "v0.01.00";
|
|
|
|
const string VAR_OWNER = "owner";
|
|
const string VAR_COOWNERS = "coowners";
|
|
|
|
const string SLOT_INVENTORY = "inventory";
|
|
const string SLOT_DATAPAD = "datapad";
|
|
const string SLOT_HANGAR = "hangar";
|
|
const string SLOT_BANK = "bank";
|
|
const string SLOT_MISSION_BAG = "mission_bag";
|
|
|
|
const string FREE_TRIAL = "free_trial";
|
|
const string TIP = FREE_TRIAL+".tip";
|
|
const string TIP_OUT_NUM = TIP + ".tip_out_num";
|
|
const string TIP_OUT_AMMOUNT = TIP + ".tip_out_ammount";
|
|
const string TIP_IN_NUM = TIP + ".tip_in_num";
|
|
const string TIP_IN_AMMOUNT = TIP + ".tip_in_ammount";
|
|
const string TIP_IN_THACK = TIP + ".tip_in_timeHack";
|
|
const string TIP_OUT_THACK = TIP + ".tip_out_timeHack";
|
|
|
|
const string TRIAL_STRUCTURE = FREE_TRIAL+".trial_structure";
|
|
|
|
const int TIP_NUM_MAX = 25;
|
|
const int TIP_AMT_MAX = 100000;
|
|
|
|
const string NO_TRADE_SCRIPT = "item.special.nomove";
|
|
|
|
// retroactive CTS history
|
|
const string CTS_OBJVAR_HISTORY = "ctsRetroHistory";
|
|
|
|
const int BIT_LIST_SIZE = 32;
|
|
|
|
const string_id SID_OBJECT_NOT_ACTIVE = new string_id("error_message", "object_not_active");
|
|
|
|
const string[] WAYPOINT_COLORS ={
|
|
waypoint_colors.blue,
|
|
waypoint_colors.green,
|
|
waypoint_colors.orange,
|
|
waypoint_colors.yellow,
|
|
waypoint_colors.purple,
|
|
waypoint_colors.white
|
|
};
|
|
|
|
const string_id SID_SECONDS = new string_id("spam", "seconds");
|
|
const string_id SID_MINUTES = new string_id("spam", "minutes");
|
|
const string_id SID_HOURS = new string_id("spam", "hours");
|
|
const string_id SID_DAYS = new string_id("spam", "days");
|
|
const string_id SID_OUT_OF_RANGE = new string_id("spam", "out_of_range");
|
|
|
|
const int COMMANDO = 1;
|
|
const int SMUGGLER = 2;
|
|
const int MEDIC = 3;
|
|
const int OFFICER = 4;
|
|
const int SPY = 5;
|
|
const int BOUNTY_HUNTER = 6;
|
|
const int FORCE_SENSITIVE = 7;
|
|
const int TRADER = 8;
|
|
const int ENTERTAINER = 9;
|
|
|
|
// Constants for gifts
|
|
const string LIFEDAY_OWNER = "lifeday.owner";
|
|
const string XMAS_RECEIVED_V1 = "gift.xmas05";
|
|
const string XMAS_RECEIVED_V2 = "gift.xmas05v2";
|
|
|
|
const string XMAS_RECEIVED_VI1 = "gift.xmas06";
|
|
const string XMAS_RECEIVED_VI2 = "gift.xmas06v2";
|
|
|
|
const string XMAS_RECEIVED_VII1 = "gift.xmas07";
|
|
const string XMAS_RECEIVED_VII2 = "gift.xmas07v2";
|
|
const string XMAS_NOT_RECEIVED_TUTORIAL = "gift.xmas06_inTutorialFail";
|
|
|
|
const string XMAS_RECEIVED_VIII1 = "gift.xmas08";
|
|
const string XMAS_RECEIVED_VIII2 = "gift.xmas08v2";
|
|
|
|
const string XMAS_RECEIVED_IX_01 = "gift.xmas09";
|
|
|
|
const string EMPIRE_DAY_RECEIVED_VI = "gift.empire08";
|
|
|
|
const string_id GIFT_GRANTED = new string_id("system_msg", "gift_granted");
|
|
const string_id GIFT_GRANTED_SUB = new string_id("system_msg", "gift_granted_sub");
|
|
|
|
// House clean up code constants
|
|
|
|
const int HOUSE_CURRENT = 0;
|
|
const int HOUSE_HISTORY = 1;
|
|
const int HOUSE_MAX = 2;
|
|
|
|
// this value comes from TangibleObject.cpp. DO NOT CHANGE!
|
|
const obj_id OBJ_ID_BIO_LINK_PENDING = obj_id.getObjId(1);
|
|
|
|
|
|
const string VENDOR_SCRIPT = "terminal.vendor";
|
|
const string BAZAAR_SCRIPT = "terminal.bazaar";
|
|
|
|
/***** FUNCTIONS *******************************************************/
|
|
/**
|
|
* @brief return iValue clipped within the specified min/max range
|
|
*
|
|
* @param iValue
|
|
* @param iClipMin
|
|
* @param iClipMax
|
|
*
|
|
* @return integer value clipped within the min/max range
|
|
*/
|
|
int clipRange( int iValue, int iClipMin, int iClipMax )
|
|
{
|
|
return ( iValue < iClipMin ) ? iClipMin : ( iValue > iClipMax ) ? iClipMax : iValue;
|
|
}
|
|
|
|
/**
|
|
* @brief retrieve a location a random angle and distance away from pos, using pos as the locus
|
|
*
|
|
* Note: This function works if either fMaxRadius >= or <= fMinRadius
|
|
*
|
|
* @param pos
|
|
* @param fMinRadius
|
|
* @param fMaxRadius
|
|
*
|
|
* @return a random location within the specified radii from pos
|
|
*/
|
|
location getRandomAwayLocation( location pos, float fMinRadius, float fMaxRadius )
|
|
{
|
|
float fTheta = rand() * (2f * (float)Math.PI);
|
|
float fRadius = Math.min(fMinRadius, fMaxRadius) + rand() * Math.abs(fMaxRadius - fMinRadius);
|
|
|
|
pos.x += fRadius * Math.cos(fTheta);
|
|
pos.z += fRadius * Math.sin(fTheta);
|
|
return pos;
|
|
}
|
|
|
|
/**
|
|
* @brief return the floating point distance between two locations in 2D (elevation/Y is not taken into account)
|
|
*
|
|
* @param location locTarget1
|
|
* @param location locTarget2
|
|
*
|
|
* @return float distance in meters between two locations, -1.00f for invalid result
|
|
*/
|
|
/*float getDistance2D( location locTarget1, location locTarget2 )
|
|
{
|
|
if ( locTarget1 == null || locTarget2 == null)
|
|
return -1.00f;
|
|
|
|
float dx = locTarget1.x - locTarget2.x;
|
|
float dz = locTarget1.z - locTarget2.z;
|
|
|
|
return (float)Math.sqrt(dx * dx + dz * dz);
|
|
}*/
|
|
|
|
float getDistance2D( location locTarget1, location locTarget2 )
|
|
{
|
|
if ( locTarget1 == null || locTarget2 == null)
|
|
return -1.00f;
|
|
|
|
location loc1 = (location)locTarget1.clone();
|
|
loc1.y = 0f;
|
|
|
|
location loc2 = (location)locTarget2.clone();
|
|
loc2.y = 0f;
|
|
|
|
return getDistance(loc1, loc2);
|
|
}
|
|
|
|
float getDistance2D( obj_id hereTarget, obj_id thereTarget )
|
|
{
|
|
if ( !isIdValid(hereTarget) || !isIdValid(thereTarget) )
|
|
return -1.00f;
|
|
|
|
return getDistance2D(getWorldLocation(hereTarget), getWorldLocation(thereTarget));
|
|
}
|
|
|
|
attrib_mod[] addMindAttribToStim(int power)
|
|
{
|
|
attrib_mod[] am = new attrib_mod[2];
|
|
|
|
//create attribute mods for HEALTH 0 and ACTION 3 and MIND 6
|
|
for (int i = 0; i < 2; i++)
|
|
{
|
|
am[i] = createHealDamageAttribMod(i * 2, power);
|
|
}
|
|
return am;
|
|
}
|
|
|
|
/**
|
|
* @brief return an index to random-weighted array of values.
|
|
*
|
|
* Note: An empty or single element array will result in a return value of 0.
|
|
*
|
|
* @param float[] fArray
|
|
*
|
|
* @return int an index to one of the passed values
|
|
*/
|
|
int randix( float[] fArray )
|
|
{
|
|
// only need processing for multi-element arrays
|
|
if ( fArray.length > 1 )
|
|
{
|
|
// initialize sum and calculate sum of all elements
|
|
float fSum = 0.0f;
|
|
for ( int i = 0; i < fArray.length; i++ )
|
|
fSum += fArray[i];
|
|
|
|
// pick a random value in the range of sum
|
|
float fRandom = rand() * fSum;
|
|
|
|
// find the array index for the range that value fRandom falls into
|
|
fSum = 0.0f;
|
|
for ( int i = 0; i < fArray.length; i++ )
|
|
{
|
|
fSum += fArray[i];
|
|
if ( fRandom <= fSum )
|
|
return i;
|
|
}
|
|
}
|
|
|
|
// return index 0 for single element array, empty array, or first element check
|
|
return 0;
|
|
}
|
|
|
|
//
|
|
// removes all uncerted weapons and armor pieces from the player and sends system messages
|
|
// when something was unequip. Inventory may be overloaded by this function.
|
|
// returns the number of items that were unequipped
|
|
//
|
|
|
|
boolean isMando (obj_id armor)
|
|
// check to see if we are wearing mandalorian armor
|
|
{
|
|
|
|
if( isIdValid(armor))
|
|
{
|
|
string template = getTemplateName(armor);
|
|
|
|
if (template.endsWith("armor_mandalorian_belt.iff") ||
|
|
template.endsWith("armor_mandalorian_bicep_l.iff")||
|
|
template.endsWith("armor_mandalorian_bicep_r.iff")||
|
|
template.endsWith("armor_mandalorian_bracer_l.iff")||
|
|
template.endsWith("armor_mandalorian_bracer_r.iff")||
|
|
template.endsWith("armor_mandalorian_chest_plate.iff")||
|
|
template.endsWith("armor_mandalorian_helmet.iff")||
|
|
template.endsWith("armor_mandalorian_leggings.iff")||
|
|
template.endsWith("armor_mandalorian_shoes.iff")||
|
|
template.endsWith("armor_mandalorian_gloves.iff") )
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
|
|
boolean hasSpecialSkills (obj_id player)
|
|
// check to see if we have the skills necessary to wear mandalorian armor
|
|
{
|
|
boolean skillCheck = false;
|
|
|
|
if (hasSkill (player, "class_commando_phase4_master"))
|
|
{
|
|
skillCheck = true;
|
|
}
|
|
|
|
if (hasSkill (player, "class_bountyhunter_phase4_master"))
|
|
{
|
|
skillCheck = true;
|
|
}
|
|
|
|
return skillCheck;
|
|
}
|
|
|
|
int unequipAndNotifyUncerted(obj_id player)
|
|
{
|
|
int totalUnequipped = 0;
|
|
string[] armorSlots = new string[]
|
|
{
|
|
"hat",
|
|
"chest2",
|
|
"bicep_r",
|
|
"bicep_l",
|
|
"bracer_upper_r",
|
|
"bracer_lower_r",
|
|
"bracer_upper_l",
|
|
"bracer_lower_l",
|
|
"gloves",
|
|
"pants2",
|
|
"shoes",
|
|
"chest1",
|
|
"pants1",
|
|
"utility_belt"
|
|
};
|
|
|
|
obj_id curArmor = null;
|
|
obj_id inv = utils.getInventoryContainer(player);
|
|
string classTemplate = getSkillTemplate(player);
|
|
|
|
for(int i = 0; i < armorSlots.length; i++)
|
|
{
|
|
curArmor = getObjectInSlot(player, armorSlots[i]);
|
|
if ( (isIdValid(curArmor) && !armor.isArmorCertified(player, curArmor))
|
|
|
|
||(isMando(curArmor) && !hasSpecialSkills(player)) )
|
|
|
|
{
|
|
totalUnequipped++;
|
|
prose_package pp = new prose_package();
|
|
pp = prose.setStringId(pp, new string_id("spam", "armor_lost_cert"));
|
|
pp = prose.setTT(pp, curArmor);
|
|
sendSystemMessageProse(player, pp);
|
|
putInOverloaded(curArmor, inv);
|
|
}
|
|
|
|
if(!isIdNull(curArmor) && hasObjVar(curArmor, "armor.fake_armor") && hasObjVar(curArmor, "dynamic_item.required_skill") )
|
|
{
|
|
string requiredSkill = getStringObjVar(curArmor, "dynamic_item.required_skill");
|
|
if (classTemplate != null && classTemplate != "")
|
|
{
|
|
if (!classTemplate.startsWith(requiredSkill))
|
|
{
|
|
totalUnequipped++;
|
|
prose_package pp = new prose_package();
|
|
pp = prose.setStringId(pp, new string_id("spam", "armor_lost_cert"));
|
|
pp = prose.setTT(pp, curArmor);
|
|
sendSystemMessageProse(player, pp);
|
|
putInOverloaded(curArmor, inv);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
obj_id[] equipSlots = metrics.getWornItems(player);
|
|
if (equipSlots != null && equipSlots.length > 0)
|
|
{
|
|
for(int i = 0; i < equipSlots.length; i++)
|
|
{
|
|
//check to see if we no longer meet level requirements to wear item
|
|
if(!static_item.validateLevelRequired(player,(equipSlots[i])))
|
|
{
|
|
totalUnequipped++;
|
|
prose_package pp = new prose_package();
|
|
pp = prose.setStringId(pp, new string_id("spam", "item_lost_cert"));
|
|
pp = prose.setTT(pp, equipSlots[i]);
|
|
sendSystemMessageProse(player, pp);
|
|
putInOverloaded(equipSlots[i], inv);
|
|
}
|
|
//check to see if we can wear the item but no longer meet the level for the effect
|
|
else if(!static_item.validateLevelRequiredForWornEffect(player,(equipSlots[i])))
|
|
{
|
|
static_item.removeWornBuffs(equipSlots[i], player);
|
|
prose_package pp = new prose_package();
|
|
pp = prose.setStringId(pp, new string_id("spam", "item_lost_cert_effect"));
|
|
pp = prose.setTT(pp, equipSlots[i]);
|
|
sendSystemMessageProse(player, pp);
|
|
}
|
|
}
|
|
}
|
|
|
|
// check if still certed for equipped weapon. unequip if not
|
|
obj_id weapon = getCurrentWeapon(player);
|
|
if(isIdValid(weapon) && !combat.hasCertification(player, weapon))
|
|
{
|
|
totalUnequipped++;
|
|
prose_package pp = new prose_package();
|
|
pp = prose.setStringId(pp, new string_id("spam", "weapon_lost_cert"));
|
|
pp = prose.setTT(pp, weapon);
|
|
sendSystemMessageProse(player, pp);
|
|
putInOverloaded(weapon, inv);
|
|
}
|
|
|
|
obj_id hold_l = getObjectInSlot(player, "hold_l");
|
|
obj_id hold_r = getObjectInSlot(player, "hold_r");
|
|
|
|
// check left hand dance prop
|
|
if (isIdValid(hold_l) && !performance.isDancePropCertified(player, hold_l))
|
|
{
|
|
totalUnequipped++;
|
|
prose_package pp = new prose_package();
|
|
pp = prose.setStringId(pp, new string_id("spam", "prop_lost_cert"));
|
|
pp = prose.setTT(pp, hold_l);
|
|
sendSystemMessageProse(player, pp);
|
|
putInOverloaded(hold_l, inv);
|
|
hold_l = obj_id.NULL_ID;
|
|
}
|
|
|
|
// check right hand dance prop
|
|
if (isIdValid(hold_r) && !performance.isDancePropCertified(player, hold_r))
|
|
{
|
|
totalUnequipped++;
|
|
prose_package pp = new prose_package();
|
|
pp = prose.setStringId(pp, new string_id("spam", "prop_lost_cert"));
|
|
pp = prose.setTT(pp, hold_r);
|
|
sendSystemMessageProse(player, pp);
|
|
putInOverloaded(hold_r, inv);
|
|
hold_r = obj_id.NULL_ID;
|
|
}
|
|
|
|
// check dance prop dual wielding
|
|
if(performance.isValidDanceProp(hold_l) && performance.isValidDanceProp(hold_r) && !hasCommand(player, "prop_dual_wield"))
|
|
{
|
|
totalUnequipped++;
|
|
prose_package pp = new prose_package();
|
|
pp = prose.setStringId(pp, new string_id("spam", "dual_prop_lost_cert"));
|
|
pp = prose.setTT(pp, hold_l);
|
|
sendSystemMessageProse(player, pp);
|
|
putInOverloaded(hold_l, inv);
|
|
hold_l = obj_id.NULL_ID;
|
|
}
|
|
|
|
// Appearance items
|
|
obj_id [] appearanceItems = getAllItemsFromAppearanceInventory(player);
|
|
if (appearanceItems != null && appearanceItems.length > 0)
|
|
{
|
|
for(int i = 0; i < appearanceItems.length; ++i)
|
|
{
|
|
curArmor = appearanceItems[i];
|
|
|
|
if ( (isIdValid(curArmor) && !armor.isArmorCertified(player, curArmor))
|
|
||(isMando(curArmor) && !hasSpecialSkills(player)) )
|
|
{
|
|
totalUnequipped++;
|
|
prose_package pp = new prose_package();
|
|
pp = prose.setStringId(pp, new string_id("spam", "armor_lost_cert"));
|
|
pp = prose.setTT(pp, curArmor);
|
|
sendSystemMessageProse(player, pp);
|
|
putInOverloaded(curArmor, inv);
|
|
}
|
|
if(!isIdNull(curArmor) && hasObjVar(curArmor, "armor.fake_armor") && hasObjVar(curArmor, "dynamic_item.required_skill") )
|
|
{
|
|
string requiredSkill = getStringObjVar(curArmor, "dynamic_item.required_skill");
|
|
if (classTemplate != null && classTemplate != "")
|
|
{
|
|
if (!classTemplate.startsWith(requiredSkill))
|
|
{
|
|
totalUnequipped++;
|
|
prose_package pp = new prose_package();
|
|
pp = prose.setStringId(pp, new string_id("spam", "armor_lost_cert"));
|
|
pp = prose.setTT(pp, curArmor);
|
|
sendSystemMessageProse(player, pp);
|
|
putInOverloaded(curArmor, inv);
|
|
}
|
|
}
|
|
}
|
|
//check to see if we no longer meet level requirements to wear item
|
|
if(!static_item.validateLevelRequired(player,curArmor))
|
|
{
|
|
totalUnequipped++;
|
|
prose_package pp = new prose_package();
|
|
pp = prose.setStringId(pp, new string_id("spam", "item_lost_cert"));
|
|
pp = prose.setTT(pp, curArmor);
|
|
sendSystemMessageProse(player, pp);
|
|
putInOverloaded(curArmor, inv);
|
|
}
|
|
//check to see if we can wear the item but no longer meet the level for the effect
|
|
else if(!static_item.validateLevelRequiredForWornEffect(player,curArmor))
|
|
{
|
|
static_item.removeWornBuffs(curArmor, player);
|
|
prose_package pp = new prose_package();
|
|
pp = prose.setStringId(pp, new string_id("spam", "item_lost_cert_effect"));
|
|
pp = prose.setTT(pp, curArmor);
|
|
sendSystemMessageProse(player, pp);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
return totalUnequipped;
|
|
}
|
|
|
|
/**
|
|
* Finds an integer obj_var with a given name on an object.
|
|
* @param object the object to search
|
|
* @param name the objvar name to search for
|
|
* @param intDefault the integer to return if no objvar exists
|
|
*
|
|
* @return the integer, or 0 if not found
|
|
*/
|
|
int getIntObjVar( obj_id object, string name, int intDefault )
|
|
{
|
|
if ( !hasObjVar( object, name ) )
|
|
return intDefault;
|
|
return getIntObjVar( object, name );
|
|
}
|
|
|
|
/**
|
|
* Finds an integer array obj_var with a given name on an object.
|
|
* @param object the object to search
|
|
* @param name the objvar name to search for
|
|
* @param intArrayDefault the array of integers to return if no objvar exists
|
|
*
|
|
* @return the integer array, or null if not found
|
|
*/
|
|
int[] getIntArrayObjVar( obj_id object, string name, int[] intArrayDefault )
|
|
{
|
|
if ( !hasObjVar( object, name ) )
|
|
return intArrayDefault;
|
|
return getIntArrayObjVar( object, name );
|
|
}
|
|
|
|
/**
|
|
* Finds a float obj_var with a given name on an object.
|
|
* @param object the object to search
|
|
* @param name the objvar name to search for
|
|
* @param fltDefault the float to return if no objvar exists
|
|
*
|
|
* @return the float, or 0 if not found
|
|
*/
|
|
float getFloatObjVar( obj_id object, string name, float fltDefault )
|
|
{
|
|
if ( !hasObjVar( object, name ) )
|
|
return fltDefault;
|
|
return getFloatObjVar( object, name );
|
|
}
|
|
|
|
/**
|
|
* Finds a float array obj_var with a given name on an object.
|
|
* @param object the object to search
|
|
* @param name the objvar name to search for
|
|
* @param fltArrayDefault the array of floats to return if no objvar exists
|
|
*
|
|
* @return the float array, or null if not found
|
|
*/
|
|
float[] getFloatArrayObjVar( obj_id object, string name, float[] fltArrayDefault )
|
|
{
|
|
if ( !hasObjVar( object, name ) )
|
|
return fltArrayDefault;
|
|
return getFloatArrayObjVar( object, name );
|
|
}
|
|
|
|
/**
|
|
* Finds a string obj_var with a given name on an object.
|
|
* @param object the object to search
|
|
* @param name the objvar name to search for
|
|
* @param strDefault the string to return if no objvar exists
|
|
*
|
|
* @return the string, or null if not found
|
|
*/
|
|
string getStringObjVar( obj_id object, string name, string strDefault )
|
|
{
|
|
if ( !hasObjVar( object, name ) )
|
|
return strDefault;
|
|
return getStringObjVar( object, name );
|
|
}
|
|
|
|
/**
|
|
* Finds a string array obj_var with a given name on an object.
|
|
* @param object the object to search
|
|
* @param name the objvar name to search for
|
|
* @param strArrayDefault the array of strings to return if no objvar exists
|
|
*
|
|
* @return the string array, or null if not found
|
|
*/
|
|
string[] getStringArrayObjVar( obj_id object, string name, string[] strArrayDefault )
|
|
{
|
|
if ( !hasObjVar( object, name ) )
|
|
return strArrayDefault;
|
|
return getStringArrayObjVar( object, name );
|
|
}
|
|
|
|
/**
|
|
* Finds an obj_id obj_var with a given name on an object.
|
|
* @param object the object to search
|
|
* @param name the objvar name to search for
|
|
* @param idDefault the obj_id to return if no objvar exists
|
|
*
|
|
* @return the obj_id, or null if not found
|
|
*/
|
|
obj_id getObjIdObjVar( obj_id object, string name, obj_id idDefault )
|
|
{
|
|
if ( !hasObjVar( object, name ) )
|
|
return idDefault;
|
|
return getObjIdObjVar( object, name );
|
|
}
|
|
|
|
/**
|
|
* Finds an obj_id array obj_var with a given name on an object.
|
|
* @param object the object to search
|
|
* @param name the objvar name to search for
|
|
* @param idArrayDefault the array of obj_id to return if no objvar exists
|
|
*
|
|
* @return the obj_id array, or null if not found
|
|
*/
|
|
obj_id[] getObjIdArrayObjVar( obj_id object, string name, obj_id[] idArrayDefault )
|
|
{
|
|
if ( !hasObjVar( object, name ) )
|
|
return idArrayDefault;
|
|
return getObjIdArrayObjVar( object, name );
|
|
}
|
|
|
|
/**
|
|
* Finds a location obj_var with a given name on an object.
|
|
* @param object the object to search
|
|
* @param name the objvar name to search for
|
|
* @param locDefault the location to return if no objvar exists
|
|
*
|
|
* @return the location, or null if not found
|
|
*/
|
|
location getLocationObjVar( obj_id object, string name, location locDefault )
|
|
{
|
|
if ( !hasObjVar( object, name ) )
|
|
return locDefault;
|
|
return getLocationObjVar( object, name );
|
|
}
|
|
|
|
/**
|
|
* Finds a location array obj_var with a given name on an object.
|
|
* @param object the object to search
|
|
* @param name the objvar name to search for
|
|
* @param locArrayDefault the array of locations to return if no objvar exists
|
|
*
|
|
* @return the location array, or null if not found
|
|
*/
|
|
location[] getLocationArrayObjVar( obj_id object, string name, location[] locArrayDefault )
|
|
{
|
|
if ( !hasObjVar( object, name ) )
|
|
return locArrayDefault;
|
|
return getLocationArrayObjVar( object, name );
|
|
}
|
|
|
|
/**
|
|
* Finds an boolean obj_var with a given name on an object. Note that since
|
|
* we don't have real boolean objvars we get the value as an int and convert it.
|
|
* @param object the object to search
|
|
* @param name the objvar name to search for
|
|
* @param bDefault the boolean to return if no objvar exists
|
|
*
|
|
* @return the boolean value
|
|
*/
|
|
boolean getBooleanObjVar( obj_id object, string name, boolean bDefault )
|
|
{
|
|
if ( !hasObjVar( object, name ) )
|
|
return bDefault;
|
|
|
|
return getBooleanObjVar( object, name );
|
|
}
|
|
|
|
/**
|
|
* @brief Checks to see if an obj_id is in an obj_id array
|
|
*
|
|
* CAUTION! ONLY FINDS THE FIRST OCURRENCE OF THE OBJ_ID
|
|
*
|
|
* @param obj_id[] objArray
|
|
* @param obj_id objTarget
|
|
*
|
|
* @return boolean true if objTarget is found in objIdArray
|
|
*/
|
|
boolean isObjIdInArray( obj_id[] objIdArray, obj_id objTarget )
|
|
{
|
|
if ( objIdArray == null || objIdArray.length == 0 )
|
|
return false;
|
|
|
|
for ( int i = 0; i < objIdArray.length; i++ )
|
|
if( objIdArray[ i ] == objTarget )
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @brief Checks to see if an obj_id is in an obj_id array
|
|
*
|
|
* CAUTION! ONLY FINDS THE FIRST OCURRENCE OF THE OBJ_ID
|
|
*
|
|
* @param obj_id[] objArray
|
|
* @param obj_id objTarget
|
|
*
|
|
* @return boolean true if objTarget is found in objIdArray
|
|
*/
|
|
boolean isElementInArray( Vector objIdArray, Object objTarget )
|
|
{
|
|
if ( objIdArray == null || objIdArray.isEmpty() )
|
|
return false;
|
|
|
|
return objIdArray.contains(objTarget);
|
|
}
|
|
|
|
int getElementPositionInArray( Vector array, Object element )
|
|
{
|
|
if ( array == null )
|
|
return -1;
|
|
|
|
return array.indexOf(element);
|
|
}
|
|
|
|
int getElementPositionInArray( obj_id[] array, obj_id element )
|
|
{
|
|
if ( array == null || array.length == 0 )
|
|
return -1;
|
|
|
|
for ( int i = 0; i < array.length; i++ )
|
|
if( array[ i ] == element )
|
|
return i;
|
|
|
|
return -1;
|
|
}
|
|
|
|
int getElementPositionInArray( int[] array, int element )
|
|
{
|
|
if ( array == null || array.length == 0 )
|
|
return -1;
|
|
|
|
for ( int i = 0; i < array.length; i++ )
|
|
if( array[ i ] == element )
|
|
return i;
|
|
|
|
return -1;
|
|
}
|
|
|
|
int getElementPositionInArray( float[] array, float element )
|
|
{
|
|
if ( array == null || array.length == 0 )
|
|
return -1;
|
|
|
|
for ( int i = 0; i < array.length; i++ )
|
|
if( array[ i ] == element )
|
|
return i;
|
|
|
|
return -1;
|
|
}
|
|
|
|
int getElementPositionInArray( boolean[] array, boolean element )
|
|
{
|
|
if ( array == null || array.length == 0 )
|
|
return -1;
|
|
|
|
for ( int i = 0; i < array.length; i++ )
|
|
if( array[ i ] == element )
|
|
return i;
|
|
|
|
return -1;
|
|
}
|
|
|
|
int getElementPositionInArray( string[] array, string element )
|
|
{
|
|
if ( array == null || array.length == 0 )
|
|
return -1;
|
|
|
|
for ( int i = 0; i < array.length; i++ )
|
|
if( array[ i ].equals(element) )
|
|
return i;
|
|
|
|
return -1;
|
|
}
|
|
|
|
int getElementPositionInArray( region[] array, region element )
|
|
{
|
|
if ( array == null || array.length == 0 )
|
|
return -1;
|
|
|
|
for ( int i = 0; i < array.length; i++ )
|
|
if( array[ i ] == element )
|
|
return i;
|
|
|
|
return -1;
|
|
}
|
|
|
|
int getElementPositionInArray( location[] array, location element )
|
|
{
|
|
if ( array == null || array.length == 0 )
|
|
return -1;
|
|
|
|
for ( int i = 0; i < array.length; i++ )
|
|
if( array[ i ] == element )
|
|
return i;
|
|
|
|
return -1;
|
|
}
|
|
|
|
int getElementPositionInArray( string_id[] array, string_id element )
|
|
{
|
|
if ( array == null || array.length == 0 )
|
|
return -1;
|
|
|
|
for ( int i = 0; i < array.length; i++ )
|
|
if( array[ i ] == element )
|
|
return i;
|
|
|
|
return -1;
|
|
}
|
|
|
|
int getElementPositionInArray( attrib_mod[] array, attrib_mod element )
|
|
{
|
|
if ( array == null || array.length == 0 )
|
|
return -1;
|
|
|
|
for ( int i = 0; i < array.length; i++ )
|
|
if( array[ i ] == element )
|
|
return i;
|
|
|
|
return -1;
|
|
}
|
|
|
|
|
|
/**
|
|
* @brief copy the contents of an obj_id array to another obj_id array
|
|
*
|
|
* copy's an array to another array. Useful for resizing an array
|
|
*
|
|
* @param obj_id[] objSourceArray
|
|
* @param obj_id[] objDestinationArray
|
|
*
|
|
* @return obj_id[] on success: objDestinationArray, on failure: null
|
|
*/
|
|
obj_id[] copyObjIdArray( obj_id[] objSourceArray, obj_id[] objDestinationArray )
|
|
{
|
|
// check for error conditions:
|
|
// -- source or destination are null
|
|
// -- source or destination length are invalid
|
|
// -- source is larger than destination
|
|
if ( objSourceArray == null || objDestinationArray == null
|
|
|| objSourceArray.length == 0 || objDestinationArray.length == 0
|
|
|| objSourceArray.length > objDestinationArray.length )
|
|
return null; // BAD DONT DO THAT!
|
|
|
|
for ( int i = 0; i < objSourceArray.length; i++ )
|
|
objDestinationArray[ i ] = objSourceArray[ i ];
|
|
|
|
return objDestinationArray;
|
|
}
|
|
|
|
obj_id[] copyArray( obj_id[] oldArray, obj_id[] newArray )
|
|
{
|
|
if ( oldArray == null || newArray == null
|
|
|| oldArray.length == 0 || newArray.length == 0
|
|
|| oldArray.length > newArray.length )
|
|
return null; // BAD DONT DO THAT!
|
|
|
|
for ( int i = 0; i < oldArray.length; i++ )
|
|
newArray[ i ] = oldArray[ i ];
|
|
|
|
return newArray;
|
|
}
|
|
|
|
int[] copyArray( int[] oldArray, int[] newArray )
|
|
{
|
|
if ( oldArray == null || newArray == null
|
|
|| oldArray.length == 0 || newArray.length == 0
|
|
|| oldArray.length > newArray.length )
|
|
return null; // BAD DONT DO THAT!
|
|
|
|
for ( int i = 0; i < oldArray.length; i++ )
|
|
newArray[ i ] = oldArray[ i ];
|
|
|
|
return newArray;
|
|
}
|
|
|
|
float[] copyArray( float[] oldArray, float[] newArray )
|
|
{
|
|
if ( oldArray == null || newArray == null
|
|
|| oldArray.length == 0 || newArray.length == 0
|
|
|| oldArray.length > newArray.length )
|
|
return null; // BAD DONT DO THAT!
|
|
|
|
for ( int i = 0; i < oldArray.length; i++ )
|
|
newArray[ i ] = oldArray[ i ];
|
|
|
|
return newArray;
|
|
}
|
|
|
|
boolean[] copyArray( boolean[] oldArray, boolean[] newArray )
|
|
{
|
|
if ( oldArray == null || newArray == null
|
|
|| oldArray.length == 0 || newArray.length == 0
|
|
|| oldArray.length > newArray.length )
|
|
return null; // BAD DONT DO THAT!
|
|
|
|
for ( int i = 0; i < oldArray.length; i++ )
|
|
newArray[ i ] = oldArray[ i ];
|
|
|
|
return newArray;
|
|
}
|
|
|
|
string[] copyArray( string[] oldArray, string[] newArray )
|
|
{
|
|
if ( oldArray == null || newArray == null
|
|
|| oldArray.length == 0 || newArray.length == 0
|
|
|| oldArray.length > newArray.length )
|
|
return null; // BAD DONT DO THAT!
|
|
|
|
for ( int i = 0; i < oldArray.length; i++ )
|
|
newArray[ i ] = oldArray[ i ];
|
|
|
|
return newArray;
|
|
}
|
|
|
|
region[] copyArray( region[] oldArray, region[] newArray )
|
|
{
|
|
if ( oldArray == null || newArray == null
|
|
|| oldArray.length == 0 || newArray.length == 0
|
|
|| oldArray.length > newArray.length )
|
|
return null; // BAD DONT DO THAT!
|
|
|
|
for ( int i = 0; i < oldArray.length; i++ )
|
|
newArray[ i ] = oldArray[ i ];
|
|
|
|
return newArray;
|
|
}
|
|
|
|
location[] copyArray( location[] oldArray, location[] newArray )
|
|
{
|
|
if ( oldArray == null || newArray == null
|
|
|| oldArray.length == 0 || newArray.length == 0
|
|
|| oldArray.length > newArray.length )
|
|
return null; // BAD DONT DO THAT!
|
|
|
|
for ( int i = 0; i < oldArray.length; i++ )
|
|
newArray[ i ] = oldArray[ i ];
|
|
|
|
return newArray;
|
|
}
|
|
|
|
string_id[] copyArray( string_id[] oldArray, string_id[] newArray )
|
|
{
|
|
if ( oldArray == null || newArray == null
|
|
|| oldArray.length == 0 || newArray.length == 0
|
|
|| oldArray.length > newArray.length )
|
|
return null; // BAD DONT DO THAT!
|
|
|
|
for ( int i = 0; i < oldArray.length; i++ )
|
|
newArray[ i ] = oldArray[ i ];
|
|
|
|
return newArray;
|
|
}
|
|
|
|
attrib_mod[] copyArray( attrib_mod[] oldArray, attrib_mod[] newArray )
|
|
{
|
|
if ( oldArray == null || newArray == null
|
|
|| oldArray.length == 0 || newArray.length == 0
|
|
|| oldArray.length > newArray.length )
|
|
return null; // BAD DONT DO THAT!
|
|
|
|
for ( int i = 0; i < oldArray.length; i++ )
|
|
newArray[ i ] = oldArray[ i ];
|
|
|
|
return newArray;
|
|
}
|
|
|
|
/**
|
|
*/
|
|
|
|
string[] copyArrayOfRange(string[] oldArray, string[] newArray, int startIndex, int stopIndex)
|
|
{
|
|
if ( oldArray == null || newArray == null
|
|
|| oldArray.length == 0 || newArray.length == 0
|
|
|| oldArray.length < stopIndex+1)
|
|
return null; // BAD DONT DO THAT!
|
|
|
|
int j = 0;
|
|
for ( int i = startIndex; i <= stopIndex; i++ )
|
|
{
|
|
newArray[ j ] = oldArray[ i ];
|
|
j++;
|
|
}
|
|
|
|
return newArray;
|
|
}
|
|
|
|
|
|
/**
|
|
* @brief sets a bit in an int
|
|
*
|
|
* @param int intBits
|
|
* @param int intPos
|
|
*
|
|
* @return int intBits where bit intPos is 1
|
|
*/
|
|
int setBit(int intBits, int intPos)
|
|
{
|
|
if ( intPos < 0 || intPos > 31 )
|
|
{
|
|
//BAD! invalid intPos!
|
|
return 0;
|
|
}
|
|
int posVal = 1 << intPos;
|
|
return ( intBits |= posVal );
|
|
}
|
|
|
|
/**
|
|
* @brief clears a bit in an int
|
|
*
|
|
* @param int intBits
|
|
* @param int intPos
|
|
*
|
|
* @return int intBits where bit intPos is 0
|
|
*/
|
|
int clearBit(int intBits, int intPos)
|
|
{
|
|
if ( intPos < 0 || intPos > 31 )
|
|
{
|
|
//BAD! invalid intPos!
|
|
return ~0;
|
|
}
|
|
int posVal = 1 << intPos;
|
|
return ( intBits &= ~posVal );
|
|
}
|
|
|
|
/**
|
|
* @brief checks a bit in an int to see if it is 1
|
|
*
|
|
* @param int intBits
|
|
* @param int intPos
|
|
*
|
|
* @return boolean - true, if bit set
|
|
*/
|
|
boolean checkBit(int intBits, int intPos)
|
|
{
|
|
if ( intPos < 0 || intPos > 31 )
|
|
{
|
|
//BAD! invalid intPos!
|
|
return false;
|
|
}
|
|
int posVal = 1 << intPos;
|
|
return ((intBits & posVal) != 0 );
|
|
}
|
|
|
|
/**
|
|
* @brief converts a string to its obj_id equivalent
|
|
*
|
|
* @param string text
|
|
*
|
|
* @return obj_id
|
|
*/
|
|
obj_id stringToObjId(string text)
|
|
{
|
|
// bulletproofing this
|
|
|
|
Long lngId;
|
|
|
|
try
|
|
{
|
|
lngId = new Long(text); // convert the string to a long so we can make an obj_id
|
|
} // try with error handling
|
|
catch (NumberFormatException err)
|
|
{
|
|
//debugServerConsoleMsg(null, "Long Conversion Failed in stringToObjId");
|
|
return null;
|
|
}
|
|
obj_id objObject = obj_id.getObjId(lngId.longValue()); // doesn't check if it's actually a valid object
|
|
return objObject;
|
|
}
|
|
|
|
obj_id[] stringToObjId(string[] text)
|
|
{
|
|
if ( (text == null) || (text.length == 0) )
|
|
return null;
|
|
|
|
obj_id[] ids = new obj_id[text.length];
|
|
|
|
for ( int i = 0; i < text.length; i++ )
|
|
{
|
|
ids[i] = stringToObjId(text[i]);
|
|
}
|
|
|
|
if ( ids.length == text.length )
|
|
{
|
|
return ids;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
int stringToInt(string text)
|
|
{
|
|
if ( text == null || text.equals("") )
|
|
return -1;
|
|
|
|
int amt;
|
|
|
|
try
|
|
{
|
|
amt = Integer.parseInt(text);
|
|
} // try with error handling
|
|
catch (NumberFormatException err)
|
|
{
|
|
//debugServerConsoleMsg(null, "int conversion failed in stringToInt");
|
|
return -1;
|
|
}
|
|
|
|
return amt;
|
|
}
|
|
|
|
long stringToLong(string text)
|
|
{
|
|
if ( text == null || text.equals("") )
|
|
return -1;
|
|
|
|
long amt;
|
|
|
|
try
|
|
{
|
|
amt = Long.parseLong(text);
|
|
} // try with error handling
|
|
catch (NumberFormatException err)
|
|
{
|
|
//debugServerConsoleMsg(null, "int conversion failed in stringToInt");
|
|
return -1;
|
|
}
|
|
|
|
return amt;
|
|
}
|
|
|
|
|
|
|
|
float stringToFloat(string text)
|
|
{
|
|
if ( text == null || text.equals("") )
|
|
return Float.NEGATIVE_INFINITY;
|
|
|
|
float amt;
|
|
|
|
try
|
|
{
|
|
amt = Float.parseFloat(text);
|
|
} // try with error handling
|
|
catch (NumberFormatException err)
|
|
{
|
|
//debugServerConsoleMsg(null, "float conversion failed in stringToFloat");
|
|
return Float.NEGATIVE_INFINITY;
|
|
}
|
|
|
|
return amt;
|
|
}
|
|
|
|
string objIdArrayToString(obj_id[] array)
|
|
{
|
|
string text = "[ ";
|
|
|
|
for (int i = 0; i < array.length; i++)
|
|
{
|
|
text += ""+array[i];
|
|
|
|
if (i < array.length-1)
|
|
text += ", ";
|
|
}
|
|
|
|
text += " ]";
|
|
|
|
return text;
|
|
}
|
|
|
|
Vector removeElementAt( Vector array, int index )
|
|
{
|
|
if ( array == null )
|
|
return null;
|
|
|
|
if ( index < 0 || index >= array.size() )
|
|
return array;
|
|
|
|
array.removeElementAt(index);
|
|
return array;
|
|
}
|
|
|
|
Vector removeElement( Vector array, obj_id element )
|
|
{
|
|
if (array == null)
|
|
return null;
|
|
|
|
if ( element == null )
|
|
return array;
|
|
|
|
array.removeElement(element);
|
|
return array;
|
|
}
|
|
|
|
Vector removeElements( Vector array, obj_id[] elements )
|
|
{
|
|
if (array == null)
|
|
return null;
|
|
|
|
if ( elements == null || elements.length == 0 )
|
|
return array;
|
|
|
|
List collection = Arrays.asList(elements);
|
|
array.removeAll(collection);
|
|
return array;
|
|
}
|
|
|
|
Vector removeElements( obj_id[] array, obj_id[] elements )
|
|
{
|
|
if (array == null)
|
|
return null;
|
|
|
|
Vector ret = new Vector(Arrays.asList(array));
|
|
if ( ret == null )
|
|
return null;
|
|
|
|
if ( elements == null || elements.length == 0 )
|
|
return ret;
|
|
|
|
List collection = Arrays.asList(elements);
|
|
ret.removeAll(collection);
|
|
return ret;
|
|
}
|
|
|
|
Vector removeElements( Vector array, Vector elements )
|
|
{
|
|
if (array == null)
|
|
return null;
|
|
|
|
if ( elements == null || elements.size() == 0 )
|
|
return array;
|
|
|
|
array.removeAll(elements);
|
|
return array;
|
|
}
|
|
|
|
Vector addElement( Vector array, Object element )
|
|
{
|
|
if ( array == null )
|
|
return addElement(new Vector(), element);
|
|
|
|
if ( element == null )
|
|
return array;
|
|
|
|
array.add(element);
|
|
return array;
|
|
}
|
|
|
|
Vector addElement( Vector array, boolean element )
|
|
{
|
|
return addElement( array, new Boolean(element) );
|
|
}
|
|
|
|
Vector addElement( Vector array, int element )
|
|
{
|
|
return addElement( array, new Integer(element) );
|
|
}
|
|
|
|
Vector addElement( Vector array, float element )
|
|
{
|
|
return addElement( array, new Float(element) );
|
|
}
|
|
|
|
|
|
obj_id[] toStaticObjIdArray(Vector vector)
|
|
{
|
|
if ( vector == null || vector.size() == 0 )
|
|
return null;
|
|
|
|
obj_id[] ret = new obj_id[vector.size()];
|
|
vector.toArray(ret);
|
|
return ret;
|
|
}
|
|
|
|
string[] toStaticStringArray(Vector vector)
|
|
{
|
|
if ( vector == null || vector.size() == 0 )
|
|
return null;
|
|
|
|
string[] ret = new string[vector.size()];
|
|
vector.toArray(ret);
|
|
return ret;
|
|
}
|
|
|
|
location[] toStaticLocationArray(Vector vector)
|
|
{
|
|
if ( vector == null || vector.size() == 0 )
|
|
return null;
|
|
|
|
location[] ret = new location[vector.size()];
|
|
vector.toArray(ret);
|
|
return ret;
|
|
}
|
|
|
|
boolean[] messageTo( obj_id[] targets, string messageName, dictionary params, float time, boolean guaranteed )
|
|
{
|
|
if ( targets != null && targets.length > 0 )
|
|
{
|
|
boolean[] results = new boolean[ targets.length ];
|
|
for ( int i = 0; i < targets.length; i++ )
|
|
results[i] = messageTo( targets[i], messageName, params, time, guaranteed );
|
|
return results;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/************************************************************
|
|
* @brief determines if the location is at least the specified
|
|
* distance from the provided objects
|
|
*
|
|
* @param location loc
|
|
* @param obj_id[] items
|
|
* @param float distance
|
|
*
|
|
* @return boolean
|
|
************************************************************/
|
|
boolean isLocSufficientDistanceFromObjects(location loc, obj_id[] items, float dist)
|
|
{
|
|
if ( (items == null) || (dist < 0) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
for ( int i = 0; i < items.length; i++ )
|
|
{
|
|
if ( getDistance2D(loc, getLocation(items[i])) < dist )
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/************************************************************
|
|
* @brief concats two obj_id arrays
|
|
*
|
|
* @param obj_id array1
|
|
* @param obj_id array2
|
|
*
|
|
* @return obj_id; null on error
|
|
************************************************************/
|
|
obj_id[] concatArrays(obj_id[] array1, obj_id[] array2)
|
|
{
|
|
if(array1 == null)
|
|
return array2;
|
|
|
|
else if(array2 == null)
|
|
return array1;
|
|
|
|
obj_id[] toPass = new obj_id[array1.length + array2.length];
|
|
|
|
for(int i = 0; i < array1.length; i++)
|
|
toPass[i] = array1[i];
|
|
|
|
for(int i = 0; i < array2.length; i++)
|
|
toPass[i + array1.length] = array2[i];
|
|
|
|
return toPass;
|
|
}
|
|
|
|
/************************************************************
|
|
* @brief concats two resizeable arrays
|
|
*
|
|
* @param Vector array1
|
|
* @param Vector array2
|
|
*
|
|
* @return Vector; null on error
|
|
************************************************************/
|
|
Vector concatArrays(Vector array1, Vector array2)
|
|
{
|
|
if ( array1 == null )
|
|
return array2;
|
|
else if (array2 == null)
|
|
return array1;
|
|
|
|
array1.addAll(array2);
|
|
return array1;
|
|
}
|
|
|
|
/************************************************************
|
|
* @brief concats a resizeable array and a normal array
|
|
*
|
|
* @param Vector array1
|
|
* @param Vector array2
|
|
*
|
|
* @return Vector; null on error
|
|
************************************************************/
|
|
Vector concatArrays(Vector array1, Object[] array2)
|
|
{
|
|
if ( array2 == null )
|
|
return array1;
|
|
|
|
if ( array1 == null )
|
|
array1 = new Vector(array2.length + 10);
|
|
|
|
array1.addAll(Arrays.asList(array2));
|
|
return array1;
|
|
}
|
|
|
|
/************************************************************
|
|
* @brief concats a resizeable array and a normal array
|
|
*
|
|
* @param Vector array1
|
|
* @param Vector array2
|
|
*
|
|
* @return Vector; null on error
|
|
************************************************************/
|
|
Vector concatArrays(Vector array1, int[] array2)
|
|
{
|
|
if ( array2 == null )
|
|
return array1;
|
|
|
|
Object[] toPass = new Object[array2.length];
|
|
for ( int i = 0; i < array2.length; i++ )
|
|
toPass[i] = new Integer(array2[i]);
|
|
|
|
return concatArrays(array1, toPass);
|
|
}
|
|
|
|
/************************************************************
|
|
* @brief concats a resizeable array and a normal array
|
|
*
|
|
* @param Vector array1
|
|
* @param Vector array2
|
|
*
|
|
* @return Vector; null on error
|
|
************************************************************/
|
|
Vector concatArrays(Vector array1, float[] array2)
|
|
{
|
|
if ( array2 == null )
|
|
return array1;
|
|
|
|
Object[] toPass = new Object[array2.length];
|
|
for ( int i = 0; i < array2.length; i++ )
|
|
toPass[i] = new Float(array2[i]);
|
|
|
|
return concatArrays(array1, toPass);
|
|
}
|
|
|
|
/************************************************************
|
|
* @brief concats a resizeable array and a normal array
|
|
*
|
|
* @param Vector array1
|
|
* @param Vector array2
|
|
*
|
|
* @return Vector; null on error
|
|
************************************************************/
|
|
Vector concatArrays(Vector array1, boolean[] array2)
|
|
{
|
|
if ( array2 == null )
|
|
return array1;
|
|
|
|
Object[] toPass = new Object[array2.length];
|
|
for ( int i = 0; i < array2.length; i++ )
|
|
toPass[i] = new Boolean(array2[i]);
|
|
|
|
return concatArrays(array1, toPass);
|
|
}
|
|
|
|
|
|
string[] concatArrays(string[] array1, string[] array2)
|
|
{
|
|
if ( array1 == null )
|
|
return array2;
|
|
|
|
if ( array2 == null )
|
|
return array1;
|
|
|
|
string[] toPass = new string[array1.length + array2.length];
|
|
for ( int i = 0; i < array1.length; i++ )
|
|
toPass[i] = array1[i];
|
|
|
|
for ( int i = 0; i < array2.length; i++ )
|
|
toPass[i+array1.length] = array2[i];
|
|
|
|
return toPass;
|
|
}
|
|
|
|
/************************************************************
|
|
* @brief validates that array2 is a subset of array1
|
|
*
|
|
* @param obj_id[] array1
|
|
* @param obj_id[] array2
|
|
*
|
|
* @return boolean
|
|
************************************************************/
|
|
boolean isSubset( obj_id[] array1, obj_id[] array2 )
|
|
{
|
|
if ( (array1 == null) || (array2 == null) )
|
|
return false;
|
|
|
|
Vector v1 = new Vector( Arrays.asList(array1) );
|
|
Vector v2 = new Vector( Arrays.asList(array2) );
|
|
|
|
return v1.containsAll(v2);
|
|
}
|
|
|
|
/************************************************************
|
|
* @brief validates that array2 is a subset of array1
|
|
*
|
|
* @param string[] array1
|
|
* @param string[] array2
|
|
*
|
|
* @return boolean
|
|
************************************************************/
|
|
boolean isSubset( string[] array1, string[] array2 )
|
|
{
|
|
if ( (array1 == null) || (array2 == null) )
|
|
return false;
|
|
|
|
Vector v1 = new Vector( Arrays.asList(array1) );
|
|
Vector v2 = new Vector( Arrays.asList(array2) );
|
|
|
|
return v1.containsAll(v2);
|
|
}
|
|
|
|
/************************************************************
|
|
* @brief validates that array2 is a subset of array1
|
|
*
|
|
* @param string_id[] array1
|
|
* @param string_id[] array2
|
|
*
|
|
* @return boolean
|
|
************************************************************/
|
|
boolean isSubset( string_id[] array1, string_id[] array2 )
|
|
{
|
|
if ( (array1 == null) || (array2 == null) )
|
|
return false;
|
|
|
|
Vector v1 = new Vector( Arrays.asList(array1) );
|
|
Vector v2 = new Vector( Arrays.asList(array2) );
|
|
|
|
return v1.containsAll(v2);
|
|
}
|
|
|
|
/************************************************************
|
|
* @brief validates that array2 is a subset of array1
|
|
*
|
|
* @param region[] array1
|
|
* @param region[] array2
|
|
*
|
|
* @return boolean
|
|
************************************************************/
|
|
boolean isSubset( region[] array1, region[] array2 )
|
|
{
|
|
if ( (array1 == null) || (array2 == null) )
|
|
return false;
|
|
|
|
Vector v1 = new Vector( Arrays.asList(array1) );
|
|
Vector v2 = new Vector( Arrays.asList(array2) );
|
|
|
|
return v1.containsAll(v2);
|
|
}
|
|
|
|
/************************************************************
|
|
* @brief validates that array2 is a subset of array1
|
|
*
|
|
* @param location[] array1
|
|
* @param location[] array2
|
|
*
|
|
* @return boolean
|
|
************************************************************/
|
|
boolean isSubset( location[] array1, location[] array2 )
|
|
{
|
|
if ( (array1 == null) || (array2 == null) )
|
|
return false;
|
|
|
|
Vector v1 = new Vector( Arrays.asList(array1) );
|
|
Vector v2 = new Vector( Arrays.asList(array2) );
|
|
|
|
return v1.containsAll(v2);
|
|
}
|
|
|
|
/************************************************************
|
|
* @brief validates that array2 is a subset of array1
|
|
*
|
|
* @param location[] array1
|
|
* @param location[] array2
|
|
*
|
|
* @return boolean
|
|
************************************************************/
|
|
boolean isSubset( attrib_mod[] array1, attrib_mod[] array2 )
|
|
{
|
|
if ( (array1 == null) || (array2 == null) )
|
|
return false;
|
|
|
|
Vector v1 = new Vector( Arrays.asList(array1) );
|
|
Vector v2 = new Vector( Arrays.asList(array2) );
|
|
|
|
return v1.containsAll(v2);
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief make name list from obj_id's
|
|
*
|
|
* @param obj_id[] players
|
|
*
|
|
* @return string[]; null on error
|
|
******************************************************************/
|
|
string[] makeNameListFromPlayerObjIdList(obj_id[] players)
|
|
{
|
|
if ( players == null )
|
|
return null;
|
|
|
|
resizeable string[] nameList = new string[0];
|
|
|
|
for ( int i = 0; i < players.length; i++ )
|
|
{
|
|
if ( isPlayer(players[i]) )
|
|
{
|
|
nameList = addElement(nameList, getName(players[i]));
|
|
}
|
|
}
|
|
|
|
if ( nameList.length == players.length )
|
|
{
|
|
return nameList;
|
|
}
|
|
else
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief make name list from obj_id's
|
|
*
|
|
* @param obj_id[] targets
|
|
*
|
|
* @return string[]; null on error
|
|
******************************************************************/
|
|
string[] makeNameList(obj_id[] targets)
|
|
{
|
|
if ( targets == null )
|
|
return null;
|
|
|
|
resizeable string[] nameList = new string[0];
|
|
|
|
obj_id self = getSelf();
|
|
|
|
for ( int i = 0; i < targets.length; i++ )
|
|
{
|
|
if ( isIdValid(targets[i]) )
|
|
{
|
|
string itemName = getEncodedName(targets[i]);
|
|
if ( itemName != null )
|
|
{
|
|
nameList = addElement(nameList, itemName);
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( nameList.length == targets.length )
|
|
{
|
|
return nameList;
|
|
}
|
|
else
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief make name list from obj_id's
|
|
*
|
|
* @param Vector targets
|
|
*
|
|
* @return string[]; null on error
|
|
******************************************************************/
|
|
string[] makeNameList(Vector targets)
|
|
{
|
|
if ( targets == null || targets.isEmpty() )
|
|
return null;
|
|
|
|
obj_id[] targetsArray = new obj_id[targets.size()];
|
|
targetsArray = (obj_id[])targets.toArray(targetsArray);
|
|
return makeNameList(targetsArray);
|
|
}
|
|
|
|
|
|
/*****************************************************************
|
|
* @brief determines if the target object is owned by the player
|
|
*
|
|
* @param obj_id target
|
|
* @param obj_id player
|
|
*
|
|
* @return boolean
|
|
******************************************************************/
|
|
boolean isOwner(obj_id target, obj_id player)
|
|
{
|
|
if ( (!isIdValid(target)) || (!isIdValid(player)) )
|
|
return false;
|
|
|
|
if ( getOwner(target) == player )
|
|
{
|
|
return true;
|
|
}
|
|
|
|
if ( getObjIdObjVar(target, VAR_OWNER) == player )
|
|
{
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief determines if the target object is coowned by the player
|
|
*
|
|
* @param obj_id target
|
|
* @param obj_id player
|
|
*
|
|
* @return boolean
|
|
******************************************************************/
|
|
boolean isCoOwner(obj_id target, obj_id player)
|
|
{
|
|
if ( (target == null) || (!isIdValid(player)) )
|
|
return false;
|
|
|
|
obj_id[] coowners = getObjIdArrayObjVar(target, VAR_COOWNERS);
|
|
if ( coowners == null )
|
|
return false;
|
|
|
|
if ( getElementPositionInArray(coowners, player) > -1 )
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief optional recursion getContents()
|
|
*
|
|
* @param obj_id container
|
|
* @param boolean recurse
|
|
*
|
|
* @return obj_id[]; null on error/nothing found
|
|
******************************************************************/
|
|
obj_id[] getContents(obj_id container, boolean recurse, Vector excludedNodes)
|
|
{
|
|
resizeable obj_id[] contents = getResizeableContents(container, recurse, excludedNodes);
|
|
return contents;
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief optional recursion getContents()
|
|
*
|
|
* @param obj_id container
|
|
* @param boolean recurse
|
|
*
|
|
* @return obj_id[]; null on error/nothing found
|
|
******************************************************************/
|
|
obj_id[] getContents(obj_id container, boolean recurse)
|
|
{
|
|
resizeable obj_id[] contents = getResizeableContents(container, recurse, null);
|
|
return contents;
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief optional recursion getContents()
|
|
*
|
|
* @param obj_id container
|
|
* @param boolean recurse
|
|
*
|
|
* @return obj_id[]; null on error/nothing found
|
|
******************************************************************/
|
|
Vector getResizeableContents(obj_id container, boolean recurse, Vector excludedNodes)
|
|
{
|
|
if ( (!isIdValid(container)) || (getContainerType(container) == 0) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( !recurse )
|
|
{
|
|
return getResizeableContents(container);
|
|
}
|
|
else
|
|
{
|
|
resizeable obj_id[] contents = getResizeableContents(container);
|
|
if ( contents == null )
|
|
return null;
|
|
|
|
boolean exclude = true;
|
|
if ( (excludedNodes == null) || excludedNodes.isEmpty() )
|
|
{
|
|
exclude = false;
|
|
}
|
|
|
|
for ( int i = 0; i < contents.length; i++ )
|
|
{
|
|
obj_id item = contents[i];
|
|
if ( isIdValid(item) )
|
|
{
|
|
|
|
boolean keepItem = true;
|
|
if ( exclude )
|
|
{
|
|
int idx = excludedNodes.indexOf(item);
|
|
if ( idx > -1 )
|
|
{
|
|
contents = removeElementAt(contents, i);
|
|
i--;
|
|
keepItem = false;
|
|
}
|
|
}
|
|
|
|
if ( keepItem)
|
|
{
|
|
// don't recurse into the contents of a factory crate
|
|
int itemGameObjectType = getGameObjectType(item);
|
|
if ( itemGameObjectType != GOT_misc_factory_crate && itemGameObjectType != GOT_chronicles_quest_holocron )
|
|
{
|
|
int containerType = getContainerType(item);
|
|
if ( containerType != 0 )
|
|
{
|
|
obj_id[] newContents = getContents(item);
|
|
if ( newContents != null )
|
|
{
|
|
contents = concatArrays(contents, newContents);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return contents;
|
|
}
|
|
}
|
|
|
|
|
|
/******************************************************************
|
|
* obj_id object the objects you want the same container objects for
|
|
*
|
|
* return obj_id[] shared container contents if any or null if object is not contained
|
|
*******************************************************************/
|
|
|
|
obj_id[] getSharedContainerObjects(obj_id object)
|
|
{
|
|
if (!isIdValid(object) || !exists(object))
|
|
return null;
|
|
|
|
obj_id container = getContainedBy(object);
|
|
if (!isIdValid(container) || !exists(container))
|
|
return null;
|
|
|
|
return getContents(container);
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief optional recursion getContents()
|
|
*
|
|
* @param obj_id container
|
|
* @param boolean recurse
|
|
*
|
|
* @return obj_id[]; null on error/nothing found
|
|
******************************************************************/
|
|
Vector getResizeableContents(obj_id container, boolean recurse)
|
|
{
|
|
return getResizeableContents(container, recurse, null);
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief optional recursion getContents()
|
|
*
|
|
* @param obj_id container
|
|
*
|
|
* @return obj_id[]; null on error/nothing found
|
|
******************************************************************/
|
|
obj_id[] getNonBankPlayerContents(obj_id player)
|
|
{
|
|
if ( !isIdValid(player) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
obj_id bank = getPlayerBank(player);
|
|
if ( !isIdValid(bank) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
resizeable obj_id[] toExclude = addElement(null, bank);
|
|
obj_id[] contents = getContents(player, true, toExclude);
|
|
return contents;
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief optional recursion getContents()
|
|
*
|
|
* @param obj_id container
|
|
*
|
|
* @return obj_id[]; null on error/nothing found
|
|
******************************************************************/
|
|
obj_id[] getFilteredPlayerContents(obj_id player)
|
|
{
|
|
if ( !isIdValid(player) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
resizeable obj_id[] toExclude = null;
|
|
|
|
obj_id bank = getPlayerBank(player);
|
|
if ( isIdValid(bank) )
|
|
{
|
|
toExclude = addElement(toExclude, bank);
|
|
}
|
|
|
|
obj_id missionBag = getMissionBag(player);
|
|
if ( isIdValid(missionBag) )
|
|
{
|
|
toExclude = addElement(toExclude, missionBag);
|
|
}
|
|
|
|
obj_id datapad = getPlayerDatapad(player);
|
|
if ( isIdValid(datapad) )
|
|
{
|
|
toExclude = addElement(toExclude, datapad);
|
|
}
|
|
|
|
return getContents(player, true, toExclude);
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief determines if the target object is coowned by the player
|
|
*
|
|
* @param obj_id container
|
|
* @param obj_id player
|
|
*
|
|
* @return obj_id[]; null on error/nothing found
|
|
******************************************************************/
|
|
obj_id[] getAllContentsOwnedByPlayer(obj_id container, obj_id player)
|
|
{
|
|
if ( (!isIdValid(container)) || (container == obj_id.NULL_ID) || (!isIdValid(player)) )
|
|
return null;
|
|
|
|
resizeable obj_id[] ownedObjects = new obj_id[0];
|
|
obj_id[] allObjects = getContents(container, true);
|
|
|
|
if ( allObjects == null )
|
|
return null;
|
|
|
|
for ( int i = 0; i < allObjects.length; i++ )
|
|
{
|
|
if ( getObjIdObjVar(allObjects[i], VAR_OWNER) == player )
|
|
{
|
|
ownedObjects = addElement(ownedObjects, allObjects[i]);
|
|
}
|
|
}
|
|
|
|
if ( ownedObjects.length > 0 )
|
|
{
|
|
return ownedObjects;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
boolean isNestedWithin(obj_id item, obj_id container)
|
|
{
|
|
if ( !isIdValid(item) || !isIdValid(container) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
obj_id containedBy = getContainedBy(item);
|
|
if ( !isIdValid(containedBy) )
|
|
{
|
|
return false;
|
|
}
|
|
else if ( containedBy == container )
|
|
{
|
|
return true;
|
|
}
|
|
|
|
return isNestedWithin(containedBy, container);
|
|
}
|
|
|
|
boolean isNestedWithinAPlayer(obj_id item)
|
|
{
|
|
return isNestedWithinAPlayer(item, true);
|
|
}
|
|
|
|
//allows the search to not count the bank as part of the players inventory
|
|
boolean isNestedWithinAPlayer(obj_id item, boolean searchBank)
|
|
{
|
|
if ( !isIdValid(item) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if ( isIdValid(getContainingPlayer(item)) )
|
|
{
|
|
if(searchBank)
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
obj_id player = getContainingPlayer(item);
|
|
obj_id bank = getPlayerBank(player);
|
|
|
|
if(isIdValid(bank))
|
|
{
|
|
obj_id containedBy = getContainedBy(item);
|
|
|
|
if(containedBy == bank)
|
|
{
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
obj_id getContainingPlayer(obj_id item)
|
|
{
|
|
obj_id containedBy = getContainedBy(item);
|
|
if ( !isIdValid(containedBy) )
|
|
{
|
|
return null;
|
|
}
|
|
else if ( isPlayer(containedBy) )
|
|
{
|
|
return containedBy;
|
|
}
|
|
return getContainingPlayer(containedBy);
|
|
}
|
|
|
|
|
|
boolean isNestedWithinANpcCreature(obj_id item)
|
|
{
|
|
if ( !isIdValid(item) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if ( isIdValid(getContainingNpcCreature(item)) )
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
obj_id getContainingNpcCreature(obj_id item)
|
|
{
|
|
obj_id containedBy = getContainedBy(item);
|
|
if ( !isIdValid(containedBy) )
|
|
{
|
|
return null;
|
|
}
|
|
else if ( isNpcCreature(containedBy) )
|
|
{
|
|
return containedBy;
|
|
}
|
|
|
|
return getContainingNpcCreature(containedBy);
|
|
}
|
|
|
|
obj_id getContainingPlayerOrCreature(obj_id item)
|
|
{
|
|
obj_id containedBy = getContainedBy(item);
|
|
if ( !isIdValid(containedBy) )
|
|
{
|
|
return null;
|
|
}
|
|
else if ( isNpcCreature(containedBy) || isPlayer(containedBy))
|
|
{
|
|
return containedBy;
|
|
}
|
|
|
|
return getContainingPlayerOrCreature(containedBy);
|
|
}
|
|
|
|
|
|
// -------------------------------------
|
|
// Checking player for an item based on template name
|
|
//
|
|
// just checking player inventory
|
|
boolean playerHasItemByTemplate(obj_id objPlayer, string strTemplate)
|
|
{
|
|
obj_id objInventory = getInventoryContainer(objPlayer);
|
|
if( isIdValid(objInventory) )
|
|
{
|
|
obj_id[] objContents = getContents(objInventory, true);
|
|
|
|
if( objContents != null )
|
|
{
|
|
for( int intI = 0; intI<objContents.length; intI++ )
|
|
{
|
|
string strItemTemplate = getTemplateName(objContents[intI]);
|
|
if( strItemTemplate==strTemplate )
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
boolean playerHasItemByTemplateInDataPad(obj_id objPlayer, string strTemplate)
|
|
{
|
|
obj_id pDataPad = getPlayerDatapad(objPlayer);
|
|
if( isIdValid(pDataPad) )
|
|
{
|
|
LOG("utils", "playerHasItemByTemplateInDataPad::pDataPad " + pDataPad);
|
|
obj_id[] objContents = getContents(pDataPad, true);
|
|
LOG("utils", "playerHasItemByTemplateInDataPad::objContents.length " + objContents.length);
|
|
if( objContents != null )
|
|
{
|
|
for( int intI = 0; intI < objContents.length; intI++ )
|
|
{
|
|
string strItemTemplate = getTemplateName(objContents[intI]);
|
|
LOG("utils", "playerHasItemByTemplateInDataPad::strItemTemplate " + strItemTemplate);
|
|
LOG("utils", "playerHasItemByTemplateInDataPad::strTemplate " + strTemplate);
|
|
if( strItemTemplate==strTemplate )
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
LOG("utils", "playerHasItemByTemplateInDataPad::Dpad was invalid");
|
|
return false;
|
|
}
|
|
|
|
int playerHasHowManyItemByTemplateInDataPad(obj_id objPlayer, string strTemplate, boolean recurse)
|
|
{
|
|
int count = 0;
|
|
obj_id pDataPad = getPlayerDatapad(objPlayer);
|
|
if( isIdValid(pDataPad) )
|
|
{
|
|
obj_id[] objContents = getContents(pDataPad, recurse);
|
|
if( objContents != null )
|
|
{
|
|
for( int intI = 0; intI < objContents.length; intI++ )
|
|
{
|
|
string strItemTemplate = getTemplateName(objContents[intI]);
|
|
if( strItemTemplate.equals(strTemplate) )
|
|
{
|
|
++count;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return count;
|
|
}
|
|
|
|
boolean playerHasItemByTemplateInInventoryOrEquipped(obj_id player, string desiredTemplate)
|
|
{
|
|
obj_id[] contents = getInventoryAndEquipment(player);
|
|
|
|
if (contents != null)
|
|
{
|
|
for(int i = 0;i<contents.length;i++)
|
|
{
|
|
string inventoryObject = getTemplateName(contents[i]);
|
|
if(inventoryObject.equals(desiredTemplate))
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
obj_id getItemByTemplateInInventoryOrEquipped(obj_id player, string desiredTemplate)
|
|
{
|
|
obj_id[] contents = getInventoryAndEquipment(player);
|
|
if(contents != null)
|
|
{
|
|
|
|
for(int i = 0;i<contents.length;i++)
|
|
{
|
|
string inventoryObject = getTemplateName(contents[i]);
|
|
if(inventoryObject.equals(desiredTemplate))
|
|
return contents[i];
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
boolean playerHasItemWithObjVarInInventoryOrEquipped(obj_id player, string desiredObjVar)
|
|
{
|
|
obj_id[] contents = getInventoryAndEquipment(player);
|
|
|
|
if (contents != null)
|
|
{
|
|
for(int i = 0;i<contents.length;i++)
|
|
{
|
|
if(hasObjVar(contents[i], desiredObjVar))
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
boolean playerHasItemByTemplateWithObjVarInInventoryOrEquipped(obj_id player, string desiredTemplate, string desiredObjVar)
|
|
{
|
|
obj_id[] contents = getInventoryAndEquipment(player);
|
|
|
|
if (contents != null)
|
|
{
|
|
for(int i = 0;i<contents.length;i++)
|
|
{
|
|
string inventoryObject = getTemplateName(contents[i]);
|
|
if(inventoryObject.equals(desiredTemplate))
|
|
{
|
|
if(hasObjVar(contents[i], desiredObjVar))
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// just checking player bank
|
|
boolean playerHasItemByTemplateInBank(obj_id objPlayer, string strTemplate)
|
|
{
|
|
obj_id objBank = getPlayerBank(objPlayer);
|
|
if( isIdValid(objBank) )
|
|
{
|
|
obj_id[] objContents = getContents(objBank, true);
|
|
|
|
if( objContents != null )
|
|
{
|
|
for( int i = 0; i < objContents.length; i++ )
|
|
{
|
|
string strItemTemplate = getTemplateName(objContents[i]);
|
|
if( strItemTemplate==strTemplate )
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// checking player bank and inventory
|
|
boolean playerHasItemByTemplateInBankOrInventory(obj_id objPlayer, string strTemplate)
|
|
{
|
|
if ( playerHasItemByTemplate(objPlayer, strTemplate) )
|
|
return true;
|
|
|
|
else if ( playerHasItemByTemplateInBank( objPlayer, strTemplate) )
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
// checking player bank and inventory
|
|
boolean playerHasStaticItemInBankOrInventory(obj_id player, string staticItem)
|
|
{
|
|
return (isIdValid(getStaticItemInBankOrInventory(player, staticItem)));
|
|
}
|
|
|
|
obj_id getStaticItemInBankOrInventory(obj_id player, string staticItem)
|
|
{
|
|
obj_id[] contents = getInventoryAndEquipment(player);
|
|
if (contents != null && contents.length > 0)
|
|
{
|
|
for(int i = 0;i < contents.length;i++)
|
|
{
|
|
string itemName = getStaticItemName(contents[i]);
|
|
if (itemName != null && staticItem != null && staticItem.equals(itemName))
|
|
return contents[i];
|
|
}
|
|
}
|
|
|
|
obj_id bank = getPlayerBank(player);
|
|
if (isIdValid(bank))
|
|
{
|
|
contents = getContents(bank, true);
|
|
|
|
if (contents != null && contents.length > 0)
|
|
{
|
|
for (int i = 0; i < contents.length; i++ )
|
|
{
|
|
string itemName = static_item.getStaticItemName(contents[i]);
|
|
if (itemName != null && staticItem != null && staticItem.equals(itemName))
|
|
return contents[i];
|
|
}
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
// checking player bank and inventory
|
|
boolean playerHasStaticItemInAppearanceInventory(obj_id player, string staticItem)
|
|
{
|
|
return (isIdValid(getStaticItemInAppearanceInventory(player, staticItem)));
|
|
}
|
|
|
|
obj_id getStaticItemInAppearanceInventory(obj_id player, string staticItem)
|
|
{
|
|
obj_id [] contents = getAllItemsFromAppearanceInventory(player);
|
|
{
|
|
if(contents != null && contents.length > 0)
|
|
{
|
|
for(int i = 0;i < contents.length;i++)
|
|
{
|
|
string itemName = getStaticItemName(contents[i]);
|
|
if (itemName != null && staticItem != null && staticItem.equals(itemName))
|
|
return contents[i];
|
|
}
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
//gets all static items of the same type in the players inventory and returns them in an array
|
|
|
|
obj_id[] getAllStaticItemsInPlayerInventory(obj_id player, string staticItem)
|
|
{
|
|
resizeable obj_id[] objectList = new Vector ();
|
|
|
|
obj_id inventory = getInventoryContainer(player);
|
|
if( isIdValid(inventory) )
|
|
{
|
|
obj_id[] contents = getInventoryAndEquipment(player);
|
|
|
|
if( contents != null && contents.length > 0 )
|
|
{
|
|
for( int i = 0; i < contents.length; i++ )
|
|
{
|
|
if (contents[i] != null)
|
|
{
|
|
if (static_item.isStaticItem(contents[i]))
|
|
{
|
|
string itemName = getStaticItemName(contents[i]);
|
|
if( itemName==staticItem )
|
|
{
|
|
objectList = addElement (objectList, contents[i]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (objectList.size () > 0)
|
|
{
|
|
obj_id[] staticList = new obj_id[objectList.size()];
|
|
objectList.toArray (staticList);
|
|
return staticList;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
obj_id getStaticItemInInventory(obj_id player, string staticItem)
|
|
{
|
|
obj_id[] contents = getInventoryAndEquipment(player);
|
|
if (contents != null && contents.length > 0)
|
|
{
|
|
for(int i = 0;i < contents.length;i++)
|
|
{
|
|
string itemName = getStaticItemName(contents[i]);
|
|
if (itemName != null && staticItem != null && staticItem.equals(itemName))
|
|
return contents[i];
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
//gets the total amount of stackable objects from an array list
|
|
|
|
int countOfStackedItemsInArray(obj_id[] items)
|
|
{
|
|
int totalCount = 0;
|
|
|
|
for( int i = 0; i < items.length; i++ )
|
|
{
|
|
int itemCount = getCount(items[i]);
|
|
totalCount = itemCount + totalCount;
|
|
}
|
|
return totalCount;
|
|
}
|
|
|
|
// just checking player inventory
|
|
obj_id getItemPlayerHasByTemplate(obj_id objPlayer, string strTemplate)
|
|
{
|
|
obj_id objInventory = getInventoryContainer(objPlayer);
|
|
if( isIdValid(objInventory) )
|
|
{
|
|
obj_id[] objContents = getContents(objInventory, true);
|
|
|
|
if( objContents != null )
|
|
{
|
|
for( int i = 0; i < objContents.length; i++ )
|
|
{
|
|
string strItemTemplate = getTemplateName(objContents[i]);
|
|
if( strItemTemplate==strTemplate )
|
|
{
|
|
return objContents[i];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
obj_id getItemPlayerHasByTemplateInDatapad(obj_id objPlayer, string strTemplate)
|
|
{
|
|
obj_id pDataPad = getPlayerDatapad(objPlayer);
|
|
if( isIdValid(pDataPad) )
|
|
{
|
|
obj_id[] objContents = getContents(pDataPad, true);
|
|
|
|
if( objContents != null )
|
|
{
|
|
for( int i = 0; i < objContents.length; i++ )
|
|
{
|
|
string strItemTemplate = getTemplateName(objContents[i]);
|
|
if( strItemTemplate==strTemplate )
|
|
{
|
|
return objContents[i];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
|
|
// just checking player bank
|
|
obj_id getItemPlayerHasByTemplateInBank(obj_id objPlayer, string strTemplate)
|
|
{
|
|
obj_id objBank = getPlayerBank(objPlayer);
|
|
if( isIdValid(objBank) )
|
|
{
|
|
obj_id[] objContents = getContents(objBank, true);
|
|
|
|
if( objContents != null )
|
|
{
|
|
for( int i = 0; i < objContents.length; i++ )
|
|
{
|
|
string strItemTemplate = getTemplateName(objContents[i]);
|
|
if( strItemTemplate==strTemplate )
|
|
{
|
|
return objContents[i];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
// checking player bank and inventory. Inventory checked first.
|
|
obj_id getItemPlayerHasByTemplateInBankOrInventory(obj_id objPlayer, string strTemplate)
|
|
{
|
|
obj_id itemObj = getItemPlayerHasByTemplate(objPlayer, strTemplate);
|
|
if ( isIdValid( itemObj ) )
|
|
{
|
|
return itemObj;
|
|
}
|
|
else
|
|
{
|
|
itemObj = getItemPlayerHasByTemplateInBank(objPlayer, strTemplate);
|
|
if ( isIdValid(itemObj) )
|
|
{
|
|
return itemObj;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
// just checking player inventory
|
|
obj_id[] getAllItemsPlayerHasByTemplate(obj_id objPlayer, string strTemplate)
|
|
{
|
|
obj_id objInventory = getInventoryContainer(objPlayer);
|
|
if( isIdValid(objInventory) )
|
|
return getAllItemsInContainerByTemplate( objInventory, strTemplate, true);
|
|
else
|
|
return null;
|
|
}
|
|
|
|
// just checking player bank
|
|
obj_id[] getAllItemsPlayerHasByTemplateInBank(obj_id objPlayer, string strTemplate)
|
|
{
|
|
obj_id objBank = getPlayerBank(objPlayer);
|
|
if( isIdValid(objBank) )
|
|
return getAllItemsInContainerByTemplate( objBank, strTemplate, true );
|
|
else
|
|
return null;
|
|
}
|
|
obj_id[] getAllItemsInContainerByTemplate( obj_id container, string template, boolean recurse )
|
|
{
|
|
return getAllItemsInContainerByTemplate(container, template, recurse, true);
|
|
}
|
|
|
|
obj_id[] getAllItemsInContainerByTemplate( obj_id container, string template, boolean recurse, boolean allowEquipped )
|
|
{
|
|
resizeable obj_id[] objectList = new Vector ();
|
|
if( isIdValid(container) )
|
|
{
|
|
obj_id[] objContents = getContents(container, recurse);
|
|
if( objContents != null )
|
|
{
|
|
for( int intI = 0; intI<objContents.length; intI++ )
|
|
{
|
|
string itemTemplate = getTemplateName(objContents[intI]);
|
|
if( itemTemplate == template )
|
|
{
|
|
if(!allowEquipped)
|
|
{
|
|
if(isEquipped(objContents[intI]))
|
|
continue;
|
|
}
|
|
objectList = addElement (objectList, objContents[intI]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (objectList.size () > 0)
|
|
{
|
|
obj_id[] staticList = new obj_id[objectList.size()];
|
|
objectList.toArray (staticList);
|
|
return staticList;
|
|
}
|
|
else
|
|
return null;
|
|
}
|
|
|
|
// just checking player inventory for item templates that starts with
|
|
obj_id[] getAllItemsPlayerHasByTemplateStartsWith(obj_id objPlayer, string strTemplate)
|
|
{
|
|
obj_id objInventory = getInventoryContainer(objPlayer);
|
|
if( isIdValid(objInventory) )
|
|
return getAllItemsInContainerByTemplateStartsWith( objInventory, strTemplate, true);
|
|
else
|
|
return null;
|
|
}
|
|
|
|
// just checking player bank for item templates that starts with
|
|
obj_id[] getAllItemsPlayerHasByTemplateInBankStartsWith(obj_id objPlayer, string strTemplate)
|
|
{
|
|
obj_id objBank = getPlayerBank(objPlayer);
|
|
if( isIdValid(objBank) )
|
|
return getAllItemsInContainerByTemplateStartsWith( objBank, strTemplate, true );
|
|
else
|
|
return null;
|
|
}
|
|
|
|
obj_id[] getAllItemsInContainerByTemplateStartsWith( obj_id container, string template, boolean recurse )
|
|
{
|
|
resizeable obj_id[] objectList = new Vector ();
|
|
if( isIdValid(container) )
|
|
{
|
|
obj_id[] objContents = getContents(container, recurse);
|
|
if( objContents != null )
|
|
{
|
|
for( int intI = 0; intI<objContents.length; intI++ )
|
|
{
|
|
string itemTemplate = getTemplateName(objContents[intI]);
|
|
if( itemTemplate.startsWith (template))
|
|
{
|
|
objectList = addElement (objectList, objContents[intI]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (objectList.size () > 0)
|
|
{
|
|
obj_id[] staticList = new obj_id[objectList.size()];
|
|
objectList.toArray (staticList);
|
|
return staticList;
|
|
}
|
|
else
|
|
return null;
|
|
}
|
|
|
|
// checking player bank and inventory
|
|
obj_id[] getAllItemsPlayerHasByTemplateInBankAndInventory(obj_id objPlayer, string strTemplate)
|
|
{
|
|
resizeable obj_id[] objectList = new Vector ();
|
|
|
|
obj_id objInventory = getInventoryContainer(objPlayer);
|
|
if( isIdValid(objInventory) )
|
|
{
|
|
obj_id[] objContents = getContents(objInventory, true);
|
|
|
|
if( objContents != null )
|
|
{
|
|
for( int i = 0; i < objContents.length; i++ )
|
|
{
|
|
string strItemTemplate = getTemplateName(objContents[i]);
|
|
if( strItemTemplate==strTemplate )
|
|
{
|
|
objectList = addElement (objectList, objContents[i]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
obj_id objBank = getPlayerBank(objPlayer);
|
|
if( isIdValid(objBank) )
|
|
{
|
|
obj_id[] objContents = getContents(objBank, true);
|
|
|
|
if( objContents != null )
|
|
{
|
|
for( int j = 0; j < objContents.length; j++ )
|
|
{
|
|
string strItemTemplate = getTemplateName(objContents[j]);
|
|
if( strItemTemplate==strTemplate )
|
|
{
|
|
objectList = addElement (objectList, objContents[j]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (objectList.size () > 0)
|
|
{
|
|
obj_id[] staticList = new obj_id[objectList.size()];
|
|
objectList.toArray (staticList);
|
|
return staticList;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
obj_id[] getAllItemsInBankAndInventory(obj_id objPlayer)
|
|
{
|
|
resizeable obj_id[] objectList = new Vector ();
|
|
|
|
obj_id[] objContents = getInventoryAndEquipment(objPlayer);
|
|
|
|
if( objContents != null )
|
|
{
|
|
for( int i = 0; i < objContents.length; i++ )
|
|
{
|
|
objectList = addElement (objectList, objContents[i]);
|
|
}
|
|
}
|
|
|
|
obj_id objBank = getPlayerBank(objPlayer);
|
|
if( isIdValid(objBank) )
|
|
{
|
|
objContents = getContents(objBank, true);
|
|
|
|
if( objContents != null )
|
|
{
|
|
for( int j = 0; j < objContents.length; j++ )
|
|
{
|
|
objectList = addElement (objectList, objContents[j]);
|
|
}
|
|
}
|
|
}
|
|
if (objectList.size () > 0)
|
|
{
|
|
obj_id[] staticList = new obj_id[objectList.size()];
|
|
objectList.toArray (staticList);
|
|
return staticList;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
//
|
|
// -------------------------------------
|
|
|
|
|
|
location getRandomLocationInRing(location locOrigin, float fltMinDistance, float fltMaxDistance)
|
|
{
|
|
|
|
|
|
// we need to calculate the distance
|
|
// becuase rand only works with ints, we have to use the uglier float version
|
|
float fltRand = rand();
|
|
|
|
float fltDistance = (fltMaxDistance - fltMinDistance) * fltRand +fltMinDistance; // nasty
|
|
obj_id objTest = null;
|
|
debugServerConsoleMsg(objTest, "fltDistance is "+fltDistance);
|
|
|
|
float fltAngle = rand(0, 360); // angle in degrees
|
|
locOrigin = rotatePointXZ(locOrigin, fltDistance, fltAngle);
|
|
|
|
|
|
return locOrigin;
|
|
}
|
|
|
|
|
|
location rotatePointXZ(location locOrigin, float fltDistance, float fltAngle)
|
|
{
|
|
location locOffset = (location)locOrigin.clone();
|
|
locOffset.x = locOrigin.x + fltDistance;
|
|
locOffset.z = locOrigin.z;
|
|
|
|
return rotatePointXZ(locOrigin, locOffset, fltAngle);
|
|
}
|
|
|
|
location rotatePointXZ(location locOrigin, location locPoint, float fltAngle)
|
|
{
|
|
float dx = locPoint.x - locOrigin.x;
|
|
float dz = locPoint.z - locOrigin.z;
|
|
|
|
float fltRadians = (float)Math.toRadians(fltAngle);
|
|
float fltC = (float)Math.cos(fltRadians);
|
|
float fltS = (float) Math.sin(fltRadians);
|
|
|
|
location locNewOffset = (location)locOrigin.clone();
|
|
locNewOffset.x += (dx * fltS) - (dz * fltC);
|
|
locNewOffset.y = locPoint.y;
|
|
locNewOffset.z += (dx * fltC) + (dz * fltS);
|
|
|
|
return locNewOffset;
|
|
}
|
|
|
|
|
|
location rotatePointXZ(location locPoint, float fltAngle)
|
|
{
|
|
//LOG("player_spawner", "rotating point");
|
|
float fltRadians = (float) Math.toRadians(fltAngle);
|
|
float fltC = (float) Math.cos(fltRadians);
|
|
float fltS = (float) Math.sin(fltRadians);
|
|
//LOG("player_spawner", "locPoint is "+locPoint);
|
|
location locNewPoint = (location)locPoint.clone();
|
|
locNewPoint.x += (locPoint.x * fltC) - (locPoint.z * fltS);
|
|
locNewPoint.z += (locPoint.x * fltS) + (locPoint.z * fltC);
|
|
|
|
return locNewPoint;
|
|
}
|
|
|
|
float getHeadingToLocation(location here, location there)
|
|
{
|
|
if ( here == null || there == null )
|
|
return -1f;
|
|
|
|
float dx = there.x - here.x;
|
|
float dz = there.z - here.z;
|
|
|
|
double radHeading = Math.atan2(-dx, dz);
|
|
double degreeHeading = Math.toDegrees(radHeading);
|
|
return (float)(degreeHeading);
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief determines the location at the proper location in front of target
|
|
*
|
|
* @param obj_id target
|
|
* @param distance distance
|
|
*
|
|
* @return location, null on error
|
|
******************************************************************/
|
|
location findLocInFrontOfTarget(obj_id target, float distance)
|
|
{
|
|
if ( target == null || !exists(target))
|
|
return null;
|
|
|
|
location origin = getLocation(target);
|
|
|
|
if(origin == null)
|
|
return null;
|
|
|
|
float yaw = getYaw(target);
|
|
|
|
location newLoc = rotatePointXZ(origin, distance, yaw);
|
|
|
|
return newLoc;
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief creates an attrib modifier from its constituent parts
|
|
*
|
|
* @param int attrib
|
|
* @param int value
|
|
* @param float duration
|
|
* @param float attack
|
|
* @param float decay
|
|
*
|
|
* @return attrib_mod
|
|
*****************************************************************/
|
|
attrib_mod createAttribMod(int attrib, int value, float duration, float attack, float decay)
|
|
{
|
|
return new attrib_mod(attrib, value, duration, attack, decay);
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief creates an attrib modifier from its constituent parts
|
|
*
|
|
* @param int attrib
|
|
* @param int value
|
|
* @param float duration
|
|
* @param float attack
|
|
* @param float decay
|
|
*
|
|
* @return attrib_mod
|
|
*****************************************************************/
|
|
attrib_mod createAttribMod(int attrib, int value, float duration, float attack)
|
|
{
|
|
return new attrib_mod(attrib, value, duration, attack, 0.0f);
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief creates an attrib modifier from its constituent parts
|
|
*
|
|
* @param int attrib
|
|
* @param int value
|
|
* @param float duration
|
|
* @param float attack
|
|
*
|
|
* @return attrib_mod
|
|
*****************************************************************/
|
|
attrib_mod createAttribMod(int attrib, int value, float duration)
|
|
{
|
|
return new attrib_mod(attrib, value, duration, 0.0f, 0.0f);
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief creates an attrib modifier from its constituent parts
|
|
*
|
|
* @param int attrib
|
|
* @param int value
|
|
* @param float duration
|
|
* @param float attack
|
|
*
|
|
* @return attrib_mod
|
|
*****************************************************************/
|
|
attrib_mod createHealDamageAttribMod(int attrib, int value)
|
|
{
|
|
if ( (value < 1) || (attrib % 3 != 0) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
return new attrib_mod(attrib, value, 0.0f, 0.0f, MOD_POOL);
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief creates an attrib modifier from its constituent parts
|
|
*
|
|
* @param int attrib
|
|
* @param int value
|
|
* @param float duration
|
|
* @param float attack
|
|
*
|
|
* @return attrib_mod
|
|
*****************************************************************/
|
|
attrib_mod createHealWoundAttribMod(int attrib, int value)
|
|
{
|
|
if ( value < 1 )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
return new attrib_mod(attrib, value, 0.0f, healing.AM_HEAL_WOUND, 0.0f);
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief creates an attrib modifier from its constituent parts
|
|
*
|
|
* @param int attrib
|
|
* @param int value
|
|
* @param float duration
|
|
* @param float attack
|
|
*
|
|
* @return attrib_mod
|
|
*****************************************************************/
|
|
attrib_mod createHealShockAttribMod(int value)
|
|
{
|
|
if ( value < 1 )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
return new attrib_mod(0, value, 0.0f, healing.AM_HEAL_SHOCK, 0.0f);
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief creates an attrib modifier from its constituent parts
|
|
*
|
|
* @param int attrib
|
|
* @param int value
|
|
* @param float duration
|
|
* @param float attack
|
|
*
|
|
* @return attrib_mod
|
|
*****************************************************************/
|
|
attrib_mod createAddShockAttribMod(int value)
|
|
{
|
|
if ( value < 1 )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
return new attrib_mod(0, value, 0.0f, healing.AM_ADD_SHOCK, 0.0f);
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief creates an attrib modifier from its constituent parts
|
|
*
|
|
* @param int attrib
|
|
* @param int value
|
|
* @param float duration
|
|
* @param float attack
|
|
*
|
|
* @return attrib_mod
|
|
*****************************************************************/
|
|
attrib_mod createWoundAttribMod(int attrib, int value)
|
|
{
|
|
if ( value < 1 )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
return new attrib_mod(attrib, value, 0.0f, 0.0f, MOD_WOUND);
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief creates an attrib modifier from its constituent parts
|
|
*
|
|
* @param int attrib
|
|
* @param int value
|
|
* @param float duration
|
|
* @param float attack
|
|
*
|
|
* @return attrib_mod
|
|
*****************************************************************/
|
|
attrib_mod createAntidoteAttribMod(int attrib)
|
|
{
|
|
return new attrib_mod(attrib, 0, 0.0f, 0.0f, MOD_ANTIDOTE);
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief overload function for addAttribModifier
|
|
*
|
|
* @param obj_id target
|
|
* @param int attrib
|
|
* @param int value
|
|
* @param float duration
|
|
*
|
|
* @return boolean; false on error
|
|
*****************************************************************/
|
|
boolean addAttribMod(obj_id target, int attrib, int value, float duration)
|
|
{
|
|
return addAttribModifier(target, attrib, value, duration, 0.0f, 0.0f);
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief overload function for addAttribMod
|
|
*
|
|
* @param obj_id player
|
|
* @param obj_id target
|
|
* @param attrib_mod am
|
|
*
|
|
* @return boolean; false on error
|
|
*****************************************************************/
|
|
boolean addAttribMod(obj_id target, attrib_mod am)
|
|
{
|
|
if(target == null || am == null)
|
|
return false;
|
|
|
|
boolean litmus = true;
|
|
|
|
int attrib = am.getAttribute();
|
|
float duration = am.getDuration();
|
|
|
|
int amt = am.getValue();
|
|
int attack = (int)(am.getAttack());
|
|
int decay = (int)(am.getDecay());
|
|
|
|
if ( attack < 0 )
|
|
{
|
|
switch (attack)
|
|
{
|
|
case (int)healing.AM_HEAL_WOUND:
|
|
if ( amt < 0 )
|
|
{
|
|
amt = 0;
|
|
}
|
|
break;
|
|
|
|
case (int)healing.AM_HEAL_SHOCK:
|
|
if ( amt < 0 )
|
|
{
|
|
amt = 0;
|
|
}
|
|
litmus &= healShockWound(target, amt);
|
|
break;
|
|
|
|
case (int)healing.AM_ADD_SHOCK:
|
|
if ( amt < 0 )
|
|
{
|
|
amt = 0;
|
|
}
|
|
litmus &= addShockWound(target, amt);
|
|
break;
|
|
}
|
|
}
|
|
/*else if ( decay < 0 )
|
|
{
|
|
switch (decay)
|
|
{
|
|
case (int)MOD_POOL:
|
|
case (int)MOD_WOUND:
|
|
case (int)MOD_ANTIDOTE:
|
|
return addAttribModifier(target, am.getAttribute(), am.getValue(), am.getDuration(), am.getAttack(), am.getDecay());
|
|
}
|
|
}*/
|
|
else
|
|
{
|
|
if (!addAttribModifier(target, attrib, amt, duration, am.getAttack(), am.getDecay()))
|
|
{
|
|
//debugSpeakMsg(target, "unable to add attrib mod...");
|
|
litmus = false;
|
|
}
|
|
}
|
|
return litmus;
|
|
}
|
|
|
|
|
|
/*****************************************************************
|
|
* @brief applies each of the attrib mods in an attrib mod array
|
|
*
|
|
* @param obj_id target
|
|
* @param attrib_mod[] am
|
|
*
|
|
* @return boolean; false on error
|
|
*****************************************************************/
|
|
boolean addAttribMod(obj_id target, attrib_mod[] am)
|
|
{
|
|
if ( (target == null) || (am == null) || (am.length == 0) )
|
|
return false;
|
|
|
|
boolean ret = true;
|
|
|
|
for ( int i = 0; i < am.length; i++ )
|
|
{
|
|
ret &= addAttribMod(target, am[i]);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
|
|
/*****************************************************************
|
|
* @brief rotates an object
|
|
*
|
|
* @param obj_id target
|
|
* @param float heading (in degrees)
|
|
*
|
|
* @return boolean; false on error
|
|
*****************************************************************/
|
|
boolean setHeading(obj_id target, float heading)
|
|
{
|
|
if ( target == null )
|
|
return false;
|
|
|
|
return setYaw(target, heading);
|
|
}
|
|
|
|
|
|
/*****************************************************************
|
|
* @brief parses a string in the format "<key1>=<val1>,<key2>=<val2>,..."
|
|
* NOTE: only use this function for STRING->INT key pair mappings
|
|
*
|
|
* @param string keyPairList
|
|
* @param string delim
|
|
*
|
|
* @return dictionary; null on error
|
|
*****************************************************************/
|
|
dictionary parseKeyPairList(string keyPairList, char delim)
|
|
{
|
|
if ( keyPairList.equals("") )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
dictionary d = new dictionary();
|
|
|
|
string[] pairs = split(keyPairList, delim);
|
|
if ( (pairs == null) || (pairs.length == 0) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
for ( int i = 0; i < pairs.length; i++ )
|
|
{
|
|
string[] tmp = split(pairs[i], '=');
|
|
if ( (tmp != null) && (tmp.length == 2) )
|
|
{
|
|
int val = stringToInt(tmp[1]);
|
|
if ( val != -1 )
|
|
{
|
|
d.put(tmp[0],val);
|
|
}
|
|
}
|
|
}
|
|
|
|
return d;
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief overload for parseKeyPairList(string, char)
|
|
*
|
|
* @param string keyPairList
|
|
*
|
|
* @return dictionary; null on error
|
|
*****************************************************************/
|
|
dictionary parseKeyPairList(string keyPairList)
|
|
{
|
|
return parseKeyPairList(keyPairList, ',');
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief attempts to put an item into a player's inventory
|
|
*
|
|
* @param obj_id player
|
|
* @param obj_id item
|
|
*
|
|
* @return boolean; false on error
|
|
*****************************************************************/
|
|
boolean putInPlayerInventory(obj_id player, obj_id item)
|
|
{
|
|
if ( (!isIdValid(player)) || (!isPlayer(player)) || (item == null) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
obj_id inventory = getObjectInSlot(player, SLOT_INVENTORY);
|
|
if ( inventory == null )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return putIn(item, inventory);
|
|
}
|
|
|
|
|
|
/*****************************************************************
|
|
* @brief attempts to put an item into a player's inventory
|
|
*
|
|
* @param obj_id player
|
|
* @param obj_id item
|
|
*
|
|
* @return boolean; false on error
|
|
*****************************************************************/
|
|
boolean putInPlayerDatapad(obj_id player, obj_id item)
|
|
{
|
|
if ( (!isIdValid(player)) || (!isPlayer(player)) || (item == null) )
|
|
{
|
|
//debugSpeakMsg(player, "putInPlayerDatapad: invalid args");
|
|
return false;
|
|
}
|
|
|
|
obj_id datapad = getObjectInSlot(player, SLOT_DATAPAD);
|
|
if ( datapad == null )
|
|
{
|
|
//debugSpeakMsg(player, "putInPlayerDatapad: unable to determine player's datapad");
|
|
return false;
|
|
}
|
|
|
|
return putIn(item, datapad);
|
|
}
|
|
|
|
|
|
/*****************************************************************
|
|
* @brief attempts to retrieve the obj_id of a mob's inventory container
|
|
*
|
|
* @param obj_id target
|
|
*
|
|
* @return obj_id; null on error
|
|
*****************************************************************/
|
|
obj_id getInventoryContainer(obj_id target)
|
|
{
|
|
if(!isIdValid(target))
|
|
{
|
|
return null;
|
|
}
|
|
|
|
return getObjectInSlot(target, SLOT_INVENTORY);
|
|
}
|
|
|
|
obj_id getDroidInventoryContainer(obj_id droid)
|
|
{
|
|
if(!isIdValid(droid))
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if(callable.hasCallableCD(droid))
|
|
{
|
|
return getObjectInSlot(callable.getCallableCD(droid), SLOT_INVENTORY);
|
|
}
|
|
else
|
|
{
|
|
return null;
|
|
}
|
|
|
|
}
|
|
|
|
// GETS PLAYER MISSION BAG
|
|
obj_id getMissionBag(obj_id objPlayer)
|
|
{
|
|
if(!isIdValid(objPlayer))
|
|
{
|
|
return null;
|
|
}
|
|
|
|
return getObjectInSlot(objPlayer, SLOT_MISSION_BAG);
|
|
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief attempts to retrieve the obj_id of a player's datapad
|
|
*
|
|
* @param obj_id target
|
|
*
|
|
* @return obj_id; null on error
|
|
*****************************************************************/
|
|
obj_id getDatapad(obj_id target)
|
|
{
|
|
if(!isIdValid(target))
|
|
{
|
|
return null;
|
|
}
|
|
|
|
return getObjectInSlot(target, SLOT_DATAPAD);
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief attempts to retrieve the obj_id of a player's datapad
|
|
*
|
|
* @param obj_id target
|
|
*
|
|
* @return obj_id; null on error
|
|
*****************************************************************/
|
|
obj_id getPlayerDatapad(obj_id player)
|
|
{
|
|
if(!isIdValid(player) || !isPlayer(player))
|
|
{
|
|
return null;
|
|
}
|
|
|
|
return getObjectInSlot(player, SLOT_DATAPAD);
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief attempts to retrieve the obj_id of a player's hangar
|
|
*
|
|
* @param obj_id target
|
|
*
|
|
* @return obj_id; null on error
|
|
*****************************************************************/
|
|
obj_id getPlayerHangar(obj_id player)
|
|
{
|
|
if(!isIdValid(player) || !isPlayer(player))
|
|
{
|
|
return null;
|
|
}
|
|
|
|
return getObjectInSlot(player, SLOT_HANGAR);
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief attempts to retrieve the obj_id of a player's datapad
|
|
*
|
|
* @param obj_id target
|
|
*
|
|
* @return obj_id; null on error
|
|
*****************************************************************/
|
|
obj_id getPlayerBank(obj_id player)
|
|
{
|
|
if(!isIdValid(player) || !isPlayer(player))
|
|
{
|
|
return null;
|
|
}
|
|
|
|
return getObjectInSlot(player, SLOT_BANK);
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief wrapper for messaging that an object or item is not active
|
|
*
|
|
* @param obj_id target
|
|
*
|
|
* @return obj_id; null on error
|
|
*****************************************************************/
|
|
boolean itemNotActive(obj_id player)
|
|
{
|
|
if ( (!isIdValid(player)) || (!isPlayer(player)) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
sendSystemMessage(player, SID_OBJECT_NOT_ACTIVE);
|
|
return true;
|
|
}
|
|
|
|
|
|
/*****************************************************************
|
|
* @brief wrapper for enqueueing a request to open a container
|
|
*
|
|
* @param obj_id target
|
|
*
|
|
* @return obj_id; null on error
|
|
*****************************************************************/
|
|
boolean requestContainerOpen(obj_id player, obj_id container)
|
|
{
|
|
if ( (!isIdValid(player)) || (!isPlayer(player)) || (!isIdValid(container)) || (getContainerType(container) == 0) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
queueCommand(player, ##"openContainer", container, "", COMMAND_PRIORITY_DEFAULT);
|
|
return true;
|
|
}
|
|
|
|
// packs a string id into a format usable by the sui system
|
|
string packStringId(string_id strId)
|
|
{
|
|
if(strId==null)
|
|
{
|
|
|
|
return null;
|
|
}
|
|
|
|
if ( !strId.isValid() )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
string strPackedId = "@"+strId.getTable()+":"+strId.getAsciiId();
|
|
return strPackedId;
|
|
|
|
}
|
|
string_id unpackString(string strId)
|
|
{
|
|
if ( strId == null || strId.equals("") )
|
|
return null;
|
|
|
|
if ( strId.startsWith("@") )
|
|
strId = strId.substring(1);
|
|
|
|
string[] s = split(strId, ':');
|
|
if ( s != null && s.length == 2 )
|
|
{
|
|
return new string_id(s[0], s[1]);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------
|
|
|
|
obj_id getNearbyPlayerByName(obj_id actor, string name)
|
|
{
|
|
java.util.StringTokenizer st = new java.util.StringTokenizer(name);
|
|
if (st.hasMoreTokens())
|
|
{
|
|
string compareName = toLower(st.nextToken());
|
|
|
|
obj_id[] players = getPlayerCreaturesInRange(actor, 128.0f);
|
|
if (players != null)
|
|
{
|
|
for (int i = 0; i < players.length; ++i)
|
|
{
|
|
java.util.StringTokenizer st2 = new java.util.StringTokenizer(getName(players[i]));
|
|
string playerName = toLower(st2.nextToken());
|
|
if (compareName == playerName)
|
|
return players[i];
|
|
}
|
|
}
|
|
}
|
|
return obj_id.NULL_ID;
|
|
}
|
|
|
|
void sendPostureChange(obj_id objCreature, int intPosture) // USE THIS TO CHANGE POSTURE AND SEND DOWN THE ANIMATION MESSAGE TO THE CLIENT.
|
|
{
|
|
attacker_results cbtAttackerResults = new attacker_results();
|
|
|
|
setPosture(objCreature, intPosture);
|
|
string strPlayback = "change_posture";
|
|
cbtAttackerResults.id = objCreature;
|
|
cbtAttackerResults.endPosture = intPosture;
|
|
cbtAttackerResults.weapon = null;
|
|
doCombatResults(strPlayback, cbtAttackerResults, null);
|
|
return;
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief gets all objects with non-null getCellNames() returns
|
|
*
|
|
* @param obj_id[] items
|
|
*
|
|
* @return obj_id[]; null on error
|
|
*****************************************************************/
|
|
obj_id[] getBuildingsInObjIdList(obj_id[] items)
|
|
{
|
|
if ( (items == null) || (items.length == 0) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
resizeable obj_id[] buildings = new obj_id[0];
|
|
|
|
for ( int i = 0; i < items.length; i++ )
|
|
{
|
|
if ( getCellNames(items[i]) == null )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
buildings = addElement(buildings, items[i]);
|
|
}
|
|
}
|
|
|
|
if ( (buildings == null) || (buildings.length == 0) )
|
|
{
|
|
return null;
|
|
}
|
|
else
|
|
{
|
|
return buildings;
|
|
}
|
|
}
|
|
/*****************************************************************
|
|
* @brief gets all objects with non-null getCellNames() returns
|
|
*
|
|
* @param obj_id[] items
|
|
*
|
|
* @return obj_id[]; null on error
|
|
*****************************************************************/
|
|
obj_id[] getContainedGOTObjects(obj_id container, int got, boolean recurse, boolean allowDerived)
|
|
{
|
|
if ( !isIdValid(container) || (got < 0) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( getContainerType(container) == 0 ) //container type == CT_none
|
|
{
|
|
//not a container!
|
|
return null;
|
|
}
|
|
|
|
obj_id[] contents = getContents(container, recurse);
|
|
if ( (contents == null) || (contents.length == 0) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
resizeable obj_id[] ret = new obj_id[0];
|
|
for ( int i = 0; i < contents.length; i++ )
|
|
{
|
|
int myType = getGameObjectType(contents[i]);
|
|
if ( !allowDerived )
|
|
{
|
|
if ( myType == got )
|
|
{
|
|
ret = addElement(ret, contents[i]);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( isGameObjectTypeOf(myType, got) )
|
|
{
|
|
ret = addElement(ret, contents[i]);
|
|
}
|
|
}
|
|
}
|
|
if ( (ret == null) || (ret.length == 0) )
|
|
return null;
|
|
return ret;
|
|
}
|
|
|
|
obj_id[] getContainedGOTObjects(obj_id container, int got, boolean recurse)
|
|
{
|
|
return getContainedGOTObjects(container, got, recurse, false);
|
|
}
|
|
|
|
obj_id[] getContainedGOTObjects(obj_id container, int got)
|
|
{
|
|
return getContainedGOTObjects(container, got, false);
|
|
}
|
|
|
|
obj_id[] getContainedObjectsWithObjVar(obj_id container, string var, boolean recurse)
|
|
{
|
|
if(!isIdValid(container))
|
|
return null;
|
|
|
|
if(getContainerType(container) == 0)
|
|
return null;
|
|
|
|
if(var == null || var.equals(""))
|
|
return null;
|
|
|
|
obj_id[] contents = getContents(container, recurse);
|
|
if(contents == null || contents.length == 0)
|
|
return null;
|
|
|
|
resizeable obj_id[] ret = new obj_id[0];
|
|
for(int i = 0; i < contents.length; i++)
|
|
{
|
|
if(hasObjVar(contents[i], var))
|
|
ret = addElement(ret, contents[i]);
|
|
}
|
|
|
|
if((ret == null) || (ret.length == 0))
|
|
return null;
|
|
|
|
return ret;
|
|
}
|
|
|
|
obj_id[] getContainedObjectsWithObjVar(obj_id container, string var)
|
|
{
|
|
return getContainedObjectsWithObjVar(container, var, false);
|
|
}
|
|
|
|
obj_id[] getContainedObjectsWithScript(obj_id container, string script, boolean recurse)
|
|
{
|
|
if(!isIdValid(container))
|
|
return null;
|
|
|
|
if(getContainerType(container) == 0)
|
|
return null;
|
|
|
|
if(script == null || script.equals(""))
|
|
return null;
|
|
|
|
obj_id[] contents = getContents(container, recurse);
|
|
if(contents == null || contents.length == 0)
|
|
return null;
|
|
|
|
resizeable obj_id[] ret = new obj_id[0];
|
|
for(int i = 0; i < contents.length; i++)
|
|
{
|
|
if(hasScript(contents[i], script))
|
|
ret = addElement(ret, contents[i]);
|
|
}
|
|
|
|
if((ret == null) || (ret.length == 0))
|
|
return null;
|
|
|
|
return ret;
|
|
}
|
|
|
|
obj_id[] getContainedObjectsWithScript(obj_id container, string script)
|
|
{
|
|
return getContainedObjectsWithScript(container, script, false);
|
|
}
|
|
|
|
/*************************************************************************************
|
|
* @brief Wrapper for sending Persistent chat messages (Emails)
|
|
*
|
|
* @params string_id subject = The title of your email, saved in
|
|
* a stringfile, just like in a conversation.
|
|
*
|
|
* string_id body = The actual message of your email, same as above
|
|
*
|
|
* string to = The person receiving the mail. Find this by using
|
|
* getFirstName (Obj_Id) of the person you want to send the mail to.
|
|
* Just use the first name, they're unique.
|
|
*
|
|
* string from = Just a string. Can be anything, Its just who the mail
|
|
* is from (Bib Fortuna, Jabba, Darth Vader, Joe the Butcher, etc.)
|
|
*
|
|
* @return void
|
|
*
|
|
* @Author Tbailey (1/13/03) W/Help from J.Watson and M.Siverston
|
|
************************************************************************************/
|
|
|
|
void sendMail (string_id subject, string_id body, string to, string from)
|
|
{
|
|
string body_oob = chatMakePersistentMessageOutOfBandBody(null, body);
|
|
string subject_str = "@" + subject.toString ();
|
|
|
|
chatSendPersistentMessage( from, to, subject_str, null, body_oob );
|
|
|
|
return;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------
|
|
|
|
void sendMail( string_id subject, string_id body, obj_id to, string from )
|
|
{
|
|
string body_oob = chatMakePersistentMessageOutOfBandBody(null, body);
|
|
string subject_str = "@" + subject.toString ();
|
|
|
|
chatSendPersistentMessage( from, to, subject_str, null, body_oob );
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------
|
|
|
|
void sendMail( string_id subject, prose_package body, obj_id to, string from )
|
|
{
|
|
string body_oob = chatMakePersistentMessageOutOfBandBody(null, body);
|
|
string subject_str = "@" + subject.toString ();
|
|
|
|
chatSendPersistentMessage( from, to, subject_str, null, body_oob );
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------
|
|
|
|
void sendMail( string_id subject, prose_package body, string to, string from )
|
|
{
|
|
string body_oob = chatMakePersistentMessageOutOfBandBody(null, body);
|
|
string subject_str = "@" + subject.toString ();
|
|
|
|
chatSendPersistentMessage( from, to, subject_str, null, body_oob );
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------
|
|
|
|
boolean isNightTime()
|
|
{
|
|
if (getLocalTime () < getLocalDayLength ())
|
|
{
|
|
//-- it's day time
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
return true;
|
|
//-- it's night time
|
|
}
|
|
}
|
|
|
|
//--------------------------group system message function---------------------------
|
|
void sendSystemMessageTestingOnly(obj_id[] players, string message)
|
|
{
|
|
if (players == null || players.length == 0)
|
|
return;
|
|
|
|
for (int i=0;i< players.length; i++)
|
|
{
|
|
if (isIdValid(players[i]) && exists(players[i]))
|
|
{
|
|
sendSystemMessageTestingOnly(players[i], message);
|
|
}
|
|
}
|
|
}
|
|
|
|
void sendSystemMessage(obj_id[] players, string_id message)
|
|
{
|
|
if (players == null || players.length == 0)
|
|
return;
|
|
|
|
for (int i=0;i< players.length; i++)
|
|
{
|
|
if (isIdValid(players[i]) && exists(players[i]))
|
|
{
|
|
sendSystemMessage(players[i], message);
|
|
}
|
|
}
|
|
}
|
|
|
|
void sendSystemMessageProse(obj_id[] players, prose_package message)
|
|
{
|
|
if (players == null || players.length == 0)
|
|
return;
|
|
|
|
for (int i=0;i< players.length; i++)
|
|
{
|
|
if (isIdValid(players[i]) && exists(players[i]))
|
|
{
|
|
sendSystemMessageProse(players[i], message);
|
|
}
|
|
}
|
|
}
|
|
|
|
void sendSystemMessagePob(obj_id pob, string_id message)
|
|
{
|
|
obj_id[] players = trial.getPlayersInDungeon(pob);
|
|
if (players != null && players.length > 0)
|
|
utils.sendSystemMessage(players, message);
|
|
}
|
|
|
|
void sendSystemMessageProsePob(obj_id pob, prose_package message)
|
|
{
|
|
obj_id[] players = trial.getPlayersInDungeon(pob);
|
|
if (players != null && players.length > 0)
|
|
utils.sendSystemMessageProse(players, message);
|
|
}
|
|
|
|
/**
|
|
* Wraps a string_id into a prose package and send the message in the space taunt window
|
|
*
|
|
* obj_id source The NPC sending the message
|
|
* obj_id player The player to message
|
|
* string_id message The string to wrap
|
|
* string templateOverride A template to use instead of the source
|
|
*
|
|
* return void
|
|
**/
|
|
void messagePlayer(obj_id source, obj_id player, string_id message, string templateOverride)
|
|
{
|
|
prose_package pp = new prose_package();
|
|
pp.stringId = message;
|
|
|
|
if (templateOverride.equals("none"))
|
|
commPlayer(source, player, pp);
|
|
else
|
|
commPlayer(source, player, pp, templateOverride);
|
|
}
|
|
|
|
void messagePlayer(obj_id source, obj_id player, string_id message)
|
|
{
|
|
messagePlayer(source, player, message, "none");
|
|
}
|
|
|
|
void messagePlayer(obj_id source, obj_id[] players, string_id message, string templateOverride)
|
|
{
|
|
prose_package pp = new prose_package();
|
|
pp.stringId = message;
|
|
|
|
if (templateOverride.equals("none"))
|
|
commPlayers(source, players, pp);
|
|
else
|
|
commPlayers(source, players, pp, templateOverride);
|
|
}
|
|
|
|
void messagePlayer(obj_id source, obj_id[] players, string_id message, string templateOverride, float duration)
|
|
{
|
|
prose_package pp = new prose_package();
|
|
pp.stringId = message;
|
|
|
|
if(templateOverride.equals("none"))
|
|
{
|
|
commPlayers(source, players, pp);
|
|
return;
|
|
}
|
|
|
|
if(duration <= 0.0f)
|
|
{
|
|
commPlayers(source, players, pp, templateOverride);
|
|
}
|
|
else
|
|
{
|
|
commPlayers(source, templateOverride, null, duration, players, pp);
|
|
}
|
|
}
|
|
|
|
void messagePlayer(obj_id source, obj_id[] players, string_id message)
|
|
{
|
|
messagePlayer(source, players, message, "none");
|
|
}
|
|
|
|
// OBJECT DICTIONARY FUNCTIONS
|
|
// These mirror LocalVars, but are not proxied. they are fast, but completely local, and wont work multiserver
|
|
boolean setLocalVar(obj_id target, string path, Vector val)
|
|
{
|
|
// this function sucks
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
if ( val == null || val.isEmpty() )
|
|
return false;
|
|
// get a sample value from the vector so we can find out what type of data we've got
|
|
Object sample = val.get(0);
|
|
if ( sample == null )
|
|
return false;
|
|
|
|
// call a type-specific setLocalVar
|
|
boolean result = false;
|
|
if ( sample instanceof Integer )
|
|
{
|
|
int count = val.size();
|
|
int[] tempVal = new int[count];
|
|
for ( int i = 0; i < count; ++i )
|
|
tempVal[i] = ((Integer)val.get(i)).intValue();
|
|
result = setLocalVar(target, path, tempVal);
|
|
}
|
|
else if ( sample instanceof Boolean )
|
|
{
|
|
int count = val.size();
|
|
boolean[] tempVal = new boolean[count];
|
|
for ( int i = 0; i < count; ++i )
|
|
tempVal[i] = ((Boolean)val.get(i)).booleanValue();
|
|
result = setLocalVar(target, path, tempVal);
|
|
}
|
|
else if ( sample instanceof Float )
|
|
{
|
|
int count = val.size();
|
|
float[] tempVal = new float[count];
|
|
for ( int i = 0; i < count; ++i )
|
|
tempVal[i] = ((Float)val.get(i)).intValue();
|
|
result = setLocalVar(target, path, tempVal);
|
|
}
|
|
else if ( sample instanceof string )
|
|
{
|
|
string[] tempVal = new string[val.size()];
|
|
tempVal = (string[])val.toArray(tempVal);
|
|
result = setLocalVar(target, path, tempVal);
|
|
}
|
|
else if ( sample instanceof obj_id )
|
|
{
|
|
obj_id[] tempVal = new obj_id[val.size()];
|
|
tempVal = (obj_id[])val.toArray(tempVal);
|
|
result = setLocalVar(target, path, tempVal);
|
|
}
|
|
else if ( sample instanceof location )
|
|
{
|
|
location[] tempVal = new location[val.size()];
|
|
tempVal = (location[])val.toArray(tempVal);
|
|
result = setLocalVar(target, path, tempVal);
|
|
}
|
|
else if ( sample instanceof transform )
|
|
{
|
|
transform[] tempVal = new transform[val.size()];
|
|
tempVal = (transform[])val.toArray(tempVal);
|
|
result = setLocalVar(target, path, tempVal);
|
|
}
|
|
else if ( sample instanceof vector)
|
|
{
|
|
vector[] tempVal = new vector[val.size()];
|
|
tempVal = (vector[])val.toArray(tempVal);
|
|
result = setLocalVar(target, path, tempVal);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
boolean setLocalVar(obj_id target, string path, location val)
|
|
{
|
|
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
dictionary dd = target.getScriptDictionary();
|
|
dd.put(path, val );
|
|
return true;
|
|
//return setLocalVar(target, path, new Integer(val));
|
|
}
|
|
boolean setLocalVar(obj_id target, string path, location[] val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
dictionary dd = target.getScriptDictionary();
|
|
dd.put(path, val );
|
|
return true;
|
|
//return setLocalVar(target, path, new Integer(val));
|
|
}
|
|
|
|
boolean setLocalVar(obj_id target, string path, string val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
dictionary dd = target.getScriptDictionary();
|
|
dd.put(path, val );
|
|
return true;
|
|
//return setLocalVar(target, path, new Integer(val));
|
|
}
|
|
boolean setLocalVar(obj_id target, string path, string[] val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
dictionary dd = target.getScriptDictionary();
|
|
dd.put(path, val );
|
|
return true;
|
|
//return setLocalVar(target, path, new Integer(val));
|
|
}
|
|
|
|
boolean setLocalVar(obj_id target, string path, obj_id val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
dictionary dd = target.getScriptDictionary();
|
|
dd.put(path, val );
|
|
return true;
|
|
//return setLocalVar(target, path, new Integer(val));
|
|
}
|
|
boolean setLocalVar(obj_id target, string path, obj_id[] val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
dictionary dd = target.getScriptDictionary();
|
|
dd.put(path, val );
|
|
return true;
|
|
//return setLocalVar(target, path, new Integer(val));
|
|
}
|
|
|
|
boolean setLocalVar(obj_id target, string path, int val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
dictionary dd = target.getScriptDictionary();
|
|
dd.put(path, val );
|
|
return true;
|
|
//return setLocalVar(target, path, new Integer(val));
|
|
}
|
|
boolean setLocalVar(obj_id target, string path, int[] val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
dictionary dd = target.getScriptDictionary();
|
|
dd.put(path, val );
|
|
return true;
|
|
//return setLocalVar(target, path, new Integer(val));
|
|
}
|
|
|
|
boolean setLocalVar(obj_id target, string path, float val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
dictionary dd = target.getScriptDictionary();
|
|
dd.put(path, val );
|
|
return true;
|
|
//return setLocalVar(target, path, new Float(val));
|
|
}
|
|
boolean setLocalVar(obj_id target, string path, float[] val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
dictionary dd = target.getScriptDictionary();
|
|
dd.put(path, val );
|
|
return true;
|
|
//return setLocalVar(target, path, new Float(val));
|
|
}
|
|
|
|
boolean setLocalVar(obj_id target, string path, boolean val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
dictionary dd = target.getScriptDictionary();
|
|
dd.put(path, val );
|
|
return true;
|
|
// return setLocalVar(target, path, new Boolean(val));
|
|
}
|
|
boolean setLocalVar(obj_id target, string path, transform val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
dictionary dd = target.getScriptDictionary();
|
|
dd.put(path, val );
|
|
return true;
|
|
}
|
|
|
|
boolean setLocalVar(obj_id target, string path, transform[] val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
dictionary dd = target.getScriptDictionary();
|
|
dd.put(path, val );
|
|
return true;
|
|
}
|
|
|
|
boolean setLocalVar(obj_id target, string path, vector val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
dictionary dd = target.getScriptDictionary();
|
|
dd.put(path, val );
|
|
return true;
|
|
}
|
|
|
|
boolean setLocalVar(obj_id target, string path, vector[] val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
dictionary dd = target.getScriptDictionary();
|
|
dd.put(path, val );
|
|
return true;
|
|
}
|
|
|
|
boolean setLocalVar(obj_id target, string path, boolean[] val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
dictionary dd = target.getScriptDictionary();
|
|
dd.put(path, val );
|
|
return true;
|
|
// return setLocalVar(target, path, new Boolean(val));
|
|
}
|
|
|
|
boolean setLocalVar(obj_id target, string path, dictionary val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
dictionary dd = target.getScriptDictionary();
|
|
dd.put(path, val);
|
|
return true;
|
|
}
|
|
|
|
boolean hasLocalVar(obj_id target, string path)
|
|
{
|
|
dictionary dd = target.getScriptDictionary();
|
|
return dd.containsKey(path);
|
|
}
|
|
|
|
boolean removeLocalVar(obj_id target, string path)
|
|
{
|
|
if ( (target == null) || (target == obj_id.NULL_ID) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if ( (path == null) || (path.equals("")) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
dictionary dd = target.getScriptDictionary();
|
|
dd.remove(path);
|
|
|
|
return true;
|
|
}
|
|
|
|
int getIntLocalVar(obj_id target, string path)
|
|
{
|
|
dictionary dd = target.getScriptDictionary();
|
|
return dd.getInt(path);
|
|
}
|
|
|
|
int[] getIntArrayLocalVar(obj_id target, string path)
|
|
{
|
|
dictionary dd = target.getScriptDictionary();
|
|
return dd.getIntArray(path);
|
|
}
|
|
|
|
float getFloatLocalVar(obj_id target, string path)
|
|
{
|
|
dictionary dd = target.getScriptDictionary();
|
|
return dd.getFloat(path);
|
|
}
|
|
|
|
float[] getFloatArrayLocalVar(obj_id target, string path)
|
|
{
|
|
dictionary dd = target.getScriptDictionary();
|
|
return dd.getFloatArray(path);
|
|
}
|
|
|
|
string getStringLocalVar(obj_id target, string path)
|
|
{
|
|
dictionary dd = target.getScriptDictionary();
|
|
return dd.getString(path);
|
|
}
|
|
|
|
string[] getStringArrayLocalVar(obj_id target, string path)
|
|
{
|
|
dictionary dd = target.getScriptDictionary();
|
|
return dd.getStringArray(path);
|
|
}
|
|
|
|
transform[] getTransformArrayLocalVar(obj_id target, string path)
|
|
{
|
|
dictionary dd = target.getScriptDictionary();
|
|
return dd.getTransformArray(path);
|
|
}
|
|
|
|
boolean getBooleanLocalVar(obj_id target, string path)
|
|
{
|
|
dictionary dd = target.getScriptDictionary();
|
|
return dd.getBoolean(path);
|
|
}
|
|
|
|
boolean[] getBooleanArrayLocalVar(obj_id target, string path)
|
|
{
|
|
dictionary dd = target.getScriptDictionary();
|
|
return dd.getBooleanArray(path);
|
|
}
|
|
|
|
location getLocationLocalVar(obj_id target, string path)
|
|
{
|
|
dictionary dd = target.getScriptDictionary();
|
|
return dd.getLocation(path);
|
|
}
|
|
|
|
location[] getLocationArrayLocalVar(obj_id target, string path)
|
|
{
|
|
dictionary dd = target.getScriptDictionary();
|
|
return dd.getLocationArray(path);
|
|
}
|
|
|
|
obj_id getObjIdLocalVar(obj_id target, string path)
|
|
{
|
|
dictionary dd = target.getScriptDictionary();
|
|
return dd.getObjId(path);
|
|
}
|
|
|
|
obj_id[] getObjIdArrayLocalVar(obj_id target, string path)
|
|
{
|
|
dictionary dd = target.getScriptDictionary();
|
|
return dd.getObjIdArray(path);
|
|
}
|
|
|
|
Vector getResizeableObjIdArrayLocalVar(obj_id target, string path)
|
|
{
|
|
dictionary dd = target.getScriptDictionary();
|
|
obj_id[] objArray = dd.getObjIdArray(path);
|
|
return new Vector(Arrays.asList(objArray));
|
|
}
|
|
|
|
Vector getResizeableLocationArrayLocalVar(obj_id target, string path)
|
|
{
|
|
dictionary dd = target.getScriptDictionary();
|
|
location[] locArray = dd.getLocationArray(path);
|
|
return new Vector(Arrays.asList(locArray));
|
|
}
|
|
|
|
|
|
Vector getResizeableIntArrayLocalVar(obj_id target, string path)
|
|
{
|
|
dictionary dd = target.getScriptDictionary();
|
|
int[] intArray = dd.getIntArray(path);
|
|
Vector rszArray = new Vector(intArray.length + 1);
|
|
for ( int i = 0; i < intArray.length; ++i )
|
|
rszArray.add(new Integer(intArray[i]));
|
|
return rszArray;
|
|
}
|
|
|
|
Vector getResizeableFloatArrayLocalVar(obj_id target, string path)
|
|
{
|
|
dictionary dd = target.getScriptDictionary();
|
|
float[] fltArray= dd.getFloatArray(path);
|
|
Vector rszArray = new Vector(fltArray.length + 10);
|
|
for ( int i = 0; i < fltArray.length; ++i )
|
|
rszArray.add(new Float(fltArray[i]));
|
|
return rszArray;
|
|
}
|
|
|
|
Vector getResizeableStringArrayLocalVar(obj_id target, string path)
|
|
{
|
|
dictionary dd = target.getScriptDictionary();
|
|
string[] strArray = dd.getStringArray(path);
|
|
return new Vector(Arrays.asList((String[])strArray));
|
|
}
|
|
|
|
Vector getResizeableTransformArrayLocalVar(obj_id target, string path)
|
|
{
|
|
dictionary dd = target.getScriptDictionary();
|
|
transform[] trArray= dd.getTransformArray(path);
|
|
Vector v1 = new Vector( Arrays.asList(trArray));
|
|
|
|
return v1;
|
|
}
|
|
|
|
Vector getResizeableVectorArrayLocalVar(obj_id target, string path)
|
|
{
|
|
dictionary dd = target.getScriptDictionary();
|
|
vector[] vctArray = dd.getVectorArray(path);
|
|
Vector v1 = new Vector( Arrays.asList(vctArray));
|
|
return v1;
|
|
}
|
|
|
|
string_id getStringIdLocalVar(obj_id target, string path)
|
|
{
|
|
dictionary dd = target.getScriptDictionary();
|
|
return dd.getStringId(path);
|
|
}
|
|
|
|
string_id[] getStringIdArrayLocalVar(obj_id target, string path)
|
|
{
|
|
dictionary dd = target.getScriptDictionary();
|
|
return dd.getStringIdArray(path);
|
|
}
|
|
|
|
dictionary getDictionaryLocalVar(obj_id target, string path)
|
|
{
|
|
dictionary dd = target.getScriptDictionary();
|
|
return dd.getDictionary(path);
|
|
}
|
|
|
|
// END LOCALVARS
|
|
|
|
/*****************************************************************
|
|
* @brief sets a scriptvar on a player
|
|
*
|
|
* @param obj_id target
|
|
* @param string path
|
|
* @param Object val
|
|
*
|
|
* @return boolean; false on error
|
|
*****************************************************************/
|
|
/*boolean setScriptVar(obj_id target, string path, Object val)
|
|
{
|
|
debugServerConsoleMsg(target, "utils:setScriptVar: entered...");
|
|
if ( (target == null) || (target == obj_id.NULL_ID) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if ( (path == null) || (path.equals("")) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
debugServerConsoleMsg(target, "utils:setScriptVar: retrieving scriptvars...");
|
|
|
|
deltadictionary dd = target.getScriptVars();
|
|
|
|
debugServerConsoleMsg(target, "utils:setScriptVar: attempting to set scriptvar " + path + " to " + val.toString());
|
|
dd.put(path, val);
|
|
|
|
return true;
|
|
}*/
|
|
|
|
boolean setScriptVar(obj_id target, string path, location val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
deltadictionary dd = target.getScriptVars();
|
|
dd.put(path, val );
|
|
return true;
|
|
}
|
|
|
|
boolean setScriptVar(obj_id target, string path, location[] val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
deltadictionary dd = target.getScriptVars();
|
|
dd.put(path, val );
|
|
return true;
|
|
}
|
|
|
|
boolean setScriptVar(obj_id target, string path, string val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
deltadictionary dd = target.getScriptVars();
|
|
dd.put(path, val );
|
|
return true;
|
|
}
|
|
|
|
boolean setScriptVar(obj_id target, string path, string[] val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
deltadictionary dd = target.getScriptVars();
|
|
dd.put(path, val );
|
|
return true;
|
|
}
|
|
|
|
boolean setScriptVar(obj_id target, string path, string[][] val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
deltadictionary dd = target.getScriptVars();
|
|
dd.put(path, val);
|
|
return true;
|
|
}
|
|
|
|
boolean setScriptVar(obj_id target, string path, obj_id val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
deltadictionary dd = target.getScriptVars();
|
|
dd.put(path, val );
|
|
return true;
|
|
}
|
|
|
|
boolean setScriptVar(obj_id target, string path, obj_id[] val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
deltadictionary dd = target.getScriptVars();
|
|
dd.put(path, val );
|
|
return true;
|
|
}
|
|
|
|
boolean setScriptVar(obj_id target, string path, int val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
deltadictionary dd = target.getScriptVars();
|
|
dd.put(path, val );
|
|
return true;
|
|
}
|
|
|
|
boolean setScriptVar(obj_id target, string path, int[] val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
deltadictionary dd = target.getScriptVars();
|
|
dd.put(path, val );
|
|
return true;
|
|
}
|
|
|
|
boolean setScriptVar(obj_id target, string path, long val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
deltadictionary dd = target.getScriptVars();
|
|
dd.put(path, val );
|
|
return true;
|
|
}
|
|
|
|
boolean setScriptVar(obj_id target, string path, long[] val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
deltadictionary dd = target.getScriptVars();
|
|
dd.put(path, val );
|
|
return true;
|
|
}
|
|
|
|
boolean setScriptVar(obj_id target, string path, double val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
deltadictionary dd = target.getScriptVars();
|
|
dd.put(path, val );
|
|
return true;
|
|
}
|
|
|
|
boolean setScriptVar(obj_id target, string path, double[] val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
deltadictionary dd = target.getScriptVars();
|
|
dd.put(path, val );
|
|
return true;
|
|
}
|
|
|
|
boolean setScriptVar(obj_id target, string path, float val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
deltadictionary dd = target.getScriptVars();
|
|
dd.put(path, val );
|
|
return true;
|
|
}
|
|
|
|
boolean setScriptVar(obj_id target, string path, float[] val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
deltadictionary dd = target.getScriptVars();
|
|
dd.put(path, val );
|
|
return true;
|
|
}
|
|
|
|
boolean setScriptVar(obj_id target, string path, boolean val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
deltadictionary dd = target.getScriptVars();
|
|
dd.put(path, val );
|
|
return true;
|
|
}
|
|
|
|
boolean setScriptVar(obj_id target, string path, transform val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
deltadictionary dd = target.getScriptVars();
|
|
dd.put(path, val );
|
|
return true;
|
|
}
|
|
|
|
boolean setScriptVar(obj_id target, string path, transform[] val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
deltadictionary dd = target.getScriptVars();
|
|
dd.put(path, val );
|
|
return true;
|
|
}
|
|
|
|
boolean setScriptVar(obj_id target, string path, vector val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
deltadictionary dd = target.getScriptVars();
|
|
dd.put(path, val );
|
|
return true;
|
|
}
|
|
|
|
boolean setScriptVar(obj_id target, string path, vector[] val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
deltadictionary dd = target.getScriptVars();
|
|
dd.put(path, val );
|
|
return true;
|
|
}
|
|
|
|
boolean setScriptVar(obj_id target, string path, boolean[] val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
deltadictionary dd = target.getScriptVars();
|
|
dd.put(path, val );
|
|
return true;
|
|
}
|
|
|
|
boolean setScriptVar(obj_id target, string path, Vector val)
|
|
{
|
|
// this function sucks
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
if ( val == null || val.isEmpty() )
|
|
return false;
|
|
// get a sample value from the vector so we can find out what type of data we've got
|
|
Object sample = val.get(0);
|
|
if ( sample == null )
|
|
return false;
|
|
|
|
// call a type-specific setScriptVar
|
|
boolean result = false;
|
|
if ( sample instanceof Integer )
|
|
{
|
|
int count = val.size();
|
|
int[] tempVal = new int[count];
|
|
for ( int i = 0; i < count; ++i )
|
|
tempVal[i] = ((Integer)val.get(i)).intValue();
|
|
result = setScriptVar(target, path, tempVal);
|
|
}
|
|
else if ( sample instanceof Boolean )
|
|
{
|
|
int count = val.size();
|
|
boolean[] tempVal = new boolean[count];
|
|
for ( int i = 0; i < count; ++i )
|
|
tempVal[i] = ((Boolean)val.get(i)).booleanValue();
|
|
result = setScriptVar(target, path, tempVal);
|
|
}
|
|
else if ( sample instanceof Float )
|
|
{
|
|
int count = val.size();
|
|
float[] tempVal = new float[count];
|
|
for ( int i = 0; i < count; ++i )
|
|
tempVal[i] = ((Float)val.get(i)).intValue();
|
|
result = setScriptVar(target, path, tempVal);
|
|
}
|
|
else if ( sample instanceof string )
|
|
{
|
|
string[] tempVal = new string[val.size()];
|
|
tempVal = (string[])val.toArray(tempVal);
|
|
result = setScriptVar(target, path, tempVal);
|
|
}
|
|
else if ( sample instanceof obj_id )
|
|
{
|
|
obj_id[] tempVal = new obj_id[val.size()];
|
|
tempVal = (obj_id[])val.toArray(tempVal);
|
|
result = setScriptVar(target, path, tempVal);
|
|
}
|
|
else if ( sample instanceof location )
|
|
{
|
|
location[] tempVal = new location[val.size()];
|
|
tempVal = (location[])val.toArray(tempVal);
|
|
result = setScriptVar(target, path, tempVal);
|
|
}
|
|
else if ( sample instanceof transform )
|
|
{
|
|
transform[] tempVal = new transform[val.size()];
|
|
tempVal = (transform[])val.toArray(tempVal);
|
|
result = setScriptVar(target, path, tempVal);
|
|
}
|
|
else if ( sample instanceof vector)
|
|
{
|
|
vector[] tempVal = new vector[val.size()];
|
|
tempVal = (vector[])val.toArray(tempVal);
|
|
result = setScriptVar(target, path, tempVal);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
boolean setScriptVar(obj_id target, string path, dictionary val)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return false;
|
|
if ( (path == null) || (path.equals("")) )
|
|
return false;
|
|
|
|
deltadictionary dd = target.getScriptVars();
|
|
dd.put(path, val);
|
|
return true;
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief checks whether a scriptvar exists on the target
|
|
*
|
|
* @param obj_id target
|
|
* @param string path
|
|
*
|
|
* @return boolean; false on error
|
|
*****************************************************************/
|
|
boolean hasScriptVar(obj_id target, string path)
|
|
{
|
|
return target.hasScriptVar( path );
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief checks whether a scriptvar tree exists on the target
|
|
*
|
|
* @param obj_id target
|
|
* @param string path
|
|
*
|
|
* @return boolean; false on error
|
|
*****************************************************************/
|
|
boolean hasScriptVarTree(obj_id target, string path)
|
|
{
|
|
if ( (target == null) || (target == obj_id.NULL_ID) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if ( (path == null) || (path.equals("")) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
deltadictionary dd = target.getScriptVars();
|
|
Enumeration keys = dd.keys();
|
|
while ( keys.hasMoreElements() )
|
|
{
|
|
string key = (string)(keys.nextElement());
|
|
if ( key.equals(path) || key.startsWith(path + ".") )
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief removes a scriptvar from a player
|
|
*
|
|
* @param obj_id target
|
|
* @param string path
|
|
*
|
|
* @return boolean; false on error
|
|
*****************************************************************/
|
|
boolean removeScriptVar(obj_id target, string path)
|
|
{
|
|
if ( (target == null) || (target == obj_id.NULL_ID) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if ( (path == null) || (path.equals("")) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
deltadictionary dd = target.getScriptVars();
|
|
dd.remove(path);
|
|
|
|
return true;
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief removes a scriptvar from a player
|
|
*
|
|
* @param obj_id target
|
|
* @param string path
|
|
*
|
|
* @return boolean; false on error
|
|
*****************************************************************/
|
|
boolean removeScriptVarTree(obj_id target, string path)
|
|
{
|
|
if ( (target == null) || (target == obj_id.NULL_ID) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if ( (path == null) || (path.equals("")) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
deltadictionary dd = target.getScriptVars();
|
|
Enumeration keys = dd.keys();
|
|
while ( keys.hasMoreElements() )
|
|
{
|
|
string key = (string)(keys.nextElement());
|
|
if ( key.equals(path) || key.startsWith(path + ".") )
|
|
dd.remove(key);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief gets a scriptvar from a player
|
|
*
|
|
* @param obj_id target
|
|
* @param string path
|
|
*
|
|
* @return boolean; false on error
|
|
*****************************************************************/
|
|
int getIntScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getInt(path);
|
|
}
|
|
|
|
int[] getIntArrayScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getIntArray(path);
|
|
}
|
|
|
|
float getFloatScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getFloat(path);
|
|
}
|
|
|
|
float[] getFloatArrayScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getFloatArray(path);
|
|
}
|
|
|
|
long getLongScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getLong(path);
|
|
}
|
|
|
|
long[] getLongArrayScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getLongArray(path);
|
|
}
|
|
|
|
double getDoubleScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getDouble(path);
|
|
}
|
|
|
|
double[] getDoubleArrayScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getDoubleArray(path);
|
|
}
|
|
|
|
string getStringScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getString(path);
|
|
}
|
|
|
|
string[] getStringArrayScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getStringArray(path);
|
|
}
|
|
|
|
string[][] getStringArrayArrayScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getStringArrayArray(path);
|
|
}
|
|
|
|
transform[] getTransformArrayScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getTransformArray(path);
|
|
}
|
|
|
|
transform getTransformScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getTransform(path);
|
|
}
|
|
boolean getBooleanScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getBoolean(path);
|
|
}
|
|
|
|
boolean[] getBooleanArrayScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getBooleanArray(path);
|
|
}
|
|
|
|
location getLocationScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getLocation(path);
|
|
}
|
|
|
|
location[] getLocationArrayScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getLocationArray(path);
|
|
}
|
|
|
|
obj_id getObjIdScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getObjId(path);
|
|
}
|
|
|
|
obj_id[] getObjIdArrayScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getObjIdArray(path);
|
|
}
|
|
|
|
Vector getResizeableObjIdArrayScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getResizeableObjIdArray(path);
|
|
}
|
|
|
|
Vector getResizeableLocationArrayScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getResizeableLocationArray(path);
|
|
}
|
|
|
|
Vector getResizeableIntArrayScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getResizeableIntArray(path);
|
|
}
|
|
|
|
Vector getResizeableFloatArrayScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getResizeableFloatArray(path);
|
|
}
|
|
|
|
Vector getResizeableStringArrayScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getResizeableStringArray(path);
|
|
}
|
|
|
|
Vector getResizeableTransformArrayScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getResizeableTransformArray(path);
|
|
}
|
|
|
|
Vector getResizeableVectorArrayScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getResizeableVectorArray(path);
|
|
}
|
|
|
|
string_id getStringIdScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getStringId(path);
|
|
}
|
|
|
|
string_id[] getStringIdArrayScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getStringIdArray(path);
|
|
}
|
|
|
|
dictionary getDictionaryScriptVar(obj_id target, string path)
|
|
{
|
|
deltadictionary dd = target.getScriptVars();
|
|
return dd.getDictionary(path);
|
|
}
|
|
|
|
/*****************************************************************
|
|
* @brief empties a container of all objects
|
|
*
|
|
* @param obj_id target
|
|
*
|
|
* @return boolean; false on error
|
|
*****************************************************************/
|
|
boolean emptyContainer(obj_id target)
|
|
{
|
|
if ( (target == null) || (target == obj_id.NULL_ID) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
obj_id[] contents = getContents(target);
|
|
if ( (contents == null) || (contents.length == 0) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
for ( int i = 0; i < contents.length; i++ )
|
|
{
|
|
destroyObject(contents[i]);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
boolean emptyContainerExceptStorytellerLoot(obj_id target)
|
|
{
|
|
if ( (target == null) || (target == obj_id.NULL_ID) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
obj_id[] contents = getContents(target);
|
|
if ( (contents == null) || (contents.length == 0) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
for ( int i = 0; i < contents.length; i++ )
|
|
{
|
|
obj_id contentsItem = contents[i];
|
|
if ( !utils.hasScriptVar(contentsItem, "storytellerLoot") )
|
|
{
|
|
destroyObject(contentsItem);
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
3 arguments, middle angle, 1/2 size of arc (left/right size), and distance out from the start location
|
|
*/
|
|
location getLocationInArc(obj_id objPlayer, float fltStartAngle, float fltArcSize, float fltDistance)
|
|
{
|
|
|
|
location locHeading = getHeading(objPlayer);
|
|
location locCenter = getLocation(objPlayer);
|
|
|
|
locHeading.x = locHeading.x * fltDistance;
|
|
locHeading.z = locHeading.z * fltDistance; // pushed out along the correct scale since it's 0 based
|
|
|
|
locHeading.y = locCenter.y;
|
|
locHeading.cell = locCenter.cell;
|
|
locHeading.area = locCenter.area;
|
|
|
|
|
|
float fltAngle = rand(fltStartAngle - fltArcSize, fltStartAngle + fltArcSize);
|
|
//LOG("spawn_player", "locHEading is "+locHeading);
|
|
|
|
location locNewHeading = rotatePointXZ(locHeading, fltAngle);
|
|
|
|
locNewHeading.x = locCenter.x + locNewHeading.x;
|
|
locNewHeading.z = locCenter.z + locNewHeading.z;
|
|
|
|
return locNewHeading;
|
|
|
|
}
|
|
|
|
|
|
float getHeadingDegrees(obj_id objTarget) // gets heading in degrees.. duh
|
|
{
|
|
location locStart = getLocation(objTarget);
|
|
location locHeading = getHeading(objTarget);
|
|
locHeading.x = locStart.x + locHeading.x;
|
|
locHeading.z = locStart.z + locHeading.z;
|
|
locHeading.y = locStart.y + locHeading.y;
|
|
|
|
float fltAngle = thetaDegrees(locStart, locHeading);
|
|
return fltAngle;
|
|
|
|
}
|
|
|
|
float thetaDegrees (location direction)
|
|
{
|
|
return (float) Math.toDegrees (Math.atan2 (direction.x, direction.z));
|
|
}
|
|
|
|
float thetaDegrees (location start, location end)
|
|
{
|
|
location direction = new location ();
|
|
direction.x = end.x - start.x;
|
|
direction.y = end.y - start.y;
|
|
direction.z = end.z - start.z;
|
|
|
|
return thetaDegrees (direction);
|
|
}
|
|
|
|
int countSubStringObjVars(obj_id[] objObjects, string strObjVar, string strSubString)
|
|
{ // this looks for all of our objects it checks a speciufic objvar vfor a specific substring and returns the count
|
|
if(objObjects==null)
|
|
{
|
|
|
|
return 0; // NONE!
|
|
}
|
|
int intCount = 0;
|
|
for(int intI = 0; intI<objObjects.length; intI++)
|
|
{
|
|
string strString = getStringObjVar(objObjects[intI], strObjVar);
|
|
if(strString!=null)
|
|
{
|
|
int intIndex = strString.indexOf(strSubString);
|
|
if(intIndex>-1)
|
|
{
|
|
intCount = intCount +1; // we found one
|
|
}
|
|
}
|
|
}
|
|
return intCount;
|
|
}
|
|
|
|
dictionary addObjVarToDictionary(obj_var ov, dictionary d, string basePath)
|
|
{
|
|
if ( ov == null || d == null )
|
|
{
|
|
return d;
|
|
}
|
|
|
|
if ( basePath == null )
|
|
{
|
|
basePath = "";
|
|
}
|
|
|
|
Object dta = ov.getData();
|
|
if ( dta == null )
|
|
{
|
|
return d;
|
|
}
|
|
|
|
string name = ov.getName();
|
|
string path = basePath + name;
|
|
|
|
if ( dta instanceof int )
|
|
{
|
|
int iVal = ov.getIntData();
|
|
int iCur = d.getInt(path);
|
|
|
|
iVal += iCur;
|
|
|
|
d.put(path, iVal);
|
|
}
|
|
else if ( dta instanceof float )
|
|
{
|
|
float fVal = ov.getFloatData();
|
|
float fCur = d.getFloat(path);
|
|
|
|
fVal += fCur;
|
|
|
|
d.put(path, fVal);
|
|
}
|
|
else if ( dta instanceof int[] )
|
|
{
|
|
int[] iaVal = ov.getIntArrayData();
|
|
int[] iaCur = d.getIntArray(path);
|
|
if ( (iaCur == null) || (iaCur.length == 0) )
|
|
{
|
|
d.put(path, iaVal);
|
|
}
|
|
else
|
|
{
|
|
if ( iaVal.length == iaCur.length )
|
|
{
|
|
for ( int z = 0; z < iaVal.length; z++ )
|
|
{
|
|
iaVal[z] += iaCur[z];
|
|
}
|
|
|
|
d.put(path, iaVal);
|
|
}
|
|
}
|
|
}
|
|
else if ( dta instanceof float[] )
|
|
{
|
|
float[] faVal = ov.getFloatArrayData();
|
|
float[] faCur = d.getFloatArray(path);
|
|
if ( (faCur == null) || (faCur.length == 0) )
|
|
{
|
|
d.put(path, faVal);
|
|
}
|
|
else
|
|
{
|
|
if ( faVal.length == faCur.length )
|
|
{
|
|
for ( int z = 0; z < faVal.length; z++ )
|
|
{
|
|
faVal[z] += faCur[z];
|
|
}
|
|
|
|
d.put(path, faVal);
|
|
}
|
|
}
|
|
}
|
|
|
|
return d;
|
|
}
|
|
|
|
dictionary addObjVarToDictionary(obj_var ov, dictionary d)
|
|
{
|
|
return addObjVarToDictionary(ov, d, null);
|
|
}
|
|
|
|
dictionary addObjVarListToDictionary(obj_var_list ovl, dictionary d, string basePath)
|
|
{
|
|
if ( ovl == null || d == null )
|
|
{
|
|
return d;
|
|
}
|
|
|
|
if ( basePath == null )
|
|
{
|
|
basePath = "";
|
|
}
|
|
|
|
string name = ovl.getName();
|
|
string path = basePath + name;
|
|
|
|
boolean litmus = true;
|
|
|
|
int numItems = ovl.getNumItems();
|
|
for ( int i = 0; i < numItems; i++ )
|
|
{
|
|
obj_var ov = ovl.getObjVar(i);
|
|
if ( ov != null )
|
|
{
|
|
if ( ov instanceof obj_var_list )
|
|
{
|
|
d = addObjVarListToDictionary((obj_var_list)(ov), d, path + ".");
|
|
}
|
|
else
|
|
{
|
|
d = addObjVarToDictionary(ov, d, path + ".");
|
|
}
|
|
}
|
|
}
|
|
|
|
return d;
|
|
}
|
|
|
|
dictionary addObjVarListToDictionary(obj_var_list ovl, dictionary d)
|
|
{
|
|
return addObjVarListToDictionary(ovl, d, null);
|
|
}
|
|
|
|
obj_id cloneObject(obj_id template, obj_id container)
|
|
{
|
|
string templateName = getTemplateName(template);
|
|
obj_id clone = createObject(templateName, container, "");
|
|
if(!isIdValid(clone))
|
|
{
|
|
return null;
|
|
}
|
|
|
|
copyObjectData(template, clone);
|
|
return clone;
|
|
}
|
|
|
|
obj_id cloneObject(obj_id template, location loc)
|
|
{
|
|
string templateName = getTemplateName(template);
|
|
obj_id clone = createObject(templateName, loc);
|
|
if(!isIdValid(clone))
|
|
{
|
|
return null;
|
|
}
|
|
|
|
copyObjectData(template, clone);
|
|
return clone;
|
|
}
|
|
|
|
void copyObjectData(obj_id template, obj_id clone)
|
|
{
|
|
/* this block of code seems to cause an exception
|
|
string[] scripts = getScriptList(template);
|
|
for(int i = 0; i < scripts.length; i++)
|
|
{
|
|
if(!hasScript(clone, scripts[i]))
|
|
{
|
|
attachScript(clone, scripts[i]);
|
|
}
|
|
}
|
|
*/
|
|
|
|
obj_var_list ovl = getObjVarList(clone, "");
|
|
|
|
if(ovl == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
int numItems = ovl.getNumItems();
|
|
for(int x = 0; x < numItems; x++)
|
|
{
|
|
obj_var ov = ovl.getObjVar(x);
|
|
if(ov != null)
|
|
{
|
|
copyObjVar(template, clone, ov.getName());
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
boolean copyObjVar(obj_id target, string basePath, obj_var ov)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if ( basePath == null )
|
|
{
|
|
basePath = "";
|
|
}
|
|
|
|
if ( ov == null )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
string name = ov.getName();
|
|
string path = basePath + name;
|
|
|
|
Object dta = ov.getData();
|
|
if ( dta instanceof int )
|
|
{
|
|
int val = ov.getIntData();
|
|
return setObjVar(target, path, val);
|
|
}
|
|
else if ( dta instanceof int[] )
|
|
{
|
|
int[] val = ov.getIntArrayData();
|
|
return setObjVar(target, path, val);
|
|
}
|
|
else if ( dta instanceof float )
|
|
{
|
|
float val = ov.getFloatData();
|
|
return setObjVar(target, path, val);
|
|
}
|
|
else if ( dta instanceof float[] )
|
|
{
|
|
float[] val = ov.getFloatArrayData();
|
|
return setObjVar(target, path, val);
|
|
}
|
|
else if ( dta instanceof Boolean )
|
|
{
|
|
boolean val = ov.getBooleanData();
|
|
return setObjVar(target, path, val);
|
|
}
|
|
else if ( dta instanceof Boolean[] )
|
|
{
|
|
boolean[] val = ov.getBooleanArrayData();
|
|
return setObjVar(target, path, val);
|
|
}
|
|
else if ( dta instanceof string )
|
|
{
|
|
string val = ov.getStringData();
|
|
return setObjVar(target, path, val);
|
|
}
|
|
else if ( dta instanceof string[] )
|
|
{
|
|
string[] val = ov.getStringArrayData();
|
|
return setObjVar(target, path, val);
|
|
}
|
|
else if ( dta instanceof obj_id )
|
|
{
|
|
obj_id val = ov.getObjIdData();
|
|
return setObjVar(target, path, val);
|
|
}
|
|
else if ( dta instanceof obj_id[] )
|
|
{
|
|
obj_id[] val = ov.getObjIdArrayData();
|
|
return setObjVar(target, path, val);
|
|
}
|
|
else if ( dta instanceof location )
|
|
{
|
|
location val = ov.getLocationData();
|
|
return setObjVar(target, path, val);
|
|
}
|
|
else if ( dta instanceof location[] )
|
|
{
|
|
location[] val = ov.getLocationArrayData();
|
|
return setObjVar(target, path, val);
|
|
}
|
|
else if ( dta instanceof string_id )
|
|
{
|
|
string_id val = ov.getStringIdData();
|
|
return setObjVar(target, path, val);
|
|
}
|
|
else if ( dta instanceof string_id[] )
|
|
{
|
|
string_id[] val = ov.getStringIdArrayData();
|
|
return setObjVar(target, path, val);
|
|
}
|
|
else if ( dta instanceof attrib_mod )
|
|
{
|
|
attrib_mod val = ov.getAttribModData();
|
|
return setObjVar(target, path, val);
|
|
}
|
|
else if ( dta instanceof attrib_mod[] )
|
|
{
|
|
attrib_mod[] val = ov.getAttribModArrayData();
|
|
return setObjVar(target, path, val);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
boolean[] removeObjVarList(obj_id object, string[] objVarList)
|
|
{
|
|
boolean[] result = new boolean[objVarList.length];
|
|
|
|
for (int i=0;i<objVarList.length;i++)
|
|
{
|
|
if (!hasObjVar(object, objVarList[i]))
|
|
{
|
|
result[i] = false;
|
|
}
|
|
else
|
|
{
|
|
removeObjVar(object, objVarList[i]);
|
|
result[i] = true;
|
|
}
|
|
}
|
|
|
|
if (result == null || result.length == 0)
|
|
result[0] = false;
|
|
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Saves the data in a dictionary as objvars on an object.
|
|
* !!! ONLY SUPPORTS INT, FLOAT, AND SUB-DICTIONARY DATA !!!
|
|
*
|
|
* @param object the object to write the objvars to
|
|
* @param rootName the objvar root name for the dictionary; null or empty string will place the dictionary data at the root level
|
|
* @param dict the dictionary data to write
|
|
*
|
|
* @return true on success, false if there was an error
|
|
*/
|
|
boolean saveDictionaryAsObjVar(obj_id object, string rootName, dictionary dict)
|
|
{
|
|
if ( !isIdValid(object) || dict == null )
|
|
return false;
|
|
|
|
// make sure the root name is valid
|
|
if ( rootName == null )
|
|
rootName = "";
|
|
else if ( rootName != null && rootName.length() > 0 )
|
|
{
|
|
if ( !Character.isLetterOrDigit(rootName.charAt(0)) )
|
|
return false;
|
|
if ( rootName.charAt(rootName.length() - 1) != '.' )
|
|
rootName = rootName + ".";
|
|
}
|
|
|
|
Enumeration keys = dict.keys();
|
|
while ( keys.hasMoreElements() )
|
|
{
|
|
string key = null;
|
|
try
|
|
{
|
|
key = (string)keys.nextElement();
|
|
}
|
|
catch ( ClassCastException err )
|
|
{
|
|
return false;
|
|
}
|
|
Object data = dict.get(key);
|
|
if ( data instanceof Integer )
|
|
{
|
|
//debugServerConsoleMsg(null, "\tsaveDictionaryAsObjVar -> "+rootName+key+" (Integer) = "+ data.toString());
|
|
setObjVar(object, rootName + key, ((Integer)data).intValue());
|
|
}
|
|
else if ( data instanceof Float )
|
|
{
|
|
//debugServerConsoleMsg(null, "\tsaveDictionaryAsObjVar -> "+rootName+key+" (Float) = "+ data.toString());
|
|
setObjVar(object, rootName + key, ((Float)data).floatValue());
|
|
}
|
|
else if ( data instanceof string )
|
|
{
|
|
//debugServerConsoleMsg(null, "\tsaveDictionaryAsObjVar -> "+rootName+key+" (string) = "+ data.toString());
|
|
setObjVar(object, rootName + key, (string)data);
|
|
}
|
|
else if ( data instanceof int[] )
|
|
{
|
|
//debugServerConsoleMsg(null, "\tsaveDictionaryAsObjVar -> "+rootName+key+" (int[]) = "+ data.toString());
|
|
setObjVar(object, rootName + key, (int[])data);
|
|
}
|
|
else if ( data instanceof float[] )
|
|
{
|
|
//debugServerConsoleMsg(null, "\tsaveDictionaryAsObjVar -> "+rootName+key+" (float[]) = "+ data.toString());
|
|
setObjVar(object, rootName + key, (float[])data);
|
|
}
|
|
else if ( data instanceof dictionary )
|
|
{
|
|
//debugServerConsoleMsg(null, "\tsaveDictionaryAsObjVar -> "+rootName+key+" (dictionary) = "+ data.toString());
|
|
saveDictionaryAsObjVar(object, rootName + key, (dictionary)data);
|
|
}
|
|
else
|
|
{
|
|
//debugServerConsoleMsg(null, "\tsaveDictionaryAsObjVar -> "+rootName+key+" (unknown) = "+ data.getClass().getName());
|
|
//return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
string getFactionSubString(string strSearchString) // THIS FINDS THE SUBSTRING IN A BASE STRING AND RETURNS THE CORRECT FACTION
|
|
{
|
|
if(strSearchString==null)
|
|
{
|
|
return null;
|
|
}
|
|
string strTestString = toLower(strSearchString);
|
|
const string[] FACTION_SEARCH_STRINGS = {factions.FACTION_IMPERIAL, factions.FACTION_REBEL};
|
|
for(int intI = 0; intI<FACTION_SEARCH_STRINGS.length; intI++)
|
|
{
|
|
|
|
int intIndex = strTestString.indexOf(toLower(FACTION_SEARCH_STRINGS[intI]));
|
|
if(intIndex>-1)
|
|
{
|
|
return FACTION_SEARCH_STRINGS[intI];
|
|
}
|
|
|
|
|
|
}
|
|
return null;
|
|
}
|
|
|
|
boolean setBatchObjVar(obj_id target, string base_path, Object[] array)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if ( (base_path == null) || (base_path.equals("")) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if ( (array == null) || (array.length == 0) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if ( hasObjVar(target, base_path) )
|
|
removeObjVar(target, base_path);
|
|
|
|
int BatchSize = 10;
|
|
|
|
boolean litmus = true;
|
|
int n = 0;
|
|
Vector toSet = new Vector();
|
|
for ( int i = 0; i < array.length; i++ )
|
|
{
|
|
toSet.add(array[i]);
|
|
if ( toSet.size() >= BatchSize )
|
|
{
|
|
litmus &= setObjectArrayObjVar(target, base_path + "." + n, toSet);
|
|
toSet.clear();
|
|
n++;
|
|
}
|
|
}
|
|
|
|
litmus &= setObjectArrayObjVar(target, base_path + "." + n, toSet);
|
|
|
|
return litmus;
|
|
}
|
|
|
|
void removeBatchObjVar(obj_id target, string base_path)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( (base_path == null) || (base_path.equals("")) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( !hasObjVar(target, base_path) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (hasObjVar(target, base_path))
|
|
removeObjVar(target, base_path);
|
|
|
|
obj_var_list list = getObjVarList(target, null);
|
|
|
|
if (list == null)
|
|
return;
|
|
|
|
int listLength = list.getNumItems();
|
|
int intQ = 0;
|
|
|
|
for (int i=0;i<listLength;i++)
|
|
{
|
|
if (hasObjVar(target, base_path+"."+intQ))
|
|
{
|
|
removeObjVar(target, base_path+"."+intQ);
|
|
intQ++;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
boolean setBatchObjVar(obj_id target, string base_path, int[] array)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if ( (base_path == null) || (base_path.equals("")) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if ( (array == null) || (array.length == 0) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if ( hasObjVar(target, base_path) )
|
|
removeObjVar(target, base_path);
|
|
|
|
int BatchSize = 10;
|
|
|
|
boolean litmus = true;
|
|
int n = 0;
|
|
Vector toSet = new Vector();
|
|
for ( int i = 0; i < array.length; i++ )
|
|
{
|
|
toSet.add(new Integer(array[i]));
|
|
if ( toSet.size() >= BatchSize )
|
|
{
|
|
litmus &= setObjectArrayObjVar(target, base_path + "." + n, toSet);
|
|
toSet.clear();
|
|
n++;
|
|
}
|
|
}
|
|
|
|
litmus &= setObjectArrayObjVar(target, base_path + "." + n, toSet);
|
|
|
|
return litmus;
|
|
}
|
|
|
|
boolean setResizeableBatchObjVar(obj_id target, string base_path, Vector vector)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if ( (base_path == null) || (base_path.equals("")) )
|
|
{
|
|
//debugSpeakMsg(target, "setResizeableBatchObjVar: invalid base path!");
|
|
return false;
|
|
}
|
|
|
|
if ( (vector == null) || (vector.size() == 0) )
|
|
{
|
|
//debugSpeakMsg(target, "setResizeableBatchObjVar: invalid vector!");
|
|
return false;
|
|
}
|
|
|
|
if ( hasObjVar(target, base_path) )
|
|
removeObjVar(target, base_path);
|
|
|
|
int BatchSize = 10;
|
|
|
|
boolean litmus = true;
|
|
int n = 0;
|
|
Vector toSet = new Vector();
|
|
for ( int i = 0; i < vector.size(); i++ )
|
|
{
|
|
toSet.add(vector.get(i));
|
|
if ( toSet.size() >= BatchSize )
|
|
{
|
|
litmus &= setObjectArrayObjVar(target, base_path + "." + n, toSet);
|
|
toSet.clear();
|
|
n++;
|
|
}
|
|
}
|
|
|
|
//debugSpeakMsg(target, "attempting to set final objvar: n = " + n + " toSet.size = " + toSet.size());
|
|
litmus &= setObjectArrayObjVar(target, base_path + "." + n, toSet);
|
|
|
|
return litmus;
|
|
}
|
|
|
|
boolean setObjectArrayObjVar(obj_id target, string path, Vector vec)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if ( (path == null) || (path.equals("")) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if ( (vec == null) || (vec.size() == 0) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
int size = vec.size();
|
|
|
|
Object test = vec.elementAt(0);
|
|
|
|
if ( test instanceof string )
|
|
{
|
|
string[] tmp = new string[size];
|
|
vec.toArray(tmp);
|
|
return setObjVar(target, path, tmp);
|
|
}
|
|
else if ( test instanceof string_id )
|
|
{
|
|
string_id[] tmp = new string_id[size];
|
|
vec.toArray(tmp);
|
|
return setObjVar(target, path, tmp);
|
|
}
|
|
else if ( test instanceof obj_id )
|
|
{
|
|
obj_id[] tmp = new obj_id[size];
|
|
vec.toArray(tmp);
|
|
return setObjVar(target, path, tmp);
|
|
}
|
|
else if ( test instanceof attrib_mod )
|
|
{
|
|
attrib_mod[] tmp = new attrib_mod[size];
|
|
vec.toArray(tmp);
|
|
return setObjVar(target, path, tmp);
|
|
}
|
|
else if ( test instanceof location )
|
|
{
|
|
location[] tmp = new location[size];
|
|
vec.toArray(tmp);
|
|
return setObjVar(target, path, tmp);
|
|
}
|
|
else if ( test instanceof int )
|
|
{
|
|
int[] tmp = new int[size];
|
|
for ( int i = 0; i < vec.size(); i ++ )
|
|
tmp[i] = ((Integer)(vec.get(i))).intValue();
|
|
return setObjVar(target, path, tmp);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
string[] getStringBatchObjVar(obj_id target, string base_path)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( (base_path == null) || (base_path.equals("")) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( !hasObjVar(target, base_path) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
resizeable string[] ret = new string[0];
|
|
obj_var_list ovl = getObjVarList(target, base_path);
|
|
if ( (ovl == null) || (ovl.getNumItems() == 0) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
int numItems = ovl.getNumItems();
|
|
for ( int i = 0; i < numItems; i++ )
|
|
{
|
|
string[] tmp = getStringArrayObjVar(target, base_path + "." + i);
|
|
if ( (tmp != null) && (tmp.length > 0) )
|
|
{
|
|
ret = concatArrays(ret, tmp);
|
|
}
|
|
}
|
|
|
|
if ( (ret != null) && (ret.length > 0) )
|
|
{
|
|
return ret;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
Vector getResizeableStringBatchObjVar(obj_id target, string base_path)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( (base_path == null) || (base_path.equals("")) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( !hasObjVar(target, base_path) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
resizeable string[] ret = new string[0];
|
|
obj_var_list ovl = getObjVarList(target, base_path);
|
|
if ( (ovl == null) || (ovl.getNumItems() == 0) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
int numItems = ovl.getNumItems();
|
|
for ( int i = 0; i < numItems; i++ )
|
|
{
|
|
string[] tmp = getStringArrayObjVar(target, base_path + "." + i);
|
|
if ( (tmp != null) && (tmp.length > 0) )
|
|
{
|
|
ret = concatArrays(ret, tmp);
|
|
}
|
|
}
|
|
|
|
if ( (ret != null) && (ret.length > 0) )
|
|
{
|
|
return ret;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
string_id[] getStringIdBatchObjVar(obj_id target, string base_path)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( (base_path == null) || (base_path.equals("")) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( !hasObjVar(target, base_path) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
resizeable string_id[] ret = new string_id[0];
|
|
obj_var_list ovl = getObjVarList(target, base_path);
|
|
if ( (ovl == null) || (ovl.getNumItems() == 0) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
int numItems = ovl.getNumItems();
|
|
for ( int i = 0; i < numItems; i++ )
|
|
{
|
|
string_id[] tmp = getStringIdArrayObjVar(target, base_path + "." + i);
|
|
if ( (tmp != null) && (tmp.length > 0) )
|
|
{
|
|
ret = concatArrays(ret, tmp);
|
|
}
|
|
}
|
|
|
|
if ( (ret != null) && (ret.length > 0) )
|
|
{
|
|
return ret;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
obj_id[] getObjIdBatchObjVar(obj_id target, string base_path)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( (base_path == null) || (base_path.equals("")) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( !hasObjVar(target, base_path) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
resizeable obj_id[] ret = new obj_id[0];
|
|
obj_var_list ovl = getObjVarList(target, base_path);
|
|
if ( (ovl == null) || (ovl.getNumItems() == 0) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
int numItems = ovl.getNumItems();
|
|
for ( int i = 0; i < numItems; i++ )
|
|
{
|
|
obj_id[] tmp = getObjIdArrayObjVar(target, base_path + "." + i);
|
|
if ( (tmp != null) && (tmp.length > 0) )
|
|
{
|
|
ret = concatArrays(ret, tmp);
|
|
}
|
|
}
|
|
|
|
if ( (ret != null) && (ret.length > 0) )
|
|
{
|
|
return ret;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
Vector getResizeableObjIdBatchObjVar(obj_id target, string base_path)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( (base_path == null) || (base_path.equals("")) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( !hasObjVar(target, base_path) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
resizeable obj_id[] ret = new obj_id[0];
|
|
obj_var_list ovl = getObjVarList(target, base_path);
|
|
if ( (ovl == null) || (ovl.getNumItems() == 0) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
int numItems = ovl.getNumItems();
|
|
for ( int i = 0; i < numItems; i++ )
|
|
{
|
|
obj_id[] tmp = getObjIdArrayObjVar(target, base_path + "." + i);
|
|
if ( (tmp != null) && (tmp.length > 0) )
|
|
{
|
|
ret = concatArrays(ret, tmp);
|
|
}
|
|
}
|
|
|
|
if ( (ret != null) && (ret.length > 0) )
|
|
{
|
|
return ret;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
int[] getIntBatchObjVar(obj_id target, string base_path)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( (base_path == null) || (base_path.equals("")) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( !hasObjVar(target, base_path) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
resizeable int[] ret = new int[0];
|
|
obj_var_list ovl = getObjVarList(target, base_path);
|
|
if ( (ovl == null) || (ovl.getNumItems() == 0) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
int numItems = ovl.getNumItems();
|
|
for ( int i = 0; i < numItems; i++ )
|
|
{
|
|
int[] tmp = getIntArrayObjVar(target, base_path + "." + i);
|
|
if ( (tmp != null) && (tmp.length > 0) )
|
|
{
|
|
ret = concatArrays(ret, tmp);
|
|
}
|
|
}
|
|
|
|
if ( (ret != null) && (ret.length > 0) )
|
|
{
|
|
return ret;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
Vector getResizeableIntBatchObjVar(obj_id target, string base_path)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( (base_path == null) || (base_path.equals("")) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( !hasObjVar(target, base_path) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
resizeable int[] ret = new int[0];
|
|
obj_var_list ovl = getObjVarList(target, base_path);
|
|
if ( (ovl == null) || (ovl.getNumItems() == 0) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
int numItems = ovl.getNumItems();
|
|
for ( int i = 0; i < numItems; i++ )
|
|
{
|
|
int[] tmp = getIntArrayObjVar(target, base_path + "." + i);
|
|
if ( (tmp != null) && (tmp.length > 0) )
|
|
{
|
|
ret = concatArrays(ret, tmp);
|
|
}
|
|
}
|
|
|
|
if ( (ret != null) && (ret.length > 0) )
|
|
{
|
|
return ret;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
attrib_mod[] getAttribModBatchObjVar(obj_id target, string base_path)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( (base_path == null) || (base_path.equals("")) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( !hasObjVar(target, base_path) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
obj_var_list ovl = getObjVarList(target, base_path);
|
|
if ( (ovl == null) || (ovl.getNumItems() == 0) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
resizeable attrib_mod[] ret = new attrib_mod[0];
|
|
int numItems = ovl.getNumItems();
|
|
for ( int i = 0; i < numItems; i++ )
|
|
{
|
|
attrib_mod[] tmp = getAttribModArrayObjVar(target, base_path + "." + i);
|
|
if ( (tmp != null) && (tmp.length > 0) )
|
|
{
|
|
ret = concatArrays(ret, tmp);
|
|
}
|
|
}
|
|
|
|
if ( (ret != null) && (ret.length > 0) )
|
|
{
|
|
return ret;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
location[] getLocationBatchObjVar(obj_id target, string base_path)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( (base_path == null) || (base_path.equals("")) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( !hasObjVar(target, base_path) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
resizeable location[] ret = new location[0];
|
|
obj_var_list ovl = getObjVarList(target, base_path);
|
|
if ( (ovl == null) || (ovl.getNumItems() == 0) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
int numItems = ovl.getNumItems();
|
|
for ( int i = 0; i < numItems; i++ )
|
|
{
|
|
location[] tmp = getLocationArrayObjVar(target, base_path + "." + i);
|
|
if ( (tmp != null) && (tmp.length > 0) )
|
|
{
|
|
ret = concatArrays(ret, tmp);
|
|
}
|
|
}
|
|
|
|
if ( (ret != null) && (ret.length > 0) )
|
|
{
|
|
return ret;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
boolean hasStringBatchObjVar(obj_id target, string base_path)
|
|
{
|
|
return getStringBatchObjVar(target, base_path) != null;
|
|
}
|
|
|
|
boolean hasResizeableStringBatchObjVar(obj_id target, string base_path)
|
|
{
|
|
return getResizeableStringBatchObjVar(target, base_path) != null;
|
|
}
|
|
|
|
boolean hasStringIdBatchObjVar(obj_id target, string base_path)
|
|
{
|
|
return getStringIdBatchObjVar(target, base_path) != null;
|
|
}
|
|
|
|
boolean hasObjIdBatchObjVar(obj_id target, string base_path)
|
|
{
|
|
return getObjIdBatchObjVar(target, base_path) != null;
|
|
}
|
|
|
|
boolean hasResizeableObjIdBatchObjVar(obj_id target, string base_path)
|
|
{
|
|
return getResizeableObjIdBatchObjVar(target, base_path) != null;
|
|
}
|
|
|
|
boolean hasIntBatchObjVar(obj_id target, string base_path)
|
|
{
|
|
return getIntBatchObjVar(target, base_path) != null;
|
|
}
|
|
|
|
boolean hasResizeableIntBatchObjVar(obj_id target, string base_path)
|
|
{
|
|
return getResizeableIntBatchObjVar(target, base_path) != null;
|
|
}
|
|
|
|
boolean hasAttribModBatchObjVar(obj_id target, string base_path)
|
|
{
|
|
return getAttribModBatchObjVar(target, base_path) != null;
|
|
}
|
|
|
|
boolean hasLocationBatchObjVar(obj_id target, string base_path)
|
|
{
|
|
return getLocationBatchObjVar(target, base_path) != null;
|
|
}
|
|
|
|
|
|
boolean setBatchScriptVar(obj_id target, string base_path, Vector array)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if ( (base_path == null) || (base_path.equals("")) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if ( (array == null) || (array.size() == 0) )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
deltadictionary dd = target.getScriptVars();
|
|
|
|
int BatchSize = 10;
|
|
|
|
int n = 0;
|
|
Vector toSet = new Vector();
|
|
for ( int i = 0; i < array.size(); i++ )
|
|
{
|
|
toSet.add(array.elementAt(i));
|
|
if ( toSet.size() >= BatchSize )
|
|
{
|
|
dd.put(base_path + "." + n, toSet);
|
|
toSet.clear();
|
|
n++;
|
|
}
|
|
}
|
|
|
|
if ( toSet.size() > 0 )
|
|
{
|
|
dd.put(base_path + "." + n, toSet);
|
|
n++;
|
|
}
|
|
|
|
dd.put(base_path, n);
|
|
return true;
|
|
}
|
|
|
|
boolean setBatchScriptVar(obj_id target, string base_path, obj_id[] array)
|
|
{
|
|
if ( (array == null) || (array.length == 0) )
|
|
return false;
|
|
|
|
Vector vArray = new Vector(Arrays.asList(array));
|
|
return setBatchScriptVar(target, base_path, vArray);
|
|
}
|
|
|
|
boolean setBatchScriptVar(obj_id target, string base_path, string[] array)
|
|
{
|
|
if ( (array == null) || (array.length == 0) )
|
|
return false;
|
|
|
|
Vector vArray = new Vector(Arrays.asList(array));
|
|
return setBatchScriptVar(target, base_path, vArray);
|
|
}
|
|
|
|
boolean setBatchScriptVar(obj_id target, string base_path, string_id[] array)
|
|
{
|
|
if ( (array == null) || (array.length == 0) )
|
|
return false;
|
|
|
|
Vector vArray = new Vector(Arrays.asList(array));
|
|
return setBatchScriptVar(target, base_path, vArray);
|
|
}
|
|
|
|
boolean setBatchScriptVar(obj_id target, string base_path, location[] array)
|
|
{
|
|
if ( (array == null) || (array.length == 0) )
|
|
return false;
|
|
|
|
Vector vArray = new Vector(Arrays.asList(array));
|
|
return setBatchScriptVar(target, base_path, vArray);
|
|
}
|
|
|
|
Vector getResizeableObjIdBatchScriptVar(obj_id target, string base_path)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( (base_path == null) || (base_path.equals("")) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( !hasScriptVar(target, base_path) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
int cnt = getIntScriptVar(target, base_path);
|
|
deltadictionary dd = target.getScriptVars();
|
|
|
|
Vector ret = new Vector();
|
|
for ( int i = 0; i < cnt; i++ )
|
|
{
|
|
Vector tmp = dd.getResizeableObjIdArray(base_path + "." + i);
|
|
if ( (tmp != null) && (tmp.size() > 0) )
|
|
{
|
|
ret.addAll(tmp);
|
|
}
|
|
}
|
|
|
|
if ( (ret != null) && (ret.size() > 0) )
|
|
{
|
|
return ret;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
obj_id[] getObjIdBatchScriptVar(obj_id target, string base_path)
|
|
{
|
|
Vector ret = getResizeableObjIdBatchScriptVar(target, base_path);
|
|
if ( (ret != null) && (ret.size() > 0) )
|
|
{
|
|
return toStaticObjIdArray(ret);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
Vector getResizeableStringBatchScriptVar(obj_id target, string base_path)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( (base_path == null) || (base_path.equals("")) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( !hasScriptVar(target, base_path) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
int cnt = getIntScriptVar(target, base_path);
|
|
deltadictionary dd = target.getScriptVars();
|
|
|
|
Vector ret = new Vector();
|
|
for ( int i = 0; i < cnt; i++ )
|
|
{
|
|
Vector tmp = dd.getResizeableStringArray(base_path + "." + i);
|
|
if ( (tmp != null) && (tmp.size() > 0) )
|
|
{
|
|
ret.addAll(tmp);
|
|
}
|
|
}
|
|
|
|
if ( (ret != null) && (ret.size() > 0) )
|
|
{
|
|
return ret;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
string[] getStringBatchScriptVar(obj_id target, string base_path)
|
|
{
|
|
Vector ret = getResizeableStringBatchScriptVar(target, base_path);
|
|
if ( (ret != null) && (ret.size() > 0) )
|
|
{
|
|
return toStaticStringArray(ret);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
Vector getResizeableLocationBatchScriptVar(obj_id target, string base_path)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( (base_path == null) || (base_path.equals("")) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( !hasScriptVar(target, base_path) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
int cnt = getIntScriptVar(target, base_path);
|
|
deltadictionary dd = target.getScriptVars();
|
|
|
|
Vector ret = new Vector();
|
|
for ( int i = 0; i < cnt; i++ )
|
|
{
|
|
Vector tmp = dd.getResizeableLocationArray(base_path + "." + i);
|
|
if ( (tmp != null) && (tmp.size() > 0) )
|
|
{
|
|
ret.addAll(tmp);
|
|
}
|
|
}
|
|
|
|
if ( (ret != null) && (ret.size() > 0) )
|
|
{
|
|
return ret;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
Vector getResizeableIntBatchScriptVar(obj_id target, string base_path)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( (base_path == null) || (base_path.equals("")) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if ( !hasScriptVar(target, base_path) )
|
|
{
|
|
return null;
|
|
}
|
|
|
|
int cnt = getIntScriptVar(target, base_path);
|
|
deltadictionary dd = target.getScriptVars();
|
|
|
|
Vector ret = new Vector();
|
|
for ( int i = 0; i < cnt; i++ )
|
|
{
|
|
Vector tmp = dd.getResizeableIntArray(base_path + "." + i);
|
|
if ( (tmp != null) && (tmp.size() > 0) )
|
|
{
|
|
ret.addAll(tmp);
|
|
}
|
|
}
|
|
|
|
if ( (ret != null) && (ret.size() > 0) )
|
|
{
|
|
return ret;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
location[] getLocationBatchScriptVar(obj_id target, string base_path)
|
|
{
|
|
Vector ret = getResizeableLocationBatchScriptVar(target, base_path);
|
|
if ( (ret != null) && (ret.size() > 0) )
|
|
{
|
|
return toStaticLocationArray(ret);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
int[] getIntBatchScriptVar(obj_id target, string base_path)
|
|
{
|
|
resizeable int[] ret = getResizeableIntBatchScriptVar(target, base_path);
|
|
if ( (ret != null) && (ret.length > 0) )
|
|
{
|
|
return ret;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
void removeBatchScriptVar(obj_id target, string base_path)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( (base_path == null) || (base_path.equals("")) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( !hasScriptVar(target, base_path) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
int cnt = getIntScriptVar(target, base_path);
|
|
deltadictionary dd = target.getScriptVars();
|
|
dd.remove(base_path);
|
|
|
|
for ( int i = 0; i < cnt; i++ )
|
|
{
|
|
dd.remove(base_path + "." + i);
|
|
}
|
|
}
|
|
|
|
boolean hasResizeableObjIdBatchScriptVar(obj_id target, string base_path)
|
|
{
|
|
return getResizeableObjIdBatchScriptVar(target, base_path) != null;
|
|
}
|
|
|
|
boolean hasObjIdBatchScriptVar(obj_id target, string base_path)
|
|
{
|
|
return getObjIdBatchScriptVar(target, base_path) != null;
|
|
}
|
|
|
|
boolean hasResizeableStringBatchScriptVar(obj_id target, string base_path)
|
|
{
|
|
return getResizeableStringBatchScriptVar(target, base_path) != null;
|
|
}
|
|
|
|
boolean hasStringBatchScriptVar(obj_id target, string base_path)
|
|
{
|
|
return getStringBatchScriptVar(target, base_path) != null;
|
|
}
|
|
|
|
boolean hasResizeableLocationBatchScriptVar(obj_id target, string base_path)
|
|
{
|
|
return getResizeableLocationBatchScriptVar(target, base_path) != null;
|
|
}
|
|
|
|
boolean hasResizeableIntBatchScriptVar(obj_id target, string base_path)
|
|
{
|
|
return getResizeableIntBatchScriptVar(target, base_path) != null;
|
|
}
|
|
|
|
boolean hasLocationBatchScriptVar(obj_id target, string base_path)
|
|
{
|
|
return getLocationBatchScriptVar(target, base_path) != null;
|
|
}
|
|
|
|
boolean hasIntBatchScriptVar(obj_id target, string base_path)
|
|
{
|
|
return getIntBatchScriptVar(target, base_path) != null;
|
|
}
|
|
|
|
int getIntConfigSetting(String section, String key)
|
|
{
|
|
String setting = getConfigSetting(section, key);
|
|
if ( setting == null || setting.length() == 0 )
|
|
return 0;
|
|
|
|
try
|
|
{
|
|
return Integer.parseInt(setting);
|
|
}
|
|
catch ( NumberFormatException err)
|
|
{
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
float getFloatConfigSetting(String section, String key)
|
|
{
|
|
String setting = getConfigSetting(section, key);
|
|
if ( setting == null || setting.length() == 0 )
|
|
return 0;
|
|
|
|
try
|
|
{
|
|
return Float.parseFloat(setting);
|
|
}
|
|
catch ( NumberFormatException err)
|
|
{
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
boolean checkConfigFlag(string strSection, string strConfigSetting)
|
|
{
|
|
// looks for true/false
|
|
string strTest = getConfigSetting(strSection, strConfigSetting);
|
|
if(strTest!=null)
|
|
{
|
|
strTest = toLower(strTest);
|
|
if(strTest=="true")
|
|
{
|
|
return true;
|
|
|
|
}
|
|
if(strTest=="1")
|
|
{
|
|
return true;
|
|
|
|
}
|
|
return false;
|
|
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
|
|
}
|
|
boolean checkServerSpawnLimits()
|
|
{
|
|
const int intServerSpawnLimit = getServerSpawnLimit();
|
|
const int intNumCreatures = utils.getNumCreaturesForSpawnLimit();
|
|
const int intNumPlayers = getNumPlayers();
|
|
if(intNumPlayers>0)
|
|
{
|
|
|
|
if(intServerSpawnLimit>0)
|
|
{
|
|
|
|
if(intNumCreatures>intServerSpawnLimit)
|
|
{
|
|
return false;
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(intNumPlayers<200000) // JUSTIN CAHNGE THIS TO <20, AND THE NUMCREATURES TO WHAT YOU WANT.
|
|
{
|
|
//////LOG("spawning", "no ratio");
|
|
if(intNumCreatures>5000)
|
|
{
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
float fltRatio = (float)(intNumCreatures/intNumPlayers);
|
|
|
|
//////LOG("spawning", "fltRatio is "+fltRatio);
|
|
if(fltRatio>10) // RAIO
|
|
{
|
|
return false;
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
string formatTimeVerbose(int seconds)
|
|
{
|
|
if ( seconds < 1 )
|
|
{
|
|
return "";
|
|
}
|
|
|
|
int[] convert_time = player_structure.convertSecondsTime(seconds);
|
|
|
|
int idx = 0;
|
|
for ( int i = 0; i < convert_time.length; i++ )
|
|
{
|
|
if ( convert_time[i] > 0 )
|
|
{
|
|
idx = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( idx == convert_time.length - 1)
|
|
{
|
|
idx--;
|
|
}
|
|
|
|
string time_str = "";
|
|
string[] verboseIndex =
|
|
{
|
|
" days ",
|
|
" hours ",
|
|
" minutes ",
|
|
" seconds "
|
|
};
|
|
|
|
for ( int n = idx; n < convert_time.length; n++ )
|
|
{
|
|
|
|
time_str += convert_time[n]+verboseIndex[n];
|
|
|
|
if ( n < convert_time.length - 1 )
|
|
{
|
|
time_str += ", ";
|
|
}
|
|
}
|
|
|
|
if ( time_str != null && !time_str.equals("") )
|
|
{
|
|
return time_str;
|
|
}
|
|
|
|
return "";
|
|
}
|
|
|
|
string formatTimeVerboseNoSpaces(int seconds)
|
|
{
|
|
if ( seconds < 1 )
|
|
{
|
|
return "";
|
|
}
|
|
|
|
int[] convert_time = player_structure.convertSecondsTime(seconds);
|
|
|
|
int idx = 0;
|
|
for ( int i = 0; i < convert_time.length; i++ )
|
|
{
|
|
if ( convert_time[i] > 0 )
|
|
{
|
|
idx = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( idx == convert_time.length - 1)
|
|
{
|
|
idx--;
|
|
}
|
|
|
|
string time_str = "";
|
|
string[] verboseIndex =
|
|
{
|
|
" days",
|
|
" hours",
|
|
" minutes",
|
|
" seconds"
|
|
};
|
|
|
|
for ( int n = idx; n < convert_time.length; n++ )
|
|
{
|
|
|
|
time_str += convert_time[n]+verboseIndex[n];
|
|
|
|
if ( n < convert_time.length - 1 )
|
|
{
|
|
time_str += ", ";
|
|
}
|
|
}
|
|
|
|
if ( time_str != null && !time_str.equals("") )
|
|
{
|
|
return time_str;
|
|
}
|
|
|
|
return "";
|
|
}
|
|
|
|
string formatTime(int seconds)
|
|
{
|
|
if ( seconds < 1 )
|
|
{
|
|
return "";
|
|
}
|
|
|
|
int[] convert_time = player_structure.convertSecondsTime(seconds);
|
|
//string time_str = player_structure.assembleTimeRemaining(convert_time);
|
|
|
|
//find first non-zero index
|
|
int idx = 0;
|
|
for ( int i = 0; i < convert_time.length; i++ )
|
|
{
|
|
if ( convert_time[i] > 0 )
|
|
{
|
|
idx = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( idx == convert_time.length - 1)
|
|
{
|
|
idx--;
|
|
}
|
|
|
|
string time_str = "";
|
|
for ( int n = idx; n < convert_time.length; n++ )
|
|
{
|
|
|
|
time_str += convert_time[n];
|
|
|
|
if ( n < convert_time.length - 1 )
|
|
{
|
|
time_str += ":";
|
|
}
|
|
}
|
|
|
|
if ( time_str != null && !time_str.equals("") )
|
|
{
|
|
return time_str;
|
|
}
|
|
|
|
return "";
|
|
}
|
|
|
|
string formatTime(float fTime)
|
|
{
|
|
int iTime = (int)fTime;
|
|
|
|
float diff = fTime - iTime;
|
|
int decimals = (int)(diff*100);
|
|
|
|
if ( iTime > 0 )
|
|
{
|
|
string sTime = formatTime(iTime);
|
|
sTime += "." + decimals;
|
|
return sTime;
|
|
}
|
|
else
|
|
{
|
|
return "0." + decimals;
|
|
}
|
|
}
|
|
|
|
string padTimeDHMS(int seconds)
|
|
{
|
|
if(seconds < 0)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
int days = seconds / (3600 * 24);
|
|
|
|
string daysText = "" + days;
|
|
|
|
if(daysText.length() <= 4)
|
|
{
|
|
daysText = "0000".substring(0, 4 - daysText.length()) + daysText;
|
|
}
|
|
|
|
seconds = seconds % (3600 * 24);
|
|
|
|
int hours = seconds / 3600;
|
|
|
|
string hoursText = "" + hours;
|
|
|
|
if(hoursText.length() <= 2)
|
|
{
|
|
hoursText = "00".substring(0,2 - hoursText.length()) + hoursText;
|
|
}
|
|
|
|
seconds = seconds % 3600;
|
|
|
|
int minutes = seconds / 60;
|
|
|
|
string minutesText = "" + minutes;
|
|
|
|
if(minutesText.length() <= 2)
|
|
{
|
|
minutesText = "00".substring(0,2 - minutesText.length()) + minutesText;
|
|
}
|
|
|
|
seconds = seconds % 60;
|
|
|
|
string secondsText = "" + seconds;
|
|
|
|
if(secondsText.length() <= 2)
|
|
{
|
|
secondsText = "00".substring(0,2 - secondsText.length()) + secondsText;
|
|
}
|
|
|
|
return daysText + "d:" + hoursText + "h:" + minutesText + "m:" + secondsText + "s";
|
|
}
|
|
|
|
string padTimeHM(int seconds)
|
|
{
|
|
seconds = seconds % (3600 * 24);
|
|
|
|
int hours = seconds / 3600;
|
|
|
|
string hoursText = "" + hours;
|
|
|
|
if(hoursText.length() <= 2)
|
|
{
|
|
hoursText = "00".substring(0,2 - hoursText.length()) + hoursText;
|
|
}
|
|
|
|
seconds = seconds % 3600;
|
|
|
|
int minutes = seconds / 60;
|
|
|
|
string minutesText = "" + minutes;
|
|
|
|
if(minutesText.length() <= 2)
|
|
{
|
|
minutesText = "00".substring(0,2 - minutesText.length()) + minutesText;
|
|
}
|
|
|
|
return hoursText + "h:" + minutesText + "m";
|
|
}
|
|
|
|
void sendDelayedSystemMessage(obj_id target, string_id sid, float delay)
|
|
{
|
|
if ( !isIdValid(target) || (sid == null) || (delay < 0f) )
|
|
return;
|
|
|
|
dictionary msg = new dictionary();
|
|
msg.put("sidMsg", sid);
|
|
|
|
messageTo(target, "handleDelayedSystemMessage", msg, delay, false);
|
|
}
|
|
|
|
void sendDelayedSystemMessage(obj_id target, string sid, float delay)
|
|
{
|
|
if ( !isIdValid(target) || (sid == null) || sid.equals("") || (delay < 0f) )
|
|
return;
|
|
|
|
dictionary msg = new dictionary();
|
|
msg.put("stringMsg", sid);
|
|
|
|
messageTo(target, "handleDelayedSystemMessage", msg, delay, false);
|
|
}
|
|
|
|
void sendDelayedProseMessage(obj_id msgTarget, string_id sid,
|
|
obj_id actor, string actorString, string_id actorStringId,
|
|
obj_id target, string targetString, string_id targetStringId,
|
|
obj_id other, string otherString, string_id otherStringId,
|
|
int di, float df,
|
|
float delay)
|
|
{
|
|
if ( !isIdValid(msgTarget) || (sid == null) || (delay < 0f) )
|
|
return;
|
|
|
|
dictionary msg = new dictionary();
|
|
msg.put("sid", sid);
|
|
|
|
msg.put("actor", actor);
|
|
msg.put("actorString", actorString);
|
|
msg.put("actorStringId", actorStringId);
|
|
|
|
msg.put("target", target);
|
|
msg.put("targetString", targetString);
|
|
msg.put("targetStringId", targetStringId);
|
|
|
|
msg.put("other", other);
|
|
msg.put("otherString", otherString);
|
|
msg.put("otherStringId", otherStringId);
|
|
|
|
msg.put("di", di);
|
|
msg.put("df", df);
|
|
|
|
messageTo(msgTarget, "handleDelayedProseMessage", msg, delay, false);
|
|
}
|
|
|
|
Vector alphabetizeStringArray(string[] array)
|
|
{
|
|
if ( (array == null) || (array.length == 0) )
|
|
return null;
|
|
|
|
Vector tmp = new Vector();
|
|
java.text.Collator myCol = java.text.Collator.getInstance();
|
|
for ( int i = 0; i < array.length; i++ )
|
|
{
|
|
boolean inserted = false;
|
|
for ( int n = 0; n < tmp.size(); n++ )
|
|
{
|
|
if ( myCol.compare(array[i], tmp.elementAt(n)) < 0 ) //insert element at n
|
|
{
|
|
tmp.add(n, array[i]);
|
|
inserted = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( !inserted )
|
|
{
|
|
tmp.add(array[i]);
|
|
}
|
|
}
|
|
|
|
if ( (tmp == null) || (tmp.size() == 0) )
|
|
return null;
|
|
|
|
return tmp;
|
|
}
|
|
|
|
Vector alphabetizeStringArray(Vector array)
|
|
{
|
|
if ( (array == null) || (array.size() == 0) )
|
|
return null;
|
|
|
|
string[] toPass = toStaticStringArray(array);
|
|
if ( (toPass == null) || (toPass.length == 0) )
|
|
return null;
|
|
|
|
return alphabetizeStringArray(toPass);
|
|
}
|
|
|
|
string getPlayerSpeciesName(int species)
|
|
{
|
|
switch (species)
|
|
{
|
|
case SPECIES_HUMAN:
|
|
return "human";
|
|
|
|
case SPECIES_BOTHAN:
|
|
return "bothan";
|
|
|
|
case SPECIES_RODIAN:
|
|
return "rodian";
|
|
|
|
case SPECIES_TWILEK:
|
|
return "twilek";
|
|
|
|
case SPECIES_TRANDOSHAN:
|
|
return "trandoshan";
|
|
|
|
case SPECIES_MON_CALAMARI:
|
|
return "moncalamari";
|
|
|
|
case SPECIES_WOOKIEE:
|
|
return "wookiee";
|
|
|
|
case SPECIES_ZABRAK:
|
|
return "zabrak";
|
|
case SPECIES_ITHORIAN:
|
|
return "ithorian";
|
|
case SPECIES_SULLUSTAN:
|
|
return "sullustan";
|
|
default:
|
|
return "unknown";
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void addListener(string strObjVar, obj_id objListener, obj_id objTarget)
|
|
{
|
|
|
|
if(strObjVar==null)
|
|
{
|
|
LOG("DESIGNER_FATAL", "Null objVar paseed into addListener");
|
|
return;
|
|
|
|
}
|
|
if(!isIdValid(objTarget))
|
|
{
|
|
LOG("DESIGNER_FATAL", "Null owner paseed into addListener");
|
|
return;
|
|
}
|
|
if(!isIdValid(objListener))
|
|
{
|
|
|
|
LOG("DESIGNER_FATAL", "Null listener paseed into addListener");
|
|
}
|
|
|
|
|
|
dictionary dctParams = new dictionary();
|
|
dctParams.put("objListener", objListener);
|
|
dctParams.put("strObjVar", strObjVar);
|
|
messageTo(objTarget, "addListener", dctParams, 0, true);
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
void removeListener(string strObjVar, obj_id objListener, obj_id objTarget)
|
|
{
|
|
if(strObjVar==null)
|
|
{
|
|
LOG("DESIGNER_FATAL", "Null objVar paseed into removeListener");
|
|
return;
|
|
|
|
}
|
|
if(!isIdValid(objTarget))
|
|
{
|
|
LOG("DESIGNER_FATAL", "Null target paseed into removeListener");
|
|
return;
|
|
}
|
|
if(!isIdValid(objListener))
|
|
{
|
|
|
|
LOG("DESIGNER_FATAL", "Null listener paseed into removeListeer");
|
|
}
|
|
|
|
|
|
dictionary dctParams = new dictionary();
|
|
dctParams.put("objListener", objListener);
|
|
dctParams.put("strObjVar", strObjVar);
|
|
messageTo(objTarget, "removeListener", dctParams, 0, true);
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
void messageListeners(string strObjVar, obj_id objOwner, string strMessageName, dictionary dctParams)
|
|
{
|
|
|
|
// this messages all of the listeners with the specified message
|
|
if(strObjVar==null)
|
|
{
|
|
LOG("DESIGNER_FATAL", "Null objVar paseed into messageListeners");
|
|
return;
|
|
|
|
}
|
|
if(!isIdValid(objOwner))
|
|
{
|
|
LOG("DESIGNER_FATAL", "Null owner paseed into messageListeners");
|
|
return;
|
|
}
|
|
if(strMessageName==null)
|
|
{
|
|
LOG("DESIGNER_FATAL", "Null messageName paseed into messageListeners");
|
|
|
|
}
|
|
|
|
|
|
if(hasObjVar(objOwner, strObjVar))
|
|
{
|
|
|
|
int intI = 0;
|
|
obj_id objListeners[] = getObjIdArrayObjVar(objOwner, "mission.objListeners");
|
|
while(intI<objListeners.length)
|
|
{
|
|
//debugServerConsoleMsg(objListeners[intI], "messaging "+objListeners[intI].toString()+ "with "+strMessageName+" and params of "+dctParams.toString());
|
|
//debugServerConsoleMsg(objOwner, "intI is "+intI);
|
|
//debugServerConsoleMsg(objOwner, "length is "+objListeners.length);
|
|
messageTo(objListeners[intI], strMessageName, dctParams, 0, true);
|
|
intI = intI+1;
|
|
}
|
|
}
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
int getTheaterSize(string strLairType)
|
|
{
|
|
if(isTheater(strLairType))
|
|
{
|
|
int intIndex = strLairType.indexOf("medium");
|
|
if(intIndex>0)
|
|
{
|
|
return 40;
|
|
|
|
}
|
|
intIndex = strLairType.indexOf("small");
|
|
if(intIndex>0)
|
|
{
|
|
return 24;
|
|
|
|
}
|
|
intIndex = strLairType.indexOf("large");
|
|
if(intIndex>0)
|
|
{
|
|
return 72;
|
|
|
|
}
|
|
|
|
return 24;
|
|
}
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
boolean isTheater(string strLairType)
|
|
{
|
|
|
|
|
|
if(strLairType==null)
|
|
{
|
|
return false;
|
|
}
|
|
int intIndex = strLairType.indexOf("theater");
|
|
if(intIndex>0)
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
boolean isAppropriateName(string name)
|
|
{
|
|
if ( name == null || name.equals("") )
|
|
return false;
|
|
|
|
java.util.StringTokenizer st = new java.util.StringTokenizer(name);
|
|
while ( st.hasMoreTokens() )
|
|
{
|
|
string tkn = st.nextToken();
|
|
if ( stringToFloat(tkn) == Float.NEGATIVE_INFINITY )
|
|
{
|
|
if ( isObscene(tkn) || !isAppropriateText(tkn) )
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
boolean setNonProfaneName(obj_id target, string name)
|
|
{
|
|
if ( !isIdValid(target) || name == null || name.equals("") )
|
|
return false;
|
|
|
|
if ( !isAppropriateName(name) )
|
|
return false;
|
|
|
|
return setName(target, name);
|
|
}
|
|
|
|
boolean setNonReservedName(obj_id target, string name)
|
|
{
|
|
if ( !isIdValid(target) || name == null || name.equals("") )
|
|
return false;
|
|
|
|
if ( !isNameReserved(name) )
|
|
return setName(target, name);
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
boolean setFilteredName(obj_id target, string name)
|
|
{
|
|
if ( !isIdValid(target) || name == null || name.equals("") )
|
|
return false;
|
|
|
|
if ( !isNameReserved(name) )
|
|
return setNonProfaneName(target, name);
|
|
|
|
return false;
|
|
}
|
|
|
|
void destroyObjects(obj_id[] objects)
|
|
{
|
|
if ( objects == null || objects.length == 0 )
|
|
return;
|
|
|
|
for ( int i = 0; i < objects.length; i++ )
|
|
{
|
|
if ( isIdValid(objects[i]) )
|
|
destroyObject(objects[i]);
|
|
}
|
|
}
|
|
|
|
string getTemplateFilenameNoPath(obj_id target)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return null;
|
|
|
|
string filename = null;
|
|
string fullPath = getTemplateName(target);
|
|
if ( fullPath != null && !fullPath.equals("") )
|
|
{
|
|
string[] tmp = split(fullPath, '/');
|
|
if ( tmp != null && tmp.length > 0 )
|
|
{
|
|
filename = tmp[tmp.length - 1];
|
|
}
|
|
}
|
|
|
|
return filename;
|
|
}
|
|
|
|
int getFirstNonValidIdIndex(obj_id[] ids)
|
|
{
|
|
if ( ids == null || ids.length == 0 )
|
|
return -1;
|
|
|
|
for ( int i = 0; i < ids.length; i++ )
|
|
{
|
|
if ( !isIdValid(ids[i]) )
|
|
return i;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
int getFirstValidIdIndex(obj_id[] ids)
|
|
{
|
|
if ( ids == null || ids.length == 0 )
|
|
return -1;
|
|
|
|
for (int i = 0; i < ids.length; i++ )
|
|
{
|
|
if ( isIdValid(ids[i]) )
|
|
return i;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
void moneyInMetric (obj_id objTransferer, string strAccount, int intAmount)
|
|
{
|
|
// receiver, acct, amt
|
|
int intTime = getGameTime();
|
|
string strSpam = "moneyIn;"+intTime+";"+objTransferer+";"+strAccount+";"+intAmount;
|
|
logBalance(strSpam);
|
|
return;
|
|
}
|
|
|
|
void moneyOutMetric(obj_id objTransferer, string strAccount, int intAmount)
|
|
{
|
|
int intTime = getGameTime();
|
|
string strSpam = "moneyOut;"+intTime+";"+objTransferer+";"+strAccount+";"+intAmount;
|
|
logBalance(strSpam);
|
|
return;
|
|
}
|
|
|
|
int getValidAttributeIndex(string[] array)
|
|
{
|
|
for (int i = 0; i < array.length; i++)
|
|
{
|
|
if (array[i] == null || array[i].equals(""))
|
|
return i;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
string getStringName(obj_id target)
|
|
{
|
|
if ( !isIdValid(target) )
|
|
return null;
|
|
|
|
string name = getEncodedName(target);
|
|
string_id sid_name = unpackString(name);
|
|
if ( sid_name != null )
|
|
name = getString(sid_name);
|
|
|
|
return name;
|
|
}
|
|
|
|
void warpPlayer( obj_id player, location dest )
|
|
{
|
|
if (isIdValid(dest.cell))
|
|
warpPlayer (player, dest.area, 0.0f, 0.0f, 0.0f, dest.cell, dest.x, dest.y, dest.z);
|
|
else
|
|
warpPlayer (player, dest.area, dest.x, dest.y, dest.z, null, 0.0f, 0.0f, 0.0f);
|
|
}
|
|
|
|
void warpPlayer( obj_id player, string planet, location dest )
|
|
{
|
|
warpPlayer (player, planet, dest.x, dest.y, dest.z, null, 0.0f, 0.0f, 0.0f);
|
|
}
|
|
|
|
boolean copyObjVarList(obj_id from, obj_id to, string listpath)
|
|
{
|
|
if ( !isIdValid(from) || !isIdValid(to) || listpath == null || listpath.equals("") )
|
|
return false;
|
|
|
|
obj_var_list ovl = getObjVarList(from, listpath);
|
|
if ( ovl == null )
|
|
return false;
|
|
|
|
boolean litmus = true;
|
|
|
|
int numItems = ovl.getNumItems();
|
|
for ( int i = 0; i < numItems; i++ )
|
|
{
|
|
obj_var ov = ovl.getObjVar(i);
|
|
if ( ov != null )
|
|
litmus &= copyObjVar(from, to, listpath + "." + ov.getName());
|
|
}
|
|
|
|
return litmus;
|
|
}
|
|
|
|
|
|
string_id getCardinalDirectionForPoints(location locTest1, location locTest2)
|
|
{
|
|
string cardinalString = getStringCardinalDirection(locTest1, locTest2);
|
|
if ( cardinalString == null || cardinalString.equals("") )
|
|
return null;
|
|
|
|
return new string_id("mission/mission_generic", cardinalString);
|
|
}
|
|
|
|
string getStringCardinalDirection(location locTest1, location locTest2, boolean abbreviated)
|
|
{
|
|
if ( locTest1 == null || locTest2 == null )
|
|
return null;
|
|
|
|
float fltAngle =getHeadingToLocation(locTest1, locTest2);
|
|
|
|
// north is 0
|
|
// west is 90
|
|
// south is -180
|
|
// east is -90
|
|
// we use 1/2 of each of those..
|
|
// so we end up with 45 degree arcs for each of these
|
|
|
|
if((fltAngle>=-22.5)&&(fltAngle<=22.5))
|
|
{
|
|
if ( !abbreviated )
|
|
return "north";
|
|
else
|
|
return "N";
|
|
}
|
|
else if((fltAngle>=-67.5)&&(fltAngle<=-22.5))
|
|
{
|
|
if ( !abbreviated )
|
|
return "northeast";
|
|
else
|
|
return "NE";
|
|
}
|
|
else if ((fltAngle>=-112.5)&&(fltAngle<=-67.5))
|
|
{
|
|
if ( !abbreviated )
|
|
return "east";
|
|
else
|
|
return "E";
|
|
}
|
|
else if((fltAngle>=-157.5)&&(fltAngle<=-112.5))
|
|
{
|
|
if ( !abbreviated )
|
|
return "southeast";
|
|
else
|
|
return "SE";
|
|
}
|
|
// south is the fallback, so it's below (its -180/180 so the math is yucky
|
|
else if((fltAngle>=22.5)&&(fltAngle<=67.5))
|
|
{
|
|
if ( !abbreviated )
|
|
return "northwest";
|
|
else
|
|
return "NW";
|
|
}
|
|
else if((fltAngle>=67.5)&&(fltAngle<=112.5))
|
|
{
|
|
if ( !abbreviated )
|
|
return "west";
|
|
else
|
|
return "W";
|
|
}
|
|
else if((fltAngle>=112.5)&&(fltAngle<=157.5))
|
|
{
|
|
if ( !abbreviated )
|
|
return "southwest";
|
|
else
|
|
return "SW";
|
|
}
|
|
else
|
|
{
|
|
if ( !abbreviated )
|
|
return "south";
|
|
else
|
|
return "S";
|
|
}
|
|
}
|
|
|
|
string getStringCardinalDirection(location locTest1, location locTest2)
|
|
{
|
|
return getStringCardinalDirection(locTest1, locTest2, false);
|
|
}
|
|
|
|
boolean isContainer(obj_id target)
|
|
{
|
|
if ( isIdValid(target) )
|
|
return (getContainerType(target)!=0);
|
|
|
|
return false;
|
|
}
|
|
|
|
boolean noIncapDrainAttributes(obj_id target, int actionCost, int mindCost)
|
|
{
|
|
if ( !isIdValid(target) || actionCost < 0)
|
|
return false;
|
|
|
|
if ( getAttrib(target, ACTION) < actionCost )
|
|
{
|
|
//sendSystemMessageTestingOnly(target, "You lack the necessary ACTION to perform that action");
|
|
return false;
|
|
}
|
|
|
|
return drainAttributes(target, actionCost, 0);
|
|
}
|
|
|
|
int getUnbuffedWoundedMaxAttrib(obj_id target, int attrib)
|
|
{
|
|
if ( !isIdValid(target) || attrib < HEALTH || attrib > WILLPOWER )
|
|
return -1;
|
|
|
|
int unmodmax = getUnmodifiedMaxAttrib(target, attrib);
|
|
return unmodmax;
|
|
}
|
|
|
|
boolean validatePlayerHairStyle(obj_id player)
|
|
{
|
|
if (!isIdValid(player))
|
|
return false;
|
|
|
|
string hair_table = "datatables/customization/hair_assets_skill_mods.iff";
|
|
//LOG("LOG_CHANNEL", "num_rows ->" + dataTableGetNumRows(hair_table));
|
|
obj_id hair = getObjectInSlot(player, "hair");
|
|
//LOG("LOG_CHANNEL", "hair ->" + hair);
|
|
if (!isIdValid(hair))
|
|
return false;
|
|
|
|
string hair_template = getTemplateName(hair);
|
|
//LOG("LOG_CHANNEL", "hair_template ->" + hair_template);
|
|
int idx = dataTableSearchColumnForString(hair_template, "SERVER_TEMPLATE", hair_table);
|
|
//LOG("LOG_CHANNEL", "idx ->" + idx);
|
|
|
|
if (idx < 0)
|
|
return false;
|
|
|
|
string required_template = dataTableGetString(hair_table, idx, "SERVER_PLAYER_TEMPLATE");
|
|
//LOG("LOG_CHANNEL", "required_template ->" + required_template);
|
|
if (required_template == null)
|
|
return false;
|
|
|
|
string player_template = getTemplateName(player);
|
|
//LOG("LOG_CHANNEL", "player_template ->" + player_template);
|
|
|
|
if (player_template != required_template)
|
|
{
|
|
// If the player is not of the required template, he has an illegal hair style.
|
|
// We use the first one that we can find in the datatable.
|
|
int new_hair_idx = dataTableSearchColumnForString(player_template, "SERVER_PLAYER_TEMPLATE", hair_table);
|
|
//LOG("LOG_CHANNEL", "new_hair_idx ->" + new_hair_idx);
|
|
string new_hair_template = dataTableGetString(hair_table, new_hair_idx, "SERVER_TEMPLATE");
|
|
//LOG("LOG_CHANNEL", "new_hair_template ->" + new_hair_template);
|
|
if (new_hair_template == null)
|
|
{
|
|
CustomerServiceLog("imageDesigner", getFirstName(player) + "(" + player + ") has an invalid hairstyle, but a replacement cannot be found!");
|
|
return false;
|
|
}
|
|
|
|
destroyObject(hair);
|
|
createObject(new_hair_template, player, "hair");
|
|
CustomerServiceLog("imageDesigner", getFirstName(player) + "(" + player + ") has an invalid hairstyle. It has been replaced with a default style.");
|
|
sendSystemMessageTestingOnly(player, "An illegal hairstyle has been detected on your character. This has been corrected.");
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
string getPackedScripts(obj_id objObject)
|
|
{
|
|
string strTest = "";
|
|
string[] strScripts = getScriptList(objObject);
|
|
if(strScripts.length>0)
|
|
{
|
|
for(int intI = 0; intI<strScripts.length; intI++)
|
|
{
|
|
strTest = strTest + strScripts[intI];
|
|
if(intI<strScripts.length-1)
|
|
{
|
|
strTest = strTest + ",";
|
|
}
|
|
}
|
|
}
|
|
return strTest;
|
|
}
|
|
string[] getUsableScriptList(obj_id objObject)
|
|
{
|
|
string strTest = "";
|
|
string[] strScripts = getScriptList(objObject);
|
|
debugSpeakMsg(objObject, "script list is "+strScripts.length);
|
|
if(strScripts.length>0)
|
|
{
|
|
debugSpeakMsg(objObject, "list length is "+strScripts.length);
|
|
string[] strCorrectArray = new string[strScripts.length];
|
|
for(int intI = 0; intI<strScripts.length; intI++)
|
|
{
|
|
string script = strScripts[intI];
|
|
if ( script.indexOf( "script." ) > -1 )
|
|
{
|
|
script = script.substring( 7 );
|
|
debugSpeakMsg(objObject, "setting array to "+script);
|
|
strCorrectArray[intI] = script;
|
|
}
|
|
}
|
|
return strCorrectArray;
|
|
}
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
string[] unpackScriptString(string strScripts)
|
|
{
|
|
string[] strTest = split(strScripts, ',');
|
|
return strTest;
|
|
}
|
|
|
|
boolean isEquipped(obj_id item)
|
|
{
|
|
if ( !isIdValid(item) )
|
|
return false;
|
|
|
|
obj_id containedBy = getContainedBy(item);
|
|
return ( isIdValid(containedBy) && getContainerType(containedBy) == 1 ); //container type 1 = CT_slotted
|
|
}
|
|
|
|
obj_id unequipWeaponHand(obj_id player)
|
|
{
|
|
return unequipSlot(player, "hold_r");
|
|
}
|
|
|
|
obj_id unequipOffHand(obj_id player)
|
|
{
|
|
return unequipSlot(player, "hold_l");
|
|
}
|
|
|
|
obj_id unequipSlot(obj_id player, string slot)
|
|
{
|
|
obj_id equipment = getObjectInSlot(player, slot);
|
|
if ( isIdValid(equipment) )
|
|
{
|
|
obj_id playerInv = utils.getInventoryContainer(player);
|
|
if ( isIdValid(playerInv) )
|
|
{
|
|
putInOverloaded(equipment, playerInv);
|
|
return equipment;
|
|
}
|
|
}
|
|
return obj_id.NULL_ID;
|
|
}
|
|
|
|
|
|
|
|
obj_id[] getAttackableTargetsInRadius(obj_id attacker, int radius, boolean player_targets)
|
|
{
|
|
// Returns all mobs within a specified radius that are pvpCanAttack-true and are in the light of sight.
|
|
location loc = getLocation(attacker);
|
|
if (loc == null)
|
|
return null;
|
|
|
|
obj_id[] objects = getObjectsInRange(loc, radius);
|
|
resizeable obj_id[] attackable_targets = new obj_id[0];
|
|
for (int i = 0; i < objects.length; i++)
|
|
{
|
|
if (isMob(objects[i]))
|
|
{
|
|
if (pvpCanAttack(attacker, objects[i]))
|
|
{
|
|
if (!isIncapacitated(objects[i]) && !isDead(objects[i]))
|
|
{
|
|
if (isPlayer(objects[i]))
|
|
{
|
|
if (!player_targets)
|
|
continue;
|
|
}
|
|
|
|
if (canSee(attacker, objects[i]))
|
|
{
|
|
attackable_targets = utils.addElement(attackable_targets, objects[i]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if ( ai_lib.isTurret(objects[i]))
|
|
{
|
|
if (pvpCanAttack(attacker, objects[i]))
|
|
{
|
|
|
|
if (canSee(attacker, objects[i]))
|
|
attackable_targets = utils.addElement(attackable_targets, objects[i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (attackable_targets.length < 1)
|
|
return null;
|
|
else
|
|
return attackable_targets;
|
|
}
|
|
|
|
|
|
obj_id getTrapDroidId(obj_id player)
|
|
{
|
|
obj_id dataPad = getPlayerDatapad(player);
|
|
resizeable obj_id[] data = getResizeableContents(dataPad);
|
|
|
|
for(int i = 0; i < data.length; i++)
|
|
{
|
|
if(callable.hasCDCallable(data[i]) && hasObjVar(data[i], "module_data.trap_bonus"))
|
|
{
|
|
return data[i];
|
|
}
|
|
}
|
|
|
|
return null;
|
|
|
|
}//end getTrapDroidId
|
|
|
|
int getTimeLeft(obj_id player, string toCheckFor, int timePenalty)
|
|
{
|
|
|
|
int currentTime = getGameTime();
|
|
int timeCalled = utils.getIntScriptVar(player, toCheckFor);
|
|
if (timeCalled < 1)
|
|
return -1;
|
|
|
|
int timeDone = timeCalled + timePenalty;
|
|
int timeLeft = timeDone - currentTime;
|
|
|
|
return timeLeft;
|
|
|
|
}
|
|
|
|
int getTimeLeft(obj_id player, string toCheckFor, string modifiedTime)
|
|
{
|
|
|
|
int currentTime = getGameTime();
|
|
int timeCalled = utils.getIntScriptVar(player, toCheckFor);
|
|
if (timeCalled < 1)
|
|
return -1;
|
|
|
|
int timePenalty = utils.getIntScriptVar(player, modifiedTime);
|
|
int timeDone = timeCalled + timePenalty;
|
|
int timeLeft = timeDone - currentTime;
|
|
|
|
return timeLeft;
|
|
|
|
}
|
|
|
|
boolean isFreeTrial(obj_id player)
|
|
{
|
|
return isFreeTrialAccount(player);
|
|
}
|
|
|
|
boolean isFreeTrial(obj_id player, obj_id target)
|
|
{
|
|
return isFreeTrialAccount(player);
|
|
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//// STOLEN FROM SPACE_UTILS.SCRIPTLIB: THESE ARE NOT SAFE FOR MULTI-SERVER
|
|
//// We're going to have to remove and fix references when space is integrated to Current
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
void notifyObject(obj_id objTarget, string strNotificationName, dictionary dctParams)
|
|
{
|
|
if(!isIdValid(objTarget))
|
|
{
|
|
debugServerConsoleMsg(null, "Null object id passed into notifyObject, exceptioning");
|
|
Thread.dumpStack();
|
|
throw new InterruptedException();
|
|
}
|
|
if(strNotificationName==null)
|
|
{
|
|
debugServerConsoleMsg(null, "null notification name passed into notifyObject, exceptioning");
|
|
Thread.dumpStack();
|
|
throw new InterruptedException();
|
|
}
|
|
if(strNotificationName=="")
|
|
{
|
|
debugServerConsoleMsg(null, "Empty Notification name passed into notifyObject, exceptioning");
|
|
Thread.dumpStack();
|
|
throw new InterruptedException();
|
|
}
|
|
|
|
try
|
|
{
|
|
int intReturn = script_entry.callMessageHandlers(strNotificationName, objTarget, dctParams);
|
|
return;
|
|
}
|
|
catch (Throwable err)
|
|
{
|
|
debugServerConsoleMsg(null, "Unable to call into callMessageHandlers ");
|
|
Thread.dumpStack();
|
|
throw new InterruptedException();
|
|
}
|
|
}
|
|
|
|
void callTrigger(string strTrigger, Object[] params)
|
|
{
|
|
try
|
|
{
|
|
script_entry.runScripts(strTrigger, params);
|
|
return;
|
|
}
|
|
catch (Throwable err)
|
|
{
|
|
debugServerConsoleMsg(null, "Unable to call into callMessageHandlers ");
|
|
Thread.dumpStack();
|
|
throw new InterruptedException();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
string getCellName(obj_id building, obj_id cell) {
|
|
|
|
string[] cellNames = getCellNames(building);
|
|
|
|
for(int i = 0; i < cellNames.length; i++) {
|
|
|
|
string cellName = cellNames[i];
|
|
obj_id thisCell = getCellId(building, cellName);
|
|
|
|
if (thisCell == cell) {
|
|
|
|
return cellName;
|
|
}
|
|
}
|
|
|
|
return "";
|
|
}
|
|
|
|
string getRealPlayerFirstName(obj_id player)
|
|
{
|
|
string firstName = getPlayerName(player);
|
|
|
|
if(firstName == null)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
int idx = firstName.toLowerCase().indexOf("corpse of");
|
|
if(idx >= 0)
|
|
{
|
|
firstName = firstName.substring(idx+1);
|
|
}
|
|
|
|
// upper case the first letter in the name
|
|
if(firstName.length() > 0)
|
|
{
|
|
char first = firstName.charAt(0);
|
|
first = Character.toUpperCase(first);
|
|
firstName = first + firstName.substring(1);
|
|
}
|
|
|
|
return firstName;
|
|
}
|
|
|
|
void dismountRiderJetpackCheck (obj_id rider)
|
|
{
|
|
if(!isIdValid(rider))
|
|
{
|
|
return;
|
|
}
|
|
|
|
obj_id mount = getMountId (rider);
|
|
|
|
if(!exists(mount))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(isIdValid(mount))
|
|
{
|
|
pet_lib.doDismountNow(rider, false);
|
|
string name = getTemplateName (mount);
|
|
|
|
if(vehicle.isJetPackVehicle(mount))
|
|
{
|
|
string_id jetDismount = new string_id ("pet/pet_menu", "jetpack_dismount");
|
|
sendSystemMessage(rider, jetDismount);
|
|
|
|
obj_id petControlDevice = callable.getCallableCD(mount);
|
|
vehicle.storeVehicle(petControlDevice, rider);
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
location getLocationFromTransform(transform trTest)
|
|
{
|
|
location locTest = new location();
|
|
vector vctTest = trTest.getPosition_p();
|
|
locTest.x = vctTest.x;
|
|
locTest.y = vctTest.y;
|
|
locTest.z = vctTest.z;
|
|
return locTest;
|
|
}
|
|
|
|
int addClassRequirementAttributes(obj_id player, obj_id item, string[] names, string[] attribs, int firstFree, string prefix)
|
|
{
|
|
//sendSystemMessageTestingOnly(obj_id.getObjId(10012897), "1");
|
|
if(hasObjVar(item, prefix + "classRequired"))
|
|
{
|
|
//sendSystemMessageTestingOnly(player, "Class Requirements");
|
|
string requiredClasses = getStringObjVar(item, prefix + "classRequired");
|
|
java.util.StringTokenizer st = new java.util.StringTokenizer(requiredClasses, ",");
|
|
string requiredText = "";
|
|
boolean qualifies = false;
|
|
|
|
while(st.hasMoreTokens())
|
|
{
|
|
string classId = st.nextToken();
|
|
string tmp = "@skl_n:class_" + classId + "\0";
|
|
if(st.hasMoreTokens())
|
|
{
|
|
tmp += "\n\\>117\0";
|
|
}
|
|
|
|
requiredText += tmp;
|
|
//sendSystemMessageTestingOnly(player, "Req: " + requiredText);
|
|
if(isProfession(player, stringToInt(classId)))
|
|
{
|
|
qualifies = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(!qualifies)
|
|
{
|
|
names[firstFree] = "class_required";
|
|
attribs[firstFree++] = requiredText;
|
|
}
|
|
}
|
|
|
|
if(hasObjVar(item, prefix + "levelRequired"))
|
|
{
|
|
int minLevel = getIntObjVar(item, prefix + "levelRequired");
|
|
if(minLevel > getLevel(player))
|
|
{
|
|
names[firstFree] = "levelrequired";
|
|
attribs[firstFree++] = "" + minLevel;
|
|
}
|
|
}
|
|
|
|
return firstFree;
|
|
}
|
|
|
|
boolean testItemClassRequirements(obj_id player, string requiredClasses, boolean silent)
|
|
{
|
|
java.util.StringTokenizer st = new java.util.StringTokenizer(requiredClasses, ",");
|
|
string requiredText = "";
|
|
|
|
while(st.hasMoreTokens())
|
|
{
|
|
string classId = st.nextToken();
|
|
if(isProfession(player, stringToInt(classId)))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
if(!silent)
|
|
{
|
|
sendSystemMessage(player, new string_id("spam", "classrequired"));
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
boolean testItemClassRequirements(obj_id player, obj_id thing, boolean silent, string prefix)
|
|
{
|
|
if(!hasObjVar(thing, prefix + "classRequired"))
|
|
{
|
|
return true;
|
|
}
|
|
|
|
string requiredClasses = getStringObjVar(thing, prefix + "classRequired");
|
|
return testItemClassRequirements(player, requiredClasses, silent);
|
|
}
|
|
|
|
boolean testItemLevelRequirements(obj_id player, obj_id thing, boolean silent, string prefix)
|
|
{
|
|
if(!hasObjVar(thing, prefix + "levelRequired"))
|
|
{
|
|
return true;
|
|
}
|
|
|
|
int minLevel = getIntObjVar(thing, prefix + "levelRequired");
|
|
if(minLevel > getLevel(player))
|
|
{
|
|
if(!silent)
|
|
{
|
|
prose_package pp = prose.getPackage(new string_id("spam", "levelrequired"), "" + minLevel);
|
|
sendSystemMessageProse(player, pp);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
boolean testItemAbilityRequirements(obj_id player, obj_id thing, boolean silent, string prefix)
|
|
{
|
|
if(!hasObjVar(thing, prefix + "abilityRequired"))
|
|
{
|
|
return true;
|
|
}
|
|
|
|
string commandRequired = getStringObjVar(thing, prefix + "abilityRequired");
|
|
if(!hasCommand(player, commandRequired))
|
|
{
|
|
if(!silent)
|
|
{
|
|
prose_package pp = prose.getPackage(new string_id("spam", "abilityrequired"), "@cmd_n:" + toLower(commandRequired));
|
|
sendSystemMessageProse(player, pp);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
boolean testItemSkillRequirements(obj_id player, obj_id thing, boolean silent, string prefix)
|
|
{
|
|
if(!hasObjVar(thing, prefix + "skillRequired"))
|
|
{
|
|
return true;
|
|
}
|
|
|
|
string skillRequired = getStringObjVar(thing, prefix + "skillRequired");
|
|
if(!hasSkill(player, skillRequired))
|
|
{
|
|
if(!silent)
|
|
{
|
|
prose_package pp = prose.getPackage(new string_id("spam", "skill_required"), "@skl_n:" + toLower(skillRequired));
|
|
sendSystemMessageProse(player, pp);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void makeItemNoDrop(obj_id item)
|
|
{
|
|
attachScript(item, "item.special.nomove");
|
|
setObjVar(item, "noTrade", 1);
|
|
}
|
|
|
|
boolean isItemNoDrop(obj_id item)
|
|
{
|
|
return hasScript(item, "item.special.nomove") || hasObjVar(item, "noTrade");
|
|
}
|
|
|
|
void clearNoDropFromItem(obj_id item)
|
|
{
|
|
detachScript(item, "item.special.nomove");
|
|
removeObjVar(item, "noTrade");
|
|
}
|
|
|
|
/**
|
|
* Checks a list of objects to see if one is a notrade item. Will recusively check the contents of containers.
|
|
*
|
|
* @param items the list of items to check
|
|
* @param testPlayers flag to check the equipment/inventory of any players in the list
|
|
*
|
|
* @return the id of the 1st notrade item found, or null if there are none
|
|
*/
|
|
obj_id findNoTradeItem(obj_id[] items, boolean testPlayers)
|
|
{
|
|
return findNoTradeItem( items, testPlayers, false );
|
|
}
|
|
|
|
obj_id findNoTradeItem(obj_id[] items, boolean testPlayers, boolean novendor)
|
|
{
|
|
if ( items != null )
|
|
{
|
|
for ( int i = 0; i < items.length; ++i )
|
|
{
|
|
if ( isIdValid(items[i]) && (testPlayers || !isPlayer(items[i])) )
|
|
{
|
|
if ( novendor && hasScript( items[i], "terminal.vendor" ) )
|
|
continue;
|
|
if ( !canTrade(items[i]) )
|
|
return items[i];
|
|
else if (utils.isContainer(items[i]))
|
|
{
|
|
obj_id result = findNoTradeItem(getContents(items[i]), testPlayers);
|
|
if ( isIdValid(result) )
|
|
return result;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
obj_id findNoTradeItemNotVendor(obj_id[] items, boolean testPlayers)
|
|
{
|
|
return findNoTradeItem( items, testPlayers, true );
|
|
}
|
|
|
|
/**
|
|
* Tests to see if a player has a waypoint with a given name.
|
|
*
|
|
* @param player the player to test
|
|
* @param name the waypoint name to look for
|
|
*
|
|
* @return the wapoint with the name, or null if the player has no waypoint
|
|
*/
|
|
obj_id hasWaypoint(obj_id player, string name)
|
|
{
|
|
if ( !isIdValid(player) || name == null )
|
|
return null;
|
|
|
|
obj_id[] waypoints = getWaypointsInDatapad(player);
|
|
if ( waypoints == null )
|
|
return null;
|
|
|
|
for ( int i = 0; i < waypoints.length; ++i )
|
|
{
|
|
if ( isIdValid(waypoints[i]) )
|
|
{
|
|
string waypointName = getWaypointName(waypoints[i]);
|
|
if ( waypointName != null && waypointName == name)
|
|
{
|
|
return waypoints[i];
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Tests to see if a player has a waypoint of the given id.
|
|
*
|
|
* @param player the player to test
|
|
* @param waypoint the waypoint id to look for
|
|
*
|
|
* @return true if the waypoint is found, or false if not
|
|
*/
|
|
|
|
boolean waypointExists(obj_id player, obj_id waypoint)
|
|
{
|
|
if ( !isIdValid(player) || !isIdValid(waypoint) )
|
|
return false;
|
|
|
|
obj_id[] waypoints = getWaypointsInDatapad(player);
|
|
if ( waypoints == null || waypoints.length <= 0 )
|
|
return false;
|
|
|
|
for ( int i = 0; i < waypoints.length; ++i )
|
|
{
|
|
if ( isIdValid(waypoints[i]) )
|
|
{
|
|
if ( waypoints[i] == waypoint )
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Checks a string to see if there are any extended ascii characters in it.
|
|
*
|
|
* @param inString the incoming string to test
|
|
*
|
|
* @return true or false depending on extended ascii being found.
|
|
*/
|
|
|
|
boolean isExtendedASCII(string inString)
|
|
{
|
|
|
|
if (inString == null)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
for ( int i = 0; i < inString.length(); i++ )
|
|
{
|
|
int ASCIIValue = inString.charAt(i);
|
|
if (ASCIIValue < 0 || ASCIIValue > 255)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// checks to see if the item is antidecay.
|
|
// Items that are antidecay will not take damage due to player death or on use (if they are armor or weapons)
|
|
boolean isAntiDecay(obj_id item)
|
|
{
|
|
if( isIdValid(item) && hasObjVar(item, "antidecay") )
|
|
{
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// make an item anti-decay which causes it not to take damage when player dies or it is used (such as armor, weapons and tools)
|
|
boolean makeAntiDecay(obj_id item)
|
|
{
|
|
if( isIdValid(item) )
|
|
{
|
|
setObjVar(item, "antidecay", 1);
|
|
attachScript(item, "systems.veteran_reward.antidecay_examine");
|
|
// item has been successfully set to be antidecay
|
|
return true;
|
|
}
|
|
// add override code here to prevent specific items to not be anti decay
|
|
else
|
|
{
|
|
// item was not set to be antidecay
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// remove anti-decay from item
|
|
boolean removeAntiDecay(obj_id item)
|
|
{
|
|
if( isIdValid(item) )
|
|
{
|
|
if ( hasObjVar(item, "antidecay") )
|
|
{
|
|
removeObjVar(item, "antidecay");
|
|
}
|
|
// means item is no longer anti decay (even if it wasn't previously)
|
|
return true;
|
|
}
|
|
// add override code here to not remove anti decay
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// validates if the item can have anti decay applied to it
|
|
boolean validItemForAntiDecay(obj_id item)
|
|
{
|
|
if( isIdValid(item) )
|
|
{
|
|
// Sorry, Dave
|
|
if (jedi.isLightsaber(item))
|
|
return true;
|
|
|
|
// Don't allow PSGs to be flagged anti-decay
|
|
if (isGameObjectTypeOf(item, GOT_armor_psg))
|
|
return false;
|
|
|
|
// allow anything that is normally insured as well as weapons to be anti-decay even though weapons don't need insured
|
|
if( cloninglib.isDamagedOnCloneGOT(getGameObjectType(item)) || isGameObjectTypeOf(item, GOT_weapon) )
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
obj_id[] getLocalGroupMemberIds( obj_id group )
|
|
{
|
|
if ( !isIdValid(group) )
|
|
return null;
|
|
|
|
obj_id[] groupMemberIds = getGroupMemberIds(group);
|
|
if ( groupMemberIds == null || groupMemberIds.length == 0 )
|
|
return null;
|
|
|
|
Vector localMemberIdsVector = new Vector();
|
|
for ( int i =0; i < groupMemberIds.length; ++i )
|
|
{
|
|
if ( isIdValid(groupMemberIds[i]) && exists(groupMemberIds[i]) && isPlayer(groupMemberIds[i]) )
|
|
{
|
|
localMemberIdsVector.addElement(groupMemberIds[i]);
|
|
}
|
|
}
|
|
|
|
if ( localMemberIdsVector == null || localMemberIdsVector.size() < 1 )
|
|
return null;
|
|
|
|
return ( utils.toStaticObjIdArray(localMemberIdsVector));
|
|
}
|
|
|
|
boolean canSpeakWookiee(obj_id player, obj_id npc)
|
|
{
|
|
if(hasSkill(player, "class_smuggler_phase1_novice"))
|
|
return false;
|
|
|
|
if(hasSkill(player, "social_language_wookiee_comprehend"))
|
|
return false;
|
|
|
|
else
|
|
return true;
|
|
}
|
|
|
|
void emoteWookieeConfusion (obj_id player, obj_id npc)
|
|
{
|
|
playClientEffectObj(npc, "clienteffect/voc_wookiee_med_4sec.cef", player, "");
|
|
chat.thinkTo(player, player, new string_id("ep3/sidequests", "wke_convo_failure"));
|
|
}
|
|
|
|
|
|
void setObjVarsList(obj_id object, string objVarList)
|
|
{
|
|
if ( objVarList == null || objVarList == "" )
|
|
return;
|
|
|
|
//get array of strings in the format int:name=value
|
|
string[] pairs = split(objVarList, ',');
|
|
for ( int i = 0; i < pairs.length; i++ )
|
|
{
|
|
//split each pair to get int:name and value
|
|
string[] objVarToSet = split(pairs[i], '=' );
|
|
string objVarValue = objVarToSet[1];
|
|
//split int:name into type (int) and name ("name")
|
|
string[] objVarNameAndType = split(objVarToSet[0], ':');
|
|
string objVarType = objVarNameAndType[0];
|
|
string objVarName = objVarNameAndType[1];
|
|
|
|
//Now we have:
|
|
// objVarType = string, int, float, boolean
|
|
// objVarName = the name of the objvar to set
|
|
// objVarValue = the value of the objvar
|
|
|
|
if ( objVarType == "string" )
|
|
setObjVar( object, objVarName, objVarValue );
|
|
else if ( objVarType == "int" )
|
|
setObjVar( object, objVarName, utils.stringToInt( objVarValue ) );
|
|
else if ( objVarType == "float" )
|
|
setObjVar( object, objVarName, utils.stringToFloat( objVarValue ) );
|
|
else if ( objVarType == "boolean" || objVarType == "bool" )
|
|
setObjVar( object, objVarName, utils.stringToInt( objVarValue ) );//booleans are stored as int's.
|
|
else
|
|
setObjVar( object, objVarName, objVarValue );//fuck it, must have been a string after all.
|
|
|
|
}
|
|
}
|
|
|
|
void setObjVarsListUsingSemiColon(obj_id object, string objVarList)
|
|
{
|
|
if ( objVarList == null || objVarList == "" )
|
|
return;
|
|
|
|
//get array of strings in the format int:name=value
|
|
string[] pairs = split(objVarList, ',');
|
|
for ( int i = 0; i < pairs.length; i++ )
|
|
{
|
|
//split each pair to get int:name and value
|
|
string[] objVarToSet = split(pairs[i], '=' );
|
|
string objVarValue = objVarToSet[1];
|
|
//split int:name into type (int) and name ("name")
|
|
string[] objVarNameAndType = split(objVarToSet[0], ';');
|
|
string objVarType = objVarNameAndType[0];
|
|
string objVarName = objVarNameAndType[1];
|
|
|
|
//Now we have:
|
|
// objVarType = string, int, float, boolean
|
|
// objVarName = the name of the objvar to set
|
|
// objVarValue = the value of the objvar
|
|
|
|
if ( objVarType == "string" )
|
|
setObjVar( object, objVarName, objVarValue );
|
|
else if ( objVarType == "int" )
|
|
setObjVar( object, objVarName, utils.stringToInt( objVarValue ) );
|
|
else if ( objVarType == "float" )
|
|
setObjVar( object, objVarName, utils.stringToFloat( objVarValue ) );
|
|
else if ( objVarType == "boolean" || objVarType == "bool" )
|
|
setObjVar( object, objVarName, utils.stringToInt( objVarValue ) );//booleans are stored as int's.
|
|
else
|
|
setObjVar( object, objVarName, objVarValue );//fuck it, must have been a string after all.
|
|
|
|
}
|
|
}
|
|
|
|
boolean verifyLocationBasedDestructionAnchor(obj_id subject, float distance)
|
|
{
|
|
if (!hasObjVar(subject, "recordLoc"))
|
|
{
|
|
location recordLoc = getLocation(subject);
|
|
setObjVar(subject, "recordLoc", recordLoc);
|
|
return true;
|
|
}
|
|
|
|
location verifyLoc = getLocationObjVar(subject, "recordLoc");
|
|
location here = getLocation(getTopMostContainer(subject));
|
|
float distanceDifference = getDistance(verifyLoc, here);
|
|
if (distanceDifference > distance || distanceDifference == -1f)
|
|
{
|
|
destroyObject(subject);
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
boolean verifyLocationBasedDestructionAnchor(obj_id subject, location recordLoc, float distance)
|
|
{
|
|
if (!hasObjVar(subject, "recordLoc"))
|
|
{
|
|
setObjVar(subject, "recordLoc", recordLoc);
|
|
return true;
|
|
}
|
|
|
|
location verifyLoc = getLocationObjVar(subject, "recordLoc");
|
|
location here = getLocation(getTopMostContainer(subject));
|
|
float distanceDifference = getDistance(verifyLoc, here);
|
|
if (distanceDifference > distance || distanceDifference == -1f)
|
|
{
|
|
destroyObject(subject);
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/***********************************************************************
|
|
* @brief Converts time from seconds into localized seconds or minutes/seconds or hours/minutes or days/hours 2 significant digits is all anyone really needs
|
|
* This was setup to use prose packages in the examine window however prose packages couldnt be properly unpacked after using base class packOutOfBandProsePackage
|
|
* @param int time
|
|
*
|
|
*
|
|
***********************************************************************/
|
|
string assembleTimeRemainToUse(int time)
|
|
{
|
|
return assembleTimeRemainToUse(time, true);
|
|
}
|
|
|
|
string assembleTimeRemainToUse(int time, boolean localized)
|
|
{
|
|
//check to see if we display seconds
|
|
if(time <= 60)
|
|
{
|
|
string attrib = "";
|
|
if(localized)
|
|
attrib = time + (time != 1 ? " $@spam:seconds$" : " $@spam:second$");
|
|
else
|
|
attrib = time + (time != 1 ? " seconds" : " second");
|
|
|
|
return attrib;
|
|
}
|
|
|
|
if(time > 60 && time <= 3600 )
|
|
{
|
|
//get minutes
|
|
int minutes = (int)Math.floor(time / 60);
|
|
//get remainder seconds
|
|
int remainder_time = time % 60;
|
|
|
|
string attrib = "";
|
|
if(localized)
|
|
attrib = minutes + (minutes != 1 ? " $@spam:minutes$, " : " $@spam:minute$, ") + remainder_time + (remainder_time != 1 ? " $@spam:seconds$" : " $@spam:second$");
|
|
else
|
|
attrib = minutes + (minutes != 1 ? " minutes, " : " minute, ") + remainder_time + (remainder_time != 1 ? " seconds" : " second");
|
|
return attrib;
|
|
}
|
|
|
|
if(time > 3600 && time <= 86400)
|
|
{
|
|
//get hours
|
|
int hours = (int)Math.floor(time / 3600);
|
|
//get remainder minutes
|
|
int remainder_time = (time % 3600) / 60;
|
|
|
|
string attrib = "";
|
|
if(localized)
|
|
attrib = hours + (hours != 1 ? " $@spam:hours$, " : " $@spam:hour$, ") + remainder_time + (remainder_time != 1 ? " $@spam:minutes$" : " $@spam:minute$");
|
|
else
|
|
attrib = hours + (hours != 1 ? " hours, " : " hour, ") + remainder_time + (remainder_time != 1 ? " minutes" : " minute");
|
|
return attrib;
|
|
}
|
|
|
|
if(time > 86400 && time < Integer.MAX_VALUE)
|
|
{
|
|
//get days
|
|
int days = (int)Math.floor(time / 86400);
|
|
//get remainder hours
|
|
int remainder_hours = (time % 86400) / 3600;
|
|
int remainder_minutes = (time % 3600) / 60;
|
|
|
|
string attrib = "";
|
|
if(localized)
|
|
{
|
|
attrib = days + (days != 1 ? " $@spam:days$, " : " $@spam:day$, ") + remainder_hours + (remainder_hours != 1 ? " $@spam:hours$, " : " $@spam:hour$, ") +
|
|
+ remainder_minutes + (remainder_minutes != 1 ? " $@spam:minutes$" : " $@spam:minute$");
|
|
}
|
|
else
|
|
{
|
|
attrib = days + (days != 1 ? " days, " : " day, ") + remainder_hours + (remainder_hours != 1 ? " hours, " : " hour, ") +
|
|
+ remainder_minutes + (remainder_minutes != 1 ? " minutes" : " minute");
|
|
}
|
|
|
|
return attrib;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
//helper function to determine if someone is a specific profession
|
|
boolean isProfession(obj_id player, int profession)
|
|
{
|
|
if (!isIdValid(player))
|
|
return false;
|
|
|
|
if (!isPlayer(player))
|
|
return false;
|
|
|
|
string classTemplate = getSkillTemplate(player);
|
|
string professionName = "";
|
|
|
|
switch(profession)
|
|
{
|
|
case COMMANDO:
|
|
professionName = "commando";
|
|
break;
|
|
case SMUGGLER:
|
|
professionName = "smuggler";
|
|
break;
|
|
case MEDIC:
|
|
professionName = "medic";
|
|
break;
|
|
case OFFICER:
|
|
professionName = "officer";
|
|
break;
|
|
case SPY:
|
|
professionName = "spy";
|
|
break;
|
|
case BOUNTY_HUNTER:
|
|
professionName = "bounty";
|
|
break;
|
|
case FORCE_SENSITIVE:
|
|
professionName = "force";
|
|
break;
|
|
case TRADER:
|
|
professionName = "trader";
|
|
break;
|
|
case ENTERTAINER:
|
|
professionName = "entertainer";
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if ( classTemplate != null && classTemplate.startsWith(professionName))
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
int getPlayerProfession(obj_id player)
|
|
{
|
|
string[] noviceSkillList =
|
|
{
|
|
"class_forcesensitive_phase1_novice",
|
|
"class_bountyhunter_phase1_novice",
|
|
"class_smuggler_phase1_novice",
|
|
"class_commando_phase1_novice",
|
|
"class_officer_phase1_novice",
|
|
"class_spy_phase1_novice",
|
|
"class_medic_phase1_novice",
|
|
"class_entertainer_phase1_novice"
|
|
};
|
|
|
|
int[] professionList =
|
|
{
|
|
FORCE_SENSITIVE,
|
|
BOUNTY_HUNTER,
|
|
SMUGGLER,
|
|
COMMANDO,
|
|
OFFICER,
|
|
SPY,
|
|
MEDIC,
|
|
ENTERTAINER
|
|
};
|
|
|
|
for (int i=0;i<noviceSkillList.length;i++)
|
|
{
|
|
if (hasSkill(player, noviceSkillList[i]))
|
|
return professionList[i];
|
|
}
|
|
|
|
return TRADER;
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Networking code used to pack objects on Java side. Don't use unless you know
|
|
// what you're doing with these
|
|
//------------------------------------------------------------------------------
|
|
|
|
byte[] packObject(Object o)
|
|
{
|
|
byte[] ret = null;
|
|
|
|
try
|
|
{
|
|
ByteArrayOutputStream byteOutput = new ByteArrayOutputStream();
|
|
ObjectOutputStream objectOutput = new ObjectOutputStream(byteOutput);
|
|
|
|
try
|
|
{
|
|
objectOutput.writeObject(o);
|
|
ret = byteOutput.toByteArray();
|
|
}
|
|
catch ( IOException err )
|
|
{
|
|
LOG("utils", "ERROR in Java utils.packObject(): " + err.getMessage());
|
|
}
|
|
}
|
|
catch (java.io.IOException e)
|
|
{
|
|
LOG("utils", "ERROR in initialization of utils.packObject: " + e.getMessage());
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
Object unpackObject(byte[] source)
|
|
{
|
|
try
|
|
{
|
|
ByteArrayInputStream byteInput = new ByteArrayInputStream(source);
|
|
ObjectInputStream ois = new ObjectInputStream(byteInput);
|
|
Object result = ois.readObject();
|
|
|
|
return result;
|
|
}
|
|
catch (ClassNotFoundException x)
|
|
{
|
|
LOG("utils", "ClassNotFoundException: "+x.toString());
|
|
}
|
|
catch (IOException x)
|
|
{
|
|
LOG("utils", "IOException: "+x.toString());
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
//Deletes an old snowflake item and replaces with updated snowflake item, handles player equipped
|
|
//on floor in houses and containers in houses, in containers in players inventory
|
|
|
|
boolean replaceSnowflakeItem(obj_id oldItem, string newTemplateName)
|
|
{
|
|
obj_id ownerContainer = getContainedBy(oldItem);
|
|
//LOG("replaceSnowflakeItem", "ownerContainer = "+ownerContainer);
|
|
if(!isIdValid(ownerContainer))
|
|
return false;
|
|
|
|
//check to see if oldItem is in a bazaar or vendor
|
|
//this is to fix issue with items being converted during the split second it is in the bazzars or vendors inventory
|
|
boolean inVendor = isInVendor(oldItem);
|
|
boolean inBazaar = isInBazaar(oldItem);
|
|
if(inVendor || inBazaar)
|
|
{
|
|
//you are inside a vendor and you will need to delay the change till in players inventory
|
|
//NOTE TO DESIGNERS: if you are going to use this function, you must make the messageHandler on the script on the
|
|
//object. Otherwise nothing will happen. The item wont convert till the player re-loads.
|
|
messageTo(oldItem, "handlerReInitialize", null, 5.0f, false);
|
|
return false;
|
|
}
|
|
|
|
obj_id newItem = null;
|
|
|
|
//check to see if we are a player
|
|
if (isPlayer(ownerContainer))
|
|
{
|
|
obj_id inventory = utils.getInventoryContainer(ownerContainer);
|
|
//check to see if we are equipped, if so unequip
|
|
if(utils.isEquipped(oldItem))
|
|
putInOverloaded(oldItem, inventory);
|
|
|
|
newItem = createObjectOverloaded(newTemplateName, inventory);
|
|
CustomerServiceLog("replaceSnowflakeItem: ", "Old Item (" + oldItem + ")"+ " is contained in player's " + getFirstName(getContainingPlayer(oldItem)) + "(" + getContainingPlayer(oldItem) + ") inventory.");
|
|
CustomerServiceLog("replaceSnowflakeItem: ", "New Item (" + newItem + ")"+ " was created in " + getFirstName(getContainingPlayer(newItem)) + "(" + getContainingPlayer(newItem) + ") inventory.");
|
|
}
|
|
//check to see if we are floating in a house
|
|
else if(getCellName(ownerContainer) != null)
|
|
{
|
|
if(player_structure.isBuilding(getTopMostContainer(ownerContainer)))
|
|
{
|
|
location loc = getLocation(oldItem);
|
|
newItem = createObject(newTemplateName, loc);
|
|
|
|
//so for some reason the server creating objects on the floor of a house causes them not to persist
|
|
//so lets we manually do it
|
|
if(isIdValid(newItem))
|
|
{
|
|
if( isObjectPersisted(oldItem) && !isObjectPersisted(newItem) )
|
|
persistObject(newItem);
|
|
}
|
|
|
|
CustomerServiceLog("replaceSnowflakeItem: ", "Old Item (" + oldItem + ") is contained in a building (" + getTopMostContainer(ownerContainer) + ")");
|
|
CustomerServiceLog("replaceSnowflakeItem: ", "New Item (" + newItem + ") was created in building (" + getTopMostContainer(ownerContainer) + ")");
|
|
CustomerServiceLog("replaceSnowflakeItem: ", "New Item (" + newItem + ")s location is in a building (" + getTopMostContainer(ownerContainer) + ") is x = " + loc.x + " y = " + loc.y + " z = " + loc.z + "and cell = " + getCellName(getTopMostContainer(ownerContainer), loc.cell));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
newItem = createObjectOverloaded(newTemplateName, ownerContainer);
|
|
CustomerServiceLog("replaceSnowflakeItem: ", "New Item (" + newItem + ")"+ " was created in container (" + ownerContainer + ")");
|
|
}
|
|
|
|
//make sure new item is good before destroying old
|
|
if(isIdValid(newItem))
|
|
{
|
|
CustomerServiceLog("replaceSnowflakeItem: ", "New Item (" + newItem + ")"+ " has a valid ID. So Old Item (" + oldItem + ") is to be destroyed");
|
|
destroyObject(oldItem);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void checkInventoryForSnowflakeItemSwaps(obj_id self)
|
|
{
|
|
string[] oldTemplates = dataTableGetStringColumn("datatables/item/snowflake_item_swaps.iff", "OLD_TEMPLATE");
|
|
obj_id objInventory = getInventoryContainer(self);
|
|
|
|
if(isIdValid(objInventory) )
|
|
{
|
|
obj_id[] objContents = getContents(objInventory, true);
|
|
|
|
if(objContents != null)
|
|
{
|
|
for(int i = 0; i < objContents.length; i++)
|
|
{
|
|
for(int j = 0; j < oldTemplates.length; j++)
|
|
{
|
|
string strItemTemplate = getTemplateName(objContents[i]);
|
|
if(strItemTemplate == oldTemplates[j])
|
|
{
|
|
string newTemplate = dataTableGetString("datatables/item/snowflake_item_swaps.iff", j, "NEW_TEMPLATE");
|
|
|
|
if(newTemplate != null || !newTemplate.equals("") )
|
|
{
|
|
replaceSnowflakeItem(objContents[i], newTemplate);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
return;
|
|
}
|
|
|
|
//checks to see if the object is a player vendor
|
|
boolean isVendorObject(obj_id object)
|
|
{
|
|
if(hasScript(object, VENDOR_SCRIPT))
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
//checks to see if the object is a bazaar
|
|
boolean isBazaarObject(obj_id object)
|
|
{
|
|
if(hasScript(object, BAZAAR_SCRIPT))
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
//Checks to see if an item is in a vendors inventory
|
|
// Items will only be in the inventory during the split second it takes to
|
|
// move item from wharehouse to players inventory. This function is used in the replaceSnowflakeItem function
|
|
boolean isInVendor(obj_id item)
|
|
{
|
|
obj_id ownerContainer = getContainedBy(item);
|
|
if(!isIdValid(ownerContainer))
|
|
return false;
|
|
|
|
//get the parent ID
|
|
obj_id parentContainer = getContainedBy(ownerContainer);
|
|
//LOG("replaceSnowflakeItem", "parentContainer = "+parentContainer);
|
|
if(hasObjVar(parentContainer, "vendor"))
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
//Checks to see if an item is in a bazaars inventory
|
|
// Items will only be in the inventory during the split second it takes to
|
|
// move item from wharehouse to players inventory. This function is used in the replaceSnowflakeItem function
|
|
boolean isInBazaar(obj_id item)
|
|
{
|
|
obj_id ownerContainer = getContainedBy(item);
|
|
if(!isIdValid(ownerContainer))
|
|
return false;
|
|
|
|
if(hasScript(ownerContainer, "terminal.bazaar"))
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
//checks to see if 2 objects are out of the specified distance of each other
|
|
boolean outOfRange(obj_id self, obj_id player, float distance, boolean message)
|
|
{
|
|
//gods override range checks
|
|
if(isGod(player))
|
|
return false;
|
|
|
|
location a = getLocation(self);
|
|
location b = getLocation(player);
|
|
if (a.cell == b.cell && a.distance(b) < distance)
|
|
return false;
|
|
|
|
if (message)
|
|
sendSystemMessage(player, SID_OUT_OF_RANGE);
|
|
|
|
return true;
|
|
}
|
|
//pass in a very long float, round it to the Hundredths place and pass it back
|
|
float roundFloatByDecimal(float number)
|
|
{
|
|
float tempNumber = number *100;
|
|
int result = (int)Math.round(tempNumber);
|
|
float finalResult = (float)result/100;
|
|
return finalResult;
|
|
}
|
|
|
|
// House packing code
|
|
void housePackingDecreaseIncrease (obj_id objPlayer, int change)
|
|
{
|
|
// player is earning a point by blowing up a house
|
|
if (change > 0)
|
|
{
|
|
//current points[0]
|
|
//max ever points[1]
|
|
int [] housePacking = new int [utils.HOUSE_MAX];
|
|
//if this is the first house blown up
|
|
if (!hasObjVar (objPlayer, "housePackup"))
|
|
setObjVar (objPlayer, "housePackup", housePacking);
|
|
|
|
housePacking = getIntArrayObjVar (objPlayer, "housePackup");
|
|
//validate
|
|
if (housePacking.length != utils.HOUSE_MAX)
|
|
return;
|
|
//increase both counters by 1
|
|
housePacking[0]++;
|
|
housePacking[1]++;
|
|
setObjVar (objPlayer, "housePackup", housePacking);
|
|
//set objvar to make sure that a player can only pack up 10 houses a day
|
|
if (!hasObjVar (objPlayer, "dailyHousePackup"))
|
|
{
|
|
setObjVar (objPlayer, "dailyHousePackup", 1);
|
|
int resetTime = getGameTime() + player_structure.TIME_TO_NEXT_PACKUP; // 24 hours
|
|
setObjVar (objPlayer, "maxHousePackupTimer", resetTime);
|
|
}
|
|
else
|
|
{
|
|
int dailyHousePacking = getIntObjVar (objPlayer, "dailyHousePackup");
|
|
dailyHousePacking++;
|
|
setObjVar (objPlayer, "dailyHousePackup", dailyHousePacking);
|
|
}
|
|
//grant badge after 10 blown up houses
|
|
if (!badge.hasBadge (objPlayer, "house_packup_badge"))
|
|
{
|
|
int[] packupObjVar = getIntArrayObjVar (objPlayer, "housePackup");
|
|
|
|
if (packupObjVar != null && packupObjVar.length > 0)
|
|
{
|
|
if (packupObjVar[1] >= player_structure.NUM_NEEDED_PACKUP_FIRST_BADGE)
|
|
{
|
|
badge.grantBadge (objPlayer, "house_packup_badge");
|
|
}
|
|
}
|
|
}
|
|
if (badge.hasBadge (objPlayer, "house_packup_badge"))
|
|
{
|
|
if (!badge.hasBadge (objPlayer, "house_packup_badge_master"))
|
|
{
|
|
int[] packupObjVar = getIntArrayObjVar (objPlayer, "housePackup");
|
|
|
|
if (packupObjVar != null && packupObjVar.length > 0)
|
|
{
|
|
if (packupObjVar[1] >= player_structure.NUM_NEEDED_PACKUP_SECOND_BADGE)
|
|
{
|
|
badge.grantBadge (objPlayer, "house_packup_badge_master");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//decreasing current points because the player is buying something
|
|
else
|
|
{
|
|
//current points[0]
|
|
int [] housePacking = new int [utils.HOUSE_MAX];
|
|
|
|
housePacking = getIntArrayObjVar (objPlayer, "housePackup");
|
|
//validate
|
|
if (housePacking.length != utils.HOUSE_MAX)
|
|
return;
|
|
//decrease current points counter by 1
|
|
housePacking[0]--;
|
|
setObjVar (objPlayer, "housePackup", housePacking);
|
|
}
|
|
}
|
|
|
|
//checks to see if we are on the floor of a building and not in a container,player, or other weird place
|
|
boolean isInHouseCellSpace(obj_id object)
|
|
{
|
|
if(isIdValid(object))
|
|
{
|
|
//are we in a player
|
|
if(isNestedWithinAPlayer(object))
|
|
return false;
|
|
|
|
//top object is a building
|
|
obj_id house = getTopMostContainer(object);
|
|
if(isIdValid(house) && !player_structure.isBuilding(house))
|
|
return false;
|
|
|
|
obj_id container = getContainedBy(object);
|
|
if(isIdValid(container) && (getContainedBy(container) != house))
|
|
return false;
|
|
|
|
//I am not in a cave or public structure
|
|
if(!hasObjVar(house, "player_structure.admin.adminList"))
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
//quick check to see if player has any of the named resource type in inventory
|
|
//returns true the first time it finds any of the passed in resource in inventory
|
|
boolean hasResourceInInventory(obj_id player, string resource)
|
|
{
|
|
if(!isIdValid(player))
|
|
return false;
|
|
|
|
if(resource == null || resource == "")
|
|
return false;
|
|
|
|
obj_id[] contents = getFilteredPlayerContents(player);
|
|
if ( (contents == null) || (contents.length == 0))
|
|
return false;
|
|
|
|
for ( int n = 0; n < contents.length; n++ )
|
|
{
|
|
int got = getGameObjectType(contents[n]);
|
|
if ( isGameObjectTypeOf(got, GOT_resource_container) )
|
|
{
|
|
obj_id resourceCrate = contents[n];
|
|
if ( isIdValid(resourceCrate) )
|
|
{
|
|
obj_id resourceId = getResourceContainerResourceType(resourceCrate);
|
|
if ( isIdValid(resourceId) )
|
|
{
|
|
if ( isResourceDerivedFrom(resourceId, resource) )
|
|
return true;
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
obj_id[] validateObjIdArray(obj_id[] source)
|
|
{
|
|
resizeable obj_id[] target = new obj_id[0];
|
|
|
|
for(int i = 0; i < source.length; i++)
|
|
{
|
|
if(isIdValid(source[i]) && exists(source[i]))
|
|
{
|
|
addElement(target, source[i]);
|
|
}
|
|
}
|
|
|
|
source = target;
|
|
|
|
return source;
|
|
}
|
|
|
|
obj_id[] getPlayersInBuildoutRow(obj_id player)
|
|
{
|
|
location loc = getLocation(player);
|
|
return getPlayersInBuildoutRow(loc.area, locations.getBuildoutAreaRow(player));
|
|
}
|
|
|
|
obj_id[] getPlayersInBuildoutDimensions(string scene, float x1, float x2, float z1, float z2)
|
|
{
|
|
float centX = Math.abs((x2 - x1) / 2.0f) + x1;
|
|
float centZ = Math.abs((z2 - z1) / 2.0f) + z1;
|
|
|
|
location centerLoc = new location(centX, 0.0f, centZ, scene);
|
|
location lowerLeft = new location(x1, 0.0f, z1, scene);
|
|
|
|
float hypotenuse = getDistance(centerLoc, lowerLeft);
|
|
|
|
obj_id[] allPlayers = getAllPlayers(centerLoc, hypotenuse * 3.0f);
|
|
|
|
resizeable obj_id[] playersInArea = new obj_id[0];
|
|
|
|
if(allPlayers == null || allPlayers.length == 0)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
for(int i = 0; i < allPlayers.length; i++)
|
|
{
|
|
location loc = getLocation(trial.getTop(allPlayers[i]));
|
|
|
|
if(loc.x < x1 || loc.x > x2 || loc.z < z1 || loc.z > z2)
|
|
{
|
|
LOG("doLogging", ""+loc.x+" vs: "+x1+", "+x2+" and "+loc.z+" vs: "+z1+", "+z2);
|
|
continue;
|
|
}
|
|
|
|
utils.addElement(playersInArea, allPlayers[i]);
|
|
}
|
|
|
|
if(playersInArea == null || playersInArea.length == 0)
|
|
return null;
|
|
|
|
return playersInArea;
|
|
}
|
|
|
|
dictionary getCoordinatesInBuildoutRow(string scene, int buildout_row)
|
|
{
|
|
string datatable = "datatables/buildout/areas_"+scene+".iff";
|
|
dictionary data = dataTableGetRow(datatable, buildout_row);
|
|
|
|
return data;
|
|
}
|
|
|
|
obj_id[] getPlayersInBuildoutRow(string scene, int buildout_row)
|
|
{
|
|
string datatable = "datatables/buildout/areas_"+scene+".iff";
|
|
dictionary data = dataTableGetRow(datatable, buildout_row);
|
|
|
|
return getPlayersInBuildoutDimensions(scene, data.getFloat("x1"), data.getFloat("x2"), data.getFloat("z1"), data.getFloat("z2"));
|
|
}
|
|
|
|
obj_id[] getPlayersInBuildoutArea(string scene, string buildout_area)
|
|
{
|
|
string datatable = "datatables/buildout/areas_"+scene+".iff";
|
|
int rowNum = dataTableSearchColumnForString(buildout_area, 0, datatable);
|
|
|
|
if(rowNum == -1)
|
|
return null;
|
|
|
|
return getPlayersInBuildoutRow(scene, rowNum);
|
|
}
|
|
|
|
obj_id[] getAllNpcInBuildoutArea(obj_id baseObject)
|
|
{
|
|
location loc = getLocation(baseObject);
|
|
int buildout_area = locations.getBuildoutAreaRow(baseObject);
|
|
|
|
obj_id[] allObjects = getAllObjectsInBuildoutArea(loc.area, buildout_area);
|
|
|
|
if (allObjects == null || allObjects.length == 0)
|
|
return null;
|
|
|
|
resizeable obj_id[] allNpc = new obj_id[0];
|
|
|
|
|
|
for (int i=0;i<allObjects.length;i++)
|
|
{
|
|
if (!isMob(allObjects[i]))
|
|
continue;
|
|
|
|
allNpc.add(allObjects[i]);
|
|
}
|
|
|
|
if (allNpc == null || allNpc.length == 0)
|
|
return null;
|
|
|
|
allObjects = allNpc;
|
|
return allObjects;
|
|
}
|
|
|
|
obj_id[] getAllObjectsInBuildoutArea(obj_id baseObject)
|
|
{
|
|
location loc = getLocation(baseObject);
|
|
int buildout_row = locations.getBuildoutAreaRow(baseObject);
|
|
|
|
return getAllObjectsInBuildoutArea(loc.area, buildout_row);
|
|
}
|
|
|
|
obj_id[] getAllObjectsInBuildoutArea(string scene, int buildout_row)
|
|
{
|
|
string datatable = "datatables/buildout/areas_"+scene+".iff";
|
|
dictionary data = dataTableGetRow(datatable, buildout_row);
|
|
|
|
float x1 = data.getFloat("x1");
|
|
float x2 = data.getFloat("x2");
|
|
float z1 = data.getFloat("z1");
|
|
float z2 = data.getFloat("z2");
|
|
|
|
float centX = Math.abs((data.getFloat("x2") - data.getFloat("x1")) / 2.0f) + data.getFloat("x1");
|
|
float centZ = Math.abs((data.getFloat("z2") - data.getFloat("z1")) / 2.0f) + data.getFloat("z1");
|
|
|
|
location centerLoc = new location(centX, 0.0f, centZ, scene);
|
|
location lowerLeft = new location(data.getFloat("x1"), 0.0f, data.getFloat("z1"), scene);
|
|
|
|
float hypotenuse = getDistance(centerLoc, lowerLeft);
|
|
|
|
obj_id[] allObjects = getObjectsInRange(centerLoc, hypotenuse * 3.0f);
|
|
|
|
resizeable obj_id[] objectsInArea = new obj_id[0];
|
|
|
|
if (allObjects == null || allObjects.length == 0)
|
|
return null;
|
|
|
|
for (int i=0;i<allObjects.length;i++)
|
|
{
|
|
location testLoc = getLocation(trial.getTop(allObjects[i]));
|
|
if (testLoc.x < x1 || testLoc.x > x2 || testLoc.z < z1 || testLoc.z > z2)
|
|
continue;
|
|
|
|
objectsInArea.add(allObjects[i]);
|
|
|
|
}
|
|
|
|
if (objectsInArea == null || objectsInArea.length == 0)
|
|
return null;
|
|
|
|
return objectsInArea;
|
|
|
|
}
|
|
|
|
|
|
Vector shuffleArray(Vector list)
|
|
{
|
|
Vector newList = new Vector();
|
|
|
|
for(int size = list.size();size > 0;size--)
|
|
{
|
|
|
|
int i = rand(0, (size - 1));
|
|
|
|
newList = utils.addElement(newList, list.get(i));
|
|
list = utils.removeElementAt(list, i);
|
|
}
|
|
|
|
if(newList == null || newList.size() == 0)
|
|
return null;
|
|
|
|
return newList;
|
|
|
|
}
|
|
|
|
//used for granting xmas gifts in past via dropping in players inventories on login
|
|
//each year increment the constants if you want to use this, last used 2006
|
|
boolean grantGift(obj_id player)
|
|
{
|
|
//check character age if they are less than 10 days no joy
|
|
if( (getCurrentBirthDate() - getPlayerBirthDate(player)) < 10 )
|
|
return false;
|
|
|
|
// Check to see if the player has already gotten presents
|
|
if ( hasObjVar(player, XMAS_RECEIVED_VI1))
|
|
return false;
|
|
|
|
if (!isIdValid(player))
|
|
return false;
|
|
|
|
string config = getConfigSetting("GameServer", "grantGift");
|
|
if (config != null)
|
|
{
|
|
if (config.equals("false"))
|
|
return false;
|
|
}
|
|
|
|
if (isInTutorialArea(player))
|
|
{
|
|
setObjVar(player, XMAS_NOT_RECEIVED_TUTORIAL, 1);
|
|
CustomerServiceLog("grantGift", getFirstName(player) + "(" + player + ") did not receive Christmas '06 gift because they logged in on the tutorial planet.");
|
|
return false;
|
|
}
|
|
|
|
//you are no longer in tutorial give them presents when they leave
|
|
removeObjVar(player, XMAS_NOT_RECEIVED_TUTORIAL);
|
|
|
|
obj_id inv = utils.getInventoryContainer(player);
|
|
if (!isIdValid(inv))
|
|
{
|
|
CustomerServiceLog("grantGift", getFirstName(player) + "(" + player + ") did not have an inventory container. Didn't receive Christmas '06 gift, but not blocked from future attempt.");
|
|
return false;
|
|
}
|
|
|
|
obj_id giftSelf= static_item.createNewItemFunction( "item_lifeday_gift_self_01_02", inv);
|
|
|
|
obj_id giftOther= static_item.createNewItemFunction( "item_lifeday_gift_other_01_02", inv);
|
|
setObjVar(giftOther, LIFEDAY_OWNER, player);
|
|
|
|
// Mark the player has having gotten the item
|
|
utils.sendMail(GIFT_GRANTED_SUB, GIFT_GRANTED, player, "System");
|
|
setObjVar(player, XMAS_RECEIVED_VI1, 1);
|
|
CustomerServiceLog("grantGift", getFirstName(player) + "(" + player + ") has received his Christmas '06 gift.");
|
|
|
|
return true;
|
|
}
|
|
|
|
void fullExpertiseReset(obj_id player, boolean storeBeast)
|
|
{
|
|
//need to store beasts
|
|
if(storeBeast)
|
|
{
|
|
if(beast_lib.isBeastMaster(player))
|
|
beast_lib.storeBeasts(player);
|
|
}
|
|
//drop the stance/focus buff if we are a jedi
|
|
if(utils.isProfession(player, utils.FORCE_SENSITIVE))
|
|
{
|
|
if(buff.isInStance(player))
|
|
buff.removeBuff(player, jedi.JEDI_STANCE);
|
|
|
|
if(buff.isInFocus(player))
|
|
buff.removeBuff(player, jedi.JEDI_FOCUS);
|
|
}
|
|
//set the version number
|
|
respec.setRespecVersion(player);
|
|
|
|
//clear buffs
|
|
buff.removeAllBuffs(player, false, true);
|
|
|
|
//reset the expertise
|
|
resetExpertises(player);
|
|
}
|
|
|
|
//Used to get all the passengers in all the slots of vehicles
|
|
//this will not get the riderId, it only checks for passengers
|
|
obj_id[] getAllRidersInVehicle(obj_id player, obj_id vehicle)
|
|
{
|
|
//validate our data
|
|
if(!isIdValid(player) || !isIdValid(vehicle))
|
|
return null;
|
|
if(!exists(player) || !exists(vehicle))
|
|
return null;
|
|
|
|
//create our temporary array for holding data
|
|
resizeable obj_id[] resizeList = new obj_id[0];
|
|
|
|
//we are going to assume that we dont have more than 25 passengers
|
|
for(int i = 1; i <= 25; ++i)
|
|
{
|
|
//lets attempt to get the obj_id of rider in this slot
|
|
obj_id tempRider = getObjectInSlot(vehicle, "rider"+i);
|
|
|
|
//if it is an invalid Id we need to keep going
|
|
if(!isIdValid(tempRider) || !exists(tempRider))
|
|
continue;
|
|
|
|
//if the id is valid, lets add it to the list.
|
|
resizeList = addElement(resizeList, tempRider);
|
|
}
|
|
|
|
//lets return our list of passengers. This list could be zero length, if we had no passengers
|
|
//so be sure to check for null or 0 length where you are calling this function
|
|
return resizeList;
|
|
}
|
|
|
|
/*
|
|
retroactively fix up CTS stuff
|
|
*/
|
|
void updateCTSObjVars(obj_id player)
|
|
{
|
|
if (!isIdValid(player) || !exists(player))
|
|
return;
|
|
|
|
boolean retrievedCtsOjbvars = false;
|
|
dictionary[] ctsOjbvars = null;
|
|
|
|
//check to see if they have already done this update
|
|
string updateObjvar = utils.CTS_OBJVAR_HISTORY + ".1";
|
|
if (!hasObjVar(player, updateObjvar))
|
|
{
|
|
if ((ctsOjbvars == null) && !retrievedCtsOjbvars)
|
|
{
|
|
ctsOjbvars = getCharacterRetroactiveCtsObjvars(player);
|
|
retrievedCtsOjbvars = true;
|
|
}
|
|
|
|
if ((ctsOjbvars != null) && (ctsOjbvars.length > 0))
|
|
{
|
|
utils.updateRespecCTSObjvars(player, ctsOjbvars);
|
|
utils.updateBeastMasterCTSObjvars(player, ctsOjbvars);
|
|
}
|
|
|
|
setObjVar(player, updateObjvar, 1);
|
|
}
|
|
|
|
//check to see if they have already done this update
|
|
updateObjvar = utils.CTS_OBJVAR_HISTORY + ".2";
|
|
if (!hasObjVar(player, updateObjvar))
|
|
{
|
|
if ((ctsOjbvars == null) && !retrievedCtsOjbvars)
|
|
{
|
|
ctsOjbvars = getCharacterRetroactiveCtsObjvars(player);
|
|
retrievedCtsOjbvars = true;
|
|
}
|
|
|
|
if ((ctsOjbvars != null) && (ctsOjbvars.length > 0))
|
|
{
|
|
utils.updateHousePackupCTSObjvars(player, ctsOjbvars);
|
|
}
|
|
|
|
setObjVar(player, updateObjvar, 1);
|
|
}
|
|
|
|
/* template for for future CTS objvar migrations
|
|
//check to see if they have already done this update
|
|
updateObjvar = utils.CTS_OBJVAR_HISTORY + ".3";
|
|
if (!hasObjVar(player, updateObjvar))
|
|
{
|
|
if ((ctsOjbvars == null) && !retrievedCtsOjbvars)
|
|
{
|
|
ctsOjbvars = getCharacterRetroactiveCtsObjvars(player);
|
|
retrievedCtsOjbvars = true;
|
|
}
|
|
|
|
if ((ctsOjbvars != null) && (ctsOjbvars.length > 0))
|
|
{
|
|
utils.updateXXXXXCTSObjvars(player, ctsOjbvars);
|
|
utils.updateYYYYYCTSObjvars(player, ctsOjbvars);
|
|
utils.updateZZZZZCTSObjvars(player, ctsOjbvars);
|
|
}
|
|
|
|
setObjVar(player, updateObjvar, 1);
|
|
}
|
|
*/
|
|
}
|
|
|
|
/*
|
|
retroactively fix up CTS stuff relating to the respec objvars
|
|
*/
|
|
void updateRespecCTSObjvars(obj_id player, dictionary[] ctsOjbvars)
|
|
{
|
|
if (!isIdValid(player) || !exists(player))
|
|
return;
|
|
|
|
if ((ctsOjbvars == null) || (ctsOjbvars.length <= 0))
|
|
return;
|
|
|
|
// use the higher of respecsBought objvar from the most recent
|
|
// tranfer or the current respecsBought objvar on the character
|
|
const int indexMostRecentTransfer = ctsOjbvars.length - 1;
|
|
if ((ctsOjbvars[indexMostRecentTransfer] != null) && ctsOjbvars[indexMostRecentTransfer].containsKey("respecsBought") && ctsOjbvars[indexMostRecentTransfer].isInt("respecsBought"))
|
|
{
|
|
const int respecsBoughtFromTransfer = ctsOjbvars[indexMostRecentTransfer].getInt("respecsBought");
|
|
int respecsBoughtCurrentValue = 0;
|
|
if (hasObjVar(player, "respecsBought"))
|
|
respecsBoughtCurrentValue = getIntObjVar(player, "respecsBought");
|
|
|
|
if (respecsBoughtFromTransfer > respecsBoughtCurrentValue)
|
|
{
|
|
CustomerServiceLog("CharacterTransferRetroactiveHistory", "changing respecsBought objvar for " + player + " from " + respecsBoughtCurrentValue + " to " + respecsBoughtFromTransfer);
|
|
setObjVar(player, "respecsBought", respecsBoughtFromTransfer);
|
|
}
|
|
}
|
|
|
|
// for each of the value of the playerRespec.levelArrayComEntCra objvar,
|
|
// use the higher value from the highest value from all the transfers
|
|
// or the current value on the character
|
|
int[] recpecLevelsFromTransfer = {-1, -1, -1};
|
|
for (int i = 0; i < ctsOjbvars.length; ++i)
|
|
{
|
|
if ((ctsOjbvars[i] != null) && ctsOjbvars[i].containsKey(respec.PROF_LEVEL_ARRAY) && ctsOjbvars[i].isIntArray(respec.PROF_LEVEL_ARRAY))
|
|
{
|
|
int[] levelArray = ctsOjbvars[i].getIntArray(respec.PROF_LEVEL_ARRAY);
|
|
if ((levelArray != null) && (levelArray.length == 3))
|
|
{
|
|
if (levelArray[0] > recpecLevelsFromTransfer[0])
|
|
recpecLevelsFromTransfer[0] = levelArray[0];
|
|
|
|
if (levelArray[1] > recpecLevelsFromTransfer[1])
|
|
recpecLevelsFromTransfer[1] = levelArray[1];
|
|
|
|
if (levelArray[2] > recpecLevelsFromTransfer[2])
|
|
recpecLevelsFromTransfer[2] = levelArray[2];
|
|
}
|
|
}
|
|
}
|
|
|
|
if ((recpecLevelsFromTransfer[0] > -1) || (recpecLevelsFromTransfer[1] > -1) || (recpecLevelsFromTransfer[2] > -1))
|
|
{
|
|
int[] recpecLevelsCurrentValue = {-1, -1, -1};
|
|
if (hasObjVar(player, respec.PROF_LEVEL_ARRAY))
|
|
recpecLevelsCurrentValue = getIntArrayObjVar(player, respec.PROF_LEVEL_ARRAY);
|
|
|
|
if ((recpecLevelsCurrentValue != null) && (recpecLevelsCurrentValue.length == 3))
|
|
{
|
|
int[] recpecLevelsNewValue = {-1, -1, -1};
|
|
recpecLevelsNewValue[0] = Math.max(recpecLevelsCurrentValue[0], recpecLevelsFromTransfer[0]);
|
|
recpecLevelsNewValue[1] = Math.max(recpecLevelsCurrentValue[1], recpecLevelsFromTransfer[1]);
|
|
recpecLevelsNewValue[2] = Math.max(recpecLevelsCurrentValue[2], recpecLevelsFromTransfer[2]);
|
|
|
|
if ((recpecLevelsNewValue[0] != recpecLevelsCurrentValue[0]) || (recpecLevelsNewValue[1] != recpecLevelsCurrentValue[1]) || (recpecLevelsNewValue[2] != recpecLevelsCurrentValue[2]))
|
|
{
|
|
CustomerServiceLog("CharacterTransferRetroactiveHistory", "changing " + respec.PROF_LEVEL_ARRAY + " objvar for " + player + " from (" + recpecLevelsCurrentValue[0] + "," + recpecLevelsCurrentValue[1] + "," + recpecLevelsCurrentValue[2] + ") to (" + recpecLevelsNewValue[0] + "," + recpecLevelsNewValue[1] + "," + recpecLevelsNewValue[2] + ")");
|
|
setObjVar(player, respec.PROF_LEVEL_ARRAY, recpecLevelsNewValue);
|
|
}
|
|
}
|
|
}
|
|
|
|
//lets make sure that our current template is the right level
|
|
if (hasObjVar(player, respec.PROF_LEVEL_ARRAY))
|
|
{
|
|
//get the current tempalte of the player
|
|
string skillTemplate = getSkillTemplate(player);
|
|
//get the respec history values
|
|
int[] recpecLevelsValue = getIntArrayObjVar(player, respec.PROF_LEVEL_ARRAY);
|
|
|
|
if ((skillTemplate != null) && (skillTemplate.length() > 0) && (recpecLevelsValue != null) && (recpecLevelsValue.length == 3))
|
|
{
|
|
//get the current level
|
|
int currentLevel = getLevel(player);
|
|
|
|
//if you are not an entertainer or trader, you are a combat toon
|
|
if (!skillTemplate.startsWith("entertainer") && !skillTemplate.startsWith("trader"))
|
|
{
|
|
//get respec history combat level
|
|
int combatLevel = recpecLevelsValue[respec.PROF_LEVEL_COMBAT];
|
|
//if current level is lower than respec history combat level
|
|
//we need to level the player up to the historical level
|
|
if(currentLevel < combatLevel)
|
|
respec.autoLevelPlayer(player, combatLevel, true);
|
|
}
|
|
//are you an entertainer?
|
|
else if (skillTemplate.startsWith("entertainer"))
|
|
{
|
|
//get respec history entertainer level
|
|
int entLevel = recpecLevelsValue[respec.PROF_LEVEL_ENT];
|
|
|
|
//if current level is lower than respec history entertainer level
|
|
//we need to level the player up to the historical level
|
|
if(currentLevel < entLevel)
|
|
respec.autoLevelPlayer(player, entLevel, true);
|
|
}
|
|
//are you an trader?
|
|
else if (skillTemplate.startsWith("trader"))
|
|
{
|
|
//get respec history trader level
|
|
int traderLevel = recpecLevelsValue[respec.PROF_LEVEL_TRADER];
|
|
|
|
//if current level is lower than respec history trader level
|
|
//we need to level the player up to the historical level
|
|
if(currentLevel < traderLevel)
|
|
respec.autoLevelPlayer(player, traderLevel, true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
retroactively fix up CTS stuff relating to the beast master ability objvar
|
|
*/
|
|
void updateBeastMasterCTSObjvars(obj_id player, dictionary[] ctsOjbvars)
|
|
{
|
|
if (!isIdValid(player) || !exists(player))
|
|
return;
|
|
|
|
if ((ctsOjbvars == null) || (ctsOjbvars.length <= 0))
|
|
return;
|
|
|
|
// merge the values of the beast_master.known_skills objvars
|
|
// from all the previous transfers with the current values
|
|
HashSet abilities = new HashSet();
|
|
|
|
// compile the list of abilities frm all previous transfers
|
|
for (int i = 0; i < ctsOjbvars.length; ++i)
|
|
{
|
|
if (ctsOjbvars[i] != null)
|
|
{
|
|
int j = 0;
|
|
while (true)
|
|
{
|
|
const String objVarName = beast_lib.PLAYER_KNOWN_SKILLS_LIST + "." + j;
|
|
if (ctsOjbvars[i].containsKey(objVarName) && ctsOjbvars[i].isIntArray(objVarName))
|
|
{
|
|
const int[] objVarValue = ctsOjbvars[i].getIntArray(objVarName);
|
|
if ((objVarValue != null) && (objVarValue.length > 0))
|
|
{
|
|
for (int k = 0; k < objVarValue.length; ++k)
|
|
{
|
|
abilities.add(new Integer(objVarValue[k]));
|
|
}
|
|
}
|
|
|
|
++j;
|
|
}
|
|
else
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!abilities.isEmpty())
|
|
{
|
|
// get current abilities
|
|
resizeable int[] abilitiesCurrent = utils.getResizeableIntBatchObjVar(player, beast_lib.PLAYER_KNOWN_SKILLS_LIST);
|
|
|
|
boolean updateRequired = false;
|
|
if ((abilitiesCurrent == null) || (abilitiesCurrent.length <= 0))
|
|
{
|
|
updateRequired = true;
|
|
}
|
|
else
|
|
{
|
|
// make sure there are no dupes in the current abilities
|
|
HashSet abilitiesCurrentNoDupes = new HashSet();
|
|
for (int i = 0; i < abilitiesCurrent.length; ++i)
|
|
{
|
|
abilitiesCurrentNoDupes.add(new Integer(abilitiesCurrent[i]));
|
|
}
|
|
|
|
// merge current abilities with those from previous transfers
|
|
Iterator abilitiesIterator = abilitiesCurrentNoDupes.iterator();
|
|
while (abilitiesIterator.hasNext())
|
|
{
|
|
Integer ability = (Integer)abilitiesIterator.next();
|
|
abilities.add(ability);
|
|
}
|
|
|
|
// if there is at least one ability from all the previous transfers
|
|
// that the player currently doesn't have, we need to update the
|
|
// player's current abilities to include the missing abilities
|
|
if (abilities.size() != abilitiesCurrentNoDupes.size())
|
|
{
|
|
updateRequired = true;
|
|
}
|
|
}
|
|
|
|
if (updateRequired)
|
|
{
|
|
int[] abilitiesNew = new int[abilities.size()];
|
|
Iterator abilitiesIterator = abilities.iterator();
|
|
string strAbilitiesNew = new string();
|
|
int i = 0;
|
|
while (abilitiesIterator.hasNext() && (i < abilitiesNew.length))
|
|
{
|
|
Integer ability = (Integer)abilitiesIterator.next();
|
|
abilitiesNew[i] = ability.intValue();
|
|
strAbilitiesNew += "" + abilitiesNew[i] + ", ";
|
|
|
|
++i;
|
|
}
|
|
|
|
string strAbilitiesCurrent = new string();
|
|
if ((abilitiesCurrent != null) && (abilitiesCurrent.length > 0))
|
|
{
|
|
for (int j = 0; j < abilitiesCurrent.length; ++j)
|
|
{
|
|
strAbilitiesCurrent += "" + abilitiesCurrent[j] + ", ";
|
|
}
|
|
}
|
|
|
|
CustomerServiceLog("CharacterTransferRetroactiveHistory", "changing " + beast_lib.PLAYER_KNOWN_SKILLS_LIST + " objvar for " + player + " from (" + strAbilitiesCurrent + ") to (" + strAbilitiesNew + ")");
|
|
|
|
utils.setBatchObjVar(player, beast_lib.PLAYER_KNOWN_SKILLS_LIST, abilitiesNew);
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
retroactively fix up CTS stuff relating to the house packup objvars
|
|
*/
|
|
void updateHousePackupCTSObjvars(obj_id player, dictionary[] ctsOjbvars)
|
|
{
|
|
if (!isIdValid(player) || !exists(player))
|
|
return;
|
|
|
|
if ((ctsOjbvars == null) || (ctsOjbvars.length <= 0))
|
|
return;
|
|
|
|
// add all the values of the housePackup objvars from all the
|
|
// previous transfers to the current values on the character
|
|
int[] housePackupNewValues = {0, 0};
|
|
for (int i = 0; i < ctsOjbvars.length; ++i)
|
|
{
|
|
if ((ctsOjbvars[i] != null) && ctsOjbvars[i].containsKey(player_structure.HOUSE_PACKUP_ARRAY_OBJVAR) && ctsOjbvars[i].isIntArray(player_structure.HOUSE_PACKUP_ARRAY_OBJVAR))
|
|
{
|
|
int[] housePackupCTSValues = ctsOjbvars[i].getIntArray(player_structure.HOUSE_PACKUP_ARRAY_OBJVAR);
|
|
if ((housePackupCTSValues != null) && (housePackupCTSValues.length == 2))
|
|
{
|
|
if (housePackupCTSValues[0] > 0)
|
|
housePackupNewValues[0] += housePackupCTSValues[0];
|
|
|
|
if (housePackupCTSValues[1] > 0)
|
|
housePackupNewValues[1] += housePackupCTSValues[1];
|
|
}
|
|
}
|
|
}
|
|
|
|
if ((housePackupNewValues[0] > 0) || (housePackupNewValues[1] > 0))
|
|
{
|
|
int[] housePackupCurrentValues = {0, 0};
|
|
if (hasObjVar(player, player_structure.HOUSE_PACKUP_ARRAY_OBJVAR))
|
|
housePackupCurrentValues = getIntArrayObjVar(player, player_structure.HOUSE_PACKUP_ARRAY_OBJVAR);
|
|
|
|
if ((housePackupCurrentValues != null) && (housePackupCurrentValues.length == 2))
|
|
{
|
|
housePackupNewValues[0] += housePackupCurrentValues[0];
|
|
housePackupNewValues[1] += housePackupCurrentValues[1];
|
|
|
|
CustomerServiceLog("CharacterTransferRetroactiveHistory", "changing " + player_structure.HOUSE_PACKUP_ARRAY_OBJVAR + " objvar for " + player + " from (" + housePackupCurrentValues[0] + ", " + housePackupCurrentValues[1] + ") to (" + housePackupNewValues[0] + ", " + housePackupNewValues[1] + ")");
|
|
setObjVar(player, player_structure.HOUSE_PACKUP_ARRAY_OBJVAR, housePackupNewValues);
|
|
}
|
|
}
|
|
}
|
|
//Will return the status of a player in the following formats:
|
|
//If the player is online it will display: "Online <PlanetName>: <RegionName>, <CityName>
|
|
//If the player is offline it will display: "Offline <days>:<hours>:<minutes>:<seconds>
|
|
//If the obj_id is not a player it will return "Deleted"
|
|
string getOnlineOfflineStatus(obj_id player)
|
|
{
|
|
string returnData = "";
|
|
|
|
if(!isPlayer(player))
|
|
{
|
|
returnData = "Deleted";
|
|
}
|
|
else if(!isPlayerConnected(player))
|
|
{
|
|
int lastLoginTime = getPlayerLastLoginTime(player);
|
|
|
|
if(lastLoginTime > 0)
|
|
{
|
|
int timeDifference = getCalendarTime() - lastLoginTime;
|
|
|
|
if(timeDifference > 0)
|
|
{
|
|
returnData = "Offline " + utils.padTimeDHMS(timeDifference);
|
|
}
|
|
else
|
|
{
|
|
returnData = "Offline ????d:??h:??m:??s";
|
|
}
|
|
}
|
|
else
|
|
{
|
|
returnData = "Unknown";
|
|
}
|
|
}
|
|
else
|
|
{
|
|
string locText = "Unknown";
|
|
dictionary playerLoc = getConnectedPlayerLocation(player);
|
|
|
|
//failed base call - bail
|
|
if(playerLoc == null)
|
|
{
|
|
return locText;
|
|
}
|
|
|
|
string planet = playerLoc.getString("planet");
|
|
|
|
if(planet != null && planet.length() > 0)
|
|
{
|
|
locText = localize(new string_id("planet_n", planet));
|
|
}
|
|
|
|
string region = playerLoc.getString("region");
|
|
|
|
if(region != null && region.length() > 0)
|
|
{
|
|
locText += ": " + localize(new string_id(region.substring(1, region.indexOf(":")), region.substring(region.indexOf(":") + 1, region.length())));
|
|
}
|
|
|
|
string city = playerLoc.getString("playerCity");
|
|
|
|
if(city != null && city.length() > 0)
|
|
{
|
|
locText += ", " + city;
|
|
}
|
|
|
|
returnData = "Online " + locText;
|
|
}
|
|
return returnData;
|
|
}
|
|
|
|
string localizeSIDString(string text)
|
|
{
|
|
if(text == null || text.length() < 1)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
int left = 0;
|
|
|
|
if(text.startsWith("@"))
|
|
{
|
|
left = 1;
|
|
}
|
|
|
|
if(text.indexOf(":") < 0)
|
|
{
|
|
return text;
|
|
}
|
|
|
|
return localize(new string_id(text.substring(left, text.indexOf(":")), text.substring(text.indexOf(":") + 1, text.length())));
|
|
}
|
|
|
|
//function to set the color on an object. Usually called from trigger OnCustomizeFinished
|
|
//the trigger fires on the player who uses the UI generated from openCustomizationWindow
|
|
boolean colorizeItemFromWidget(obj_id player, obj_id item, string params)
|
|
{
|
|
|
|
if(!isValidId(player) || !exists(player))
|
|
{
|
|
return false;
|
|
}
|
|
if(!isValidId(item) || !exists(item))
|
|
{
|
|
utils.removeScriptVar(player, "veteranRewardItemColor.color_setting");
|
|
return false;
|
|
}
|
|
|
|
if(params == null || params.equals(""))
|
|
{
|
|
utils.removeScriptVar(player, "veteranRewardItemColor.color_setting");
|
|
return false;
|
|
}
|
|
|
|
string[] colorArray = split(params, ' ');
|
|
if(colorArray == null || colorArray.length <= 0)
|
|
{
|
|
utils.removeScriptVar(player, "veteranRewardItemColor.color_setting");
|
|
return false;
|
|
}
|
|
|
|
for(int i = 0; i < colorArray.length; i+=2)
|
|
{
|
|
if(colorArray[i] == null || colorArray[i].equals(""))
|
|
break;//if a blank entry is found bail out.
|
|
hue.setColor(item, colorArray[i], utils.stringToInt(colorArray[i+1]));
|
|
}
|
|
utils.removeScriptVar(player, "veteranRewardItemColor.color_setting");
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
* Validates number of skills on an item
|
|
* Validates the stat ranges on an item
|
|
*
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
boolean validateSkillModsAttached(obj_id item)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
int getNumCreaturesForSpawnLimit()
|
|
{
|
|
// the following formula is also duplicated in GameServerMetricsData.cpp::updateData()
|
|
const int intNumCreatures = getNumAI() - (getNumHibernatingAI() / 2);
|
|
if (intNumCreatures <= 0)
|
|
return 0;
|
|
|
|
return intNumCreatures;
|
|
}
|
|
|