* fixed server crash when pseuwow was teleported around

* added now required 'winmm.lib' to shared.vcproj
* fixed memory leak with multiply created objects, where already existing objects didnt get deleted.
* forgot to autodelete RealmSession on socket fail
This commit is contained in:
False.Genesis 2007-05-17 18:47:37 +00:00
parent cd99d323e9
commit ec812a9b0f
8 changed files with 75 additions and 17 deletions

View File

@ -137,9 +137,14 @@ void RealmSession::Update(void)
ByteBuffer *pkt; ByteBuffer *pkt;
uint8 cmd; uint8 cmd;
if( _sh.GetCount() ) if( _sh.GetCount() ) // the socket will remove itself from the handler if it got closed
{
_sh.Select(0,0); _sh.Select(0,0);
else // so we just need to check if the socket doesnt exist or if it exists but isnt valid anymore.
{ // if thats the case, we dont need the session anymore either
if(!_socket || (_socket && !_socket->IsOk()))
{
SetMustDie();
}
} }
while(pktQueue.size()) while(pktQueue.size())

View File

@ -204,6 +204,7 @@ public:
void SetActionButtons(WorldPacket &data); void SetActionButtons(WorldPacket &data);
void AddSpell(uint32 spellid, uint16 spellslot); void AddSpell(uint32 spellid, uint16 spellslot);
void RemoveSpell(uint32 spellid); void RemoveSpell(uint32 spellid);
void ClearSpells(void) { _spells.clear(); }
uint64 GetTarget(void) { return _target; } uint64 GetTarget(void) { return _target; }
void SetTarget(uint64 guid) { _target = guid; } // should only be called by WorldSession::SendSetSelection() !! void SetTarget(uint64 guid) { _target = guid; } // should only be called by WorldSession::SendSetSelection() !!
bool HasSpell(uint32 spellid) { return GetSpellSlot(spellid) != 0; } bool HasSpell(uint32 spellid) { return GetSpellSlot(spellid) != 0; }

View File

@ -71,6 +71,13 @@ void WorldSession::_HandleUpdateObjectOpcode(WorldPacket& recvPacket)
uint8 objtypeid; uint8 objtypeid;
recvPacket >> objtypeid; recvPacket >> objtypeid;
logdebug("Create Object type %u with guid "I64FMT,objtypeid,uguid); logdebug("Create Object type %u with guid "I64FMT,objtypeid,uguid);
// dont create objects if already present in memory.
// recreate every object except ourself!
if( uguid != GetGuid() && objmgr.GetObj(uguid))
{
logdev("- already exists, deleting old , creating new object");
objmgr.Remove(uguid);
}
switch(objtypeid) switch(objtypeid)
{ {

View File

@ -93,12 +93,15 @@ void WorldSession::SendWorldPacket(WorldPacket &pkt)
void WorldSession::Update(void) void WorldSession::Update(void)
{ {
if( _sh.GetCount() ) // the socketwil remove itself from the handler if it got closed if( _sh.GetCount() ) // the socket will remove itself from the handler if it got closed
_sh.Select(0,0); _sh.Select(0,0);
else // so we just need to check if the socket doesnt exist or if it exists but isnt valid anymore. else // so we just need to check if the socket doesnt exist or if it exists but isnt valid anymore.
{ // if thats the case, we dont need the session anymore either { // if thats the case, we dont need the session anymore either
if(!_socket || (_socket && !_socket->IsOk())) if(!_socket || (_socket && !_socket->IsOk()))
{
_OnLeaveWorld();
SetMustDie(); SetMustDie();
}
} }
@ -202,6 +205,7 @@ OpcodeHandler *WorldSession::_GetOpcodeHandlerTable() const
{SMSG_CHANNEL_LIST, &WorldSession::_HandleChannelListOpcode}, {SMSG_CHANNEL_LIST, &WorldSession::_HandleChannelListOpcode},
{SMSG_EMOTE, &WorldSession::_HandleEmoteOpcode}, {SMSG_EMOTE, &WorldSession::_HandleEmoteOpcode},
{SMSG_TEXT_EMOTE, &WorldSession::_HandleTextEmoteOpcode}, {SMSG_TEXT_EMOTE, &WorldSession::_HandleTextEmoteOpcode},
{SMSG_NEW_WORLD, &WorldSession::_HandleNewWorldOpcode},
// table termination // table termination
{ 0, NULL } { 0, NULL }
@ -624,23 +628,36 @@ void WorldSession::_HandleMovementOpcode(WorldPacket& recvPacket)
void WorldSession::_HandleTelePortAckOpcode(WorldPacket& recvPacket) void WorldSession::_HandleTelePortAckOpcode(WorldPacket& recvPacket)
{ {
uint8 unk; uint32 unk32,time;
uint16 unk1, unk2;
uint32 unk3, unk4;
uint64 guid; uint64 guid;
float x, y, z, o, ang; float x, y, z, o;
recvPacket >> unk >> guid >> unk3 >> unk1 >> unk2 >> o >> x >> y >> z >> ang >> unk4; guid = recvPacket.GetPackedGuid();
recvPacket >> unk32 >> unk32 >> time >> x >> y >> z >> o >> unk32;
logdetail("Got teleported, data: x: %f, y: %f, z: %f, o: %f, guid: "I64FMT, x, y, z, o, guid); logdetail("Got teleported, data: x: %f, y: %f, z: %f, o: %f, guid: "I64FMT, x, y, z, o, guid);
// TODO: put this into a capsule class later, that autodetects movement flags etc.
WorldPacket response; WorldPacket response;
response.SetOpcode(MSG_MOVE_FALL_LAND); response.SetOpcode(MSG_MOVE_FALL_LAND);
response << uint32(0) << uint32(0) << x << y << z << o << uint32(0); response << uint32(0) << (uint32)getMSTime(); // no flags; time correct?
response << x << y << z << o << uint32(0);
SendWorldPacket(response); SendWorldPacket(response);
} }
void WorldSession::_HandleNewWorldOpcode(WorldPacket& recvPacket)
{
uint32 mapid;
float x,y,z,o;
// we assume we are NOT on a transport!
// else we had to do the following before:
// recvPacket >> tmapid >> tx >> ty >> tz >> to;
recvPacket >> mapid >> x >> y >> z >> o;
GetMyChar()->ClearSpells(); // will be resent by server
// clear action buttons
}
void WorldSession::_HandleChannelNotifyOpcode(WorldPacket& recvPacket) void WorldSession::_HandleChannelNotifyOpcode(WorldPacket& recvPacket)
{ {
_channels->HandleNotifyOpcode(recvPacket); _channels->HandleNotifyOpcode(recvPacket);

View File

@ -87,6 +87,7 @@ private:
void _HandleChannelListOpcode(WorldPacket& recvPacket); void _HandleChannelListOpcode(WorldPacket& recvPacket);
void _HandleEmoteOpcode(WorldPacket& recvPacket); void _HandleEmoteOpcode(WorldPacket& recvPacket);
void _HandleTextEmoteOpcode(WorldPacket& recvPacket); void _HandleTextEmoteOpcode(WorldPacket& recvPacket);
void _HandleNewWorldOpcode(WorldPacket& recvPacket);
void _MovementUpdate(uint8 objtypeid, uint64 guid, WorldPacket& recvPacket); // Helper for _HandleUpdateObjectOpcode void _MovementUpdate(uint8 objtypeid, uint64 guid, WorldPacket& recvPacket); // Helper for _HandleUpdateObjectOpcode
void _ValuesUpdate(uint64 uguid, WorldPacket& recvPacket); // ... void _ValuesUpdate(uint64 uguid, WorldPacket& recvPacket); // ...

View File

@ -38,7 +38,8 @@
<Tool <Tool
Name="VCCustomBuildTool"/> Name="VCCustomBuildTool"/>
<Tool <Tool
Name="VCLibrarianTool"/> Name="VCLibrarianTool"
AdditionalDependencies="winmm.lib"/>
<Tool <Tool
Name="VCMIDLTool" Name="VCMIDLTool"
TypeLibraryName=".\Debug/PseuWoW_Controller.tlb" TypeLibraryName=".\Debug/PseuWoW_Controller.tlb"

View File

@ -2,18 +2,25 @@
#include <cctype> #include <cctype>
#include <sstream> #include <sstream>
#include <string> #include <string>
#include <time.h>
#include <fstream> #include <fstream>
#include <errno.h>
#include "tools.h" #include "tools.h"
#ifndef _WIN32 #if PLATFORM == PLATFORM_WIN32
# include <sys/dir.h>
# include <errno.h>
#else
# include <windows.h> # include <windows.h>
# include <mmsystem.h>
# include <time.h>
#else
# include <sys/dir.h>
# if defined(__FreeBSD__) || defined(__APPLE_CC__)
# include <time.h>
# endif
# include <sys/timeb.h>
#endif #endif
void printchex(std::string in, bool spaces=true){
void printchex(std::string in, bool spaces=true)
{
unsigned int len=0,i; unsigned int len=0,i;
len=in.length(); len=in.length();
printf("["); printf("[");
@ -24,7 +31,8 @@ void printchex(std::string in, bool spaces=true){
printf("]\n"); printf("]\n");
} }
void printchex(char *in, uint32 len, bool spaces=true){ void printchex(char *in, uint32 len, bool spaces=true)
{
unsigned int i; unsigned int i;
printf("["); printf("[");
if(spaces) if(spaces)
@ -147,6 +155,7 @@ bool FileExists(std::string fn)
return false; return false;
} }
// must return true if creating the directory was successful
bool CreateDir(const char *dir) bool CreateDir(const char *dir)
{ {
bool result; bool result;
@ -160,4 +169,20 @@ bool CreateDir(const char *dir)
return result; return result;
} }
// current system time in ms
uint32 getMSTime(void)
{
uint32 time_in_ms = 0;
#if PLATFORM == PLATFORM_WIN32
time_in_ms = timeGetTime();
#else
struct timeb tp;
ftime(&tp);
time_in_ms = tp.time * 1000 + tp.millitm;
#endif
return time_in_ms;
}

View File

@ -18,5 +18,6 @@ std::string toHexDump(uint8* array,uint32 size,bool spaces=true);
std::deque<std::string> GetFileList(std::string); std::deque<std::string> GetFileList(std::string);
bool FileExists(std::string); bool FileExists(std::string);
bool CreateDir(const char*); bool CreateDir(const char*);
uint32 getMSTime(void);
#endif #endif