We've just started working on building our first instance on our server, and I wanted to place an instance re-do timer. As far as I was aware, you couldn't set a timer when bosses were killed or tasks completed, or really any way to trigger it. I wrote this specifically to handle instance timers using qglobals. It will set a qglobal for an instance identifier against a character ID, with a UNIX timestamp in it's value field.
InstanceGlobals.pl :-
Code:
## Plugin used for assigning and retrieving instance re-run timers. When setting and retrieving timers, you use identical identifiers.
## Courtesy of Method on Realm of Draconis Server ~ http://www.realmofdraconis.tk
## USE: plugin::SetInstanceRedoTimer("InstanceIdentifier", TimerInSeconds);
## This will set the instance timer for a character, usable for when a certain boss is killed or when a task is handed in.
sub SetInstanceRedoTimer {
my $globalName = $_[0];
my $globalTimer = $_[1];
my $client = plugin::val('$client');
my $qglobals = plugin::var('qglobals');
my $name = plugin::val('$name');
my $charid = $client->CharacterID();
my $usedGlobalName = $charid.":".$globalName;
my $timestamp = time + $globalTimer;
$client->SetGlobal("$usedGlobalName", $timestamp, 7, "S$globalTimer");
#$client->Message(15, "QGlobal Set: $usedGlobalName with Value of $timestamp");
}
## USE: plugin::GetInstanceRedoTimer("InstanceIdentifier");
## This will retrieve the instance timer for the character who requested it. Returns a UNIX Timestamp format for when the timer ends.
sub GetInstanceRedoTimer {
my $globalName = $_[0];
my $client = plugin::val('$client');
my $qglobals = plugin::var('qglobals');
my $name = plugin::val('$name');
my $charid = $client->CharacterID();
my $usedGlobalName = $charid.":".$globalName;
my $globalVal = $qglobals->{"$usedGlobalName"};
#$client->Message(15, "Trying to get global... $usedGlobalName");
#$client->Message(15, "$usedGlobalName has Value of $globalVal");
return $globalVal;
}
## USE: plugin::ClearInstanceRedoTimer("InstanceIdentifier", TimerInSeconds);
## This will clear the instance timer for a character. It has a 1 second delay, but will set the timestamp to time of request, and expiry will happen 1s after. This will effectively clear the instance timer.
sub ClearInstanceRedoTimer {
my $globalName = $_[0];
my $client = plugin::val('$client');
my $qglobals = plugin::var('qglobals');
my $name = plugin::val('$name');
my $charid = $client->CharacterID();
my $usedGlobalName = $charid.":".$globalName;
my $timestamp = time;
$client->SetGlobal("$usedGlobalName", $timestamp, 7, "S1");
#$client->Message(15, "QGlobal Set: $usedGlobalName with Value of $timestamp");
}
## USE: plugin::InstanceTimerRemaining("InstanceIdentifier", 0=Will return formatted string (1h 10m 20s)|1=Will return time remaining in seconds);
## This will return the instance timer's remaining time, in 1 of 2 formats: Formatted string, or seconds.
sub InstanceTimerRemaining {
my $globalName = $_[0];
my $option = $_[1];
my $client = plugin::val('$client');
my $qglobals = plugin::var('qglobals');
my $name = plugin::val('$name');
my $charid = $client->CharacterID();
my $usedGlobalName = $charid.":".$globalName;
my $globalVal = $qglobals->{"$usedGlobalName"};
my $timeNow = time;
my $timeRemaining = $globalVal - $timeNow;
if($timeRemaining > 0){
if($option == 1){
return $timeRemaining;
} else {
my $timeLeft = plugin::ConvertSecondsToTime($timeRemaining);
return $timeLeft;
}
} else {
return 0;
}
}
## USE: plugin::IsInstanceTimerOver("InstanceIdentifier");
## This will return a boolean value. If the Timer is over, it will return 1. If the timer is still currernt, it will return 0.
sub IsInstanceTimerOver {
my $globalName = $_[0];
my $client = plugin::val('$client');
my $qglobals = plugin::var('qglobals');
my $name = plugin::val('$name');
my $charid = $client->CharacterID();
my $usedGlobalName = $charid.":".$globalName;
my $globalVal = $qglobals->{"$usedGlobalName"};
my $timeNow = time;
if($globalVal > $timeNow){
return 0;
} else {
return 1;
}
}
## USE: plugin::ConvertSecondsToTime(Seconds);
## This will return seconds value entered as a formatted string similar to 1h 10m 20s.
sub ConvertSecondsToTime {
my $time = $_[0];
my $days = int($time / 86400);
$time -= ($days * 86400);
my $hours = int($time / 3600);
$time -= ($hours * 3600);
my $minutes = int($time / 60);
my $seconds = $time % 60;
$days = $days < 1 ? '' : $days .'d ';
$hours = $hours < 1 ? '' : $hours .'h ';
$minutes = $minutes < 1 ? '' : $minutes . 'm ';
$time = $days . $hours . $minutes . $seconds . 's';
return $time;
}
I have commented to the best of my ability and there is a good chance I will expand on it further. It's possible there is quite a few bugs or errors because I have only been developing on Perl for about 3 weeks now. I hope the script is of use to someone at least