mirror of
https://github.com/SWG-Source/dsrc.git
synced 2026-07-31 00:15:54 -04:00
177 lines
5.1 KiB
Plaintext
177 lines
5.1 KiB
Plaintext
/**
|
|
* Copyright (c) ©2004 Sony Online Entertainment Inc.
|
|
* All Rights Reserved
|
|
*
|
|
* Title: item.armor.psg.script
|
|
* Description: handles recharging the efficiency of a personal shield generator
|
|
* @author $Author: Steve Jakab$
|
|
* @version $Revision: 0$
|
|
*/
|
|
|
|
|
|
/***** INCLUDES ********************************************************/
|
|
|
|
include library.armor;
|
|
include library.utils;
|
|
|
|
|
|
/***** CONSTANTS *******************************************************/
|
|
|
|
const float BASE_UPDATE_TIME = 5.0f;
|
|
const float RAND_UPDATE_TIME = 1.0f;
|
|
|
|
const string PARAM_TIME = "time";
|
|
const string PARAM_MESSAGE_ID = "recharge_id";
|
|
const string PSG_EFFECT_TIME = "psgEffectTime";
|
|
|
|
const string SCRIPTVAR_RECHARGE_RATE = armor.OBJVAR_ARMOR_BASE + "." + armor.OBJVAR_PSG_RECHARGE_RATE;
|
|
const string SCRIPTVAR_MESSAGE_ID = armor.OBJVAR_ARMOR_BASE + "." + PARAM_MESSAGE_ID;
|
|
|
|
|
|
/***** TRIGGERS ********************************************************/
|
|
|
|
trigger OnInitialize()
|
|
{
|
|
messageTo(self, "handleInitializePsg", null, 0.1f, false);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
/**
|
|
* If we are being equipped, start regenerating. If we are being unequipped, reset our efficiency.
|
|
*/
|
|
trigger OnTransferred(obj_id sourceContainer, obj_id destContainer, obj_id transferer)
|
|
{
|
|
float recharge = utils.getFloatScriptVar(self, SCRIPTVAR_RECHARGE_RATE);
|
|
if ( recharge <= 0 )
|
|
return SCRIPT_CONTINUE;
|
|
|
|
armor.setPsgEfficiency(self, 0);
|
|
|
|
if ( isPlayer(destContainer) )
|
|
{
|
|
// start our efficiency timer
|
|
startRegeneration(self);
|
|
|
|
// play a startup effect BUT ONLY DO IT ONCE EVERY 5 SECONDS!
|
|
boolean playStartUpEffect = true;
|
|
|
|
if(utils.hasScriptVar(destContainer, PSG_EFFECT_TIME))
|
|
{
|
|
if(getGameTime() < utils.getIntScriptVar(destContainer, PSG_EFFECT_TIME))
|
|
playStartUpEffect = false;
|
|
}
|
|
|
|
if(playStartUpEffect)
|
|
{
|
|
int psgLevel = armor.getArmorLevel(self);
|
|
if ( psgLevel < 0 || psgLevel >= armor.PSG_STARTUP_EFFECTS.length )
|
|
psgLevel = 0;
|
|
playClientEffectObj(destContainer, armor.PSG_STARTUP_EFFECTS[psgLevel], destContainer, "");
|
|
utils.setScriptVar(destContainer, PSG_EFFECT_TIME , (getGameTime() + 5));
|
|
}
|
|
|
|
}
|
|
else if ( isPlayer(sourceContainer) && !isPlayer(destContainer) )
|
|
{
|
|
// stop the update loop by clearing our message id scriptvar
|
|
utils.removeScriptVar(self, SCRIPTVAR_MESSAGE_ID);
|
|
}
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
/***** CALLBACK FUNCTIONS **********************************************/
|
|
|
|
messageHandler handleInitializePsg()
|
|
{
|
|
armor.setPsgEfficiency(self, 0);
|
|
|
|
// determine our efficiency recharge rate
|
|
float baseRecharge = getFloatObjVar(self, armor.OBJVAR_ARMOR_BASE + "." + armor.OBJVAR_PSG_RECHARGE_RATE);
|
|
dictionary protections = armor.getArmorSpecialProtections(self);
|
|
float recharge = 0;
|
|
if ( protections != null && protections.size() > 0)
|
|
{
|
|
for ( int i = 0; i < armor.DATATABLE_SPECIAL_PROTECTIONS.length; ++i )
|
|
{
|
|
float value = protections.getFloat(armor.DATATABLE_SPECIAL_PROTECTIONS[i]);
|
|
if ( value > 0 )
|
|
{
|
|
recharge = baseRecharge / value;
|
|
if ( recharge > 1.0f )
|
|
recharge = 1.0f;
|
|
debugServerConsoleMsg(self, "*** SETTING PSG RECHARGE RATE to " + recharge + " from base " +
|
|
baseRecharge + ", protection " + value);
|
|
break;
|
|
}
|
|
}
|
|
if ( recharge <= 0 )
|
|
{
|
|
CustomerServiceLog("armor", "WARNING: psg " + self + " has no recharge value");
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
}
|
|
else
|
|
return SCRIPT_CONTINUE;
|
|
|
|
utils.setScriptVar(self, SCRIPTVAR_RECHARGE_RATE, recharge);
|
|
|
|
if ( recharge > 0 )
|
|
{
|
|
// if we are equipped, start regenerating
|
|
obj_id parent = getContainedBy(self);
|
|
if ( isIdValid(parent) && isPlayer(parent) )
|
|
{
|
|
startRegeneration(self);
|
|
}
|
|
}
|
|
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
messageHandler handleEfficiencyUpdate()
|
|
{
|
|
if ( !utils.hasScriptVar(self, armor.SCRIPTVAR_PSG_EFFICIENCY) || !utils.hasScriptVar(self, SCRIPTVAR_MESSAGE_ID) )
|
|
return SCRIPT_CONTINUE;
|
|
|
|
int messageId = params.getInt(PARAM_MESSAGE_ID);
|
|
int storedId = utils.getIntScriptVar(self, SCRIPTVAR_MESSAGE_ID);
|
|
if ( messageId != storedId )
|
|
return SCRIPT_CONTINUE;
|
|
|
|
// update our efficiency
|
|
float efficiency = armor.getPsgEfficiency(self);
|
|
long currentTime = System.currentTimeMillis();
|
|
if ( efficiency < 1.0f )
|
|
{
|
|
float recharge = utils.getFloatScriptVar(self, SCRIPTVAR_RECHARGE_RATE);
|
|
if ( recharge > 0 )
|
|
{
|
|
long startTime = params.getLong(PARAM_TIME);
|
|
float delta = recharge * (currentTime - startTime) / 5000.0f;
|
|
efficiency += delta;
|
|
armor.setPsgEfficiency(self, efficiency);
|
|
}
|
|
}
|
|
|
|
// start another update loop
|
|
startRegeneration(self);
|
|
return SCRIPT_CONTINUE;
|
|
}
|
|
|
|
/***** UTILITY FUNCTIONS ***********************************************/
|
|
|
|
void startRegeneration(obj_id self)
|
|
{
|
|
// start our efficiency timer
|
|
float time = BASE_UPDATE_TIME + rand(0.0f, RAND_UPDATE_TIME);
|
|
dictionary params = new dictionary();
|
|
params.put(PARAM_TIME, new Long(System.currentTimeMillis()));
|
|
// we set an id on us and pass it in the messageTo params to avoid handling more than one message sequence,
|
|
// since we can't cancel messageTos
|
|
int messageId = rand(0, Integer.MAX_VALUE - 1);
|
|
params.put(PARAM_MESSAGE_ID, messageId);
|
|
utils.setScriptVar(self, SCRIPTVAR_MESSAGE_ID, messageId);
|
|
messageTo(self, "handleEfficiencyUpdate", params, time, false);
|
|
}
|
|
|