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

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

09-26-2008, 07:06 PM
|
Hill Giant
|
|
Join Date: Sep 2007
Posts: 117
|
|
Well I got it working. I will try to post a diff tonight or tomorrow. The quest functions got an overhaul.
Quote:
Originally Posted by joligario
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?
|
I think most programming languages view int and int32 as the same thing. However, I took your suggestion and changed most of the int32 to int. Looks better and is easier to read even if it has little to no effect on the code.
|
 |
|
 |

09-26-2008, 07:23 PM
|
Developer
|
|
Join Date: Mar 2007
Location: Ohio
Posts: 648
|
|
Quote:
Originally Posted by joligario
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?
|
To understand int32, we need to look at common/types.h:
Code:
typedef unsigned char int8;
typedef unsigned char byte;
typedef unsigned short int16;
typedef unsigned int int32;
typedef unsigned char uint8;
typedef signed char sint8;
typedef unsigned short uint16;
typedef signed short sint16;
typedef unsigned int uint32;
typedef signed int sint32;
As I understand, int in C++ assumes signed by default on most compilers:
Quote:
By default, if we do not specify either signed or unsigned most compiler settings will assume the type to be signed
|
You can certainly use int for 32-bit signed integers, but by using sint32 instead, you don't have to worry about compiler-specific assumptions, plus it can be easier to understand just browsing through the source.
|
 |
|
 |
 |
|
 |

09-26-2008, 07:44 PM
|
Hill Giant
|
|
Join Date: Sep 2007
Posts: 117
|
|
Thanks AndMetal, I honestly didn’t know which method was preferred. Sorry, I don’t have the energy at the moment to switch the int and int32s around. Though I did learn something and now know in the future.
Here is a diff of all the required code. Hopefully I got it all.
With this the only required manual database entry is setting the zone insttype to 1.
Required SQL
Code:
ALTER TABLE `zone` ADD column `insttype` tinyint (1) zerofill unsigned NOT NULL default '0';
ALTER TABLE character_ ADD column `instZflagNum` int(10) unsigned NOT NULL default '0';
ALTER TABLE character_ ADD column `instZOrgID` int(11) NOT NULL default '0';
INSERT INTO variables VALUES ('curInstFlagNum', 2000, 'Determines what instance flag will be handed out next', '2008-09-05 04:46:47');
INSERT INTO variables VALUES ('dfltInstZflag',1000, 'Used to determine if a zone is instanced, must be 1000 or greater', '2008-09-05 04:46:47');
World\Zoneserver.cpp
Line 498 insert
Code:
ztz->requested_zone_id = database.GetInstZoneID(ztz->requested_zone_id, ztz->name);
Line 508-509 insert
Code:
int server_id;
ztz->requested_zone_id = database.GetInstZoneID(ztz->requested_zone_id, ztz->name);
if ((server_id = zoneserver_list.TriggerBootup(ztz->requested_zone_id)))
World\Zoneserver.cpp
Line 533 insert
Code:
zlog(WORLD__ZONE,"Processing ZTZ for ingress to zone for client %s\n", ztz->name);
ztz->current_zone_id = database.GetInstZoneID(ztz->current_zone_id, ztz->name); //Rocker8956 possible fix for wrong zone shutdown
ZoneServer *egress_server = zoneserver_list.FindByZoneID(ztz->current_zone_id);
World\Client.cpp
Line 644 insert
Code:
zoneID = database.GetInstZoneID(zoneID, GetCharName());
Zone\zoning.cpp
Line 122
Code:
//Checks if the zone can be instanced, character has a instance flag, and
//that the character is not zoning into an instance that is already loaded
if(database.GetInstType(target_zone_id) == 1){
int32 characterID = database.GetCharacterID(zc->char_name);
int32 instFlagNum = database.GetCharInstFlagNum(characterID);
if(instFlagNum >= database.GetDfltInstZFlag())
{
int32 charInstZOrgID = database.GetCharInstZOrgID(characterID);
// If instance flag matches then...
if(charInstZOrgID == target_zone_id)
{
//If instance zone is not in database then it is copied to database
if(!database.InstZoneLoaded(instFlagNum)) {
database.LoadInstZone(target_zone_id, instFlagNum);
}
target_zone_id = instFlagNum;
}
}
}
Common\database.h
Line 201 insert
Code:
int32 GetCharInstFlagNum(int32 charID);
int32 GetCharInstZOrgID(int32 charID);
int32 GetInstZoneID(int32 zoneID, const char* charName);
void DeleteInstZone(int32 instZoneID);
int32 GetDfltInstZFlag();
void setCharInstFlag(int charID, int orgZoneID, int instFlag);
void setGroupInstFlagNum(int charID, int orgZoneID, int instFlag);
void setRaidInstFlagNum(int charID, int orgZoneID, int instFlag);
void incrCurInstFlagNum(int instFlag);
int getCurInstFlagNum();
Common\database.cpp Replace Database::GetZoneName
Around Line 1173
Code:
const char* Database::GetZoneName(int32 zoneID, bool ErrorUnknown) {
if (zonename_array == 0) {
if (ErrorUnknown)
return "UNKNOWN";
else
return 0;
}
if (zoneID > GetDfltInstZFlag())
{
char errbuf[MYSQL_ERRMSG_SIZE];
char *query = 0;
MYSQL_RES *result;
MYSQL_ROW row;
if (RunQuery(query, MakeAnyLenString(&query, "SELECT instZOrgID FROM character_ WHERE instZflagNum=%i", zoneID), errbuf, &result)) {
safe_delete_array(query);
if (mysql_num_rows(result) > 0) {
row = mysql_fetch_row(result);
int8 tmp = atoi(row[0]);
mysql_free_result(result);
return zonename_array[tmp];
}
mysql_free_result(result);
}
else
{
cerr << "Error in instZOrgID query in database.cpp GetZoneName'" << query << "' " << errbuf << endl;
safe_delete_array(query);
}
}
else if (zoneID <= max_zonename) {
if (zonename_array[zoneID])
return zonename_array[zoneID];
else {
if (ErrorUnknown)
return "UNKNOWN";
else
return 0;
}
}
else {
if (ErrorUnknown)
return "UNKNOWN";
else
return 0;
}
}
End of Common\database.cpp insert
Code:
int32 Database::GetDfltInstZFlag(){
char errbuf[MYSQL_ERRMSG_SIZE];
char *query = 0;
MYSQL_RES *result;
MYSQL_ROW row;
if (RunQuery(query, MakeAnyLenString(&query, "SELECT value FROM variables WHERE varname = 'dfltInstZflag'"), errbuf, &result))
{
safe_delete_array(query);
if (mysql_num_rows(result) == 1) {
row = mysql_fetch_row(result);
int32 tmp = atoi(row[0]);
mysql_free_result(result);
return tmp;
}
mysql_free_result(result);
}
else {
cerr << "Error in GetDfltInstZFlag query '" << query << "' " << errbuf << endl;
safe_delete_array(query);
}
return 0;
}
int32 Database::GetCharInstFlagNum(int32 charID){
char errbuf[MYSQL_ERRMSG_SIZE];
char *query = 0;
MYSQL_RES *result;
MYSQL_ROW row;
if (RunQuery(query, MakeAnyLenString(&query, "SELECT instZflagNum FROM character_ WHERE id=%i", charID), errbuf, &result))
{
safe_delete_array(query);
if (mysql_num_rows(result) == 1) {
row = mysql_fetch_row(result);
int tmp = atoi(row[0]);
mysql_free_result(result);
return tmp;
}
mysql_free_result(result);
}
else {
cerr << "Error in GetCharInstFlag Numquery '" << query << "' " << errbuf << endl;
safe_delete_array(query);
}
return 0;
}
int32 Database::GetCharInstZOrgID(int32 charID){
char errbuf[MYSQL_ERRMSG_SIZE];
char *query = 0;
MYSQL_RES *result;
MYSQL_ROW row;
if (RunQuery(query, MakeAnyLenString(&query, "SELECT instZOrgID FROM character_ WHERE id=%i", charID), errbuf, &result))
{
safe_delete_array(query);
if (mysql_num_rows(result) == 1) {
row = mysql_fetch_row(result);
int32 tmp = atoi(row[0]);
mysql_free_result(result);
return tmp;
}
mysql_free_result(result);
}
else {
cerr << "Error in GetInstType query '" << query << "' " << errbuf << endl;
safe_delete_array(query);
}
return 0;
}
int32 Database::GetInstZoneID(int32 zoneID, const char* charName) {
if (zoneID == 0)
return 0;
int32 charID = GetCharacterID(charName);
if (zoneID == GetCharInstZOrgID(charID))
{
zoneID = GetCharInstFlagNum(charID);
return zoneID;
}
else
return (zoneID);
}
void Database::DeleteInstZone(int32 instZoneID)
{
char errbuf[MYSQL_ERRMSG_SIZE];
char *query = 0;
MYSQL_RES *result;
if (RunQuery(query, MakeAnyLenString(&query, "DELETE FROM zone WHERE zoneidnumber=%i", instZoneID), errbuf, &result))
{
safe_delete_array(query);
mysql_free_result(result);
}
else {
cerr << "Error in DeleteInstZone query '" << query << "' " << errbuf << endl;
safe_delete_array(query);
}
}
//Rocker8956
void Database::setGroupInstFlagNum(int charID, int orgZoneID, int instFlag)
{
char errbuf[MYSQL_ERRMSG_SIZE];
char *query = 0;
MYSQL_RES *result;
MYSQL_ROW row;
int groupid = 0;
// 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]);
mysql_free_result(result);
safe_delete_array(query);
// 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))
{
while((row = mysql_fetch_row(result)))
{
charID = atoi(row[0]);
setCharInstFlag(charID, orgZoneID, instFlag);
Sleep(0);
}
safe_delete_array(query);
mysql_free_result(result);
}
}
else
{
printf("Unable to get group id, char not found!\n");
mysql_free_result(result);
safe_delete_array(query);
}
}
else
{
printf("Unable to get group id: %s\n",errbuf);
mysql_free_result(result);
safe_delete_array(query);
}
}
void Database::setRaidInstFlagNum(int charID, int orgZoneID, int instFlag)
{
char errbuf[MYSQL_ERRMSG_SIZE];
char *query = 0;
MYSQL_RES *result;
MYSQL_ROW row;
int raidid = 0;
// Find out what raid the character is in
if (RunQuery(query, MakeAnyLenString(&query, "SELECT raidid from raid_members where charid=%i", charID), errbuf, &result))
{
if (mysql_num_rows(result) == 1)
{
row = mysql_fetch_row(result);
raidid=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))
{
while((row = mysql_fetch_row(result)))
{
charID = atoi(row[0]);
setCharInstFlag(charID, orgZoneID, instFlag);
Sleep(0);
}
safe_delete_array(query);
mysql_free_result(result);
}
}
}
else
{
printf("Unable to get raid id: %s\n",errbuf);
mysql_free_result(result);
safe_delete_array(query);
}
}
void Database::incrCurInstFlagNum(int instFlag)
{
char errbuf[MYSQL_ERRMSG_SIZE];
char *query = 0;
MYSQL_RES *result;
MYSQL_ROW row;
// Increment the curInstFlagNum
instFlag++;
if (instFlag > 9999)
instFlag = 2000;
if (RunQuery(query, MakeAnyLenString(&query, "UPDATE variables SET value=%i WHERE varname='curInstFlagNum'", instFlag), errbuf, &result))
{
safe_delete_array(query);
mysql_free_result(result);
}
else
{
cerr << "Error in incrCurInstFlagNum query '" << query << "' " << errbuf << endl;
mysql_free_result(result);
safe_delete_array(query);
}
}
int Database::getCurInstFlagNum()
{
char errbuf[MYSQL_ERRMSG_SIZE];
char *query = 0;
MYSQL_RES *result;
MYSQL_ROW row;
int instFlag = 0;
// Get the current instant flag number
if (RunQuery(query, MakeAnyLenString(&query, "SELECT value FROM variables WHERE varname = 'curInstFlagNum'"), errbuf, &result))
{
if (mysql_num_rows(result) == 1)
{
row = mysql_fetch_row(result);
instFlag = atoi(row[0]);
mysql_free_result(result);
safe_delete_array(query);
return instFlag;
}
else
{
cerr << "Error in GetCurInstFlagNum query '" << query << "' " << errbuf << endl;
mysql_free_result(result);
safe_delete_array(query);
return instFlag;
}
}
else
{
cerr << "Error in GetCurInstFlagNum query '" << query << "' " << errbuf << endl;
safe_delete_array(query);
return instFlag;
}
}
void Database::setCharInstFlag(int charID, int orgZoneID, int instFlag)
{
char errbuf[MYSQL_ERRMSG_SIZE];
char *query = 0;
MYSQL_RES *result;
MYSQL_ROW row;
if (RunQuery(query, MakeAnyLenString(&query, "UPDATE character_ SET instZflagNum=%i, instZOrgID=%i WHERE id=%i", instFlag, orgZoneID, charID), errbuf, &result))
{
safe_delete_array(query);
mysql_free_result(result);
}
else
{
cerr << "Error in setCharInstFlagNum query '" << query << "' " << errbuf << endl;
safe_delete_array(query);
}
}
Zone\zonedb.cpp
Append to the end
Code:
int32 ZoneDatabase::GetInstType(int32 zoneid) {
char errbuf[MYSQL_ERRMSG_SIZE];
char *query = 0;
MYSQL_RES *result;
MYSQL_ROW row;
if (RunQuery(query, MakeAnyLenString(&query, "SELECT insttype FROM zone WHERE zoneidnumber=%i", zoneid), errbuf, &result))
{
safe_delete_array(query);
if (mysql_num_rows(result) == 1) {
row = mysql_fetch_row(result);
int8 tmp = atoi(row[0]);
mysql_free_result(result);
return tmp;
}
mysql_free_result(result);
}
else {
cerr << "Error in GetInstType query '" << query << "' " << errbuf << endl;
safe_delete_array(query);
}
return 0;
}
bool ZoneDatabase::InstZoneLoaded(int32 charInstFlagNum){
char errbuf[MYSQL_ERRMSG_SIZE];
char *query = 0;
MYSQL_RES *result;
MYSQL_ROW row;
if (RunQuery(query, MakeAnyLenString(&query, "SELECT zoneidnumber FROM zone WHERE zoneidnumber=%i", charInstFlagNum), errbuf, &result))
{
safe_delete_array(query);
if (mysql_num_rows(result) == 1) {
return true;
}
else if (mysql_num_rows(result) == 0) {
return false;
}
mysql_free_result(result);
}
else {
cerr << "Error in isInstZoneLoad query '" << query << "' " << errbuf << endl;
safe_delete_array(query);
}
return 0;
}
//Copies original zones information into a new zone entry replacing the old zoneidnumber with the instflagnum
void ZoneDatabase::LoadInstZone(int32 target_zone_ID, int32 instFlagNum){
char errbuf[MYSQL_ERRMSG_SIZE];
char *query = 0;
MYSQL_RES *result;
MYSQL_ROW row;
int32 affected_rows = 0;
string tmpzonename = database.GetZoneName(target_zone_ID);
string temp;
const char* temp2;
stringstream tmpFlag; // used for converting int32 instFlagNum to a string
tmpFlag << instFlagNum;
temp = tmpFlag.str();
temp.append(tmpzonename);
temp2 = temp.c_str();
if (RunQuery(query, MakeAnyLenString(&query, "INSERT INTO zone (short_name, file_name, long_name, safe_x, safe_y, safe_z, graveyard_id, min_level, min_status, zoneidnumber, timezone, maxclients, weather, note, underworld, minclip, maxclip, fog_minclip, fog_maxclip, fog_blue, fog_red, fog_green, sky, ztype, zone_exp_multiplier, walkspeed, time_type, fog_red1, fog_green1, fog_blue1, fog_minclip1, fog_maxclip1, fog_red2, fog_green2, fog_blue2, fog_minclip2, fog_maxclip2, fog_red3, fog_green3, fog_blue3, fog_minclip3, fog_maxclip3, fog_red4, fog_green4, fog_blue4, fog_minclip4, fog_maxclip4, flag_needed, canbind, cancombat, canlevitate, castoutdoor, insttype, insttimer) SELECT '%s', file_name, long_name, safe_x, safe_y, safe_z, graveyard_id, min_level, min_status, %i, timezone, maxclients, weather, note, underworld, minclip, maxclip, fog_minclip, fog_maxclip, fog_blue, fog_red, fog_green, sky, ztype, zone_exp_multiplier, walkspeed, time_type, fog_red1, fog_green1, fog_blue1, fog_minclip1, fog_maxclip1, fog_red2, fog_green2, fog_blue2, fog_minclip2, fog_maxclip2, fog_red3, fog_green3, fog_blue3, fog_minclip3, fog_maxclip3, fog_red4, fog_green4, fog_blue4, fog_minclip4, fog_maxclip4, flag_needed, canbind, cancombat, canlevitate, castoutdoor, insttype, insttimer FROM zone WHERE zoneidnumber =%i", temp2,instFlagNum,target_zone_ID), errbuf, 0, &affected_rows)){
safe_delete_array(query);}
else {
cerr << "Error in LoadInstZone query '" << query << "' " << errbuf << endl;
safe_delete_array(query);
}
}
Zone\zoneDB.cpp line 13 insert
Code:
#include <string>
#include <sstream>
Zone\zonedb.h
line 194 change const char* zone_name to int32 zoneid
Code:
bool PopulateZoneSpawnList(int32 zoneid, LinkedList<Spawn2*> &spawn2_list, int32 repopdelay = 0);
Zone\Zonedb.h
At the end of Zone Related around line 181
Code:
int32 GetInstType(int32 zoneid);
bool InstZoneLoaded(int32 target_zone_ID);
void LoadInstZone(int32 target_zone_ID, int32 InstFlagNum);
Zone.cpp Line 1146 change short_name to zoneid
Code:
if (!database.PopulateZoneSpawnList(zoneid, spawn2_list, delay))
Zone.cpp Line 779 change short_name to zoneid
Code:
if (!database.PopulateZoneSpawnList(zoneid, spawn2_list))
Zone.cpp Line 772 change short_name to zoneid
Code:
else if (tmp == 0) {
LogFile->write(EQEMuLog::Status, "No state saved, loading spawn2 points...");
if (!database.PopulateZoneSpawnList(zoneid, spawn2_list))
return false;
}
Zone\Zone.cpp line 616 bottom of Zone::Shutdown insert
Code:
zone->ResetAuth();
if (zone->GetZoneID() > database.GetDfltInstZFlag()){
database.DeleteInstZone(zone->GetZoneID());
}
safe_delete(zone);
dbasync->CommitWrites();
UpdateWindowTitle();
Zone\spawn2.cpp line 226
Code:
bool ZoneDatabase::PopulateZoneSpawnList(int32 zoneid, LinkedList<Spawn2*> &spawn2_list, int32 repopdelay) {
char errbuf[MYSQL_ERRMSG_SIZE];
char* query = 0;
MYSQL_RES *result;
MYSQL_ROW row;
const char *zone_name = database.GetZoneName(zoneid);
int32 dfltInstZFlag = database.GetDfltInstZFlag();
MakeAnyLenString(&query, "SELECT id, spawngroupID, x, y, z, heading, respawntime, variance, pathgrid, timeleft, _condition, cond_value FROM spawn2 WHERE zone='%s'", zone_name);
if (RunQuery(query, strlen(query), errbuf, &result))
{
safe_delete_array(query);
while((row = mysql_fetch_row(result)))
{
Spawn2* newSpawn = 0;
if (zoneid > dfltInstZFlag){
newSpawn = new Spawn2(atoi(row[0]), atoi(row[1]), atof(row[2]), atof(row[3]), atof(row[4]), atof(row[5]), atoi(row[6]), atoi(row[7]), 0, atoi(row[8]), atoi(row[10]), atoi(row[11]));
}
else {
newSpawn = new Spawn2(atoi(row[0]), atoi(row[1]), atof(row[2]), atof(row[3]), atof(row[4]), atof(row[5]), atoi(row[6]), atoi(row[7]), atoi(row[9]), atoi(row[8]), atoi(row[10]), atoi(row[11]));
}
//newSpawn->Repop(repopdelay);
spawn2_list.Insert( newSpawn );
}
mysql_free_result(result);
}
else
{
LogFile->write(EQEMuLog::Error, "Error in PopulateZoneLists query '%s': %s", query, errbuf);
safe_delete_array(query);
return false;
}
return true;
}
Zone\perlparser.cpp
Insert at the end around line 1884
Code:
newXS(strcpy(buf, "setinstflag"), XS__setinstflag, file);
newXS(strcpy(buf, "setinstflagmanually"), XS__setinstflagmanually, file);
Zone\perparser.cpp
insert around line 1758
Code:
XS(XS__setinstflag);
XS(XS__setinstflag)
{
dXSARGS;
if (items != 3)
Perl_croak(aTHX_ "Usage: setinstflag(charID, orginalZoneID, type)");
int charID = (int)SvIV(ST(0));
int orgZoneID = (int)SvIV(ST(1));
int type = (int)SvIV(ST(2));
quest_manager.setinstflag(charID, orgZoneID, type);
XSRETURN_EMPTY;
}
XS(XS__setinstflagmanually);
XS(XS__setinstflagmanually)
{
dXSARGS;
if (items != 3)
Perl_croak(aTHX_ "Usage: setinstflagmanually(charID, orginalZoneID, instFlag)");
int charID = (int)SvIV(ST(0));
int orgZoneID = (int)SvIV(ST(1));
int instFlag = (int)SvIV(ST(2));
quest_manager.setinstflagmanually(charID, orgZoneID, instFlag);
XSRETURN_EMPTY;
}
Zone\questmgr.h
Insert around line 151
Code:
void setinstflag(int charID, int orgZoneID, int type);
void setinstflagmanually(int charID, int orgZoneID, int instFlag);
Zone\questmgr.cpp
Insert at the end
Code:
void QuestManager::setinstflag(int charID, int orgZoneID, int type)
{
int instFlag = database.getCurInstFlagNum();
if (type == 0)
{
database.setCharInstFlag(charID, orgZoneID, instFlag);
database.incrCurInstFlagNum(instFlag); // Increment the curInstFlagNum
}
else if(type == 1)
{
database.setGroupInstFlagNum(charID, orgZoneID, instFlag);
database.incrCurInstFlagNum(instFlag); // Increment the curInstFlagNum
}
else if(type == 2)
{
database.setRaidInstFlagNum(charID, orgZoneID, instFlag);
database.incrCurInstFlagNum(instFlag); // Increment the curInstFlagNum
}
else if(type == 3)
{
database.setCharInstFlag(charID, orgZoneID, instFlag);
database.setGroupInstFlagNum(charID, orgZoneID, instFlag);
database.setRaidInstFlagNum(charID, orgZoneID, instFlag);
database.incrCurInstFlagNum(instFlag); // Increment the curInstFlagNum
}
}
void QuestManager::setinstflagmanually(int charID, int orgZoneID, int instFlag)
{
say("Got to start of setinstflagmanually");
database.setCharInstFlag(charID, orgZoneID, instFlag);
}
Simple quest script to go with all this code.
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::setinstflag($charid,17,0);
quest::say("You can now go play in your own little Blackburrow world."); }
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=~/guess/i){
quest::say("Your flags are set you can now go play in a Blackburrow world.");
quest::setinstflag($charid,17,3); }
if($text=~/manually/i){
quest::say("Okay your flag is set.");
quest::setinstflagmanually($charid,17,1500); }
}
Let me know if I missed something. I am going to go drink some beer.
|
 |
|
 |

02-04-2009, 01:18 AM
|
Sarnak
|
|
Join Date: Jan 2009
Location: USA
Posts: 38
|
|
Thought I'd add... With the instancing ability we need to add a new check to the /goto <playername> command so it will check the characters_ table and replicate any instance flags on the GM before zoning. That way if someone is stuck in the geometry or bugged death or whatever a GM can zone into that instance and check.
|
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:24 PM.
|
|
 |
|
 |
|
|
|
 |
|
 |
|
 |