Some changes to the quest code plus a way to manually set a characters instflag.
Syntax for quest functions
setinstflag(charID, originalZoneID, type)
charID = character ID of the character requesting flag
originalZoneID = zoneID of the zone you want instanced (blackburrow would be 17)
type = 0 will flag only the requesting character
type = 1 will flag the requesting character’s group including that character
type = 2 will flag the requesting character’s raid including that character
setinstflagmanually(charID, originalZoneID, instFlag)
charID = character ID of the character requesting flag
originalZoneID = zoneID of the zone you want instanced (blackburrow would be 17)
instFlag = the instance flag you want to give the requesting character. Pick a number between 1000 and 1999. Try not to use the same one for different quests.
The setinstflagmanually will allow you to send characters to the same instance zone even if they are not in the same group or raid.
SQL changes
Code:
INSERT INTO variables VALUES ('curInstFlagNum', 2000, 'Determines what instance flag will be handed out next', '2008-09-05 04:46:47');
If you already inserted this into your database just change the value to 2000
Code changes
Get rid of my previous quest code. I combined the single, group, and raid flags into one quest function and added a way to manually set a character’s instance flag.
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)");
int32 charID = (int)SvIV(ST(0));
int32 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)");
int32 charID = (int)SvIV(ST(0));
int32 orgZoneID = (int)SvIV(ST(1));
int instFlag = (int)SvIV(ST(2));
quest_manager.setinstflagmanually(charID, orgZoneID, instFlag);
XSRETURN_EMPTY;
}
Perlparser.cpp
Insert at the end around line 1916 (becomes line 1916 after previous insert of code into perparser.cpp)
Code:
newXS(strcpy(buf, "setinstflag"), XS__setinstflag, file);
newXS(strcpy(buf, "setinstflagmanually"), XS__setinstflagmanually, file);
questmgr.h
Insert around line 151
Code:
void setinstflag(int32 charID, int32 orgZoneID, int type);
void setinstflagmanually(int32 charID, int32 orgZoneID, int instFlag);
questmgr.cpp
Insert at the end
Code:
void QuestManager::setinstflag(int32 charID, int32 orgZoneID, int type)
{
if (type == 0)
database.setOneCharInstFlag(charID, orgZoneID);
else if(type == 1)
database.setGroupInstFlagNum(charID, orgZoneID);
else if(type == 2)
database.setRaidInstFlagNum(charID, orgZoneID);
}
void QuestManager::setinstflagmanually(int32 charID, int32 orgZoneID, int instFlag)
{
database.setCharInstFlag(charID, orgZoneID, instFlag);
}
database.cpp
Insert at the end
Code:
void Database::setOneCharInstFlag(int32 charID, int32 orgZoneID)
{
int instFlag = getCurInstFlagNum();
// Set character's instZoneFlag
setCharInstFlag(charID, orgZoneID, instFlag);
// Increment the curInstFlagNum
incrCurInstFlagNum(instFlag);
}
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((row = mysql_fetch_row(result)))
{
if(row[0])
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);
if (row && row[0])
{
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))
{
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);
}
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((row = mysql_fetch_row(result)))
{
if(row[0])
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)) {
safe_delete_array(query);
row = mysql_fetch_row(result);
if (row && row[0])
{
numCharsInRaid = atoi(row[0]);
mysql_free_result(result);
}
}
// 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;
// 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);
}
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;
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))
{
safe_delete_array(query);
if (mysql_num_rows(result) == 1) {
row = mysql_fetch_row(result);
instFlag = atoi(row[0]);
mysql_free_result(result);
return instFlag;
}
else{
mysql_free_result(result);
cerr << "Error in GetCurInstFlagNum query '" << query << "' " << errbuf << endl;
safe_delete_array(query);
return instFlag;
}
}
else {
cerr << "Error in GetCurInstFlagNum query '" << query << "' " << errbuf << endl;
safe_delete_array(query);
return instFlag;
}
}
void Database::setCharInstFlag(int32 charID, int32 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);
}
}
database.h
Insert at the end
Code:
void setOneCharInstFlag(int32 charID, int32 orgZoneID);
void setGroupInstFlagNum(int32 charID, int32 orgZoneID);
void setRaidInstFlagNum(int32 charID, int32 orgZoneID);
void incrCurInstFlagNum(int instFlag);
int getCurInstFlagNum();
void setCharInstFlag(int32 charID, int32 orgZoneID, int instFlag);