Here are the sections of code that I suspect one of them being the cause of doors disappearing when I change them. I changed all of the ones highlighted in
red to 32 as shown in the earlier post. The
red values here show the original values for coders to compare. All other changes above were all 16 to begin with.
dbmemshare.cpp: (note that this one was previously set to 10 and not 16 like all of the others. So, this leads me to believe that it either isn't used anymore, or maybe I need to leave it set to 10 for whatever reason...)
Code:
bool Database::DBLoadDoors(int32 iDoorCount, int32 iMaxDoorID) {
cout << "Loading Doors from database..." << endl;
char errbuf[MYSQL_ERRMSG_SIZE];
char *query = 0;
MYSQL_RES *result;
MYSQL_ROW row;
query = new char[256];
strcpy(query, "SELECT MAX(id), Count(*) FROM doors");
if (RunQuery(query, strlen(query), errbuf, &result))
{
safe_delete(query);
row = mysql_fetch_row(result);
if (row && row[0]) {
if (atoi(row[0]) > iMaxDoorID) {
cout << "Error: Insufficient shared memory to load doors." << endl;
cout << "Max(id): " << atoi(row[0]) << ", iMaxDoorID: " << iMaxDoorID << endl;
cout << "Fix this by increasing the MMF_MAX_Door_ID define statement" << endl;
return false;
}
if (atoi(row[1]) != iDoorCount) {
cout << "Error: Insufficient shared memory to load doors." << endl;
cout << "Count(*): " << atoi(row[1]) << ", iDoorCount: " << iDoorCount << endl;
return false;
}
max_door_type = atoi(row[0]);
mysql_free_result(result);
Door tmpDoor;
MakeAnyLenString(&query, "SELECT id,doorid,zone,name,pos_x,pos_y,pos_z,heading,opentype,guild,lockpick,keyitem,triggerdoor,triggertype from doors");//WHERE zone='%s'", zone_name
if (RunQuery(query, strlen(query), errbuf, &result))
{
safe_delete(query);
while((row = mysql_fetch_row(result))) {
memset(&tmpDoor, 0, sizeof(Door));
tmpDoor.db_id = atoi(row[0]);
tmpDoor.door_id = atoi(row[1]);
strncpy(tmpDoor.zone_name,row[2],16);
strncpy(tmpDoor.door_name,row[3],10);
tmpDoor.pos_x = (float)atof(row[4]);
tmpDoor.pos_y = (float)atof(row[5]);
tmpDoor.pos_z = (float)atof(row[6]);
tmpDoor.heading = atoi(row[7]);
tmpDoor.opentype = atoi(row[8]);
tmpDoor.guild_id = atoi(row[9]);
tmpDoor.lockpick = atoi(row[10]);
tmpDoor.keyitem = atoi(row[11]);
tmpDoor.trigger_door = atoi(row[12]);
tmpDoor.trigger_type = atoi(row[13]);
EMuShareMemDLL.Doors.cbAddDoor(tmpDoor.db_id, &tmpDoor);
Sleep(0);
}
mysql_free_result(result);
}
else
{
cerr << "Error in DBLoadDoors query '" << query << "' " << errbuf << endl;
delete[] query;
return false;
}
}
}
return true;
}
#endif
doors.cpp:
Code:
Doors::Doors(const Door* door)
: close_timer(5000)
{
db_id = door->db_id;
door_id = door->door_id;
strncpy(zone_name,door->zone_name,16);
strncpy(door_name,door->door_name,16);
pos_x = door->pos_x;
pos_y = door->pos_y;
pos_z = door->pos_z;
heading = door->heading;
incline = door->incline;
opentype = door->opentype;
guild_id = door->guild_id;
lockpick = door->lockpick;
keyitem = door->keyitem;
trigger_door = door->trigger_door;
trigger_type = door->trigger_type;
triggered=false;
door_param = door->door_param;
size = door->size;
invert_state = door->invert_state;
SetOpenState(false);
close_timer.Disable();
strncpy(dest_zone,door->dest_zone,16);
dest_x = door->dest_x;
dest_y = door->dest_y;
dest_z = door->dest_z;
dest_heading = door->dest_heading;
}
Code:
// Door tmpDoor;
MakeAnyLenString(&query, "SELECT id,doorid,zone,name,pos_x,pos_y,pos_z,heading,"
"opentype,guild,lockpick,keyitem,triggerdoor,triggertype,dest_zone,dest_x,"
"dest_y,dest_z,dest_heading,door_param,invert_state,incline,size "
"FROM doors WHERE zone='%s' ORDER BY doorid asc", zone_name);
if (RunQuery(query, strlen(query), errbuf, &result)) {
safe_delete_array(query);
sint32 r;
for(r = 0; (row = mysql_fetch_row(result)); r++) {
if(r >= iDoorCount) {
cerr << "Error, Door Count of " << iDoorCount << " exceeded." << endl;
break;
}
memset(&into[r], 0, sizeof(Door));
into[r].db_id = atoi(row[0]);
into[r].door_id = atoi(row[1]);
strncpy(into[r].zone_name,row[2],16);
strncpy(into[r].door_name,row[3],16);
into[r].pos_x = (float)atof(row[4]);
into[r].pos_y = (float)atof(row[5]);
into[r].pos_z = (float)atof(row[6]);
into[r].heading = (float)atof(row[7]);
into[r].opentype = atoi(row[8]);
into[r].guild_id = atoi(row[9]);
into[r].lockpick = atoi(row[10]);
into[r].keyitem = atoi(row[11]);
into[r].trigger_door = atoi(row[12]);
into[r].trigger_type = atoi(row[13]);
strncpy(into[r].dest_zone,row[14],16);
into[r].dest_x = (float) atof(row[15]);
into[r].dest_y = (float) atof(row[16]);
into[r].dest_z = (float) atof(row[17]);
into[r].dest_heading = (float) atof(row[18]);
into[r].door_param=atoi(row[19]);
into[r].invert_state=atoi(row[20]);
into[r].incline=atoi(row[21]);
into[r].size=atoi(row[22]);
}
mysql_free_result(result);
}
else
{
cerr << "Error in DBLoadDoors query '" << query << "' " << errbuf << endl;
safe_delete_array(query);
return false;
}
return true;
}
doors.h:
Code:
private:
int32 db_id;
sint8 door_id;
char zone_name[16];
char door_name[16];
float pos_x;
float pos_y;
float pos_z;
float heading;
int incline;
int8 opentype;
int32 guild_id;
int16 lockpick;
uint32 keyitem;
int8 trigger_door;
int8 trigger_type;
int32 door_param;
int16 size;
int invert_state;
int32 entity_id;
bool isopen;
Timer close_timer;
//Timer trigger_timer;
char dest_zone[16];
float dest_x;
float dest_y;
float dest_z;
float dest_heading;
};
entity.cpp:
Code:
bool EntityList::MakeDoorSpawnPacket(EQApplicationPacket* app)
{
int32 count = door_list.Count();
if( !count || count>500)
return false;
int32 length = count * sizeof(Door_Struct);
uchar* packet_buffer = new uchar[length];
memset(packet_buffer, 0, length);
uchar* ptr = packet_buffer;
Doors *door;
LinkedListIterator<Doors*> iterator(door_list);
Door_Struct nd;
iterator.Reset();
while(iterator.MoreElements()){
door = iterator.GetData();
if(door && strlen(door->GetDoorName()) > 3){
memset(&nd, 0, sizeof(nd));
memcpy(nd.name, door->GetDoorName(), 16);
nd.xPos = door->GetX();
nd.yPos = door->GetY();
nd.zPos = door->GetZ();
nd.heading = door->GetHeading();
nd.incline = door->GetIncline();
nd.size = door->GetSize();
nd.doorId = door->GetDoorID();
nd.opentype = door->GetOpenType();
nd.state_at_spawn = door->GetInvertState() ? !door->IsDoorOpen() : door->IsDoorOpen();
nd.invert_state = door->GetInvertState();
nd.door_param = door->GetDoorParam();
memcpy(ptr, &nd, sizeof(nd));
ptr+=sizeof(nd);
*(ptr-1)=0x01;
*(ptr-3)=0x01;
}
iterator.Advance();
}
#if EQDEBUG >= 5
// LogFile->write(EQEMuLog::Debug, "MakeDoorPacket() packet length:%i qty:%i ", length, qty);
#endif
app->SetOpcode(OP_SpawnDoor);
app->size = length;
app->pBuffer = packet_buffer;
return true;
}