PDA

View Full Version : Pet Naming Script


zerjz3
03-12-2016, 05:04 PM
Would anyone happen to have a pet renaming script they could share? Looking for a way to let players rename their summoned pets.

Tabasco
03-12-2016, 09:44 PM
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.


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.


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.");
}
}

Shin Noir
03-12-2016, 10:50 PM
Doesn't stay after zoning I assume, nor does it retain after relogging, right?

Kingly_Krab
03-13-2016, 06:14 AM
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.

zerjz3
03-13-2016, 02:49 PM
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

ghanja
03-13-2016, 06:04 PM
Heading out the door, so untested to say the least:

makecustompetnamestable.sql

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)

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)

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

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.

Kingly_Krab
03-13-2016, 08:54 PM
Untested, but try this.

global_player.pl: 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: 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);
}
}

Akkadius
03-13-2016, 09:25 PM
Someone should just implement this in the source, it would be super simple.

#command, save to DB, make it a rule based feature

Coenxai
03-19-2016, 05:37 PM
This is my old pet naming code. I can post the rest of it if anyone even cares.

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);
}
}