Go Back   EQEmulator Home > EQEmulator Forums > Support > Support::Linux Servers

Support::Linux Servers Support forum for Linux EQEMu users.

Reply
 
Thread Tools Display Modes
  #1  
Old 06-14-2009, 03:09 PM
KingMort
Banned
 
Join Date: Sep 2006
Posts: 841
Default Strangeness

Well we have been having very strange issues from what I can tell looks like a Map issue perhaps? Anyway after we moved to the new server and are running in 64 bit.. Well mobs just agro right through walls... And now instead of AE's being blocked by everything (which sucked) Outdoor hills, rocks, tree's everything anyway now NOTHING blocks them...

Sucks for new players to be in the n00b zone and try and pull a mob and have 15 aggro them through the wall...

Any Ideas folks ?

King
Reply With Quote
  #2  
Old 06-14-2009, 06:04 PM
gaeorn
Developer
 
Join Date: Apr 2009
Location: USA
Posts: 478
Default

I'll see if I can reproduce this on my system. If so, then I should be able to track it down eventually.
Reply With Quote
  #3  
Old 06-14-2009, 06:06 PM
KingMort
Banned
 
Join Date: Sep 2006
Posts: 841
Default

Sure if you need our source let me know.. I doubt it's any of our customizations but hell you never know..

King
Reply With Quote
  #4  
Old 06-15-2009, 09:03 PM
gaeorn
Developer
 
Join Date: Apr 2009
Location: USA
Posts: 478
Default

I've not had a chance to look into this much thus far. I just wanted you to know I haven't forgotten about it.
Reply With Quote
  #5  
Old 06-18-2009, 12:29 AM
gaeorn
Developer
 
Join Date: Apr 2009
Location: USA
Posts: 478
Default

Found some significant problems with the map code for 64bit. I've made some changes but have not yet tested them. I'll post a patch as soon as I have tested.
Reply With Quote
  #6  
Old 06-18-2009, 01:20 AM
gaeorn
Developer
 
Join Date: Apr 2009
Location: USA
Posts: 478
Default

So, because of the problems with the way the code was written to load map files, they actually were not being loaded at all under 64bit. This patch should correct this for regular maps.

Code:
Index: zone/map.h
===================================================================
--- zone/map.h  (revision 687)
+++ zone/map.h  (working copy)
@@ -56,11 +56,11 @@
 }FACE, *PFACE;

 typedef struct _mapHeader {
-       unsigned long version;
+       uint32 version;
 //     unsigned long vertex_count;
-       unsigned long face_count;
-       unsigned short node_count;
-       unsigned long facelist_count;
+       uint32 face_count;
+       uint16 node_count;
+       uint32 facelist_count;
 } mapHeader;

 /*
@@ -95,12 +95,12 @@
        float maxx;
        float maxy;

-       unsigned char flags;
+       uint8 flags;
        union {
-               unsigned short nodes[4];        //index 0 means NULL, not root
+               uint16 nodes[4];        //index 0 means NULL, not root
                struct {
-                       unsigned long count;
-                       unsigned long offset;
+                       uint32 count;
+                       uint32 offset;
                } faces;
        };
 } nodeHeader, NODE, *PNODE;
@@ -111,7 +111,7 @@
 #define NODE_NONE 65534
 #define MAP_ROOT_NODE 0

-typedef unsigned short NodeRef;
+typedef uint16 NodeRef;

 /*typedef struct _node {
        nodeHeader head;
@@ -145,7 +145,7 @@
        bool LineIntersectsZone(VERTEX start, VERTEX end, float step, VERTEX *result, FACE **on = NULL) const;

 //     inline unsigned int             GetVertexNumber( ) {return m_Vertex; }
-       inline unsigned int             GetFacesNumber( ) const { return m_Faces; }
+       inline uint16                   GetFacesNumber( ) const { return m_Faces; }
 //     inline PVERTEX  GetVertex( int _idx ) {return mFinalVertex + _idx;      }
        inline PFACE            GetFace( int _idx) {return mFinalFaces + _idx;          }
        inline PFACE            GetFaceFromlist( int _idx) {return &mFinalFaces[ mFaceLists[_idx] ];    }
@@ -161,13 +161,13 @@
        bool LineIntersectsZoneNoZLeaps(VERTEX start, VERTEX end, float step_mag, VERTEX *result, FACE **on);
 private:
 //     unsigned long m_Vertex;
-       unsigned long m_Faces;
-       unsigned long m_Nodes;
-       unsigned long m_FaceLists;
+       uint32 m_Faces;
+       uint32 m_Nodes;
+       uint32 m_FaceLists;
 //     PVERTEX mFinalVertex;
        PFACE mFinalFaces;
        PNODE mNodes;
-       unsigned long *mFaceLists;
+       uint32 *mFaceLists;


        int mCandFaces[100];
Index: zone/Map.cpp
===================================================================
--- zone/Map.cpp        (revision 687)
+++ zone/Map.cpp        (working copy)
@@ -119,11 +119,11 @@
        if(head.version != MAP_VERSION) {
                //invalid version... if there really are multiple versions,
                //a conversion routine could be possible.
-               printf("Invalid map version 0x%lx\n", head.version);
+               printf("Invalid map version 0x%lx\n", (unsigned long)head.version);
                return(false);
        }

-       printf("Map header: %lu faces, %u nodes, %lu facelists\n", head.face_count, head.node_count, head.facelist_count);
+       printf("Map header: %lu faces, %u nodes, %lu facelists\n", (unsigned long)head.face_count, (unsigned int)head.node_count, (unsigned long)head.facelist_count);

        m_Faces = head.face_count;
        m_Nodes = head.node_count;
@@ -134,24 +134,24 @@
 //     mFinalVertex = new VERTEX[m_Vertex];
        mFinalFaces = new FACE  [m_Faces];
        mNodes = new NODE[m_Nodes];
-       mFaceLists = new unsigned long[m_FaceLists];
+       mFaceLists = new uint32[m_FaceLists];

 //     fread(mFinalVertex, m_Vertex, sizeof(VERTEX), fp);

        //this was changed to this loop from the single read because valgrind was
        //hanging on this read otherwise... I dont pretend to understand it.
 #ifdef SLOW_AND_CRAPPY_MAKES_VALGRIND_HAPPY
-       unsigned long r;
+       uint32 r;
        for(r = 0; r < m_Faces; r++) {
                if(fread(mFinalFaces+r, sizeof(FACE), 1, fp) != 1) {
-                       printf("Unable to read %lu faces from map file, got %lu.\n", m_Faces, r);
+                       printf("Unable to read %lu faces from map file, got %lu.\n", (unsigned long)m_Faces, (unsigned long)r);
                        return(false);
                }
        }
 #else
-       unsigned long count;
+       uint32 count;
        if((count=fread(mFinalFaces, sizeof(FACE), m_Faces , fp)) != m_Faces) {
-               printf("Unable to read %lu face bytes from map file, got %lu.\n", m_Faces, count);
+               printf("Unable to read %lu face bytes from map file, got %lu.\n", (unsigned long)m_Faces, (unsigned long)count);
                return(false);
        }
 #endif
@@ -159,27 +159,27 @@
 #ifdef SLOW_AND_CRAPPY_MAKES_VALGRIND_HAPPY
        for(r = 0; r < m_Nodes; r++) {
                if(fread(mNodes+r, sizeof(NODE), 1, fp) != 1) {
-                       printf("Unable to read %lu nodes from map file, got %lu.\n", m_Nodes, r);
+                       printf("Unable to read %lu nodes from map file, got %lu.\n", (unsigned long)m_Nodes, (unsigned long)r);
                        return(false);
                }
        }
 #else
        if(fread(mNodes, sizeof(NODE), m_Nodes, fp) != m_Nodes) {
-               printf("Unable to read %lu nodes from map file.\n", m_Nodes);
+               printf("Unable to read %lu nodes from map file.\n", (unsigned long)m_Nodes);
                return(false);
        }
 #endif

 #ifdef SLOW_AND_CRAPPY_MAKES_VALGRIND_HAPPY
        for(r = 0; r < m_FaceLists; r++) {
-               if(fread(mFaceLists+r, sizeof(unsigned long), 1, fp) != 1) {
-                       printf("Unable to read %lu face lists from map file, got %lu.\n", m_FaceLists, r);
+               if(fread(mFaceLists+r, sizeof(uint32), 1, fp) != 1) {
+                       printf("Unable to read %lu face lists from map file, got %lu.\n", (unsigned long)m_FaceLists, (unsigned long)r);
                        return(false);
                }
        }
 #else
-       if(fread(mFaceLists, sizeof(unsigned long), m_FaceLists, fp) != m_FaceLists) {
-               printf("Unable to read %lu face lists from map file.\n", m_FaceLists);
+       if(fread(mFaceLists, sizeof(uint32), m_FaceLists, fp) != m_FaceLists) {
+               printf("Unable to read %lu face lists from map file.\n", (unsigned long)m_FaceLists);
                return(false);
        }
 #endif
@@ -188,7 +188,7 @@
 /*     mRoot = new NODE();
        RecLoadNode(mRoot, fp );*/

-       unsigned long i;
+       uint32 i;
        float v;
        for(i = 0; i < m_Faces; i++) {
                v = Vmax3(x, mFinalFaces[i].a, mFinalFaces[i].b, mFinalFaces[i].c);
@@ -210,7 +210,7 @@
                if(v < _minz)
                        _minz = v;
        }
-       printf("Loaded map: %lu vertices, %lu faces\n", m_Faces*3, m_Faces);
+       printf("Loaded map: %lu vertices, %lu faces\n", (unsigned long)m_Faces*3, (unsigned long)m_Faces);
        printf("Map BB: (%.2f -> %.2f, %.2f -> %.2f, %.2f -> %.2f)\n", _minx, _maxx, _miny, _maxy, _minz, _maxz);
        return(true);
 }
@@ -454,7 +454,7 @@
        unsigned long i;

        PFACE cur;
-       const unsigned long *cfl = mFaceLists + _node->faces.offset;
+       const uint32 *cfl = mFaceLists + _node->faces.offset;

        for(i = 0; i < _node->faces.count; i++) {
                if(*cfl > m_Faces)
@@ -508,7 +508,7 @@
        //
        for(zAttempt=1; zAttempt<=2; zAttempt++) {

-               const unsigned long *cfl = mFaceLists + _node->faces.offset;
+               const uint32 *cfl = mFaceLists + _node->faces.offset;

 #ifdef DEBUG_BEST_Z
 printf("Start finding best Z...\n");
I have a patch to get water maps to load, but when I use it, I get segfaults when it starts to check if the character is in water or not. I'm still working on it.
Reply With Quote
  #7  
Old 06-18-2009, 01:33 AM
gaeorn
Developer
 
Join Date: Apr 2009
Location: USA
Posts: 478
Default

A minor correction to the prior patch:

Code:
--- eqemu64/zone/map.h  2009-06-17 22:21:42.000000000 -0700
+++ EQEmuServer/zone/map.h      2009-06-17 22:22:24.000000000 -0700
@@ -145,7 +145,7 @@
        bool LineIntersectsZone(VERTEX start, VERTEX end, float step, VERTEX *result, FACE **on = NULL) const;

 //     inline unsigned int             GetVertexNumber( ) {return m_Vertex; }
-       inline uint16                   GetFacesNumber( ) const { return m_Faces; }
+       inline uint32                   GetFacesNumber( ) const { return m_Faces; }
 //     inline PVERTEX  GetVertex( int _idx ) {return mFinalVertex + _idx;      }
        inline PFACE            GetFace( int _idx) {return mFinalFaces + _idx;          }
        inline PFACE            GetFaceFromlist( int _idx) {return &mFinalFaces[ mFaceLists[_idx] ];    }
Reply With Quote
  #8  
Old 06-18-2009, 01:34 AM
gaeorn
Developer
 
Join Date: Apr 2009
Location: USA
Posts: 478
Default

Here's a patch for water maps.

Code:
Index: zone/watermap.h
===================================================================
--- zone/watermap.h     (revision 687)
+++ zone/watermap.h     (working copy)
@@ -22,11 +22,11 @@

 #pragma pack(1)
 typedef struct ZBSP_Node {
-        long node_number;
+        sint32 node_number;
         float normal[3], splitdistance;
-        long region;
-        int special;
-        long left, right;
+        sint32 region;
+        sint32 special;
+        sint32 left, right;
 } ZBSP_Node;
 #pragma pack()

@@ -43,7 +43,7 @@

 public:
        static WaterMap*  LoadWaterMapfile(const char* in_zonename, const char *directory = NULL);
-        WaterRegionType BSPReturnRegionType(long node_number, float y, float x, float z) const;
+        WaterRegionType BSPReturnRegionType(sint32 node_number, float y, float x, float z) const;
         bool InWater(float y, float x, float z) const;
         bool InLava(float y, float x, float z) const;

Index: zone/watermap.cpp
===================================================================
--- zone/watermap.cpp   (revision 687)
+++ zone/watermap.cpp   (working copy)
@@ -41,7 +41,7 @@
 }


-WaterRegionType WaterMap::BSPReturnRegionType(long node_number, float y, float x, float z) const
+WaterRegionType WaterMap::BSPReturnRegionType(sint32 node_number, float y, float x, float z) const
 {
        float distance;
Reply With Quote
  #9  
Old 06-22-2009, 05:45 PM
gaeorn
Developer
 
Join Date: Apr 2009
Location: USA
Posts: 478
Default

Quote:
Originally Posted by KingMort View Post
Well we have been having very strange issues from what I can tell looks like a Map issue perhaps? Anyway after we moved to the new server and are running in 64 bit.. Well mobs just agro right through walls... And now instead of AE's being blocked by everything (which sucked) Outdoor hills, rocks, tree's everything anyway now NOTHING blocks them...

Sucks for new players to be in the n00b zone and try and pull a mob and have 15 aggro them through the wall...

Any Ideas folks ?

King
Did the above patches resolve the problems you were seeing?
Reply With Quote
  #10  
Old 06-25-2009, 03:47 PM
KingMort
Banned
 
Join Date: Sep 2006
Posts: 841
Default

Not sure yet hopefully... We are in the process now of upgrading to the newest build.. So should put that in when that happens...

Thanks a ton for the help , I will let you know how it goes..

King
Reply With Quote
  #11  
Old 06-25-2009, 04:29 PM
gaeorn
Developer
 
Join Date: Apr 2009
Location: USA
Posts: 478
Default

The above patches are in the SVN repo now. KLS was kind enough to integrate some of my 64bit patches into the code base.
Reply With Quote
  #12  
Old 06-26-2009, 01:47 PM
KingMort
Banned
 
Join Date: Sep 2006
Posts: 841
Default

Sweet ! Suprised more people haven't encountered stuff like this or are we the only ones in the community compiling with 64bit ?? I haven't heard a word from VZ/TZ even though they also upgraded to a 64 bit system... They have given us no input which makes me believe they compiled with 32bit...

King
Reply With Quote
  #13  
Old 06-26-2009, 04:30 PM
gaeorn
Developer
 
Join Date: Apr 2009
Location: USA
Posts: 478
Default

Quote:
Originally Posted by KingMort View Post
Sweet ! Suprised more people haven't encountered stuff like this or are we the only ones in the community compiling with 64bit ?? I haven't heard a word from VZ/TZ even though they also upgraded to a 64 bit system... They have given us no input which makes me believe they compiled with 32bit...

King
They very well may have. I have not seen any indications of people running 64bit servers on a regular basis. I think I'm the first to be stubborn enough to try to fix the 64bit bugs rather than going back to a 32bit compile.

So you know, I have my repository of the 64bit code available at:
Code:
svn checkout https://www.tsahosting.net/svn/eqemu64/trunk eqemu64
It has all the patches I have come up with for 64bit already applied. I generally keep it within a day of the upstream trunk SVN changes. You can see what revision it is up to by checking the log:
Code:
svn log https://www.tsahosting.net/svn/eqemu64/trunk
It has quite a number of additional patches, including makefile changes, to get it to compile and run cleanly for me. And I keep updating it as I find additional issues.
Reply With Quote
  #14  
Old 07-08-2009, 02:36 PM
staticmg
Fire Beetle
 
Join Date: Jun 2009
Location: Florida
Posts: 7
Default

Hey thanks for the work gaeorn, I will try and use yours on my 64 and let you know if it works.
Reply With Quote
  #15  
Old 07-08-2009, 04:26 PM
gaeorn
Developer
 
Join Date: Apr 2009
Location: USA
Posts: 478
Default

Hehe, I actually got busy with other things so my SVN is a little out of date at the moment. I'll see about getting it caught up.
Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

   

All times are GMT -4. The time now is 02:55 AM.


 

Everquest is a registered trademark of Daybreak Game Company LLC.
EQEmulator is not associated or affiliated in any way with Daybreak Game Company LLC.
Except where otherwise noted, this site is licensed under a Creative Commons License.
       
Powered by vBulletin®, Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Template by Bluepearl Design and vBulletin Templates - Ver3.3