|
|
 |
 |
 |
 |
|
 |
 |
|
 |
 |
|
 |
|
 |
|
 |

09-21-2008, 02:34 PM
|
 |
The PEQ Dude
|
|
Join Date: Apr 2003
Location: -
Posts: 1,988
|
|
I haven't had a lot of time to play with this, but it looks like the group and raid types crash the zone when used. This happens whether you are in a group/raid or not. Here is the output:
Code:
#0 0x08155ec3 in Database::setGroupInstFlagNum (this=0x836ac24, charID=22,
orgZoneID=223) at /usr/include/stdlib.h:336
#1 0x08248eee in QuestManager::setinstflag (this=0x836a920, charID=1,
orgZoneID=0, type=1) at questmgr.cpp:1572
#2 0x08250883 in XS__setinstflag (my_perl=0x83c6f20, cv=0x8430954)
at perlparser.cpp:2174
#3 0xb79d22dd in Perl_pp_entersub () from /usr/lib/libperl.so.5.8
#4 0xb79d0a8f in Perl_runops_standard () from /usr/lib/libperl.so.5.8
#5 0xb797108e in ?? () from /usr/lib/libperl.so.5.8
#6 0x083c6f20 in ?? ()
#7 0xb7a4f14e in ?? () from /usr/lib/libperl.so.5.8
#8 0x00000000 in ?? ()
Your line numbers will probably differ from mine, so if something doesn't line up, just ask. I can tell you though that questmgr.cpp:1572 is database.setGroupInstFlagNum(charID, orgZoneID);
in my source. The raid dump is the same, just with the raid code. If you want that, just let me know.
Another small problem, /goto doesn't seem to work in instances. The red text pops telling you who you're going to, but you don't actually move. This may be unrelated to your code, but /goto does indeed work in normal zones.
The single player function works perfectly, and the instances themselves from what I can tell work great as well. I had a couple of toons in two instances of the same zone, and the spawns and quests worked great in each instance. No overlapping at all. Very impressive.
Now some suggestions, since your system forces instances to be dynamic (static versions of the zone are ignored, and can only be accessed by players without an instance flag) is there anyway that you can add a rule that will allow server ops to keep the instances open for a certain amount of time after the last player left it? If the op sets the rule to 10 minutes, then the zone stays open for 10 minutes after it became empty of players.
Also, could raid type 2 be changed to flag group members as well? The idea behind this is so we could just set everything to type 2. If a group comes along that aren't in a raid, they can get flagged with this single function instead of having an extra elsif in the script to check for non-raid groups.
Can a variable be added to enable Perl to check if a player is already flagged for an instance? Also, can a new Perl function be added that will delete the flags from a player/group/raid (set both columns to 0?)
Finally, I'm not sure how your system handles this, but what happens to players that join a raid/group after they've been flagged? Can it be made so that they inherit those flags?
Last edited by cavedude; 09-21-2008 at 10:42 PM..
|
 |
|
 |
 |
|
 |

09-21-2008, 04:04 PM
|
Hill Giant
|
|
Join Date: Sep 2007
Posts: 117
|
|
I think I figured out where I messed up the group and raid instance flags. Database::setGroupInstFlagNum and Database::setRaidInstFlagNum will need replaced with the ones below.
Can you post, or send me, the quest script you are using to set these? I suck at quest writing so using yours would help me test them.
I like the idea of holding the zone open for a set amount of time. Also, I agree there needs to be ways to check if someone is already flagged, remove the flag, and inherit the flag of the group/raid leader. I also want to add a way to shutdown the zone after a certain amount of time (like ldons).
The only issue I could see with making the type 2 flag raids or groups is some server admins may want to limit how many people can be in the instance. Though I could make a type 3 that flags both.
It might take me a while to figure out why goto is not working in instances. But I will see.
Code:
void Database::setGroupInstFlagNum(int32 charID, int32 orgZoneID)
{
char errbuf[MYSQL_ERRMSG_SIZE];
char *query = 0;
MYSQL_RES *result;
MYSQL_ROW row;
int32 groupid = 0;
int instFlag = getCurInstFlagNum();
int numCharsInGroup = 0; // Used to count number of characters in group
// Find out what group the character is in
if (RunQuery(query, MakeAnyLenString(&query, "SELECT groupid from group_id where charid=%i", charID), errbuf, &result)) {
if (mysql_num_rows(result) == 1) {
row = mysql_fetch_row(result);
groupid=atoi(row[0]);
}
else
printf("Unable to get group id, char not found!\n");
mysql_free_result(result);
}
else
printf("Unable to get group id: %s\n",errbuf);
safe_delete_array(query);
// Find out how many other characters are in the group
if (RunQuery(query, ("SELECT COUNT(charid) FROM group_id WHERE groupid=%i", groupid), errbuf, &result)) {
safe_delete_array(query);
row = mysql_fetch_row(result);
numCharsInGroup = atoi(row[0]);
mysql_free_result(result);
}
// Select the character IDs of the characters in the group
if (RunQuery(query, MakeAnyLenString(&query, "SELECT charid from group_id where groupid='%i'", groupid), errbuf, &result))
{
row = mysql_fetch_row(result);
int i = 0;
// Set each group members instflag
while ((i <= numCharsInGroup))
{
charID = atoi(row[i]);
setCharInstFlag(charID, orgZoneID, instFlag);
i++;
}
safe_delete_array(query);
mysql_free_result(result);
}
// Increment the curInstFlagNum
incrCurInstFlagNum(instFlag);
}
Code:
void Database::setRaidInstFlagNum(int32 charID, int32 orgZoneID)
{
char errbuf[MYSQL_ERRMSG_SIZE];
char *query = 0;
MYSQL_RES *result;
MYSQL_ROW row;
int32 raidid = 0;
int instFlag = getCurInstFlagNum();
int numCharsInRaid = 0; // Used to count number of characters in raid
// Find out what raid the character is in
if (RunQuery(query, MakeAnyLenString(&query, "SELECT raidid from raid_members where charid=%i", charID), errbuf, &result)) {
safe_delete_array(query);
if (mysql_num_rows(result) == 1) {
row = mysql_fetch_row(result);
raidid=atoi(row[0]);
mysql_free_result(result);
}
else
printf("Unable to get raidid, char not found!\n");
mysql_free_result(result);
}
else
printf("Unable to get raid id: %s\n",errbuf);
safe_delete_array(query);
// Find out how many other characters are in the raid
if (RunQuery(query, ("SELECT COUNT(charid) FROM raid_members WHERE raidid=%i", raidid), errbuf, &result)) {
row = mysql_fetch_row(result);
numCharsInRaid = atoi(row[0]);
mysql_free_result(result);
safe_delete_array(query);
}
// Select the character IDs of the characters in the raid
if (RunQuery(query, MakeAnyLenString(&query, "SELECT charid from raid_members where raidid='%i'", raidid), errbuf, &result))
{
int i = 0;
row = mysql_fetch_row(result);
// Set each group members instflag
while ((i <= numCharsInRaid))
{
charID = atoi(row[i]);
setCharInstFlag(charID, orgZoneID, instFlag);
i++;
}
safe_delete_array(query);
mysql_free_result(result);
}
// Increment the curInstFlagNum
incrCurInstFlagNum(instFlag);
}
|
 |
|
 |

09-21-2008, 04:40 PM
|
 |
Developer
|
|
Join Date: Aug 2006
Location: USA
Posts: 5,946
|
|
Actually, why not just make an option to keep all dynamic zones up for X amount of time after the last player leaves? I wouldn't mind having that for my dynamic zones as well 
|

09-24-2008, 02:24 PM
|
 |
The PEQ Dude
|
|
Join Date: Apr 2003
Location: -
Posts: 1,988
|
|
I'm not going to sticky this one yet, I am still getting a zone crash with the newest code regarding the raid and group types. Could you post a diff to make sure I am not merging incorrectly?
|
 |
|
 |

09-25-2008, 03:00 AM
|
Hill Giant
|
|
Join Date: Sep 2007
Posts: 117
|
|
I am fairly certainly you are merging it correctly. I just screwed up the code. Here are two I found this afternoon that need changed. Basically I had ‘%i’ when it should be %i
It is kinda hard to see but the %i is surrounded by two ‘
I will try to post a full diff by this weekend. I would do it sooner but work is killing me this week.
line 31 inside Database::setGroupInstFlagNum
Code:
// Select the character IDs of the characters in the group
if (RunQuery(query, MakeAnyLenString(&query, "SELECT charid from group_id where groupid=%i", groupid), errbuf, &result))
line 33 inside Database::setRaidInstFlagNum
Code:
// Select the character IDs of the characters in the raid
if (RunQuery(query, MakeAnyLenString(&query, "SELECT charid from raid_members where raidid=%i", raidid), errbuf, &result))
One side question though. Please don’t laugh to hard (this is my first time writing a quest) below is what I wrote for a quest to set these instance flags. It does not work. I know the quest::setinstflag($charid,18,0); is causing the problem since the says work. It never sets the flags in the database and just hangs at the setinstflag. I figured out it hangs there by swapping the quest::say and quest::setinstflag places. Any idea where I messed up the script? or is my code that wrong?
Code:
sub EVENT_SAY {
$charid = 0;
$charid = $client->CharacterID();
if($text=~/Hail/i){
quest::say("Greetings traveler, Do you want to go play in Blackburrow?"); }
if($text=~/yes/i){
quest::say("Oh wonderful! Do you want to play by yourself, in a group, or in a raid?"); }
if($text=~/self/i){
quest::say("You can now go play in your own little Blackburrow world.");
quest::setinstflag($charid,17,0); }
if($text=~/group/i){
quest::say("Your party can now go play in their own little Blackburrow world.");
quest::setinstflag($charid,17,1); }
if($text=~/raid/i){
quest::say("Your raid can now go play in their only little Blackburrow world.");
quest::setinstflag($charid,17,2); }
if($text=~/setme/i){
quest::say("Okay then GO PLAY!!!");
quest::setinstflagmanually($charid,17,1500); }
}
|
 |
|
 |

09-25-2008, 10:14 AM
|
Dragon
|
|
Join Date: Feb 2007
Posts: 659
|
|
Your quest script is fine. It's your code that you use to call setinstflag that's messed up. I'd put some debug statements in there and try to figure out where it's giving you grief. I've REALLY been wanting to mess around with this but I'm so limited on time right now....
|

09-25-2008, 01:24 PM
|
 |
Developer
|
|
Join Date: Mar 2003
Posts: 1,498
|
|
Just out of curiosity, why are they int32 variables instead of just int? Could that make a difference when compiling between the different machines? Does it make a difference compiling on the different machines when typecasting an int -> int32?
|
Thread Tools |
|
Display Modes |
Hybrid Mode
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
|
|
|
All times are GMT -4. The time now is 11:29 PM.
|
|
 |
|
 |
|
|
|
 |
|
 |
|
 |