PDA

View Full Version : GM Functions in global_player.pl


ghanja
03-14-2017, 10:57 PM
Having offloaded a few of the EVENT_SAY functions on a few active servers, seems they come appreciated. I'm certain format/form/code in the below could be optimized, as some things have changed revisions here and there and, well, once they worked, I left them alone to work on other pending projects/code.

If nothing else, it may give others ideas or what not. I'm bored with no current project to work on, so, figured I'd post some junk. I love statistics, thus the reason for many of the qglobals flying around in otherwise (to most) unnecessary EVENT's.


quests/global/global_player.pl

## Dependencies: DBI Perl installation, Akka's Doors Manipulation and proper settings in your /plugins/LoadMysql.pl
## Why: Doors Manipulation
$MINACCESSLEVELFORGMSTUFF = 80; ## ACCESS LEVEL NEEDED FOR GM STUFF
sub EVENT_SAY {
if ($status >= $MINACCESSLEVELFORGMSTUFF) {
@args = split(' ', $text);
##
## plugin::Doors_Manipulation_EVENT_SAY(); ## Great plugin from Akkadius commented out in case you dont use/have it (but you should!)
##
#######################################
if ($text=~/#gmcommands/i) {
$client->Message(315,"-----------------------------------");
$client->Message(315,"Custom Commands Available:");
$client->Message(315,"-----------------------------------");
$client->Message(315,"#zemzone - Display and/or adjust ZEM for a zone");
$client->Message(315,"#gmwho - GM show who's in the zone with IP address(es)");
$client->Message(315,"#linked - Show targetted players IP linked accounts");
$client->Message(315,"#gotoinstance - Goto instances via identifier number");
$client->Message(315,"#summonall - Will summon all players (not GMs) to your current location");
$client->Message(315,"#returnplayers - Will return players to their last position before #summonall");
$client->Message(315,"#psay - Makes targetted player shout whatever you want");
$client->Message(315,"#pshout - Makes targetted player shout whatever you want");
$client->Message(315,"#getaway - Knockback of all non-gm players within distance 30");
}
#######################################
elsif ($text=~/#gotoinstance/i) {
if($arg[1]) {
$connect = plugin::LoadMysql();
$query = "SELECT
zone.zoneidnumber,
zone.safe_x,
zone.safe_y,
zone.safe_z
FROM
zone
WHERE
short_name = '" . $arg[1] . "'";
$query_handle = $connect->prepare($query);
$query_handle->execute();
while (@row = $query_handle->fetchrow_array()){ $ISL[0] = [@row];}
$client->Message(15, "Sending you to zonesn: $arg[1] version: $arg[2] with identifier number: $arg[3]");
plugin::SendToInstance("public", "$arg[1]", $arg[2], $ISL[0][1], $ISL[0][2], $ISL[0][3], "$arg[3]", 65000);
}
else {
$client->Message(15, "Usage: #gotoinstance <zonesn> <version> <identifier number>");
}
}
#######################################
elsif ($text=~/#linked/i) {
if ($client->GetTarget()->IsClient()) {
$client->Message(11, "-------------------------------------------------------------------------");
$client->Message(11, "[GM:] Showing Linked Accounts for Targetted Player");
$client->Message(11, "-------------------------------------------------------------------------");
my $dbh = plugin::LoadMysql();
my $sth = $dbh->prepare("
SELECT accid, name
FROM account_ip
INNER JOIN character_data
ON account_ip.accid = character_data.account_id
WHERE account_ip.ip = ?
");
$sth->bind_param(1,ConvertIP($client->GetTarget()->CastToClient->GetIP()));
$sth->execute();
while (my @row = $sth->fetchrow_array()) {
my ($account_id, $playername ) = @row;
quest::gmsay (" Account ID: ".$account_id." --- Name: ".$playername."", 11, 1);
}
$sth->finish();
$dbh->disconnect();
}
else {
$client->Message(15, "[GM:] You MUST target a PLAYER to use this command!");
}
}
#######################################
elsif ($args[0]=~/#zemzone/i){
if (($args[1]) && (!$args[2])) {
my $zonetochange = $args[1];
my $dbh = plugin::LoadMysql();
my $sth=$dbh->prepare('SELECT zone_exp_multiplier FROM zone WHERE short_name = ?')
or die "Couldn't prepare statement: " . $dbh->errstr;
$sth->bind_param(1,$zonetochange);
$sth->execute();
my $currentzem = $sth->fetchrow_array();
$client->Message(15, "[GM:] Current ZEM for ".plugin::Zone("LN",$zonetochange)." is $currentzem");
}
elsif ($args[1] && $args[2]) {
my $zonetochange = $args[1];
my $changezem = $args[2];
my $dbh = plugin::LoadMysql();
$sth = $dbh->prepare('SELECT zone_exp_multiplier FROM zone WHERE short_name = ?')
or die "Couldn't prepare statement: " . $dbh->errstr;
$sth->bind_param(1,$zonetochange);
$sth->execute();
my $currentzem = $sth->fetchrow_array();
$client->Message(315, "UPDATING: Changing ZEM for ".plugin::Zone("LN",$zonetochange)." from $currentzem to $changezem");
$sth = $dbh->prepare('UPDATE zone SET zone_exp_multiplier = ? WHERE short_name = ?')
or die "Couldn't prepare statement: " . $dbh->errstr;
$sth->bind_param(1,$changezem);
$sth->bind_param(2,$zonetochange);
$sth->execute();
$client->Message(15, "[GM:] NOTIFICATION: ZEM for ".plugin::Zone("LN",$zonetochange)." changed from $currentzem to $changezem !");
quest::reloadallrules();
}
else {
$client->Message(315,"Usage: #ZEMZONE [zonesn] (without backets) to view ZEM for specified [zonesn]");
$client->Message(315,"Usage: #ZEMZONE [zonesn] [newzem] (without backets) to change ZEM for specified [zonesn] to [newzem]");
}
}
#######################################
elsif ($text=~/#getaway/i) {
@zoneclients = $entity_list->GetClientList();
foreach $singleclient (@zoneclients) {
if (($singleclient->AccountID() != $client->AccountID()) && (not $singleclient->GetGM())) {
$singleclient->BuffFadeBySlot($singleclient->GetBuffSlotFromType(57), 1);
$singleclient->BuffFadeBySlot($singleclient->GetBuffSlotFromType(58), 1);
if ($client->CalculateDistance($singleclient->GetX(),$singleclient->GetY(),$singleclient->GetZ()) <= 30) {
$singleclient->DoKnockback($client, 7, 5);
}
}
}
}
#######################################
elsif ($text=~/#summonall/i) {
quest::delglobal("summonallzone");
quest::delglobal("summonallx");
quest::delglobal("summonally");
quest::delglobal("summonallz");
quest::delglobal("summonallh");
$client->SetGlobal("summonallzone",$zoneid,7,"F");
$client->SetGlobal("summonallx",$client->GetX(),7,"F");
$client->SetGlobal("summonally",$client->GetY(),7,"F");
$client->SetGlobal("summonallz",$client->GetZ(),7,"F");
$client->SetGlobal("summonallh",$client->GetHeading(),7,"F");
quest::crosszonesignalnpcbynpctypeid(10, 14000);
}
#######################################
elsif ($text=~/#psay/i) {
if($arg[1]) {
if ($client->GetTarget()->IsClient()) {
$formattedstring = "";
for ($count = 1; $count < scalar(@args); $count++) {
$formattedstring = $formattedstring." ".$args[$count];
}
$client->GetTarget()->CastToClient()->Say($formattedstring);
} else {
$client->Message(315,"Target must be a player!");
}
} else {
$client->Message(315,"Usage: Target player and type #psay <text>");
}
}
#######################################
elsif ($text=~/#pshout/i) {
if($arg[1]) {
if ($client->GetTarget()->IsClient()) {
$formattedstring = "";
for ($count = 1; $count < scalar(@args); $count++) {
$formattedstring = $formattedstring." ".$args[$count];
}
$client->GetTarget()->CastToClient()->Shout($formattedstring);
} else {
$client->Message(315,"Target must be a player!");
}
} else {
$client->Message(315,"Usage: Target player and type #pshout <text>");
}
}
#######################################
elsif ($text=~/#returnplayers/i) {
quest::crosszonesignalnpcbynpctypeid(10, 15000);
}
#######################################
elsif ($text=~/#gmwho/i) {
my %classhash = (
1 => "Warrior",
2 => "Cleric",
3 => "Paladin",
4 => "Ranger",
5 => "Shadow Knight",
6 => "Druid",
7 => "Monk",
8 => "Bard",
9 => "Rogue",
10 => "Shaman",
11 => "Necromancer",
12 => "Wizard",
13 => "Magician",
14 => "Enchanter",
15 => "Beastlord",
16 => "Berserker",
);
my %racehash = (
1 => "Human",
2 => "Babarian",
3 => "Erudite",
4 => "Wood Elf",
5 => "High Elf",
6 => "Dark Elf",
7 => "Half Elf",
8 => "Dwarf",
9 => "Troll",
10 => "Ogre",
11 => "Halfling",
12 => "Gnome",
128 => "Iksar",
130 => "Vah Shir",
330 => "Froglok",
);
my %clientversionhash = (
1 => "P99",
2 => "Tit",
4 => "SoF",
8 => "SoD",
16 => "UF",
32 => "RoF",
64 => "RoF2",
);
$client->Message (11, "----------------------------------------");
$client->Message (11, "[GM:] Players in Zone:");
$client->Message (11, "----------------------------------------");
my @clientsarray = $entity_list->GetClientList();
foreach my $singleclient (@clientsarray) {
my $clientguildname;
if (quest::getguildnamebyid($singleclient->GuildID())) {
$clientguildname = "".quest::getguildnamebyid($singleclient->GuildID())."";
}
else {
$clientguildname = "NG";
}
my $wholist = "[".$singleclient->GetLevel()." ".plugin::customclass($singleclient->GetClass(),$singleclient->GetDeity()).
"] ".$singleclient->GetName()." (".$classhash{$singleclient->GetClass()}.") (".
$racehash{$singleclient->GetRace()}.") <".$clientguildname."> [IP: ".ConvertIP($singleclient->GetIP())."] ".
"[Client: ".$clientversionhash{$client->GetClientVersionBit()}."]";
$client->Message (11, "".$wholist."");
}
$client->Message (11, "-------------------------------------------------------------------");
$client->Message (11, "There are ".scalar (@clientsarray)." players in zone!");
}
}
}

sub EVENT_CONNECT {
my %clientverhash = (
1 => "P99",
2 => "Ti",
4 => "SoF",
8 => "SoD",
16 => "UF",
32 => "RoF",
64 => "RoF2",
);
#######################
## New Toon Handling ##
#######################
if (!defined $qglobals{"newtoon"}) {
quest::setglobal("newtoon",1,5,"F");
quest::gmsay ("-----------------------------------------------------------------------------------------------", 257, 1);
quest::gmsay ("[GM:] <$name> newly created toon, checking IP linked characters:", 11, 1);
quest::gmsay ("-----------------------------------------------------------------------------------------------", 11, 1);
my $dbh = plugin::LoadMysql();
my $sth = $dbh->prepare("
SELECT accid, name
FROM account_ip
INNER JOIN character_data
ON account_ip.accid = character_data.account_id
WHERE account_ip.ip = ?
");
$sth->bind_param(1,ConvertIP($client->GetIP()));
$sth->execute();
while (my @row = $sth->fetchrow_array()) {
my ($account_id, $playername ) = @row;
quest::gmsay (" Account ID: ".$account_id." --- Name: ".$playername."", 11, 1);
}
$sth->finish();
$dbh->disconnect();
quest::gmsay ("-----------------------------------------------------------------------------------------------", 257, 1);
} else {
quest::gmsay ("-----------------------------------------------------------------------------------------------", 14, 1);
quest::gmsay ("[GM:] New Connection [IP:".ConvertIP($client->GetIP())."]:", 11, 1);
if($uguild_id > 0) {
my $guildname = quest::getguildnamebyid($uguild_id);
quest::gmsay("($ulevel $class) $name ($race) <$guildname> ZONE: $zonesn", 11, 1);
}
else {
quest::gmsay("($ulevel $class) $name ($race) <UNGUILDED> ZONE: $zonesn", 11, 1);
}
quest::gmsay ("Account Name :: [".$client->AccountName()."] --- Status :: [".$status."] --- Client :: [".$clientverhash{$client->GetClientVersionBit()}."]", 11, 1);
quest::gmsay ("-----------------------------------------------------------------------------------------------", 14, 1);
}
}

sub EVENT_DISCOVER_ITEM {
if (!defined $qglobals{"discovereditems"}) {
quest::setglobal("discovereditems",1,5,"F");
}
else {
quest::setglobal("discovereditems",$qglobals{"discovereditems"}+1,5,"F");
}
}

sub EVENT_FORAGE_FAILURE {
if (!defined $qglobals{"foragefails"}) {
quest::setglobal("foragefails",1,5,"F");
}
else {
quest::setglobal("foragefails",$qglobals{"foragefails"}+1,5,"F");
}
}

sub EVENT_FORAGE_SUCCESS {
if (!defined $qglobals{"foragesuccesses"}) {
quest::setglobal("foragesuccesses",1,5,"F");
}
else {
quest::setglobal("foragesuccesses",$qglobals{"foragesuccesses"}+1,5,"F");
}
}

sub EVENT_DUEL_LOSE {
if (!defined $qglobals{"duelslost"}) {
quest::setglobal("duelslost",1,5,"F");
}
else {
quest::setglobal("duelslost",$qglobals{"duelslost"}+1,5,"F");
}
}

sub EVENT_DUEL_WIN {
if (!defined $qglobals{"duelswon"}) {
quest::setglobal("duelswon",1,5,"F");
}
else {
quest::setglobal("duelswon",$qglobals{"duelswon"}+1,5,"F");
}
}

sub EVENT_COMBINE_SUCCESS {
if (!defined $qglobals{"tscombines"}) {
quest::setglobal("tscombines",1,5,"F");
}
else {
quest::setglobal("tscombines",$qglobals{"tscombines"}+1,5,"F");
}
}

sub EVENT_COMBINE_FAILURE {
if (!defined $qglobals{"tsfailures"}) {
quest::setglobal("tsfailures",1,5,"F");
}
else {
quest::setglobal("tfailures",$qglobals{"tsfailures"}+1,5,"F");
}
}

sub EVENT_LOOT {
if (!defined $qglobals{"looteditems"}) {
quest::setglobal("looteditems",1,5,"F");
}
else {
quest::setglobal("looteditems",$qglobals{"looteditems"}+1,5,"F");
}
}

sub EVENT_TRADE {
if (!defined $qglobals{"tradeditems"}) {
quest::setglobal("tradeditems",1,5,"F");
}
else {
quest::setglobal("tradeditems",$qglobals{"tradeditems"}+1,5,"F");
}
}

sub EVENT_SIGNAL {
if ($signal == 50) {
if (not $client->GetGM()) {
my $presummonzone = $qglobals{"presummonreturnzone"};
my $presummonx = $qglobals{"presummonreturnx"};
my $presummony = $qglobals{"presummonreturny"};
my $presummonz = $qglobals{"presummonreturnz"};
my $presummonh = $qglobals{"presummonreturnh"};
$client->MovePC($presummonzone, $presummonx, $presummony, $presummonz, $presummonh);
}
}
}

sub EVENT_DEATH_COMPLETE {
# PVP Death
if ($entity_list->GetMobByID($killer_id) && $entity_list->GetMobByID($killer_id)->IsClient()) {
if (!defined $qglobals{"pvpdeaths"}) {
quest::setglobal("pvpdeaths",1,5,"F");
}
else {
quest::setglobal("pvpdeaths",$qglobals{"pvpdeaths"}+1,5,"F");
}
}
else {
if (!defined $qglobals{"deaths"}) {
quest::setglobal("deaths",1,5,"F");
} else {
quest::setglobal("deaths",$qglobals{"deaths"}+1,5,"F");
}
}
}

sub EVENT_CLICKDOOR {
## if($status >= $MINACCESSLEVELFORGMSTUFF){
## plugin::Doors_Manipulation_EVENT_CLICKDOOR();
## }
}

sub ConvertIP {
my $longip = $_[0];
$firstoctet = $longip % 256;
$longip -= $firstoctet;
$longip /= 256;
$secondoctet = $longip % 256;
$longip -= $secondoctet;
$longip /= 256;
$thirdoctet = $longip % 256;
$longip -= $thirdoctet;
$longip /= 256;
my $convertedip = "$firstoctet.$secondoctet.$thirdoctet.$longip";
return $convertedip;
}




Below is needed for the summoning/returning (which I -believe- was working).

/quests/global/zone_controller.pl

sub EVENT_SIGNAL {
####### #summonall command
if ($signal == 14000) {
my @clientlist = $entity_list->GetClientList();
foreach $singleclient (@clientlist) {
if (not $singleclient->GetGM()) {
$singleclient->SetGlobal("presummonreturnzone",$singleclient->GetZoneID(),5,"F");
$singleclient->SetGlobal("presummonreturnx",(int($singleclient->GetX() * 100) / 100),5,"F");
$singleclient->SetGlobal("presummonreturny",(int($singleclient->GetY() * 100) / 100),5,"F");
$singleclient->SetGlobal("presummonreturnz",(int($singleclient->GetZ() * 100) / 100),5,"F");
$singleclient->SetGlobal("presummonreturnh",(int($singleclient->GetHeading() * 100) / 100),5,"F");
my $summonzone = (int(plugin::readglobal("summonallzone") * 100) / 100);
my $summonx = (int(plugin::readglobal("summonallx") * 100) / 100);
my $summony = (int(plugin::readglobal("summonally") * 100) / 100);
my $summonz = (int(plugin::readglobal("summonallz") * 100) / 100);
my $summonh = (int(plugin::readglobal("summonallh") * 100) / 100);
$singleclient->MovePC($summonzone,$summonx,$summony,$summonz,$sum monh);
}
}
}
####### #returnplayers command
elsif ($signal == 15000) {
my @clist = $entity_list->GetClientList();
foreach my $sclient (@clist) {
if (not $sclient->GetGM()) {
$sclient->SignalClient(50);
}
}
}
}


I removed some code (though didnt bother optimizing that code that I left in place), that, I wanted to keep to myself for now. Hopefully I didn't break anything in the process, I only checked the code remaining for syntax.

Maze_EQ
03-15-2017, 10:14 AM
Haha I remember when you wrote this and we had fun with it on NLAIR.