View Full Version : Doors for Newer Zones
trevius
06-08-2008, 07:03 PM
I am trying to add some doors to Dreadspire and I was wondering if anyone could tell me where to pull the door names from. I notice that PEQ has something like 700+ door names and I was wondering if those were attained from packet collecting, or if the door names could be found from the EQG files or something somehow.
I tried setting all of the ones currently in PEQ (from the list of doors in the wiki), but I was only able to find 3 or 4 that actually worked in Dreadspire and they all seemed like Global objects like the message board, a crate, and the PoK scroll. I am sure there are at least 3 or 4 doors that must be custom loaded to Dreadspire from somewhere. I just need to find their names so I can start adding them.
If anyone knows how to do this, I will gladly post the SQL needed to add them all into the zone for anyone else who wants to do so. I am pretty sure the doors I am looking for are a bookcase, a wall looking door and maybe 1 or 2 others. Most of them are for secret passageways and they aren't very secret without doors lol! I imagine once I have them, it might take a while for me to get them all in, but I will definitely share the database info once they are all complete.
I am guessing that the best person to answer this question is Cavedude. So, if you see this one, can you please let me know the answer? Or if anyone else knows where to pull these names from, it would be appreciated. Thanks!
For reference, I figured I would post links to the door related Wiki pages. So, anyone who finds this post in the future can easily get most of the door related information they might be looking for. Here are the links:
Door Table Schema wiki page:
http://www.eqemulator.net/wiki/wikka.php?wakka=EQEmuDBSchemadoors
Door List from PEQ wiki page:
http://www.eqemulator.net/wiki/wikka.php?wakka=DoorsNameList
cavedude
06-08-2008, 07:35 PM
Doors come from packet collects. Looking through my files, I don't have any logs for Dreadspire at all. Now the problem of course is we don't have a packet collector that works with Live that can export to a format that eqextractor can use (that's the tool used to extract door data) Worse yet, eqextractor wouldn't work with Live collects anyway, as it also would need to be updated :(
If anybody feels brave and wants to try to update both the packet collector and eqextractor (so that it can extract door/object/etc data AND export to EQBuilder) I would forever be in your debt, and would spend the summer collecting all of the newer zones. The big problem is going to be the spawn opcodes, as they are a royal pain to get.
trevius
06-09-2008, 03:40 AM
Woot! I was sure that info had to be in the EQG files somewhere, so I kept trying to figure out how to find the names. Finally, I remembered trying out S3DSpy a while back and seeing object names in there. I installed it and sure enough, it lists all EQG files as well!
When you pull up the list, you can see all of the object names, because they all end in .mod. The naming convention has changed as well and actually seems much better than the old door and object naming system lol.
Here is a Link to GeorgeS emu page where you can find the S3DSpy app in the bottom section there.
http://66.159.225.58/eqemu/eq.html
And here is an example of the new format for doors and other objects. I didn't think it was going to work because the format is much different now. They now have OBJ in front of all object names and they also use underscores as well. Some of the new names are slightly longer than the old names, so the table might need to be adjusted to allow for longer names so it doesn't cut them off. Here is the list I made for Dreadspire:
OBJ_BDRM_LDOOR
OBJ_BDRM_RDOOR
OBJ_ARTIFACTS_DO
OBJ_BEAKER_A
OBJ_CAULDREN_A
OBJ_CENTER_PIECE
OBJ_DINE_LDOOR
OBJ_DINE_RDOOR
OBJ_DOORFACADE
OBJ_HIDDENDOOR
OBJ_LIBRARY_CASE
OBJ_LIBRY_HIDEDO
OBJ_LIBRY_LDOOR
OBJ_LIBRY_RDOOR
OBJ_LIBRY_SWITCH
OBJ_LIBRYSWTCHB
OBJ_MAINCASTLE_D
OBJ_MNGBOOKS
OBJ_RESEARCH_DOO
OBJ_RESEARCHDOOR
OBJ_SEEING_DOOR
OBJ_STAIRWELL_DO
OBJ_STUDY_BOOKSH
OBJ_STUDY_DOOR
OBJ_TORTURE_DOOR
OBJ_WHITEBLOCK
That worked perfectly.
If you have Navicat, you can copy the following and paste it into your table to view these doors. Just go to the loc near where the doors are:
Field Order:
ID DOORID ZONE NAME POS_Y POS_X POS_Z HEADING OPENTYPE GUILD LOCKPICK KEYITEM TRIGGERDOOR TRIGGERTYPE DOORISOPEN DOOR_PERAM DEST_ZONE DEST_X DEST_Y DEST_Z DEST_HEADING INVERT_STATE INCLINE SIZE BUFFER
13001 1 dreadspire OBJ_BDRM_LDOOR 2450 0 100.1 0 55 0 0 0 0 0 0 -1 NONE 0 0 0 0 0 0 10 0
13002 2 dreadspire OBJ_BDRM_RDOOR 2452 0 100.1 0 55 0 0 0 0 0 0 -1 NONE 0 0 0 0 0 0 10 0
13003 3 dreadspire OBJ_ARTIFACTS_DO 2453 0 100.1 0 55 0 0 0 0 0 0 -1 NONE 0 0 0 0 0 0 10 0
13004 4 dreadspire OBJ_BEAKER_A 2454 0 100.1 0 55 0 0 0 0 0 0 -1 NONE 0 0 0 0 0 0 10 0
13005 5 dreadspire OBJ_CAULDREN_A 2455 0 100.1 0 55 0 0 0 0 0 0 -1 NONE 0 0 0 0 0 0 10 0
13006 6 dreadspire OBJ_CENTER_PIECE 2456 0 100.1 0 55 0 0 0 0 0 0 -1 NONE 0 0 0 0 0 0 10 0
13007 7 dreadspire OBJ_DINE_LDOOR 2457 0 100.1 0 55 0 0 0 0 0 0 -1 NONE 0 0 0 0 0 0 10 0
13008 8 dreadspire OBJ_DINE_RDOOR 2458 0 100.1 0 55 0 0 0 0 0 0 -1 NONE 0 0 0 0 0 0 10 0
13009 9 dreadspire OBJ_DOORFACADE 2459 0 100.1 0 55 0 0 0 0 0 0 -1 NONE 0 0 0 0 0 0 10 0
13010 10 dreadspire OBJ_HIDDENDOOR 2460 0 100.1 0 55 0 0 0 0 0 0 -1 NONE 0 0 0 0 0 0 10 0
13011 11 dreadspire OBJ_LIBRARY_CASE 2461 0 100.1 0 55 0 0 0 0 0 0 -1 NONE 0 0 0 0 0 0 10 0
13012 12 dreadspire OBJ_LIBRY_HIDEDO 2462 0 100.1 0 55 0 0 0 0 0 0 -1 NONE 0 0 0 0 0 0 10 0
13013 13 dreadspire OBJ_LIBRY_LDOOR 2463 0 100.1 0 55 0 0 0 0 0 0 -1 NONE 0 0 0 0 0 0 10 0
13014 14 dreadspire OBJ_LIBRY_RDOOR 2464 0 100.1 0 55 0 0 0 0 0 0 -1 NONE 0 0 0 0 0 0 10 0
13015 15 dreadspire OBJ_LIBRY_SWITCH 2465 0 100.1 0 55 0 0 0 0 0 0 -1 NONE 0 0 0 0 0 0 10 0
13016 16 dreadspire OBJ_LIBRYSWTCHB 2466 0 100.1 0 55 0 0 0 0 0 0 -1 NONE 0 0 0 0 0 0 10 0
13017 17 dreadspire OBJ_MAINCASTLE_D 2467 0 100.1 0 55 0 0 0 0 0 0 -1 NONE 0 0 0 0 0 0 10 0
13018 18 dreadspire OBJ_MNGBOOKS 2468 0 100.1 0 55 0 0 0 0 0 0 -1 NONE 0 0 0 0 0 0 10 0
13019 19 dreadspire OBJ_RESEARCH_DOO 2469 0 100.1 0 55 0 0 0 0 0 0 -1 NONE 0 0 0 0 0 0 10 0
13020 20 dreadspire OBJ_RESEARCHDOOR 2470 0 100.1 0 55 0 0 0 0 0 0 -1 NONE 0 0 0 0 0 0 10 0
13021 21 dreadspire OBJ_SEEING_DOOR 2471 0 100.1 0 55 0 0 0 0 0 0 -1 NONE 0 0 0 0 0 0 10 0
13022 22 dreadspire OBJ_STAIRWELL_DO 2472 0 100.1 0 55 0 0 0 0 0 0 -1 NONE 0 0 0 0 0 0 10 0
13023 23 dreadspire OBJ_STUDY_BOOKSH 2473 0 100.1 0 55 0 0 0 0 0 0 -1 NONE 0 0 0 0 0 0 10 0
13024 24 dreadspire OBJ_STUDY_DOOR 2474 0 100.1 0 55 0 0 0 0 0 0 -1 NONE 0 0 0 0 0 0 10 0
13025 25 dreadspire OBJ_TORTURE_DOOR 2475 0 100.1 0 55 0 0 0 0 0 0 -1 NONE 0 0 0 0 0 0 10 0
13026 26 dreadspire OBJ_WHITEBLOCK 2476 0 100.1 0 55 0 0 0 0 0 0 -1 NONE 0 0 0 0 0 0 10 0
You can easily adjust the ID number if needed in case the newer versions of PEQ have higher than that. This will just show an example of the doors. I plan to get them all in the right place as far as where I imagine they should all be. Once I have that done, I will post the table lines for them so everyone can add them as well.
Angelox
06-09-2008, 06:52 AM
Some of the new names are slightly longer than the old names, so the table might need to be adjusted to allow for longer names so it doesn't cut them off. Here is the list I made for Dreadspire:
'name' in table 'doors' is VARCHAR(16) - if you increase the size, the bigger name will be accepted in the database, but EqEmu still will not read past this restriction, so the object with exceeding characters will not apply.
trevius
06-09-2008, 08:09 AM
Looks like many of the doors for the later expansions (using dreadspire as an example) are more than 16 characters. This may also be the case for other objects as well. But, I am only focusing on doors at this point.
So, I changed my table design to use 32 max characters for the door name field. And, it still wasn't working, so I started looking at the source and saw that it was set to 16 in many places there as well.
Every case that I found 16 set for door names, I changed it. After the following changes, all doors were gone when I started the server, so it must have messed something up lol. Here are the changes I made.
All code changes are marked in red:
zone/doors.cpp:
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,32);
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],32);
zone/doors.h:
private:
int32 db_id;
sint8 door_id;
char zone_name[16];
char door_name[32];
zone/entity.cpp:
bool EntityList::MakeDoorSpawnPacket(EQApplicationPacke t* 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(), 32);
common/dbsharemem.cpp:
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,open type,guild,lockpick,keyitem,triggerdoor,triggertyp e 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],32); //was set to 10 previously
common/eq_packet_structs.h:
struct Door_Struct
{
/*0000*/ char name[32]; // Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade //changed both to 32: Trevius
utils/schema.xml:
<TABLE ID="4543" Tablename="doors" PrevTableName="" XPos="2108" YPos="2375" TableType="0" TablePrefix="0" nmTable="0" Temporary="0" UseStandardInserts="0" StandardInserts="" TableOptions="" Comments="" Collapsed="0" IsLinkedObject="0" IDLinkedModel="-1" Obj_id_Linked="-1" OrderPos="14" >
<COLUMNS>
<COLUMN ID="4906" ColName="id" PrevColName="" Pos="1" idDatatype="5" DatatypeParams="(11)" Width="0" Prec="0" PrimaryKey="1" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
<OPTIONSELECTED>
<OPTIONSELECT Value="0" />
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
<COLUMN ID="4907" ColName="doorid" PrevColName="" Pos="2" idDatatype="2" DatatypeParams="(4)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
<OPTIONSELECTED>
<OPTIONSELECT Value="0" />
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
<COLUMN ID="4908" ColName="zone" PrevColName="" Pos="3" idDatatype="20" DatatypeParams="(16)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="1" DefaultValue="" Comments="">
<OPTIONSELECTED>
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
<COLUMN ID="4909" ColName="name" PrevColName="" Pos="4" idDatatype="20" DatatypeParams="(32)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
zone/zonedump.h:
struct Door {
int32 db_id;
int8 door_id;
char zone_name[16];
char door_name[32];
common/patches/anniversary_structs.h:
struct Door_Struct
{
/*0000*/ char name[32]; // Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade // changed to 32: Trevius
common/patches/client62_structs.h:
struct Door_Struct
{
/*0000*/ char name[32]; // Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade // changed to 32: Trevius
common/patches/live_structs.h
struct Door_Struct
{
/*0000*/ char name[32]; // Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade // changed to 32: Trevius
common/patches/titanium_structs.h
struct Door_Struct
{
/*0000*/ char name[32]; // Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade // changed to 32: Trevius
So, I must have made some change that caused the doors to disapear. I will look into this more tomorrow, but if anyone can help out with fixing this, it would be appreciated! I plan to add in a Server Code Submission for this when it is done so it can get added to the source. If anyone else helps, they will get credit of course. I also plan to add this into my source and will post the completed source with these changes and the previous ones I have posted.
Angelox
06-09-2008, 09:35 AM
Any name you pull out of an .eqg file can be any size - apparently, SOE changed that with the newer eqg format, and is why a lot of things will not work.
// Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade
It must complicated, as it looks like this is some sort of a hack to enable 16 over what was 10.
trevius
06-09-2008, 04:49 PM
Maybe I accidentally changed something else door related in the source while I was making these changes. I will go through them all again tonight and make absolutely sure that nothing else was changed that might have caused it to get messed up.
What I did was search the source directory for all files containing the word "door" and then 1 by 1, I went through each file and looked to see if any of them had door name set to 16. I am pretty sure I got them all, but there is still the possibility I missed something. I don't see why this change would cause doors to disappear. Maybe there is some setting that limits the field to 16 that I am not aware of (maybe like a uint setting or something). I am not a coder, so I would really appreciate if a coder could have a quick look at this.
This might not seem too major, but as far as using zones from later expansions go, we will always be limited with objects until this is fixed. I imagine that the object table will probably need similar name updates as well. I think this is the final thing needed to allow all Titanium zones to be used fully. Sure, you can use them now without doors, but IMO, doors are required in many to complete the zone.
Now that I look at it, maybe my changes in utils/schema.xml are what caused the problem. I don't know much about that file and have never changed it before. Maybe this change is what broke it:
<COLUMN ID="4909" ColName="name" PrevColName="" Pos="4" idDatatype="20" DatatypeParams="(32)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
Maybe that still has to be set to 16. I notice that it says Params (parameter I suppose) and not anything about length of the column. Can anyone confirm how that is supposed to be set?
trevius
06-09-2008, 10:40 PM
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...)
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,open type,guild,lockpick,keyitem,triggerdoor,triggertyp e 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:
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;
}
// Door tmpDoor;
MakeAnyLenString(&query, "SELECT id,doorid,zone,name,pos_x,pos_y,pos_z,heading,"
"opentype,guild,lockpick,keyitem,triggerdoor,trigge rtype,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:
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:
bool EntityList::MakeDoorSpawnPacket(EQApplicationPacke t* 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;
}
trevius
06-10-2008, 08:12 AM
Well, I didn't get any code working for greater than 16 char door names yet, but I did get a new wiki page added. Noting it here since it is door related. I tested every opentype and created a nice reference list with descriptions for anyone wanting to create their own doors. Here is the completed list:
http://www.eqemulator.net/wiki/wikka.php?wakka=OpenType
I still want to get the 16 char limit raised in the source, but I think I may need more help with it.
Derision
06-10-2008, 08:40 AM
I still want to get the 16 char limit raised in the source, but I think I may need more help with it.
The size of the door name appears to be set to 16 characters in the packet the server sends to the client, i.e. 16 characters is all the client will accept, in which case it can't be changed.
Angelox
06-10-2008, 03:15 PM
The size of the door name appears to be set to 16 characters in the packet the server sends to the client, i.e. 16 characters is all the client will accept, in which case it can't be changed.
There are so many items that can be placed, but exist over the 16 character limit - would it be possible to upgrade the portion of source involving packets sent to the client?
Scorpious2k
06-10-2008, 03:34 PM
I haven't had time to look into this a lot, but I noticed this:
struct Door_Struct
{
/*0000*/ char name[16]; // Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade
/*0016*/ char unknown0016[16];
So, if you change name to be name[32] I think it would be a good guess that the unknown0016[16] is actually the other half of the name. So... to keep from breaking the packet struct, you should remove the line that says /*0016*/ char unknown0016[16]; when you change the one above it to /*0000*/ char name[32];
trevius
06-10-2008, 04:08 PM
Ahh, worth a shot! So, 2 parts of the packet would essentially become 1 but use the same space so that packet structure doesn't change?
I will see if I can get a compiler working on my windows pc so I can compile the source over and over testing each way without having to impact my players all night lol.
And to Derision; I think this should be adjustable because of the note in the comment below showing that it was previously set to 10 and it is now 16. So, if it can go from 10 to 16, it should be able to go higher.
// Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade
What S2K said makes alot of sense to me. Basically it sounds like that unknown packet is just set there to fill the gap of the missing 16 chars from the size of the name that should actually be 32. I bet there is actually nothing at all in that space currently and that is why it was able to be adjusted in the past. I wish that note from Daeken was a little clearer lol. I wonder if he means "subtracted the 6 from the unknown below which was previously 22 and added that to the name so it went from 10 to 16".
Angelox
06-10-2008, 06:07 PM
I haven't had time to look into this a lot, but I noticed this:
struct Door_Struct
{
/*0000*/ char name[16]; // Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade
/*0016*/ char unknown0016[16];
So, if you change name to be name[32] I think it would be a good guess that the unknown0016[16] is actually the other half of the name. So... to keep from breaking the packet struct, you should remove the line that says /*0016*/ char unknown0016[16]; when you change the one above it to /*0000*/ char name[32];
We'll try this out in a while - tell ya what happened.
Aramid
06-10-2008, 06:15 PM
I will see if I can get a compiler working on my windows pc so I can compile the source over and over testing each way without having to impact my players all night lol.
.
Trev, The DEV Kit will let you compile EQEMU. I've set it up on a machine and it works perfectly and you can register the Trial Version of VC++ Express 2005 for Free.
Here's the link. http://www.eqemulator.net/forums/showthread.php?t=25372
trevius
06-10-2008, 06:42 PM
Ya, I got the dev kit and have used it and it seemed to work ok I think. I did get alot of warnings about not being able to find certain things from some of the lib files like the zlib, but I didn't get any errors.
I will probably try it out again and see if I can get a windows server just for me to test on maybe tonight. I know it works for me to run on a second server from the same IP, but I am the only one able to connect to it (due to no port forwarding for port 9000 since it is used by my Linux server). Which is perfectly fine for testing purposes.
Maybe I can write a batch file to move all of the required files for the emu to run from the dev kit directory to my normal eqemu directory so I don't have to move them all manually each time. Should be pretty easy and I didn't think about that until now hehe.
Angelox
06-11-2008, 10:00 AM
this works - I made all original changes posted here by trevius and Scorpious2k, including i removed all the extra "/*0016*/ char unknown0016[16];" i saw while changing the 32's.
So now we have a few fixes that WORK;
-the Azone fix
-the Flee fix
-and this newest door fix
Scorpious2k; are we going to get all this put into the source so everyone can try it out, or am I "pipe dreaming"? I ask you because it seems you're the "last Mohican" to these forums :)
BTW THANK YOU Scorpious2k and trevius!!!
Scorpious2k
06-11-2008, 11:58 AM
Scorpious2k; are we going to get all this put into the source so everyone can try it out, or am I "pipe dreaming"?
Get me a concise list of the changes and I will get them in.
BTW THANK YOU Scorpious2k and trevius!!!
This was all the work of Trevius, he deserves all the thanks.
trevius
06-11-2008, 04:22 PM
Get me a concise list of the changes and I will get them in.
This was all the work of Trevius, he deserves all the thanks.
Woot, thanks for testing it Angelox! I wasn't able to get to it last night due to some other stuff I was working on with getting ready to leave for vacation tomorrow.
And even though I started the work on it, it certain couldn't have been completed without the catch from S2K! So, I certainly don't deserve all of the credit lol. Nice catch! Once you mentioned it, it made perfect sense that those 16 chars were there all along, but weren't being used for some reason, so they just stuck a filler in there to fill the gap (probably because they thought it was used for something else that was unknown). Should have been 32 from the start hehe.
I will get the fleeing code added and this doors fix into my next code release probably tonight and post a link in the same thread that I have been posting my unofficial 1110 updates in. This will be version 1110d when I get it done and include all of the prior code as well.
I can also add the azone patch if I can figure that out. Is that patch even used for anything on the server, or is it just a stand-alone utility for making the maps? I am just curious if that helps actually deal with the maps when the server is running or if it is completely separate.
You are more than welcome to review my post linked below and use any of them for the official code 1111 release if you want. I will leave the win32 compile up to the devs if they want to use my source version, mainly because I am a little iffy on how my windows compiles go with the setup I use. The post describes everything that has been added to the code. I have tested everything accept for the IP limiting and it all works and the server has no other bugs so far from any of the code changes.
I am certainly not a coder, but I can definitely add in updates that actual coders have submitted and test them pretty thoroughly since my server gets a decent amount of players relative to most servers (120+ at peak times).
I can't wait to get those doors changes in! I already have all of the <16 char doors placed in Dreadspire and will add the >16 char ones when I get this added. I will post the door table info for Dreadspire when I have it all done so anyone else can use it if they like.
Also, if anyone knows the sql to change the name field in the doors table from 16 char to 32 char, please post it so I can make note of that for anyone using the new 1110d code when I get it done. I always just use Navicat, so I am mysql illiterate lol. Otherwise, I will just explain how to do it in Navicat for anyone that wants to.
Angelox
06-11-2008, 05:08 PM
I forgot about that, here it is;
ALTER TABLE `doors` MODIFY COLUMN `name` VARCHAR(32) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL;
Azone patch is for the source, I don't think it compiles under windows - but need to have it there.
LostZaphod
06-12-2008, 09:54 AM
Azone patch is for the source, I don't think it compiles under windows - but need to have it there.
Instructions for compiling on for windows.
Make Derision's modifications "http://www.rama.demon.co.uk/azone.patch" to the original azone (Build 1110).
Does any one have the watermap patch? If so please PM it to me.
For Windows Compile, you will have to add files to the project (file.cpp, zon.cpp, ter.cpp, pfs.cpp)
Add to azone.cpp near #include "ter.hpp" (you many have to add the path to the project for zlib)
#ifdef WIN32
#pragma comment(lib, "Ws2_32.lib")
#pragma comment(lib, "zlib.lib")
#endif
Add to pfs.cpp near #include <string.h>
#ifdef WIN32
#include <winsock2.h>
#endif
Change global.hpp, put #ifndef around #include <netinet/in.h>
#ifndef WIN32
#include <netinet/in.h>
#endif
Move some variable definitions from wld.c to wld.h
unsigned short d6size;
char *encstr;
float f1, f2, f3, f4;
Build Azone, this will create Azone.exe (copy this to c:\temp)
Use this SQL to make a batch file, save the csv file to c:\temp\kopy.bat (run in mysql query browser, and save as csv. then delete all double quotes)
select CONCAT(CONCAT('copy \\umEQE\\', short_name),'.EQG c:\\temp') as name from zone union all select CONCAT(CONCAT('copy \\umEQE\\', short_name),'.S3D c:\\temp') as name from zone
make sure you change \\umEQE\\ to the directory of where you installed EQ Titanium (NOTE in mysql \\ means \ )
Save the Visual Basic Script as c:\temp\RunAzone.vbs
make sure the directory c:\temp exists and only has these files (kopy.bat, Azone.exe, RunAzone.vbs)
run kopy.bat (start, run, type "cmd", cd \temp, kopy)
run RunAzone.vbs (double click)
'copy the newly created map files to your server's map directory (you may want to back up first)
'************************************************* *********************
' Visual Basic Script
'************************************************* *********************
Function Main()
Dim objshell
Set objShell = CreateObject("WScript.Shell")
startloc = objShell.CurrentDirectory
CheckFiles startloc
End Function
Function CheckFiles(startloc)
Dim fso, f, f1, fc, s, thefilename, ext
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFolder(startloc)
Set fc1 = f.Files
for each f1 in fc1
thefilename= LCase(f1.Name)
ext = right(thefilename,3)
if(InStr(thefilename,"_") = 0) then
if ext = "s3d"and (thefilename <> "tutoriala.s3d" and thefilename <> "tutorialb.s3d" ) then
thefilename = Replace(thefilename,".s3d","")
Run startloc & "\Azone.exe " & chr(34) & thefilename & chr(34)
else
if ext = "eqg" then
thefilename = Replace(thefilename,".eqg","")
Run startloc & "\Azone.exe " & chr(34) & thefilename & chr(34)
end if
end if
end if
next
End Function
Sub Run(ByVal sFile)
Dim shell
Set shell = CreateObject("WScript.Shell")
shell.Run Chr(34) & sFile & Chr(34), 1, true
Set shell = Nothing
End Sub
main()
msgbox("done")
Scorpious2k
06-13-2008, 05:54 PM
Move some variable definitions from wld.c to wld.h
unsigned short d6size;
char *encstr;
float f1, f2, f3, f4;
I would just move them to the top of the function, but other than that NICE WORK!!!
If you can get it to me in some kind of a package I will move it to live.
Scorpious2k
06-13-2008, 05:58 PM
You are more than welcome to review my post linked below and use any of them for the official code 1111 release if you want. I will leave the win32 compile up to the devs if they want to use my source version, mainly because I am a little iffy on how my windows compiles go with the setup I use. The post describes everything that has been added to the code. I have tested everything accept for the IP limiting and it all works and the server has no other bugs so far from any of the code changes.
And where is this post? Am I missing something?
Aramid
06-14-2008, 09:16 AM
And where is this post? Am I missing something?
I believe he was referring to this one: http://www.eqemulator.net/forums/showthread.php?t=25391
Angelox
06-14-2008, 01:23 PM
Scorpious2k, I hope you can use this;
zonedump.h
--- source-1110/zone/zonedump.h 2008-04-09 04:08:33.000000000 -0400
+++ source-patched/zone/zonedump.h 2008-06-11 06:00:20.000000000 -0400
@@ -189,7 +189,7 @@
int32 db_id;
int8 door_id;
char zone_name[16];
-char door_name[16];
+char door_name[32];
float pos_x;
float pos_y;
float pos_z;
Titanium_structs.h
--- source-1110/common/patches/Titanium_structs.h 2007-08-27 01:41:44.000000000 -0400
+++ source-patched/common/patches/Titanium_structs.h 2008-06-11 06:05:04.000000000 -0400
@@ -2007,8 +2007,7 @@
*/
struct Door_Struct
{
-/*0000*/ char name[16]; // Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade
-/*0016*/ char unknown0016[16];
+/*0000*/ char name[32]; // Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade
/*0032*/ float yPos; // y loc
/*0036*/ float xPos; // x loc
/*0040*/ float zPos; // z loc
schema.xml
--- source-1110/utils/schema.xml 2005-04-24 12:21:44.000000000 -0400
+++ source-patched/utils/schema.xml 2008-06-11 07:23:25.000000000 -0400
@@ -1265,7 +1265,7 @@
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
-<COLUMN ID="4909" ColName="name" PrevColName="" Pos="4" idDatatype="20" DatatypeParams="(16)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<COLUMN ID="4909" ColName="name" PrevColName="" Pos="4" idDatatype="20" DatatypeParams="(32)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
<OPTIONSELECTED>
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
Live_structs.h
--- source-1110/common/patches/Live_structs.h 2007-02-15 19:04:32.000000000 -0500
+++ source-patched/common/patches/Live_structs.h 2008-06-11 06:04:15.000000000 -0400
@@ -1997,8 +1997,7 @@
*/
struct Door_Struct
{
-/*0000*/ char name[16]; // Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade
-/*0016*/ char unknown0016[16];
+/*0000*/ char name[32]; // Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade
/*0032*/ float yPos; // y loc
/*0036*/ float xPos; // x loc
/*0040*/ float zPos; // z loc
eq_packet_structs.h
--- source-1110/common/eq_packet_structs.h 2008-04-13 12:11:06.000000000 -0400
+++ source-patched/common/eq_packet_structs.h 2008-06-10 17:42:43.000000000 -0400
@@ -2049,8 +2049,7 @@
*/
struct Door_Struct
{
-/*0000*/ char name[16]; // Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade
-/*0016*/ char unknown0016[16];
+/*0000*/ char name[32]; // Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade
/*0032*/ float yPos; // y loc
/*0036*/ float xPos; // x loc
/*0040*/ float zPos; // z loc
entity.cpp
--- source-1110/zone/entity.cpp 2008-05-30 18:44:12.000000000 -0400
+++ source-patched/zone/entity.cpp 2008-06-11 05:54:58.000000000 -0400
@@ -664,7 +664,7 @@
door = iterator.GetData();
if(door && strlen(door->GetDoorName()) > 3){
memset(&nd, 0, sizeof(nd));
- memcpy(nd.name, door->GetDoorName(), 16);
+ memcpy(nd.name, door->GetDoorName(), 32);
nd.xPos = door->GetX();
nd.yPos = door->GetY();
nd.zPos = door->GetZ();
doors.h
--- source-1110/zone/doors.h 2008-04-09 04:08:33.000000000 -0400
+++ source-patched/zone/doors.h 2008-06-11 08:36:45.000000000 -0400
@@ -56,7 +56,7 @@
int32 db_id;
sint8 door_id;
char zone_name[16];
-char door_name[16];
+char door_name[32];
float pos_x;
float pos_y;
float pos_z;
doors.cpp
--- source-1110/zone/doors.cpp 2008-04-09 04:08:33.000000000 -0400
+++ source-patched/zone/doors.cpp 2008-06-11 08:35:49.000000000 -0400
@@ -39,7 +39,7 @@
db_id = door->db_id;
door_id = door->door_id;
strncpy(zone_name,door->zone_name,16);
- strncpy(door_name,door->door_name,16);
+ strncpy(door_name,door->door_name,32);
pos_x = door->pos_x;
pos_y = door->pos_y;
pos_z = door->pos_z;
@@ -458,7 +458,7 @@
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);
+ strncpy(into[r].door_name,row[3],32);
into[r].pos_x = (float)atof(row[4]);
into[r].pos_y = (float)atof(row[5]);
into[r].pos_z = (float)atof(row[6]);
dbmemshare.cpp
--- source-1110/common/dbmemshare.cpp 2006-03-18 23:09:26.000000000 -0500
+++ source-patched/common/dbmemshare.cpp 2008-06-11 05:59:15.000000000 -0400
@@ -98,7 +98,7 @@
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);
+ strncpy(tmpDoor.door_name,row[3],32);
tmpDoor.pos_x = (float)atof(row[4]);
tmpDoor.pos_y = (float)atof(row[5]);
tmpDoor.pos_z = (float)atof(row[6]);
Client62_structs.h
--- source-1110/common/patches/Client62_structs.h 2007-02-15 19:04:32.000000000 -0500
+++ source-patched/common/patches/Client62_structs.h 2008-06-11 06:02:53.000000000 -0400
@@ -1944,8 +1944,7 @@
*/
struct Door_Struct
{
-/*0000*/ char name[16]; // Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade
-/*0016*/ char unknown0016[16];
+/*0000*/ char name[32]; // Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade
/*0032*/ float yPos; // y loc
/*0036*/ float xPos; // x loc
/*0040*/ float zPos; // z loc
Anniversary_structs.h
--- source-1110/common/patches/Anniversary_structs.h 2007-08-05 17:13:12.000000000 -0400
+++ source-patched/common/patches/Anniversary_structs.h 2008-06-11 06:03:30.000000000 -0400
@@ -2083,8 +2083,7 @@
*/
struct Door_Struct
{
-/*0000*/ char name[16]; // Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade
-/*0016*/ char unknown0016[16];
+/*0000*/ char name[32]; // Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade
/*0032*/ float yPos; // y loc
/*0036*/ float xPos; // x loc
/*0040*/ float zPos; // z loc
This was done against the current official 1110 source
If it's not right, tell me how it needs to look for you
Scorpious2k
06-15-2008, 08:08 PM
This should all be in version 1111 which I updated last night.
Good work all!
Angelox
06-15-2008, 10:30 PM
These got left out of the 1111 update;
Titanium_structs.h
--- source-1110/common/patches/Titanium_structs.h 2007-08-27 01:41:44.000000000 -0400
+++ source-patched/common/patches/Titanium_structs.h 2008-06-11 06:05:04.000000000 -0400
@@ -2007,8 +2007,7 @@
*/
struct Door_Struct
{
-/*0000*/ char name[16]; // Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade
-/*0016*/ char unknown0016[16];
+/*0000*/ char name[32]; // Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade
/*0032*/ float yPos; // y loc
/*0036*/ float xPos; // x loc
/*0040*/ float zPos; // z loc
Live_structs.h
--- source-1110/common/patches/Live_structs.h 2007-02-15 19:04:32.000000000 -0500
+++ source-patched/common/patches/Live_structs.h 2008-06-11 06:04:15.000000000 -0400
@@ -1997,8 +1997,7 @@
*/
struct Door_Struct
{
-/*0000*/ char name[16]; // Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade
-/*0016*/ char unknown0016[16];
+/*0000*/ char name[32]; // Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade
/*0032*/ float yPos; // y loc
/*0036*/ float xPos; // x loc
/*0040*/ float zPos; // z loc
Client62_structs.h
--- source-1110/common/patches/Client62_structs.h 2007-02-15 19:04:32.000000000 -0500
+++ source-patched/common/patches/Client62_structs.h 2008-06-11 06:02:53.000000000 -0400
@@ -1944,8 +1944,7 @@
*/
struct Door_Struct
{
-/*0000*/ char name[16]; // Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade
-/*0016*/ char unknown0016[16];
+/*0000*/ char name[32]; // Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade
/*0032*/ float yPos; // y loc
/*0036*/ float xPos; // x loc
/*0040*/ float zPos; // z loc
Anniversary_structs.h
--- source-1110/common/patches/Anniversary_structs.h 2007-08-05 17:13:12.000000000 -0400
+++ source-patched/common/patches/Anniversary_structs.h 2008-06-11 06:03:30.000000000 -0400
@@ -2083,8 +2083,7 @@
*/
struct Door_Struct
{
-/*0000*/ char name[16]; // Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade
-/*0016*/ char unknown0016[16];
+/*0000*/ char name[32]; // Filename of Door // Was 10char long before... added the 6 in the next unknown to it: Daeken M. BlackBlade
/*0032*/ float yPos; // y loc
/*0036*/ float xPos; // x loc
/*0040*/ float zPos; // z loc
Scorpious2k
06-17-2008, 07:37 PM
These got left out of the 1111 update;
Got it, thanks. Should be there now with a couple of other changes.
Will update in a few minutes.
Angelox
06-22-2008, 12:25 AM
I still see one more for the door fix that's not changed yet;
--- source-1110/utils/schema.xml 2005-04-24 12:21:44.000000000 -0400
+++ source-patched/utils/schema.xml 2008-06-11 07:23:25.000000000 -0400
@@ -1265,7 +1265,7 @@
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
</COLUMN>
-<COLUMN ID="4909" ColName="name" PrevColName="" Pos="4" idDatatype="20" DatatypeParams="(16)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
+<COLUMN ID="4909" ColName="name" PrevColName="" Pos="4" idDatatype="20" DatatypeParams="(32)" Width="0" Prec="0" PrimaryKey="0" NotNull="1" AutoInc="0" IsForeignKey="0" DefaultValue="" Comments="">
<OPTIONSELECTED>
<OPTIONSELECT Value="0" />
</OPTIONSELECTED>
trevius
06-22-2008, 02:17 AM
LOL, when I put that list together, I did it mainly just by searching for doors and anything set to 16 for the name field. I am not even sure if that schema.xml is still used or what it is used for. But, the doors are definitely working great now, so might not be much reason to change it other than to keep consistency.
vBulletin® v3.8.11, Copyright ©2000-2025, vBulletin Solutions Inc.