View Single Post
  #1  
Old 05-03-2013, 11:28 AM
meth0d
Fire Beetle
 
Join Date: Apr 2013
Location: Denmark
Posts: 3
Default Instance Timers Plugin Script

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
__________________
meth0d. the Blade Dancer of Draconis
Content and Quest Developer at Realm of Draconis
http://www.draconis.online/
Reply With Quote