PDA

View Full Version : Random Race


Richardo
12-25-2008, 04:30 AM
I need something but I cannot accomplish it! Basically, I need an npc to spawn. Once he spawns, he/she changes to a random race/gender (Race range is from 1 - 12) (Gender Range 0 - 1). This is what I've got so far.

sub EVENT_SPAWN {
my $randomrace = quest::ChooseRandom(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
my $randomgender = quest::ChooseRandom(0, 1);
quest::npcgender($randomgender);
quest::npcrace($randomrace);

if($randomrace == 4){
quest::npcsize(5);
}
if($randomrace == 3){
quest::npcsize(7);
}
if($randomrace == 7){
quest::npcsize(5);
}
if($randomrace == 6){
quest::npcsize(5);
}
if($randomrace == 11){
quest::npcsize(4);
}
if($randomrace == 8){
quest::npcsize(4);
}
if($randomrace == 12){
quest::npcsize(4);
}
if($randomrace == 10){
quest::npcsize(8);
}
if($randomrace == 9){
quest::npcsize(8);
}
if($randomrace == 2){
quest::npcsize(8);
}
}

Unfortunately for me, this won't work in EVENT_SPAWN. I have to make it a signal revolver. Basically I have an NPC that acts as a signal receiver. Once an npc spawns, it signals the NPC. Upon being signaled, it signals back. As seen below.

sub EVENT_SPAWN {
quest::signal(999371, 0);
}

sub EVENT_SIGNAL {
my $randomrace = quest::ChooseRandom(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
my $randomgender = quest::ChooseRandom(0, 1);
quest::npcgender($randomgender);
quest::npcrace($randomrace);

if($randomrace == 4){
quest::npcsize(5);
}
if($randomrace == 3){
quest::npcsize(7);
}
if($randomrace == 7){
quest::npcsize(5);
}
if($randomrace == 6){
quest::npcsize(5);
}
if($randomrace == 11){
quest::npcsize(4);
}
if($randomrace == 8){
quest::npcsize(4);
}
if($randomrace == 12){
quest::npcsize(4);
}
if($randomrace == 10){
quest::npcsize(8);
}
if($randomrace == 9){
quest::npcsize(8);
}
if($randomrace == 2){
quest::npcsize(8);
}
}

Any ideas? :(

trevius
12-25-2008, 05:39 AM
Ya, it can't work while spawning, because it doesn't have the ID and stuff fully done at that point. But, you can always make a timer and have it run 1 second after it spawns and it will let you do just about anything you want from that point. Lemme know if you need any help with setting up the timer.

Richardo
12-25-2008, 08:43 PM
I have tested the timer idea in the past. It does not work for me. :( Not even this works..

sub EVENT_SPAWN {
quest::settimer("RandRG", 5)
}

sub EVENT_TIMER {
my $randomrace = quest::ChooseRandom(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
my $randomgender = quest::ChooseRandom(0, 1);

if ($timer eq "RandRG") {

quest::npcgender($randomgender);
quest::npcrace($randomrace);
quest::stoptimer("RandRG");
}
}

Also, assuming I could get this to work. I still need to add the code that changes the npc to the correct size. How would I add if + elsif statements in this timer to check the $randomrace variable?

Loccochris
12-25-2008, 09:35 PM
Did you try going into zone, killing an npc and waiting for it to spawn and see what it does?

I personally know currently there is an issue with size where when I multi box unless all my toons are in the zone if one zones in after will have default size viewed for players who were shrunk/big. Strange bug but if this was the case of illusions as well (havn't tested this) code might work but require a respawn while you are actually physically in the zone/near mob. Kind of like that question "If a tree falls in the woods and no one hears it does it make a sound?". Well in EQ shrink/grow spells don't make a sound if no one is in zone to witness it.

Other then this code looks fine to me from programming stand point. Only other thing I can suggest is instead of phsically trying to change its race/size, you could have it immediatly cast an illusion and custom grow/shrink spell on itself.

But like I said, spell wise out of zone players who zone in will not see the size difference.

Richardo
12-25-2008, 09:48 PM
Ahh.. Illusion is a good idea but I dislike the idea about 'casting'. There has to be a different way to go about things. Size is kept when players zone in. They see the correct size + changed race. Trevius, do you have any ideas mate?

trevius
12-26-2008, 11:16 AM
Here is an example of a quest that I currently use and know that it works:

#Explosive Storm

my $entity_id;

sub EVENT_SPAWN {

quest::settimer("change_storm1",5);

}

sub EVENT_TIMER {

if ($timer eq "change_storm1") {
quest::stoptimer("change_storm1");
quest::npctexture(2);
quest::emote("gains more energy and becomes less stable.");
quest::settimer("change_storm2",5); }

if ($timer eq "change_storm2") {
quest::stoptimer("change_storm2");
quest::npctexture(1);
quest::emote("gains even more energy and looks extremely dangerous.");
quest::settimer("change_storm3",5); }

if ($timer eq "change_storm3") {
quest::stoptimer("change_storm3");
$npc->CastSpell(7758, $userid);
quest::emote("explodes and disperses.");
quest::depop(); }

}

I am not sure you can change multiple size/gender/race all at the same time without issues, but I imagine something like this might work:

my $randomrace = quest::ChooseRandom(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
my $randomgender = quest::ChooseRandom(0, 1);

sub EVENT_SPAWN {
quest::settimer("RandRace", 1)
}

sub EVENT_TIMER {

my $raceset = $randomrace;

if ($timer eq "RandRace") {
quest::stoptimer("RandRace");
quest::npcrace($raceset);
quest::settimer("RandGender", 1)
}

if ($timer eq "RandGender") {
quest::stoptimer("RandGender");
quest::npcgender($randomgender);
quest::settimer("SetRaceSize", 1)
}

if ($timer eq "SetRaceSize") {
quest::stoptimer("SetRaceSize");
if($raceset == 4){
quest::npcsize(5);
}
if($raceset == 3){
quest::npcsize(7);
}
if($raceset == 7){
quest::npcsize(5);
}
if($raceset == 6){
quest::npcsize(5);
}
if($raceset == 11){
quest::npcsize(4);
}
if($raceset == 8){
quest::npcsize(4);
}
if($raceset == 12){
quest::npcsize(4);
}
if($raceset == 10){
quest::npcsize(8);
}
if($raceset == 9){
quest::npcsize(8);
}
if($raceset == 2){
quest::npcsize(8);
}

}

}

I don't know if that will work or not, but maybe something like that.

Here is another example I use with random Race changing:

sub EVENT_ITEM {

if($platinum == 100) {
quest::say("H-h-h-happy Trick or T-t-treating!");
quest::playerrace(quest::ChooseRandom(14,46,60,82, 85)); }

if($platinum == 500) {
quest::say("Yar! H-h-h-happy Trick or T-t-treating!");
my $hgender = $client->GetBaseGender();
quest::playerrace(quest::ChooseRandom(338,339,340, 341,342));
quest::playergender($hgender); }

}

You can also look at the Illusionist quest I have posted in the Custom section, but those are all for changing player race and genders.