mirror of
https://github.com/SWG-Source/dsrc.git
synced 2026-07-31 00:15:54 -04:00
169 lines
5.3 KiB
Plaintext
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);
|
|
}
|
|
}
|
|
}
|