Go Back   EQEmulator Home > EQEmulator Forums > Quests > Quests::Q&A

Quests::Q&A This is the quest support section

Reply
 
Thread Tools Display Modes
  #1  
Old 03-12-2016, 05:04 PM
zerjz3
Banned
 
Join Date: Aug 2010
Location: Sanctuary
Posts: 269
Default Pet Naming Script

Would anyone happen to have a pet renaming script they could share? Looking for a way to let players rename their summoned pets.
Reply With Quote
  #2  
Old 03-12-2016, 09:44 PM
Tabasco's Avatar
Tabasco
Discordant
 
Join Date: Sep 2009
Posts: 270
Default

This comes from intercepting a command like !petname <name>. I was flowing those through a universal world script at the time so that a player could just type it in chat without needing an NPC receiver, but these days I gather there are more convenient ways to do it.

Code:
    if($text =~/^!petname/i)
    {
        my $pid = $client->GetPetID();
        my $pet = $entity_list->GetMobByID($pid);

        if($pet)
        {
            ($cm, $petname) = split(/\ /, $text, 2);
            $pet->TempName($petname);
            $client->Message(315, "Your pet name has been changed.");
            $client->Message(315, "This is a family friendly server.  Please be considerate when choosing a pet name.");
        }
    }
While we're at this, I also see I had a pet size function.

Code:
    if($text =~/^!petsize/i)
    {
	my $pid = $client->GetPetID();
        my $pet = $entity_list->GetMobByID($pid);
        if($pet)
        {
  	    my $cursize = $pet->GetSize();
            ($cm, $petsize) = split(/\ /, $text, 2);
			if ($petsize > 9)
			{
				$petsize = 9;  ## Not abnormally large
			}
			if ($petsize < 1)
			{
				$petsize = 1;  ## Not abnormally small
			}
			$newsize = $petsize - $cursize;
            $pet->ChangeSize($petsize);
            $client->Message(315, "Your pet's size has been changed.");
            $client->Message(315, "Please do not abuse this function.  Extremely large pets can lag the zone and cause issues for other people.");
        }
    }
__________________
http://dungeoncrawl.us.to
Reply With Quote
  #3  
Old 03-12-2016, 10:50 PM
Shin Noir's Avatar
Shin Noir
Legendary Member
 
Join Date: Apr 2002
Location: Seattle, WA
Posts: 502
Default

Doesn't stay after zoning I assume, nor does it retain after relogging, right?
__________________

~Shin Noir
DungeonEQ.com
Reply With Quote
  #4  
Old 03-13-2016, 06:14 AM
Kingly_Krab
Administrator
 
Join Date: May 2013
Location: United States
Posts: 1,589
Default

You could just use a permanent quest global with a custom #-based Perl command. Don't have time to write an example right now, but if I get some time and you don't have it done I'll write it up for you.
Reply With Quote
  #5  
Old 03-13-2016, 02:49 PM
zerjz3
Banned
 
Join Date: Aug 2010
Location: Sanctuary
Posts: 269
Default

That sounds like a really cool way of doing it, Kingly. Right now I'm using a temporary naming script but your way sounds much nicer. If you get the chance, I would love to see what you come up with
Reply With Quote
  #6  
Old 03-13-2016, 06:04 PM
ghanja's Avatar
ghanja
Dragon
 
Join Date: Aug 2012
Location: Hershey, PA
Posts: 499
Default

Heading out the door, so untested to say the least:

makecustompetnamestable.sql
Code:
DROP TABLE IF EXISTS `custom_petnames`;
CREATE TABLE `custom_petnames` (
  `charid` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`charid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
/quests/default.pl (insert into existing)
Code:
sub EVENT_SPAWN {
	if (!$npc || $npc->GetSwarmOwner()) {
		if ($npc->GetOwnerID()) {
			if (defined plugin::FindPetName($npc->GetOwnerID())) {
				$npc->TempName(plugin::FindPetName($npc->GetOwnerID()));
			}
		}
	}
}
/quests/global/global_player.pl (insert into existing, working off of Tabasco's original code)
Code:
sub EVENT_SAY {
    if($text =~/^!petname/i) {
        my $pid = $client->GetPetID();
        my $pet = $entity_list->GetMobByID($pid);
        if($pet) {
            ($cm, $petname) = split(/\ /, $text, 2);
            if ($petname =~ m/[^a-zA-Z]/){
				$pet->TempName($petname);
				if (plugin::FindPetName($charid) != $petname) {
					plugin::EnterPetName($charid,$petname)
				}
			$client->Message(315, "Your pet name has been changed.");
            $client->Message(315, "This is a family friendly server.  Please be considerate when choosing a pet name.");
			}
        }
    }
}
/plugins/custompetnames.pl
Code:
sub EnterPetName {
	my $dbh = plugin::MySQL_Connect();
	$dbh->do("DELETE FROM `custom_petnames` WHERE `charid` = '$_[0]'");
	$sth = $dbh->prepare("INSERT INTO `custom_petnames` (`charid`, `petname`) VALUES (?, ?)");
	$sth->execute($_[0], $_[1]);
	$sth->finish();
	$dbh->disconnect();
}

sub FindPetName {
	my $entered_charid = $_[0];
	my $dbh = plugin::MySQL_Connect();
	my $sth = $dbh->prepare("SELECT `petname` FROM `custom_petnames` WHERE `charid` = '".$entered_charid."' LIMIT 1;");
	$sth->execute();
	@data = $sth->fetchrow_array();
	$sth->finish();
	$dbh->disconnect();
	if ($data[0] == NULL) {
		return NULL;
	} else {
		return ($data[0]);
	}
}
May or may not work, untested and far from a master coder of things. But had 10 minutes before I had to leave out, it may help someone out. I'm very interested to see what Kingly draws up. *Thank you Kingly, I never bothered looking at the source to see qglobal value was const *char anymore (just sorta went by the way I knew them to be -- reading the changeme = a good thing), well then. My way is superfluous in that case.
Reply With Quote
  #7  
Old 03-13-2016, 08:54 PM
Kingly_Krab
Administrator
 
Join Date: May 2013
Location: United States
Posts: 1,589
Default

Untested, but try this.

global_player.pl:
Code:
sub EVENT_SAY {
    if ($text=~/#Rename/i) {
        if ($client->GetTarget() && $client->GetTarget()->IsNPC() && $client->GetTarget()->CastToNPC()->GetOwnerID() == $userid) {
            quest::setglobal("PetName", substr($text, 8, 64), 5, "F");
            $client->GetTarget()->TempName(substr($text, 8, 64));
            $client->Message(315, "Your pet's name is now set to " . substr($text, 8, 64) . ", upon respawning your pet will instantly be renamed from now on.");
        } else {
            $client->Message(315, "You must target your pet first.");
        }
    }
}

sub EVENT_SIGNAL {
    if ($signal == 2) {
        if (defined $qglobals{"NewName"} && length($qglobals{"NewName"}) > 0) {
            $entity_list->GetMobByID($client->GetPetID())->TempName($qglobals{"TempName"});
            $client->Message(315, "Your pet has been instantly renamed to '" . $qglobals{"TempName"} . "'.");
        }
    }
}
global_npc.pl:
Code:
sub EVENT_SPAWN {
    if ($npc->GetOwnerID() > 0 && $entity_list->GetMobByID($npc->GetOwnerID())->IsClient()) {
        quest::settimer("Rename", 5);
    }
}

sub EVENT_TIMER {
    if ($timer eq "Rename") {
        quest::stoptimer("Rename");
        $entity_list->GetClientByID($npc->GetOwnerID())->SignalClient(2);
    }
}
Reply With Quote
  #8  
Old 03-13-2016, 09:25 PM
Akkadius's Avatar
Akkadius
Administrator
 
Join Date: Feb 2009
Location: MN
Posts: 2,071
Default

Someone should just implement this in the source, it would be super simple.

#command, save to DB, make it a rule based feature
Reply With Quote
  #9  
Old 03-19-2016, 05:37 PM
Coenxai's Avatar
Coenxai
Hill Giant
 
Join Date: Dec 2013
Posts: 151
Default

This is my old pet naming code. I can post the rest of it if anyone even cares.

Code:
void command_petname(Client *c, const Seperator *sep) {
	uint32 t = c->GetPTimers().GetRemainingTime(pTimerAntiQuery);
	if (!c->GetPTimers().Expired(&database, pTimerAntiQuery, false)) {
		c->Message(13, "You must wait (%is) before renaming your pet.", t);
		return;
	}

	int MAX_PET_NAME = 12;
	int MIN_PET_NAME = 3;

	if (sep->arg[1][0] == 0) {
		c->Message(15, "Clearing current pet name.");
		std::string query = StringFormat("REPLACE INTO `pets_custom_name` VALUES (%i, '')", c->CharacterID());
		auto results = database.QueryDatabase(query);
		c->GetPTimers().Start(pTimerAntiQuery, 30);
		return;
	}

	for (int i = 0; i < MAX_PET_NAME; i++) {
		if (sep->arg[1][i] == NULL) {
			break;
		}
		if (!isalpha(sep->arg[1][i])) {
			c->Message(13, "Pet names must only contain letters of the alphabet.");
			return;
		}
		if (isupper(sep->arg[1][i])) {
			sep->arg[1][i] = tolower(sep->arg[1][i]);
		}
	}

	if (strlen(sep->arg[1]) >= MAX_PET_NAME) {
		c->Message(13, "The pet name you've entered is too long. (Maximum: %i)", MAX_PET_NAME);
	}
	else if (strlen(sep->arg[1]) < MIN_PET_NAME && strlen(sep->arg[1]) > 0) {
		c->Message(13, "The pet name you've entered is too short. (Minimum: %i)", MIN_PET_NAME);
	}
	else {
		sep->arg[1][0] = toupper(sep->arg[1][0]);
		c->Message(15, "Your new pet will now be named: %s", sep->arg[1]);
		std::string query = StringFormat("REPLACE INTO `pets_custom_name` VALUES (%i, '%s')", c->CharacterID(), sep->arg[1]);
		auto results = database.QueryDatabase(query);
		c->GetPTimers().Start(pTimerAntiQuery, 30);
	}
}
__________________
"The true sign of intelligence is not knowledge but imagination."
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 05:09 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