* 2 opcode fixes by dave, thx

* correced movement packets, server will no longer drop connection when moving
* attempted to fix crash in openGL mode in m2 model loader
* fixed SCPDatabase::GetFieldByString(), thx dave
* added scp files for 3.0.9 client
This commit is contained in:
false_genesis 2009-03-05 21:48:52 +00:00
parent 1c697b84c0
commit 0522c2c786
12 changed files with 390 additions and 129 deletions

View File

@ -16,7 +16,7 @@ name=Rogue
name=Priest
[6]
name=UNKNOWN CLASS(6)
name=Death Knight
[7]
name=Shaman

View File

@ -279,10 +279,34 @@ name=Eye of the Storm
name_general=ZulAman
name=Zul'Aman
[571]
name_general=Northrend
name=Northrend
[572]
name_general=PVPLordaeron
name=Ruins of Lordaeron
[573]
name_general=ExteriorTest
name=ExteriorTest
[574]
name_general=Valgarde70
name=Utgarde Keep
[575]
name_general=UtgardePinnacle
name=Utgarde Pinnacle
[576]
name_general=Nexus70
name=The Nexus
[578]
name_general=Nexus80
name=The Oculus
[580]
name_general=SunwellPlateau
name=The Sunwell
@ -323,11 +347,131 @@ name=Transport: Grom'Gol to Undercity
name_general=Transport164871
name=Transport: Undercity to Orgrimmar
[592]
name_general=Transport186238
name=Transport: Borean Tundra Test
[593]
name_general=Transport20808
name=Transport: Booty Bay to Ratchet
[594]
name_general=Transport187038
name=Transport: Howling Fjord Sister Mercy (Quest)
[595]
name_general=StratholmeCOT
name=The Culling of Stratholme
[596]
name_general=Transport187263
name=Transport: Naglfar
[597]
name_general=CraigTest
name=Craig Test
[598]
name_general=Sunwell5Man
name=Sunwell Fix (Unused)
[599]
name_general=Ulduar70
name=Halls of Stone
[600]
name_general=DrakTheronKeep
name=Drak'Tharon Keep
[601]
name_general=Azjol_Uppercity
name=Azjol-Nerub
[602]
name_general=Ulduar80
name=Halls of Lightning
[603]
name_general=UlduarRaid
name=Ulduar
[604]
name_general=GunDrak
name=Gundrak
[605]
name_general=development_nonweighted
name=Development Land (non-weighted textures)
[606]
name_general=QA_DVD
name=QA and DVD
[607]
name_general=NorthrendBG
name=Strand of the Ancients
[608]
name_general=DalaranPrison
name=Violet Hold
[609]
name_general=DeathKnightStart
name=Ebon Hold
[610]
name_general=Transport_Tirisfal _Vengeance_Landing
name=Transport: Tirisfal to Vengeance Landing
[612]
name_general=Transport_Menethil_Valgarde
name=Transport: Menethil to Valgarde
[613]
name_general=Transport_Orgrimmar_Warsong_Hold
name=Transport: Orgrimmar to Warsong Hold
[614]
name_general=Transport_Stormwind_Valiance_Keep
name=Transport: Stormwind to Valiance Keep
[615]
name_general=ChamberOfAspectsBlack
name=The Obsidian Sanctum
[616]
name_general=NexusRaid
name=The Eye of Eternity
[617]
name_general=DalaranArena
name=Dalaran Sewers
[618]
name_general=OrgrimmarArena
name=The Ring of Valor
[619]
name_general=Azjol_LowerCity
name=Ahn'kahet: The Old Kingdom
[620]
name_general=Transport_Moa'ki_Unu'pe
name=Transport: Moa'ki to Unu'pe
[621]
name_general=Transport_Moa'ki_Kamagua
name=Transport: Moa'ki to Kamagua
[622]
name_general=Transport192241
name=Transport: Orgrim's Hammer
[623]
name_general=Transport192242
name=Transport: The Skybreaker
[624]
name_general=WintergraspRaid
name=Vault of Archavon

View File

@ -119,6 +119,22 @@ faction=7
name_general=Skeleton
name=Skeleton
[16]
model_m=21685
model_f=21686
name_short=Vr
faction=7
name_general=Vrykul
name=Vrykul
[17]
model_m=21780
model_f=21781
name_short=Tu
faction=7
name_general=Tuskarr
name=Tuskarr
[18]
model_m=21963
model_f=21964
@ -127,3 +143,27 @@ faction=7
name_general=ForestTroll
name=Forest Troll
[19]
model_m=26316
model_f=26317
name_short=Wt
faction=7
name_general=Taunka
name=Taunka
[20]
model_m=26871
model_f=26872
name_short=NS
faction=7
name_general=NorthrendSkeleton
name=Northrend Skeleton
[21]
model_m=26873
model_f=26874
name_short=It
faction=7
name_general=IceTroll
name=Ice Troll

View File

@ -556,7 +556,10 @@ for(u32 i=0; i < currentView.nSub;i++)//
Device->getSceneManager()->getMeshManipulator()->flipSurfaces(AnimatedMesh); //Fix inverted surfaces after the rotation
Device->getSceneManager()->getMeshManipulator()->recalculateNormals(AnimatedMesh,true);//just to be sure
// False.Genesis: commented out this problematic line.. was causing crashes for me, since 3.x client models
// SEEMS TO CRASH ONLY IN OPENGL-MODE ?! -- investigate!
//Device->getSceneManager()->getMeshManipulator()->recalculateNormals(AnimatedMesh,true);//just to be sure
AnimatedMesh->setInterpolationMode(scene::EIM_LINEAR);

View File

@ -134,7 +134,7 @@ uint32 SCPDatabase::GetFieldByStringValue(uint32 entry, char *val)
{
for(uint32 row = 0; row < _rowcount; row++)
if(!stricmp(GetStringByOffset(_intbuf[row * _fields_per_row + entry]), val))
return row;
return _indexes_reverse[row];
return SCP_INVALID_INT;
}

View File

@ -34,7 +34,7 @@ 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
*wp << _moveFlags;
*wp << (uint8)0; // unk
*wp << (uint16)0; // unk
*wp << getMSTime();
*wp << _mychar->GetPosition();
// TODO: transport not yet handled/done

View File

@ -149,7 +149,7 @@ public:
float _y;
float _z;
uint32 _guildId;
uint8 _flags;
uint32 _flags;
uint32 _petInfoId;
uint32 _petLevel;
uint32 _petFamilyId;

View File

@ -11,6 +11,7 @@
#include "World.h"
#include "RealmSession.h"
#include "WorldSession.h"
#include "MemoryDataHolder.h"
struct OpcodeHandler
{
@ -533,10 +534,13 @@ void WorldSession::_HandleAuthChallengeOpcode(WorldPacket& recvPacket)
WorldPacket auth;
auth<<(uint32)(GetInstance()->GetConf()->clientbuild)<<unk<<acc<<unk<<clientseed_uint32;
auth.append(digest.GetDigest(),20);
// recvPacket << real_size
// recvPacket << ziped_UI_Plugins_Info
// TODO: add addon data, simulate no addons.
auth<<(uint32)0; // no addons? no idea, but seems to work. MaNGOS doesnt accept without this.
auth << (uint32)0;
//uint8 *addon_info = MemoryDataHolder::GetFileBasic("data/packet/addon_info.bin");
//if(addon_info)
//{
// logdebug("Auth: Using custom addon info, %s", FilesizeFormat(
// auth.append(addon_info, 160);
auth.SetOpcode(CMSG_AUTH_SESSION);
SendWorldPacket(auth);
@ -1178,9 +1182,8 @@ void WorldSession::_HandleTelePortAckOpcode(WorldPacket& recvPacket)
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(MSG_MOVE_FALL_LAND,4+1+4+4+4+4+4+4);
response << uint32(0) << (uint8)0; // no flags; unk
response <<(uint32)getMSTime(); // time correct?
WorldPacket response(MSG_MOVE_FALL_LAND,4+2+4+4+4+4+4+4);
response << uint32(0) << (uint16)0; // no flags; unk
response << x << y << z << o << uint32(100); // simulate 100 msec fall time
SendWorldPacket(response);
@ -1228,8 +1231,8 @@ void WorldSession::_HandleNewWorldOpcode(WorldPacket& recvPacket)
SendWorldPacket(wp);
// TODO: put this into a capsule class later, that autodetects movement flags etc.
WorldPacket response(MSG_MOVE_FALL_LAND,4+1+4+4+4+4+4+4);
response << uint32(0) << (uint8)0; // no flags; unk
WorldPacket response(MSG_MOVE_FALL_LAND,4+2+4+4+4+4+4+4);
response << uint32(0) << (uint16)0; // no flags; unk
response <<(uint32)getMSTime(); // time correct?
response << x << y << z << o << uint32(100); // simulate 100 msec fall time
SendWorldPacket(response);

View File

@ -185,6 +185,18 @@
</File>
<File
RelativePath=".\Client\MemoryDataHolder.cpp">
<FileConfiguration
Name="Release|Win32"
ExcludedFromBuild="TRUE">
<Tool
Name="VCCLCompilerTool"/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
ExcludedFromBuild="TRUE">
<Tool
Name="VCCLCompilerTool"/>
</FileConfiguration>
</File>
<File
RelativePath=".\Client\MemoryDataHolder.h">

View File

@ -14,6 +14,41 @@ inline void flipcc(uint8 *fcc)
fcc[2]=t;
}
void MCAL_decompress(uint8 *inbuf, uint8 *outbuf)
{
/*
How the decompression works
* read a byte
* check for sign bit
* if set we are in fill mode else we are in copy mode
* take the 7 lesser bits of the first byte as a count indicator
o fill mode: read the next byte an fill it by count in resulting alpha map
o copy mode: read the next count bytes and copy them in the resulting alpha map
* if the alpha map is complete we are done otherwise start at 1. again
*/
// 21-10-2008 by Flow
uint32 offI = 0; //offset IN buffer
uint32 offO = 0; //offset OUT buffer
while( offO < 4096 )
{
// fill or copy mode
bool fill = inbuf[offI] & 0x80;
unsigned n = inbuf[offI] & 0x7F;
offI++;
for( unsigned k = 0; k < n; k++ )
{
outbuf[offO] = inbuf[offI];
offO++;
if( !fill )
offI++;
}
if( fill ) offI++;
}
}
bool ADTFile::Load(std::string fn)
{
try
@ -185,6 +220,7 @@ bool ADTFile::LoadMem(ByteBuffer& buf)
uint8 *mfcc = &_cc2[0];
mfcc[4]=0;
uint32 msize;
bool mcal_compressed = false;
while(buf.rpos()<buf.size())
{
buf.read(mfcc,4); flipcc(mfcc);
@ -223,6 +259,8 @@ bool ADTFile::LoadMem(ByteBuffer& buf)
{
_chunks[mcnkid].layer[i] = buf.read<MCLY_chunk>();
}
if(_chunks[mcnkid].layer[i].flags & 0x200)
mcal_compressed = true;
}
else if(!strcmp((char*)mfcc,"MCSH"))
{
@ -233,7 +271,23 @@ bool ADTFile::LoadMem(ByteBuffer& buf)
// we can NOT use _chunks[mcnkid].hdr.nLayers here... so we use: (full block size - header size) / single block size
for(uint32 i = 0; i < (_chunks[mcnkid].hdr.sizeAlpha - 8) / 2048; i++)
{
buf.read((uint8*)(_chunks[mcnkid].alphamap[i]),2048);
uint8 alphamap[2048];
buf.read((uint8*)alphamap,2048);
if(mcal_compressed)
{
MCAL_decompress(alphamap,_chunks[mcnkid].alphamap[i]);
}
else
{
for(uint32 aly = 0; aly < 64; aly++)
{
for(uint32 alx = 0; alx < 32; alx++)
{
_chunks[mcnkid].alphamap[i][aly*64 + (alx*2)] = alphamap[aly*64 + alx] & 0xF0; // first 4 bits
_chunks[mcnkid].alphamap[i][aly*64 + (alx*2)+1] = alphamap[aly*64 + alx] & 0x0F; // second
}
}
}
}
}
/*else if(!strcmp((char*)mfcc,"MCLQ")) // MCLQ changed to MH2O chunk for whole ADT file

View File

@ -200,7 +200,7 @@ struct ADTMapChunk
MCLY_chunk layer[ADT_MAXLAYERS]; // can be less
uint32 nTextures;
uint8 shadowmap[512]; // 1 bit 64x64
uint8 alphamap[ADT_MAXLAYERS][2048]; // 4 bits, 64x64. max 4, 1 per layer
uint8 alphamap[ADT_MAXLAYERS][4096]; // 8 bits, 64x64. max 4, 1 per layer
bool haswater;
float waterlevel;
LiquidVertex lqvertex[81];

View File

@ -55,6 +55,10 @@ void MapTile::ImportFromADT(ADTFile *adt)
uint32 texoffs = adt->_chunks[ch].layer[ly].textureId;
_chunks[ch].texlayer.push_back(std::string("data/texture/") + NormalizeFilename(std::string(adt->_textures[texoffs])).c_str());
}
memcpy(_chunks[ch].alphamap, adt->_chunks[ch].alphamap, adt->_chunks[ch].hdr.sizeAlpha - 8);
/*
// extract alpha maps. in adt they are stored in 4-bit encoding, which makes 4096 entries in 64x32 values
for(uint32 al = 0; al < (adt->_chunks[ch].hdr.sizeAlpha - 8) / 2048; al++) // see comment in ADTFile.cpp when loading MCAL chunk for explanation
{
@ -67,6 +71,7 @@ void MapTile::ImportFromADT(ADTFile *adt)
}
}
}
*/
}
// copy over doodads and do some transformations