From 7882f809d37fc0ee42f6c2df399e2337786b0029 Mon Sep 17 00:00:00 2001 From: shlainn Date: Thu, 4 Mar 2010 19:32:33 +0000 Subject: [PATCH] * Fixed make install (irrlicht now does not try to install) * Updated SysDefs to work better on 64bit systems, please report problems on 32bit systems * Various x64 related fixes * Updated movementflags to recent mangos version * ... and fixed movement packets. not sure if that is the best way... --- src/Client/GUI/Makefile.am | 2 +- src/Client/World/MovementMgr.cpp | 33 ++++++++--------- src/Client/World/MovementMgr.h | 2 +- src/Client/World/UpdateData.cpp | 12 +++---- src/Client/World/UpdateData.h | 59 +++++++++++++++++-------------- src/Client/World/WorldSession.cpp | 5 ++- src/dep/src/irrlicht/Makefile | 6 ++-- src/shared/ByteBuffer.h | 19 ++++++++++ src/shared/SysDefs.h | 4 +-- src/shared/tools.cpp | 4 +-- 10 files changed, 85 insertions(+), 61 deletions(-) diff --git a/src/Client/GUI/Makefile.am b/src/Client/GUI/Makefile.am index 6ee6576..ef95ea0 100644 --- a/src/Client/GUI/Makefile.am +++ b/src/Client/GUI/Makefile.am @@ -1,5 +1,5 @@ ## Process this file with automake to produce Makefile.in -AM_CPPFLAGS = -I$(top_builddir)/src/Client -I$(top_builddir)/src/shared -I$(top_builddir)/src/Client/DefScript -I$(top_builddir)/src/Client/World -I$(top_builddir)/src/Client/Realm -I$(top_builddir)/src/dep/include -Wall -D_DEBUG +AM_CPPFLAGS = -I$(top_builddir)/src/Client -I$(top_builddir)/src/shared -I$(top_builddir)/src/Client/DefScript -I$(top_builddir)/src/Client/World -I$(top_builddir)/src/Client/Realm -I$(top_builddir)/src/dep/include -Wall ## Build pseuwow noinst_LIBRARIES = libgui.a libgui_a_SOURCES =CCursorController.cpp DrawObject.cpp MInput.h Scene.h SImage.h\ diff --git a/src/Client/World/MovementMgr.cpp b/src/Client/World/MovementMgr.cpp index bef07db..232da1b 100644 --- a/src/Client/World/MovementMgr.cpp +++ b/src/Client/World/MovementMgr.cpp @@ -32,9 +32,10 @@ void MovementMgr::SetInstance(PseuInstance *inst) void MovementMgr::_BuildPacket(uint16 opcode) { - WorldPacket *wp = new WorldPacket(opcode,4+1+4+12); // it can be larger, if we are jumping, on transport or swimming + WorldPacket *wp = new WorldPacket(opcode,4+2+4+16); // it can be larger, if we are jumping, on transport or swimming + wp->appendPackGUID(_mychar->GetGUID()); *wp << _moveFlags; - *wp << (uint16)0; // unk + *wp << (uint16)0; // flags2 , safe to set 0 for now (shlainn) *wp << getMSTime(); *wp << _mychar->GetPosition(); // TODO: transport not yet handled/done @@ -50,7 +51,7 @@ void MovementMgr::_BuildPacket(uint16 opcode) *wp << (float)0; // angle; 1.55=looking up, -1.55=looking down, 0=looking forward } *wp << (uint32)0; // last fall time (also used when jumping) - if(_moveFlags & MOVEMENTFLAG_JUMPING) + if(_moveFlags & MOVEMENTFLAG_PENDINGSTOP) { *wp << (float)0; //unk value, or as mangos calls it: j_unk ^^ *wp << sin(_mychar->GetO()+ (M_PI/2)); @@ -165,7 +166,7 @@ void MovementMgr::MoveStop(void) { if(!(_moveFlags & (MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_BACKWARD))) return; - _moveFlags &= ~(MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_BACKWARD | MOVEMENTFLAG_WALK); + _moveFlags &= ~(MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_BACKWARD | MOVEMENTFLAG_WALK_MODE); Update(true); _BuildPacket(MSG_MOVE_STOP); } @@ -184,7 +185,7 @@ void MovementMgr::MoveStartBackward(void) { if(_moveFlags & MOVEMENTFLAG_BACKWARD) return; - _moveFlags |= (MOVEMENTFLAG_BACKWARD | MOVEMENTFLAG_WALK); // backward walk is always slow; flag must be set, otherwise causing weird movement in other client + _moveFlags |= (MOVEMENTFLAG_BACKWARD | MOVEMENTFLAG_WALK_MODE); // backward walk is always slow; flag must be set, otherwise causing weird movement in other client _moveFlags &= ~MOVEMENTFLAG_FORWARD; Update(true); _BuildPacket(MSG_MOVE_START_BACKWARD); @@ -222,29 +223,29 @@ void MovementMgr::MoveStopStrafe(void) void MovementMgr::MoveStartTurnLeft(void) { - if(_moveFlags & MOVEMENTFLAG_LEFT) + if(_moveFlags & MOVEMENTFLAG_TURN_LEFT) return; - _moveFlags |= MOVEMENTFLAG_LEFT; - _moveFlags &= ~MOVEMENTFLAG_RIGHT; + _moveFlags |= MOVEMENTFLAG_TURN_LEFT; + _moveFlags &= ~MOVEMENTFLAG_TURN_RIGHT; Update(true); _BuildPacket(MSG_MOVE_START_TURN_LEFT); } void MovementMgr::MoveStartTurnRight(void) { - if(_moveFlags & MOVEMENTFLAG_RIGHT) + if(_moveFlags & MOVEMENTFLAG_TURN_RIGHT) return; - _moveFlags |= MOVEMENTFLAG_RIGHT; - _moveFlags &= ~MOVEMENTFLAG_LEFT; + _moveFlags |= MOVEMENTFLAG_TURN_RIGHT; + _moveFlags &= ~MOVEMENTFLAG_TURN_LEFT; Update(true); _BuildPacket(MSG_MOVE_START_TURN_RIGHT); } void MovementMgr::MoveStopTurn(void) { - if(!(_moveFlags & (MOVEMENTFLAG_LEFT | MOVEMENTFLAG_RIGHT))) + if(!(_moveFlags & (MOVEMENTFLAG_TURN_LEFT | MOVEMENTFLAG_TURN_RIGHT))) return; - _moveFlags &= ~(MOVEMENTFLAG_LEFT | MOVEMENTFLAG_RIGHT); + _moveFlags &= ~(MOVEMENTFLAG_TURN_LEFT | MOVEMENTFLAG_TURN_RIGHT); Update(true); _BuildPacket(MSG_MOVE_STOP_TURN); } @@ -257,9 +258,9 @@ void MovementMgr::MoveSetFacing(void) void MovementMgr::MoveJump(void) { - if(!(_moveFlags & (MOVEMENTFLAG_JUMPING | MOVEMENTFLAG_FALLING))) + if(!(_moveFlags & (MOVEMENTFLAG_FALLING | MOVEMENTFLAG_PENDINGSTOP))) return; - _moveFlags |= MOVEMENTFLAG_JUMPING; + _moveFlags |= MOVEMENTFLAG_FALLING; Update(true); _BuildPacket(MSG_MOVE_JUMP); } @@ -271,7 +272,7 @@ bool MovementMgr::IsMoving(void) bool MovementMgr::IsTurning(void) { - return _moveFlags & (MOVEMENTFLAG_LEFT | MOVEMENTFLAG_RIGHT); + return _moveFlags & (MOVEMENTFLAG_TURN_LEFT | MOVEMENTFLAG_TURN_RIGHT); } bool MovementMgr::IsWalking(void) diff --git a/src/Client/World/MovementMgr.h b/src/Client/World/MovementMgr.h index f4bb49a..fc337f8 100644 --- a/src/Client/World/MovementMgr.h +++ b/src/Client/World/MovementMgr.h @@ -15,7 +15,7 @@ enum MovementFlagsEx { // custom flags MOVEMENTFLAG_ANY_MOVE = (MOVEMENTFLAG_BACKWARD | MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_STRAFE_LEFT | MOVEMENTFLAG_STRAFE_RIGHT - | MOVEMENTFLAG_LEFT | MOVEMENTFLAG_RIGHT), + | MOVEMENTFLAG_TURN_LEFT | MOVEMENTFLAG_TURN_RIGHT), MOVEMENTFLAG_ANY_MOVE_NOT_TURNING = (MOVEMENTFLAG_BACKWARD | MOVEMENTFLAG_FORWARD | MOVEMENTFLAG_STRAFE_LEFT | MOVEMENTFLAG_STRAFE_RIGHT) }; diff --git a/src/Client/World/UpdateData.cpp b/src/Client/World/UpdateData.cpp index 2ce2aa4..abbefbc 100644 --- a/src/Client/World/UpdateData.cpp +++ b/src/Client/World/UpdateData.cpp @@ -277,22 +277,22 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r logdev("TRANSPORT @ mi.flags: guid="I64FMT" x=%f y=%f z=%f o=%f", mi.t_guid, mi.t_x, mi.t_y, mi.t_z, mi.t_o); } - if((mi.flags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_UNK5)) || (mi.unkFlags & 0x20)) + if((mi.flags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING)) || (mi.unkFlags & 0x20)) //The last one is MOVEFLAG2_ALLOW_PITCHING in MaNGOS { recvPacket >> mi.s_angle; - logdev("MovementUpdate: MOVEMENTFLAG_SWIMMING is set, angle = %f!", mi.s_angle); + logdev("MovementUpdate: MOVEMENTFLAG_SWIMMING or FLYING is set, angle = %f!", mi.s_angle); } recvPacket >> mi.fallTime; logdev("MovementUpdate: FallTime = %u", mi.fallTime); - if(mi.flags & MOVEMENTFLAG_JUMPING) + if(mi.flags & MOVEMENTFLAG_FALLING) { recvPacket >> mi.j_unk >> mi.j_sinAngle >> mi.j_cosAngle >> mi.j_xyspeed; - logdev("MovementUpdate: MOVEMENTFLAG_JUMPING is set, unk=%f sinA=%f cosA=%f xyspeed=%f = %u", mi.j_unk, mi.j_sinAngle, mi.j_cosAngle, mi.j_xyspeed); + logdev("MovementUpdate: MOVEMENTFLAG_FALLING is set, unk=%f sinA=%f cosA=%f xyspeed=%f = %u", mi.j_unk, mi.j_sinAngle, mi.j_cosAngle, mi.j_xyspeed); } - if(mi.flags & MOVEMENTFLAG_SPLINE) + if(mi.flags & MOVEMENTFLAG_SPLINE_ELEVATION) { recvPacket >> mi.u_unk1; logdev("MovementUpdate: MOVEMENTFLAG_SPLINE is set, got %u", mi.u_unk1); @@ -317,7 +317,7 @@ void WorldSession::_MovementUpdate(uint8 objtypeid, uint64 uguid, WorldPacket& r } // TODO: correct this one as soon as its meaning is known OR if it appears often and needs to be fixed - if(mi.flags & MOVEMENTFLAG_SPLINE2) + if(mi.flags & MOVEMENTFLAG_SPLINE_ENABLED) { logerror("MovementUpdate: MOVEMENTFLAG_SPLINE2 is set, if you see this message please report it!"); return; diff --git a/src/Client/World/UpdateData.h b/src/Client/World/UpdateData.h index 8e6f210..424ab9b 100644 --- a/src/Client/World/UpdateData.h +++ b/src/Client/World/UpdateData.h @@ -28,33 +28,38 @@ enum OBJECT_UPDATE_FLAGS enum MovementFlags { - MOVEMENTFLAG_NONE = 0x00000000, - MOVEMENTFLAG_FORWARD = 0x00000001, - MOVEMENTFLAG_BACKWARD = 0x00000002, - MOVEMENTFLAG_STRAFE_LEFT = 0x00000004, - MOVEMENTFLAG_STRAFE_RIGHT = 0x00000008, - MOVEMENTFLAG_LEFT = 0x00000010, - MOVEMENTFLAG_RIGHT = 0x00000020, - MOVEMENTFLAG_PITCH_UP = 0x00000040, - MOVEMENTFLAG_PITCH_DOWN = 0x00000080, - MOVEMENTFLAG_WALK = 0x00000100, - MOVEMENTFLAG_ONTRANSPORT = 0x00000200, - MOVEMENTFLAG_UNK1 = 0x00000400, - MOVEMENTFLAG_FLY_UNK1 = 0x00000800, - MOVEMENTFLAG_JUMPING = 0x00001000, - MOVEMENTFLAG_UNK4 = 0x00002000, - MOVEMENTFLAG_FALLING = 0x00004000, - // 0x8000, 0x10000, 0x20000, 0x40000, 0x80000, 0x100000 - MOVEMENTFLAG_SWIMMING = 0x00200000, // appears with fly flag also - MOVEMENTFLAG_FLY_UP = 0x00400000, - MOVEMENTFLAG_CAN_FLY = 0x00800000, - MOVEMENTFLAG_FLYING = 0x01000000, - MOVEMENTFLAG_UNK5 = 0x02000000, - MOVEMENTFLAG_SPLINE = 0x04000000, // probably wrong name - MOVEMENTFLAG_SPLINE2 = 0x08000000, - MOVEMENTFLAG_WATERWALKING = 0x10000000, - MOVEMENTFLAG_SAFE_FALL = 0x20000000, // active rogue safe fall spell (passive) - MOVEMENTFLAG_UNK3 = 0x40000000 + MOVEMENTFLAG_NONE = 0x00000000, + MOVEMENTFLAG_FORWARD = 0x00000001, + MOVEMENTFLAG_BACKWARD = 0x00000002, + MOVEMENTFLAG_STRAFE_LEFT = 0x00000004, + MOVEMENTFLAG_STRAFE_RIGHT = 0x00000008, + MOVEMENTFLAG_TURN_LEFT = 0x00000010, + MOVEMENTFLAG_TURN_RIGHT = 0x00000020, + MOVEMENTFLAG_PITCH_UP = 0x00000040, + MOVEMENTFLAG_PITCH_DOWN = 0x00000080, + MOVEMENTFLAG_WALK_MODE = 0x00000100, // Walking + MOVEMENTFLAG_ONTRANSPORT = 0x00000200, + MOVEMENTFLAG_LEVITATING = 0x00000400, + MOVEMENTFLAG_ROOT = 0x00000800, + MOVEMENTFLAG_FALLING = 0x00001000, + MOVEMENTFLAG_FALLINGFAR = 0x00002000, + MOVEMENTFLAG_PENDINGSTOP = 0x00004000, + MOVEMENTFLAG_PENDINGSTRAFESTOP = 0x00008000, + MOVEMENTFLAG_PENDINGFORWARD = 0x00010000, + MOVEMENTFLAG_PENDINGBACKWARD = 0x00020000, + MOVEMENTFLAG_PENDINGSTRAFELEFT = 0x00040000, + MOVEMENTFLAG_PENDINGSTRAFERIGHT = 0x00080000, + MOVEMENTFLAG_PENDINGROOT = 0x00100000, + MOVEMENTFLAG_SWIMMING = 0x00200000, // appears with fly flag also + MOVEMENTFLAG_ASCENDING = 0x00400000, // swim up also + MOVEMENTFLAG_DESCENDING = 0x00800000, // swim down also + MOVEMENTFLAG_CAN_FLY = 0x01000000, // can fly in 3.3? + MOVEMENTFLAG_FLYING = 0x02000000, // Actual flying mode + MOVEMENTFLAG_SPLINE_ELEVATION = 0x04000000, // used for flight paths + MOVEMENTFLAG_SPLINE_ENABLED = 0x08000000, // used for flight paths + MOVEMENTFLAG_WATERWALKING = 0x10000000, // prevent unit from falling through water + MOVEMENTFLAG_SAFE_FALL = 0x20000000, // active rogue safe fall spell (passive) + MOVEMENTFLAG_HOVER = 0x40000000 }; struct MovementInfo diff --git a/src/Client/World/WorldSession.cpp b/src/Client/World/WorldSession.cpp index d0752e4..cfd3477 100644 --- a/src/Client/World/WorldSession.cpp +++ b/src/Client/World/WorldSession.cpp @@ -183,7 +183,6 @@ void WorldSession::HandleWorldPacket(WorldPacket *packet) bool known = false; uint16 hpos; - logdebug("Handling packet with opcode %u",packet->GetOpcode()); for (hpos = 0; table[hpos].handler != NULL; hpos++) { if (table[hpos].opcode == packet->GetOpcode()) @@ -1068,9 +1067,9 @@ void WorldSession::_HandleMovementOpcode(WorldPacket& recvPacket) uint32 flags, time, unk32; float x, y, z, o; uint64 guid; - uint16 unk16; + uint16 flags2; guid = recvPacket.GetPackedGuid(); - recvPacket >> flags >> unk16 >> time >> x >> y >> z >> o >> unk32; + recvPacket >> flags >> flags2 >> time >> x >> y >> z >> o >> unk32; DEBUG(logdebug("MOVE: "I64FMT" -> time=%u flags=0x%X x=%.4f y=%.4f z=%.4f o=%.4f",guid,time,flags,x,y,z,o)); Object *obj = objmgr.GetObj(guid); if(obj && obj->IsWorldObject()) diff --git a/src/dep/src/irrlicht/Makefile b/src/dep/src/irrlicht/Makefile index 04218b2..614a96e 100644 --- a/src/dep/src/irrlicht/Makefile +++ b/src/dep/src/irrlicht/Makefile @@ -126,9 +126,9 @@ sharedlib_osx: $(LINKOBJ) # Installs Irrlicht if it was created as shared lib install: - cp $(LIB_PATH)/$(SHARED_LIB).$(VERSION) $(INSTALL_DIR) - cd $(INSTALL_DIR) && ln -s libIrrlicht.so.$(VERSION) $(SHARED_LIB) - ldconfig -n $(INSTALL_DIR) +# cp $(LIB_PATH)/$(SHARED_LIB).$(VERSION) $(INSTALL_DIR) +# cd $(INSTALL_DIR) && ln -s libIrrlicht.so.$(VERSION) $(SHARED_LIB) +# ldconfig -n $(INSTALL_DIR) install_osx: cp $(LIB_PATH)/$(SHARED_LIB).$(VERSION) $(INSTALL_DIR) diff --git a/src/shared/ByteBuffer.h b/src/shared/ByteBuffer.h index 9bf9525..d336415 100644 --- a/src/shared/ByteBuffer.h +++ b/src/shared/ByteBuffer.h @@ -272,6 +272,25 @@ class ByteBuffer if(buffer.size()) append(buffer.contents(),buffer.size()); } + void appendPackGUID(uint64 guid) + { + if (_storage.size() < _wpos + sizeof(guid) + 1) + _storage.resize(_wpos + sizeof(guid) + 1); + + size_t mask_position = wpos(); + *this << uint8(0); + for(uint8 i = 0; i < 8; ++i) + { + if(guid & 0xFF) + { + _storage[mask_position] |= uint8(1 << i); + *this << uint8(guid & 0xFF); + } + + guid >>= 8; + } + } + void put(size_t pos, const uint8 *src, size_t cnt) { memcpy(&_storage[pos], src, cnt); diff --git a/src/shared/SysDefs.h b/src/shared/SysDefs.h index dc187ab..f2dd9e3 100644 --- a/src/shared/SysDefs.h +++ b/src/shared/SysDefs.h @@ -75,11 +75,11 @@ #define I64FMTD "%llu" #define SI64FMTD "%lld" typedef long long int64; - typedef long int32; + typedef int int32; typedef short int16; typedef char int8; typedef unsigned long long uint64; - typedef unsigned long uint32; + typedef unsigned int uint32; typedef unsigned short uint16; typedef unsigned char uint8; typedef unsigned short WORD; diff --git a/src/shared/tools.cpp b/src/shared/tools.cpp index 1bb2dcf..c2e4dee 100644 --- a/src/shared/tools.cpp +++ b/src/shared/tools.cpp @@ -240,7 +240,7 @@ void _FixFileName(std::string& str) // extracts the file name from a given path std::string _PathToFileName(std::string str) { - uint32 pathend = str.find_last_of("/\\"); + size_t pathend = str.find_last_of("/\\"); if(pathend != std::string::npos) { return str.substr(pathend+1); @@ -250,7 +250,7 @@ std::string _PathToFileName(std::string str) std::string NormalizeFilename(std::string s) { - uint32 p; + size_t p; while( (p = s.find('\\')) != std::string::npos)//Replace \ by / { s.replace(p,1,"/");