PDA

View Full Version : Guild Hall instance quest


bergalas
08-27-2009, 03:07 PM
I have no idea if this will work or not i have not tested it as of yet, if anyone sees problems or what not please feel free to post fixes, I am not that great with perl. Anyway without further adeu here is the script basicly an npc translocation type deal

sub EVENT_SAY {
if ($text =~/Hail/i && $uguild_id > 0){
quest::say ("Good day to you, $name. Are you [ready] to enter your guild hall?"); }
if ($text =~/ready/i){
quest::say ("Excellent");
$inst1 = quest::GetInstanceID("guildhall", $uguild_id);
if( $inst1 < 1){
quest::CreateInstance("guildhall", $uguild_id, -1);
}
$inst2 = quest::GetInstanceID("guildhall", $uguild_id)
quest::AssignToInstance($inst2)
quest::MovePCInstance(345, $inst2, 0, 0, 0);
}
}

Shadow-Wolf
08-28-2009, 10:15 PM
Doesn't really work, something to do with the way instances are created IDK.


sub EVENT_SAY
{
if (($text =~/Guild/i) && ($uguild_id > 0))
{
quest::say("Just a moment...");
$instGuild = quest::GetInstanceID("guildhall", $uguild_id);
if($instGuild < 1)
{
quest::say("creating instance and sending you");
$instGuild = quest::CreateInstance("guildhall", $uguild_id, -1);
quest::AssignToInstance($instGuild);
quest::MovePCInstance(345, $instGuild, 0, 0, 0);
}
else
{
quest::say("sending to existing instance");
quest::AssignToInstance($instGuild);
quest::MovePCInstance(345, $instGuild, 0, 0, 0);
}
}

}


Redid it a little, it only allows the first player to get in. After that I don't know why but it ignores the check to see if the instance already exists and creates a second one anyways. Really frustrating....

chroniclesofnorrath
08-30-2009, 07:23 AM
I messed around with this script for a little while this evening and came up with a version, that I think will work, seems to atleast.

Give this a try:

sub EVENT_SAY
{
if (($text =~/Guild/i) && ($uguild_id > 0))
{
quest::say("Just a moment...");
quest::say(quest::GetInstanceID("guildhall", $uguild_id));
if($uguild_id > 0)
{
$instid = quest::GetInstanceID("guildhall", $uguild_id);
if($instid > 0){
quest::say("sending to existing instance");
quest::AssignToInstance($instid);
quest::MovePCInstance(345, $instid, 0, 0, 0);
}
elsif($instid < 1){
quest::say("sending to New instance");
quest::CreateInstance("guildhall", $uguild_id, 300);
$instid1 = quest::GetInstanceID("guildhall", $uguild_id);
quest::AssignToInstance($instid1);
quest::MovePCInstance(345, $instid1, 0, 0, 0);
}
}
if($uguild_id < 1)
{
quest::say("I am sorry but you are not part of a guild");
}
}

}

Hope this helps. It should be noted that in testing I found that the instances were empty meaning each will have to be spawned manually for each guild. Perhaps one of the developers will come up with a way to spawn the instances from the main spawn table without having them "Versioned" like they are now?

EDIT: I think I may have left some code in there that doesnt need to be, blah it's getting late

pfyon
08-30-2009, 02:22 PM
That's pretty sweet. With some custom zones and some more code, I think we could get player housing going.

Shadow-Wolf
08-30-2009, 10:23 PM
I messed around with this script for a little while this evening and came up with a version, that I think will work, seems to atleast.

Hope this helps. It should be noted that in testing I found that the instances were empty meaning each will have to be spawned manually for each guild. Perhaps one of the developers will come up with a way to spawn the instances from the main spawn table without having them "Versioned" like they are now?

EDIT: I think I may have left some code in there that doesnt need to be, blah it's getting late

Nope still has the same issues as mine, still trys a new instance.

Shadow-Wolf
08-30-2009, 10:35 PM
Sorry to double post but I ran out of time to edit. To me it seems that logically my revision of bergalas' code should work fine but perhaps we are not understanding the way these functions or the instances themselves are supposed to work. If any of the developers could elaborate on this it would be greatly appreciated.

chroniclesofnorrath
08-30-2009, 11:55 PM
I dunno bh I got it leting two players of the same guild into the same instance, it seems to be a bit of a headache. I saw other instancing infomation posted about using the insttype field in the zone table, but that had 0 effect. Was there another instancing system in place at one time? If so can both be enabled at once or is it an either or kind of situation?

What appears to be occuring here is that its not seeing the guild id or something to that effect atleast in the version bit for the zone. Ontop of that it would seem kind of a pain to have to go through and respawn each version of an instance especially for one like the gh? Can we work on a way to have them spawn based on the normal DB Spawns?

realityincarnate
08-30-2009, 11:58 PM
I haven't done a lot of work with instances, but I can see two issues with the way these scripts are working that are stopping them from giving the desired result.

1.) When you call quest::GetInstanceID, it looks for an instance that matches the zonename, version, and character id of the client. This is why it's making a new instance every time: the instance gets created when the first character uses the script, but since that instance isn't assigned to the second character, quest::GetInstanceID doesn't find it and a new one gets created.

2.) It looks like there's a bit of confusion between instance id and version. Versions are designed for use with things like LDoN level variations and monster missions, where the same zone is populated in multiple different ways. What you want to do is create a new instance of the same version of the zone for each guild, not different versions.

Whenever you call quest::CreateInstance, it returns the instance id of the newly created instance. My recommendation would be to track each new id and the guild it was created for through variables in perl. Then, when a player activates the quest, check to see if an id matches his guild. If it does, add the player to that instance id. If it doesn't, create a new one and add that id and guild to the list.

chroniclesofnorrath
08-31-2009, 12:04 AM
That seems a bit beyond my skill level and very complicated for something as simple as an instance based on what guild your in. Could you show how to track them? thus far i have yet to see any kind of loggin or so forth for it. I Was going to do db checks for the instances but i dont grasp how it stores the instance information serverside, or how to check it as you described.

chroniclesofnorrath
08-31-2009, 12:07 AM
I dont suppose there is a way, to assign the id of the instance when created?

Shadow-Wolf
08-31-2009, 12:15 AM
I haven't done a lot of work with instances, but I can see two issues with the way these scripts are working that are stopping them from giving the desired result.

1.) When you call quest::GetInstanceID, it looks for an instance that matches the zonename, version, and character id of the client. This is why it's making a new instance every time: the instance gets created when the first character uses the script, but since that instance isn't assigned to the second character, quest::GetInstanceID doesn't find it and a new one gets created.

2.) It looks like there's a bit of confusion between instance id and version. Versions are designed for use with things like LDoN level variations and monster missions, where the same zone is populated in multiple different ways. What you want to do is create a new instance of the same version of the zone for each guild, not different versions.

Whenever you call quest::CreateInstance, it returns the instance id of the newly created instance. My recommendation would be to track each new id and the guild it was created for through variables in perl. Then, when a player activates the quest, check to see if an id matches his guild. If it does, add the player to that instance id. If it doesn't, create a new one and add that id and guild to the list.

Ok so basically a qglobal with the guilds id as it's name and it's instance id be the way to go?

chroniclesofnorrath
08-31-2009, 12:19 AM
I was just looking at that in the quest tutorial, seems questglobals are character based, not sure if that would work

Andrew80k
08-31-2009, 03:07 PM
qglobals are not necessarily character based. They are pretty generic so you can do much with them. In this case you would simply check when a character clicks the door to the guild hall if an instance exists for their guild. If not, create an instance then populate a qglobal with the zone instanceID in a variable with the guild name as the var name and off you go.

NOTE: You might have to mess with the guild name if the guild name has special characters in it like '. SQL will let you put most stuff in but sometimes you might have to escape it.

I haven't tried this but it shouldn't be too tough.

trevius
08-31-2009, 06:00 PM
Here is a working script for doing this.

sub EVENT_SAY {

if ($text =~/hail/i)
{
quest::say("Let me see...");
if($uguild_id > 0)
{
if (defined($qglobals{"GuildInstance_$uguild_id"}))
{
my $QGlobalValue = $qglobals{"GuildInstance_$uguild_id"};
quest::AssignToInstance($qglobals{"GuildInstance_$uguild_id"});
quest::MovePCInstance(345, $QGlobalValue, 0, 0, 0);
quest::say("Moving you to the instance now");
}
else
{
quest::say("No instance existed, so creating one");
my $instanceID = quest::CreateInstance("guildhall", 0, -1);
quest::AssignToInstance($instanceID);
quest::setglobal("GuildInstance_$uguild_id",$instanceID,7,"M60");
quest::MovePCInstance(345, $instanceID, 0, 0, 0);
quest::say("Moving you to the instance now");
}
}
else
{
quest::say("I am sorry but you are not part of a guild");
}
}


}

Shadow-Wolf
08-31-2009, 10:01 PM
Was about to do it myself but you beat me to the punch, Thank you Trevius

Shadow-Wolf
08-31-2009, 10:33 PM
Well there again I went speaking before confirming, using globals does appear to work with this, it seems it's ignoring the fact that the global exists cause it's still creating new instances.

realityincarnate
08-31-2009, 10:45 PM
Make sure that the npc you're using the script with has qglobals enabled in the database (set qglobal to 1 in the npc_types table).

trevius
08-31-2009, 11:29 PM
Also keep in mind that the script I posted is a complete script for making the guild hall function exactly the way that it should. It is just an example of how to handle creating guild instances in the first place. It would definitely require more work to make it function perfectly in all scenarios. For example; with that script, if you do a server restart, the global will still exist, but the instance will not as far as I know. So, you would need a way to remove the qglobal when the server is restarted or when no one is in the zone anymore.

It wouldn't be too hard to achieve that by using the player.pl to count all players in the zone when they zone out (EVENT_ZONE) and if none are left, have it delete the qglobal. Then, you would just need to also have a way to delete the qglobal after a server restart. You could do that by having a static zone on your server and having one of the spawns in there delete the qglobal in an EVENT_SPAWN. Or, you could just use durations on the qglobals or something like that.

I think probably the easier way would be to add a couple more quest commands for instances such as:

quest::AssignGuildToInstance(instanceid) Assigns a guild to an instance.
quest::IsInstance("zonename", instanceid) Boolean to check if a certain instance exists for a certain zone.

Also, it might not be bad to have an array list of all instances for any particular zone. Even better, might be just to have a way to create instanceIDs as whatever number you want. Then, you could just assign your guild to instanceID of $uguild_id, and then use quest::IsInstance to check if it exists before sending them there or creating a new one.

rizzen
09-03-2009, 10:14 AM
On this script as soon as you hail him he transferes you. I added a little bit to the top just so that it wouldnt instantly transfer if you accidentally hail him/her.

sub EVENT_SAY {

if ($text =~/hail/i)
{
quest::say("Hello $name, would you like to be transfered to your [GuildHall]?");
}

if($text =~/Guildhall/i)
{
quest::say("Let me see...");
if($uguild_id > 0)
{
if (defined($qglobals{"GuildInstance_$uguild_id"}))
{
my $QGlobalValue = $qglobals{"GuildInstance_$uguild_id"};
quest::AssignToInstance($qglobals{"GuildInstance_$uguild_id"});
quest::MovePCInstance(345, $QGlobalValue, 0, 0, 0);
quest::say("Moving you to the instance now");
}
else
{
quest::say("No instance existed, so creating one");
my $instanceID = quest::CreateInstance("guildhall", 0, -1);
quest::AssignToInstance($instanceID);
quest::setglobal("GuildInstance_$uguild_id",$instanceID,7,"M60");
quest::MovePCInstance(345, $instanceID, 0, 0, 0);
quest::say("Moving you to the instance now");
}
}
else
{
quest::say("I am sorry but you are not part of a guild");
}
}


}

Domel
09-16-2009, 05:03 PM
This will make the doors in the Guild Lobby and Guild Hall functional. The global and instance are set for 18 hours.


\quests\guildlobby\player.pl
sub EVENT_CLICKDOOR {
if($doorid == 258 || $doorid == 260) {
if($uguild_id > 0)
{
if (defined($qglobals{"GuildInstance_$uguild_id"}))
{
my $QGlobalValue = $qglobals{"GuildInstance_$uguild_id"};
quest::AssignToInstance($qglobals{"GuildInstance_$uguild_id"});
quest::MovePCInstance(345, $QGlobalValue, 0, 0, 0);
}
else
{
my $instanceID = quest::CreateInstance("guildhall", 0, 64800);
quest::AssignToInstance($instanceID);
quest::setglobal("GuildInstance_$uguild_id",$instanceID,7,"H18");
quest::MovePCInstance(345, $instanceID, 0, 0, 0);
}
}
}
}\quests\guildhall\player.pl
sub EVENT_CLICKDOOR {
if($doorid == 258) {
quest::movepc(344,0,590,0,128);
}
}It could use some tweaking to remove the global on server reset or if the Guild Hall is empty.

Oaric
10-08-2009, 09:56 AM
While were talking about Guild Hall Instances and Guild Lobby zone doors,how about the recruitment boards and the non-fading buffs in guildlobby. I haven't been there in awhile but last time I went it seemed that when you clicked on one of the recruitment boards it would LD you. And Buffs wore off,in Live they actually have the same time the whole time you are in the zone. If you enter with 2 minutes and 5 seconds on a buff,the timer will not start decreasing until after you leave zone. And Ive seen people get the old message boards working on Original EQ projects,so I imagine it won't be to bad to get the recruitment boards workin. Anyone know if these things are still broken? If not I'll shut up lol.

nightsta69
10-08-2009, 10:09 AM
While were talking about Guild Hall Instances and Guild Lobby zone doors,how about the recruitment boards and the non-fading buffs in guildlobby. I haven't been there in awhile but last time I went it seemed that when you clicked on one of the recruitment boards it would LD you. And Buffs wore off,in Live they actually have the same time the whole time you are in the zone. If you enter with 2 minutes and 5 seconds on a buff,the timer will not start decreasing until after you leave zone. And Ive seen people get the old message boards working on Original EQ projects,so I imagine it won't be to bad to get the recruitment boards workin. Anyone know if these things are still broken? If not I'll shut up lol.

as far as I know of, these things still don't work. I made a invis npc to apply a buff, in the little pool area inside the guild hall. but thats about as far I can go coding wise. hopefully with the coming of college, with my major being computer programming, maybe i'll be able to help contribute to this community alot better.

Shin Noir
10-08-2009, 11:23 AM
non-fading buffs is probably easiest done with a source modification when it does tic update event, have a condition to check for the zone and don't decrease timers if the zone matches. There are some spells that were excempt from this status though, would likely need a list of those.

I know, so helpful, I was going to look but busy with some other stuff. :)

Akkadius
02-03-2010, 02:59 AM
Removing Tic calculation based on the zone ID under a table would be definitely cool, especially for those who'd like them in their own hub zones.