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
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 07:06 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