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); } } }