EQEmulator Forums

EQEmulator Forums (https://www.eqemulator.org/forums/index.php)
-   Quests::Q&A (https://www.eqemulator.org/forums/forumdisplay.php?f=599)
-   -   Pet Naming Script (https://www.eqemulator.org/forums/showthread.php?t=40457)

zerjz3 03-12-2016 05:04 PM

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.

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.

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


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
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.

Kingly_Krab 03-13-2016 08:54 PM

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


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.

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



All times are GMT -4. The time now is 08:07 PM.

Powered by vBulletin®, Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.