uox3/source/UOXJSPropertyFuncs.cpp
Xoduz 68e57b0756 UOX3 0.99.5b-6
Increased world load speed by almost 20% by reducing how often loading progress is written to the console
Increased world save speed by almost 50% through the use of binary mode and buffer tweaks for ofstream combined with a cached newline char and std::to_string instead of static_cast
Fixed a server crash involving killing NPCs of a specific spawn region using the 'spawnkill # command
Fixed a server crash involving moving items from decaying corpses to the ground
Fixed a server crash involving carving up human corpses
Fixed a server crash related to AreaCharacterFunction JS function, which could trigger for any script that potentially kills any NPC this function iterates over (like explosion potions)
Fixed a server crash related to GMs attempting to add items from add-menu while having no backpack
Fixed a client crash issue caused by attempting to sell house deeds back to architect NPCs
Fixed an issue where players would get incorrect amounts of gold for selling house deeds back to architect NPCs
Fixed an issue with characters dying onboard boats which prevented players from packing up the boats later
Added new item property in code (via bools bitset) that can be used to enable/disable maker's mark on crafted items. This property can be set to true for items crafted at exceptional quality by GM craftsmen
Exposed the new item property to JS engine:
	.isMarkedByMaker	 	// If true, maker's mark will be displayed
Updated default item tooltip to display " of exceptional quality" for items crafted with exceptional quality
Updated default item tooltip to display "[Crafted] by [Crafter's Name]" for exceptional quality items crafted by GM craftsmen. The [Crafted] text comes from the MADEWORD defined in dfndata/skills/skills.dfn for the primary skill used to craft the item
Updated old-school single-click names for items (when AoS bit is disabled in client/server features) to display exceptional status and/or maker's mark for appropriate items
Fixed an issue with the display of titles for NPCs that used dictionary lookups for their title
Added new UOX.INI settings under the [settings] section:
	DISPLAYMAKERSMARK=1/0			// Controls if maker's marks on crafted items are shown on a global level
	SHOWNPCTITLESOVERHEAD=1/0 		// Controls whether NPC titles are shown over their heads
	SHOWINVULNERABLETAGOVERHEAD=0/1 // Controls whether invulnerable tags are shown overhead
	GLOBALRESTOCKMULTIPLIER=1.0 	// Global multiplier applied to RESTOCK property of items when loaded from DFNs
Added new UOX.INI settings under the [combat] section:
	PETCOMBATTRAINING=1/0 			// Controls whether pets can gain skills/stats from combat
	HIRELINGCOMBATTRAINING=1/0 		// Controls whether hirelings can gain skills/stats from combat
	NPCCOMBATTRAINING=0/1 			// Controls whether NPCs in general can gain skills/stats from combat
Fixed an issue where a player meeting the exact minimum requirements for crafting an item would always fail
Fixed a bug with teleporting off boats to valid nearby locations when double-clicking boat planks while standing on it
Updated behaviour of planks on boats:
	Boat key can unlock plank, but won't automatically open it
	Boat key used on an open, unlocked plank will lock and automatically close the plank
	Boat key used on an open, locked plank will unlock the plank and leave it open
	Player using an unlocked plank now opens it
	Player using an open plank will disembark (if onboard) or embark (if not) the boat
	Player can always open a locked plank if they're on the boat, even with no key, to allow disembarking the boat.
	Planks that are open, but locked cannot be accessed from outside the boat, and will close automatically after five of seconds
Updated behaviour of Magic Lock/Unlock spells:
	Magic Lock cannot be used on objects inside a multi
	Magic Lock applies difficulty to lock based on caster's Magery skill
	Magic Lock effect will last between 7 to 50 seconds (depending on caster's Magery skill)
	Any object that can be locked via Magic Lock spell can also be unlocked via Magic Unlock spell, if caster has high enough Magery skill
Fixed a bug where certain JS Functions, Methods and Properties would occasionally pass incorrect values to scripts that called upon them. Scripts that rely on the GetCurrentClock() Function, the .GetTimer() Method, .decayTime, .logTime, .oreTime and .fishTime Properties might need to be updated to account for the fix, which causes larger values to be passed in than before.
Fixed a bug related to GetCurrentClock() that caused decay and respawning of dungeon chests from working properly
Fixed a bug related to GetCurrentClock() and .logTime/.fishTime that prevented consumption and regeneration of log/fish resources from working properly
Added a new JS Function:
	GetStartTime()	// Returns a timestamp for when server started up
Fixed a bug related to GetCurrentClock() where server uptime stats in help menu was showing up incorrectly
Fixed a bug related to GetCurrentClock() and purging of registrations of visitors in public houses so their visits can be counted again later
Fixed a bug related to GetCurrentClock() that caused monster speech to not work properly
Fixed a Z-related issue that sometimes prevented players from fishing when standing on the shoreline next to the sea
Fixed an issue with Animal Lore skill that would always return a pet's loyalty level as "Wild"
Increased max range pets can be from their owner in order to still be included in moongate/teleporter travel from 12 to 24 tiles
Fixed an issue where the alchemy bonus damage for explosion potions was off by an order of magnitude
Fixed an issue where food IDs from foodlists referenced by other foodlists was not detected as valid food for tamed pets or NPCs
Fixed an issue where Alchemy crafting skill did not properly check for the existence of the crafting tool before proceeding with the crafting process
Fixed an issue that prevented the Teleport spell from working as intended
Fixed an issue where players would still get 1 gold even if STARTGOLD in uox.ini was set to 0
Fixed an issue with mount restrictions script that prevented players from mounting Unicorns, Ki-rins and Cu Sidhes
Fixed an issue where aggressive creatures wouldn't stop attacking player after being tamed (js/skill/taming.js)
Added a system message to inform the player when they've dropped out of stealth due to taking too many steps
Fixed an issue where hunger level of NPCs instantly dropped upon spawning because hunger timer was not active yet
Fixed a bug where character corpses would appear with a [unidentified] tag attached
Fixed an issue where the [unidentified] tag did not show up for unidentified magic items
Added ANIMAL tag to a small bunch of creature definitions (dfndata/creatures/creatures.dfn)
Fixed an issue with Bowcraft skill where player could not gain enough skill from crafting bows to reach min requirement for crossbows, and similiarly could not reach min requirement for heavy crossbows from crossbows
Updated default value of MURDERDECAYTIMER INI setting from 60 seconds to 28800 seconds (8 hours), to match the amount of time it would take for one (short term) murder count to decay on LBR-era OSI shards.
2022-08-25 02:13:00 +08:00

3529 lines
132 KiB
C++

//o-----------------------------------------------------------------------------------------------o
//| File - UOXJSPropertyFuncts.cpp
//| Date - 12/14/2001
//o-----------------------------------------------------------------------------------------------o
//| Purpose - 1.0 14th December, 2001 Initial implementation
//| Includes property getters for CItem and CChar, and property
//| setters for CChar
//o-----------------------------------------------------------------------------------------------o
#include "uox3.h"
#include "UOXJSClasses.h"
#include "UOXJSPropertySpecs.h"
#include "UOXJSPropertyEnums.h"
#include "UOXJSPropertyFuncs.h"
#include "JSEncapsulate.h"
#include "CJSEngine.h"
#include "cGuild.h"
#include "combat.h"
#include "townregion.h"
#include "cRaces.h"
#include "skills.h"
#include "CJSMapping.h"
#include "cScript.h"
#include "regions.h"
#include "magic.h"
#include "cMagic.h"
#include "scriptc.h"
#include "ssection.h"
#include "classes.h"
#include "movement.h"
#include "Dictionary.h"
#include "cSpawnRegion.h"
#include "jsobj.h"
#include "jsutil.h"
#include "PartySystem.h"
void MakeShop( CChar *c );
JSBool CGuildsProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
*vp = INT_TO_JSVAL(0);
return JS_TRUE;
}
JSBool CGuildsProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
return JS_TRUE;
}
JSBool CSpellsProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
size_t SpellID = JSVAL_TO_INT(id);
if( SpellID >= Magic->spells.size() )
{
Console.error( oldstrutil::format( "Spells: Invalid Spell ID (%i) provided", SpellID )); // Revise please...
*vp = JSVAL_NULL;
return JS_FALSE;
}
SpellInfo *mySpell = &Magic->spells[SpellID];
if( mySpell == nullptr )
{
Console.error( oldstrutil::format( "Spells: Invalid Spell with SpellID %i", SpellID ));
*vp = JSVAL_NULL;
return JS_FALSE;
}
JSObject *jsSpell = JS_NewObject( cx, &UOXSpell_class, nullptr, obj );
JS_DefineProperties( cx, jsSpell, CSpellProperties );
JS_SetPrivate( cx, jsSpell, mySpell );
*vp = OBJECT_TO_JSVAL( jsSpell );
return JS_TRUE;
}
JSBool CSpellProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
return JS_TRUE;
}
JSBool CSpellProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
SpellInfo *gPriv = static_cast<SpellInfo*>(JS_GetPrivate( cx, obj ));
if( gPriv == nullptr )
return JS_FALSE;
std::string spellName = "";
if( JSVAL_IS_INT( id ) )
{
JSString *tString = nullptr;
bool bDone = false;
size_t i = 0;
switch( JSVAL_TO_INT( id ) )
{
case CSP_ID:
for( i = 0; i < Magic->spells.size() && !bDone; ++i )
{
if( &Magic->spells[i] == gPriv )
{
*vp = INT_TO_JSVAL( i );
bDone = true;
}
}
break;
case CSP_ACTION: *vp = INT_TO_JSVAL( gPriv->Action() ); break;
case CSP_BASEDMG: *vp = INT_TO_JSVAL( gPriv->BaseDmg() ); break;
case CSP_DELAY: JS_NewNumberValue( cx, gPriv->Delay(), vp ); break;
case CSP_DAMAGEDELAY: JS_NewNumberValue( cx, gPriv->DamageDelay(), vp ); break;
case CSP_RECOVERYDELAY: JS_NewNumberValue( cx, gPriv->RecoveryDelay(), vp ); break;
case CSP_HEALTH: *vp = INT_TO_JSVAL( gPriv->Health() ); break;
case CSP_STAMINA: *vp = INT_TO_JSVAL( gPriv->Stamina() ); break;
case CSP_MANA: *vp = INT_TO_JSVAL( gPriv->Mana() ); break;
case CSP_MANTRA: tString = JS_NewStringCopyZ( cx, gPriv->Mantra().c_str() );
*vp = STRING_TO_JSVAL( tString );
break;
case CSP_NAME: for( i = 0; i < Magic->spells.size() && !bDone; ++i )
{
if( &Magic->spells[i] == gPriv - 1 )
{
spellName = Dictionary->GetEntry( magic_table[i].spell_name );
tString = JS_NewStringCopyZ( cx, spellName.c_str() );
*vp = STRING_TO_JSVAL( tString );
bDone = true;
}
}
break;
case CSP_STRTOSAY: tString = JS_NewStringCopyZ( cx, gPriv->StringToSay().c_str() );
*vp = STRING_TO_JSVAL( tString );
break;
case CSP_SCROLLLOW: *vp = INT_TO_JSVAL( gPriv->ScrollLow() ); break;
case CSP_SCROLLHIGH: *vp = INT_TO_JSVAL( gPriv->ScrollHigh() ); break;
case CSP_CIRCLE: *vp = INT_TO_JSVAL( gPriv->Circle() ); break;
case CSP_LOWSKILL: *vp = INT_TO_JSVAL( gPriv->LowSkill() ); break;
case CSP_HIGHSKILL: *vp = INT_TO_JSVAL( gPriv->HighSkill() ); break;
case CSP_GINSENG: *vp = INT_TO_JSVAL( gPriv->Reagants().ginseng ); break;
case CSP_MOSS: *vp = INT_TO_JSVAL( gPriv->Reagants().moss ); break;
case CSP_DRAKE: *vp = INT_TO_JSVAL( gPriv->Reagants().drake ); break;
case CSP_PEARL: *vp = INT_TO_JSVAL( gPriv->Reagants().pearl ); break;
case CSP_SILK: *vp = INT_TO_JSVAL( gPriv->Reagants().silk ); break;
case CSP_ASH: *vp = INT_TO_JSVAL( gPriv->Reagants().ash ); break;
case CSP_SHADE: *vp = INT_TO_JSVAL( gPriv->Reagants().shade ); break;
case CSP_GARLIC: *vp = INT_TO_JSVAL( gPriv->Reagants().garlic ); break;
case CSP_REQUIRETARGET: *vp = BOOLEAN_TO_JSVAL( gPriv->RequireTarget() ); break;
case CSP_REQUIREITEM: *vp = BOOLEAN_TO_JSVAL( gPriv->RequireItemTarget() ); break;
case CSP_REQUIRECHAR: *vp = BOOLEAN_TO_JSVAL( gPriv->RequireCharTarget() ); break;
case CSP_REQUIRELOCATION: *vp = BOOLEAN_TO_JSVAL( gPriv->RequireLocTarget() ); break;
case CSP_TRAVELSPELL: *vp = BOOLEAN_TO_JSVAL( gPriv->TravelSpell() ); break;
case CSP_FIELDSPELL: *vp = BOOLEAN_TO_JSVAL( gPriv->FieldSpell() ); break;
case CSP_REFLECTABLE: *vp = BOOLEAN_TO_JSVAL( gPriv->SpellReflectable() ); break;
case CSP_AGGRESSIVESPELL: *vp = BOOLEAN_TO_JSVAL( gPriv->AggressiveSpell() ); break;
case CSP_RESISTABLE: *vp = BOOLEAN_TO_JSVAL( gPriv->Resistable() ); break;
case CSP_SOUNDEFFECT: *vp = INT_TO_JSVAL( gPriv->Effect() ); break;
case CSP_ENABLED: *vp = BOOLEAN_TO_JSVAL( gPriv->Enabled() ); break;
default: break;
}
}
return JS_TRUE;
}
JSBool CGlobalSkillsProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
size_t skillID = JSVAL_TO_INT(id);
if( skillID > THROWING )
{
Console.error( "Invalid Skill ID, must be between 0 and 57" ); // Revise please...
*vp = JSVAL_NULL;
return JS_FALSE;
}
CWorldMain::skill_st *mySkill = &cwmWorldState->skill[skillID];
if( mySkill == nullptr )
{
Console.error( "Invalid Skill" );
*vp = JSVAL_NULL;
return JS_FALSE;
}
JSObject *jsSkill = JS_NewObject( cx, &UOXGlobalSkill_class, nullptr, obj );
JS_DefineProperties( cx, jsSkill, CGlobalSkillProperties );
JS_SetPrivate( cx, jsSkill, mySkill );
*vp = OBJECT_TO_JSVAL( jsSkill );
return JS_TRUE;
}
JSBool CGlobalSkillProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
return JS_TRUE;
}
JSBool CGlobalSkillProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
CWorldMain::skill_st *gPriv = static_cast<CWorldMain::skill_st*>( JS_GetPrivate( cx, obj ) );
if( gPriv == nullptr )
return JS_FALSE;
std::string skillName = "";
if( JSVAL_IS_INT( id ) )
{
JSString *tString = nullptr;
// size_t i = 0;
switch( JSVAL_TO_INT( id ) )
{
case CGSKILL_NAME:
tString = JS_NewStringCopyZ( cx, gPriv->name.c_str() );
*vp = STRING_TO_JSVAL( tString );
break;
case CGSKILL_MADEWORD:
tString = JS_NewStringCopyZ( cx, gPriv->madeword.c_str() );
*vp = STRING_TO_JSVAL( tString );
break;
case CGSKILL_STRENGTH: *vp = INT_TO_JSVAL( gPriv->strength ); break;
case CGSKILL_DEXTERITY: *vp = INT_TO_JSVAL( gPriv->dexterity ); break;
case CGSKILL_INTELLIGENCE: *vp = INT_TO_JSVAL( gPriv->intelligence ); break;
case CGSKILL_SKILLDELAY: *vp = INT_TO_JSVAL( gPriv->skillDelay ); break;
case CGSKILL_SCRIPTID: *vp = INT_TO_JSVAL( gPriv->jsScript ); break;
default: break;
}
}
return JS_TRUE;
}
JSBool CTimerProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
if( JSVAL_IS_INT( id ) )
{
switch( JSVAL_TO_INT( id ) )
{
// Character timers (PC and NPC)
case TIMER_TIMEOUT: *vp = INT_TO_JSVAL( tCHAR_TIMEOUT ); break;
case TIMER_INVIS: *vp = INT_TO_JSVAL( tCHAR_INVIS ); break;
case TIMER_HUNGER: *vp = INT_TO_JSVAL( tCHAR_HUNGER ); break;
case TIMER_THIRST: *vp = INT_TO_JSVAL( tCHAR_THIRST ); break;
case TIMER_POISONTIME: *vp = INT_TO_JSVAL( tCHAR_POISONTIME ); break;
case TIMER_POISONTEXT: *vp = INT_TO_JSVAL( tCHAR_POISONTEXT ); break;
case TIMER_POISONWEAROFF: *vp = INT_TO_JSVAL( tCHAR_POISONWEAROFF ); break;
case TIMER_SPELLTIME: *vp = INT_TO_JSVAL( tCHAR_SPELLTIME ); break;
case TIMER_SPELLRECOVERYTIME: *vp = INT_TO_JSVAL( tCHAR_SPELLRECOVERYTIME ); break;
case TIMER_ANTISPAM: *vp = INT_TO_JSVAL( tCHAR_ANTISPAM ); break;
case TIMER_CRIMFLAG: *vp = INT_TO_JSVAL( tCHAR_CRIMFLAG ); break;
case TIMER_MURDERRATE: *vp = INT_TO_JSVAL( tCHAR_MURDERRATE ); break;
case TIMER_PEACETIMER: *vp = INT_TO_JSVAL( tCHAR_PEACETIMER ); break;
case TIMER_FLYINGTOGGLE: *vp = INT_TO_JSVAL( tCHAR_FLYINGTOGGLE ); break;
case TIMER_FIREFIELDTICK: *vp = INT_TO_JSVAL( tCHAR_FIREFIELDTICK ); break;
case TIMER_POISONFIELDTICK: *vp = INT_TO_JSVAL( tCHAR_POISONFIELDTICK );break;
case TIMER_PARAFIELDTICK: *vp = INT_TO_JSVAL( tCHAR_PARAFIELDTICK ); break;
case TIMER_MOVETIME: *vp = INT_TO_JSVAL( tNPC_MOVETIME ); break;
case TIMER_SPATIMER: *vp = INT_TO_JSVAL( tNPC_SPATIMER ); break;
case TIMER_SUMMONTIME: *vp = INT_TO_JSVAL( tNPC_SUMMONTIME ); break;
case TIMER_EVADETIME: *vp = INT_TO_JSVAL( tNPC_EVADETIME ); break;
case TIMER_LOYALTYTIME: *vp = INT_TO_JSVAL( tNPC_LOYALTYTIME ); break;
case TIMER_LOGOUT: *vp = INT_TO_JSVAL( tPC_LOGOUT ); break;
// Socket Timers (PC only)
case TIMER_SOCK_SKILLDELAY: *vp = INT_TO_JSVAL( tPC_SKILLDELAY ); break;
case TIMER_SOCK_OBJDELAY: *vp = INT_TO_JSVAL( tPC_OBJDELAY ); break;
case TIMER_SOCK_SPIRITSPEAK: *vp = INT_TO_JSVAL( tPC_SPIRITSPEAK ); break;
case TIMER_SOCK_TRACKING: *vp = INT_TO_JSVAL( tPC_TRACKING ); break;
case TIMER_SOCK_FISHING: *vp = INT_TO_JSVAL( tPC_FISHING ); break;
case TIMER_SOCK_MUTETIME: *vp = INT_TO_JSVAL( tPC_MUTETIME ); break;
case TIMER_SOCK_TRACKINGDISPLAY: *vp = INT_TO_JSVAL( tPC_TRACKINGDISPLAY ); break;
case TIMER_SOCK_TRAFFICWARDEN: *vp = INT_TO_JSVAL( tPC_TRAFFICWARDEN ); break;
default:
break;
}
}
return JS_TRUE;
}
JSBool CCreateEntriesProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
UI16 createEntryID = static_cast<UI16>(JSVAL_TO_INT( id ));
createEntry *myCreateEntry = Skills->FindItem( createEntryID );
if( myCreateEntry == nullptr )
{
Console.error( oldstrutil::format( "Invalid create entry ID (%i)", createEntryID ) );
*vp = JSVAL_NULL;
return JS_FALSE;
}
JSObject *jsCreateEntry = JS_NewObject( cx, &UOXCreateEntry_class, nullptr, obj );
JS_DefineProperties( cx, jsCreateEntry, CCreateEntryProperties );
JS_SetPrivate( cx, jsCreateEntry, myCreateEntry );
*vp = OBJECT_TO_JSVAL( jsCreateEntry );
return JS_TRUE;
}
JSBool CCreateEntryProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
return JS_TRUE;
}
JSBool CCreateEntryProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
createEntry *gPriv = static_cast<createEntry*>( JS_GetPrivate( cx, obj ) );
if( gPriv == nullptr )
return JS_FALSE;
if( JSVAL_IS_INT( id ) )
{
JSString *tString = nullptr;
switch( JSVAL_TO_INT( id ) )
{
case CMAKE_ID:
*vp = INT_TO_JSVAL( gPriv->targID );
break;
case CMAKE_NAME:
{
std::string createName = gPriv->name;
tString = JS_NewStringCopyZ( cx, createName.c_str() );
*vp = STRING_TO_JSVAL( tString );
break;
}
case CMAKE_ADDITEM:
{
std::string addItem = gPriv->addItem;
tString = JS_NewStringCopyZ( cx, addItem.c_str() );
*vp = STRING_TO_JSVAL( tString );
break;
}
case CMAKE_COLOUR: *vp = INT_TO_JSVAL( gPriv->colour ); break;
case CMAKE_SOUND: *vp = INT_TO_JSVAL( gPriv->soundPlayed ); break;
case CMAKE_MINRANK: *vp = INT_TO_JSVAL( gPriv->minRank ); break;
case CMAKE_MAXRANK: *vp = INT_TO_JSVAL( gPriv->maxRank ); break;
case CMAKE_DELAY: *vp = INT_TO_JSVAL( gPriv->delay ); break;
case CMAKE_SPELL: *vp = INT_TO_JSVAL( gPriv->spell ); break;
case CMAKE_RESOURCES:
{
resAmountPair resEntry;
std::vector< resAmountPair > resourcesNeeded = gPriv->resourceNeeded;
// Loop through each resource required, and add them to a JSObject
jsval amountNeeded = 0;
jsval targColour = 0;
JSObject *resources = JS_NewArrayObject( cx, 0, nullptr );
for( int i = 0; i < resourcesNeeded.size(); i++ )
{
resEntry = resourcesNeeded[i];
amountNeeded = INT_TO_JSVAL( resEntry.amountNeeded );
targColour = INT_TO_JSVAL( resEntry.colour );
// Add each required resource as its own object
JSObject *resource = JS_NewArrayObject( cx, 0, nullptr );
JS_SetElement( cx, resource, 0, &amountNeeded );
JS_SetElement( cx, resource, 1, &targColour );
// Make a child object with all the supported resource IDs
JSObject *idList = JS_NewArrayObject( cx, 0, nullptr );
for( int j = 0; j < resEntry.idList.size(); j++ )
{
jsval targID = INT_TO_JSVAL( resEntry.idList[j] );
JS_SetElement( cx, idList, j, &targID );
}
jsval idListVal = OBJECT_TO_JSVAL( idList );
JS_SetElement( cx, resource, 2, &idListVal );
// Now stuff the resource object into the parent object
jsval resourceVal = OBJECT_TO_JSVAL( resource );
JS_SetElement( cx, resources, i, &resourceVal );
}
*vp = OBJECT_TO_JSVAL( resources );
break;
}
case CMAKE_SKILLS:
{
resSkillReq resEntry;
std::vector< resSkillReq > skillReqs = gPriv->skillReqs;
// Loop through each skill required, and add the details to a JSObject
jsval skillNumber = 0;
jsval minSkill = 0;
jsval maxSkill = 0;
JSObject *skills = JS_NewArrayObject( cx, 0, nullptr );
for( int i = 0; i < skillReqs.size(); i++ )
{
resEntry = skillReqs[i];
skillNumber = INT_TO_JSVAL( resEntry.skillNumber );
minSkill = INT_TO_JSVAL( resEntry.minSkill );
maxSkill = INT_TO_JSVAL( resEntry.maxSkill );
// Add each required skill as its own object
JSObject *skill = JS_NewArrayObject( cx, 0, nullptr );
JS_SetElement( cx, skill, 0, &skillNumber );
JS_SetElement( cx, skill, 1, &minSkill );
JS_SetElement( cx, skill, 2, &maxSkill );
// Now stuff the skill object into the parent object
jsval skillVal = OBJECT_TO_JSVAL( skill );
JS_SetElement( cx, skills, i, &skillVal );
}
*vp = OBJECT_TO_JSVAL( skills );
break;
}
case CMAKE_AVGMINSKILL: *vp = INT_TO_JSVAL( gPriv->AverageMinSkill() ); break;
case CMAKE_AVGMAXSKILL: *vp = INT_TO_JSVAL( gPriv->AverageMaxSkill() ); break;
}
}
return JS_TRUE;
}
JSBool CItemProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
CItem *gPriv = static_cast<CItem *>(JS_GetPrivate( cx, obj ));
SERIAL TempSerial = INVALIDSERIAL;
if( !ValidateObject( gPriv ) )
return JS_FALSE;
if( JSVAL_IS_INT( id ) )
{
JSString *tString = nullptr;
switch( JSVAL_TO_INT( id ) )
{
case CIP_NAME:
tString = JS_NewStringCopyZ( cx, gPriv->GetName().c_str() );
*vp = STRING_TO_JSVAL( tString );
break;
case CIP_TITLE:
tString = JS_NewStringCopyZ( cx, gPriv->GetTitle().c_str() );
*vp = STRING_TO_JSVAL( tString );
break;
case CIP_X: *vp = INT_TO_JSVAL( gPriv->GetX() ); break;
case CIP_Y: *vp = INT_TO_JSVAL( gPriv->GetY() ); break;
case CIP_Z: *vp = INT_TO_JSVAL( gPriv->GetZ() ); break;
case CIP_OLDX:
{
auto oldLocation = gPriv->GetOldLocation();
*vp = INT_TO_JSVAL( oldLocation.x );
break;
}
case CIP_OLDY:
{
auto oldLocation = gPriv->GetOldLocation();
*vp = INT_TO_JSVAL( oldLocation.y );
break;
}
case CIP_OLDZ:
{
auto oldLocation = gPriv->GetOldLocation();
*vp = INT_TO_JSVAL( oldLocation.z );
break;
}
case CIP_ID: *vp = INT_TO_JSVAL( gPriv->GetID() ); break;
case CIP_COLOUR: *vp = INT_TO_JSVAL( gPriv->GetColour() ); break;
case CIP_OWNER:
CChar *pOwner;
pOwner = gPriv->GetOwnerObj();
if( !ValidateObject( pOwner ) )
*vp = JSVAL_NULL;
else
{
// Otherwise Acquire an object
JSObject *myObj = JSEngine->AcquireObject( IUE_CHAR, pOwner, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myObj );
}
break;
case CIP_VISIBLE: *vp = INT_TO_JSVAL( (UI08)gPriv->GetVisible() ); break;
case CIP_SERIAL:
{
if( !INT_FITS_IN_JSVAL( gPriv->GetSerial() ) )
{
JS_NewNumberValue( cx, gPriv->GetSerial(), vp );
}
else
{
*vp = INT_TO_JSVAL( gPriv->GetSerial() );
}
break;
}
case CIP_HEALTH: *vp = INT_TO_JSVAL( gPriv->GetHP() ); break;
case CIP_SCRIPTTRIGGER:
{
// For backwards compatibility, get last scripttrigger from vector
// For older worldfiles, this will be the only scripttrigger added to the vector after load
std::vector<UI16> scriptTriggers = gPriv->GetScriptTriggers();
UI16 lastScriptTrigger = 0;
auto numberOfTriggers = scriptTriggers.size();
if( numberOfTriggers > 0 )
{
lastScriptTrigger = scriptTriggers[numberOfTriggers-1];
}
*vp = INT_TO_JSVAL( lastScriptTrigger );
break;
}
case CIP_SCRIPTTRIGGERS:
{
jsval scriptID;
JSObject *scriptTriggersJS = JS_NewArrayObject(cx, 0, nullptr);
std::vector<UI16> scriptTriggers = gPriv->GetScriptTriggers();
for( int i = 0; i < scriptTriggers.size(); i++ )
{
scriptID = INT_TO_JSVAL( scriptTriggers[i] );
JS_SetElement(cx, scriptTriggersJS, i, &scriptID);
}
*vp = OBJECT_TO_JSVAL( scriptTriggersJS );
break;
}
case CIP_WORLDNUMBER: *vp = INT_TO_JSVAL( gPriv->WorldNumber() ); break;
case CIP_INSTANCEID: *vp = INT_TO_JSVAL( gPriv->GetInstanceID() ); break;
case CIP_AMOUNT: *vp = INT_TO_JSVAL( gPriv->GetAmount() ); break;
// We should Accquie an object here and return that, so you can do
// item.container.name
case CIP_CONTAINER:
TempSerial = gPriv->GetContSerial();
if( TempSerial == INVALIDSERIAL )
// Return a JS_NULL
*vp = JSVAL_NULL;
else
{
// Otherwise Acquire an object
if( TempSerial >= BASEITEMSERIAL ) // item's have serials of 0x40000000 and above, and we already know it's not INVALIDSERIAL
{
CItem *myCont = calcItemObjFromSer( TempSerial );
if( ValidateObject( myCont ) )
{
JSObject *myItem = JSEngine->AcquireObject( IUE_ITEM, myCont, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myItem );
}
else
*vp = JSVAL_NULL;
}
else
{
CChar *chCont = calcCharObjFromSer( TempSerial );
if( ValidateObject( chCont ) )
{
JSObject *myChar = JSEngine->AcquireObject( IUE_CHAR, chCont, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myChar );
}
else
*vp = JSVAL_NULL;
}
}
break;
case CIP_TYPE: *vp = INT_TO_JSVAL( static_cast<UI16>(gPriv->GetType()) ); break;
case CIP_MORE:
{
if( !INT_FITS_IN_JSVAL( gPriv->GetTempVar( CITV_MORE ) ) )
{
JS_NewNumberValue( cx, gPriv->GetTempVar( CITV_MORE ), vp );
}
else
{
*vp = INT_TO_JSVAL( gPriv->GetTempVar( CITV_MORE ) );
}
break;
}
case CIP_MOREX:
{
if( !INT_FITS_IN_JSVAL( gPriv->GetTempVar( CITV_MOREX ) ) )
{
JS_NewNumberValue( cx, gPriv->GetTempVar( CITV_MOREX ), vp );
}
else
{
*vp = INT_TO_JSVAL( gPriv->GetTempVar( CITV_MOREX ) );
}
break;
}
case CIP_MOREY:
{
if( !INT_FITS_IN_JSVAL( gPriv->GetTempVar( CITV_MOREY ) ) )
{
JS_NewNumberValue( cx, gPriv->GetTempVar( CITV_MOREY ), vp );
}
else
{
*vp = INT_TO_JSVAL( gPriv->GetTempVar( CITV_MOREY ) );
}
break;
}
case CIP_MOREZ:
{
if( !INT_FITS_IN_JSVAL( gPriv->GetTempVar( CITV_MOREZ ) ) )
{
JS_NewNumberValue( cx, gPriv->GetTempVar( CITV_MOREZ ), vp );
}
else
{
*vp = INT_TO_JSVAL( gPriv->GetTempVar( CITV_MOREZ ) );
}
break;
}
case CIP_MOVABLE: *vp = INT_TO_JSVAL( gPriv->GetMovable() ); break;
case CIP_ATT: *vp = INT_TO_JSVAL( RandomNum( gPriv->GetLoDamage(), gPriv->GetHiDamage() ) ); break;
case CIP_LAYER: *vp = INT_TO_JSVAL( gPriv->GetLayer() ); break;
case CIP_ITEMSINSIDE: *vp = INT_TO_JSVAL( gPriv->GetContainsList()->Num() ); break;
case CIP_TOTALITEMCOUNT: *vp = INT_TO_JSVAL( GetTotalItemCount( gPriv ) ); break;
case CIP_DECAYABLE: *vp = BOOLEAN_TO_JSVAL( gPriv->isDecayable() ); break;
case CIP_DECAYTIME: JS_NewNumberValue( cx, gPriv->GetDecayTime(), vp ); break;
case CIP_LODAMAGE: *vp = INT_TO_JSVAL( gPriv->GetLoDamage() ); break;
case CIP_HIDAMAGE: *vp = INT_TO_JSVAL( gPriv->GetHiDamage() ); break;
case CIP_AC: *vp = INT_TO_JSVAL( gPriv->GetArmourClass() ); break;
case CIP_DEF: *vp = INT_TO_JSVAL( gPriv->GetResist( PHYSICAL ) ); break;
case CIP_RESISTCOLD: *vp = INT_TO_JSVAL( gPriv->GetResist( COLD ) ); break;
case CIP_RESISTHEAT: *vp = INT_TO_JSVAL( gPriv->GetResist( HEAT ) ); break;
case CIP_RESISTLIGHT: *vp = INT_TO_JSVAL( gPriv->GetResist( LIGHT ) ); break;
case CIP_RESISTLIGHTNING: *vp = INT_TO_JSVAL( gPriv->GetResist( LIGHTNING ) );break;
case CIP_RESISTPOISON: *vp = INT_TO_JSVAL( gPriv->GetResist( POISON ) ); break;
case CIP_RESISTRAIN: *vp = INT_TO_JSVAL( gPriv->GetResist( RAIN ) ); break;
case CIP_RESISTSNOW: *vp = INT_TO_JSVAL( gPriv->GetResist( SNOW ) ); break;
case CIP_DAMAGECOLD: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( COLD ) ); break;
case CIP_DAMAGEHEAT: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( HEAT ) ); break;
case CIP_DAMAGELIGHT: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( LIGHT ) ); break;
case CIP_DAMAGELIGHTNING: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( LIGHTNING ) ); break;
case CIP_DAMAGEPOISON: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( POISON ) ); break;
case CIP_DAMAGERAIN: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( RAIN ) ); break;
case CIP_DAMAGESNOW: *vp = BOOLEAN_TO_JSVAL( gPriv->GetWeatherDamage( SNOW ) ); break;
case CIP_SPEED: *vp = INT_TO_JSVAL( gPriv->GetSpeed() ); break;
case CIP_NAME2:
tString = JS_NewStringCopyZ( cx, gPriv->GetName2().c_str() );
*vp = STRING_TO_JSVAL( tString );
break;
case CIP_ISCHAR: *vp = JSVAL_FALSE; break;
case CIP_ISITEM: *vp = JSVAL_TRUE; break;
case CIP_ISSPAWNER: *vp = BOOLEAN_TO_JSVAL(gPriv->GetObjType() == OT_SPAWNER); break;
case CIP_RACE:
{
CRace *TempRace = nullptr;
TempRace = Races->Race( gPriv->GetRace() );
if( TempRace == nullptr )
{
*vp = JSVAL_NULL;
}
else
{
// Otherwise Acquire an object
JSObject *myRace = JSEngine->AcquireObject( IUE_RACE, TempRace, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myRace );
}
break;
}
case CIP_MAXHP: *vp = INT_TO_JSVAL( gPriv->GetMaxHP() ); break;
case CIP_MAXUSES: *vp = INT_TO_JSVAL( gPriv->GetMaxUses() ); break;
case CIP_USESLEFT: *vp = INT_TO_JSVAL( gPriv->GetUsesLeft() ); break;
case CIP_RANK: *vp = INT_TO_JSVAL( gPriv->GetRank() ); break;
case CIP_CREATOR: *vp = INT_TO_JSVAL( gPriv->GetCreator() ); break;
case CIP_POISON: *vp = INT_TO_JSVAL( gPriv->GetPoisoned() ); break;
case CIP_DIR: *vp = INT_TO_JSVAL( gPriv->GetDir() ); break;
case CIP_WIPABLE: *vp = INT_TO_JSVAL( gPriv->isWipeable() ); break;
case CIP_BUYVALUE: *vp = INT_TO_JSVAL( gPriv->GetBuyValue() ); break;
case CIP_SELLVALUE: *vp = INT_TO_JSVAL( gPriv->GetSellValue() ); break;
case CIP_RESTOCK: *vp = INT_TO_JSVAL( gPriv->GetRestock() ); break;
case CIP_DIVINELOCK: *vp = BOOLEAN_TO_JSVAL( gPriv->isDivineLocked() ); break;
case CIP_WEIGHT: *vp = INT_TO_JSVAL( gPriv->GetWeight() ); break;
case CIP_WEIGHTMAX: *vp = INT_TO_JSVAL( gPriv->GetWeightMax() ); break;
case CIP_BASEWEIGHT: *vp = INT_TO_JSVAL( gPriv->GetBaseWeight() ); break;
case CIP_MAXITEMS: *vp = INT_TO_JSVAL( gPriv->GetMaxItems() ); break;
case CIP_STRENGTH: *vp = INT_TO_JSVAL( gPriv->GetStrength() ); break;
case CIP_DEXTERITY: *vp = INT_TO_JSVAL( gPriv->GetDexterity() ); break;
case CIP_INTELLIGENCE: *vp = INT_TO_JSVAL( gPriv->GetIntelligence() ); break;
case CIP_CORPSE: *vp = BOOLEAN_TO_JSVAL( gPriv->isCorpse() ); break;
case CIP_DESC:
tString = JS_NewStringCopyZ( cx, gPriv->GetDesc().c_str() );
*vp = STRING_TO_JSVAL( tString );
break;
case CIP_EVENT:
tString = JS_NewStringCopyZ( cx, gPriv->GetEvent().c_str() );
*vp = STRING_TO_JSVAL( tString );
break;
case CIP_TEMPTIMER: *vp = INT_TO_JSVAL( gPriv->GetTempTimer() / 1000 ); break;
case CIP_SHOULDSAVE: *vp = BOOLEAN_TO_JSVAL( gPriv->ShouldSave() ); break;
case CIP_ISNEWBIE: *vp = BOOLEAN_TO_JSVAL( gPriv->isNewbie() ); break;
case CIP_ISDISPELLABLE: *vp = BOOLEAN_TO_JSVAL( gPriv->isDispellable() ); break;
case CIP_MADEWITH: *vp = INT_TO_JSVAL( gPriv->GetMadeWith() ); break;
case CIP_ENTRYMADEFROM: *vp = INT_TO_JSVAL( gPriv->EntryMadeFrom() ); break;
case CIP_ISPILEABLE: *vp = BOOLEAN_TO_JSVAL( gPriv->isPileable() ); break;
case CIP_ISMARKEDBYMAKER: *vp = BOOLEAN_TO_JSVAL( gPriv->isMarkedByMaker() ); break;
case CIP_ISDYEABLE: *vp = BOOLEAN_TO_JSVAL( gPriv->isDyeable() ); break;
case CIP_ISDAMAGEABLE: *vp = BOOLEAN_TO_JSVAL( gPriv->isDamageable() ); break;
case CIP_ISWIPEABLE: *vp = BOOLEAN_TO_JSVAL( gPriv->isWipeable() ); break;
case CIP_ISGUARDED: *vp = BOOLEAN_TO_JSVAL( gPriv->isGuarded() ); break;
case CIP_ISDOOROPEN: *vp = BOOLEAN_TO_JSVAL( gPriv->isDoorOpen() ); break;
case CIP_ISFIELDSPELL: *vp = BOOLEAN_TO_JSVAL( gPriv->IsFieldSpell() ); break;
case CIP_ISLOCKEDDOWN: *vp = BOOLEAN_TO_JSVAL( gPriv->IsLockedDown() ); break;
case CIP_ISSHIELDTYPE: *vp = BOOLEAN_TO_JSVAL( gPriv->IsShieldType() ); break;
case CIP_ISMETALTYPE: *vp = BOOLEAN_TO_JSVAL( gPriv->IsMetalType() ); break;
case CIP_ISLEATHERTYPE: *vp = BOOLEAN_TO_JSVAL( gPriv->IsLeatherType() ); break;
case CIP_CANBELOCKEDDOWN: *vp = BOOLEAN_TO_JSVAL( gPriv->CanBeLockedDown() ); break;
case CIP_ISCONTTYPE: *vp = BOOLEAN_TO_JSVAL( gPriv->IsContType() ); break;
case CIP_CARVESECTION: *vp = INT_TO_JSVAL( gPriv->GetCarve() ); break;
case CIP_AMMOID: *vp = INT_TO_JSVAL( gPriv->GetAmmoID() ); break;
case CIP_AMMOHUE: *vp = INT_TO_JSVAL( gPriv->GetAmmoHue() ); break;
case CIP_AMMOFX: *vp = INT_TO_JSVAL( gPriv->GetAmmoFX() ); break;
case CIP_AMMOFXHUE: *vp = INT_TO_JSVAL( gPriv->GetAmmoFXHue() ); break;
case CIP_AMMOFXRENDER: *vp = INT_TO_JSVAL( gPriv->GetAmmoFXRender() ); break;
case CIP_MAXRANGE: *vp = INT_TO_JSVAL( gPriv->GetMaxRange() ); break;
case CIP_BASERANGE: *vp = INT_TO_JSVAL( gPriv->GetBaseRange() ); break;
case CIP_REGION:
{
CTownRegion *myReg = gPriv->GetRegion();
if( myReg == nullptr )
*vp = JSVAL_NULL;
else
{
JSObject *myTown = JSEngine->AcquireObject( IUE_REGION, myReg, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myTown );
}
break;
}
case CIP_SPAWNSERIAL: *vp = INT_TO_JSVAL( gPriv->GetSpawn() ); break;
case CIP_ISITEMHELD: *vp = BOOLEAN_TO_JSVAL( gPriv->isHeldOnCursor() ); break;
// The following entries are specifically for CSpawnItem objects
case CIP_SPAWNSECTION:
if( gPriv->GetObjType() == OT_SPAWNER )
{
tString = JS_NewStringCopyZ( cx, (static_cast<CSpawnItem *>(gPriv))->GetSpawnSection().c_str() );
*vp = STRING_TO_JSVAL( tString );
}
break;
case CIP_SECTIONALIST:
if( gPriv->GetObjType() == OT_SPAWNER )
*vp = INT_TO_JSVAL( (static_cast<CSpawnItem *>(gPriv))->IsSectionAList() );
break;
case CIP_MININTERVAL:
if( gPriv->GetObjType() == OT_SPAWNER )
*vp = INT_TO_JSVAL( (static_cast<CSpawnItem *>(gPriv))->GetInterval( 0 ) );
break;
case CIP_MAXINTERVAL:
if( gPriv->GetObjType() == OT_SPAWNER )
*vp = INT_TO_JSVAL( (static_cast<CSpawnItem *>(gPriv))->GetInterval( 1 ) );
break;
case CIP_MULTI:
CMultiObj *multi;
multi = gPriv->GetMultiObj();
if( !ValidateObject( multi ) )
*vp = JSVAL_NULL;
else
{
// Otherwise Acquire an object
JSObject *myObj = JSEngine->AcquireObject( IUE_ITEM, multi, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myObj );
}
break;
// The following entries are specifically for CMultiObj objects
case CIP_LOCKDDOWNS:
if( gPriv->GetObjType() == OT_MULTI )
*vp = INT_TO_JSVAL( ( static_cast<CMultiObj *>( gPriv )->GetLockdownCount() ) );
else
*vp = JSVAL_NULL;
break;
case CIP_MAXLOCKDOWNS:
if( gPriv->GetObjType() == OT_MULTI )
*vp = INT_TO_JSVAL( ( static_cast<CMultiObj *>( gPriv )->GetMaxLockdowns() ) );
else
*vp = JSVAL_NULL;
break;
case CIP_TRASHCONTAINERS:
if( gPriv->GetObjType() == OT_MULTI )
*vp = INT_TO_JSVAL( ( static_cast<CMultiObj *>( gPriv )->GetTrashContainerCount() ) );
else
*vp = JSVAL_NULL;
break;
case CIP_MAXTRASHCONTAINERS:
if( gPriv->GetObjType() == OT_MULTI )
*vp = INT_TO_JSVAL( ( static_cast<CMultiObj *>( gPriv )->GetMaxTrashContainers() ) );
else
*vp = JSVAL_NULL;
break;
case CIP_SECURECONTAINERS:
if( gPriv->GetObjType() == OT_MULTI )
*vp = INT_TO_JSVAL( ( static_cast<CMultiObj *>( gPriv )->GetSecureContainerCount() ) );
else
*vp = JSVAL_NULL;
break;
case CIP_MAXSECURECONTAINERS:
if( gPriv->GetObjType() == OT_MULTI )
*vp = INT_TO_JSVAL( ( static_cast<CMultiObj *>( gPriv )->GetMaxSecureContainers() ) );
else
*vp = JSVAL_NULL;
break;
case CIP_FRIENDS:
if( gPriv->GetObjType() == OT_MULTI )
*vp = INT_TO_JSVAL( ( static_cast<CMultiObj *>( gPriv )->GetFriendCount() ) );
else
*vp = JSVAL_NULL;
break;
case CIP_MAXFRIENDS:
if( gPriv->GetObjType() == OT_MULTI )
*vp = INT_TO_JSVAL( ( static_cast<CMultiObj *>( gPriv )->GetMaxFriends() ) );
else
*vp = JSVAL_NULL;
break;
case CIP_GUESTS:
if( gPriv->GetObjType() == OT_MULTI )
*vp = INT_TO_JSVAL( ( static_cast<CMultiObj *>( gPriv )->GetGuestCount() ) );
else
*vp = JSVAL_NULL;
break;
case CIP_MAXGUESTS:
if( gPriv->GetObjType() == OT_MULTI )
*vp = INT_TO_JSVAL( ( static_cast<CMultiObj *>( gPriv )->GetMaxGuests() ) );
else
*vp = JSVAL_NULL;
break;
case CIP_OWNERS:
if( gPriv->GetObjType() == OT_MULTI )
*vp = INT_TO_JSVAL( ( static_cast<CMultiObj *>( gPriv )->GetOwnerCount() ) );
else
*vp = JSVAL_NULL;
break;
case CIP_MAXOWNERS:
if( gPriv->GetObjType() == OT_MULTI )
*vp = INT_TO_JSVAL( ( static_cast<CMultiObj *>( gPriv )->GetMaxOwners() ) );
else
*vp = JSVAL_NULL;
break;
case CIP_BANS:
if( gPriv->GetObjType() == OT_MULTI )
*vp = INT_TO_JSVAL( ( static_cast<CMultiObj *>( gPriv )->GetBanCount() ) );
else
*vp = JSVAL_NULL;
break;
case CIP_MAXBANS:
if( gPriv->GetObjType() == OT_MULTI )
*vp = INT_TO_JSVAL( ( static_cast<CMultiObj *>( gPriv )->GetMaxBans() ) );
else
*vp = JSVAL_NULL;
break;
case CIP_VENDORS:
if( gPriv->GetObjType() == OT_MULTI )
*vp = INT_TO_JSVAL( ( static_cast<CMultiObj *>( gPriv )->GetVendorCount() ) );
else
*vp = JSVAL_NULL;
break;
case CIP_MAXVENDORS:
if( gPriv->GetObjType() == OT_MULTI )
*vp = INT_TO_JSVAL( ( static_cast<CMultiObj *>( gPriv )->GetMaxVendors() ) );
else
*vp = JSVAL_NULL;
break;
case CIP_DEED:
if( gPriv->GetObjType() == OT_MULTI )
{
tString = JS_NewStringCopyZ( cx, (static_cast<CMultiObj *>(gPriv))->GetDeed().c_str() );
*vp = STRING_TO_JSVAL( tString );
}
else
*vp = JSVAL_NULL;
break;
case CIP_ISPUBLIC:
if( gPriv->GetObjType() == OT_MULTI )
*vp = BOOLEAN_TO_JSVAL( ( static_cast<CMultiObj *>( gPriv )->GetPublicStatus() ) );
else
*vp = JSVAL_NULL;
break;
case CIP_BUILDTIMESTAMP:
if( gPriv->GetObjType() == OT_MULTI )
{
tString = JS_NewStringCopyZ( cx, ( static_cast<CMultiObj *>( gPriv ) )->GetBuildTimestamp().c_str() );
*vp = STRING_TO_JSVAL( tString );
}
else
*vp = JSVAL_NULL;
break;
case CIP_TRADETIMESTAMP:
if( gPriv->GetObjType() == OT_MULTI )
{
tString = JS_NewStringCopyZ( cx, ( static_cast<CMultiObj *>( gPriv ) )->GetTradeTimestamp().c_str() );
*vp = STRING_TO_JSVAL( tString );
}
else
*vp = JSVAL_NULL;
break;
case CIP_BANX:
if( gPriv->GetObjType() == OT_MULTI )
*vp = INT_TO_JSVAL( ( static_cast<CMultiObj *>( gPriv )->GetBanX() ) );
else
*vp = JSVAL_NULL;
break;
case CIP_BANY:
if( gPriv->GetObjType() == OT_MULTI )
*vp = INT_TO_JSVAL( ( static_cast<CMultiObj *>( gPriv )->GetBanY() ) );
else
*vp = JSVAL_NULL;
break;
default:
break;
}
}
return JS_TRUE;
}
JSBool CItemProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
CItem *gPriv = static_cast<CItem *>(JS_GetPrivate( cx, obj ));
if( !ValidateObject( gPriv ) )
return JS_FALSE;
JSEncapsulate encaps( cx, vp );
if( JSVAL_IS_INT( id ) )
{
TIMERVAL newTime;
switch( JSVAL_TO_INT( id ) )
{
case CIP_NAME: gPriv->SetName( encaps.toString() ); break;
case CIP_X: gPriv->SetLocation( (SI16)encaps.toInt(), gPriv->GetY(), gPriv->GetZ() ); break;
case CIP_Y: gPriv->SetLocation( gPriv->GetX(), (SI16)encaps.toInt(), gPriv->GetZ() ); break;
case CIP_Z: gPriv->SetZ( (SI08)encaps.toInt() ); break;
case CIP_ID: gPriv->SetID( (UI16)encaps.toInt() ); break;
case CIP_COLOUR: gPriv->SetColour( (UI16)encaps.toInt() ); break;
case CIP_OWNER:
if( *vp != JSVAL_NULL )
{
CChar *myChar = static_cast<CChar*>(encaps.toObject());
if( !ValidateObject( myChar ) )
break;
gPriv->SetOwner( myChar );
}
else
gPriv->SetOwner( nullptr );
break;
case CIP_VISIBLE: gPriv->SetVisible( (VisibleTypes)encaps.toInt() ); break;
case CIP_SERIAL: break;
case CIP_HEALTH: gPriv->SetHP( (SI16)encaps.toInt() ); break;
case CIP_SCRIPTTRIGGER:
{
// For backwards compatibility; clears out other scripts and assigns a specific script
std::uint16_t scriptID = static_cast<UI16>(encaps.toInt());
cScript *toExecute = JSMapping->GetScript( scriptID );
if( toExecute == nullptr )
{
Console.error( oldstrutil::format("Unable to assign script trigger - script ID (%i) not found in jse_fileassociations.scp!", oldstrutil::number(scriptID).c_str()) );
}
else
{
gPriv->ClearScriptTriggers();
gPriv->AddScriptTrigger( scriptID );
}
break;
}
case CIP_SCRIPTTRIGGERS:
{
if( *vp != JSVAL_NULL )
{
std::uint16_t scriptID = static_cast<UI16>(encaps.toInt());
cScript *toExecute = JSMapping->GetScript( scriptID );
if( toExecute == nullptr )
{
Console.error( oldstrutil::format("Unable to assign script trigger - script ID (%i) not found in jse_fileassociations.scp!", oldstrutil::number(scriptID).c_str()) );
}
else
{
gPriv->AddScriptTrigger( scriptID );
}
}
else
{
// If null value was provided, clear script triggers on object
gPriv->ClearScriptTriggers();
}
break;
}
case CIP_WORLDNUMBER:
if( !Map->InsideValidWorld( gPriv->GetX(), gPriv->GetY(), (UI08)encaps.toInt() ))
return JS_FALSE;
gPriv->RemoveFromSight();
gPriv->SetLocation( gPriv->GetX(), gPriv->GetY(), gPriv->GetZ(), (UI08)encaps.toInt(), gPriv->GetInstanceID() );
break;
case CIP_INSTANCEID:
{
gPriv->RemoveFromSight();
gPriv->SetLocation( gPriv->GetX(), gPriv->GetY(), gPriv->GetZ(), gPriv->WorldNumber(), (UI16)encaps.toInt() );
break;
}
case CIP_AMOUNT: gPriv->SetAmount( (UI32)encaps.toInt() ); break;
case CIP_CONTAINER:
if( *vp != JSVAL_NULL )
{
CBaseObject *myObj = static_cast<CBaseObject*>(encaps.toObject());
if( !ValidateObject( myObj ) )
break;
gPriv->SetCont( myObj, true );
}
else
gPriv->SetCont( nullptr, true );
break;
case CIP_TYPE: gPriv->SetType( static_cast<ItemTypes>(encaps.toInt()) ); break;
case CIP_MORE:
{
auto sEncaps = encaps.toString();
sEncaps = oldstrutil::trim( oldstrutil::removeTrailing( sEncaps, "//" ));
auto encapsSections = oldstrutil::sections( sEncaps, " " );
if( encapsSections.size() >= 4 )
{
gPriv->SetTempVar( CITV_MORE, 1, static_cast<UI08>(std::stoul(oldstrutil::trim( oldstrutil::removeTrailing( encapsSections[0], "//" )), nullptr, 0 )));
gPriv->SetTempVar( CITV_MORE, 2, static_cast<UI08>(std::stoul(oldstrutil::trim( oldstrutil::removeTrailing( encapsSections[1], "//" )), nullptr, 0 )));
gPriv->SetTempVar( CITV_MORE, 3, static_cast<UI08>(std::stoul(oldstrutil::trim( oldstrutil::removeTrailing( encapsSections[2], "//" )), nullptr, 0 )));
gPriv->SetTempVar( CITV_MORE, 4, static_cast<UI08>(std::stoul(oldstrutil::trim( oldstrutil::removeTrailing( encapsSections[3], "//" )), nullptr, 0 )));
}
else
{
gPriv->SetTempVar( CITV_MORE, encaps.toInt() );
}
break;
}
case CIP_MOREX:
{
auto sEncaps = encaps.toString();
sEncaps = oldstrutil::trim( oldstrutil::removeTrailing( sEncaps, "//"));
auto encapsSections = oldstrutil::sections( sEncaps, " " );
if( encapsSections.size() >= 4 )
{
gPriv->SetTempVar( CITV_MOREX, 1, static_cast<UI08>(std::stoul(oldstrutil::trim( oldstrutil::removeTrailing( encapsSections[0], "//" )), nullptr, 0 )));
gPriv->SetTempVar( CITV_MOREX, 2, static_cast<UI08>(std::stoul(oldstrutil::trim( oldstrutil::removeTrailing( encapsSections[1], "//" )), nullptr, 0 )));
gPriv->SetTempVar( CITV_MOREX, 3, static_cast<UI08>(std::stoul(oldstrutil::trim( oldstrutil::removeTrailing( encapsSections[2], "//" )), nullptr, 0 )));
gPriv->SetTempVar( CITV_MOREX, 4, static_cast<UI08>(std::stoul(oldstrutil::trim( oldstrutil::removeTrailing( encapsSections[3], "//" )), nullptr, 0 )));
}
else
{
gPriv->SetTempVar( CITV_MOREX, encaps.toInt() );
}
break;
}
case CIP_MOREY:
{
auto sEncaps = encaps.toString();
sEncaps = oldstrutil::trim( oldstrutil::removeTrailing( sEncaps, "//"));
auto encapsSections = oldstrutil::sections( sEncaps, " " );
if( encapsSections.size() >= 4 )
{
gPriv->SetTempVar( CITV_MOREY, 1, static_cast<UI08>(std::stoul(oldstrutil::trim( oldstrutil::removeTrailing( encapsSections[0], "//" )), nullptr, 0 )));
gPriv->SetTempVar( CITV_MOREY, 2, static_cast<UI08>(std::stoul(oldstrutil::trim( oldstrutil::removeTrailing( encapsSections[1], "//" )), nullptr, 0 )));
gPriv->SetTempVar( CITV_MOREY, 3, static_cast<UI08>(std::stoul(oldstrutil::trim( oldstrutil::removeTrailing( encapsSections[2], "//" )), nullptr, 0 )));
gPriv->SetTempVar( CITV_MOREY, 4, static_cast<UI08>(std::stoul(oldstrutil::trim( oldstrutil::removeTrailing( encapsSections[3], "//" )), nullptr, 0 )));
}
else
{
gPriv->SetTempVar( CITV_MOREY, encaps.toInt() );
}
break;
}
case CIP_MOREZ:
{
auto sEncaps = encaps.toString();
sEncaps = oldstrutil::trim( oldstrutil::removeTrailing( sEncaps, "//" ));
auto encapsSections = oldstrutil::sections( sEncaps, " " );
if( encapsSections.size() >= 4 )
{
gPriv->SetTempVar( CITV_MOREZ, 1, static_cast<UI08>(std::stoul(oldstrutil::trim( oldstrutil::removeTrailing( encapsSections[0], "//" )), nullptr, 0 )));
gPriv->SetTempVar( CITV_MOREZ, 2, static_cast<UI08>(std::stoul(oldstrutil::trim( oldstrutil::removeTrailing( encapsSections[1], "//" )), nullptr, 0 )));
gPriv->SetTempVar( CITV_MOREZ, 3, static_cast<UI08>(std::stoul(oldstrutil::trim( oldstrutil::removeTrailing( encapsSections[2], "//" )), nullptr, 0 )));
gPriv->SetTempVar( CITV_MOREZ, 4, static_cast<UI08>(std::stoul(oldstrutil::trim( oldstrutil::removeTrailing( encapsSections[3], "//" )), nullptr, 0 )));
}
else
{
gPriv->SetTempVar( CITV_MOREZ, encaps.toInt() );
}
break;
}
case CIP_MOVABLE: gPriv->SetMovable( (SI08)encaps.toInt() ); break;
case CIP_ATT: gPriv->SetLoDamage( (SI16)encaps.toInt() );
gPriv->SetHiDamage( (SI16)encaps.toInt() );
break;
case CIP_LAYER: gPriv->SetLayer( (ItemLayers)encaps.toInt() ); break;
case CIP_ITEMSINSIDE: break;
case CIP_DECAYABLE: gPriv->SetDecayable( encaps.toBool() ); break;
case CIP_DECAYTIME:
newTime = encaps.toInt();
if( newTime != 0 )
newTime = BuildTimeValue( newTime );
gPriv->SetDecayTime( newTime );
break;
case CIP_LODAMAGE: gPriv->SetLoDamage( (SI16)encaps.toInt() ); break;
case CIP_HIDAMAGE: gPriv->SetHiDamage( (SI16)encaps.toInt() ); break;
case CIP_AC: gPriv->SetArmourClass( (UI08)encaps.toInt() ); break;
case CIP_DEF: gPriv->SetResist( (UI16)encaps.toInt(), PHYSICAL ); break;
case CIP_RESISTCOLD: gPriv->SetResist( (UI16)encaps.toInt(), COLD ); break;
case CIP_RESISTHEAT: gPriv->SetResist( (UI16)encaps.toInt(), HEAT ); break;
case CIP_RESISTLIGHT: gPriv->SetResist( (UI16)encaps.toInt(), LIGHT ); break;
case CIP_RESISTLIGHTNING: gPriv->SetResist( (UI16)encaps.toInt(), LIGHTNING ); break;
case CIP_RESISTPOISON: gPriv->SetResist( (UI16)encaps.toInt(), POISON ); break;
case CIP_RESISTRAIN: gPriv->SetResist( (UI16)encaps.toInt(), RAIN ); break;
case CIP_RESISTSNOW: gPriv->SetResist( (UI16)encaps.toInt(), SNOW ); break;
case CIP_DAMAGECOLD: gPriv->SetWeatherDamage( COLD, encaps.toBool() ); break;
case CIP_DAMAGEHEAT: gPriv->SetWeatherDamage( HEAT, encaps.toBool() ); break;
case CIP_DAMAGELIGHT: gPriv->SetWeatherDamage( LIGHT, encaps.toBool() ); break;
case CIP_DAMAGELIGHTNING: gPriv->SetWeatherDamage( LIGHTNING, encaps.toBool() ); break;
case CIP_DAMAGEPOISON: gPriv->SetWeatherDamage( POISON, encaps.toBool() ); break;
case CIP_DAMAGERAIN: gPriv->SetWeatherDamage( RAIN, encaps.toBool() ); break;
case CIP_DAMAGESNOW: gPriv->SetWeatherDamage( SNOW, encaps.toBool() ); break;
case CIP_SPEED: gPriv->SetSpeed( (UI08)encaps.toInt() ); break;
case CIP_NAME2: gPriv->SetName2( encaps.toString() ); break;
case CIP_RACE: gPriv->SetRace( (RACEID)encaps.toInt() ); break;
case CIP_MAXHP: gPriv->SetMaxHP( (SI16)encaps.toInt() ); break;
case CIP_MAXUSES: gPriv->SetMaxUses( (UI16)encaps.toInt() ); break;
case CIP_USESLEFT: gPriv->SetUsesLeft( (UI16)encaps.toInt() ); break;
case CIP_RANK: gPriv->SetRank( (SI08)encaps.toInt() ); break;
case CIP_CREATOR: gPriv->SetCreator( (SERIAL)encaps.toInt() ); break;
case CIP_POISON: gPriv->SetPoisoned( (UI08)encaps.toInt() ); break;
case CIP_DIR: gPriv->SetDir( (SI16)encaps.toInt() ); break;
case CIP_WIPABLE: gPriv->SetWipeable( encaps.toBool() ); break;
case CIP_BUYVALUE: gPriv->SetBuyValue( (UI32)encaps.toInt() ); break;
case CIP_SELLVALUE: gPriv->SetSellValue( (UI32)encaps.toInt() ); break;
case CIP_RESTOCK: gPriv->SetRestock( (UI16)encaps.toInt() ); break;
case CIP_DIVINELOCK: gPriv->SetDivineLock( encaps.toBool() ); break;
case CIP_WEIGHT: gPriv->SetWeight( (SI32)encaps.toInt() ); break;
case CIP_WEIGHTMAX: gPriv->SetWeightMax( (SI32)encaps.toInt() ); break;
case CIP_BASEWEIGHT: gPriv->SetBaseWeight( (SI32)encaps.toInt() ); break;
case CIP_MAXITEMS: gPriv->SetMaxItems( (UI16)encaps.toInt() ); break;
case CIP_STRENGTH: gPriv->SetStrength( (SI16)encaps.toInt() ); break;
case CIP_DEXTERITY: gPriv->SetDexterity( (SI16)encaps.toInt() ); break;
case CIP_INTELLIGENCE: gPriv->SetIntelligence( (SI16)encaps.toInt() ); break;
case CIP_CORPSE: gPriv->SetCorpse( encaps.toBool() ); break;
case CIP_DESC: gPriv->SetDesc( encaps.toString() ); break;
case CIP_EVENT: gPriv->SetEvent( encaps.toString() ); break;
case CIP_TEMPTIMER:
newTime = encaps.toInt();
if( newTime != 0 )
newTime = BuildTimeValue( newTime );
gPriv->SetTempTimer( newTime );
break;
case CIP_SHOULDSAVE: gPriv->ShouldSave( encaps.toBool() ); break;
case CIP_ISNEWBIE: gPriv->SetNewbie( encaps.toBool() ); break;
case CIP_ISDISPELLABLE: gPriv->SetDispellable( encaps.toBool() ); break;
case CIP_MADEWITH: gPriv->SetMadeWith( (SI08)encaps.toInt() ); break;
case CIP_ENTRYMADEFROM: gPriv->EntryMadeFrom( (UI16)encaps.toInt() ); break;
case CIP_ISPILEABLE: gPriv->SetPileable( encaps.toBool() ); break;
case CIP_ISMARKEDBYMAKER: gPriv->SetMakersMark( encaps.toBool() ); break;
case CIP_ISDYEABLE: gPriv->SetDye( encaps.toBool() ); break;
case CIP_ISDAMAGEABLE: gPriv->SetDamageable( encaps.toBool() ); break;
case CIP_ISWIPEABLE: gPriv->SetWipeable( encaps.toBool() ); break;
case CIP_ISGUARDED: gPriv->SetGuarded( encaps.toBool() ); break;
case CIP_ISDOOROPEN: gPriv->SetDoorOpen( encaps.toBool() ); break;
case CIP_CARVESECTION: gPriv->SetCarve( encaps.toInt() ); break;
case CIP_AMMOID: gPriv->SetAmmoID( (UI16)encaps.toInt() ); break;
case CIP_AMMOHUE: gPriv->SetAmmoHue( (UI16)encaps.toInt() ); break;
case CIP_AMMOFX: gPriv->SetAmmoFX( (UI16)encaps.toInt() ); break;
case CIP_AMMOFXHUE: gPriv->SetAmmoFXHue( (UI16)encaps.toInt() ); break;
case CIP_AMMOFXRENDER: gPriv->SetAmmoFXRender( (UI16)encaps.toInt() ); break;
case CIP_MAXRANGE: gPriv->SetMaxRange( (UI08)encaps.toInt() ); break;
case CIP_BASERANGE: gPriv->SetBaseRange( (UI08)encaps.toInt() ); break;
case CIP_REGION: gPriv->SetRegion( (UI16)encaps.toInt() ); break;
case CIP_ISITEMHELD: gPriv->SetHeldOnCursor( encaps.toBool() ); break;
// The following entries are specifically for CSpawnItem objects
case CIP_SPAWNSECTION:
if( gPriv->GetObjType() == OT_SPAWNER )
(static_cast<CSpawnItem *>(gPriv))->SetSpawnSection( encaps.toString() );
break;
case CIP_SECTIONALIST:
if( gPriv->GetObjType() == OT_SPAWNER )
(static_cast<CSpawnItem *>(gPriv))->IsSectionAList( encaps.toBool() );
break;
case CIP_MININTERVAL:
if( gPriv->GetObjType() == OT_SPAWNER )
(static_cast<CSpawnItem *>(gPriv))->SetInterval( 0, (UI08)encaps.toInt() );
break;
case CIP_MAXINTERVAL:
if( gPriv->GetObjType() == OT_SPAWNER )
(static_cast<CSpawnItem *>(gPriv))->SetInterval( 1, (UI08)encaps.toInt() );
break;
// Multis only
case CIP_MAXLOCKDOWNS:
if( gPriv->GetObjType() == OT_MULTI )
(static_cast<CMultiObj *>(gPriv))->SetMaxLockdowns( (UI16)encaps.toInt() );
break;
case CIP_MAXTRASHCONTAINERS:
if( gPriv->GetObjType() == OT_MULTI )
(static_cast<CMultiObj *>(gPriv))->SetMaxTrashContainers( (UI16)encaps.toInt() );
break;
case CIP_MAXSECURECONTAINERS:
if( gPriv->GetObjType() == OT_MULTI )
(static_cast<CMultiObj *>(gPriv))->SetMaxSecureContainers( (UI16)encaps.toInt() );
break;
case CIP_MAXFRIENDS:
if( gPriv->GetObjType() == OT_MULTI )
(static_cast<CMultiObj *>(gPriv))->SetMaxFriends( (UI16)encaps.toInt() );
break;
case CIP_MAXGUESTS:
if( gPriv->GetObjType() == OT_MULTI )
(static_cast<CMultiObj *>(gPriv))->SetMaxGuests( (UI16)encaps.toInt() );
break;
case CIP_MAXOWNERS:
if( gPriv->GetObjType() == OT_MULTI )
(static_cast<CMultiObj *>(gPriv))->SetMaxOwners( (UI16)encaps.toInt() );
break;
case CIP_MAXBANS:
if( gPriv->GetObjType() == OT_MULTI )
(static_cast<CMultiObj *>(gPriv))->SetMaxBans( (UI16)encaps.toInt() );
break;
case CIP_MAXVENDORS:
if( gPriv->GetObjType() == OT_MULTI )
(static_cast<CMultiObj *>(gPriv))->SetMaxVendors( (UI16)encaps.toInt() );
break;
case CIP_DEED:
if( gPriv->GetObjType() == OT_MULTI )
(static_cast<CMultiObj *>(gPriv))->SetDeed( encaps.toString() );
break;
case CIP_ISPUBLIC:
if( gPriv->GetObjType() == OT_MULTI )
(static_cast<CMultiObj *>(gPriv))->SetPublicStatus( encaps.toBool() );
break;
case CIP_BUILDTIMESTAMP:
{
if( gPriv->GetObjType() == OT_MULTI )
{
time_t buildTimestamp = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
(static_cast<CMultiObj *>( gPriv ) )->SetBuildTimestamp( buildTimestamp );
}
break;
}
case CIP_TRADETIMESTAMP:
{
if( gPriv->GetObjType() == OT_MULTI )
{
time_t tradeTimestamp = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
(static_cast<CMultiObj *>( gPriv ) )->SetTradeTimestamp( tradeTimestamp );
}
break;
}
case CIP_BANX:
if( gPriv->GetObjType() == OT_MULTI )
(static_cast<CMultiObj *>(gPriv))->SetBanX( (SI16)encaps.toInt() );
break;
case CIP_BANY:
if( gPriv->GetObjType() == OT_MULTI )
(static_cast<CMultiObj *>(gPriv))->SetBanY( (SI16)encaps.toInt() );
break;
default:
break;
}
}
return JS_TRUE;
}
JSBool CCharacterProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
CChar *gPriv = static_cast<CChar *>(JS_GetPrivate( cx, obj ));
if( !ValidateObject( gPriv ) )
return JS_FALSE;
if( JSVAL_IS_INT( id ) )
{
CItem *TempItem = nullptr;
JSObject *TempObject = nullptr;
JSString *tString = nullptr;
switch( JSVAL_TO_INT( id ) )
{
case CCP_ACCOUNTNUM: *vp = INT_TO_JSVAL( gPriv->GetAccountNum() ); break;
case CCP_ACCOUNT:
{
CAccountBlock *accountBlock = &gPriv->GetAccount();
if( accountBlock == nullptr )
*vp = JSVAL_NULL;
else
{ // Otherwise Acquire an object
JSObject *accountObj = JSEngine->AcquireObject( IUE_ACCOUNT, accountBlock, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( accountObj );
}
break;
}
case CCP_CREATEDON: *vp = INT_TO_JSVAL( gPriv->GetCreatedOn() ); break;
case CCP_NAME:
{
CSocket *tSock = nullptr;
//JSObject *tempSock = JSEngine->AcquireObject( IUE_SOCK, tSock, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
std::string mCharName = getNpcDictName( gPriv, tSock );
std::string convertedString = oldstrutil::stringToWstringToString( mCharName );
tString = JS_NewStringCopyZ( cx, convertedString.c_str() );
*vp = STRING_TO_JSVAL( tString );
break;
}
case CCP_TITLE:
tString = JS_NewStringCopyZ( cx, gPriv->GetTitle().c_str() );
*vp = STRING_TO_JSVAL( tString );
break;
case CCP_X: *vp = INT_TO_JSVAL( gPriv->GetX() ); break;
case CCP_Y: *vp = INT_TO_JSVAL( gPriv->GetY() ); break;
case CCP_Z: *vp = INT_TO_JSVAL( gPriv->GetZ() ); break;
case CCP_OLDX:
{
auto oldLocation = gPriv->GetOldLocation();
*vp = INT_TO_JSVAL( oldLocation.x );
break;
}
case CCP_OLDY:
{
auto oldLocation = gPriv->GetOldLocation();
*vp = INT_TO_JSVAL( oldLocation.y );
break;
}
case CCP_OLDZ:
{
auto oldLocation = gPriv->GetOldLocation();
*vp = INT_TO_JSVAL( oldLocation.z );
break;
}
case CCP_ID: *vp = INT_TO_JSVAL( gPriv->GetID() ); break;
case CCP_COLOUR: *vp = INT_TO_JSVAL( gPriv->GetColour() ); break;
case CCP_CONTROLSLOTS: *vp = INT_TO_JSVAL( (UI08)gPriv->GetControlSlots() ); break;
case CCP_CONTROLSLOTSUSED: *vp = INT_TO_JSVAL( (UI08)gPriv->GetControlSlotsUsed() ); break;
case CCP_ORNERINESS: *vp = INT_TO_JSVAL( gPriv->GetOrneriness() ); break;
case CCP_OWNER:
CBaseObject *TempObj;
TempObj = gPriv->GetOwnerObj();
if( !ValidateObject( TempObj ) )
*vp = JSVAL_NULL;
else
{
// Otherwise Acquire an object
JSObject *myChar = JSEngine->AcquireObject( IUE_CHAR, TempObj, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myChar );
}
break;
case CCP_VISIBLE: *vp = INT_TO_JSVAL( (UI08)gPriv->GetVisible() ); break;
case CCP_SERIAL:
{
if( !INT_FITS_IN_JSVAL( gPriv->GetSerial() ) )
{
JS_NewNumberValue( cx, gPriv->GetSerial(), vp );
}
else
{
*vp = INT_TO_JSVAL( gPriv->GetSerial() );
}
break;
}
case CCP_HEALTH: *vp = INT_TO_JSVAL( gPriv->GetHP() ); break;
case CCP_SCRIPTTRIGGER:
{
// For backwards compatibility, get last scripttrigger from vector
// For older worldfiles, this will be the only scripttrigger added to the vector after load
std::vector<UI16> scriptTriggers = gPriv->GetScriptTriggers();
UI16 lastScriptTrigger = 0;
auto numberOfTriggers = scriptTriggers.size();
if( numberOfTriggers > 0 )
{
lastScriptTrigger = scriptTriggers[numberOfTriggers-1];
}
*vp = INT_TO_JSVAL( lastScriptTrigger );
break;
}
case CCP_SCRIPTTRIGGERS:
{
jsval scriptID;
JSObject *scriptTriggersJS = JS_NewArrayObject(cx, 0, nullptr);
std::vector<UI16> scriptTriggers = gPriv->GetScriptTriggers();
for( int i = 0; i < scriptTriggers.size(); i++ )
{
scriptID = INT_TO_JSVAL( scriptTriggers[i] );
JS_SetElement(cx, scriptTriggersJS, i, &scriptID);
}
*vp = OBJECT_TO_JSVAL( scriptTriggersJS );
break;
}
case CCP_WORLDNUMBER: *vp = INT_TO_JSVAL( gPriv->WorldNumber() ); break;
case CCP_INSTANCEID: *vp = INT_TO_JSVAL( gPriv->GetInstanceID() ); break;
case CCP_TARGET:
CChar *tempChar;
tempChar = gPriv->GetTarg();
if( !ValidateObject( tempChar ) )
*vp = JSVAL_NULL;
else
{
// Otherwise Acquire an object
JSObject *myChar = JSEngine->AcquireObject( IUE_CHAR, tempChar, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myChar );
}
break;
case CCP_DEXTERITY: *vp = INT_TO_JSVAL( gPriv->GetDexterity() ); break;
case CCP_INTELLIGENCE: *vp = INT_TO_JSVAL( gPriv->GetIntelligence() ); break;
case CCP_STRENGTH: *vp = INT_TO_JSVAL( gPriv->GetStrength() ); break;
case CCP_ACTUALDEXTERITY: *vp = INT_TO_JSVAL( gPriv->ActualDexterity() ); break;
case CCP_ACTUALINTELLIGENCE: *vp = INT_TO_JSVAL( gPriv->ActualIntelligence() ); break;
case CCP_ACTUALSTRENGTH: *vp = INT_TO_JSVAL( gPriv->ActualStrength() ); break;
case CCP_BASESKILLS:
TempObject = JS_NewObject( cx, &UOXBaseSkills_class, nullptr, obj );
JS_DefineProperties( cx, TempObject, CSkillsProps );
JS_SetPrivate( cx, TempObject, gPriv );
*vp = OBJECT_TO_JSVAL( TempObject );
break;
case CCP_SKILLS:
TempObject = JS_NewObject( cx, &UOXSkills_class, nullptr, obj );
JS_DefineProperties( cx, TempObject, CSkillsProps );
JS_SetPrivate( cx, TempObject, gPriv );
*vp = OBJECT_TO_JSVAL( TempObject );
break;
case CCP_SKILLUSE:
TempObject = JS_NewObject( cx, &UOXSkillsUsed_class, nullptr, obj );
JS_DefineProperties( cx, TempObject, CSkillsProps );
JS_SetPrivate( cx, TempObject, gPriv );
*vp = OBJECT_TO_JSVAL( TempObject );
break;
case CCP_MANA: *vp = INT_TO_JSVAL( gPriv->GetMana() ); break;
case CCP_STAMINA: *vp = INT_TO_JSVAL( gPriv->GetStamina() ); break;
case CCP_CHARPACK:
TempItem = gPriv->GetPackItem();
if( !ValidateObject( TempItem ) )
*vp = JSVAL_NULL;
else
{
// Otherwise Acquire an object
JSObject *myItem = JSEngine->AcquireObject( IUE_ITEM, TempItem, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myItem );
}
break;
case CCP_FAME: *vp = INT_TO_JSVAL( gPriv->GetFame() ); break;
case CCP_KARMA: *vp = INT_TO_JSVAL( gPriv->GetKarma() ); break;
case CCP_ATTACK: *vp = INT_TO_JSVAL( Combat->calcAtt( gPriv, true ) ); break;
case CCP_CANATTACK: *vp = BOOLEAN_TO_JSVAL( gPriv->GetCanAttack() ); break;
case CCP_BRKPEACE: *vp = INT_TO_JSVAL( gPriv->GetBrkPeaceChance() ); break;
case CCP_HUNGER: *vp = INT_TO_JSVAL( gPriv->GetHunger() ); break;
case CCP_HUNGERRATE:
{
CRace *TempRace = nullptr;
TempRace = Races->Race( gPriv->GetRace() );
// Try to fetch hungerRate from character's race
UI16 hungerRate = 0;
if( TempRace != nullptr )
hungerRate = TempRace->GetHungerRate();
// If hungerRate from Race is zero, use the global hunger rate from UOX.INI instead
if( hungerRate == 0 )
hungerRate = cwmWorldState->ServerData()->SystemTimer( tSERVER_HUNGERRATE );
*vp = INT_TO_JSVAL( hungerRate );
break;
}
case CCP_THIRST: *vp = INT_TO_JSVAL( gPriv->GetThirst() ); break;
case CCP_THIRSTRATE:
{
CRace *TempRace = nullptr;
TempRace = Races->Race( gPriv->GetRace() );
// Try to fetch thirstRate from character's race
UI16 thirstRate = 0;
if( TempRace != nullptr )
thirstRate = TempRace->GetThirstRate();
// If thirstRate from Race is zero, use the global thirst rate from UOX.INI instead
if( thirstRate == 0 )
thirstRate = cwmWorldState->ServerData()->SystemTimer( tSERVER_THIRSTRATE );
*vp = INT_TO_JSVAL( thirstRate );
break;
}
case CCP_FROZEN: *vp = BOOLEAN_TO_JSVAL( gPriv->IsFrozen() ); break;
case CCP_COMMANDLEVEL: *vp = INT_TO_JSVAL( gPriv->GetCommandLevel() ); break;
case CCP_RACE:
{
CRace *TempRace = nullptr;
TempRace = Races->Race( gPriv->GetRace() );
if( TempRace == nullptr )
*vp = JSVAL_NULL;
else
{
// Otherwise Acquire an object
JSObject *myRace = JSEngine->AcquireObject( IUE_RACE, TempRace, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myRace );
}
break;
}
case CCP_CRIMINAL: *vp = BOOLEAN_TO_JSVAL( gPriv->IsCriminal() ); break;
case CCP_MURDERER: *vp = BOOLEAN_TO_JSVAL( gPriv->IsMurderer() ); break;
case CCP_INNOCENT: *vp = BOOLEAN_TO_JSVAL( gPriv->IsInnocent() ); break;
case CCP_NEUTRAL: *vp = BOOLEAN_TO_JSVAL( gPriv->IsNeutral() ); break;
case CCP_MURDERCOUNT: *vp = INT_TO_JSVAL( gPriv->GetKills() ); break;
case CCP_GENDER:
switch( gPriv->GetID() )
{
case 0x0190: // human male, dead or alive
case 0x0192: *vp = INT_TO_JSVAL( 0 ); break;
case 0x0191: // human female, dead or alive
case 0x0193: *vp = INT_TO_JSVAL( 1 ); break;
case 0x025D: // elf male, dead or alive
case 0x025F: *vp = INT_TO_JSVAL( 2 ); break;
case 0x025E: // elf female, dead or alive
case 0x0260: *vp = INT_TO_JSVAL( 3 ); break;
case 0x029A: // gargoyle male, dead or alive
case 0x02B6: *vp = INT_TO_JSVAL( 4 ); break;
case 0x029B: // gargoyle female, dead or alive
case 0x02B7: *vp = INT_TO_JSVAL( 5 ); break;
default: *vp = INT_TO_JSVAL( 0xFF ); break;
}
break;
case CCP_DEAD: *vp = BOOLEAN_TO_JSVAL( gPriv->IsDead() ); break;
case CCP_NPC: *vp = BOOLEAN_TO_JSVAL( gPriv->IsNpc() ); break;
case CCP_AWAKE: *vp = BOOLEAN_TO_JSVAL( gPriv->IsAwake() ); break;
case CCP_ONLINE: *vp = BOOLEAN_TO_JSVAL( isOnline( (*gPriv) ) ); break;
case CCP_DIRECTION: *vp = INT_TO_JSVAL( gPriv->GetDir() ); break;
// 3 objects: regions + towns + guilds
case CCP_ISRUNNING: *vp = BOOLEAN_TO_JSVAL( gPriv->GetRunning() ); break;
case CCP_REGION:
{
CTownRegion *myReg = gPriv->GetRegion();
if( myReg == nullptr )
*vp = JSVAL_NULL;
else
{
JSObject *myTown = JSEngine->AcquireObject( IUE_REGION, myReg, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myTown );
}
break;
}
case CCP_TOWN:
{
UI16 TempTownID = 0xFF;
TempTownID = gPriv->GetTown();
// We need to decide here whether 0xFF is a valid town (wilderness) or not
// i would say no its not
if( TempTownID == 0xFF )
*vp = JSVAL_NULL;
else
{
// Should build the town here
JSObject *myTown = JSEngine->AcquireObject( IUE_REGION, cwmWorldState->townRegions[TempTownID], JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myTown );
}
break;
}
case CCP_GUILD:
{
GUILDID TempGuildID = -1;
TempGuildID = gPriv->GetGuildNumber();
// Character has no guild
if( TempGuildID == -1 ) // isn't there a constant or something like?
*vp = JSVAL_NULL;
else
{
JSObject *myGuild = JSEngine->AcquireObject( IUE_GUILD, GuildSys->Guild( TempGuildID ), JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myGuild );
}
break;
}
case CCP_SOCKET:
{ // So we can declare the variables here
CSocket *tSock = gPriv->GetSocket();
if( tSock == nullptr )
*vp = JSVAL_NULL;
else
{ // Otherwise Acquire an object
JSObject *mySock = JSEngine->AcquireObject( IUE_SOCK, tSock, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( mySock );
}
break;
}
case CCP_ISCHAR: *vp = JSVAL_TRUE; break;
case CCP_ISITEM: *vp = JSVAL_FALSE; break;
case CCP_ISSPAWNER: *vp = JSVAL_FALSE; break;
case CCP_SPAWNSERIAL: *vp = INT_TO_JSVAL( gPriv->GetSpawn() ); break;
case CCP_MAXHP: *vp = INT_TO_JSVAL( gPriv->GetMaxHP() ); break;
case CCP_MAXSTAMINA: *vp = INT_TO_JSVAL( gPriv->GetMaxStam() ); break;
case CCP_MAXMANA: *vp = INT_TO_JSVAL( gPriv->GetMaxMana() ); break;
case CCP_OLDWANDERTYPE: *vp = INT_TO_JSVAL( gPriv->GetOldNpcWander() ); break;
case CCP_WANDERTYPE: *vp = INT_TO_JSVAL( gPriv->GetNpcWander() ); break;
case CCP_FX1: *vp = INT_TO_JSVAL( gPriv->GetFx( 0 ) ); break;
case CCP_FY1: *vp = INT_TO_JSVAL( gPriv->GetFy( 0 ) ); break;
case CCP_FX2: *vp = INT_TO_JSVAL( gPriv->GetFx( 1 ) ); break;
case CCP_FY2: *vp = INT_TO_JSVAL( gPriv->GetFy( 1 ) ); break;
case CCP_FZ: *vp = INT_TO_JSVAL( gPriv->GetFz() ); break;
case CCP_ISONHORSE: *vp = BOOLEAN_TO_JSVAL( gPriv->IsOnHorse() ); break;
case CCP_ISFLYING: *vp = BOOLEAN_TO_JSVAL( gPriv->IsFlying() ); break;
case CCP_ISGUARDED: *vp = BOOLEAN_TO_JSVAL( gPriv->IsGuarded() ); break;
case CCP_GUARDING:
{
CBaseObject *tempObj = gPriv->GetGuarding();
if( !ValidateObject( tempObj ) )
{ // Return a JS_NULL
*vp = JSVAL_NULL;
}
else
{
// Otherwise Acquire an object
JSObject *myObj = nullptr;
if( tempObj->CanBeObjType( OT_CHAR ) )
{
myObj = JSEngine->AcquireObject( IUE_CHAR, tempObj, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
}
else if( tempObj->CanBeObjType( OT_ITEM ))
{
myObj = JSEngine->AcquireObject( IUE_ITEM, tempObj, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
}
*vp = OBJECT_TO_JSVAL( myObj );
}
break;
}
case CCP_TDEXTERITY: *vp = INT_TO_JSVAL( gPriv->GetDexterity2() ); break;
case CCP_TINTELLIGENCE: *vp = INT_TO_JSVAL( gPriv->GetIntelligence2() ); break;
case CCP_TSTRENGTH: *vp = INT_TO_JSVAL( gPriv->GetStrength2() ); break;
case CCP_POISON: *vp = INT_TO_JSVAL( gPriv->GetPoisoned() ); break;
case CCP_LIGHTLEVEL: *vp = INT_TO_JSVAL( gPriv->GetFixedLight() ); break;
case CCP_VULNERABLE: *vp = BOOLEAN_TO_JSVAL( !gPriv->IsInvulnerable() ); break;
case CCP_HUNGERSTATUS: *vp = BOOLEAN_TO_JSVAL( gPriv->WillHunger() ); break;
case CCP_THIRSTSTATUS: *vp = BOOLEAN_TO_JSVAL( gPriv->WillThirst() ); break;
case CCP_LODAMAGE: *vp = INT_TO_JSVAL( gPriv->GetLoDamage() ); break;
case CCP_HIDAMAGE: *vp = INT_TO_JSVAL( gPriv->GetHiDamage() ); break;
case CCP_FLAG: *vp = INT_TO_JSVAL( gPriv->GetFlag() ); break;
case CCP_ATWAR: *vp = BOOLEAN_TO_JSVAL( gPriv->IsAtWar() ); break;
case CCP_SPELLCAST: *vp = INT_TO_JSVAL( gPriv->GetSpellCast() ); break;
case CCP_ISCASTING: *vp = BOOLEAN_TO_JSVAL( gPriv->IsCasting() || gPriv->IsJSCasting() ); break;
case CCP_PRIV: *vp = INT_TO_JSVAL( gPriv->GetPriv() ); break;
case CCP_TOWNPRIV: *vp = INT_TO_JSVAL( gPriv->GetTownPriv() ); break;
case CCP_GUILDTITLE:
tString = JS_NewStringCopyZ( cx, gPriv->GetGuildTitle().c_str() );
*vp = STRING_TO_JSVAL( tString );
break;
case CCP_FONTTYPE: *vp = INT_TO_JSVAL( gPriv->GetFontType() ); break;
case CCP_SAYCOLOUR: *vp = INT_TO_JSVAL( gPriv->GetSayColour() ); break;
case CCP_EMOTECOLOUR: *vp = INT_TO_JSVAL( gPriv->GetEmoteColour() ); break;
case CCP_ATTACKER:
{
// Hm Quite funny, same thing as .owner
CChar *tempChar = gPriv->GetAttacker();
if( !ValidateObject( tempChar ) )
{ // Return a JS_NULL
*vp = JSVAL_NULL;
}
else
{
// Otherwise Acquire an object
JSObject *myChar = JSEngine->AcquireObject( IUE_CHAR, tempChar, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myChar );
}
break;
}
case CCP_RACEGATE: *vp = INT_TO_JSVAL( gPriv->GetRaceGate() ); break;
case CCP_SKILLLOCK:
TempObject = JS_NewObject( cx, &UOXSkillsLock_class, nullptr, obj );
JS_DefineProperties( cx, TempObject, CSkillsProps );
JS_SetPrivate( cx, TempObject, gPriv );
*vp = OBJECT_TO_JSVAL( TempObject );
break;
case CCP_DEATHS: *vp = INT_TO_JSVAL( gPriv->GetDeaths() ); break;
case CCP_OWNERCOUNT: *vp = INT_TO_JSVAL( (UI08)gPriv->GetOwnerCount() ); break;
case CCP_NEXTACT: *vp = INT_TO_JSVAL( gPriv->GetNextAct() ); break;
case CCP_PETCOUNT: *vp = INT_TO_JSVAL( (UI08)gPriv->GetPetList()->Num() ); break;
case CCP_OWNEDITEMSCOUNT: *vp = INT_TO_JSVAL( gPriv->GetOwnedItems()->size() ); break;
case CCP_CELL: *vp = INT_TO_JSVAL( gPriv->GetCell() ); break;
case CCP_ALLMOVE: *vp = BOOLEAN_TO_JSVAL( gPriv->AllMove() ); break;
case CCP_HOUSEICONS: *vp = BOOLEAN_TO_JSVAL( gPriv->ViewHouseAsIcon() ); break;
case CCP_SPATTACK: *vp = INT_TO_JSVAL( gPriv->GetSpAttack() ); break;
case CCP_SPDELAY: *vp = INT_TO_JSVAL( gPriv->GetSpDelay() ); break;
case CCP_AITYPE: *vp = INT_TO_JSVAL( gPriv->GetNPCAiType() ); break;
case CCP_SPLIT: *vp = INT_TO_JSVAL( gPriv->GetSplit() ); break;
case CCP_SPLITCHANCE: *vp = INT_TO_JSVAL( gPriv->GetSplitChance() ); break;
case CCP_TRAINER: *vp = BOOLEAN_TO_JSVAL( gPriv->CanTrain() ); break;
case CCP_HIRELING: *vp = BOOLEAN_TO_JSVAL( gPriv->CanBeHired() ); break;
case CCP_WEIGHT: *vp = INT_TO_JSVAL( gPriv->GetWeight() ); break;
case CCP_SQUELCH: *vp = INT_TO_JSVAL( gPriv->GetSquelched() ); break;
case CCP_ISJAILED: *vp = BOOLEAN_TO_JSVAL( gPriv->IsJailed() ); break;
case CCP_MAGICREFLECT: *vp = BOOLEAN_TO_JSVAL( gPriv->IsTempReflected() ); break;
case CCP_PERMMAGICREFLECT: *vp = BOOLEAN_TO_JSVAL( gPriv->IsPermReflected() ); break;
case CCP_TAMED: *vp = BOOLEAN_TO_JSVAL( gPriv->IsTamed() ); break;
case CCP_TAMEDHUNGERRATE: *vp = INT_TO_JSVAL( gPriv->GetTamedHungerRate() ); break;
case CCP_TAMEDTHIRSTRATE: *vp = INT_TO_JSVAL( gPriv->GetTamedThirstRate() ); break;
case CCP_HUNGERWILDCHANCE: *vp = INT_TO_JSVAL( gPriv->GetTamedHungerWildChance() ); break;
case CCP_THIRSTWILDCHANCE: *vp = INT_TO_JSVAL( gPriv->GetTamedThirstWildChance() ); break;
case CCP_FOODLIST:
tString = JS_NewStringCopyZ( cx, gPriv->GetFood().c_str() );
*vp = STRING_TO_JSVAL( tString );
break;
case CCP_MOUNTED: *vp = BOOLEAN_TO_JSVAL( gPriv->GetMounted() ); break;
case CCP_STABLED: *vp = BOOLEAN_TO_JSVAL( gPriv->GetStabled() ); break;
case CCP_USINGPOTION: *vp = BOOLEAN_TO_JSVAL( gPriv->IsUsingPotion() ); break;
case CCP_STEALTH: *vp = INT_TO_JSVAL( gPriv->GetStealth() ); break;
case CCP_SKILLTOTAME: *vp = INT_TO_JSVAL( gPriv->GetTaming() ); break;
case CCP_SKILLTOPROV: *vp = INT_TO_JSVAL( gPriv->GetProvoing() ); break;
case CCP_SKILLTOPEACE: *vp = INT_TO_JSVAL( gPriv->GetPeaceing() ); break;
case CCP_POISONSTRENGTH: *vp = INT_TO_JSVAL( gPriv->GetPoisonStrength() ); break;
case CCP_ISPOLYMORPHED: *vp = BOOLEAN_TO_JSVAL( gPriv->IsPolymorphed() ); break;
case CCP_ISINCOGNITO: *vp = BOOLEAN_TO_JSVAL( gPriv->IsIncognito() ); break;
case CCP_CANRUN: *vp = BOOLEAN_TO_JSVAL( gPriv->CanRun() ); break;
case CCP_ISMEDITATING: *vp = BOOLEAN_TO_JSVAL( gPriv->IsMeditating() ); break;
case CCP_ISGM: *vp = BOOLEAN_TO_JSVAL( gPriv->IsGM() ); break;
case CCP_CANBROADCAST: *vp = BOOLEAN_TO_JSVAL( gPriv->CanBroadcast() ); break;
case CCP_SINGCLICKSER: *vp = BOOLEAN_TO_JSVAL( gPriv->GetSingClickSer() ); break;
case CCP_NOSKILLTITLES: *vp = BOOLEAN_TO_JSVAL( gPriv->NoSkillTitles() ); break;
case CCP_ISGMPAGEABLE: *vp = BOOLEAN_TO_JSVAL( gPriv->IsGMPageable() ); break;
case CCP_CANSNOOP: *vp = BOOLEAN_TO_JSVAL( gPriv->CanSnoop() ); break;
case CCP_ISCOUNSELOR: *vp = BOOLEAN_TO_JSVAL( gPriv->IsCounselor() ); break;
case CCP_NONEEDMANA: *vp = BOOLEAN_TO_JSVAL( gPriv->NoNeedMana() ); break;
case CCP_ISDISPELLABLE: *vp = BOOLEAN_TO_JSVAL( gPriv->IsDispellable() ); break;
case CCP_NONEEDREAGS: *vp = BOOLEAN_TO_JSVAL( gPriv->NoNeedReags() ); break;
case CCP_ISANIMAL: *vp = BOOLEAN_TO_JSVAL( cwmWorldState->creatures[gPriv->GetID()].IsAnimal() ); break;
case CCP_ISHUMAN: *vp = BOOLEAN_TO_JSVAL( cwmWorldState->creatures[gPriv->GetID()].IsHuman() ); break;
case CCP_ORGID: *vp = INT_TO_JSVAL( gPriv->GetOrgID() ); break;
case CCP_ORGSKIN: *vp = INT_TO_JSVAL( gPriv->GetOrgSkin() ); break;
case CCP_NPCFLAG: *vp = INT_TO_JSVAL( static_cast<SI32>(gPriv->GetNPCFlag()) );break;
case CCP_ISSHOP: *vp = BOOLEAN_TO_JSVAL( gPriv->IsShop() ); break;
case CCP_ATTACKFIRST: *vp = BOOLEAN_TO_JSVAL( gPriv->DidAttackFirst() ); break;
case CCP_MAXLOYALTY: *vp = INT_TO_JSVAL( gPriv->GetMaxLoyalty() ); break;
case CCP_LOYALTY: *vp = INT_TO_JSVAL( gPriv->GetLoyalty() ); break;
case CCP_LOYALTYRATE:
{
// Use global loyalty rate from UOX.INI
UI16 loyaltyRate = 0;
if( loyaltyRate == 0 )
loyaltyRate = cwmWorldState->ServerData()->SystemTimer( tSERVER_LOYALTYRATE );
*vp = INT_TO_JSVAL( loyaltyRate );
break;
}
case CCP_SHOULDSAVE: *vp = BOOLEAN_TO_JSVAL( gPriv->ShouldSave() ); break;
case CCP_PARTYLOOTABLE:
{
Party *toGet = PartyFactory::getSingleton().Get( gPriv );
if( toGet == nullptr )
*vp = BOOLEAN_TO_JSVAL( false );
else
{
PartyEntry *toScan = toGet->Find( gPriv );
if( toScan == nullptr )
*vp = BOOLEAN_TO_JSVAL( false );
else
*vp = BOOLEAN_TO_JSVAL( toScan->IsLootable() );
}
break;
}
case CCP_PARTY:
{
// Hm Quite funny, same thing as .owner
Party *tempParty = PartyFactory::getSingleton().Get( gPriv );
if( tempParty == nullptr )
{ // Return a JS_NULL
*vp = JSVAL_NULL;
}
else
{
// Otherwise Acquire an object
JSObject *myParty = JSEngine->AcquireObject( IUE_PARTY, tempParty, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myParty );
}
break;
}
case CCP_MULTI:
CMultiObj *multi;
multi = gPriv->GetMultiObj();
if( !ValidateObject( multi ) )
*vp = JSVAL_NULL;
else
{
// Otherwise Acquire an object
JSObject *myObj = JSEngine->AcquireObject( IUE_ITEM, multi, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myObj );
}
break;
case CCP_HOUSESOWNED: *vp = INT_TO_JSVAL( gPriv->CountHousesOwned( false ) ); break;
case CCP_HOUSESCOOWNED: *vp = INT_TO_JSVAL( gPriv->CountHousesOwned( true ) ); break;
default:
break;
}
}
return JS_TRUE;
}
JSBool CCharacterProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
CChar *gPriv = static_cast<CChar *>(JS_GetPrivate( cx, obj ));
if( !ValidateObject( gPriv ) )
return JS_FALSE;
JSEncapsulate encaps( cx, vp );
if( JSVAL_IS_INT( id ) )
{
switch( JSVAL_TO_INT( id ) )
{
case CCP_ACCOUNTNUM: gPriv->SetAccountNum( (UI16)encaps.toInt() ); break;
case CCP_CREATEDON: break;
case CCP_NAME: gPriv->SetName( encaps.toString() ); break;
case CCP_TITLE: gPriv->SetTitle( encaps.toString() ); break;
case CCP_X: gPriv->SetLocation( (SI16)encaps.toInt(), gPriv->GetY(), gPriv->GetZ() ); break;
case CCP_Y: gPriv->SetLocation( gPriv->GetX(), (SI16)encaps.toInt(), gPriv->GetZ() ); break;
case CCP_Z: gPriv->SetZ( (SI08)encaps.toInt() ); break;
case CCP_ID: gPriv->SetID( (UI16)encaps.toInt() ); break;
case CCP_COLOUR: gPriv->SetColour( (UI16)encaps.toInt() ); break;
case CCP_CONTROLSLOTS: gPriv->SetControlSlots( (UI16)encaps.toInt() ); break;
case CCP_CONTROLSLOTSUSED: gPriv->SetControlSlotsUsed( (UI16)encaps.toInt() ); break;
case CCP_ORNERINESS: gPriv->SetOrneriness( (UI16)encaps.toInt() ); break;
case CCP_OWNER:
if( *vp != JSVAL_NULL )
{
CChar *myChar = static_cast<CChar*>(encaps.toObject());
if( !ValidateObject( myChar ) )
break;
gPriv->SetOwner( myChar );
}
else
gPriv->SetOwner( nullptr );
break;
case CCP_VISIBLE: gPriv->SetVisible( (VisibleTypes)encaps.toInt() ); break;
case CCP_SERIAL: break;
case CCP_HEALTH: gPriv->SetHP( encaps.toInt() ); break;
case CCP_SCRIPTTRIGGER:
{
// For backwards compatibility; clears out other scripts and assigns a specific script
std::uint16_t scriptID = static_cast<UI16>(encaps.toInt());
cScript *toExecute = JSMapping->GetScript( scriptID );
if( toExecute == nullptr )
{
Console.error( oldstrutil::format("Unable to assign script trigger - script ID (%i) not found in jse_fileassociations.scp!", oldstrutil::number(scriptID).c_str()) );
}
else
{
gPriv->ClearScriptTriggers();
gPriv->AddScriptTrigger( scriptID );
}
break;
}
case CCP_SCRIPTTRIGGERS:
{
if( *vp != JSVAL_NULL )
{
std::uint16_t scriptID = static_cast<UI16>(encaps.toInt());
cScript *toExecute = JSMapping->GetScript( scriptID );
if( toExecute == nullptr )
{
Console.error( oldstrutil::format("Unable to assign script trigger - script ID (%i) not found in jse_fileassociations.scp!", oldstrutil::number(scriptID).c_str()) );
}
else
{
gPriv->AddScriptTrigger( scriptID );
}
}
else
{
// If null value was provided, clear script triggers on object
gPriv->ClearScriptTriggers();
}
break;
}
case CCP_WORLDNUMBER:
if( !Map->InsideValidWorld( gPriv->GetX(), gPriv->GetY(), (UI08)encaps.toInt() ))
return JS_FALSE;
gPriv->RemoveFromSight();
gPriv->SetLocation( gPriv->GetX(), gPriv->GetY(), gPriv->GetZ(), (UI08)encaps.toInt(), gPriv->GetInstanceID() );
if( !gPriv->IsNpc() )
SendMapChange( (UI08)encaps.toInt(), gPriv->GetSocket() );
break;
case CCP_INSTANCEID:
{
// Remove character from nearby players
gPriv->RemoveFromSight();
// Remove nearby objects from player!
if( !gPriv->IsNpc() )
{
gPriv->RemoveAllObjectsFromSight( gPriv->GetSocket() );
}
gPriv->SetLocation( gPriv->GetX(), gPriv->GetY(), gPriv->GetZ(), gPriv->WorldNumber(), (UI16)encaps.toInt() );
break;
}
case CCP_TARGET:
//TODO: Check if the user(admin per jscript) can set the target
if( *vp != JSVAL_NULL )
{
CChar *myChar = static_cast<CChar *>(encaps.toObject());
if( !ValidateObject( myChar ) )
break;
gPriv->SetTarg( myChar );
}
else
gPriv->SetTarg( nullptr );
break;
case CCP_DEXTERITY: gPriv->SetDexterity( encaps.toInt() ); break;
case CCP_INTELLIGENCE: gPriv->SetIntelligence( encaps.toInt() ); break;
case CCP_STRENGTH: gPriv->SetStrength( encaps.toInt() ); break;
case CCP_SKILLS: break;
case CCP_MANA: gPriv->SetMana( encaps.toInt() ); break;
case CCP_STAMINA: gPriv->SetStamina( encaps.toInt() ); break;
case CCP_CHARPACK: break;
case CCP_FAME: gPriv->SetFame( (SI16)encaps.toInt() ); break;
case CCP_KARMA: gPriv->SetKarma( (SI16)encaps.toInt() ); break;
case CCP_HUNGER: gPriv->SetHunger( (SI08)encaps.toInt() ); break;
case CCP_THIRST: gPriv->SetThirst( (SI08)encaps.toInt() ); break;
case CCP_CANATTACK: gPriv->SetCanAttack( encaps.toBool() ); break;
case CCP_BRKPEACE: gPriv->SetBrkPeaceChance( encaps.toInt() ); break;
case CCP_SETPEACE: gPriv->SetPeace( encaps.toInt() ); break;
case CCP_FROZEN: gPriv->SetFrozen( encaps.toBool() ); break;
case CCP_COMMANDLEVEL: gPriv->SetCommandLevel( (UI08)encaps.toInt() ); break;
case CCP_RACE: Races->gate( gPriv, (RACEID)encaps.toInt(), true ); break;
case CCP_MAXHP: gPriv->SetFixedMaxHP( (SI16)encaps.toInt() ); break;
case CCP_MAXMANA: gPriv->SetFixedMaxMana( (SI16)encaps.toInt() ); break;
case CCP_MAXSTAMINA: gPriv->SetFixedMaxStam( (SI16)encaps.toInt() ); break;
case CCP_CRIMINAL:
if( encaps.toBool() )
criminal( gPriv );
else
{
gPriv->SetTimer( tCHAR_CRIMFLAG, 0 );
UpdateFlag( gPriv );
}
break;
case CCP_INNOCENT:
if( !encaps.toBool() )
criminal( gPriv );
else
{
gPriv->SetTimer( tCHAR_CRIMFLAG, 0 );
UpdateFlag( gPriv );
}
break;
case CCP_NEUTRAL:
if( encaps.toBool() )
gPriv->SetFlagNeutral();
else
gPriv->SetFlagBlue();
gPriv->SetTimer( tCHAR_CRIMFLAG, 0 );
UpdateFlag( gPriv );
break;
case CCP_MURDERCOUNT:
gPriv->SetKills( (SI16)encaps.toInt() );
UpdateFlag( gPriv );
break;
case CCP_GENDER:
switch( (SI16)encaps.toInt() )
{
case 0: // male
if( gPriv->IsDead() )
gPriv->SetID( 0x0192 );
else
gPriv->SetID( 0x0190 );
break;
case 1: // female
if( gPriv->IsDead() )
gPriv->SetID( 0x0193 );
else
gPriv->SetID( 0x0191 );
break;
case 2: // elf male
if( gPriv->IsDead() )
gPriv->SetID( 0x025F );
else
gPriv->SetID( 0x025D );
break;
case 3: // elf female
if( gPriv->IsDead() )
gPriv->SetID( 0x0260 );
else
gPriv->SetID( 0x025E );
break;
case 4: // gargoyle male
if( gPriv->IsDead() )
gPriv->SetID( 0x02B6 );
else
gPriv->SetID( 0x029A );
break;
case 5: // gargoyle female
if( gPriv->IsDead() )
gPriv->SetID( 0x02B7 );
else
gPriv->SetID( 0x029B );
break;
default:
break;
}
break;
case CCP_NPC: gPriv->SetNpc( encaps.toBool() ); break;
case CCP_AWAKE: gPriv->SetAwake( encaps.toBool() ); break;
case CCP_DIRECTION: gPriv->SetDir( (UI08)encaps.toInt() ); break;
case CCP_REGION: gPriv->SetRegion( (UI16)encaps.toInt() ); break;
case CCP_TOWN:
cwmWorldState->townRegions[gPriv->GetTown()]->RemoveTownMember( *gPriv );
if( *vp != JSVAL_NULL )
{
cwmWorldState->townRegions[encaps.toInt()]->AddAsTownMember( *gPriv );
}
break;
case CCP_GUILD:
if( !gPriv->IsNpc() )
{
GuildSys->Resign( gPriv->GetSocket() );
if( *vp != JSVAL_NULL )
{
CGuild *myGuild = static_cast<CGuild*>(encaps.toObject());
myGuild->NewRecruit( gPriv->GetSerial() );
}
}
break;
case CCP_OLDWANDERTYPE: gPriv->SetOldNpcWander( (SI08)encaps.toInt() ); break;
case CCP_WANDERTYPE: gPriv->SetNpcWander( (SI08)encaps.toInt(), true ); break;
case CCP_FX1: gPriv->SetFx( (SI16)encaps.toInt(), 0 ); break;
case CCP_FY1: gPriv->SetFy( (SI16)encaps.toInt(), 0 ); break;
case CCP_FX2: gPriv->SetFx( (SI16)encaps.toInt(), 1 ); break;
case CCP_FY2: gPriv->SetFy( (SI16)encaps.toInt(), 1 ); break;
case CCP_FZ: gPriv->SetFz( (SI08)encaps.toInt() ); break;
case CCP_TDEXTERITY: gPriv->SetDexterity2( encaps.toInt() ); break;
case CCP_TINTELLIGENCE: gPriv->SetIntelligence2( encaps.toInt() ); break;
case CCP_TSTRENGTH: gPriv->SetStrength2( encaps.toInt() ); break;
case CCP_LIGHTLEVEL:
gPriv->SetFixedLight( (UI08)encaps.toInt() );
if( gPriv->GetSocket() != nullptr )
{
if( (UI08)encaps.toInt() == 255 )
doLight( gPriv->GetSocket(), cwmWorldState->ServerData()->WorldLightCurrentLevel() );
else
doLight( gPriv->GetSocket(), (UI08)encaps.toInt() );
}
break;
case CCP_VULNERABLE: gPriv->SetInvulnerable( !encaps.toBool() ); break;
case CCP_HUNGERSTATUS: gPriv->SetHungerStatus( encaps.toBool() ); break;
case CCP_THIRSTSTATUS: gPriv->SetThirstStatus( encaps.toBool() ); break;
case CCP_LODAMAGE: gPriv->SetLoDamage( (SI16)encaps.toInt() ); break;
case CCP_HIDAMAGE: gPriv->SetHiDamage( (SI16)encaps.toInt() ); break;
case CCP_ATWAR:
gPriv->SetWar( encaps.toBool() );
Movement->CombatWalk( gPriv );
break;
case CCP_SPELLCAST: gPriv->SetSpellCast( (SI08)encaps.toInt() ); break;
case CCP_ISCASTING:
{
bool isCasting = encaps.toBool();
gPriv->SetCasting( isCasting );
gPriv->SetJSCasting( isCasting );
}
break;
case CCP_PRIV: gPriv->SetPriv( (UI16)encaps.toInt() ); break;
case CCP_TOWNPRIV: gPriv->SetTownpriv( (SI08)encaps.toInt() ); break;
case CCP_GUILDTITLE: gPriv->SetGuildTitle( encaps.toString() ); break;
case CCP_FONTTYPE: gPriv->SetFontType( (SI08)encaps.toInt() ); break;
case CCP_SAYCOLOUR: gPriv->SetSayColour( (COLOUR)encaps.toInt() ); break;
case CCP_EMOTECOLOUR: gPriv->SetEmoteColour( (COLOUR)encaps.toInt() ); break;
case CCP_ATTACKER:
if( *vp != JSVAL_NULL )
{
CChar *myChar = static_cast<CChar *>(encaps.toObject());
if( !ValidateObject( myChar ) )
break;
gPriv->SetAttacker( myChar );
}
else
gPriv->SetAttacker( nullptr );
break;
case CCP_RACEGATE: gPriv->SetRaceGate( (RACEID)encaps.toInt() ); break;
case CCP_SKILLLOCK: break;
case CCP_DEATHS: gPriv->SetDeaths( (UI16)encaps.toInt() ); break;
case CCP_NEXTACT: gPriv->SetNextAct( (UI08)encaps.toInt() ); break;
case CCP_CELL: gPriv->SetCell( (SI08)encaps.toInt() ); break;
case CCP_ALLMOVE: gPriv->SetAllMove( encaps.toBool() ); break;
case CCP_HOUSEICONS: gPriv->SetViewHouseAsIcon( encaps.toBool() ); break;
case CCP_SPATTACK: gPriv->SetSpAttack( (SI16)encaps.toInt() ); break;
case CCP_SPDELAY: gPriv->SetSpDelay( (SI08)encaps.toInt() ); break;
case CCP_AITYPE: gPriv->SetNPCAiType( (SI16)encaps.toInt() ); break;
case CCP_SPLIT: gPriv->SetSplit( (UI08)encaps.toInt() ); break;
case CCP_SPLITCHANCE: gPriv->SetSplitChance( (UI08)encaps.toInt() ); break;
case CCP_HIRELING: gPriv->SetCanHire( encaps.toBool() ); break;
case CCP_TRAINER: gPriv->SetCanTrain( encaps.toBool() ); break;
case CCP_WEIGHT: gPriv->SetWeight( (SI32)encaps.toInt() ); break;
case CCP_SQUELCH: gPriv->SetSquelched( (UI08)encaps.toInt() ); break;
case CCP_MAGICREFLECT: gPriv->SetTempReflected( encaps.toBool() ); break;
case CCP_PERMMAGICREFLECT: gPriv->SetPermReflected( encaps.toBool() ); break;
case CCP_TAMED: gPriv->SetTamed( encaps.toBool() ); break;
case CCP_TAMEDHUNGERRATE: gPriv->SetTamedHungerRate( (UI16)encaps.toInt() ); break;
case CCP_TAMEDTHIRSTRATE: gPriv->SetTamedThirstRate( (UI16)encaps.toInt() ); break;
case CCP_THIRSTWILDCHANCE: gPriv->SetTamedThirstWildChance( (UI08)encaps.toInt() ); break;
case CCP_HUNGERWILDCHANCE: gPriv->SetTamedHungerWildChance( (UI08)encaps.toInt() ); break;
case CCP_FOODLIST: gPriv->SetFood( encaps.toString() ); break;
case CCP_MOUNTED: gPriv->SetMounted( encaps.toBool() ); break;
case CCP_STABLED: gPriv->SetStabled( encaps.toBool() ); break;
case CCP_USINGPOTION: gPriv->SetUsingPotion( encaps.toBool() ); break;
case CCP_STEALTH: gPriv->SetStealth( encaps.toInt() ); break;
case CCP_SKILLTOTAME: gPriv->SetTaming( encaps.toInt() ); break;
case CCP_SKILLTOPROV: gPriv->SetProvoing( encaps.toInt() ); break;
case CCP_SKILLTOPEACE: gPriv->SetPeaceing( encaps.toInt() ); break;
case CCP_POISON: gPriv->SetPoisoned( (UI08)encaps.toInt() ); break;
case CCP_POISONSTRENGTH: gPriv->SetPoisonStrength( (UI08)encaps.toInt() ); break;
case CCP_ISPOLYMORPHED: gPriv->IsPolymorphed( encaps.toBool() ); break;
case CCP_ISINCOGNITO: gPriv->IsIncognito( encaps.toBool() ); break;
case CCP_CANRUN: gPriv->SetRun( encaps.toBool() ); break;
case CCP_ISGUARDED: gPriv->SetGuarded( encaps.toBool() ); break;
case CCP_GUARDING:
if( *vp != JSVAL_NULL )
{
CBaseObject *myObj = static_cast<CBaseObject *>( encaps.toObject() );
if( !ValidateObject( myObj ) )
break;
gPriv->SetGuarding( myObj );
}
else
gPriv->SetGuarding( nullptr );
break;
case CCP_ISMEDITATING: gPriv->SetMeditating( encaps.toBool() ); break;
case CCP_ISGM: gPriv->SetGM( encaps.toBool() ); break;
case CCP_CANBROADCAST: gPriv->SetBroadcast( encaps.toBool() ); break;
case CCP_SINGCLICKSER: gPriv->SetSingClickSer( encaps.toBool() ); break;
case CCP_NOSKILLTITLES: gPriv->SetSkillTitles( encaps.toBool() ); break;
case CCP_ISGMPAGEABLE: gPriv->SetGMPageable( encaps.toBool() ); break;
case CCP_CANSNOOP: gPriv->SetSnoop( encaps.toBool() ); break;
case CCP_ISCOUNSELOR: gPriv->SetCounselor( encaps.toBool() ); break;
case CCP_NONEEDMANA: gPriv->SetNoNeedMana( encaps.toBool() ); break;
case CCP_ISDISPELLABLE: gPriv->SetDispellable( encaps.toBool() ); break;
case CCP_NONEEDREAGS: gPriv->SetNoNeedReags( encaps.toBool() ); break;
case CCP_ORGID: gPriv->SetOrgID( (UI16)encaps.toInt() ); break;
case CCP_ORGSKIN: gPriv->SetOrgSkin( (UI16)encaps.toInt() ); break;
case CCP_NPCFLAG:
gPriv->SetNPCFlag( (cNPC_FLAG)encaps.toInt() );
UpdateFlag( gPriv );
break;
case CCP_ISSHOP:
if( encaps.toBool() )
MakeShop( gPriv );
else
{
gPriv->SetShop( false );
CItem *tPack = nullptr;
for( UI08 i = IL_SELLCONTAINER; i <= IL_BUYCONTAINER; ++i )
{
tPack = gPriv->GetItemAtLayer( static_cast<ItemLayers>(i) );
if( ValidateObject( tPack ) )
tPack->Delete();
}
gPriv->Update();
}
break;
case CCP_ATTACKFIRST: gPriv->SetAttackFirst( encaps.toBool() ); break;
case CCP_MAXLOYALTY: gPriv->SetMaxLoyalty( (UI16)encaps.toInt() ); break;
case CCP_LOYALTY: gPriv->SetLoyalty( (UI16)encaps.toInt() ); break;
case CCP_SHOULDSAVE: gPriv->ShouldSave( encaps.toBool() ); break;
case CCP_PARTYLOOTABLE:
{
Party *toGet = PartyFactory::getSingleton().Get( gPriv );
if( toGet != nullptr )
{
PartyEntry *toScan = toGet->Find( gPriv );
if( toScan != nullptr )
toScan->IsLootable( encaps.toBool() );
}
}
break;
default:
break;
}
}
return JS_TRUE;
}
JSBool CRegionProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
CTownRegion *gPriv = static_cast<CTownRegion *>(JS_GetPrivate( cx, obj ));
if( gPriv == nullptr )
return JS_FALSE;
if( JSVAL_IS_INT( id ) )
{
JSString *tString = nullptr;
switch( JSVAL_TO_INT( id ) )
{
case CREGP_NAME:
tString = JS_NewStringCopyZ( cx, gPriv->GetName().c_str() );
*vp = STRING_TO_JSVAL( tString );
break;
case CREGP_MAYOR:
CChar *tempMayor;
tempMayor = gPriv->GetMayor();
if( !ValidateObject( tempMayor ) )
*vp = JSVAL_NULL;
else
{
// Otherwise Acquire an object
JSObject *myChar = JSEngine->AcquireObject( IUE_CHAR, tempMayor, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myChar );
}
break;
case CREGP_RACE: *vp = INT_TO_JSVAL( gPriv->GetRace() ); break;
case CREGP_TAX: *vp = INT_TO_JSVAL( gPriv->TaxedAmount() ); break;
case CREGP_TAXRESOURCE: *vp = INT_TO_JSVAL( gPriv->GetResourceID() ); break;
case CREGP_CANMARK: *vp = BOOLEAN_TO_JSVAL( gPriv->CanMark() ); break;
case CREGP_CANRECALL: *vp = BOOLEAN_TO_JSVAL( gPriv->CanRecall() ); break;
case CREGP_CANGATE: *vp = BOOLEAN_TO_JSVAL( gPriv->CanGate() ); break;
case CREGP_CANTELEPORT: *vp = BOOLEAN_TO_JSVAL( gPriv->CanTeleport() ); break;
case CREGP_CANPLACEHOUSE: *vp = BOOLEAN_TO_JSVAL( gPriv->CanPlaceHouse() ); break;
case CREGP_ISGUARDED: *vp = BOOLEAN_TO_JSVAL( gPriv->IsGuarded() ); break;
case CREGP_WORLDNUMBER: *vp = INT_TO_JSVAL( gPriv->WorldNumber() ); break;
case CREGP_INSTANCEID: *vp = INT_TO_JSVAL( gPriv->GetInstanceID() ); break;
case CREGP_CANCASTAGGRESSIVE: *vp = BOOLEAN_TO_JSVAL( gPriv->CanCastAggressive() ); break;
case CREGP_ISSAFEZONE: *vp = BOOLEAN_TO_JSVAL( gPriv->IsSafeZone() ); break;
case CREGP_HEALTH: *vp = INT_TO_JSVAL( gPriv->GetHealth() ); break;
case CREGP_ISDUNGEON: *vp = BOOLEAN_TO_JSVAL( gPriv->IsDungeon() ); break;
case CREGP_CHANCEBIGORE: *vp = INT_TO_JSVAL( gPriv->GetChanceBigOre() ); break;
case CREGP_NUMOREPREFERENCES: *vp = INT_TO_JSVAL( gPriv->GetNumOrePreferences() ); break;
case CREGP_POPULATION: *vp = INT_TO_JSVAL( gPriv->GetPopulation() ); break;
case CREGP_MEMBERS:
tString = JS_NewStringCopyZ( cx, gPriv->GetTownMemberSerials().c_str() );
*vp = STRING_TO_JSVAL( tString );
break;
case CREGP_ID: *vp = INT_TO_JSVAL( gPriv->GetRegionNum() ); break;
case CREGP_NUMGUARDS: *vp = INT_TO_JSVAL( gPriv->NumGuards() ); break;
case CREGP_SCRIPTTRIGGER:
{
// For backwards compatibility, get last scripttrigger from vector
// For older worldfiles, this will be the only scripttrigger added to the vector after load
std::vector<UI16> scriptTriggers = gPriv->GetScriptTriggers();
UI16 lastScriptTrigger = 0;
auto numberOfTriggers = scriptTriggers.size();
if( numberOfTriggers > 0 )
{
lastScriptTrigger = scriptTriggers[numberOfTriggers-1];
}
*vp = INT_TO_JSVAL( lastScriptTrigger );
break;
}
case CREGP_SCRIPTTRIGGERS:
{
jsval scriptID;
JSObject *scriptTriggersJS = JS_NewArrayObject(cx, 0, nullptr);
std::vector<UI16> scriptTriggers = gPriv->GetScriptTriggers();
for( int i = 0; i < scriptTriggers.size(); i++ )
{
scriptID = INT_TO_JSVAL( scriptTriggers[i] );
JS_SetElement(cx, scriptTriggersJS, i, &scriptID);
}
*vp = OBJECT_TO_JSVAL( scriptTriggersJS );
break;
}
case CREGP_TAXES: *vp = INT_TO_JSVAL( gPriv->GetTaxes() ); break;
case CREGP_RESERVES: *vp = INT_TO_JSVAL( gPriv->GetReserves() ); break;
case CREGP_APPEARANCE: *vp = INT_TO_JSVAL( gPriv->GetAppearance() ); break;
case CREGP_MUSIC: *vp = INT_TO_JSVAL( gPriv->GetMusicList() ); break;
case CREGP_WEATHER: *vp = INT_TO_JSVAL( gPriv->GetWeather() ); break;
case CREGP_OWNER:
tString = JS_NewStringCopyZ( cx, gPriv->GetOwner().c_str() );
*vp = STRING_TO_JSVAL( tString );
break;
default:
break;
}
}
return JS_TRUE;
}
JSBool CRegionProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
CTownRegion *gPriv = static_cast<CTownRegion *>(JS_GetPrivate( cx, obj ));
if( gPriv == nullptr )
return JS_FALSE;
JSEncapsulate encaps( cx, vp );
if( JSVAL_IS_INT( id ) )
{
switch( JSVAL_TO_INT( id ) )
{
case CREGP_NAME: gPriv->SetName( encaps.toString() ); break;
case CREGP_MAYOR: gPriv->SetMayorSerial( static_cast<UI32>( encaps.toInt() )); break;
case CREGP_RACE: gPriv->SetRace( static_cast<RACEID>( encaps.toInt() )); break;
case CREGP_TAX: gPriv->TaxedAmount( static_cast<SI16>( encaps.toInt() )); break;
case CREGP_TAXRESOURCE: gPriv->SetResourceID( static_cast<UI16>( encaps.toInt() )); break;
case CREGP_CANMARK: gPriv->CanMark( encaps.toBool() ); break;
case CREGP_CANRECALL: gPriv->CanRecall( encaps.toBool() ); break;
case CREGP_CANGATE: gPriv->CanGate( encaps.toBool() ); break;
case CREGP_CANTELEPORT: gPriv->CanTeleport( encaps.toBool() ); break;
case CREGP_CANPLACEHOUSE: gPriv->CanPlaceHouse( encaps.toBool() ); break;
case CREGP_ISGUARDED: gPriv->IsGuarded( encaps.toBool() ); break;
case CREGP_CANCASTAGGRESSIVE: gPriv->CanCastAggressive( encaps.toBool() ); break;
case CREGP_ISSAFEZONE: gPriv->IsSafeZone( encaps.toBool() ); break;
case CREGP_HEALTH: gPriv->SetHealth( static_cast<SI16>( encaps.toInt() )); break;
case CREGP_ISDUNGEON: gPriv->IsDungeon( encaps.toBool() ); break;
case CREGP_CHANCEBIGORE: gPriv->SetChanceBigOre( static_cast<UI08>( encaps.toInt() )); break;
case CREGP_NUMGUARDS: gPriv->SetNumGuards( static_cast<UI16>( encaps.toInt() )); break;
case CREGP_SCRIPTTRIGGER:
{
// For backwards compatibility; clears out other scripts and assigns a specific script
std::uint16_t scriptID = static_cast<UI16>(encaps.toInt());
cScript *toExecute = JSMapping->GetScript( scriptID );
if( toExecute == nullptr )
{
Console.error( oldstrutil::format("Unable to assign script trigger - script ID (%i) not found in jse_fileassociations.scp!", oldstrutil::number(scriptID).c_str()) );
}
else
{
gPriv->ClearScriptTriggers();
gPriv->AddScriptTrigger( scriptID );
}
break;
}
case CREGP_SCRIPTTRIGGERS:
{
if( *vp != JSVAL_NULL )
{
std::uint16_t scriptID = static_cast<UI16>(encaps.toInt());
cScript *toExecute = JSMapping->GetScript( scriptID );
if( toExecute == nullptr )
{
Console.error( oldstrutil::format("Unable to assign script trigger - script ID (%i) not found in jse_fileassociations.scp!", oldstrutil::number(scriptID).c_str()) );
}
else
{
gPriv->AddScriptTrigger( scriptID );
}
}
else
{
// If null value was provided, clear script triggers on object
gPriv->ClearScriptTriggers();
}
break;
}
case CREGP_TAXES: gPriv->SetTaxesLeft( static_cast<UI32>( encaps.toInt() )); break;
case CREGP_RESERVES: gPriv->SetReserves( static_cast<UI32>( encaps.toInt() )); break;
case CREGP_APPEARANCE: gPriv->SetAppearance( static_cast<WorldType>( encaps.toInt() )); break;
case CREGP_MUSIC: gPriv->SetMusicList( static_cast<UI16>( encaps.toInt() )); break;
case CREGP_WEATHER: gPriv->SetWeather( static_cast<weathID>( encaps.toInt() )); break;
case CREGP_WORLDNUMBER: gPriv->WorldNumber( static_cast<UI08>( encaps.toInt() )); break;
case CREGP_INSTANCEID: gPriv->SetInstanceID( static_cast<UI16>( encaps.toInt() )); break;
case CREGP_MEMBERS:
break;
default:
break;
}
}
return JS_TRUE;
}
JSBool CSpawnRegionProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
CSpawnRegion *gPriv = static_cast<CSpawnRegion *>( JS_GetPrivate( cx, obj ) );
if( gPriv == nullptr )
return JS_FALSE;
if( JSVAL_IS_INT( id ) )
{
JSString *tString = nullptr;
switch( JSVAL_TO_INT( id ) )
{
case CSPAWNREGP_NAME:
tString = JS_NewStringCopyZ( cx, gPriv->GetName().c_str() );
*vp = STRING_TO_JSVAL( tString );
break;
case CSPAWNREGP_REGIONNUM: *vp = INT_TO_JSVAL( gPriv->GetRegionNum() ); break;
case CSPAWNREGP_ITEM:
case CSPAWNREGP_ITEMLIST:
{
// This could potentially be a list of item ids - let's convert it to a comma-separated string!
auto itemList = gPriv->GetItem();
std::string s;
for( const auto &piece : itemList )
{
if( s.empty() )
s += piece;
else
s += ( "," + piece );
}
tString = JS_NewStringCopyZ( cx, s.c_str() );
*vp = STRING_TO_JSVAL( tString );
}
break;
case CSPAWNREGP_NPC:
case CSPAWNREGP_NPCLIST:
{
// This could potentially be a list of NPC ids - let's convert it to a comma-separated string!
auto npcList = gPriv->GetNPC();
std::string s;
for( const auto &piece : npcList )
{
if( s.empty() )
s += piece;
else
s += ( "," + piece );
}
tString = JS_NewStringCopyZ( cx, s.c_str() );
*vp = STRING_TO_JSVAL( tString );
}
break;
case CSPAWNREGP_ITEMCOUNT: *vp = INT_TO_JSVAL( gPriv->GetCurrentItemAmt() ); break;
case CSPAWNREGP_NPCCOUNT: *vp = INT_TO_JSVAL( gPriv->GetCurrentCharAmt() ); break;
case CSPAWNREGP_MAXITEMS: *vp = INT_TO_JSVAL( gPriv->GetMaxItemSpawn() ); break;
case CSPAWNREGP_MAXNPCS: *vp = INT_TO_JSVAL( gPriv->GetMaxCharSpawn() ); break;
case CSPAWNREGP_MINTIME: *vp = INT_TO_JSVAL( gPriv->GetMinTime() ); break;
case CSPAWNREGP_MAXTIME: *vp = INT_TO_JSVAL( gPriv->GetMaxTime() ); break;
case CSPAWNREGP_ONLYOUTSIDE: *vp = BOOLEAN_TO_JSVAL( gPriv->GetOnlyOutside() ); break;
case CSPAWNREGP_ISSPAWNER: *vp = BOOLEAN_TO_JSVAL( gPriv->IsSpawner() ); break;
case CSPAWNREGP_X1: *vp = INT_TO_JSVAL( gPriv->GetX1() ); break;
case CSPAWNREGP_Y1: *vp = INT_TO_JSVAL( gPriv->GetY1() ); break;
case CSPAWNREGP_X2: *vp = INT_TO_JSVAL( gPriv->GetX2() ); break;
case CSPAWNREGP_Y2: *vp = INT_TO_JSVAL( gPriv->GetY2() ); break;
case CSPAWNREGP_PREFZ: *vp = INT_TO_JSVAL( gPriv->GetPrefZ() ); break;
case CSPAWNREGP_WORLD: *vp = INT_TO_JSVAL( gPriv->WorldNumber() ); break;
case CSPAWNREGP_INSTANCEID: *vp = INT_TO_JSVAL( gPriv->GetInstanceID() ); break;
case CSPAWNREGP_CALL: *vp = INT_TO_JSVAL( gPriv->GetCall() ); break;
default:
break;
}
}
return JS_TRUE;
}
JSBool CSpawnRegionProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
CSpawnRegion *gPriv = static_cast<CSpawnRegion *>( JS_GetPrivate( cx, obj ) );
if( gPriv == nullptr )
return JS_FALSE;
JSEncapsulate encaps( cx, vp );
if( JSVAL_IS_INT( id ) )
{
switch( JSVAL_TO_INT( id ) )
{
case CSPAWNREGP_NAME: gPriv->SetName( encaps.toString() ); break;
case CSPAWNREGP_ITEM: gPriv->SetItem( encaps.toString() ); break;
case CSPAWNREGP_ITEMLIST: gPriv->SetItemList( encaps.toString() ); break;
case CSPAWNREGP_NPC: gPriv->SetNPC( encaps.toString() ); break;
case CSPAWNREGP_NPCLIST: gPriv->SetNPCList( encaps.toString() ); break;
case CSPAWNREGP_REGIONNUM: gPriv->SetRegionNum( (UI16)encaps.toInt() ); break;
case CSPAWNREGP_MAXITEMS: gPriv->SetMaxItemSpawn( encaps.toInt() ); break;
case CSPAWNREGP_MAXNPCS: gPriv->SetMaxCharSpawn( encaps.toInt() ); break;
case CSPAWNREGP_MINTIME: gPriv->SetMinTime( (UI08)encaps.toInt() ); break;
case CSPAWNREGP_MAXTIME: gPriv->SetMaxTime( (UI08)encaps.toInt() ); break;
case CSPAWNREGP_ONLYOUTSIDE: gPriv->SetOnlyOutside( encaps.toBool() ); break;
case CSPAWNREGP_ISSPAWNER: gPriv->IsSpawner( encaps.toBool() ); break;
case CSPAWNREGP_X1: gPriv->SetX1( (SI16)encaps.toInt() ); break;
case CSPAWNREGP_Y1: gPriv->SetY1( (SI16)encaps.toInt() ); break;
case CSPAWNREGP_X2: gPriv->SetX2( (SI16)encaps.toInt() ); break;
case CSPAWNREGP_Y2: gPriv->SetY2( (SI16)encaps.toInt() ); break;
case CSPAWNREGP_PREFZ: gPriv->SetPrefZ( (SI08)encaps.toInt() ); break;
case CSPAWNREGP_WORLD: gPriv->WorldNumber( (UI08)encaps.toInt() ); break;
case CSPAWNREGP_INSTANCEID: gPriv->SetInstanceID( (UI08)encaps.toInt() ); break;
case CSPAWNREGP_CALL: gPriv->SetCall( (UI16)encaps.toInt() ); break;
default:
break;
}
}
return JS_TRUE;
}
JSBool CGuildProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
CGuild *gPriv = static_cast<CGuild *>(JS_GetPrivate( cx, obj ));
if( gPriv == nullptr )
return JS_FALSE;
if( JSVAL_IS_INT( id ) )
{
JSString *tString = nullptr;
switch( JSVAL_TO_INT( id ) )
{
case CGP_NAME:
tString = JS_NewStringCopyZ( cx, gPriv->Name().c_str() );
*vp = STRING_TO_JSVAL( tString );
break;
case CGP_TYPE: *vp = INT_TO_JSVAL( gPriv->Type() ); break;
case CGP_MASTER:
CChar *gMaster;
gMaster = calcCharObjFromSer( gPriv->Master() );
if( !ValidateObject( gMaster ) )
*vp = JSVAL_NULL;
else
{
// Otherwise Acquire an object
JSObject *myChar = JSEngine->AcquireObject( IUE_CHAR, gMaster, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myChar );
}
break;
case CGP_STONE:
CItem *gStone;
gStone = calcItemObjFromSer( gPriv->Stone() );
if( !ValidateObject( gStone ) )
*vp = JSVAL_NULL;
else
{
// Otherwise Acquire an object
JSObject *myItem = JSEngine->AcquireObject( IUE_ITEM, gStone, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myItem );
}
break;
case CGP_NUMMEMBERS: *vp = INT_TO_JSVAL( gPriv->NumMembers() ); break;
case CGP_NUMRECRUITS: *vp = INT_TO_JSVAL( gPriv->NumRecruits() ); break;
case CGP_MEMBERS:
case CGP_RECRUITS:
break;
case CGP_CHARTER:
tString = JS_NewStringCopyZ( cx, gPriv->Charter().c_str() );
*vp = STRING_TO_JSVAL( tString );
break;
case CGP_ABBREVIATION:
tString = JS_NewStringCopyZ( cx, gPriv->Abbreviation().c_str() );
*vp = STRING_TO_JSVAL( tString );
break;
case CGP_WEBPAGE:
tString = JS_NewStringCopyZ( cx, gPriv->Webpage().c_str() );
*vp = STRING_TO_JSVAL( tString );
break;
default:
break;
}
}
return JS_TRUE;
}
JSBool CGuildProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
CGuild *gPriv = static_cast<CGuild *>(JS_GetPrivate( cx, obj ));
if( gPriv == nullptr )
return JS_FALSE;
JSEncapsulate encaps( cx, vp );
if( JSVAL_IS_INT( id ) )
{
switch( JSVAL_TO_INT( id ) )
{
case CGP_NAME: gPriv->Name( encaps.toString() ); break;
case CGP_TYPE: gPriv->Type( (GuildType)encaps.toInt() ); break;
case CGP_MASTER:
if( *vp != JSVAL_NULL )
{
CChar *myChar = static_cast<CChar*>(encaps.toObject());
if( !ValidateObject( myChar ) )
break;
gPriv->Master( (*myChar) );
}
else
gPriv->Master( INVALIDSERIAL );
break;
case CGP_STONE:
if( *vp != JSVAL_NULL )
{
CItem *myItem = static_cast<CItem *>(encaps.toObject());
if( !ValidateObject( myItem ) )
break;
gPriv->Stone( (*myItem) );
}
else
gPriv->Stone( INVALIDSERIAL );
break;
case CGP_MEMBERS:
case CGP_RECRUITS:
break;
case CGP_CHARTER: gPriv->Charter( encaps.toString() ); break;
case CGP_ABBREVIATION: gPriv->Abbreviation( encaps.toString().c_str() ); break;
case CGP_WEBPAGE: gPriv->Webpage( encaps.toString() ); break;
default:
break;
}
}
return JS_TRUE;
}
JSBool CRaceProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
CRace *gPriv = static_cast<CRace *>(JS_GetPrivate( cx, obj ));
if( gPriv == nullptr )
return JS_FALSE;
if( JSVAL_IS_INT( id ) )
{
JSString *tString = nullptr;
UI08 TempRace = 0;
switch( JSVAL_TO_INT( id ) )
{
case CRP_ID:
for( TempRace = 0; TempRace < Races->Count(); ++TempRace )
{
if( Races->Race( TempRace ) == gPriv )
{
*vp = INT_TO_JSVAL( TempRace );
break;
}
}
break;
case CRP_NAME:
tString = JS_NewStringCopyZ( cx, gPriv->Name().c_str() );
*vp = STRING_TO_JSVAL( tString );
break;
case CRP_WEAKTOWEATHER:
break;
case CRP_REQUIRESBEARD: *vp = BOOLEAN_TO_JSVAL( gPriv->RequiresBeard() ); break;
case CRP_REQUIRESNOBEARD: *vp = BOOLEAN_TO_JSVAL( gPriv->NoBeard() ); break;
case CRP_ISPLAYERRACE: *vp = BOOLEAN_TO_JSVAL( gPriv->IsPlayerRace() ); break;
case CRP_GENDERRESTRICT: *vp = INT_TO_JSVAL( gPriv->GenderRestriction() ); break;
case CRP_ARMOURCLASS: *vp = INT_TO_JSVAL( gPriv->ArmourClassRestriction() ); break;
case CRP_LANGUAGESKILLMIN: *vp = INT_TO_JSVAL( gPriv->LanguageMin() ); break;
case CRP_SKILLADJUSTMENT:
break;
case CRP_POISONRESISTANCE: JS_NewNumberValue( cx, gPriv->PoisonResistance(), vp ); break;
case CRP_MAGICRESISTANCE: JS_NewNumberValue( cx, gPriv->MagicResistance(), vp ); break;
case CRP_VISIBLEDISTANCE: *vp = INT_TO_JSVAL( gPriv->VisibilityRange() ); break;
case CRP_NIGHTVISION: *vp = INT_TO_JSVAL( gPriv->NightVision() ); break;
default:
break;
}
}
return JS_TRUE;
}
JSBool CRaceProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
CRace *gPriv = static_cast<CRace *>(JS_GetPrivate( cx, obj ));
if( gPriv == nullptr )
return JS_FALSE;
JSEncapsulate encaps( cx, vp );
if( JSVAL_IS_INT( id ) )
{
switch( JSVAL_TO_INT( id ) )
{
case CRP_NAME: gPriv->Name( encaps.toString() ); break;
case CRP_WEAKTOWEATHER:
break;
case CRP_REQUIRESBEARD: gPriv->RequiresBeard( encaps.toBool() ); break;
case CRP_REQUIRESNOBEARD: gPriv->NoBeard( encaps.toBool() ); break;
case CRP_ISPLAYERRACE: gPriv->IsPlayerRace( encaps.toBool() ); break;
case CRP_GENDERRESTRICT: gPriv->GenderRestriction( (GENDER)encaps.toInt() ); break;
case CRP_ARMOURCLASS: gPriv->ArmourClassRestriction( (UI08)encaps.toInt() ); break;
case CRP_LANGUAGESKILLMIN: gPriv->LanguageMin( (UI16)encaps.toInt() ); break;
case CRP_SKILLADJUSTMENT:
break;
case CRP_POISONRESISTANCE: gPriv->PoisonResistance( encaps.toFloat() ); break;
case CRP_MAGICRESISTANCE: gPriv->MagicResistance( encaps.toFloat() ); break;
case CRP_VISIBLEDISTANCE: gPriv->VisibilityRange( (SI08)encaps.toInt() ); break;
case CRP_NIGHTVISION: gPriv->NightVision( (UI08)encaps.toInt() ); break;
default:
break;
}
}
return JS_TRUE;
}
JSBool CSocketProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
CSocket *gPriv = static_cast<CSocket *>(JS_GetPrivate( cx, obj ));
if( gPriv == nullptr )
return JS_FALSE;
JSEncapsulate encaps( cx, vp );
if( JSVAL_IS_INT( id ) )
{
switch( JSVAL_TO_INT( id ) )
{
case CSOCKP_ACCOUNT:
break;
case CSOCKP_CURRENTCHAR:
{
CChar *mChar = static_cast<CChar *>(encaps.toObject());
if( ValidateObject( mChar ) )
gPriv->CurrcharObj( mChar );
}
break;
case CSOCKP_IDLETIMEOUT:
break;
case CSOCKP_WASIDLEWARNED: gPriv->WasIdleWarned( encaps.toBool() ); break;
case CSOCKP_TEMPINT: gPriv->TempInt( encaps.toInt() ); break;
case CSOCKP_TEMPINT2: gPriv->TempInt2( encaps.toInt() ); break; // Reserved for JS usage
case CSOCKP_TEMPOBJ:
if( *vp == JSVAL_NULL )
gPriv->TempObj( nullptr );
else
gPriv->TempObj( static_cast<CBaseObject *>(encaps.toObject() )); break;
case CSOCKP_TEMPOBJ2: // Reserved for JS usage
if( *vp == JSVAL_NULL )
gPriv->TempObj2( nullptr );
else
gPriv->TempObj2( static_cast<CBaseObject *>(encaps.toObject() )); break;
case CSOCKP_BUFFER:
break;
case CSOCKP_XTEXT: gPriv->XText( encaps.toString() ); break;
case CSOCKP_CLICKZ: gPriv->ClickZ( (SI08)encaps.toInt() ); break;
case CSOCKP_ADDID:
break;
case CSOCKP_NEWCLIENT: gPriv->NewClient( encaps.toBool() ); break;
case CSOCKP_FIRSTPACKET: gPriv->FirstPacket( encaps.toBool() ); break;
case CSOCKP_CRYPTCLIENT: gPriv->CryptClient( encaps.toBool() ); break;
case CSOCKP_CLIENTIP:
break;
case CSOCKP_WALKSEQUENCE: gPriv->WalkSequence( (SI16)encaps.toInt() ); break;
case CSOCKP_CURRENTSPELLTYPE: gPriv->CurrentSpellType( (SI08)encaps.toInt() ); break;
case CSOCKP_LOGGING: gPriv->Logging( encaps.toBool() ); break;
case CSOCKP_BYTESSENT:
case CSOCKP_BYTESRECEIVED:
break;
case CSOCKP_TARGETOK: gPriv->TargetOK( encaps.toBool() ); break;
case CSOCKP_CLICKX: gPriv->ClickX( (SI16)encaps.toInt() ); break;
case CSOCKP_CLICKY: gPriv->ClickY( (SI16)encaps.toInt() ); break;
case CSOCKP_PICKUPX: gPriv->PickupX( (SI16)encaps.toInt() ); break;
case CSOCKP_PICKUPY: gPriv->PickupY( (SI16)encaps.toInt() ); break;
case CSOCKP_PICKUPZ: gPriv->PickupZ( (SI08)encaps.toInt() ); break;
case CSOCKP_PICKUPSPOT: gPriv->PickupSpot( (PickupLocations)encaps.toInt() ); break;
case CSOCKP_PICKUPSERIAL:
break;
case CSOCKP_LANGUAGE: gPriv->Language( (UnicodeTypes)encaps.toInt() ); break;
case CSOCKP_CLIENTMAJORVER: gPriv->ClientVersionMajor( (UI08)encaps.toInt() ); break;
case CSOCKP_CLIENTMINORVER: gPriv->ClientVersionMinor( (UI08)encaps.toInt() ); break;
case CSOCKP_CLIENTSUBVER: gPriv->ClientVersionSub( (UI08)encaps.toInt() ); break;
case CSOCKP_CLIENTLETTERVER: gPriv->ClientVersionLetter( (UI08)encaps.toInt() ); break;
case CSOCKP_CLIENTTYPE: gPriv->ClientType( (ClientTypes)encaps.toInt() ); break;
default:
break;
}
}
return JS_TRUE;
}
JSBool CSocketProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
CSocket *gPriv = static_cast<CSocket *>(JS_GetPrivate( cx, obj ));
if( gPriv == nullptr )
return JS_FALSE;
if( JSVAL_IS_INT( id ) )
{
CChar *myChar;
JSString *tString = nullptr;
switch( JSVAL_TO_INT( id ) )
{
case CSOCKP_ACCOUNT:
{
CAccountBlock *accountBlock = &gPriv->GetAccount();
if( accountBlock == nullptr )
*vp = JSVAL_NULL;
else
{ // Otherwise Acquire an object
JSObject *accountObj = JSEngine->AcquireObject( IUE_ACCOUNT, accountBlock, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( accountObj );
}
break;
}
case CSOCKP_CURRENTCHAR:
myChar = gPriv->CurrcharObj();
if( !ValidateObject( myChar ) )
*vp = JSVAL_NULL;
else
{
JSObject *myObj = JSEngine->AcquireObject( IUE_CHAR, myChar, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myObj );
}
case CSOCKP_IDLETIMEOUT:
break;
case CSOCKP_WASIDLEWARNED: *vp = BOOLEAN_TO_JSVAL( gPriv->WasIdleWarned() ); break;
case CSOCKP_TEMPINT: *vp = INT_TO_JSVAL( gPriv->TempInt() ); break;
case CSOCKP_TEMPINT2: *vp = INT_TO_JSVAL( gPriv->TempInt2() ); break;
case CSOCKP_TEMPOBJ:
{
CBaseObject *mObj = gPriv->TempObj();
if( !ValidateObject( mObj ) )
*vp = JSVAL_NULL;
else
{
JSObject *myObj = nullptr;
if( mObj->CanBeObjType( OT_ITEM ) )
myObj = JSEngine->AcquireObject( IUE_ITEM, mObj, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
else
myObj = JSEngine->AcquireObject( IUE_CHAR, mObj, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myObj );
}
}
break;
case CSOCKP_TEMPOBJ2:
{
CBaseObject *mObj = gPriv->TempObj2();
if( !ValidateObject( mObj ) )
*vp = JSVAL_NULL;
else
{
JSObject *myObj = nullptr;
if( mObj->CanBeObjType( OT_ITEM ) )
myObj = JSEngine->AcquireObject( IUE_ITEM, mObj, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
else
myObj = JSEngine->AcquireObject( IUE_CHAR, mObj, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myObj );
}
}
break;
case CSOCKP_BUFFER:
break;
case CSOCKP_XTEXT: tString = JS_NewStringCopyZ( cx, gPriv->XText().c_str() );
*vp = STRING_TO_JSVAL( tString ); break;
case CSOCKP_CLICKZ: *vp = INT_TO_JSVAL( gPriv->ClickZ() ); break;
case CSOCKP_ADDID:
break;
case CSOCKP_NEWCLIENT: *vp = BOOLEAN_TO_JSVAL( gPriv->NewClient() ); break;
case CSOCKP_FIRSTPACKET: *vp = BOOLEAN_TO_JSVAL( gPriv->FirstPacket() ); break;
case CSOCKP_CRYPTCLIENT: *vp = BOOLEAN_TO_JSVAL( gPriv->CryptClient() ); break;
case CSOCKP_CLIENTIP:
break;
case CSOCKP_WALKSEQUENCE: *vp = INT_TO_JSVAL( gPriv->WalkSequence() ); break;
case CSOCKP_CURRENTSPELLTYPE: *vp = INT_TO_JSVAL( gPriv->CurrentSpellType() ); break;
case CSOCKP_LOGGING: *vp = BOOLEAN_TO_JSVAL( gPriv->Logging() ); break;
case CSOCKP_BYTESSENT: *vp = INT_TO_JSVAL( gPriv->BytesSent() ); break;
case CSOCKP_BYTESRECEIVED: *vp = INT_TO_JSVAL( gPriv->BytesReceived() ); break;
case CSOCKP_TARGETOK: *vp = BOOLEAN_TO_JSVAL( gPriv->TargetOK() ); break;
case CSOCKP_CLICKX: *vp = INT_TO_JSVAL( gPriv->ClickX() ); break;
case CSOCKP_CLICKY: *vp = INT_TO_JSVAL( gPriv->ClickY() ); break;
case CSOCKP_PICKUPX: *vp = INT_TO_JSVAL( gPriv->PickupX() ); break;
case CSOCKP_PICKUPY: *vp = INT_TO_JSVAL( gPriv->PickupY() ); break;
case CSOCKP_PICKUPZ: *vp = INT_TO_JSVAL( gPriv->PickupZ() ); break;
case CSOCKP_PICKUPSPOT: *vp = INT_TO_JSVAL( gPriv->PickupSpot() ); break;
case CSOCKP_PICKUPSERIAL:
break;
case CSOCKP_LANGUAGE: *vp = INT_TO_JSVAL( gPriv->Language() ); break;
case CSOCKP_CLIENTMAJORVER: *vp = INT_TO_JSVAL( gPriv->ClientVersionMajor() ); break;
case CSOCKP_CLIENTMINORVER: *vp = INT_TO_JSVAL( gPriv->ClientVersionMinor() ); break;
case CSOCKP_CLIENTSUBVER: *vp = INT_TO_JSVAL( gPriv->ClientVersionSub() ); break;
case CSOCKP_CLIENTLETTERVER: *vp = INT_TO_JSVAL( gPriv->ClientVersionLetter() ); break;
case CSOCKP_CLIENTTYPE: *vp = INT_TO_JSVAL( gPriv->ClientType() ); break;
case CSOCKP_TARGET:
{
SERIAL mySerial = gPriv->GetDWord( 7 );
// Item
if( mySerial >= BASEITEMSERIAL )
{
CItem *myItem = calcItemObjFromSer( mySerial );
if( !ValidateObject( myItem ) )
{
*vp = JSVAL_NULL;
return JS_TRUE;
}
JSObject *myObj = JSEngine->AcquireObject( IUE_ITEM, myItem, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myObj );
}
// Char
else
{
CChar *myChar = calcCharObjFromSer( mySerial );
if( !ValidateObject( myChar ) )
{
*vp = JSVAL_NULL;
return JS_TRUE;
}
JSObject *myObj = JSEngine->AcquireObject( IUE_CHAR, myChar, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myObj );
}
return JS_TRUE;
}
break;
default:
break;
}
}
return JS_TRUE;
}
JSBool CSkillsProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
JSEncapsulate myClass( cx, obj );
CChar *myChar = static_cast<CChar*>(myClass.toObject());
if( !ValidateObject( myChar ) )
return JS_FALSE;
UI08 SkillID = (UI08)JSVAL_TO_INT( id );
if( myClass.ClassName() == "UOXSkills" )
*vp = INT_TO_JSVAL( myChar->GetSkill( SkillID ) );
else if( myClass.ClassName() == "UOXBaseSkills" )
*vp = INT_TO_JSVAL( myChar->GetBaseSkill( SkillID ) );
else if( myClass.ClassName() == "UOXSkillsUsed" )
*vp = BOOLEAN_TO_JSVAL( myChar->SkillUsed( SkillID ) );
else if( myClass.ClassName() == "UOXSkillsLock" )
*vp = INT_TO_JSVAL( (UI08)myChar->GetSkillLock( SkillID ) );
return JS_TRUE;
}
JSBool CSkillsProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
JSEncapsulate myClass( cx, obj );
CChar *myChar = static_cast<CChar*>(myClass.toObject());
if( !ValidateObject( myChar ) )
return JS_FALSE;
JSEncapsulate encaps( cx, vp );
UI08 SkillID = (UI08)JSVAL_TO_INT( id );
SI16 NewSkillValue = (SI16)encaps.toInt();
UI08 i = 0;
if( myClass.ClassName() == "UOXSkills" )
{
if( SkillID == ALLSKILLS )
{
for( i = 0; i < ALLSKILLS; ++i )
{
myChar->SetSkill( NewSkillValue, i );
}
}
else
{
myChar->SetSkill( NewSkillValue, SkillID );
}
}
else if( myClass.ClassName() == "UOXBaseSkills" )
{
if( SkillID == ALLSKILLS )
{
for( i = 0; i < ALLSKILLS; ++i )
{
myChar->SetBaseSkill( NewSkillValue, i );
Skills->updateSkillLevel( myChar, i );
}
}
else
{
myChar->SetBaseSkill( NewSkillValue, SkillID );
Skills->updateSkillLevel( myChar, SkillID );
}
}
else if( myClass.ClassName() == "UOXSkillsUsed" )
{
if( SkillID == ALLSKILLS )
{
for( i = 0; i < ALLSKILLS; ++i )
{
myChar->SkillUsed( encaps.toBool(), i );
}
}
else
{
myChar->SkillUsed( encaps.toBool(), SkillID );
}
}
else if( myClass.ClassName() == "UOXSkillsLock" )
{
if( SkillID == ALLSKILLS )
{
for( i = 0; i < ALLSKILLS; ++i )
{
myChar->SetSkillLock( (SkillLock)NewSkillValue, i );
}
}
else
{
myChar->SetSkillLock( (SkillLock)NewSkillValue, SkillID );
}
}
if( !myChar->IsNpc() )
{
CSocket *toFind = myChar->GetSocket();
if( toFind != nullptr )
{
if( SkillID == ALLSKILLS )
{
for( i = 0; i < ALLSKILLS; ++i )
{
toFind->updateskill( i );
}
}
else
{
toFind->updateskill( SkillID );
}
}
}
return JS_TRUE;
}
JSBool CGumpDataProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
SEGumpData *gPriv = static_cast<SEGumpData *>(JS_GetPrivate( cx, obj ));
if( gPriv == nullptr )
return JS_FALSE;
if( JSVAL_IS_INT( id ) )
{
switch( JSVAL_TO_INT( id ) )
{
case CGumpData_ID:
*vp = INT_TO_JSVAL( gPriv->nIDs.size()) ;
break ;
case CGumpData_Button:
*vp = INT_TO_JSVAL( gPriv->nButtons.size()) ;
break ;
default:
break;
}
}
return JS_TRUE;
}
JSBool CAccountProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
CAccountBlock *myAccount = static_cast<CAccountBlock *>(JS_GetPrivate( cx, obj ));
if( myAccount == nullptr )
return JS_FALSE;
if( JSVAL_IS_INT( id ) )
{
JSString *tString = nullptr;
switch( JSVAL_TO_INT( id ) )
{
case CACCOUNT_ID: *vp = INT_TO_JSVAL( myAccount->wAccountIndex ); break;
case CACCOUNT_USERNAME:
tString = JS_NewStringCopyZ( cx, (myAccount->sUsername).c_str() );
*vp = STRING_TO_JSVAL( tString );
break ;
case CACCOUNT_PASSWORD: // NO.
case CACCOUNT_PATH: // Nah.
break;
case CACCOUNT_FLAGS: *vp = INT_TO_JSVAL( (myAccount->wFlags).to_ulong() ); break;
case CACCOUNT_COMMENT:
tString = JS_NewStringCopyZ( cx, (myAccount->sContact).c_str() );
*vp = STRING_TO_JSVAL( tString );
break;
case CACCOUNT_TIMEBAN: *vp = INT_TO_JSVAL( myAccount->wTimeBan ); break;
case CACCOUNT_FIRSTLOGIN: *vp = INT_TO_JSVAL( myAccount->wFirstLogin ); break;
case CACCOUNT_CHARACTER1:
{
if( myAccount->dwCharacters[0] != INVALIDSERIAL )
{
CBaseObject *TempObj = myAccount->lpCharacters[0];
if( !ValidateObject( TempObj ) )
*vp = JSVAL_NULL;
else
{
// Otherwise Acquire an object
JSObject *myChar = JSEngine->AcquireObject( IUE_CHAR, TempObj, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myChar );
}
}
else
*vp = JSVAL_NULL;
break;
}
case CACCOUNT_CHARACTER2:
{
if( myAccount->dwCharacters[1] != INVALIDSERIAL )
{
CBaseObject *TempObj = myAccount->lpCharacters[1];
if( !ValidateObject( TempObj ) )
*vp = JSVAL_NULL;
else
{
// Otherwise Acquire an object
JSObject *myChar = JSEngine->AcquireObject( IUE_CHAR, TempObj, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myChar );
}
}
else
*vp = JSVAL_NULL;
break;
}
case CACCOUNT_CHARACTER3:
{
if( myAccount->dwCharacters[2] != INVALIDSERIAL )
{
CBaseObject *TempObj = myAccount->lpCharacters[2];
if( !ValidateObject( TempObj ) )
*vp = JSVAL_NULL;
else
{
// Otherwise Acquire an object
JSObject *myChar = JSEngine->AcquireObject( IUE_CHAR, TempObj, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myChar );
}
}
else
*vp = JSVAL_NULL;
break;
}
case CACCOUNT_CHARACTER4:
{
if( myAccount->dwCharacters[3] != INVALIDSERIAL )
{
CBaseObject *TempObj = myAccount->lpCharacters[3];
if( !ValidateObject( TempObj ) )
*vp = JSVAL_NULL;
else
{
// Otherwise Acquire an object
JSObject *myChar = JSEngine->AcquireObject( IUE_CHAR, TempObj, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myChar );
}
}
else
*vp = JSVAL_NULL;
break;
}
case CACCOUNT_CHARACTER5:
{
if( myAccount->dwCharacters[4] != INVALIDSERIAL )
{
CBaseObject *TempObj = myAccount->lpCharacters[4];
if( !ValidateObject( TempObj ) )
*vp = JSVAL_NULL;
else
{
// Otherwise Acquire an object
JSObject *myChar = JSEngine->AcquireObject( IUE_CHAR, TempObj, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myChar );
}
}
else
*vp = JSVAL_NULL;
break;
}
case CACCOUNT_CHARACTER6:
{
if( myAccount->dwCharacters[5] != INVALIDSERIAL )
{
CBaseObject *TempObj = myAccount->lpCharacters[5];
if( !ValidateObject( TempObj ) )
*vp = JSVAL_NULL;
else
{
// Otherwise Acquire an object
JSObject *myChar = JSEngine->AcquireObject( IUE_CHAR, TempObj, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myChar );
}
}
else
*vp = JSVAL_NULL;
break;
}
case CACCOUNT_CHARACTER7:
{
if( myAccount->dwCharacters[6] != INVALIDSERIAL )
{
CBaseObject *TempObj = myAccount->lpCharacters[6];
if( !ValidateObject( TempObj ) )
*vp = JSVAL_NULL;
else
{
// Otherwise Acquire an object
JSObject *myChar = JSEngine->AcquireObject( IUE_CHAR, TempObj, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myChar );
}
}
else
*vp = JSVAL_NULL;
break;
}
case CACCOUNT_CURRENTCHAR:
{
if( myAccount->dwInGame != INVALIDSERIAL )
{
CChar *TempObj = calcCharObjFromSer( myAccount->dwInGame );
if( !ValidateObject( TempObj ) )
*vp = JSVAL_NULL;
else
{
// Otherwise Acquire an object
JSObject *myChar = JSEngine->AcquireObject( IUE_CHAR, TempObj, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myChar );
}
}
else
*vp = JSVAL_NULL;
break;
}
case CACCOUNT_LASTIP:
{
std::string ipString = oldstrutil::number(static_cast<SI32>((myAccount->dwLastIP&0xFF000000)>>24))
+ "." + oldstrutil::number(static_cast<SI32>((myAccount->dwLastIP&0x00FF0000)>>16))
+ "." + oldstrutil::number(static_cast<SI32>((myAccount->dwLastIP&0x0000FF00)>>8))
+ "." + oldstrutil::number(static_cast<SI32>((myAccount->dwLastIP&0x000000FF)%256));
tString = JS_NewStringCopyZ( cx, ipString.c_str() );
*vp = STRING_TO_JSVAL( tString );
break;
}
case CACCOUNT_BANNED: *vp = BOOLEAN_TO_JSVAL( myAccount->wFlags.test( AB_FLAGS_BANNED ) ); break;
case CACCOUNT_SUSPENDED: *vp = BOOLEAN_TO_JSVAL( myAccount->wFlags.test( AB_FLAGS_SUSPENDED ) ); break;
case CACCOUNT_PUBLIC: *vp = BOOLEAN_TO_JSVAL( myAccount->wFlags.test( AB_FLAGS_PUBLIC ) ); break;
case CACCOUNT_ONLINE: *vp = BOOLEAN_TO_JSVAL( myAccount->wFlags.test( AB_FLAGS_ONLINE ) ); break;
case CACCOUNT_CHARSLOT1BLOCKED: *vp = BOOLEAN_TO_JSVAL( myAccount->wFlags.test( AB_FLAGS_CHARACTER1 ) ); break;
case CACCOUNT_CHARSLOT2BLOCKED: *vp = BOOLEAN_TO_JSVAL( myAccount->wFlags.test( AB_FLAGS_CHARACTER2 ) ); break;
case CACCOUNT_CHARSLOT3BLOCKED: *vp = BOOLEAN_TO_JSVAL( myAccount->wFlags.test( AB_FLAGS_CHARACTER3 ) ); break;
case CACCOUNT_CHARSLOT4BLOCKED: *vp = BOOLEAN_TO_JSVAL( myAccount->wFlags.test( AB_FLAGS_CHARACTER4 ) ); break;
case CACCOUNT_CHARSLOT5BLOCKED: *vp = BOOLEAN_TO_JSVAL( myAccount->wFlags.test( AB_FLAGS_CHARACTER5 ) ); break;
case CACCOUNT_CHARSLOT6BLOCKED: *vp = BOOLEAN_TO_JSVAL( myAccount->wFlags.test( AB_FLAGS_CHARACTER6 ) ); break;
case CACCOUNT_CHARSLOT7BLOCKED: *vp = BOOLEAN_TO_JSVAL( myAccount->wFlags.test( AB_FLAGS_CHARACTER7 ) ); break;
case CACCOUNT_UNUSED9: *vp = BOOLEAN_TO_JSVAL( myAccount->wFlags.test( AB_FLAGS_UNUSED9 ) ); break;
case CACCOUNT_UNUSED10: *vp = BOOLEAN_TO_JSVAL( myAccount->wFlags.test( AB_FLAGS_UNUSED10 ) ); break;
case CACCOUNT_SEER: *vp = BOOLEAN_TO_JSVAL( myAccount->wFlags.test( AB_FLAGS_SEER ) ); break;
case CACCOUNT_COUNSELOR: *vp = BOOLEAN_TO_JSVAL( myAccount->wFlags.test( AB_FLAGS_COUNSELOR ) ); break;
case CACCOUNT_GM: *vp = BOOLEAN_TO_JSVAL( myAccount->wFlags.test( AB_FLAGS_GM ) ); break;
default:
break;
}
}
return JS_TRUE;
}
JSBool CAccountProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
CAccountBlock *myAccount = static_cast<CAccountBlock *>(JS_GetPrivate( cx, obj ));
if( myAccount == nullptr )
return JS_FALSE;
JSEncapsulate encaps( cx, vp );
if( JSVAL_IS_INT( id ) )
{
switch( JSVAL_TO_INT( id ) )
{
case CACCOUNT_ID:
case CACCOUNT_USERNAME:
case CACCOUNT_FLAGS:
case CACCOUNT_PATH:
case CACCOUNT_CHARACTER1:
case CACCOUNT_CHARACTER2:
case CACCOUNT_CHARACTER3:
case CACCOUNT_CHARACTER4:
case CACCOUNT_CHARACTER5:
case CACCOUNT_CHARACTER6:
case CACCOUNT_CHARACTER7:
case CACCOUNT_CURRENTCHAR:
case CACCOUNT_LASTIP:
case CACCOUNT_FIRSTLOGIN:
break;
case CACCOUNT_PASSWORD:
{
std::string newPass = encaps.toString();
if( newPass.length() > 3 )
myAccount->sPassword = newPass;
else
return JS_FALSE;
break;
}
case CACCOUNT_COMMENT:
myAccount->sContact = encaps.toString();
break;
case CACCOUNT_TIMEBAN:
{
UI32 timeBan = static_cast<UI32>(encaps.toInt());
if( timeBan > 0 )
{
myAccount->wFlags.set( AB_FLAGS_BANNED, true );
myAccount->wTimeBan = GetMinutesSinceEpoch() + timeBan;
}
else
myAccount->wTimeBan = 0;
break;
}
case CACCOUNT_BANNED: myAccount->wFlags.set( AB_FLAGS_BANNED, encaps.toBool() ); break;
case CACCOUNT_SUSPENDED: myAccount->wFlags.set( AB_FLAGS_SUSPENDED, encaps.toBool() ); break;
case CACCOUNT_PUBLIC: myAccount->wFlags.set( AB_FLAGS_PUBLIC, encaps.toBool() ); break;
case CACCOUNT_CHARSLOT1BLOCKED: myAccount->wFlags.set( AB_FLAGS_CHARACTER1, encaps.toBool() ); break;
case CACCOUNT_CHARSLOT2BLOCKED: myAccount->wFlags.set( AB_FLAGS_CHARACTER2, encaps.toBool() ); break;
case CACCOUNT_CHARSLOT3BLOCKED: myAccount->wFlags.set( AB_FLAGS_CHARACTER3, encaps.toBool() ); break;
case CACCOUNT_CHARSLOT4BLOCKED: myAccount->wFlags.set( AB_FLAGS_CHARACTER4, encaps.toBool() ); break;
case CACCOUNT_CHARSLOT5BLOCKED: myAccount->wFlags.set( AB_FLAGS_CHARACTER5, encaps.toBool() ); break;
case CACCOUNT_CHARSLOT6BLOCKED: myAccount->wFlags.set( AB_FLAGS_CHARACTER6, encaps.toBool() ); break;
case CACCOUNT_CHARSLOT7BLOCKED: myAccount->wFlags.set( AB_FLAGS_CHARACTER7, encaps.toBool() ); break;
case CACCOUNT_UNUSED9: myAccount->wFlags.set( AB_FLAGS_UNUSED9, encaps.toBool() ); break;
case CACCOUNT_UNUSED10: myAccount->wFlags.set( AB_FLAGS_UNUSED10, encaps.toBool() ); break;
case CACCOUNT_SEER: myAccount->wFlags.set( AB_FLAGS_SEER, encaps.toBool() ); break;
case CACCOUNT_COUNSELOR: myAccount->wFlags.set( AB_FLAGS_COUNSELOR, encaps.toBool() ); break;
case CACCOUNT_GM: myAccount->wFlags.set( AB_FLAGS_GM, encaps.toBool() ); break;
default:
break;
}
}
return JS_TRUE;
}
JSBool CConsoleProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
if( JSVAL_IS_INT( id ) )
{
switch( JSVAL_TO_INT( id ) )
{
case CCONSOLE_MODE: *vp = INT_TO_JSVAL( Console.CurrentMode() ); break;
case CCONSOLE_LOGECHO: *vp = INT_TO_JSVAL( Console.LogEcho() ); break;
default:
break;
}
}
return JS_TRUE;
}
JSBool CConsoleProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
JSEncapsulate encaps( cx, vp );
if( JSVAL_IS_INT( id ) )
{
switch( JSVAL_TO_INT( id ) )
{
case CCONSOLE_MODE: Console.CurrentMode( encaps.toInt() ); break;
case CCONSOLE_LOGECHO: Console.LogEcho( encaps.toBool() ); break;
default:
break;
}
}
return JS_TRUE;
}
JSBool CScriptSectionProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
ScriptSection *gPriv = static_cast<ScriptSection *>(JS_GetPrivate( cx, obj ));
if( gPriv == nullptr )
return JS_FALSE;
if( JSVAL_IS_INT( id ) )
{
switch( JSVAL_TO_INT( id ) )
{
case CSS_NUMTAGS: *vp = INT_TO_JSVAL( gPriv->NumEntries() ); break;
case CSS_ATEND: *vp = BOOLEAN_TO_JSVAL( gPriv->AtEnd() ); break;
case CSS_ATENDTAGS: *vp = BOOLEAN_TO_JSVAL( gPriv->AtEndTags() ); break;
default:
break;
}
}
return JS_TRUE;
}
JSBool CScriptSectionProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
/* JSEncapsulate encaps( cx, vp );
if( JSVAL_IS_INT( id ) )
{
switch( JSVAL_TO_INT( id ) )
{
default:
break;
}
}*/
return JS_TRUE;
}
JSBool CResourceProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
MapResource_st *gPriv = static_cast<MapResource_st*>(JS_GetPrivate( cx, obj ));
if( gPriv == nullptr )
return JS_FALSE;
JSEncapsulate encaps( cx, vp );
if( JSVAL_IS_INT( id ) )
{
switch( JSVAL_TO_INT( id ) )
{
case CRESP_LOGAMT: gPriv->logAmt = encaps.toInt(); break;
case CRESP_LOGTIME:
{
gPriv->logTime = static_cast<UI32>( encaps.toInt() * 1000 ); break;
break;
}
case CRESP_OREAMT: gPriv->oreAmt = encaps.toInt(); break;
case CRESP_ORETIME: //gPriv->oreTime = encaps.toInt(); break;
{
gPriv->oreTime = static_cast<UI32>( encaps.toInt() * 1000 ); break;
break;
}
case CRESP_FISHAMT: gPriv->fishAmt = encaps.toInt(); break;
case CRESP_FISHTIME: //gPriv->fishTime = encaps.toInt(); break;
{
gPriv->fishTime = static_cast<UI32>( encaps.toInt() * 1000 ); break;
break;
}
default: break;
}
}
return JS_TRUE;
}
JSBool CResourceProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
MapResource_st *gPriv = static_cast<MapResource_st*>(JS_GetPrivate( cx, obj ));
if( gPriv == nullptr )
return JS_FALSE;
if( JSVAL_IS_INT( id ) )
{
switch( JSVAL_TO_INT( id ) )
{
case CRESP_LOGAMT: *vp = INT_TO_JSVAL( gPriv->logAmt ); break;
case CRESP_LOGTIME: JS_NewNumberValue( cx, gPriv->logTime, vp ); break;
case CRESP_OREAMT: *vp = INT_TO_JSVAL( gPriv->oreAmt ); break;
case CRESP_ORETIME: JS_NewNumberValue( cx, gPriv->oreTime, vp ); break;
case CRESP_FISHAMT: *vp = INT_TO_JSVAL( gPriv->fishAmt ); break;
case CRESP_FISHTIME: JS_NewNumberValue( cx, gPriv->fishTime, vp ); break;
default: break;
}
}
return JS_TRUE;
}
JSBool CPartyProps_setProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
Party *gPriv = static_cast<Party *>(JS_GetPrivate( cx, obj ));
if( gPriv == nullptr )
return JS_FALSE;
JSEncapsulate encaps( cx, vp );
if( JSVAL_IS_INT( id ) )
{
switch( JSVAL_TO_INT( id ) )
{
case CPARTYP_LEADER:
{
if( encaps.ClassName() == "UOXChar" || encaps.ClassName() == "UOXSocket" )
{
CChar *newLeader = nullptr;
if( encaps.ClassName() == "UOXChar" )
newLeader = static_cast<CChar *>(encaps.toObject());
else
{
CSocket *tempSock = static_cast<CSocket *>(encaps.toObject());
if( tempSock != nullptr )
newLeader = tempSock->CurrcharObj();
}
if( ValidateObject( newLeader ) )
gPriv->Leader( newLeader );
}
}
break;
case CPARTYP_ISNPC: gPriv->IsNPC( encaps.toBool() ); break;
default: break;
}
}
return JS_TRUE;
}
JSBool CPartyProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
Party *gPriv = static_cast<Party *>(JS_GetPrivate( cx, obj ));
if( gPriv == nullptr )
return JS_FALSE;
if( JSVAL_IS_INT( id ) )
{
switch( JSVAL_TO_INT( id ) )
{
case CPARTYP_LEADER:
{
CChar *myChar = gPriv->Leader();
if( !ValidateObject( myChar ) )
{
*vp = JSVAL_NULL;
return JS_TRUE;
}
JSObject *myObj = JSEngine->AcquireObject( IUE_CHAR, myChar, JSEngine->FindActiveRuntime( JS_GetRuntime( cx ) ) );
*vp = OBJECT_TO_JSVAL( myObj );
}
break;
case CPARTYP_MEMBERCOUNT: *vp = INT_TO_JSVAL( gPriv->MemberList()->size() ); break;
case CPARTYP_ISNPC: *vp = BOOLEAN_TO_JSVAL( gPriv->IsNPC() ); break;
default: break;
}
}
return JS_TRUE;
}
JSBool CSocket_equality( JSContext *cx, JSObject *obj, jsval v, JSBool *bp )
{
JSEncapsulate srcObj( cx, obj );
CSocket *srcSock = static_cast<CSocket *>(srcObj.toObject());
JSEncapsulate trgObj( cx, &v );
if( trgObj.isType( JSOT_OBJECT ) )
{
if( srcObj.ClassName() != trgObj.ClassName() )
*bp = JS_FALSE;
else
{
CSocket *trgSock = static_cast<CSocket *>(trgObj.toObject());
*bp = ( srcSock == trgSock ) ? JS_TRUE : JS_FALSE;
}
}
else
*bp = ( srcSock == nullptr && trgObj.isType( JSOT_NULL ) ) ? JS_TRUE : JS_FALSE;
return JS_TRUE;
}
JSBool CBaseObject_equality( JSContext *cx, JSObject *obj, jsval v, JSBool *bp )
{
JSEncapsulate srcObj( cx, obj );
CBaseObject *src = static_cast<CBaseObject *>(srcObj.toObject());
if( !ValidateObject( src ) )
*bp = JS_FALSE;
else
{
JSEncapsulate trgObj( cx, &v );
if( trgObj.isType( JSOT_OBJECT ) )
{
if( srcObj.ClassName() != trgObj.ClassName() )
*bp = JS_FALSE;
else
{
CBaseObject *trg = static_cast<CBaseObject *>(trgObj.toObject());
if( !ValidateObject( trg ) )
*bp = JS_FALSE;
else // both valid base objects! Now, we'll declare equality based on SERIAL, not pointer
*bp = ( src->GetSerial() == trg->GetSerial() ) ? JS_TRUE : JS_FALSE;
}
}
else
*bp = ( src == nullptr && trgObj.isType( JSOT_NULL ) ) ? JS_TRUE : JS_FALSE;
}
return JS_TRUE;
}
JSBool CParty_equality( JSContext *cx, JSObject *obj, jsval v, JSBool *bp )
{
JSEncapsulate srcObj( cx, obj );
Party *srcParty = static_cast<Party *>(srcObj.toObject());
JSEncapsulate trgObj( cx, &v );
if( trgObj.isType( JSOT_OBJECT ) )
{
if( srcObj.ClassName() != trgObj.ClassName() )
*bp = JS_FALSE;
else
{
Party *trgParty = static_cast<Party *>(trgObj.toObject());
*bp = ( srcParty == trgParty ) ? JS_TRUE : JS_FALSE;
}
}
else
*bp = ( srcParty == nullptr && trgObj.isType( JSOT_NULL ) ) ? JS_TRUE : JS_FALSE;
return JS_TRUE;
}