#CLASS {xptimers} {kill}; #CLASS {xptimers} {open}; #VARIABLE {xptimer_file} {logs/xptimers.log}; #VARIABLE {xptimersync_file} {logs/features/xptimers_sync.tin}; #VARIABLE {killtimers} { {Delbert}{ {time}{0} {name}{delbert} {group}{false} {respawn}{40} } {the Triad boss}{ {time}{0} {name}{medina boss} {group}{false} {respawn}{40} } {the bandit leader}{ {time}{0} {name}{bandits} {group}{false} {respawn}{40} } {Hlakket the Bartender}{ {time}{0} {name}{hlakket} {group}{false} {respawn}{40} } {the Zoon Liar}{ {time}{0} {name}{zoon liar} {group}{false} {respawn}{40} } {Slim Stevie}{ {time}{0} {name}{rogues} {group}{false} {respawn}{40} } {the %* grflx worker}{ {time}{0} {name}{grflx} {group}{false} {respawn}{40} } {the %* student}{ {time}{0} {name}{dojo} {group}{false} {respawn}{40} } {the ceremonial guard}{ {time}{0} {name}{cguards} {group}{false} {respawn}{40} } {the smuggler captain}{ {time}{0} {name}{smug cap} {group}{false} {respawn}{40} } {the giant leader}{ {time}{0} {name}{giants} {group}{false} {respawn}{40} } {the %* rujona}{ {time}{0} {name}{snail} {group}{true} {respawn}{40} } {the %* nitsuni}{ {time}{0} {name}{snail} {group}{true} {respawn}{40} } {the Ome outlaw}{ {time}{0} {name}{snail} {group}{true} {respawn}{40} } {the %* lion}{ {time}{0} {name}{shaker} {group}{false} {respawn}{40} } {the %* crocodile}{ {time}{0} {name}{offler} {group}{false} {respawn}{40} } {Louis Accardo}{ {time}{0} {name}{stables} {group}{true} {respawn}{40} } {Samuel Casso}{ {time}{0} {name}{stables} {group}{true} {respawn}{40} } {Enrico Persuica}{ {time}{0} {name}{stables} {group}{true} {respawn}{40} } {Joe Corrola}{ {time}{0} {name}{stables} {group}{true} {respawn}{40} } {Marlon Gumboni}{ {time}{0} {name}{casino} {group}{true} {respawn}{40} } {Frankie Harvard}{ {time}{0} {name}{casino} {group}{true} {respawn}{40} } {Geraldo Ciaco}{ {time}{0} {name}{casino} {group}{true} {respawn}{40} } {Charles Marchella}{ {time}{0} {name}{casino} {group}{true} {respawn}{40} } {the %* hermit}{ {time}{0} {name}{oasis} {group}{true} {respawn}{40} } {the %* patroller}{ {time}{0} {name}{oasis} {group}{true} {respawn}{40} } {the {strict|serious|grim|tough|stern} captain}{ {time}{0} {name}{oasis} {group}{true} {respawn}{40} } {the %* desert nomad}{ {time}{0} {name}{oasis} {group}{true} {respawn}{40} } {the peacekeeper commander}{ {time}{0} {name}{oasis} {group}{true} {respawn}{40} } {the %* mystic}{ {time}{0} {name}{oasis} {group}{true} {respawn}{40} } {the {Tang|Fang|Sung|Hong|McSweeney} captain}{ {time}{0} {name}{bmarket} {group}{true} {respawn}{40} } {the citadel guard}{ {time}{0} {name}{citguard} {group}{false} {respawn}{40} } }; #VARIABLE {visittimers} { {AMShades}{ {time}{0} {name}{shades} {group}{false} {respawn}{20} } {ebff897af2b8bb6800a9a8636143099d0714be07}{ {time}{0} {name}{smugglers} {group}{false} {respawn}{20} } {70546ec71867645ab5c51e9ce6087b75dcf4176f}{ {time}{0} {name}{offler} {group}{false} {respawn}{40} } {2950a174f65ef8e38eee444295c9b4832d36ab60}{ {time}{0} {name}{dragon} {group}{false} {respawn}{40} } {f6c60dd36ed38707eb954c3a670f2f9370a79399}{ {time}{0} {name}{bmarket} {group}{true} {respawn}{40} } {e4646eab906aef1187a9dd3e980441b8f6b8d68c}{ {time}{0} {name}{bmarket} {group}{true} {respawn}{40} } {0ae9d8c4f2b48f4fcc4cb57fd85443399be2ecc5}{ {time}{0} {name}{bmarket} {group}{true} {respawn}{40} } {c7c6f5720d2c587f80696b6f0ec7f9ac0f084b06}{ {time}{0} {name}{bmarket} {group}{true} {respawn}{40} } {3862c5fd0fe83f4080bdb9b94519bf8da89d5015}{ {time}{0} {name}{parades} {group}{true} {respawn}{40} } {cca9645565f2bb0d017ea9b1dcc9d1b3e9fcfe72}{ {time}{0} {name}{cabbage} {group}{false} {respawn}{40} } {7377f4483763eca72e0b97a87f71c5266e33f2cd}{ {time}{0} {name}{cocoons} {group}{false} {respawn}{40} } }; #nop Set this to 1 when we record first spot, dont overwrite file until set; #VARIABLE {xptimer_recent_flag} {0}; #ALIAS {dt help} { #showme {[spottimers] Hotspot death/visit timers help:<099>}; #showme {Hotspot timers record how long since you've killed (death) an NPC or last entered (visit) a particular room.<099>}; #showme {}; #showme { * Command<099>: "dt<099>"<099>}; #showme {\t<099>List all current timers<099>}; #showme { * Command<099>: "dt help<099>"<099>}; #showme {\t<099>Display this helpfile<099>}; #showme { * Command<099>: "dtreset all<099>"<099>}; #showme {\t<099>Reset all timers to unseen, use after idling to clear stale timers<099>}; #showme { * Command<099>: "dtreset <099>"<099>}; #showme {\t<099>Set a spot as if you had just killed/visted, e.g. "dtreset zoon liar<099>"<099>}; #showme { * Command<099>: "gsdt<099>"<099>}; #showme {\t<099>Send all current timers to "group say<099>" to share<099>}; #showme { * Command<099>: "dtsync <099>"<099>}; #showme {\t<099>Send a tell to a player using this script to sync your timers to them<099>}; #showme { * Command<099>: "dtsave<099>"<099>}; #showme {\t<099>Force save of current timers to file, use before restarting client<099>}; #showme { * Command<099>: "dtload<099>"<099>}; #showme {\t<099>Load spot timers from file, use after restarting client<099>}; #showme {}; #showme {<099>Timers are saved to file automatically every five minutes. Output similar to "dt" is saved to "logs/xptimers.log", used to output in another window.<099>}; #showme {}; }; #ALIAS {dtreset} { #variable {dtreset_all} {0}; #regex {%1} {all} { #foreach {*killtimers[]} {spot} { #format {killtimers[$spot][time]} {0}; }; #foreach {*visittimers[]} {spot} { #format {visittimers[$spot][time]} {0}; }; #format {xptimer_message} {[hotspots] <138>* Resetting all spots to Unseen.<099>}; #echo {$xptimer_message}; #variable {dtreset_all} {1}; #variable {xptimer_recent_flag} {0}; }; #if {$dtreset_all < 1} { #list {spot_groups} {clear}; #foreach {*killtimers[]} {spot} { #var {xptimer_message} {}; #regex {%1 %2} {$killtimers[$spot][name]} { #format {killtimers[$spot][time]} {%T}; #if {"$killtimers[$spot][group]" == "true"} { #list {spot_groups} {find} {$killtimers[$spot][name]} {group_exists}; #if {"$group_exists" == "0"} { #list {spot_groups} {add} {$killtimers[$spot][name]}; #format {xptimer_message} {[hotspots] <138>* Resetting death timer for%c $killtimers[$spot][name]%c.<099>} {Green} {}; }; }; #else { #format {xptimer_message} {[hotspots] <138>* Resetting death timer for%c $killtimers[$spot][name]%c.<099>} {Green} {}; }; #format {xp_message_check} {%L} {$xptimer_message}; #if {$xp_message_check > 0} { #echo {$xptimer_message}; #variable {xptimer_recent_flag} {1}; }; }; }; #list {spot_groups} {clear}; #foreach {*visittimers[]} {spot} { #var {xptimer_message} {}; #regex {%1 %2} {$visittimers[$spot][name]} { #format {visittimers[$spot][time]} {%T}; #if {"$visittimers[$spot][group]" == "true"} { #list {spot_groups} {find} {$visittimers[$spot][name]} {group_exists}; #if {"$group_exists" == "0"} { #list {spot_groups} {add} {$visittimers[$spot][name]}; #format {xptimer_message} {[hotspots] <138>* Resetting visit timer for%c $visittimers[$spot][name]%c.<099>} {Green} {}; }; }; #else { #format {xptimer_message} {[hotspots] <138>* Resetting visit timer for%c $visittimers[$spot][name]%c.<099>} {Green} {}; }; #format {xp_message_check} {%L} {$xptimer_message}; #if {$xp_message_check > 0} { #echo {$xptimer_message}; #variable {xptimer_recent_flag} {1}; }; }; }; }; #unvariable {dtreset_all}; }; #ACTION {%1 deals the death blow to %2.} { #foreach {*killtimers[]} {spot} { #regex {%2} {$spot} { #format {killtimers[$spot][time]} {%T}; #variable {xptimer_recent_flag} {1}; }; }; }; #ACTION {You kill %1.} { #foreach {*killtimers[]} {spot} { #regex {%1} {$spot} { #format {killtimers[$spot][time]} {%T}; #variable {xptimer_recent_flag} {1}; }; }; }; #nop The smuggler captain dies. #ACTION {^%1 dies.$} { #foreach {*killtimers[]} {spot} { #nop Force case insensitivity on the match due to "The" "A" being capitalized; #regex {%1} {%i$spot} { #format {killtimers[$spot][time]} {%T}; #variable {xptimer_recent_flag} {1}; }; }; }; #FUNCTION {write_spot} { #var {spotname} {%1}; #var {spottime} {%2}; #var {spotrespawn} {%3}; #format {current_time} {%T}; #if {$spottime == 0} { #format {spotstring} { - (???) %s } {$spotname}; }; #else { #math {mins} {$current_time - $spottime}; #math {mins} {($mins - (60 - 1)) / 60}; #nop 2/2026 changing scheme here; #nop if rat is 40, 30-45 yellow, 45-60 red, beyond 60 miss; #math {low_b} {$spotrespawn - 10}; #math {up_b} {$spotrespawn + 5}; #math {miss_b} {$spotrespawn + 20}; #nop if we're at or beyond the lower bound; #if {$mins >= $low_b} { #nop are we at or below upper bound? YELLOW; #if {$mins <= $up_b} { #var {current_spot_color} {<139>}; }; #nop are we beyond the miss zone? show grey; #elseif {$mins > $miss_b} { #var {current_spot_color} {<099>}; }; #nop otherwise we're in sweet spot, RED; #else { #var {current_spot_color} {<119>}; }; }; #else { #var {current_spot_color} {<099>}; }; #if {$mins > 99} { #var {mins} {99} }; #nop Format the line to print; #if {$mins >= 10} { #format {spotstring} { - (%dm) %c%s<099> } {$mins} {$current_spot_color} {$spotname}; }; #else { #nop Zero pad under 10 mins; #format {spotstring} { - (0%dm) %c%s<099> } {$mins} {$current_spot_color} {$spotname}; }; }; #return {$spotstring}; }; #ALIAS {dt} { #format {current_time} {%T}; #var {spot_groups} {}; #var {spot_groups_respawn} {}; #echo {.:: Death Timers ::.}; #foreach {*killtimers[]} {spot} { #if {"$killtimers[$spot][group]" == "true"} { #if {&spot_groups[$killtimers[$spot][name]] == 0} { #var {spot_groups[$killtimers[$spot][name]]} {$killtimers[$spot][time]}; #var {spot_groups_respawn[$killtimers[$spot][name]]} {$killtimers[$spot][respawn]}; }; #if {$killtimers[$spot][time] != 0 && $killtimers[$spot][time] > $spot_groups[$killtimers[$spot][name]]} { #var {spot_groups[$killtimers[$spot][name]]} {$killtimers[$spot][time]}; #var {spot_groups_respawn[$killtimers[$spot][name]]} {$killtimers[$spot][respawn]}; }; #continue; }; #var {spotstring} {@write_spot{$killtimers[$spot][name];$killtimers[$spot][time];$killtimers[$spot][respawn]}}; #echo {$spotstring}; }; #foreach {*spot_groups[]} {spot} { #var {spotstring} {@write_spot{$spot;$spot_groups[$spot];$spot_groups_respawn[$spot]}}; #echo {$spotstring}; }; #echo {\n}; #var {spot_groups} {}; #var {spot_groups_respawn} {}; #echo {.:: Visit Timers ::.}; #format {current_time} {%T}; #foreach {*visittimers[]} {spot} { #if {"$visittimers[$spot][group]" == "true"} { #if {&spot_groups[$visittimers[$spot][name]] == 0} { #var {spot_groups[$visittimers[$spot][name]]} {$visittimers[$spot][time]}; #var {spot_groups_respawn[$visittimers[$spot][name]]} {$visittimers[$spot][respawn]}; }; #if {$visittimers[$spot][time] != 0 && $visittimers[$spot][time] > $spot_groups[$visittimers[$spot][name]]} { #var {spot_groups[$visittimers[$spot][name]]} {$visittimers[$spot][time]}; #var {spot_groups_respawn[$visittimers[$spot][name]]} {$visittimers[$spot][respawn]}; }; #continue; }; #var {spotstring} {@write_spot{$visittimers[$spot][name];$visittimers[$spot][time];$visittimers[$spot][respawn]}}; #echo {$spotstring}; }; #foreach {*spot_groups[]} {spot} { #var {spotstring} {@write_spot{$spot;$spot_groups[$spot];$spot_groups_respawn[$spot]}}; #echo {$spotstring}; }; #echo {\n}; }; #ALIAS {/writetimerstofile} { #system {> $xptimer_file}; #format {current_time} {%T}; #var {spot_groups} {}; #var {spot_groups_respawn} {}; #line {log} {$xptimer_file} {.:: Death Timers ::. }; #foreach {*killtimers[]} {spot} { #if {"$killtimers[$spot][group]" == "true"} { #if {&spot_groups[$killtimers[$spot][name]] == 0} { #var {spot_groups[$killtimers[$spot][name]]} {$killtimers[$spot][time]}; #var {spot_groups_respawn[$killtimers[$spot][name]]} {$killtimers[$spot][respawn]}; }; #if {$killtimers[$spot][time] != 0 && $killtimers[$spot][time] > $spot_groups[$killtimers[$spot][name]]} { #var {spot_groups[$killtimers[$spot][name]]} {$killtimers[$spot][time]}; #var {spot_groups_respawn[$killtimers[$spot][name]]} {$killtimers[$spot][respawn]}; }; #continue; }; #var {spotstring} {@write_spot{$killtimers[$spot][name];$killtimers[$spot][time];$killtimers[$spot][respawn]}}; #line {log} {$xptimer_file} {$spotstring}; }; #foreach {*spot_groups[]} {spot} { #var {spotstring} {@write_spot{$spot;$spot_groups[$spot];$spot_groups_respawn[$spot]}}; #line {log} {$xptimer_file} {$spotstring}; }; #line {log} {$xptimer_file} {\n\r\n\r.:: Visit Timers ::. }; #var {spot_groups} {}; #var {spot_groups_respawn} {}; #foreach {*visittimers[]} {spot} { #if {"$visittimers[$spot][group]" == "true"} { #if {&spot_groups[$visittimers[$spot][name]] == 0} { #var {spot_groups[$visittimers[$spot][name]]} {$visittimers[$spot][time]}; #var {spot_groups_respawn[$visittimers[$spot][name]]} {$visittimers[$spot][respawn]}; }; #if {$visittimers[$spot][time] != 0 && $visittimers[$spot][time] > $spot_groups[$visittimers[$spot][name]]} { #var {spot_groups[$visittimers[$spot][name]]} {$visittimers[$spot][time]}; #var {spot_groups_respawn[$visittimers[$spot][name]]} {$visittimers[$spot][respawn]}; }; #continue; }; #var {spotstring} {@write_spot{$visittimers[$spot][name];$visittimers[$spot][time];$visittimers[$spot][respawn]}}; #line {log} {$xptimer_file} {$spotstring}; }; #foreach {*spot_groups[]} {spot} { #var {spotstring} {@write_spot{$spot;$spot_groups[$spot];$spot_groups_respawn[$spot]}}; #line {log} {$xptimer_file} {$spotstring}; }; }; #EVENT {SEND OUTPUT} {/writetimerstofile;}; #FUNCTION {parse_spot} { #var {spot_sync_raw} {%0}; #replace {spot_sync_raw} {=} {;}; #list {spot_sync} {create} {${spot_sync_raw}}; #return {$spot_sync}; }; #ALIAS {^dtload$} { #class {dtsync} {clear}; #class {dtsync} {read} {$xptimersync_file}; #variable {killtimers} {$killtimers_sync}; #variable {visittimers} {$visittimers_sync}; #showme {1}; #format {dtsync_message} {[hotspots] <138>* Synced all available hotspot timers for %clast session%c from the disk.<099>} {Green}{}; #echo {$dtsync_message}; }; #ALIAS {^dtsave$} { /writetimerstosyncfile; #showme {2}; #format {dtsync_message} {[hotspots] <138>* Saved all available hotspot timers from %cthis session%c to the disk.<099>} {Green}{}; #echo {$dtsync_message}; }; #ALIAS {/writetimerstosyncfile} { #nop Don't overwrite saved timers if we haven't recorded anything new; #if {$xptimer_recent_flag == 0} { #return; }; #class {dtsync} {clear}; #class {dtsync} {open}; #var {killtimers_sync} {$killtimers}; #var {visittimers_sync} {$visittimers}; #class {dtsync} {close}; #class {dtsync} {write} {$xptimersync_file}; }; #ACTION {%1 tells you: ruhs_dtsync=[%2] | ruhs_vtsync=[%3]} { #var {synccount} {0}; #var {dtsync} {%2}; #var {vtsync} {%3}; #replace {dtsync} {,} {;}; #replace {vtsync} {,} {;}; #list dtsync_list create {${dtsync}}; #list vtsync_list create {${vtsync}}; #foreach {*dtsync_list[]} {spot} { #var {syncitem} {@parse_spot{$dtsync_list[$spot]}}; #var {syncname} {$syncitem[1]}; #var {synctime} {$syncitem[2]}; #foreach {*killtimers[]} {spotident} { #var {spotname} {$killtimers[$spotident][name]}; #if {"$spotname" == "$syncname"} { #var {killtimers[$spotident][time]} {$synctime}; #math {synccount} {$synccount + 1}; }; }; }; #foreach {*vtsync_list[]} {spot} { #var {syncitem} {@parse_spot{$vtsync_list[$spot]}}; #var {syncname} {$syncitem[1]}; #var {synctime} {$syncitem[2]}; #foreach {*visittimers[]} {spotident} { #var {spotname} {$killtimers[$spotident][name]}; #if {"$spotname" == "$syncname"} { #var {visittimers[$spotident][time]} {$synctime}; #math {synccount} {$synccount + 1}; }; }; }; #format {dtsync_message} {[hotspots] <138>* Synced %c%d%c spots from %c%s%c.<099>} {Orange}{$synccount}{}{Green}{%1}{}; #echo {$dtsync_message}; }; #ALIAS {dtsync %1} { #var {dtsync_msg} {}; #var {vtsync_msg} {}; #foreach {*killtimers[]} {spotident} { #if {$killtimers[$spotident][time] > 0} { #format {dtsync_msg} {%s,%s=%d} {$dtsync_msg}{$killtimers[$spotident][name]}{$killtimers[$spotident][time]}; }; }; #regex {$dtsync_msg} {^,{(.+)}$} { #var {dtsync_msg} {&1}; }; #foreach {*visittimers[]} {spotident} { #if {$visittimers[$spotident][time] > 0} { #format {vtsync_msg} {%s,%s=%d} {$vtsync_msg}{$visittimers[$spotident][name]}{$visittimers[$spotident][time]}; }; }; #regex {$vtsync_msg} {^,{(.+)}$} { #var {vtsync_msg} {&1}; }; #format {sync_message} {tell %s ruhs_dtsync=[%s] | ruhs_vtsync=[%s]} {%1} {$dtsync_msg} {$vtsync_msg}; #send {$sync_message}; }; #nop #EVENT {IAC SB GMCP room.info IAC SE}; #ALIAS {/spottimercheckroomid %1} { #var {room_info} {%1}; #foreach {*visittimers[]} {spot} { #regex {$room_info} {$spot} { #format {visittimers[$spot][time]} {%T}; }; }; }; #ALIAS {gsdt} { #var {gsdt_string} {}; #var {spot_groups} {}; #var {group_spot_label} {}; #foreach {*killtimers[]} {spot} { #format {spotname} {$killtimers[$spot][name]}; #var {mins} {???}; #if {$killtimers[$spot][time] == 0} { #format {spotstring} {%s: ??? |} {$spotname}; #continue; }; #else { #math {mins} {$current_time - $killtimers[$spot][time]}; #math {mins} {($mins - (60 - 1)) / 60}; #if {$mins > 99} { #var {mins} {99} }; #if {$mins < 10} { #format {spotstring} {%s: 0%dm |} {$spotname} {$mins} ; }; #else { #format {spotstring} {%s: %dm |} {$spotname} {$mins} ; }; }; #if {"$killtimers[$spot][group]" == "true"} { #if {&spot_groups[$killtimers[$spot][name]] == 0} { #var {spot_groups[$killtimers[$spot][name]]} {$killtimers[$spot][time]}; #var {group_spot_label[$killtimers[$spot][name]]} {$spotstring}; }; #if {$killtimers[$spot][time] < $spot_groups[$killtimers[$spot][name]]} { #var {spot_groups[$killtimers[$spot][name]]} {$killtimers[$spot][time]}; #var {group_spot_label[$killtimers[$spot][name]]} {$spotstring}; }; #continue; }; #format {gsdt_string} {%s %s} {$gsdt_string} {$spotstring}; }; #foreach {*spot_groups} {spot} { #format {gsdt_string} {%s %s} {$gsdt_string} {$group_spot_label[$spot]}; }; #var {spot_groups} {}; #var {group_spot_label} {}; #foreach {*visittimers[]} {spot} { #format {spotname} {$visittimers[$spot][name]}; #var {mins} {???}; #if {$visittimers[$spot][time] == 0} { #format {spotstring} {%s: ??? |} {$spotname}; #continue; }; #else { #math {mins} {$current_time - $visittimers[$spot][time]}; #math {mins} {($mins - (60 - 1)) / 60}; #if {$mins > 99} { #var {mins} {99} }; #if {$mins < 10} { #format {spotstring} {%s: 0%dm |} {$spotname} {$mins} ; }; #else { #format {spotstring} {%s: %dm |} {$spotname} {$mins} ; }; }; #if {"$visittimers[$spot][group]" == "true"} { #if {&spot_groups[$visittimers[$spot][name]] == 0} { #var {spot_groups[$visittimers[$spot][name]]} {$visittimers[$spot][time]}; #var {group_spot_label[$visittimers[$spot][name]]} {$spotstring}; }; #if {$visittimers[$spot][time] < $spot_groups[$visittimers[$spot][name]]} { #var {spot_groups[$visittimers[$spot][name]]} {$visittimers[$spot][time]}; #var {group_spot_label[$visittimers[$spot][name]]} {$spotstring}; }; #continue; }; #format {gsdt_string} {%s %s} {$gsdt_string} {$spotstring}; }; #foreach {*spot_groups} {spot} { #format {gsdt_string} {%s %s} {$gsdt_string} {$group_spot_label[$spot]}; }; #regex {$gsdt_string} {^{(.+)} \|$} {#var {gsdt_string} {&1}; }; #send {group say $gsdt_string}; }; #CLASS {xptimers} {close};