Files
dsrc/sku.0/sys.server/compiled/game/script/library/geiger.scriptlib
T

169 lines
5.3 KiB
Plaintext

include library.utils;
const string OBJVAR_GEIGER_LOCATION = "geiger.location";
const string OBJVAR_GEIGER_FACTOR = "geiger.factor";
const string OBJVAR_GEIGER_OBJECT = "geiger.object";
const string OBJVAR_GEIGER_PLAYER = "geiger.player";
const string OBJVAR_GEIGER_PID = "geiger.pid";
const string SCRIPTVAR_GEIGER_LAST = "geiger.last";
const string GEIGER_TEMPLATE = "object/intangible/data_item/data_geiger_counter.iff";
const string GEIGER_SCRIPT = "item.geiger.base";
boolean hasGeiger(obj_id player)
{
return hasObjVar(player, OBJVAR_GEIGER_OBJECT);
}
void resetGeiger(obj_id player)
{
LOG("geiger", "before creating object");
if(!hasObjVar(player, OBJVAR_GEIGER_OBJECT))
{
LOG("geiger", "creating object");
obj_id datapad = utils.getDatapad(player);
LOG("geiger", "datapad = " + datapad);
obj_id geiger = createObject(GEIGER_TEMPLATE, datapad, "");
LOG("geiger", "geiger = " + geiger);
setObjVar(player, OBJVAR_GEIGER_OBJECT, geiger);
setObjVar(geiger, OBJVAR_GEIGER_PLAYER, player);
string_id newDevice = new string_id("system_msg", "new_datapad_device");
sendSystemMessage(player, newDevice);
}
}
void setGeiger(obj_id player, location loc)
{
LOG("geiger", "setGeiger: " + loc);
setObjVar(player, OBJVAR_GEIGER_LOCATION, loc);
setObjVar(player, OBJVAR_GEIGER_FACTOR, rand(3,7));
LOG("geiger", "before creating object");
if(!hasObjVar(player, OBJVAR_GEIGER_OBJECT))
{
LOG("geiger", "creating object");
obj_id datapad = utils.getDatapad(player);
LOG("geiger", "datapad = " + datapad);
obj_id geiger = createObject(GEIGER_TEMPLATE, datapad, "");
LOG("geiger", "geiger = " + geiger);
setObjVar(player, OBJVAR_GEIGER_OBJECT, geiger);
setObjVar(geiger, OBJVAR_GEIGER_PLAYER, player);
string_id newDevice = new string_id("system_msg", "new_datapad_device");
sendSystemMessage(player, newDevice);
}
}
void clearGeiger(obj_id player)
{
removeObjVar(player, OBJVAR_GEIGER_LOCATION);
removeObjVar(player, OBJVAR_GEIGER_FACTOR);
}
void removeGeiger(obj_id player)
{
obj_id datapad = utils.getPlayerDatapad(player);
obj_id[] contents = getContents(datapad);
for(int i = 0; i < contents.length;i++)
{
if(hasScript(contents[i], GEIGER_SCRIPT))
{
destroyObject(contents[i]);
}
}
clearGeiger(player);
}
float calculateGeigerNumber(obj_id player)
{
//LOG("geiger", "calculateGeigerNumber");
location here = getLocation(player);
if(getLocationObjVar(player, OBJVAR_GEIGER_LOCATION) != null)
{
location loc = getLocationObjVar(player, OBJVAR_GEIGER_LOCATION);
int targetX = (int)loc.x;
int targetZ = (int)loc.z;
int factor = getIntObjVar(player, OBJVAR_GEIGER_FACTOR);
//LOG("geiger", "calculateGeigerNumber: here [" + here.x + "," + here.z + "] target [" + targetX + "," + targetZ + "] factor [" + factor + "]");
float distance = (float)Math.sqrt((here.x - targetX) * (here.x - targetX) + (here.z - targetZ) * (here.z - targetZ));
distance = 5000 - distance;
float result;
if(factor % 2 == 1)
{
result = distance / factor;
}
else
{
result = (float) Math.sqrt(distance/ factor) * 100;
}
//LOG("geiger", "calculateGeigerNumber: distance [" + distance + "] result [" + result + "]");
return result;
}
else
{
return 0.0f;
}
}
void updateGeiger(obj_id player, obj_id geiger)
{
if(hasObjVar(player, OBJVAR_GEIGER_PID))
{
//LOG("geiger", "player updateGeiger");
int pid = getIntObjVar(player, OBJVAR_GEIGER_PID);
//LOG("geiger", "checking for objvar");
if(!hasObjVar(player, OBJVAR_GEIGER_LOCATION))
{
//LOG("geiger", "didn't find it");
setSUIProperty(pid, "%info%", "Text", "\n\nEnemy Threat Level: \n\\#ff0000 -No tracking device detected-");
flushSUIPage(pid);
return;
}
//LOG("geiger", "found it");
// Check if you're still on Dathomir
location targetLoc = getLocationObjVar(player, OBJVAR_GEIGER_LOCATION);
location here = getLocation(player);
if ((targetLoc != null && !here.area.equals(targetLoc.area)) || targetLoc == null )
{
setSUIProperty(pid, "%info%", "Text", "\\#ff0000 \n\nNo Signal");
flushSUIPage(pid);
return;
}
// If you're absurdly far, your signal is weak
location signalCheck = getLocation(player);
int targetX = (int)targetLoc.x;
int targetZ = (int)targetLoc.z;
float distance = (float)Math.sqrt((here.x - targetX) * (here.x - targetX) + (here.z - targetZ) * (here.z - targetZ));
float varience = rand(500, 1000);
if (distance > 4500.0f + varience)
{
setSUIProperty(pid, "%info%", "Text", "\\#ff0000 \n\nWeak Signal");
flushSUIPage(pid);
return;
}
if (distance <= 64.0f)
{
setSUIProperty(pid, "%info%", "Text", "\\#0000ff \n\nSignal Peak. Target within 64 meters");
flushSUIPage(pid);
return;
}
float last = utils.getFloatScriptVar(player, SCRIPTVAR_GEIGER_LAST);
float val = calculateGeigerNumber(player);
utils.setScriptVar(player, SCRIPTVAR_GEIGER_LAST, val);
float value = (val - last);
if (value == 0.0f)
{
setSUIProperty(pid, "%info%", "Text", "\n\nEnemy Threat Level: " + val + "\nDelta: 0. You are not moving.");
flushSUIPage(pid);
return;
}
else
{
setSUIProperty(pid, "%info%", "Text", "\n\nEnemy Threat Level: " + val + "\nDelta: " + (value > 0.0f ? "\\#00ff00 Moving closer \n " : "\\#ff0000 Moving away \n ") + (value > 9999.0f ? "-Out of range-" : (value + "")));
flushSUIPage(pid);
}
}
}