Go Back   EQEmulator Home > EQEmulator Forums > Quests > Quests::Plugins & Mods

Quests::Plugins & Mods Completed plugins for public use as well as modifications.

Reply
 
Thread Tools Display Modes
  #1  
Old 12-24-2013, 12:49 AM
Akkadius's Avatar
Akkadius
Administrator
 
Join Date: Feb 2009
Location: MN
Posts: 2,071
Default Plugin: Player Leaderboards (In-Game)

Purpose:

To display an in-game leaderboards for players to see where they rank.

------------------------

I've had this code written for ages so the quality is so-so. But it definitely does what it needs to do. Feel free to modify if want.

------------------------

Required: Perl DBI - See Google for installing Perl DBI/DBD for Mysql, until I create an article explaining otherwise.
Required: plugin::LoadMysql(); - See thread HERE
Required: Popup Window plugin utils
Required: Mysql table `cust_ext_leaderboards`

http://wiki.eqemulator.org/i?Module=...Paste=BgtI3fWi



Source Table:

Code:
-- ----------------------------
-- Table structure for cust_ext_leaderboards
-- ----------------------------
DROP TABLE IF EXISTS `cust_ext_leaderboards`;
CREATE TABLE `cust_ext_leaderboards` (
  `id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `class` varchar(255) NOT NULL,
  `race` varchar(255) NOT NULL,
  `hp` int(11) NOT NULL,
  `mana` int(11) NOT NULL,
  `ac` int(11) NOT NULL,
  `status` int(11) NOT NULL,
  `aa` int(11) NOT NULL,
  `level` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Usage Example:

Code:
sub EVENT_SAY{
	if($text=~/hail/i){
		quest::say("What do you want?");
		quest::say(quest::saylink("I want to check my player leaderboards man!", 1));
	}
	if($text=~/leaderboards/i){
		quest::say("Fine!");
	}
	# Plugin will match for 'player leaderboards' and display menu options, it will also respond to further saylinks
	plugin::LeaderBoardsMenu($text);
}
Note: In order to actually have the players info collected, you have to insert the collection routine somewhere. I usually trigger it in EVENT_ENTERZONE of global_player.pl but you can do it however you want:

Code:
plugin::LeaderBoardsUpdate();
Plugin File: (Goes under /plugins folder)
Name: Leaderboards.pl

Options: You can set your website Magelo Path under LoadMageloPath, or you can put in javascript:; or # if you don't have a site.

Enjoy, let me know if you experience issues.

Last edited by Akkadius; 03-10-2015 at 08:22 PM..
Reply With Quote
  #2  
Old 12-24-2013, 07:14 AM
thepoetwarrior
Discordant
 
Join Date: Aug 2007
Posts: 307
Default

Quote:
Originally Posted by Akkadius View Post
Note: In order to actually have the players info collected, you have to insert the collection routine somewhere. I usually trigger it in EVENT_ENTERZONE of global_player.pl

Nice Akkadius!

+1

I prefer to run the collection routine in this sub:

sub EVENT_CONNECT {}

That way code runs only 1 time when player logs in, instead of every time they zone.

That way it won't spam update the database each time a player dies or zones.
Reply With Quote
  #3  
Old 02-24-2015, 08:24 PM
Nibiuno
Hill Giant
 
Join Date: Mar 2010
Posts: 101
Default

Is this still working? I installed everything, and queries are working. When I say 'player leaderboards' I get the text "Player Leaderboards" and a list of classes in saylink format. If I click any of the saylinks, nothing happens. If I manually type the trigger, nothing happens as well.

Im not sure if Im missing a plugin. I downloaded the popup_window_utils, DBI is working, and the database table is working and being populated.
Reply With Quote
  #4  
Old 02-25-2015, 01:26 AM
Akkadius's Avatar
Akkadius
Administrator
 
Join Date: Feb 2009
Location: MN
Posts: 2,071
Default

Quote:
Originally Posted by Nibiuno View Post
Is this still working? I installed everything, and queries are working. When I say 'player leaderboards' I get the text "Player Leaderboards" and a list of classes in saylink format. If I click any of the saylinks, nothing happens. If I manually type the trigger, nothing happens as well.

Im not sure if Im missing a plugin. I downloaded the popup_window_utils, DBI is working, and the database table is working and being populated.
Set quest logging and see if there are any errors? It could be that you are missing a plugin like you said.

I would download a fresh batch of plugins from the stickied SVN in the thread:

http://www.eqemulator.org/forums/showthread.php?t=32608
Reply With Quote
  #5  
Old 03-09-2015, 08:24 PM
epilz
Hill Giant
 
Join Date: Sep 2013
Posts: 247
Default

I have tried this plugin, and I am running into the same issue that Nibiuno stated above. Verified DBI is working, the cust_ext_leaderboards is being populated correctly. The popup_windows_utils and leaderboards.pl are in the plugin folder. I get the saylinks for classes, but once I click one of them, nothing happens.
Reply With Quote
  #6  
Old 03-09-2015, 08:37 PM
ghanja's Avatar
ghanja
Dragon
 
Join Date: Aug 2012
Location: Hershey, PA
Posts: 499
Default

Quote:
Originally Posted by epilz View Post
I have tried this plugin, and I am running into the same issue that Nibiuno stated above. Verified DBI is working, the cust_ext_leaderboards is being populated correctly. The popup_windows_utils and leaderboards.pl are in the plugin folder. I get the saylinks for classes, but once I click one of them, nothing happens.
Do you have quest logging on? Anything in the logs?
Reply With Quote
  #7  
Old 03-09-2015, 08:43 PM
epilz
Hill Giant
 
Join Date: Sep 2013
Posts: 247
Default

yes I have logging set to 3, I can see the queries happening, but no errors
Reply With Quote
  #8  
Old 03-09-2015, 08:45 PM
Akkadius's Avatar
Akkadius
Administrator
 
Join Date: Feb 2009
Location: MN
Posts: 2,071
Default

Quote:
Originally Posted by epilz View Post
I have tried this plugin, and I am running into the same issue that Nibiuno stated above. Verified DBI is working, the cust_ext_leaderboards is being populated correctly. The popup_windows_utils and leaderboards.pl are in the plugin folder. I get the saylinks for classes, but once I click one of them, nothing happens.
I'm sorry, but this reminds me of this:



THE GIRLS NEVER CAME.

I have to help someone quick but I will check into this plugin. Thanks for reporting.
Reply With Quote
  #9  
Old 03-09-2015, 08:47 PM
epilz
Hill Giant
 
Join Date: Sep 2013
Posts: 247
Default

LMAO Akka, thanks
Reply With Quote
  #10  
Old 03-10-2015, 07:03 PM
Akkadius's Avatar
Akkadius
Administrator
 
Join Date: Feb 2009
Location: MN
Posts: 2,071
Default

Looking at this now
Reply With Quote
  #11  
Old 03-10-2015, 08:21 PM
Akkadius's Avatar
Akkadius
Administrator
 
Join Date: Feb 2009
Location: MN
Posts: 2,071
Default

OK, spent about an hour cleaning this up.

Replace Leaderboards.pl in your plugins folder with this code:

http://wiki.eqemulator.org/i?Module=...Paste=BgtI3fWi



Source Table:

Code:
-- ----------------------------
-- Table structure for cust_ext_leaderboards
-- ----------------------------
DROP TABLE IF EXISTS `cust_ext_leaderboards`;
CREATE TABLE `cust_ext_leaderboards` (
  `id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `class` varchar(255) NOT NULL,
  `race` varchar(255) NOT NULL,
  `hp` int(11) NOT NULL,
  `mana` int(11) NOT NULL,
  `ac` int(11) NOT NULL,
  `status` int(11) NOT NULL,
  `aa` int(11) NOT NULL,
  `level` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Reply With Quote
  #12  
Old 03-10-2015, 08:43 PM
epilz
Hill Giant
 
Join Date: Sep 2013
Posts: 247
Default

Thanks for the update. Copied the new code to Leaderboards.pl in my plugins folder and resourced my DB. Do not get the popup window, but that maybe because the cust_ext_leaderboards table has not been populated yet. I have the following in my global_player.pl file.

Code:
sub EVENT_ENTERZONE {	
	plugin::LeaderBoardsUpdate();
}
Reply With Quote
  #13  
Old 03-10-2015, 08:45 PM
Akkadius's Avatar
Akkadius
Administrator
 
Join Date: Feb 2009
Location: MN
Posts: 2,071
Default

Quote:
Originally Posted by epilz View Post
Thanks for the update. Copied the new code to Leaderboards.pl in my plugins folder and resourced my DB. Do not get the popup window, but that maybe because the cust_ext_leaderboards table has not been populated yet. I have the following in my global_player.pl file.

Code:
sub EVENT_ENTERZONE {	
	plugin::LeaderBoardsUpdate();
}
Make sure you have the DiaWind plugin.

It has become apparent to me we need a decent way to update plugins because people are apparently downloading the wrong ones...
Reply With Quote
  #14  
Old 03-10-2015, 08:50 PM
epilz
Hill Giant
 
Join Date: Sep 2013
Posts: 247
Default

Yup. I have it. I downloaded all the plugins from the repository. Check them daily to see if there are any new changes.

Here is the Diawind.pl plugin.

Code:
#::: Author: Akkadius
#::: This plugin can work as an extensive drop in replacement for quest::say
#::: This plugin also offers extensive options for easily formatting windows. 
#::: Usage: plugin::DiaWind("Window text");
#::: For explanation of use, see: http://wiki.eqemulator.org/p?The_DiaWind_Plugin&frm=Perl_Plugins_Master_Reference

sub DiaWind { 
	my $Text = $_[0]; my $npc = plugin::val('$npc'); $client = plugin::val('$client'); $name = plugin::val('$name');
    my $Opt = 0;
	if(!$PopId){ $PopId = 999; } 
	$Text=~ s/~/<\/c>/g;
	$Text=~ s/\{y\}/<c \"#CCFF33\">/g;
	$Text=~ s/\{lb\}/<c \"#00FFFF\">/g;
	$Text=~ s/\{r}/<c \"#FF0000\">/g;
	$Text=~ s/\{g}/<c \"#00FF00\">/g;
	$Text=~ s/\{gold}/<c \"#FFFF66\">/g;
	$Text=~ s/\{orange}/<c \"#FFA500\">/g;
	$Text=~ s/\{gray}/<c \"#808080\">/g;
	$Text=~ s/\{tan}/<c \"#daa520\">/g;
	$Text=~ s/\{bullet}/•/g;
	$Text=~ s/\$name/$name/g;
	$Text=~ s/\{linebreak}/--------------------------------------------------------------------/g;
	$Text=~ s/\{rowpad}/<tr><td>{tdpad}<\/td><td>{tdpad}<\/td><\/tr>/g; 
	$Text=~ s/\{tdpad}/----------------------/g; 
	$Text=~ s/\{in}/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/g;
	my ($mvoice) = $Text =~ s/mysterious//g;
	my ($achievement) = $Text =~ s/achievement//g;
	my ($noquotes) = $Text =~ s/noquotes//g; if($noquotes){ $quo = ""; } else{ $quo = "'"; }
	my ($nobracket) = $Text =~ s/nobracket//g;
	my ($nosound) = $Text =~ s/nosound//g;
	my ($cname) = $Text =~ /{(.*)\>/; $Text =~ s/{$cname\>//g;
	if(!$nobracket){
		($bracket) = $Text =~ /\[([^\]]+)\].*/;
		($bracket2) = $Text =~ /\[(.*)\>/;
	}

	my ($anim) = $Text =~ /\+(.*)\+/; $Text=~ s/\+$anim\+//g;
	my ($Timer) = $Text =~ /\=(.*)\=/; $Text=~ s/\=$Timer\=//g;
	my $response = ""; my $ClickQueue = ""; my $Options = "";
	my @popupid = $Text =~ /popupid\:(\d+)/g;
	if($popupid[0]){ $PopId = $popupid[0]; my $string = "popupid:" . $popupid[0]; $Text=~ s/$string//g; }
	my @wintype = $Text =~ /wintype\:(\d+)/g;
	if($wintype[0]){ if($wintype[0] == 1){ $Opt = 1; }; my $string = "wintype:" . $wintype[0]; $Text=~ s/$string//g; }
	if(!$nobracket){
		if($bracket){ $response = $bracket; 	}
		if($bracket2){ $response = $bracket2; 	}
		@data = ($Text =~ m/\[([^\]]+)\]/g);
		foreach $val (@data){ $Options .= "" . quest::saylink($val, 1) . " - ";}
		if($data[1]){ $client->Message(15, " --- Select Response from Options --- "); $client->Message(0, "[" . substr ($Options, 0, -3) . "]"); }
	}
	if($anim){ if($anim > 0){ quest::doanim($anim); } else{ plugin::DoAnim($anim);} }
	my $string = quotemeta("[" . $bracket2 . ">"); $Text=~ s/$string//g;
	if($Timer > 0){ $ClickQueue = "<c \"#F07F00\">This message will disappear in " . $Timer . " second(s)...</c>"; }
	elsif($response ne ""){ $client->SetEntityVariable("npcresponse", $response); 
		if($Opt == 1){ $ClickQueue = "<c \"#F07F00\">Click 'Yes' to continue'...</c>"; }
		else{ $ClickQueue = "<c \"#F07F00\">Click 'OK' to respond with '" . $response . "'...</c>"; }
	}else{ $client->SetEntityVariable("npcresponse", ""); 
		if($Opt == 1){ $ClickQueue = "<c \"#F07F00\">Click 'Yes' to continue'...</c>";}
		else{ $ClickQueue = "<c \"#F07F00\">Click 'OK' to continue...</c>"; }
	}
	if($achievement){} elsif($cname){ $Speaking = $cname . " says"; } elsif($mvoice){ $Speaking = "A Mysterious Voice says"; } else{ if($npc){ $Speaking = $npc->GetCleanName() . ' says'; } }
	if($achievement){ $Title = "New Achievment!"; } else{ $Title = "Dialogue: " . $Speaking; }
	if($achievement){ $Timer = 5; quest::popup($Title,  $Text . "" . $ClickQueue . "", $PopId, $Opt, $Timer); }
	else{ quest::popup($Title,  "<c \"#CCFF33\">" . $Speaking . "</c><br><br>" . $quo . "" . $Text . "" . $quo . "" . "<br><br>" . $ClickQueue . "", $PopId, $Opt, $Timer); }
	$PopId = undef; $achievement = undef;
} 

#::: Used for include of EVENT_POPUPRESPONSE
#::: http://wiki.eqemulator.org/p?The_DiaWind_Plugin#to-activate-this-plugin
sub DiaWind_Process_Response{
	my $popupid = plugin::val('$popupid');
	my $client = plugin::val('$client');
	if($popupid == 999){
		my $nresponse = $client->GetEntityVariable("npcresponse");
		if($Debug){ $client->Message(15, "Debug Silent Message: '" . $nresponse . "'"); }
		if($nresponse ne ""){ $client->SilentMessage($nresponse); } return;
	}
}
Reply With Quote
  #15  
Old 03-10-2015, 08:52 PM
Akkadius's Avatar
Akkadius
Administrator
 
Join Date: Feb 2009
Location: MN
Posts: 2,071
Default

Quote:
Originally Posted by epilz View Post
Yup. I have it. I downloaded all the plugins from the repository. Check them daily to see if there are any new changes.

Here is the Diawind.pl plugin.

Code:
#::: Author: Akkadius
#::: This plugin can work as an extensive drop in replacement for quest::say
#::: This plugin also offers extensive options for easily formatting windows. 
#::: Usage: plugin::DiaWind("Window text");
#::: For explanation of use, see: http://wiki.eqemulator.org/p?The_DiaWind_Plugin&frm=Perl_Plugins_Master_Reference

sub DiaWind { 
	my $Text = $_[0]; my $npc = plugin::val('$npc'); $client = plugin::val('$client'); $name = plugin::val('$name');
    my $Opt = 0;
	if(!$PopId){ $PopId = 999; } 
	$Text=~ s/~/<\/c>/g;
	$Text=~ s/\{y\}/<c \"#CCFF33\">/g;
	$Text=~ s/\{lb\}/<c \"#00FFFF\">/g;
	$Text=~ s/\{r}/<c \"#FF0000\">/g;
	$Text=~ s/\{g}/<c \"#00FF00\">/g;
	$Text=~ s/\{gold}/<c \"#FFFF66\">/g;
	$Text=~ s/\{orange}/<c \"#FFA500\">/g;
	$Text=~ s/\{gray}/<c \"#808080\">/g;
	$Text=~ s/\{tan}/<c \"#daa520\">/g;
	$Text=~ s/\{bullet}/•/g;
	$Text=~ s/\$name/$name/g;
	$Text=~ s/\{linebreak}/--------------------------------------------------------------------/g;
	$Text=~ s/\{rowpad}/<tr><td>{tdpad}<\/td><td>{tdpad}<\/td><\/tr>/g; 
	$Text=~ s/\{tdpad}/----------------------/g; 
	$Text=~ s/\{in}/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/g;
	my ($mvoice) = $Text =~ s/mysterious//g;
	my ($achievement) = $Text =~ s/achievement//g;
	my ($noquotes) = $Text =~ s/noquotes//g; if($noquotes){ $quo = ""; } else{ $quo = "'"; }
	my ($nobracket) = $Text =~ s/nobracket//g;
	my ($nosound) = $Text =~ s/nosound//g;
	my ($cname) = $Text =~ /{(.*)\>/; $Text =~ s/{$cname\>//g;
	if(!$nobracket){
		($bracket) = $Text =~ /\[([^\]]+)\].*/;
		($bracket2) = $Text =~ /\[(.*)\>/;
	}

	my ($anim) = $Text =~ /\+(.*)\+/; $Text=~ s/\+$anim\+//g;
	my ($Timer) = $Text =~ /\=(.*)\=/; $Text=~ s/\=$Timer\=//g;
	my $response = ""; my $ClickQueue = ""; my $Options = "";
	my @popupid = $Text =~ /popupid\:(\d+)/g;
	if($popupid[0]){ $PopId = $popupid[0]; my $string = "popupid:" . $popupid[0]; $Text=~ s/$string//g; }
	my @wintype = $Text =~ /wintype\:(\d+)/g;
	if($wintype[0]){ if($wintype[0] == 1){ $Opt = 1; }; my $string = "wintype:" . $wintype[0]; $Text=~ s/$string//g; }
	if(!$nobracket){
		if($bracket){ $response = $bracket; 	}
		if($bracket2){ $response = $bracket2; 	}
		@data = ($Text =~ m/\[([^\]]+)\]/g);
		foreach $val (@data){ $Options .= "" . quest::saylink($val, 1) . " - ";}
		if($data[1]){ $client->Message(15, " --- Select Response from Options --- "); $client->Message(0, "[" . substr ($Options, 0, -3) . "]"); }
	}
	if($anim){ if($anim > 0){ quest::doanim($anim); } else{ plugin::DoAnim($anim);} }
	my $string = quotemeta("[" . $bracket2 . ">"); $Text=~ s/$string//g;
	if($Timer > 0){ $ClickQueue = "<c \"#F07F00\">This message will disappear in " . $Timer . " second(s)...</c>"; }
	elsif($response ne ""){ $client->SetEntityVariable("npcresponse", $response); 
		if($Opt == 1){ $ClickQueue = "<c \"#F07F00\">Click 'Yes' to continue'...</c>"; }
		else{ $ClickQueue = "<c \"#F07F00\">Click 'OK' to respond with '" . $response . "'...</c>"; }
	}else{ $client->SetEntityVariable("npcresponse", ""); 
		if($Opt == 1){ $ClickQueue = "<c \"#F07F00\">Click 'Yes' to continue'...</c>";}
		else{ $ClickQueue = "<c \"#F07F00\">Click 'OK' to continue...</c>"; }
	}
	if($achievement){} elsif($cname){ $Speaking = $cname . " says"; } elsif($mvoice){ $Speaking = "A Mysterious Voice says"; } else{ if($npc){ $Speaking = $npc->GetCleanName() . ' says'; } }
	if($achievement){ $Title = "New Achievment!"; } else{ $Title = "Dialogue: " . $Speaking; }
	if($achievement){ $Timer = 5; quest::popup($Title,  $Text . "" . $ClickQueue . "", $PopId, $Opt, $Timer); }
	else{ quest::popup($Title,  "<c \"#CCFF33\">" . $Speaking . "</c><br><br>" . $quo . "" . $Text . "" . $quo . "" . "<br><br>" . $ClickQueue . "", $PopId, $Opt, $Timer); }
	$PopId = undef; $achievement = undef;
} 

#::: Used for include of EVENT_POPUPRESPONSE
#::: http://wiki.eqemulator.org/p?The_DiaWind_Plugin#to-activate-this-plugin
sub DiaWind_Process_Response{
	my $popupid = plugin::val('$popupid');
	my $client = plugin::val('$client');
	if($popupid == 999){
		my $nresponse = $client->GetEntityVariable("npcresponse");
		if($Debug){ $client->Message(15, "Debug Silent Message: '" . $nresponse . "'"); }
		if($nresponse ne ""){ $client->SilentMessage($nresponse); } return;
	}
}
Do you know if you have DBI installed?
Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

   

All times are GMT -4. The time now is 06:14 AM.


 

Everquest is a registered trademark of Daybreak Game Company LLC.
EQEmulator is not associated or affiliated in any way with Daybreak Game Company LLC.
Except where otherwise noted, this site is licensed under a Creative Commons License.
       
Powered by vBulletin®, Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Template by Bluepearl Design and vBulletin Templates - Ver3.3