uox3/source/UOXJSPropertyFuncs.cpp
Xoduz 6ca9ddc6f2 Various code/warning cleanup
Fixed an issue with ItemID skill where using the skill on a crafted item would not output a result if creator of item was unknown
Command logs now also include any parameters used with a command
Fixed an issue where messages used with CustomTarget JS function would not get truncated properly if longer than the allowed maximum length
Fixed some instances of potential buffer overrun and/or out-of-bounds memory access
Fixed some potential null pointer dereferences
Fixed a couple instances of missing breaks in switch cases
Added [[maybe_unused]] attributes in places where return values are intentionally unused
Added [[fallthrough]] attributes in places where switch case fallthroughs are intentional
Misc minor code cleanup
2021-07-04 02:26:43 +08:00

3203 lines
117 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() || SpellID < 0 )
{
Console.error( "Invalid Spell ID" ); // Revise please...
*vp = JSVAL_NULL;
return JS_FALSE;
}
SpellInfo *mySpell = &Magic->spells[SpellID];
if( mySpell == nullptr )
{
Console.error( "Invalid Spell" );
*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: *vp = INT_TO_JSVAL( gPriv->Delay() ); 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 CCreateEntriesProps_getProperty( JSContext *cx, JSObject *obj, jsval id, jsval *vp )
{
UI16 createEntryID = static_cast<UI16>(JSVAL_TO_INT( id ));
if( createEntryID >= Magic->spells.size() || createEntryID < 0 )
{
Console.error( "Invalid CreateEntry ID" ); // Revise please...
*vp = JSVAL_NULL;
return JS_FALSE;
}
createEntry *myCreateEntry = Skills->FindItem( createEntryID );
if( myCreateEntry == nullptr )
{
Console.error( strutil::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;
bool bDone = false;
size_t i = 0;
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<UI08>(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: *vp = INT_TO_JSVAL( gPriv->GetDecayTime() ); 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() );
*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_RANK: *vp = INT_TO_JSVAL( gPriv->GetRank() ); 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_TEMPTIMER: *vp = INT_TO_JSVAL( gPriv->GetTempTimer() ); 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_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_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( strutil::format("Unable to assign script trigger - script ID (%i) not found in jse_fileassociations.scp!", strutil::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( strutil::format("Unable to assign script trigger - script ID (%i) not found in jse_fileassociations.scp!", strutil::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 );
}
else
gPriv->SetCont( nullptr );
break;
case CIP_TYPE: gPriv->SetType( static_cast<ItemTypes>(encaps.toInt()) ); break;
case CIP_MORE: gPriv->SetTempVar( CITV_MORE, encaps.toInt() ); break;
case CIP_MOREX: gPriv->SetTempVar( CITV_MOREX, encaps.toInt() ); break;
case CIP_MOREY: gPriv->SetTempVar( CITV_MOREY, encaps.toInt() ); break;
case CIP_MOREZ: 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().c_str() ); break;
case CIP_RACE: gPriv->SetRace( (RACEID)encaps.toInt() ); break;
case CIP_MAXHP: gPriv->SetMaxHP( (SI16)encaps.toInt() ); break;
case CIP_RANK: gPriv->SetRank( (SI08)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_TEMPTIMER:
newTime = encaps.toInt();
if( newTime != 0 )
newTime = BuildTimeValue( newTime );
gPriv->SetTempTimer( newTime );
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_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_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_NAME:
tString = JS_NewStringCopyZ( cx, gPriv->GetName().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_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_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_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_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_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_ISONHORSE: *vp = BOOLEAN_TO_JSVAL( gPriv->IsOnHorse() ); break;
case CCP_ISFLYING: *vp = BOOLEAN_TO_JSVAL( gPriv->IsFlying() ); 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_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_NEXTACT: *vp = INT_TO_JSVAL( gPriv->GetNextAct() ); break;
case CCP_PETCOUNT: *vp = INT_TO_JSVAL( 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_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->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_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_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_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( strutil::format("Unable to assign script trigger - script ID (%i) not found in jse_fileassociations.scp!", strutil::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( strutil::format("Unable to assign script trigger - script ID (%i) not found in jse_fileassociations.scp!", strutil::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_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() ); 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_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_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->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_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_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( strutil::format("Unable to assign script trigger - script ID (%i) not found in jse_fileassociations.scp!", strutil::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( strutil::format("Unable to assign script trigger - script ID (%i) not found in jse_fileassociations.scp!", strutil::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!
STRINGLIST 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!
STRINGLIST 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_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_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() );
*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: *vp = DOUBLE_TO_JSVAL( gPriv->PoisonResistance() ); break;
case CRP_MAGICRESISTANCE: *vp = DOUBLE_TO_JSVAL( gPriv->MagicResistance() ); 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:
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_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 = strutil::number(static_cast<SI32>((myAccount->dwLastIP&0xFF000000)>>24))
+ "." + strutil::number(static_cast<SI32>((myAccount->dwLastIP&0x00FF0000)>>16))
+ "." + strutil::number(static_cast<SI32>((myAccount->dwLastIP&0x0000FF00)>>8))
+ "." + strutil::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:
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 = encaps.toInt(); break;
case CRESP_OREAMT: gPriv->oreAmt = encaps.toInt(); break;
case CRESP_ORETIME: gPriv->oreTime = encaps.toInt(); 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: *vp = INT_TO_JSVAL( gPriv->logTime ); break;
case CRESP_OREAMT: *vp = INT_TO_JSVAL( gPriv->oreAmt ); break;
case CRESP_ORETIME: *vp = INT_TO_JSVAL( gPriv->oreTime ); 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;
}