mirror of
https://github.com/SWG-Source/dsrc.git
synced 2026-07-31 00:15:54 -04:00
298 lines
7.1 KiB
Plaintext
298 lines
7.1 KiB
Plaintext
/**
|
|
* Copyright (c) ©2000-2002 Sony Online Entertainment Inc.
|
|
* All Rights Reserved
|
|
*
|
|
* Title: trap_base.script
|
|
* Description: trap base
|
|
* @author $Author:$
|
|
* @version $Revision: #1 $
|
|
*/
|
|
|
|
//------------------------------------------------
|
|
// Includes
|
|
//------------------------------------------------
|
|
|
|
include library.ai_lib;
|
|
include library.callable;
|
|
include library.skill;
|
|
include library.utils;
|
|
include library.xp;
|
|
include library.pet_lib;
|
|
|
|
//------------------------------------------------
|
|
// Constants
|
|
//------------------------------------------------
|
|
|
|
const string_id SID_DECODE = new string_id("treasure_map/treasure_map", "decode");
|
|
const string_id SID_SYS_NOT_READY = new string_id("trap/trap", "sys_not_ready");
|
|
const string_id SID_SYS_MISS = new string_id("trap/trap", "sys_miss");
|
|
const string_id SID_SYS_CREATURES_ONLY = new string_id("trap/trap", "sys_creatures_only");
|
|
const string_id SID_SYS_NO_PETS = new string_id("trap/trap", "sys_no_pets");
|
|
const string_id SID_ADD_TRAP_TO_DROID = new string_id("pet/droid_modules", "add_trap_to_droid");
|
|
const string_id SID_NO_TRAP_IN_SPACE = new string_id("space/space_interaction", "no_trap_in_space");
|
|
|
|
//------------------------------------------------
|
|
// OnGetAttributes
|
|
//------------------------------------------------
|
|
|
|
trigger OnGetAttributes( obj_id player, string[] names, string[] attribs )
|
|
{
|
|
|
|
if (!hasObjVar(self, "droid_trap"))
|
|
{
|
|
int idx = utils.getValidAttributeIndex(names);
|
|
if (idx == -1)
|
|
return SCRIPT_CONTINUE;
|
|
|
|
int count = getCount( self );
|
|
names[idx] = "quantity";
|
|
attribs[idx] = Integer.toString( count );
|
|
idx++;
|
|
if (idx >= names.length)
|
|
return SCRIPT_CONTINUE;
|
|
|
|
int diff = getIntObjVar( self, "trapDiff" );
|
|
names[idx] = "complexity";
|
|
attribs[idx] = Integer.toString( diff );
|
|
}
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
//------------------------------------------------
|
|
// OnObjectMenuRequest
|
|
//------------------------------------------------
|
|
|
|
trigger OnObjectMenuRequest( obj_id player, menu_info mi )
|
|
{
|
|
if (!hasObjVar(self, "droid_trap"))
|
|
{
|
|
menu_info_data mid = mi.getMenuItemByType( menu_info_types.EXAMINE );
|
|
if ( mid != null )
|
|
mid.setServerNotify( true );
|
|
|
|
mid = mi.getMenuItemByType( menu_info_types.ITEM_USE );
|
|
if ( mid != null )
|
|
mid.setServerNotify( true );
|
|
}
|
|
|
|
if (utils.getTrapDroidId(player) != null && !hasScript(self, "ai.pet"))
|
|
{
|
|
int menu = mi.addRootMenu( menu_info_types.SERVER_MENU1, SID_ADD_TRAP_TO_DROID );
|
|
}
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
//------------------------------------------------
|
|
// OnObjectMenuSelect
|
|
//------------------------------------------------
|
|
|
|
trigger OnObjectMenuSelect( obj_id player, int item )
|
|
{
|
|
// Make sure we aren't in space.
|
|
if (isSpaceScene())
|
|
{
|
|
sendSystemMessage(player, SID_NO_TRAP_IN_SPACE);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
if(!hasObjVar(self, "droid_trap"))
|
|
{
|
|
// Item was used.
|
|
if ( item == menu_info_types.ITEM_USE )
|
|
{
|
|
int skillMod = getSkillStatMod( player, "trapping" );
|
|
if ( skillMod <= 0 )
|
|
{
|
|
// Insufficient skill to use any trap.
|
|
string_id trapNoSkill = new string_id( "trap/trap", "trap_no_skill" );
|
|
sendSystemMessage( player, trapNoSkill );
|
|
return SCRIPT_OVERRIDE;
|
|
}
|
|
|
|
string strParams = self.toString();
|
|
obj_id objTarget = getLookAtTarget( player );
|
|
|
|
if(!isIdValid(objTarget))
|
|
{
|
|
// need target.
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if ( !canSee( player, objTarget ) )
|
|
{
|
|
sendSystemMessage( player, new string_id("combat_effects", "cansee_fail") );
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if ( !ai_lib.isMonster( objTarget ) || isIncapacitated( objTarget ) || isDead( objTarget ) )
|
|
{
|
|
sendSystemMessage( player, SID_SYS_CREATURES_ONLY );
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
if ( pet_lib.isPet( objTarget ) )
|
|
{
|
|
sendSystemMessage( player, SID_SYS_NO_PETS );
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
queueCommand( player, ##"throwTrap", objTarget, strParams, COMMAND_PRIORITY_NORMAL );
|
|
}
|
|
}
|
|
|
|
|
|
if(item == menu_info_types.SERVER_MENU1)
|
|
{
|
|
dictionary params = new dictionary();
|
|
params.put("trap", getSelf());
|
|
params.put("player", player);
|
|
|
|
obj_id droid = callable.getCDCallable(utils.getTrapDroidId(player));
|
|
|
|
messageTo(droid, "doRadialTrapAdd", params, 1, false);
|
|
}
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
//------------------------------------------------
|
|
// trapUsed
|
|
//------------------------------------------------
|
|
|
|
void trapUsed( obj_id self )
|
|
{
|
|
if (hasObjVar(self, "droid_trap"))
|
|
{
|
|
droidTrapUsed(self);
|
|
return;
|
|
}
|
|
|
|
int intUses = getCount( self ) - 1;
|
|
if( intUses <= 0 )
|
|
{
|
|
destroyObject( self );
|
|
}
|
|
else
|
|
{
|
|
setCount( self, intUses );
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
//------------------------------------------------
|
|
// trapDone
|
|
//------------------------------------------------
|
|
|
|
messageHandler trapDone()
|
|
{
|
|
// Clear use state.
|
|
trapUsed( self );
|
|
|
|
// Clear hit count for ae traps.
|
|
utils.setScriptVar( self, "hits", 0 );
|
|
utils.setScriptVar( self, "misses", 0 );
|
|
utils.setScriptVar( self, "grantedXP", 0 );
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
|
|
//------------------------------------------------
|
|
// trapHit
|
|
//------------------------------------------------
|
|
|
|
messageHandler trapHit()
|
|
{
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
//------------------------------------------------
|
|
// trapMiss
|
|
//------------------------------------------------
|
|
|
|
messageHandler trapMiss()
|
|
{
|
|
// Miss message.
|
|
int misses = utils.getIntScriptVar( self, "misses" );
|
|
if ( misses == 0 )
|
|
{
|
|
obj_id player = params.getObjId( "player" );
|
|
sendSystemMessage( player, SID_SYS_MISS );
|
|
}
|
|
misses++;
|
|
utils.setScriptVar( self, "misses", misses );
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
//------------------------------------------------
|
|
// grantTrapXP
|
|
//------------------------------------------------
|
|
|
|
void grantTrapXP( obj_id player, obj_id target, float trapMod )
|
|
{
|
|
obj_id self = getSelf();
|
|
|
|
// No xp for trapping babies.
|
|
if ( hasScript( target, "ai.pet_advance" ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!hasObjVar(self, "droid_trap"))
|
|
{
|
|
float targetLevel = (float) getLevel( target );
|
|
int pseudoDamage = (int) (Math.pow( targetLevel, 1.5f ) * 2.2f + 66.f);
|
|
|
|
if ( pseudoDamage > 2000 )
|
|
{
|
|
pseudoDamage = 2000;
|
|
}
|
|
|
|
pseudoDamage *= (int) trapMod;
|
|
xp.updateCombatXpList(target, player, xp.SCOUT, pseudoDamage);
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
float targetLevel = (float) getLevel( target );
|
|
int pseudoDamage = (int) (Math.pow( targetLevel, 1.5f ) * 1f + 66.f);
|
|
|
|
if ( pseudoDamage > 1000 )
|
|
{
|
|
pseudoDamage = 1000;
|
|
}
|
|
|
|
pseudoDamage *= (int) trapMod;
|
|
xp.updateCombatXpList(target, player, xp.SCOUT, pseudoDamage);
|
|
return;
|
|
}
|
|
}
|
|
|
|
void assignTrapEffect(obj_id player, obj_id target, int drainhealth, int drainact, int drainmind)
|
|
{
|
|
//do attribute drain
|
|
drainAttributes( target, drainact, drainmind );
|
|
}
|
|
|
|
void droidTrapUsed( obj_id self )
|
|
{
|
|
obj_id controlDevice = callable.getCallableCD(self);
|
|
|
|
int intUses = getIntObjVar( self, "droid_trap.trap_num.charges" ) - 1;
|
|
|
|
if(intUses <= 0)
|
|
{
|
|
detachScript(self, getStringObjVar(self, "droid_trap.trap_num.script"));
|
|
removeObjVar(self, "droid_trap");
|
|
removeObjVar(controlDevice, "droid_trap");
|
|
}
|
|
else
|
|
{
|
|
setObjVar(self, "droid_trap.trap_num.charges", intUses);
|
|
setObjVar(controlDevice, "droid_trap.trap_num.charges", intUses);
|
|
}
|
|
|
|
return;
|
|
}
|