* 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:
parent
1c697b84c0
commit
0522c2c786
@ -16,7 +16,7 @@ name=Rogue
|
||||
name=Priest
|
||||
|
||||
[6]
|
||||
name=UNKNOWN CLASS(6)
|
||||
name=Death Knight
|
||||
|
||||
[7]
|
||||
name=Shaman
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -149,7 +149,7 @@ public:
|
||||
float _y;
|
||||
float _z;
|
||||
uint32 _guildId;
|
||||
uint8 _flags;
|
||||
uint32 _flags;
|
||||
uint32 _petInfoId;
|
||||
uint32 _petLevel;
|
||||
uint32 _petFamilyId;
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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">
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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];
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user