View Single Post
  #8  
Old 06-09-2008, 10:40 PM
trevius's Avatar
trevius
Developer
 
Join Date: Aug 2006
Location: USA
Posts: 5,946
Default

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;	
}
__________________
Trevazar/Trevius Owner of: Storm Haven
Everquest Emulator FAQ (Frequently Asked Questions) - Read It!
Reply With Quote