Player Teleporter Scripts¶
Below is an example of a quest script for an NPC that can teleport your players. Ths scripts would go in your quest scripts directory, and would be named appropriately based on the NPC that you will create to transport your players.
Old World Porter¶
This script will name translocate targets and teleport your player based on the target of their choosing.
sub EVENT_SAY {
if ($text =~ /Hail/i) {
quest::say("Hello. $name! I am practicing the arcane art of [" . quest::saylink("teleportation") . "]. Would you like to try teleporting?");
}
elsif ($text =~ /teleportation/i) {
quest::say("I have mastered teleporting adventurers to [" . quest::saylink("Antonica") . "], [" . quest::saylink("Faydwer") . "], and [" . quest::saylink("Odus") . "]. Where would you like to travel?");
}
elsif ($text =~ /Antonica/i) {
quest::say("I have mastered transport to [" . quest::saylink("Nektulos Forest") . "], [" . quest::saylink("The Northern Desert of Ro") . "], [" . quest::saylink("The Northern Plains of Karana") . "], [" . quest::saylink("The Temple of Cazic Thule") . "], [" . quest::saylink("The Western Commonlands") . "]and [" . quest::saylink("The Western Plains of Karana") . "]. Where would you like to go?");
}
elsif ($text =~ /Faydwer/i) {
quest::say("I have mastered transport to [" . quest::saylink("The Greater Faydark") . "]. Where would you like to go?");
}
elsif ($text =~ /Odus/i) {
quest::say("I have mastered transport to [" . quest::saylink("Toxxulia Forest") . "]. Where would you like to go?");
}
elsif ($text =~ /Nektulos Forest/i) {
quest::say("Begone!");
$npc->CastSpell(1371, $userid);
}
elsif ($text =~ /The Northern Desert of Ro/i) {
quest::say("Begone!");
$npc->CastSpell(1373, $userid);
}
elsif ($text =~ /The Northern Plains of Karana/i) {
quest::say("Begone!");
$npc->CastSpell(1338, $userid);
}
elsif ($text =~ /The Temple of Cazic Thule/i) {
quest::say("Begone!");
$npc->CastSpell(1375, $userid);
}
elsif ($text =~ /The Western Commonlands/i) {
quest::say("Begone!");
$npc->CastSpell(1372, $userid);
}
elsif ($text =~ /The Western Plains of Karana/i) {
quest::say("Begone!");
$npc->CastSpell(1374, $userid);
}
elsif ($text =~ /The Greater Faydark/i) {
quest::say("Begone!");
$npc->CastSpell(1336, $userid);
}
elsif ($text =~ /Toxxulia Forest/i) {
quest::say("Begone!");
$npc->CastSpell(1337, $userid);
}
}
sub EVENT_ITEM {
#:: Return unused items
plugin::returnUnusedItems();
}
Instance Teleporter¶
This quest script is an example of a teleporter script that allows you to port to a specific instance of a zone.
Info
Be sure to read up on Using Data Buckets
#:: Create a scalar variable to store the cost of instance deletion - 1,000,000 copper pieces (1,000pp)
my $cost = 1000000;
#:: Create a scalar variable to store an Instance ID
my $InstanceID = 0;
#:: Create an array to store zone data information
my @Data = undef;
#:: Create an array of zones enabled for instancing and transport
my @ZoneArray =
(
"Permafrost",
"Nagafen's Lair"
);
sub EVENT_SAY {
my $NPCName = $npc->GetCleanName();
if ($text=~/hail/i) {
#:: Key a data bucket to protect functions
$key = $NPCName . "-current-name";
#:: Match if the key exists
if (quest::get_data($key)) {
#:: Match if the person talking is the focus of our attention
if (quest::get_data($key) eq "$name") {
$client->Message(315, "$NPCName says, 'Hello, $name. Are you interested in a [" . quest::saylink("teleport") . "]?'");
}
#:: Match if the person talking rudely interrupted
else {
$Name = quest::get_data($key);
quest::say("I am sorry, $name, but I was right in the middle of speaking with " . $Name . ". Is " . $Name . " [" . quest::saylink("gone") . "]?");
}
}
else {
#:: Set the data bucket
quest::set_data($key, $name);
$client->Message(315, "$NPCName says, 'Hello, $name. Are you interested in a [" . quest::saylink("teleport") . "]?'");
}
}
elsif ($text=~/gone/i) {
#:: Key a data bucket to protect functions
$key = $NPCName . "-cool-down";
#:: Match if the key exists
if (quest::get_data($key)) {
quest::say("Give me a minute, $name. I seem to keep losing people.");
}
else {
#:: Protect gone from switching for 60 seconds
quest::set_data($key, 1, 60);
#:: Key a data bucket to protect functions
$key = $NPCName . "-current-name";
#:: Set the data bucket
quest::set_data($key, $name);
$client->Message(315, "$NPCName says, 'Well then, $name...are you interested in a [" . quest::saylink("teleport") . "]?'");
}
}
elsif ($text=~/teleport/i) {
#:: Key a data bucket to protect functions
$key = $NPCName . "-current-name";
#:: Match if the person talking is the focus of our attention
if (quest::get_data($key) eq "$name") {
#:: Speak the elements of the zone array
my $count = 1;
my $n = 0;
while ($ZoneArray[$n]) {
if ($ZoneArray[$n]) {
my $ZoneName = quest::saylink($ZoneArray[$n]);
$client->Message(315, "$NPCName says, 'Would you like to go to $ZoneName?'");
}
$n++;
$count++;
}
}
#:: Match if the person talking rudely interrupted
else {
$Name = quest::get_data($key);
quest::say("I am sorry, $name, but I was right in the middle of speaking with " . $Name . ". Is " . $Name . " [" . quest::saylink("gone") . "]?");
}
}
elsif ($text=~/\bPermafrost\b/i) {
#:: Key a data bucket to protect functions
$key = $NPCName . "-current-name";
#:: Match if the person talking is the focus of our attention
if (quest::get_data($key) eq "$name") {
@Data = undef;
@Data = ("permafrost", 73, 61.00, -121.00, 3.75);
#:: Key a data bucket to check the player's existing zone instance setting
$key = $client->CharacterID() . "-active-instance-zone";
#:: Match if the data bucket does not exist
if (!quest::get_data($key)) {
#:: Set a data bucket to track player zone instance
quest::set_data($key, "$Data[0]", 86400);
#:: Create the Instance of that zone and store the ID in a scalar variable
$InstanceID = quest::CreateInstance("$Data[0]", 0, 86400);
#:: Key a data bucket to track the player's instance ID
$key = $client->CharacterID() . "-active-instance-id";
#:: Set a data bucket to track player's instance ID
quest::set_data($key, $InstanceID, 86400);
$client->Message(315, "$NPCName says, 'Alright, $name. Please tell me when you are ready to [" . quest::saylink("go") . "].'");
}
#:: Match if the data bucket exists for this zone shortname
elsif (quest::get_data($key) eq "$Data[0]") {
#:: Key a data bucket to pull the instance ID
$key = $client->CharacterID() . "-active-instance-id";
#:: Update the scalar variable
$InstanceID = quest::get_data($key);
$client->Message(315, "$NPCName says, 'Alright, $name. Please tell me when you are ready to [" . quest::saylink("go") . "].'");
}
#:: Match if the data bucket exists but is set to a different zone
else {
$CharInstance = quest::get_data($key);
$client->Message(315, "$NPCName says, 'Sorry $name, but it looks like you already have an instance for" . $CharInstance . ". Would you like to [" . quest::saylink("delete") . "] it for" . $cost / 1000 . " platinum pieces?'");
}
}
#:: Match if the person talking rudely interrupted
else {
$Name = quest::get_data($key);
quest::say("I am sorry, $name, but I was right in the middle of speaking with " . $Name . ". Is " . $Name . " [" . quest::saylink("gone") . "]?");
}
}
elsif ($text=~/\bNagafen's Lair\b/i) {
#:: Key a data bucket to protect functions
$key = $NPCName . "-current-name";
#:: Match if the person talking is the focus of our attention
if (quest::get_data($key) eq "$name") {
@Data = undef;
@Data = ("soldungb", 32, -263, 424, -108);
#:: Key a data bucket to check the player's existing zone instance setting
$key = $client->CharacterID() . "-active-instance-zone";
#:: Match if the data bucket does not exist
if (!quest::get_data($key)) {
#:: Set a data bucket to track player zone instance
quest::set_data($key, "$Data[0]", 86400);
#:: Create the Instance of that zone and store the ID in a scalar variable
$InstanceID = quest::CreateInstance("$Data[0]", 0, 86400);
#:: Key a data bucket to track the player's instance ID
$key = $client->CharacterID() . "-active-instance-id";
#:: Set a data bucket to track player's instance ID
quest::set_data($key, $InstanceID, 86400);
$client->Message(315, "$NPCName says, 'Alright, $name. Please tell me when you are ready to [" . quest::saylink("go") . "].'");
}
#:: Match if the data bucket exists for this zone shortname
elsif (quest::get_data($key) eq "$Data[0]") {
#:: Key a data bucket to pull the instance ID
$key = $client->CharacterID() . "-active-instance-id";
#:: Update the scalar variable
$InstanceID = quest::get_data($key);
$client->Message(315, "$NPCName says, 'Alright, $name. Please tell me when you are ready to [" . quest::saylink("go") . "].'");
}
#:: Match if the data bucket exists but is set to a different zone
else {
$CharInstance = quest::get_data($key);
$client->Message(315, "$NPCName says, 'Sorry $name, but it looks like you already have an instance for" . $CharInstance . ". Would you like to [" . quest::saylink("delete") . "] it for" . $cost / 1000 . " platinum pieces?'");
}
}
#:: Match if the person talking rudely interrupted
else {
$Name = quest::get_data($key);
quest::say("I am sorry, $name, but I was right in the middle of speaking with " . $Name . ". Is " . $Name . " [" . quest::saylink("gone") . "]?");
}
}
elsif ($text=~/go/i) {
#:: Key a data bucket to protect functions
$key = $NPCName . "-current-name";
#:: Match if the person talking is the focus of our attention
if (quest::get_data($key) eq "$name") {
#:: Key a data bucket to check for existing instances
$key = $client->CharacterID() . "-active-instance-zone";
#:: Match if the data bucket exists and matches zone data
if (quest::get_data($key) eq "$Data[0]") {
DoTeleport();
}
else {
$client->Message(315, "$NPCName says, 'I am sorry, $name...I seem to have lost my train of thought. Where did you want to go again?");
#:: Speak the elements of the zone array
my $count = 1;
my $n = 0;
while ($ZoneArray[$n]) {
if ($ZoneArray[$n]) {
my $ZoneName = quest::saylink($ZoneArray[$n]);
$client->Message(315, "$NPCName says, 'Would you like to go to $ZoneName?'");
}
$n++;
$count++;
}
}
}
#:: Match if the person talking rudely interrupted
else {
$Name = quest::get_data($key);
quest::say("I am sorry, $name, but I was right in the middle of speaking with " . $Name . ". Is " . $Name . " [" . quest::saylink("gone") . "]?");
}
}
elsif ($text=~/delete/i) {
#:: Key a data bucket to protect functions
$key = $NPCName . "-current-name";
#:: Match if the person talking is the focus of our attention
if (quest::get_data($key) eq "$name") {
#:: Create a scalar variable to store total money on the player who triggered the event
my $total = $client->GetCarriedMoney();
#:: Match if the player who triggered the event has the same or more coin than the reset costs
if ($total >= $cost) {
#:: Key a data bucket to check for existing instances by zone
$key = $client->CharacterID() . "-active-instance-zone";
#:: Match if the data bucket exists
if (quest::get_data($key)) {
#:: Destroy the data bucket
quest::delete_data($key);
#:: Key a data bucket to check for existing instances by ID
$key = $client->CharacterID() . "-active-instance-id";
#:: Match if the data bucket exists
if (quest::get_data($key)) {
#:: Destroy the data bucket just to be tidy
quest::delete_data($key);
}
#:: Take the coins and update the client
$client->TakeMoneyFromPP($cost, 1);
$client->Message(315, "$NPCName says, 'Easy come, easy go, right $name? You are now free to [" . quest::saylink("teleport") . "] wherever you would like to go.'");
}
else {
$client->Message(315, "$NPCName says, 'You have no instances, $name. You are free to [" . quest::saylink("teleport") . "] wherever you would like to go.'");
}
}
else {
$client->Message(315, "$NPCName says, 'Sorry, $name, but you do not have the coins required to reset an instance.'");
}
}
#:: Match if the person talking rudely interrupted
else {
$Name = quest::get_data($key);
quest::say("I am sorry, $name, but I was right in the middle of speaking with " . $Name . ". Is " . $Name . " [" . quest::saylink("gone") . "]?");
}
}
}
sub EVENT_ITEM {
#:: Return unused items
plugin::returnUnusedItems();
}
sub DoTeleport {
quest::say("Zone: " . $Data[0] . ", Instance ID: $InstanceID, Zone ID: " . $Data[1] . ", X: " . $Data[2] . ", Y: " . $Data[3] . ", Z: " . $Data[4] . ".");
#:: Assign to an instance
quest::AssignToInstance($InstanceID);
#:: Create a scalar variable to store client Raid information
$raid = $entity_list->GetRaidByClient($client);
#:: Create a scalar variable to store client Group information
$group = $entity_list->GetGroupByClient($client);
#:: Move the client who triggered the event to the specified location
$client->MovePCInstance($Data[1], $InstanceID, $Data[2], $Data[3], $Data[4], 0);
#:: Match if the player is in a Raid
if ($raid) {
#:: Loop through each member of the Raid
for ($count = 0; $count < $raid->RaidCount(); $count++) {
#:: Create a scalar variable to store the Raid's member count
$pc = $raid->GetMember($count);
#:: Match if the Raid member is near the client who triggered the event
if ($pc->CalculateDistance($x,$y,$z) <= 150) {
#:: Assign to the instance
$pc->AssignToInstance($InstanceID);
#:: Move the Raid member to the specified location
$pc->MovePCInstance($Data[1], $InstanceID, $Data[2], $Data[3], $Data[4], 0);
}
}
}
#:: Match if the player is in a Group
elsif ($group) {
#:: Loop through each member of the Group
for ($count = 0; $count < $group->GroupCount(); $count++) {
#:: Create a scalar variable to store the Group's member count
$pc = $group->GetMember($count);
#:: Match if the Group member is near the client who triggered the event
if ($pc->CalculateDistance($x,$y,$z) <= 150) {
#:: Assign to the instance
$pc->AssignToInstance($InstanceID);
#:: Move the Group member to the specified location
$pc->MovePCInstance($Data[1], $InstanceID, $Data[2], $Data[3], $Data[4], 0);
}
}
}
#:: Key a data bucket to protect functions
$key = $NPCName . "-current-name";
#:: Destroy the data bucket
quest::delete_data($key);
}