aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormegamage <none@none>2008-12-24 11:18:01 -0600
committermegamage <none@none>2008-12-24 11:18:01 -0600
commit184b82abccfff95b18bed81ded1b5a7e98d2dbd3 (patch)
tree4329c771076612bc55e52febfb5f323a2f21007e
parent3cb4e7c716b11f357b3265257c51e7b6cc5c36f9 (diff)
Backed out changeset: ad4f100c0a9d
--HG-- branch : trunk
-rw-r--r--THANKS3
-rw-r--r--contrib/extractor/System.cpp118
-rw-r--r--contrib/extractor/ad.exebin160768 -> 167936 bytes
-rw-r--r--contrib/extractor/adt.cpp532
-rw-r--r--contrib/extractor/adt.h141
-rw-r--r--contrib/vmap_extract_assembler_bin/vmap_assembler.exebin293888 -> 184320 bytes
-rw-r--r--contrib/vmap_extract_assembler_bin/vmapextract_v2.exebin217088 -> 233472 bytes
-rw-r--r--contrib/vmap_extractor_v2/vmapextract/model.cpp145
-rw-r--r--contrib/vmap_extractor_v2/vmapextract/model.h27
-rw-r--r--contrib/vmap_extractor_v2/vmapextract/modelheaders.h316
-rw-r--r--contrib/vmap_extractor_v2/vmapextract/vmapexport.cpp6
-rw-r--r--sql/characters.sql101
-rw-r--r--src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp49
-rw-r--r--src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/blackrock_depths/instance_blackrock_depths.cpp18
-rw-r--r--src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/old_hillsbrad.cpp20
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_leotheras_the_blind.cpp12
-rw-r--r--src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/deadmines/deadmines.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/gruuls_lair/boss_high_king_maulgar.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/karazhan/boss_prince_malchezaar.cpp20
-rw-r--r--src/bindings/scripts/scripts/zone/scarlet_monastery/boss_headless_horseman.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/scarlet_monastery/instance_scarlet_monastery.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/shadowfang_keep/instance_shadowfang_keep.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/uldaman/instance_uldaman.cpp4
-rw-r--r--src/bindings/scripts/scripts/zone/zulaman/boss_hexlord.cpp3
-rw-r--r--src/bindings/scripts/scripts/zone/zulaman/boss_nalorakk.cpp6
-rw-r--r--src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp8
-rw-r--r--src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp2
-rw-r--r--src/bindings/scripts/scripts/zone/zulgurub/boss_renataki.cpp12
-rw-r--r--src/game/AchievementMgr.cpp910
-rw-r--r--src/game/AchievementMgr.h101
-rw-r--r--src/game/AuctionHouse.cpp20
-rw-r--r--src/game/Bag.cpp2
-rw-r--r--src/game/BattleGround.cpp9
-rw-r--r--src/game/BattleGround.h7
-rw-r--r--src/game/BattleGroundMgr.cpp5
-rw-r--r--src/game/BattleGroundMgr.h4
-rw-r--r--src/game/Calendar.cpp17
-rw-r--r--src/game/Calendar.h26
-rw-r--r--src/game/CalendarHandler.cpp118
-rw-r--r--src/game/CharacterHandler.cpp349
-rw-r--r--src/game/Chat.cpp3
-rw-r--r--src/game/Chat.h3
-rw-r--r--src/game/Corpse.cpp2
-rw-r--r--src/game/Creature.cpp25
-rw-r--r--src/game/Creature.h7
-rw-r--r--src/game/DynamicObject.cpp2
-rw-r--r--src/game/GameObject.cpp96
-rw-r--r--src/game/GameObject.h31
-rw-r--r--src/game/GossipDef.cpp17
-rw-r--r--src/game/GridNotifiers.cpp2
-rw-r--r--src/game/Group.h13
-rw-r--r--src/game/GroupHandler.cpp36
-rw-r--r--src/game/Guild.cpp38
-rw-r--r--src/game/Guild.h5
-rw-r--r--src/game/Item.cpp18
-rw-r--r--src/game/Item.h40
-rw-r--r--src/game/ItemHandler.cpp11
-rw-r--r--src/game/ItemPrototype.h82
-rw-r--r--src/game/Language.h2
-rw-r--r--src/game/Level2.cpp159
-rw-r--r--src/game/Level3.cpp77
-rw-r--r--src/game/LootHandler.cpp4
-rw-r--r--src/game/LootMgr.cpp17
-rw-r--r--src/game/LootMgr.h3
-rw-r--r--src/game/Mail.cpp8
-rw-r--r--src/game/Makefile.am253
-rw-r--r--src/game/Map.cpp6
-rw-r--r--src/game/Map.h11
-rw-r--r--src/game/MapManager.cpp6
-rw-r--r--src/game/MiscHandler.cpp150
-rw-r--r--src/game/MovementHandler.cpp215
-rw-r--r--src/game/NPCHandler.cpp16
-rw-r--r--src/game/Object.cpp77
-rw-r--r--src/game/ObjectAccessor.cpp11
-rw-r--r--src/game/ObjectAccessor.h2
-rw-r--r--src/game/ObjectDefines.h4
-rw-r--r--src/game/ObjectGridLoader.cpp2
-rw-r--r--src/game/ObjectMgr.cpp150
-rw-r--r--src/game/ObjectMgr.h11
-rw-r--r--src/game/Opcodes.cpp2250
-rw-r--r--src/game/Opcodes.h396
-rw-r--r--src/game/Pet.cpp395
-rw-r--r--src/game/Pet.h41
-rw-r--r--src/game/PetHandler.cpp153
-rw-r--r--src/game/PetitionsHandler.cpp8
-rw-r--r--src/game/Player.cpp1349
-rw-r--r--src/game/Player.h158
-rw-r--r--src/game/QueryHandler.cpp45
-rw-r--r--src/game/QuestDef.cpp94
-rw-r--r--src/game/QuestDef.h47
-rw-r--r--src/game/QuestHandler.cpp6
-rw-r--r--src/game/SharedDefines.h315
-rw-r--r--src/game/SkillHandler.cpp4
-rw-r--r--src/game/Spell.cpp402
-rw-r--r--src/game/Spell.h53
-rw-r--r--src/game/SpellAuraDefines.h58
-rw-r--r--src/game/SpellAuras.cpp891
-rw-r--r--src/game/SpellAuras.h32
-rw-r--r--src/game/SpellEffects.cpp328
-rw-r--r--src/game/SpellHandler.cpp38
-rw-r--r--src/game/SpellMgr.cpp287
-rw-r--r--src/game/SpellMgr.h394
-rw-r--r--src/game/StatSystem.cpp66
-rw-r--r--src/game/TaxiHandler.cpp2
-rw-r--r--src/game/Transports.cpp11
-rw-r--r--src/game/Unit.cpp331
-rw-r--r--src/game/Unit.h141
-rw-r--r--src/game/UpdateData.cpp2
-rw-r--r--src/game/UpdateData.h5
-rw-r--r--src/game/UpdateFields.h531
-rw-r--r--src/game/Vehicle.cpp102
-rw-r--r--src/game/Vehicle.h58
-rw-r--r--src/game/World.cpp89
-rw-r--r--src/game/World.h7
-rw-r--r--src/game/WorldSession.cpp87
-rw-r--r--src/game/WorldSession.h51
-rw-r--r--src/game/WorldSocket.cpp63
-rw-r--r--src/game/debugcmds.cpp51
-rw-r--r--src/shared/Auth/AuthCrypt.cpp3
-rw-r--r--src/shared/Auth/AuthCrypt.h1
-rw-r--r--src/shared/Database/DBCEnums.h229
-rw-r--r--src/shared/Database/DBCStores.cpp67
-rw-r--r--src/shared/Database/DBCStores.h13
-rw-r--r--src/shared/Database/DBCStructure.h1352
-rw-r--r--src/shared/Database/DBCfmt.cpp58
-rw-r--r--src/shared/Database/Database.h2
-rw-r--r--src/shared/Database/SQLStorage.cpp8
-rw-r--r--src/shared/MemoryLeaks.h48
-rw-r--r--src/shared/SystemConfig.h.in46
-rw-r--r--src/shared/Util.h24
-rw-r--r--src/shared/revision_nr.h4
-rw-r--r--src/shared/vmap/TileAssembler.cpp3
-rw-r--r--src/trinitycore/CliRunnable.cpp (renamed from src/mangosd/CliRunnable.cpp)0
-rw-r--r--src/trinitycore/CliRunnable.h (renamed from src/mangosd/CliRunnable.h)0
-rw-r--r--src/trinitycore/Main.cpp (renamed from src/mangosd/Main.cpp)2
-rw-r--r--src/trinitycore/Makefile.am (renamed from src/mangosd/Makefile.am)0
-rw-r--r--src/trinitycore/Master.cpp (renamed from src/mangosd/Master.cpp)0
-rw-r--r--src/trinitycore/Master.h (renamed from src/mangosd/Master.h)0
-rw-r--r--src/trinitycore/RASocket.cpp (renamed from src/mangosd/RASocket.cpp)0
-rw-r--r--src/trinitycore/RASocket.h (renamed from src/mangosd/RASocket.h)0
-rw-r--r--src/trinitycore/TrinityCore.ico (renamed from src/mangosd/TrinityCore.ico)bin136606 -> 136606 bytes
-rw-r--r--src/trinitycore/TrinityCore.rc (renamed from src/mangosd/mangosd.rc)0
-rw-r--r--src/trinitycore/WorldRunnable.cpp (renamed from src/mangosd/WorldRunnable.cpp)0
-rw-r--r--src/trinitycore/WorldRunnable.h (renamed from src/mangosd/WorldRunnable.h)0
-rw-r--r--src/trinitycore/monitor-mangosd (renamed from src/mangosd/monitor-mangosd)0
-rw-r--r--src/trinitycore/resource.h (renamed from src/mangosd/resource.h)0
-rw-r--r--src/trinitycore/run-mangosd (renamed from src/mangosd/run-mangosd)0
-rw-r--r--src/trinitycore/trinitycore.conf.dist (renamed from src/mangosd/mangosd.conf.dist.in)43
-rw-r--r--src/trinityrealm/AuthCodes.h (renamed from src/realmd/AuthCodes.h)4
-rw-r--r--src/trinityrealm/AuthSocket.cpp (renamed from src/realmd/AuthSocket.cpp)0
-rw-r--r--src/trinityrealm/AuthSocket.h (renamed from src/realmd/AuthSocket.h)0
-rw-r--r--src/trinityrealm/Main.cpp (renamed from src/realmd/Main.cpp)2
-rw-r--r--src/trinityrealm/Makefile.am (renamed from src/realmd/Makefile.am)0
-rw-r--r--src/trinityrealm/RealmList.cpp (renamed from src/realmd/RealmList.cpp)0
-rw-r--r--src/trinityrealm/RealmList.h (renamed from src/realmd/RealmList.h)0
-rw-r--r--src/trinityrealm/TrinityRealm.ico (renamed from src/realmd/TrinityRealm.ico)bin136606 -> 136606 bytes
-rw-r--r--src/trinityrealm/TrinityRealm.rc (renamed from src/realmd/Realmd.rc)0
-rw-r--r--src/trinityrealm/resource.h (renamed from src/realmd/resource.h)0
-rw-r--r--src/trinityrealm/trinityrealm.conf.dist (renamed from src/realmd/realmd.conf.dist.in)0
-rw-r--r--win/TrinityCore&Script VC90.sln4
-rw-r--r--win/VC71/TrinityCore.vcproj (renamed from win/VC71/mangosd.vcproj)10
-rw-r--r--win/VC71/TrinityRealm.vcproj (renamed from win/VC71/realmd.vcproj)8
-rw-r--r--win/VC71/game.vcproj23
-rw-r--r--win/VC80/TrinityCore.vcproj (renamed from win/VC80/mangosd.vcproj)20
-rw-r--r--win/VC80/TrinityRealm.vcproj (renamed from win/VC80/realmd.vcproj)16
-rw-r--r--win/VC80/game.vcproj28
-rw-r--r--win/VC90/TrinityCore.vcproj (renamed from win/VC90/mangosd.vcproj)61
-rw-r--r--win/VC90/TrinityRealm.vcproj (renamed from win/VC90/realmd.vcproj)42
-rw-r--r--win/VC90/game.vcproj59
171 files changed, 5078 insertions, 11193 deletions
diff --git a/THANKS b/THANKS
index c48df55dd1f..396ebbceb7f 100644
--- a/THANKS
+++ b/THANKS
@@ -20,9 +20,6 @@ similar to this one:
Thanks to the ScriptDev2 team (http://www.scriptdev2.com) for scripts.
- Thanks to WCell team (especially Ralek) for reseach on realm reconnect sequence,
- item scaling stats algorithm, gameobject rotation issues.
-
The easiest policy with this file is to thank everyone who contributes to the
project, without judging the value of the contribution.
diff --git a/contrib/extractor/System.cpp b/contrib/extractor/System.cpp
index 1753f40801a..197c4d35416 100644
--- a/contrib/extractor/System.cpp
+++ b/contrib/extractor/System.cpp
@@ -16,24 +16,21 @@
extern unsigned int iRes;
extern ArchiveSet gOpenArchives;
-bool ConvertADT(char*, char*);
+bool ConvertADT(char*,char*);
-typedef struct
-{
+typedef struct{
char name[64];
- uint32 id;
-} map_id;
+ unsigned int id;
+}map_id;
typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned int uint32;
-map_id *map_ids;
-uint16 *areas;
-uint16 *LiqType;
-char output_path[128] = ".";
-char input_path[128] = ".";
-uint32 maxAreaId = 0;
+map_id * map_ids;
+uint16 * areas;
+char output_path[128]=".";
+char input_path[128]=".";
enum Extract
{
@@ -69,45 +66,46 @@ bool FileExists( const char* FileName )
void Usage(char* prg)
{
- printf("Usage:\n%s -[var] [value]\n-i set input path\n-o set output path\n-r set resolution\n-e extract only MAP(1)/DBC(2) - standard: both(3)\nExample: %s -r 256 -i \"c:\\games\\game\"", prg, prg);
+ printf("Usage:\n%s -[var] [value]\n-i set input path\n-o set output path\n-r set resolution\n-e extract only MAP(1)/DBC(2) - standard: both(3)\nExample: %s -r 256 -i \"c:\\games\\game\"",
+ prg,prg);
exit(1);
}
void HandleArgs(int argc, char * arg[])
{
- for(int c = 1; c < argc; ++c)
+ for(int c=1;c<argc;c++)
{
- // i - input path
- // o - output path
- // r - resolution, array of (r * r) heights will be created
- // e - extract only MAP(1)/DBC(2) - standard both(3)
+ //i - input path
+ //o - output path
+ //r - resolution, array of (r * r) heights will be created
+ //e - extract only MAP(1)/DBC(2) - standard both(3)
if(arg[c][0] != '-')
Usage(arg[0]);
switch(arg[c][1])
{
case 'i':
- if(c + 1 < argc) // all ok
- strcpy(input_path, arg[(c++) + 1]);
+ if(c+1<argc)//all ok
+ strcpy(input_path,arg[(c++) +1]);
else
Usage(arg[0]);
break;
case 'o':
- if(c + 1 < argc) // all ok
- strcpy(output_path, arg[(c++) + 1]);
+ if(c+1<argc)//all ok
+ strcpy(output_path,arg[(c++) +1]);
else
Usage(arg[0]);
break;
case 'r':
- if(c + 1 < argc) // all ok
- iRes=atoi(arg[(c++) + 1]);
+ if(c+1<argc)//all ok
+ iRes=atoi(arg[(c++) +1]);
else
Usage(arg[0]);
break;
case 'e':
- if(c + 1 < argc) // all ok
+ if(c+1<argc)//all ok
{
- extract=atoi(arg[(c++) + 1]);
+ extract=atoi(arg[(c++) +1]);
if(!(extract > 0 && extract < 4))
Usage(arg[0]);
}
@@ -124,12 +122,12 @@ uint32 ReadMapDBC()
DBCFile dbc("DBFilesClient\\Map.dbc");
dbc.open();
- size_t map_count = dbc.getRecordCount();
- map_ids = new map_id[map_count];
- for(uint32 x = 0; x < map_count; ++x)
+ uint32 map_count=dbc.getRecordCount();
+ map_ids=new map_id[map_count];
+ for(unsigned int x=0;x<map_count;x++)
{
- map_ids[x].id = dbc.getRecord(x).getUInt(0);
- strcpy(map_ids[x].name, dbc.getRecord(x).getString(1));
+ map_ids[x].id=dbc.getRecord(x).getUInt(0);
+ strcpy(map_ids[x].name,dbc.getRecord(x).getString(1));
}
printf("Done! (%u maps loaded)\n", map_count);
return map_count;
@@ -137,39 +135,20 @@ uint32 ReadMapDBC()
void ReadAreaTableDBC()
{
- printf("Read AreaTable.dbc file...");
+ printf("Read AreaTable.dbc file... ");
DBCFile dbc("DBFilesClient\\AreaTable.dbc");
dbc.open();
- size_t area_count = dbc.getRecordCount();
- size_t maxid = dbc.getMaxId();
- areas = new uint16[maxid + 1];
- memset(areas, 0xff, (maxid + 1) * sizeof(uint16));
-
- for(uint32 x = 0; x < area_count; ++x)
+ unsigned int area_count=dbc.getRecordCount();
+ uint32 maxid = dbc.getMaxId();
+ areas=new uint16[maxid + 1];
+ memset(areas, 0xff, sizeof(areas));
+ for(unsigned int x=0; x<area_count;++x)
areas[dbc.getRecord(x).getUInt(0)] = dbc.getRecord(x).getUInt(3);
- maxAreaId = dbc.getMaxId();
-
printf("Done! (%u areas loaded)\n", area_count);
}
-void ReadLiquidTypeTableDBC()
-{
- printf("Read LiquidType.dbc file...");
- DBCFile dbc("DBFilesClient\\LiquidType.dbc");
- dbc.open();
- size_t LiqType_count = dbc.getRecordCount();
- size_t LiqType_maxid = dbc.getMaxId();
- LiqType = new uint16[LiqType_maxid + 1];
- memset(LiqType, 0xff, (LiqType_maxid + 1) * sizeof(uint16));
-
- for(uint32 x = 0; x < LiqType_count; ++x)
- LiqType[dbc.getRecord(x).getUInt(0)] = dbc.getRecord(x).getUInt(3);
-
- printf("Done! (%u LiqTypes loaded)\n", LiqType_count);
-}
-
void ExtractMapsFromMpq()
{
char mpq_filename[1024];
@@ -180,28 +159,27 @@ void ExtractMapsFromMpq()
uint32 map_count = ReadMapDBC();
ReadAreaTableDBC();
- ReadLiquidTypeTableDBC();
- unsigned int total = map_count * ADT_RES * ADT_RES;
- unsigned int done = 0;
+ unsigned int total=map_count*ADT_RES*ADT_RES;
+ unsigned int done=0;
std::string path = output_path;
path += "/maps/";
CreateDir(path);
- for(uint32 x = 0; x < ADT_RES; ++x)
+ for(unsigned int x = 0; x < ADT_RES; ++x)
{
- for(uint32 y = 0; y < ADT_RES; ++y)
+ for(unsigned int y = 0; y < ADT_RES; ++y)
{
- for(uint32 z = 0; z < map_count; ++z)
+ for(unsigned int z = 0; z < map_count; ++z)
{
- sprintf(mpq_filename, "World\\Maps\\%s\\%s_%u_%u.adt", map_ids[z].name, map_ids[z].name, x, y);
- sprintf(output_filename, "%s/maps/%03u%02u%02u.map", output_path, map_ids[z].id, y, x);
- ConvertADT(mpq_filename, output_filename);
+ sprintf(mpq_filename,"World\\Maps\\%s\\%s_%u_%u.adt",map_ids[z].name,map_ids[z].name,x,y);
+ sprintf(output_filename,"%s/maps/%03u%02u%02u.map",output_path,map_ids[z].id,y,x);
+ ConvertADT(mpq_filename,output_filename);
done++;
}
- // draw progress bar
- printf("Processing........................%d%%\r", (100 * done) / total);
+ //draw progess bar
+ printf("Processing........................%d%%\r",(100*done)/total);
}
}
@@ -244,7 +222,7 @@ void ExtractDBCFiles(int locale, bool basicLocale)
string filename = path;
filename += (iter->c_str() + strlen("DBFilesClient\\"));
- FILE *output = fopen(filename.c_str(), "wb");
+ FILE *output=fopen(filename.c_str(), "wb");
if(!output)
{
printf("Can't create the output file '%s'\n", filename.c_str());
@@ -283,9 +261,7 @@ void LoadCommonMPQFiles()
{
char filename[512];
- sprintf(filename,"%s/Data/common-2.MPQ", input_path);
- new MPQArchive(filename);
- sprintf(filename,"%s/Data/lichking.MPQ", input_path);
+ sprintf(filename,"%s/Data/common.MPQ", input_path);
new MPQArchive(filename);
sprintf(filename,"%s/Data/expansion.MPQ", input_path);
new MPQArchive(filename);
@@ -295,7 +271,7 @@ void LoadCommonMPQFiles()
if(i > 1)
sprintf(ext, "-%i", i);
- sprintf(filename, "%s/Data/patch%s.MPQ", input_path, ext);
+ sprintf(filename,"%s/Data/patch%s.MPQ", input_path, ext);
if(FileExists(filename))
new MPQArchive(filename);
}
diff --git a/contrib/extractor/ad.exe b/contrib/extractor/ad.exe
index f483f3892f9..2dc24c0872e 100644
--- a/contrib/extractor/ad.exe
+++ b/contrib/extractor/ad.exe
Binary files differ
diff --git a/contrib/extractor/adt.cpp b/contrib/extractor/adt.cpp
index 71cbf88a37b..26adaa28537 100644
--- a/contrib/extractor/adt.cpp
+++ b/contrib/extractor/adt.cpp
@@ -15,15 +15,16 @@
#include "adt.h"
#include "mpq_libmpq.h"
-uint32 iRes = 256;
-extern uint16 *areas;
-extern uint16 *LiqType;
-extern uint32 maxAreaId;
+//#include <windows.h>
+unsigned int iRes=256;
+extern uint16*areas;
vec wmoc;
-Cell *cell;
+Cell * cell;
+uint32 wmo_count;
mcell *mcells;
+
int holetab_h[4] = {0x1111, 0x2222, 0x4444, 0x8888};
int holetab_v[4] = {0x000F, 0x00F0, 0x0F00, 0xF000};
@@ -34,84 +35,56 @@ bool LoadADT(char* filename)
if(mf.isEof())
{
- //printf("No such file %s\n", filename);
+ //printf("No such file.\n");
return false;
}
+ mcells=new mcell;
- MapLiqFlag = new uint8[256];
- for(uint32 j = 0; j < 256; ++j)
- MapLiqFlag[j] = 0; // no water
-
- MapLiqHeight = new float[16384];
- for(uint32 j = 0; j < 16384; ++j)
- MapLiqHeight[j] = -999999; // no water
-
- mcells = new mcell;
-
- wmoc.x = 65 * TILESIZE;
- wmoc.z = 65 * TILESIZE;
+ wmoc.x =65*TILESIZE;
+ wmoc.z =65*TILESIZE;
size_t mcnk_offsets[256], mcnk_sizes[256];
- chunk_num = 0;
- k = 0;
- m = 0;
+ wmo_count=0;
+ bool found=false;
+ //uint32 fs=mf.getSize()-3;
+ //while (mf.getPos()<fs)
while (!mf.isEof())
{
uint32 fourcc;
- mf.read(&fourcc, 4);
+ mf.read(&fourcc,4);
mf.read(&size, 4);
size_t nextpos = mf.getPos() + size;
-
- //if(fourcc==0x4d484452) // MHDR header
- //if(fourcc==0x4d564552) // MVER
- if(fourcc == 0x4d43494e) // MCIN
+ switch(fourcc)
{
- for (uint32 i = 0; i < 256; ++i)
+ case 0x4d43494e: // MCIN
{
- mf.read(&mcnk_offsets[i], 4);
- mf.read(&mcnk_sizes[i], 4);
- mf.seekRelative(8);
+ //printf("Found chunks info\n");
+ // mapchunk offsets/sizes
+ for (int i=0; i<256; i++)
+ {
+ mf.read(&mcnk_offsets[i],4);
+ mf.read(&mcnk_sizes[i],4);
+ mf.seekRelative(8);
+ }
+ break;
}
- }
- //if(fourcc == 0x4d544558) // MTEX textures (strings)
- //if(fourcc == 0x4d4d4458) // MMDX m2 models (strings)
- //if(fourcc == 0x4d4d4944) // MMID offsets for strings in MMDX
- //if(fourcc == 0x4d574d4f) // MWMO
- //if(fourcc == 0x4d574944) // MWID offsets for strings in MWMO
- //if(fourcc == 0x4d444446) // MDDF
- //if(fourcc == 0x4d4f4446) // MODF
- if(fourcc == 0x4d48324f) // MH2O new in WotLK
- {
- // çäåñü íàäî çàïîìíèòü áàçîâóþ ïîçèöèþ â ôàéëå òê âñå ñìåùåíèÿ áóäóò îò íåãî
- uint32 base_pos = mf.getPos();
- uint32 header_pos = 0;
- MH2O_offsData *LiqOffsData = new MH2O_offsData;
- MH2O_Data1 *LiqChunkData1 = new MH2O_Data1;
- float *ChunkLiqHeight = new float[81];
- for(chunk_num = 0; chunk_num < 256; ++chunk_num)
+ case 0x4d4f4446: // MODF
{
- mf.read(LiqOffsData, 0x0C);
- header_pos = mf.getPos();
- if(LiqOffsData->offsData1 != 0) // åñëè äàííûå â Data1 î âîäå åñòü, òî èõ íàäî êîíâåðòèðîâàòü
+ /*
+ if(size)
{
- // ïåðåõîäèì ïî ñìåùåíèþ èç offsData1 ÎÒ ÍÀ×ÀËÀ êóñêà
- mf.seek(base_pos + LiqOffsData->offsData1);
- mf.read(LiqChunkData1, 0x18); // ñ÷èòûâàåì ñàìè äàííûå â ñòðóêòóðó òèïà MH2O_Data1
- // çàíîñèì äàííûå ôëàãà äëÿ êóñêà
- if(LiqType[LiqChunkData1->LiquidTypeId] == 0xffff)
- printf("\nCan't find Liquid type for map %s\nchunk %d\n", filename, chunk_num);
- else if(LiqType[LiqChunkData1->LiquidTypeId] == LIQUID_TYPE_WATER || LiqType[LiqChunkData1->LiquidTypeId] == LIQUID_TYPE_OCEAN)
- MapLiqFlag[chunk_num] |= 1; // water/ocean
- else if(LiqType[LiqChunkData1->LiquidTypeId] == LIQUID_TYPE_MAGMA || LiqType[LiqChunkData1->LiquidTypeId] == LIQUID_TYPE_SLIME)
- MapLiqFlag[chunk_num] |= 2; // magma/slime
- // ïðåäâàðèòåëüíî çàïîëíÿåì âåñü êóñîê äàííûìè - íåò âîäû
- for(int j = 0; j < 81; ++j)
+ //printf("\nwmo count %d\n",size/64);
+ wmo_count =size/64;
+ for (int i=0; i<wmo_count; i++)
{
- ChunkLiqHeight[j] = -999999; // no liquid/water
+ int id;
+ mf.read(&id, 4);
+ WMO *wmo = (WMO*)wmomanager.items[wmomanager.get(wmos[id])];
+ WMOInstance inst(wmo, mf);
+ wmois.push_back(inst);
}
-<<<<<<< HEAD:contrib/extractor/adt.cpp
}*/
break;
@@ -125,38 +98,14 @@ bool LoadADT(char* filename)
mf.read(buf, size);
char *p=buf;
while (p<buf+size)
-=======
- // òåïåðü âû÷èñëÿåì òå ÷òî ñ âîäîé è ïåðåçàïèñûâàåì èõ â êóñêå
- for(int b = 0; b <= LiqChunkData1->height; ++b)
->>>>>>> upstream/master:contrib/extractor/adt.cpp
{
- for(int c = LiqChunkData1->xOffset; c <= (LiqChunkData1->xOffset + LiqChunkData1->width); ++c)
- {
- int n = (9 * (LiqChunkData1->yOffset + b)) + c;
- ChunkLiqHeight[n] = LiqChunkData1->heightLevel1;
- }
- }
- mf.seek(header_pos); // è íå çàáûòü âåðíóòüñÿ íà èñõîäíóþ ïîçèöèþ èìåííî Â ÕÈÄÅÐÅ
- }
- else // åñëè äàííûõ â Data1 íåò, òî íàäî çàïîëíèòü âåñü êóñîê, íî äàííûìè - íåò âîäû
- {
- for(int j = 0; j < 81; ++j)
- ChunkLiqHeight[j] = -999999; // no liquid/water
- }
+ std::string path(p);
+ p+=strlen(p)+1;
+ fixname(path);
- if(!(chunk_num % 16))
- m = 1024 * (chunk_num / 16); // ñìåùåíèå ïî ðÿäàì êóñêîâ ñ ïåðåêðûòèåì = 1024
- k = m + (chunk_num % 16) * 8; // óñòàíàâëèâàåìñÿ íà íà÷àëüíûé èíäåêñ äëÿ çàïîëíåíèÿ ðÿäà
- // çàíîñèì äàííûå êóñêà â ìàññèâ äëÿ êàðòû, ñ ïåðåêðûòèåì è îáðåçàíèåì êóñêîâ òê äàííûõ 81
- // ýòî àíàëîã ñòàðîãî îáðåçàíèÿ ãðàíè÷íûõ ïðàâûõ-áîêîâûõ è íèæíèõ äàííûõ
- for(int p = 0; p < 72; p += 9) // íèæíèå 8 íå çàíîñèì òê îíè äóáëèðóåòñÿ ñëåä êóñêîì
- {
- for(int s = 0; s < 8; ++s) // 9 çíà÷åíèå â ñòðîêå íå çàíîñèì òê îíî äóáëèðóåòñÿ ñëåä êóñêîì, à â ïðàâûõ-áîêîâûõ îáðåçàåòñÿ äëÿ 128õ128
- {
- MapLiqHeight[k] = ChunkLiqHeight[p + s];
- ++k;
+ wmomanager.add(path);
+ wmos.push_back(path);
}
-<<<<<<< HEAD:contrib/extractor/adt.cpp
delete[] buf;
}*/
break;
@@ -177,50 +126,77 @@ bool LoadADT(char* filename)
// mf.seekRelative(-3);
printf("Unhandled map chunk: %u\n",fourcc);
break;
-=======
- k = k + 120;
- }
->>>>>>> upstream/master:contrib/extractor/adt.cpp
}
- delete LiqOffsData;
- delete LiqChunkData1;
- delete []ChunkLiqHeight;
-
}
- //case 0x4d434e4b: // MCNK
- //case 0x4d46424f: // MFBO new in BC
- //case 0x4d545846: // MTXF new in WotLK
mf.seek(nextpos);
}
//printf("Loading chunks info\n");
// read individual map chunks
- chunk_num = 0;
- k = 0;
- m = 0;
- for (int j = 0; j < 16; ++j)
- {
- for (int i = 0; i < 16; ++i)
+ for (int j=0; j<16; j++)
+ for (int i=0; i<16; i++)
{
- mf.seek((int)mcnk_offsets[j * 16 + i]);
- LoadMapChunk(mf, &(mcells->ch[i][j]));
- ++chunk_num;
+ mf.seek((int)mcnk_offsets[j*16+i]);
+ LoadMapChunk(mf,&(mcells->ch[i][j]));
}
- }
+
+ /*
+ for(uint32 t=0;t<wmo_count ;t++)
+ {
+ wmois[t].draw();
+ }*/
+
mf.close();
return true;
}
+struct MapChunkHeader {
+ uint32 flags;
+ uint32 ix;
+ uint32 iy;
+ uint32 nLayers;
+ uint32 nDoodadRefs;
+ uint32 ofsHeight;
+ uint32 ofsNormal;
+ uint32 ofsLayer;
+ uint32 ofsRefs;
+ uint32 ofsAlpha;
+ uint32 sizeAlpha;
+ uint32 ofsShadow;
+ uint32 sizeShadow;
+ uint32 areaid;
+ uint32 nMapObjRefs;
+ uint32 holes;
+ uint16 s1;
+ uint16 s2;
+ uint32 d1;
+ uint32 d2;
+ uint32 d3;
+ uint32 predTex;
+ uint32 nEffectDoodad;
+ uint32 ofsSndEmitters;
+ uint32 nSndEmitters;
+ uint32 ofsLiquid;
+ uint32 sizeLiquid;
+ float zpos;
+ float xpos;
+ float ypos;
+ uint32 textureId;
+ uint32 props;
+ uint32 effectId;
+};
+
bool isHole(int holes, int i, int j)
{
- int testi = i / 2;
- int testj = j / 4;
- if(testi > 3) testi = 3;
- if(testj > 3) testj = 3;
- return (holes & holetab_h[testi] & holetab_v[testj]) != 0;
+ int testi = i/2;
+ int testj = j/4;
+ if(testi>3) testi = 3;
+ if(testj>3) testj = 3;
+ return (holes & holetab_h[testi] & holetab_v[testj])!=0;
}
-inline void LoadMapChunk(MPQFile &mf, chunk *_chunk)
+inline
+void LoadMapChunk(MPQFile & mf, chunk*_chunk)
{
float h;
uint32 fourcc;
@@ -231,267 +207,295 @@ inline void LoadMapChunk(MPQFile &mf, chunk *_chunk)
mf.read(&size, 4);
size_t lastpos = mf.getPos() + size;
- mf.read(&header, 0x80); // what if header size got changed?
- _chunk->area_id = header.areaid;
+ mf.read(&header, 0x80);
+ _chunk->area_id =header.areaid ;
+ _chunk->flag =0;
float xbase = header.xpos;
float ybase = header.ypos;
float zbase = header.zpos;
- zbase = TILESIZE * 32 - zbase;
- xbase = TILESIZE * 32 - xbase;
- if(wmoc.x > xbase) wmoc.x = xbase;
- if(wmoc.z > zbase) wmoc.z = zbase;
+ zbase = TILESIZE*32-zbase;
+ xbase = TILESIZE*32-xbase;
+ if(wmoc.x >xbase)wmoc.x =xbase;
+ if(wmoc.z >zbase)wmoc.z =zbase;
int chunkflags = header.flags;
- //printf("LMC: flags %X\n", chunkflags);
- float zmin = 999999999.0f;
- float zmax = -999999999.0f;
- // must be there, bl!zz uses some crazy format
+ float zmin=999999999.0f;
+ float zmax=-999999999.0f;
+ //must be there, bl!zz uses some crazy format
+ int nTextures;
while (mf.getPos() < lastpos)
{
- mf.read(&fourcc, 4);
+ mf.read(&fourcc,4);
mf.read(&size, 4);
- size_t nextpos = mf.getPos() + size;
- if(fourcc == 0x4d435654) // MCVT
+ //if(size!=580)
+ // printf("\n sz=%d",size);
+ size_t nextpos = mf.getPos() + size;
+ if(fourcc==0x4d435654) // MCVT
{
- for (int j = 0; j < 17; ++j)
- {
- for (int i = 0; i < ((j % 2) ? 8 : 9); ++i)
+ for (int j=0; j<17; j++)
+ for (int i=0; i<((j%2)?8:9); i++)
{
- mf.read(&h, 4);
- float z = h + ybase;
- if (j % 2)
+ mf.read(&h,4);
+ float z=h+ybase;
+ if (j%2)
{
- if(isHole(header.holes, i, j))
- _chunk->v8[i][j / 2] = -1000;
+ if(isHole(header.holes,i,j))
+ _chunk->v8[i][j/2] = -1000;
else
- _chunk->v8[i][j / 2] = z;
+ _chunk->v8[i][j/2] = z;
}
else
{
- if(isHole(header.holes, i, j))
- _chunk->v9[i][j / 2] = -1000;
+ if(isHole(header.holes,i,j))
+ _chunk->v9[i][j/2] = -1000;
else
- _chunk->v9[i][j / 2] = z;
+ _chunk->v9[i][j/2] = z;
}
- if(z > zmax) zmax = z;
- //if(z < zmin) zmin = z;
+ if(z>zmax)zmax=z;
+ //if(z<zmin)zmin=z;
}
- }
}
- else if(fourcc == 0x4d434e52) // MCNR
+ else if(fourcc==0x4d434e52) // MCNR
{
- nextpos = mf.getPos() + 0x1C0; // size fix
+ nextpos = mf.getPos() + 0x1C0; // size fix
}
- else if(fourcc == 0x4d434c51) // íå áóäåì ó÷èòûâàòü åñëè óæå áûëè äàííûå â MH2O, ïåðåñòðàõîâêà :) // MCLQ
+ else if(fourcc==0x4d434c51) // MCLQ
{
// liquid / water level
+ //bool haswater;
char fcc1[5];
- mf.read(fcc1, 4);
+ mf.read(fcc1,4);
flipcc(fcc1);
- fcc1[4] = 0;
- float *ChunkLiqHeight = new float[81];
+ fcc1[4]=0;
- if (!strcmp(fcc1, "MCSE"))
+ if (!strcmp(fcc1,"MCSE"))
{
- for(int j = 0; j < 81; ++j)
- {
- ChunkLiqHeight[j] = -999999; // no liquid/water
- }
+ for(int i=0;i<9;i++)
+ for(int j=0;j<9;j++)
+ _chunk->waterlevel[i][j]=-999999; // no liquid/water
}
else
{
float maxheight;
mf.read(&maxheight, 4);
- for(int j = 0; j < 81; ++j)
- {
- LiqData liq;
- mf.read(&liq, 8);
- if(liq.height > maxheight)
- ChunkLiqHeight[j] = -999999;
- else
- ChunkLiqHeight[j] = h;
- }
+ for(int j=0;j<9;j++)
+ for(int i=0;i<9;i++)
+ {
+ mf.read(&h, 4);
+ mf.read(&h, 4);
+ if(h > maxheight)
+ _chunk->waterlevel[i][j]=-999999;
+ else
+ _chunk->waterlevel[i][j]=h;
+ }
if(chunkflags & 4 || chunkflags & 8)
- MapLiqFlag[chunk_num] |= 1; // water
+ _chunk->flag |=1;
if(chunkflags & 16)
-<<<<<<< HEAD:contrib/extractor/adt.cpp
_chunk->flag |=2;
-=======
- MapLiqFlag[chunk_num] |= 2; // magma/slime
}
- // çàïîëíåì òàê æå êàê â MH2O
- if(!(chunk_num % 16))
- m = 1024 * (chunk_num / 16);
- k = m + (chunk_num % 16) * 8;
-
- for(int p = 0; p < 72; p += 9)
- {
- for(int s = 0; s < 8; ++s)
- {
- MapLiqHeight[k] = ChunkLiqHeight[p + s];
- ++k;
- }
- k = k + 120;
->>>>>>> upstream/master:contrib/extractor/adt.cpp
- }
- delete []ChunkLiqHeight;
break;
}
+ else if (fourcc==0x4d434c59) // MCLY
+ {
+ // texture info
+ nTextures = (int)size;
+ }
+ else if (fourcc==0x4d43414c) // MCAL
+ {
+ if (nTextures<=0)
+ continue;
+ }
+
mf.seek(nextpos);
}
}
double solve (vec *v,vec *p)
{
- double a = v[0].y * (v[1].z - v[2].z) + v[1].y * (v[2].z - v[0].z) + v[2].y * (v[0].z - v[1].z);
- double b = v[0].z * (v[1].x - v[2].x) + v[1].z * (v[2].x - v[0].x) + v[2].z * (v[0].x - v[1].x);
- double c = v[0].x * (v[1].y - v[2].y) + v[1].x * (v[2].y - v[0].y) + v[2].x * (v[0].y - v[1].y);
- double d = v[0].x * (v[1].y * v[2].z - v[2].y * v[1].z) + v[1].x * (v[2].y * v[0].z - v[0].y * v[2].z) + v[2].x * (v[0].y * v[1].z - v[1].y * v[0].z);
- // -d
+ double a = v[0].y *(v[1].z - v[2].z) + v[1].y *(v[2].z - v[0].z) + v[2].y *(v[0].z - v[1].z);
+ double b = v[0].z *(v[1].x - v[2].x) + v[1].z *(v[2].x - v[0].x) + v[2].z *(v[0].x - v[1].x);
+ double c = v[0].x *(v[1].y - v[2].y) + v[1].x *(v[2].y - v[0].y) + v[2].x *(v[0].y - v[1].y);
+ double d = v[0].x *(v[1].y*v[2].z - v[2].y*v[1].z) + v[1].x* (v[2].y*v[0].z - v[0].y*v[2].z) + v[2].x* (v[0].y*v[1].z - v[1].y*v[0].z);
+ //-d
- // plane equation ax+by+cz+d=0
+ //plane equation ax+by+cz+d=0
return ((a*p->x+c*p->z-d)/b);
}
-inline double GetZ(double x, double z)
+inline
+double GetZ(double x,double z)
{
vec v[3];
vec p;
+
+ //bool inWMO=false;
+
+ //if(!inWMO)
{
- // find out quadrant
- int xc = (int)(x / UNITSIZE);
- int zc = (int)(z / UNITSIZE);
- if(xc > 127) xc = 127;
- if(zc > 127) zc = 127;
-
- double lx = x - xc * UNITSIZE;
- double lz = z - zc * UNITSIZE;
- p.x = lx;
- p.z = lz;
-
- v[0].x = UNITSIZE / 2;
- v[0].y = cell->v8[xc][zc];
- v[0].z = UNITSIZE / 2;
-
- if(lx > lz)
+ //find out quadrant
+ int xc=(int)(x/UNITSIZE);
+ int zc=(int)(z/UNITSIZE);
+ if(xc>127)xc=127;
+ if(zc>127)zc=127;
+
+ double lx=x-xc*UNITSIZE;
+ double lz=z-zc*UNITSIZE;
+ p.x=lx;
+ p.z=lz;
+
+ v[0].x=UNITSIZE/2;
+ v[0].y =cell->v8[xc][zc];
+ v[0].z=UNITSIZE/2;
+
+ if(lx>lz)
{
- v[1].x = UNITSIZE;
- v[1].y = cell->v9[xc + 1][zc];
- v[1].z = 0.0f;
+ v[1].x=UNITSIZE;
+ v[1].y =cell->v9[xc+1][zc];
+ v[1].z=0;
}
else
{
- v[1].x = 0.0f;
- v[1].y = cell->v9[xc][zc + 1];
- v[1].z = UNITSIZE;
+ v[1].x=0.0;
+ v[1].y =cell->v9[xc][zc+1];
+ v[1].z=UNITSIZE;
}
- if(lz > UNITSIZE - lx)
+ if(lz>UNITSIZE-lx)
{
- v[2].x = UNITSIZE;
- v[2].y = cell->v9[xc + 1][zc + 1];
- v[2].z = UNITSIZE;
+ v[2].x=UNITSIZE;
+ v[2].y =cell->v9[xc+1][zc+1];
+ v[2].z=UNITSIZE;
}
else
{
- v[2].x = 0.0f;
- v[2].y = cell->v9[xc][zc];
- v[2].z = 0.0f;
+ v[2].x=0;
+ v[2].y=cell->v9[xc][zc];
+ v[2].z=0;
}
- return -solve(v, &p);
+ return -solve(v,&p);
}
}
-inline void TransformData()
+inline
+void TransformWaterData()
+{
+ cell= new Cell;
+
+ for(int x=0;x<128;x++)
+ for(int y=0;y<128;y++)
+ cell->v9[x][y] = mcells->ch[x/8][y/8].waterlevel[x%8][y%8];
+
+ //and the last 1
+ cell->v9[128][128] = mcells->ch[15][15].waterlevel[8][8];
+}
+
+inline
+void TransformData()
{
- cell = new Cell;
+ cell= new Cell;
- for(uint32 x = 0; x < 128; ++x)
+ for(int x=0;x<128;x++)
{
- for(uint32 y = 0; y < 128; ++y)
+ for(int y=0;y<128;y++)
{
- cell->v8[x][y] = (float)mcells->ch[x / 8][y / 8].v8[x % 8][y % 8];
- cell->v9[x][y] = (float)mcells->ch[x / 8][y / 8].v9[x % 8][y % 8];
+ cell->v8[x][y] = (float)mcells->ch[x/8][y/8].v8[x%8][y%8];
+ cell->v9[x][y] = (float)mcells->ch[x/8][y/8].v9[x%8][y%8];
}
- // extra 1 point on bounds
- cell->v9[x][128] = (float)mcells->ch[x / 8][15].v9[x % 8][8];
- // x == y
- cell->v9[128][x] = (float)mcells->ch[15][x / 8].v9[8][x % 8];
+ //extra 1 point on bounds
+ cell->v9[x][128] = (float)mcells->ch[x/8][15].v9[x%8][8];
+ //x==y
+ cell->v9[128][x] = (float)mcells->ch[15][x/8].v9[8][x%8];
}
- // and the last 1
+ //and the last 1
cell->v9[128][128] = (float)mcells->ch[15][15].v9[8][8];
delete mcells;
}
-const char MAP_MAGIC[] = "MAP_2.01";
+const char MAP_MAGIC[] = "MAP_2.00";
-bool ConvertADT(char *filename, char *filename2)
+bool ConvertADT(char * filename,char * filename2)
{
+ //if(!strstr(filename,"oth_32_48"))return false;
if(!LoadADT(filename))
return false;
- FILE *output=fopen(filename2, "wb");
+ FILE *output=fopen(filename2,"wb");
if(!output)
{
- printf("Can't create the output file '%s'\n", filename2);
- delete [] MapLiqHeight;
- delete [] MapLiqFlag;
+ printf("Can't create the output file '%s'\n",filename2);
return false;
}
// write magic header
- fwrite(MAP_MAGIC, 1, 8, output);
+ fwrite(MAP_MAGIC,1,8,output);
- for(uint32 x = 0; x < 16; ++x)
+ for(unsigned int x=0;x<16;x++)
{
- for(uint32 y = 0; y < 16; ++y)
+ for(unsigned int y=0;y<16;y++)
{
- if(mcells->ch[y][x].area_id && mcells->ch[y][x].area_id <= maxAreaId)
+ if(mcells->ch[y][x].area_id && mcells->ch[y][x].area_id < 0x102D)
{
- if(areas[mcells->ch[y][x].area_id] == 0xffff)
- printf("\nCan't find area flag for areaid %u.\n", mcells->ch[y][x].area_id);
+ if(areas[mcells->ch[y][x].area_id]==0xffff)
+ printf("\nCan't find area flag for areaid %u.\n",mcells->ch[y][x].area_id);
- fwrite(&areas[mcells->ch[y][x].area_id], 1, 2, output);
+ fwrite(&areas[mcells->ch[y][x].area_id],1,2,output);
}
else
{
- uint16 flag = 0xffff;
- fwrite(&flag, 1, 2, output);
+ uint16 flag=0xffff;
+ fwrite(&flag,1,2,output);
}
}
}
- fwrite(MapLiqFlag, 1, 256, output);
- delete [] MapLiqFlag;
+ for(unsigned int x=0;x<16;x++)
+ for(unsigned int y=0;y<16;y++)
+ fwrite(&mcells->ch[y][x].flag,1,1,output);
- fwrite(MapLiqHeight, sizeof(float), 16384, output);
- delete [] MapLiqHeight;
+ TransformWaterData();
+ for(unsigned int x=0;x<128;x++)
+ for(unsigned int y=0;y<128;y++)
+ fwrite(&cell->v9[y][x],1,sizeof(float),output);
+
+ delete cell;
TransformData();
- for(uint32 x = 0; x < iRes; ++x)
+ for(unsigned int x=0;x<iRes;x++)
+ for(unsigned int y=0;y<iRes;y++)
{
- for(uint32 y = 0; y < iRes; ++y)
- {
- float z = (float)GetZ(
- (((double)(y)) * TILESIZE) / ((double)(iRes - 1)),
- (((double)(x)) * TILESIZE) / ((double)(iRes - 1)));
+ float z=(float)GetZ(
+ (((double)(y))*TILESIZE)/((double)(iRes-1)),
+ (((double)(x))*TILESIZE)/((double)(iRes-1)));
- fwrite(&z, 1, sizeof(z), output);
- }
+ fwrite(&z,1,sizeof(z),output);
}
fclose(output);
delete cell;
-
+/*
+ for (std::vector<std::string>::iterator it = wmos.begin(); it != wmos.end(); ++it)
+ wmomanager.delbyname(*it);
+
+ wmos.clear();
+ wmois.clear();
+
+ for (std::vector<model>::iterator it = wmomodel.begin(); it != wmomodel.end(); ++it)
+ {
+ it->tr.clear();
+
+ }
+ //printf("\n %d \n",in);
+ wmomodel.clear();
+ //polygons.clear();*/
return true;
}
diff --git a/contrib/extractor/adt.h b/contrib/extractor/adt.h
index ec607c9d7bc..6e079461a66 100644
--- a/contrib/extractor/adt.h
+++ b/contrib/extractor/adt.h
@@ -9,121 +9,46 @@ typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned int uint32;
class Liquid;
-typedef struct
-{
- float x;
- float y;
- float z;
-} svec;
-
-typedef struct
-{
- double x;
- double y;
- double z;
-} vec;
-
-typedef struct
-{
+typedef struct {
+float x;
+float y;
+float z;
+}svec;
+
+typedef struct {
+double x;
+double y;
+double z;
+}vec;
+
+typedef struct{
vec v[3];
-} triangle;
-
-typedef struct
-{
- float v9[16 * 8 + 1][16 * 8 + 1];
- float v8[16 * 8][16 * 8];
-} Cell;
-
-typedef struct
-{
- double v9[9][9];
- double v8[8][8];
- uint16 area_id;
-} chunk;
+}triangle;
-typedef struct
-{
- chunk ch[16][16];
-} mcell;
+typedef struct{
+float v9[16*8+1][16*8+1];
+float v8[16*8][16*8];
+}Cell;
-struct MapChunkHeader
-{
- uint32 flags;
- uint32 ix;
- uint32 iy;
- uint32 nLayers;
- uint32 nDoodadRefs;
- uint32 ofsHeight;
- uint32 ofsNormal;
- uint32 ofsLayer;
- uint32 ofsRefs;
- uint32 ofsAlpha;
- uint32 sizeAlpha;
- uint32 ofsShadow;
- uint32 sizeShadow;
- uint32 areaid;
- uint32 nMapObjRefs;
- uint32 holes;
- uint16 s1;
- uint16 s2;
- uint32 d1;
- uint32 d2;
- uint32 d3;
- uint32 predTex;
- uint32 nEffectDoodad;
- uint32 ofsSndEmitters;
- uint32 nSndEmitters;
- uint32 ofsLiquid; // not use in WotLK
- uint32 sizeLiquid; // not use in WotLK
- float zpos;
- float xpos;
- float ypos;
- uint32 textureId; // new offsColorValues in WotLK
- uint32 props;
- uint32 effectId;
-};
+typedef struct{
+double v9[9][9];
+double v8[8][8];
+uint16 area_id;
+//Liquid *lq;
+float waterlevel[9][9];
+uint8 flag;
+}chunk;
-typedef struct
-{
- uint32 offsData1;
- uint32 used;
- uint32 offsData2;
-} MH2O_offsData;
+class WMO;
+class WMOManager;
+void fixname(std::string &name);
typedef struct
{
- uint16 LiquidTypeId;
- uint16 type;
- float heightLevel1;
- float heightLevel2;
- uint8 xOffset;
- uint8 yOffset;
- uint8 width;
- uint8 height;
- uint32 ofsData2a;
- uint32 ofsData2b;
-} MH2O_Data1;
-
-typedef struct
-{
- uint16 unk1;
- uint16 unk2;
- float height;
-} LiqData;
-
-enum LiquidType
-{
- LIQUID_TYPE_WATER = 0,
- LIQUID_TYPE_OCEAN = 1,
- LIQUID_TYPE_MAGMA = 2,
- LIQUID_TYPE_SLIME = 3
-};
-
+chunk ch[16][16];
+}mcell;
class MPQFile;
-
-float *MapLiqHeight;
-uint8 *MapLiqFlag;
-uint32 k, m, chunk_num;
-void LoadMapChunk(MPQFile &, chunk*);
+void LoadMapChunk(MPQFile &,chunk*);
+bool LoadWMO(char* filename);
#endif
diff --git a/contrib/vmap_extract_assembler_bin/vmap_assembler.exe b/contrib/vmap_extract_assembler_bin/vmap_assembler.exe
index a6ef74dc086..5cb08f770aa 100644
--- a/contrib/vmap_extract_assembler_bin/vmap_assembler.exe
+++ b/contrib/vmap_extract_assembler_bin/vmap_assembler.exe
Binary files differ
diff --git a/contrib/vmap_extract_assembler_bin/vmapextract_v2.exe b/contrib/vmap_extract_assembler_bin/vmapextract_v2.exe
index 03c76907658..c38b6e64f64 100644
--- a/contrib/vmap_extract_assembler_bin/vmapextract_v2.exe
+++ b/contrib/vmap_extract_assembler_bin/vmapextract_v2.exe
Binary files differ
diff --git a/contrib/vmap_extractor_v2/vmapextract/model.cpp b/contrib/vmap_extractor_v2/vmapextract/model.cpp
index 1d0c17d52e6..7dca7841d74 100644
--- a/contrib/vmap_extractor_v2/vmapextract/model.cpp
+++ b/contrib/vmap_extractor_v2/vmapextract/model.cpp
@@ -1,7 +1,11 @@
+//#include "common.h"
#include "model.h"
+//#include "world.h"
#include <cassert>
#include <algorithm>
+//int globalTime = 0;
+
Model::Model(std::string &filename) : filename(filename)
{
}
@@ -20,31 +24,121 @@ bool Model::open()
}
memcpy(&header, f.getBuffer(), sizeof(ModelHeader));
- if(header.nBoundingTriangles > 0)
- {
- f.seek(0);
- f.seekRelative(header.ofsBoundingVertices);
- vertices = new Vec3D[header.nBoundingVertices];
- f.read(vertices,header.nBoundingVertices*12);
- for (uint32 i=0; i<header.nBoundingVertices; i++)
+ if(header.nBoundingTriangles > 0) {
+
+#if 0
+ animated = isAnimated(f);
+ if(animated)
{
- vertices[i] = fixCoordSystem(vertices[i]);
+ f.close();
+ return false;
+ }
+#endif
+ trans = 1.0f;
+ origVertices = (ModelVertex*)(f.getBuffer() + header.ofsVertices);
+
+ vertices = new Vec3D[header.nVertices];
+ normals = new Vec3D[header.nVertices];
+
+ for (size_t i=0; i<header.nVertices; i++)
+ {
+ origVertices[i].pos = fixCoordSystem(origVertices[i].pos);
+ origVertices[i].normal = fixCoordSystem(origVertices[i].normal);
+ vertices[i] = origVertices[i].pos;
+ normals[i] = origVertices[i].normal.normalize();
+ }
+
+ ModelView *view = (ModelView*)(f.getBuffer() + header.ofsViews);
+
+ uint16 *indexLookup = (uint16*)(f.getBuffer() + view->ofsIndex);
+ uint16 *triangles = (uint16*)(f.getBuffer() + view->ofsTris);
+
+ nIndices = view->nTris;
+ indices = new uint16[nIndices];
+ for (size_t i = 0; i<nIndices; i++)
+ {
+ indices[i] = indexLookup[triangles[i]];
}
- f.seek(0);
- f.seekRelative(header.ofsBoundingTriangles);
- indices = new uint16[header.nBoundingTriangles];
- f.read(indices,header.nBoundingTriangles*2);
f.close();
- }
- else
- {
+ } else {
//printf("not included %s\n", filename.c_str());
- f.close();
return false;
}
return true;
+
}
+bool Model::isAnimated(MPQFile &f)
+{
+ // see if we have any animated bones
+ ModelBoneDef *bo = (ModelBoneDef*)(f.getBuffer() + header.ofsBones);
+
+ animGeometry = false;
+ animBones = false;
+ ind = false;
+
+ ModelVertex *verts = (ModelVertex*)(f.getBuffer() + header.ofsVertices);
+ for (size_t i=0; i<header.nVertices && !animGeometry; i++) {
+ for (size_t b=0; b<4; b++) {
+ if (verts[i].weights[b]>0) {
+ ModelBoneDef &bb = bo[verts[i].bones[b]];
+ if (bb.translation.type || bb.rotation.type || bb.scaling.type || (bb.flags&8)) {
+ if (bb.flags&8) {
+ // if we have billboarding, the model will need per-instance animation
+ ind = true;
+ }
+ animGeometry = true;
+ break;
+ }
+ }
+ }
+ }
+
+ if (animGeometry) animBones = true;
+ else {
+ for (size_t i=0; i<header.nBones; i++) {
+ ModelBoneDef &bb = bo[i];
+ if (bb.translation.type || bb.rotation.type || bb.scaling.type) {
+ animBones = true;
+ break;
+ }
+ }
+ }
+
+ animTextures = header.nTexAnims > 0;
+
+ bool animMisc = header.nCameras>0 || // why waste time, pretty much all models with cameras need animation
+ header.nLights>0 || // same here
+ header.nParticleEmitters>0 ||
+ header.nRibbonEmitters>0;
+
+ if (animMisc) animBones = true;
+
+ // animated colors
+ if (header.nColors) {
+ ModelColorDef *cols = (ModelColorDef*)(f.getBuffer() + header.ofsColors);
+ for (size_t i=0; i<header.nColors; i++) {
+ if (cols[i].color.type!=0 || cols[i].opacity.type!=0) {
+ animMisc = true;
+ break;
+ }
+ }
+ }
+
+ // animated opacity
+ if (header.nTransparency && !animMisc) {
+ ModelTransDef *trs = (ModelTransDef*)(f.getBuffer() + header.ofsTransparency);
+ for (size_t i=0; i<header.nTransparency; i++) {
+ if (trs[i].trans.type!=0) {
+ animMisc = true;
+ break;
+ }
+ }
+ }
+
+ // guess not...
+ return animGeometry || animTextures || animMisc;
+}
bool Model::ConvertToVMAPModel(char * outfilename)
{
@@ -57,8 +151,7 @@ bool Model::ConvertToVMAPModel(char * outfilename)
return false;
}
fwrite("VMAP002",8,1,output);
- uint32 nVertices = 0;
- nVertices = header.nBoundingVertices;
+ int nVertices = header.nVertices;
fwrite(&nVertices, sizeof(int), 1, output);
uint32 nofgroups = 1;
fwrite(&nofgroups,sizeof(uint32), 1, output);
@@ -69,16 +162,15 @@ bool Model::ConvertToVMAPModel(char * outfilename)
wsize = sizeof(branches) + sizeof(uint32) * branches;
fwrite(&wsize, sizeof(int), 1, output);
fwrite(&branches,sizeof(branches), 1, output);
- uint32 nIndexes = 0;
- nIndexes = header.nBoundingTriangles;
- fwrite(&nIndexes,sizeof(uint32), 1, output);
+ uint32 nIdexes = (uint32) nIndices;
+ fwrite(&nIndices,sizeof(uint32), 1, output);
fwrite("INDX",4, 1, output);
- wsize = sizeof(uint32) + sizeof(unsigned short) * nIndexes;
+ wsize = sizeof(uint32) + sizeof(unsigned short) * nIdexes;
fwrite(&wsize, sizeof(int), 1, output);
- fwrite(&nIndexes, sizeof(uint32), 1, output);
- if(nIndexes >0)
+ fwrite(&nIdexes, sizeof(uint32), 1, output);
+ if(nIdexes >0)
{
- fwrite(indices, sizeof(unsigned short), nIndexes, output);
+ fwrite(indices, sizeof(unsigned short), nIdexes, output);
}
fwrite("VERT",4, 1, output);
wsize = sizeof(int) + sizeof(float) * 3 * nVertices;
@@ -86,7 +178,7 @@ bool Model::ConvertToVMAPModel(char * outfilename)
fwrite(&nVertices, sizeof(int), 1, output);
if(nVertices >0)
{
- for(uint32 vpos=0; vpos <nVertices; ++vpos)
+ for(int vpos=0; vpos <nVertices; ++vpos)
{
float sy = vertices[vpos].y;
vertices[vpos].y = vertices[vpos].z;
@@ -97,6 +189,7 @@ bool Model::ConvertToVMAPModel(char * outfilename)
delete[] vertices;
delete[] indices;
+ delete[] normals;
fclose(output);
diff --git a/contrib/vmap_extractor_v2/vmapextract/model.h b/contrib/vmap_extractor_v2/vmapextract/model.h
index a2bdee9465b..0af492f922c 100644
--- a/contrib/vmap_extractor_v2/vmapextract/model.h
+++ b/contrib/vmap_extractor_v2/vmapextract/model.h
@@ -4,6 +4,7 @@
#include "vec3d.h"
#include "mpq.h"
#include "modelheaders.h"
+//#include "quaternion.h"
#include <vector>
class Model;
@@ -17,14 +18,18 @@ Vec3D fixCoordSystem(Vec3D v);
class Model
{
public:
-
ModelHeader header;
+ ModelAnimation *anims;
+ int *globalSequences;
public:
+ bool animGeometry,animTextures,animBones;
+ bool animated;
- uint32 offsBB_vertices, offsBB_indices;
- Vec3D *BB_vertices, *vertices;
- uint16 *BB_indices, *indices;
+ bool isAnimated(MPQFile &f);
+ ModelVertex *origVertices;
+ Vec3D *vertices, *normals;
+ uint16 *indices;
size_t nIndices;
bool open();
@@ -33,6 +38,12 @@ public:
public:
bool ok;
+ bool ind;
+
+ float rad;
+ float trans;
+ bool animcalc;
+ int anim, animtime;
Model(std::string &filename);
~Model();
@@ -48,9 +59,15 @@ public:
Model *model;
int id;
+
Vec3D pos, rot;
unsigned int d1, scale;
- float w,sc;
+
+ float frot,w,sc;
+
+ int light;
+ Vec3D ldir;
+ Vec3D lcol;
ModelInstance() {}
ModelInstance(MPQFile &f,const char* ModelInstName,const char*MapName, FILE *pDirfile);
diff --git a/contrib/vmap_extractor_v2/vmapextract/modelheaders.h b/contrib/vmap_extractor_v2/vmapextract/modelheaders.h
index c35b983c19b..7d5e800e796 100644
--- a/contrib/vmap_extractor_v2/vmapextract/modelheaders.h
+++ b/contrib/vmap_extractor_v2/vmapextract/modelheaders.h
@@ -15,67 +15,289 @@ struct ModelHeader {
uint8 version[4];
uint32 nameLength;
uint32 nameOfs;
- uint32 type;
+ uint32 type;
+
uint32 nGlobalSequences;
uint32 ofsGlobalSequences;
uint32 nAnimations;
uint32 ofsAnimations;
- uint32 nAnimationLookup;
- uint32 ofsAnimationLookup;
- uint32 nBones;
- uint32 ofsBones;
- uint32 nKeyBoneLookup;
- uint32 ofsKeyBoneLookup;
+ uint32 nC;
+ uint32 ofsC;
+ uint32 nD;
+ uint32 ofsD;
+ uint32 nBones;
+ uint32 ofsBones;
+ uint32 nF;
+ uint32 ofsF;
+
uint32 nVertices;
uint32 ofsVertices;
uint32 nViews;
+ uint32 ofsViews;
+
uint32 nColors;
uint32 ofsColors;
+
uint32 nTextures;
uint32 ofsTextures;
- uint32 nTransparency;
+
+ uint32 nTransparency; // H
uint32 ofsTransparency;
- uint32 nTextureanimations;
- uint32 ofsTextureanimations;
- uint32 nTexReplace;
- uint32 ofsTexReplace;
- uint32 nRenderFlags;
- uint32 ofsRenderFlags;
- uint32 nBoneLookupTable;
- uint32 ofsBoneLookupTable;
- uint32 nTexLookup;
- uint32 ofsTexLookup;
- uint32 nTexUnits;
- uint32 ofsTexUnits;
- uint32 nTransLookup;
- uint32 ofsTransLookup;
- uint32 nTexAnimLookup;
- uint32 ofsTexAnimLookup;
- float floats[14];
- uint32 nBoundingTriangles;
- uint32 ofsBoundingTriangles;
- uint32 nBoundingVertices;
- uint32 ofsBoundingVertices;
- uint32 nBoundingNormals;
- uint32 ofsBoundingNormals;
- uint32 nAttachments;
- uint32 ofsAttachments;
- uint32 nAttachLookup;
- uint32 ofsAttachLookup;
- uint32 nAttachments_2;
- uint32 ofsAttachments_2;
- uint32 nLights;
- uint32 ofsLights;
- uint32 nCameras;
- uint32 ofsCameras;
- uint32 nCameraLookup;
- uint32 ofsCameraLookup;
- uint32 nRibbonEmitters;
- uint32 ofsRibbonEmitters;
- uint32 nParticleEmitters;
- uint32 ofsParticleEmitters;
+ uint32 nI; // always unused ?
+ uint32 ofsI;
+ uint32 nTexAnims; // J
+ uint32 ofsTexAnims;
+ uint32 nK;
+ uint32 ofsK;
+
+ uint32 nTexFlags;
+ uint32 ofsTexFlags;
+ uint32 nY;
+ uint32 ofsY;
+
+ uint32 nTexLookup;
+ uint32 ofsTexLookup;
+
+ uint32 nTexUnitLookup; // L
+ uint32 ofsTexUnitLookup;
+ uint32 nTransparencyLookup; // M
+ uint32 ofsTransparencyLookup;
+ uint32 nTexAnimLookup;
+ uint32 ofsTexAnimLookup;
+
+ float floats[14];
+
+ uint32 nBoundingTriangles;
+ uint32 ofsBoundingTriangles;
+ uint32 nBoundingVertices;
+ uint32 ofsBoundingVertices;
+ uint32 nBoundingNormals;
+ uint32 ofsBoundingNormals;
+
+ uint32 nO;
+ uint32 ofsO;
+ uint32 nP;
+ uint32 ofsP;
+ uint32 nQ;
+ uint32 ofsQ;
+ uint32 nLights; // R
+ uint32 ofsLights;
+ uint32 nCameras; // S
+ uint32 ofsCameras;
+ uint32 nT;
+ uint32 ofsT;
+ uint32 nRibbonEmitters; // U
+ uint32 ofsRibbonEmitters;
+ uint32 nParticleEmitters; // V
+ uint32 ofsParticleEmitters;
+
+};
+
+// block B - animations
+struct ModelAnimation {
+ uint32 animID;
+ uint32 timeStart;
+ uint32 timeEnd;
+
+ float moveSpeed;
+
+ uint32 loopType;
+ uint32 flags;
+ uint32 d1;
+ uint32 d2;
+ uint32 playSpeed; // note: this can't be play speed because it's 0 for some models
+
+ Vec3D boxA, boxB;
+ float rad;
+
+ int16 s[2];
+};
+
+
+// sub-block in block E - animation data
+struct AnimationBlock {
+ int16 type; // interpolation type (0=none, 1=linear, 2=hermite)
+ int16 seq; // global sequence id or -1
+ uint32 nRanges;
+ uint32 ofsRanges;
+ uint32 nTimes;
+ uint32 ofsTimes;
+ uint32 nKeys;
+ uint32 ofsKeys;
+};
+
+// block E - bones
+struct ModelBoneDef {
+ int32 animid;
+ int32 flags;
+ int16 parent; // parent bone index
+ int16 geoid;
+ // new int added to the bone definitions. Added in WoW 2.0
+ int32 unknown;
+ AnimationBlock translation;
+ AnimationBlock rotation;
+ AnimationBlock scaling;
+ Vec3D pivot;
+};
+
+struct ModelTexAnimDef {
+ AnimationBlock trans, rot, scale;
+};
+
+struct ModelVertex {
+ Vec3D pos;
+ uint8 weights[4];
+ uint8 bones[4];
+ Vec3D normal;
+ Vec2D texcoords;
+ int unk1, unk2; // always 0,0 so this is probably unused
+};
+
+struct ModelView {
+ uint32 nIndex, ofsIndex; // Vertices in this model (index into vertices[])
+ uint32 nTris, ofsTris; // indices
+ uint32 nProps, ofsProps; // additional vtx properties
+ uint32 nSub, ofsSub; // materials/renderops/submeshes
+ uint32 nTex, ofsTex; // material properties/textures
+ int32 lod; // LOD bias?
+};
+
+
+/// One material + render operation
+struct ModelGeoset {
+ uint16 d1; // mesh part id?
+ uint16 d2; // ?
+ uint16 vstart; // first vertex
+ uint16 vcount; // num vertices
+ uint16 istart; // first index
+ uint16 icount; // num indices
+ uint16 d3; // number of bone indices
+ uint16 d4; // offset into bone index list
+ uint16 d5; // ?
+ uint16 d6; // root bone?
+ Vec3D v;
+ float unknown[4]; // Added in WoW 2.0?
+};
+
+/// A texture unit (sub of material)
+struct ModelTexUnit{
+ // probably the texture units
+ // size always >=number of materials it seems
+ uint16 flags; // Flags
+ uint16 order; // ?
+ uint16 op; // Material this texture is part of (index into mat)
+ uint16 op2; // Always same as above?
+ int16 colorIndex; // color or -1
+ uint16 flagsIndex; // more flags...
+ uint16 texunit; // Texture unit (0 or 1)
+ uint16 d4; // ? (seems to be always 1)
+ uint16 textureid; // Texture id (index into global texture list)
+ uint16 texunit2; // copy of texture unit value?
+ uint16 transid; // transparency id (index into transparency list)
+ uint16 texanimid; // texture animation id
+};
+
+// block X - render flags
+struct ModelRenderFlags {
+ uint16 flags;
+ uint16 blend;
+};
+
+// block G - color defs
+struct ModelColorDef {
+ AnimationBlock color;
+ AnimationBlock opacity;
+};
+
+// block H - transp defs
+struct ModelTransDef {
+ AnimationBlock trans;
+};
+
+struct ModelTextureDef {
+ uint32 type;
+ uint32 flags;
+ uint32 nameLen;
+ uint32 nameOfs;
+};
+
+struct ModelLightDef {
+ int16 type;
+ int16 bone;
+ Vec3D pos;
+ AnimationBlock ambColor;
+ AnimationBlock ambIntensity;
+ AnimationBlock color;
+ AnimationBlock intensity;
+ AnimationBlock attStart;
+ AnimationBlock attEnd;
+ AnimationBlock unk1;
+};
+
+struct ModelCameraDef {
+ int32 id;
+ float fov, farclip, nearclip;
+ AnimationBlock transPos;
+ Vec3D pos;
+ AnimationBlock transTarget;
+ Vec3D target;
+ AnimationBlock rot;
+};
+
+
+struct ModelParticleParams {
+ float mid;
+ uint32 colors[3];
+ float sizes[3];
+ int16 d[10];
+ float unk[3];
+ float scales[3];
+ float slowdown;
+ float rotation;
+ float f2[16];
+};
+
+struct ModelParticleEmitterDef {
+ int32 id;
+ int32 flags;
+ Vec3D pos;
+ int16 bone;
+ int16 texture;
+ int32 nZero1;
+ int32 ofsZero1;
+ int32 nZero2;
+ int32 ofsZero2;
+ int16 blend;
+ int16 type;
+ int16 s1;
+ int16 s2;
+ int16 cols;
+ int16 rows;
+ AnimationBlock params[10];
+ ModelParticleParams p;
+ AnimationBlock unk;
};
+
+struct ModelRibbonEmitterDef {
+ int32 id;
+ int32 bone;
+ Vec3D pos;
+ int32 nTextures;
+ int32 ofsTextures;
+ int32 nUnknown;
+ int32 ofsUnknown;
+ AnimationBlock color;
+ AnimationBlock opacity;
+ AnimationBlock above;
+ AnimationBlock below;
+ float res, length, unk;
+ int16 s1, s2;
+ AnimationBlock unk1;
+ AnimationBlock unk2;
+};
+
+
#pragma pack(pop)
diff --git a/contrib/vmap_extractor_v2/vmapextract/vmapexport.cpp b/contrib/vmap_extractor_v2/vmapextract/vmapexport.cpp
index 0d2b39f8d06..dfc7cddcfdd 100644
--- a/contrib/vmap_extractor_v2/vmapextract/vmapexport.cpp
+++ b/contrib/vmap_extractor_v2/vmapextract/vmapexport.cpp
@@ -421,10 +421,6 @@ bool fillArchiveNameVector(std::vector<std::string>& pArchiveNames) {
// open expansion and common files
printf("Opening data files from data directory.\n");
- sprintf(path, "%slichking.mpq", input_path);
- pArchiveNames.push_back(path);
- sprintf(path, "%scommon-2.mpq", input_path);
- pArchiveNames.push_back(path);
sprintf(path, "%sexpansion.mpq", input_path);
pArchiveNames.push_back(path);
sprintf(path, "%scommon.mpq", input_path);
@@ -436,8 +432,6 @@ bool fillArchiveNameVector(std::vector<std::string>& pArchiveNames) {
for (std::vector<std::string>::iterator i = locales.begin(); i != locales.end(); i++)
{
printf("Locale: %s\n", i->c_str());
- sprintf(path, "%s%s\\lichking-locale-%s.mpq", input_path, i->c_str(), i->c_str());
- pArchiveNames.push_back(path);
sprintf(path, "%s%s\\expansion-locale-%s.mpq", input_path, i->c_str(), i->c_str());
pArchiveNames.push_back(path);
sprintf(path, "%s%s\\locale-%s.mpq", input_path, i->c_str(), i->c_str());
diff --git a/sql/characters.sql b/sql/characters.sql
index 1478571f131..4bb56a23297 100644
--- a/sql/characters.sql
+++ b/sql/characters.sql
@@ -15,13 +15,22 @@
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+
+--
+-- Table structure for table `saved_variables`
+--
+
+CREATE TABLE `saved_variables` (
+ `NextArenaPointDistributionTime` bigint(40) UNSIGNED NOT NULL DEFAULT '0'
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Variable Saves';
+
--
-- Table structure for table `character_db_version`
--
DROP TABLE IF EXISTS `character_db_version`;
CREATE TABLE `character_db_version` (
- `required_2008_12_22_19_characters_item_instance` bit(1) default NULL
+ `required_2008_12_15_01_character_arenas` bit(1) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Last applied sql update to DB';
--
@@ -36,28 +45,6 @@ INSERT INTO `character_db_version` VALUES
UNLOCK TABLES;
--
--- Table structure for table `account_data`
---
-
-DROP TABLE IF EXISTS `account_data`;
-CREATE TABLE `account_data` (
- `account` int(11) unsigned NOT NULL default '0',
- `type` int(11) unsigned NOT NULL default '0',
- `time` bigint(11) unsigned NOT NULL default '0',
- `data` longtext NOT NULL,
- PRIMARY KEY (`account`,`type`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
---
--- Dumping data for table `account_data`
---
-
-LOCK TABLES `account_data` WRITE;
-/*!40000 ALTER TABLE `account_data` DISABLE KEYS */;
-/*!40000 ALTER TABLE `account_data` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
-- Table structure for table `arena_team`
--
@@ -242,49 +229,6 @@ LOCK TABLES `characters` WRITE;
UNLOCK TABLES;
--
--- Table structure for table `character_achievement`
---
-
-DROP TABLE IF EXISTS `character_achievement`;
-CREATE TABLE `character_achievement` (
- `guid` int(11) NOT NULL,
- `achievement` int(11) NOT NULL,
- `date` int(11) NOT NULL,
- PRIMARY KEY (`guid`,`achievement`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
---
--- Dumping data for table `character_achievement`
---
-
-LOCK TABLES `character_achievement` WRITE;
-/*!40000 ALTER TABLE `character_achievement` DISABLE KEYS */;
-/*!40000 ALTER TABLE `character_achievement` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `character_achievement_progress`
---
-
-DROP TABLE IF EXISTS `character_achievement_progress`;
-CREATE TABLE `character_achievement_progress` (
- `guid` int(11) NOT NULL,
- `criteria` int(11) NOT NULL,
- `counter` int(11) NOT NULL,
- `date` int(11) NOT NULL,
- PRIMARY KEY (`guid`,`criteria`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
---
--- Dumping data for table `character_achievement_progress`
---
-
-LOCK TABLES `character_achievement_progress` WRITE;
-/*!40000 ALTER TABLE `character_achievement_progress` DISABLE KEYS */;
-/*!40000 ALTER TABLE `character_achievement_progress` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
-- Table structure for table `character_action`
--
@@ -466,7 +410,9 @@ CREATE TABLE `character_pet` (
`level` int(11) unsigned NOT NULL default '1',
`exp` int(11) unsigned NOT NULL default '0',
`Reactstate` tinyint(1) unsigned NOT NULL default '0',
- `talentpoints` int(11) unsigned NOT NULL default '0',
+ `loyaltypoints` int(11) NOT NULL default '0',
+ `loyalty` int(11) unsigned NOT NULL default '0',
+ `trainpoint` int(11) NOT NULL default '0',
`name` varchar(100) default 'Pet',
`renamed` tinyint(1) unsigned NOT NULL default '0',
`slot` int(11) unsigned NOT NULL default '0',
@@ -1288,7 +1234,6 @@ CREATE TABLE `petition_sign` (
`type` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`petitionguid`,`playerguid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Guild System';
-
--
-- Dumping data for table `petition_sign`
--
@@ -1379,26 +1324,6 @@ UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
---
--- Table structure for table `saved_variables`
---
-
-DROP TABLE IF EXISTS `saved_variables`;
-CREATE TABLE `saved_variables` (
- `NextArenaPointDistributionTime` bigint(40) UNSIGNED NOT NULL DEFAULT '0'
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Variable Saves';
-
---
--- Dumping data for table `saved_variables`
---
-
-LOCK TABLES `saved_variables` WRITE;
-/*!40000 ALTER TABLE `saved_variables` DISABLE KEYS */;
-/*!40000 ALTER TABLE `saved_variables` ENABLE KEYS */;
-UNLOCK TABLES;
-/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
-
-
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
diff --git a/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp b/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
index f26209d4340..73c3f6121db 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
+++ b/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
@@ -137,9 +137,6 @@ EndScriptData */
#define FLAME_ENRAGE_DISTANCE 30
#define FLAME_CHARGE_DISTANCE 50
-#define ITEM_ID_MAIN_HAND 32837
-#define ITEM_ID_OFF_HAND 32838
-
/**** Creature Summon and Recognition IDs ****/
enum CreatureEntry
{
@@ -457,7 +454,7 @@ struct TRINITY_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI
{
GameObject* Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(i));
if(Door)
- Door->SetGoState(0); // Open Doors
+ Door->SetUInt32Value(GAMEOBJECT_STATE, 0); // Open Doors
}
}
@@ -490,10 +487,10 @@ struct TRINITY_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI
{
if(spell->Id == SPELL_GLAIVE_RETURNS) // Re-equip our warblades!
{
- if(!m_creature->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID))
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 45479);
+ if(!m_creature->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY))
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 45479);
else
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 45481);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 45481);
m_creature->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE );
}
}
@@ -570,8 +567,8 @@ struct TRINITY_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI
Timer[EVENT_FLIGHT_SEQUENCE] = 700;
break;
case 4://throw another
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
{
uint8 i=0;
Creature* Glaive = m_creature->SummonCreature(BLADE_OF_AZZINOTH, GlaivePosition[i].x, GlaivePosition[i].y, GlaivePosition[i].z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0);
@@ -656,14 +653,14 @@ struct TRINITY_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI
if(DemonTransformation[TransformCount].equip)
{
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 45479); // Requip warglaives if needed
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 45481);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 45479); // Requip warglaives if needed
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 45481);
m_creature->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE );
}
else
{
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+0, 0); // Unequip warglaives if needed
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0); // Unequip warglaives if needed
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
}
switch(TransformCount)
@@ -1009,10 +1006,10 @@ struct TRINITY_DLL_DECL npc_akama_illidanAI : public ScriptedAI
DoorGUID[1] = pInstance->GetData64(DATA_GAMEOBJECT_ILLIDAN_DOOR_L);
if(GETGO(Gate, GateGUID))
- Gate->SetGoState(1);
+ Gate->SetUInt32Value(GAMEOBJECT_STATE, 1);
for(uint8 i = 0; i < 2; i++)
if(GETGO(Door, DoorGUID[i]))
- Door->SetGoState(1);
+ Door->SetUInt32Value(GAMEOBJECT_STATE, 1);
}
else
{
@@ -1082,7 +1079,7 @@ struct TRINITY_DLL_DECL npc_akama_illidanAI : public ScriptedAI
for(uint8 i = 0; i < 2; i++)
if(GETGO(Door, DoorGUID[i]))
- Door->SetGoState(1);
+ Door->SetUInt32Value(GAMEOBJECT_STATE, 1);
if(GETCRE(Illidan, IllidanGUID))
{
@@ -1248,7 +1245,7 @@ struct TRINITY_DLL_DECL npc_akama_illidanAI : public ScriptedAI
Spirit[0]->InterruptNonMeleeSpells(true);
Spirit[1]->InterruptNonMeleeSpells(true);
if(GETGO(Gate, GateGUID))
- Gate->SetGoState(0);
+ Gate->SetUInt32Value(GAMEOBJECT_STATE, 0);
Timer = 2000;
break;
case 4:
@@ -1279,7 +1276,7 @@ struct TRINITY_DLL_DECL npc_akama_illidanAI : public ScriptedAI
case 6:
for(uint8 i = 0; i < 2; i++)
if(GETGO(Door, DoorGUID[i]))
- Door->SetGoState(0);
+ Door->SetUInt32Value(GAMEOBJECT_STATE, 0);
break;
case 8:
if(Phase == PHASE_WALK)
@@ -1389,9 +1386,9 @@ struct TRINITY_DLL_DECL boss_maievAI : public ScriptedAI
Timer[EVENT_MAIEV_STEALTH] = 0;
Timer[EVENT_MAIEV_TAUNT] = 22000 + rand()%21 * 1000;
Timer[EVENT_MAIEV_SHADOW_STRIKE] = 30000;
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 44850);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2, 45738);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 44850);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY + 1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY + 2, 45738);
}
void Aggro(Unit *who) {}
@@ -1677,7 +1674,7 @@ bool GOHello_cage_trap(Player* plr, GameObject* go)
cell_lock->Visit(cell_lock, cSearcher, *(plr->GetMap()));
((cage_trap_triggerAI*)trigger->AI())->Active = true;
- go->SetGoState(0);
+ go->SetUInt32Value(GAMEOBJECT_STATE, 0);
return true;
}
@@ -1862,8 +1859,8 @@ void boss_illidan_stormrageAI::Reset()
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING + MOVEMENTFLAG_ONTRANSPORT);
m_creature->CastSpell(m_creature, SPELL_DUAL_WIELD, true);
@@ -1910,8 +1907,8 @@ void boss_illidan_stormrageAI::HandleTalkSequence()
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
break;
case 8:
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 45479); // Equip our warglaives!
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 45481);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 45479); // Equip our warglaives!
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 45481);
m_creature->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE );
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
break;
diff --git a/src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp b/src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp
index 30a74c2da15..645a70df9f5 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp
+++ b/src/bindings/scripts/scripts/zone/black_temple/instance_black_temple.cpp
@@ -118,13 +118,13 @@ struct TRINITY_DLL_DECL instance_black_temple : public ScriptedInstance
void OpenDoor(uint64 DoorGUID, bool open)
{
if(GameObject *Door = instance->GetGameObjectInMap(DoorGUID))
- Door->SetGoState(open ? 0 : 1);
+ Door->SetUInt32Value(GAMEOBJECT_STATE, open ? 0 : 1);
}
void CloseDoor(uint64 DoorGUID, bool close)
{
if(GameObject *Door = instance->GetGameObjectInMap(DoorGUID))
- Door->SetGoState(close ? 1 : 0);
+ Door->SetUInt32Value(GAMEOBJECT_STATE, close ? 1 : 0);
}
void OnCreatureCreate(Creature *creature, uint32 creature_entry)
diff --git a/src/bindings/scripts/scripts/zone/blackrock_depths/instance_blackrock_depths.cpp b/src/bindings/scripts/scripts/zone/blackrock_depths/instance_blackrock_depths.cpp
index 25f3a4dc079..72002068fa8 100644
--- a/src/bindings/scripts/scripts/zone/blackrock_depths/instance_blackrock_depths.cpp
+++ b/src/bindings/scripts/scripts/zone/blackrock_depths/instance_blackrock_depths.cpp
@@ -89,13 +89,13 @@ struct TRINITY_DLL_DECL instance_blackrock_depths : public ScriptedInstance
void OpenGO(uint64 DoorGUID, bool open)
{
if(GameObject *Door = instance->GetGameObjectInMap(DoorGUID))
- Door->SetGoState(open ? 0 : 1);
+ Door->SetUInt32Value(GAMEOBJECT_STATE, open ? 0 : 1);
}
void CloseGO(uint64 DoorGUID, bool close)
{
if(GameObject *Door = instance->GetGameObjectInMap(DoorGUID))
- Door->SetGoState(close ? 1 : 0);
+ Door->SetUInt32Value(GAMEOBJECT_STATE, close ? 1 : 0);
}
uint32 GetData(uint32 type)
@@ -146,13 +146,13 @@ struct TRINITY_DLL_DECL instance_blackrock_depths : public ScriptedInstance
{
switch(go->GetEntry())
{
- case 170561: SupplyRoomGate = go->GetGUID(); state = go->GetGoState(); break;
- case 170562: GateDughal = go->GetGUID(); state = go->GetGoState(); break;
- case 170566: GateTobias = go->GetGUID(); state = go->GetGoState(); break;
- case 170567: GateCrest = go->GetGUID(); state = go->GetGoState(); break;
- case 170568: GateJaz = go->GetGUID(); state = go->GetGoState(); break;
- case 170569: GateShill = go->GetGUID(); state = go->GetGoState(); break;
- case 166872: SupplyCrate = go->GetGUID(); state = go->GetGoState(); break;
+ case 170561: SupplyRoomGate = go->GetGUID(); state = go->GetUInt32Value(GAMEOBJECT_STATE); break;
+ case 170562: GateDughal = go->GetGUID(); state = go->GetUInt32Value(GAMEOBJECT_STATE); break;
+ case 170566: GateTobias = go->GetGUID(); state = go->GetUInt32Value(GAMEOBJECT_STATE); break;
+ case 170567: GateCrest = go->GetGUID(); state = go->GetUInt32Value(GAMEOBJECT_STATE); break;
+ case 170568: GateJaz = go->GetGUID(); state = go->GetUInt32Value(GAMEOBJECT_STATE); break;
+ case 170569: GateShill = go->GetGUID(); state = go->GetUInt32Value(GAMEOBJECT_STATE); break;
+ case 166872: SupplyCrate = go->GetGUID(); state = go->GetUInt32Value(GAMEOBJECT_STATE); break;
}
}
diff --git a/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/old_hillsbrad.cpp b/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/old_hillsbrad.cpp
index 401651ae221..e442d067bc4 100644
--- a/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/old_hillsbrad.cpp
+++ b/src/bindings/scripts/scripts/zone/caverns_of_time/old_hillsbrad/old_hillsbrad.cpp
@@ -235,12 +235,12 @@ struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
case 9:
DoScriptText(SAY_TH_ARMORY, m_creature);
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, THRALL_WEAPON_MODEL);
- //m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, THRALL_WEAPON_INFO);
- //m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+1, 781);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, THRALL_SHIELD_MODEL);
- //m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+2, THRALL_SHIELD_INFO);
- //m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+3, 1038);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, THRALL_WEAPON_MODEL);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, THRALL_WEAPON_INFO);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+1, 781);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, THRALL_SHIELD_MODEL);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+2, THRALL_SHIELD_INFO);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+3, 1038);
break;
case 10:
m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, THRALL_MODEL_EQUIPPED);
@@ -399,8 +399,12 @@ struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
{
DoUnmount();
HadMount = false;
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+2, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+3, 0);
m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, THRALL_MODEL_UNEQUIPPED);
}
if( IsBeingEscorted )
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_leotheras_the_blind.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_leotheras_the_blind.cpp
index 833bb03bce2..ffa9094b439 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_leotheras_the_blind.cpp
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/boss_leotheras_the_blind.cpp
@@ -198,8 +198,8 @@ struct TRINITY_DLL_DECL boss_leotheras_the_blindAI : public ScriptedAI
m_creature->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
m_creature->ApplySpellImmune(0, IMMUNITY_EFFECT,SPELL_EFFECT_ATTACK_ME, true);
m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, MODEL_NIGHTELF);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID , 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY , 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
m_creature->CastSpell(m_creature, SPELL_DUAL_WIELD, true);
m_creature->SetCorpseDelay(1000*60*60);
if(pInstance)
@@ -305,8 +305,8 @@ struct TRINITY_DLL_DECL boss_leotheras_the_blindAI : public ScriptedAI
m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, MODEL_DEMON);
// and removing weapons
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID , 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY , 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
}
}
@@ -469,8 +469,8 @@ struct TRINITY_DLL_DECL boss_leotheras_the_blindAI : public ScriptedAI
m_creature->RemoveAurasDueToSpell(SPELL_WHIRLWIND,0);
m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, MODEL_DEMON);
DoScriptText(SAY_SWITCH_TO_DEMON, m_creature);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID , 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY , 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
DemonForm = true;
NeedThreatReset = true;
SwitchToDemon_Timer = 45000;
diff --git a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp
index 4e7f3d1989c..aaf6abdd3b0 100644
--- a/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp
+++ b/src/bindings/scripts/scripts/zone/coilfang_resevoir/serpent_shrine/instance_serpent_shrine.cpp
@@ -137,7 +137,7 @@ struct TRINITY_DLL_DECL instance_serpentshrine_cavern : public ScriptedInstance
void OpenDoor(uint64 DoorGUID, bool open)
{
if(GameObject *Door = instance->GetGameObjectInMap(DoorGUID))
- Door->SetGoState(open ? 0 : 1);
+ Door->SetUInt32Value(GAMEOBJECT_STATE, open ? 0 : 1);
}
void OnCreatureCreate(Creature *creature, uint32 creature_entry)
diff --git a/src/bindings/scripts/scripts/zone/deadmines/deadmines.cpp b/src/bindings/scripts/scripts/zone/deadmines/deadmines.cpp
index df7ea54efb0..23d65ce42f7 100644
--- a/src/bindings/scripts/scripts/zone/deadmines/deadmines.cpp
+++ b/src/bindings/scripts/scripts/zone/deadmines/deadmines.cpp
@@ -120,13 +120,13 @@ struct TRINITY_DLL_DECL instance_deadmines : public ScriptedInstance
void ShootCannon()
{
- DefiasCannon->SetGoState(0);
+ DefiasCannon->SetUInt32Value(GAMEOBJECT_STATE, 0);
DoPlaySound(DefiasCannon, SOUND_CANNONFIRE);
}
void BlastOutDoor()
{
- IronCladDoor->SetGoState(2);
+ IronCladDoor->SetUInt32Value(GAMEOBJECT_STATE, 2);
DoPlaySound(IronCladDoor, SOUND_DESTROYDOOR);
}
diff --git a/src/bindings/scripts/scripts/zone/gruuls_lair/boss_high_king_maulgar.cpp b/src/bindings/scripts/scripts/zone/gruuls_lair/boss_high_king_maulgar.cpp
index d31df82df58..cf1ff7c1eeb 100644
--- a/src/bindings/scripts/scripts/zone/gruuls_lair/boss_high_king_maulgar.cpp
+++ b/src/bindings/scripts/scripts/zone/gruuls_lair/boss_high_king_maulgar.cpp
@@ -238,8 +238,8 @@ struct TRINITY_DLL_DECL boss_high_king_maulgarAI : public ScriptedAI
DoScriptText(SAY_ENRAGE, m_creature);
m_creature->CastSpell(m_creature, SPELL_DUAL_WIELD, true);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
}
if(Phase2)
diff --git a/src/bindings/scripts/scripts/zone/karazhan/boss_prince_malchezaar.cpp b/src/bindings/scripts/scripts/zone/karazhan/boss_prince_malchezaar.cpp
index 08ee10967a1..f20ad6c69a5 100644
--- a/src/bindings/scripts/scripts/zone/karazhan/boss_prince_malchezaar.cpp
+++ b/src/bindings/scripts/scripts/zone/karazhan/boss_prince_malchezaar.cpp
@@ -289,11 +289,11 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI
void ClearWeapons()
{
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 0);
- //m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0);
- //m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+2, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+2, 0);
//damage
const CreatureInfo *cinfo = m_creature->GetCreatureInfo();
@@ -433,11 +433,11 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI
m_creature->CastSpell(m_creature, SPELL_THRASH_AURA, true);
//models
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, AXE_EQUIP_MODEL);
- //m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, AXE_EQUIP_INFO);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, AXE_EQUIP_MODEL);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, AXE_EQUIP_INFO);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, AXE_EQUIP_MODEL);
- //m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+2, AXE_EQUIP_INFO);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, AXE_EQUIP_MODEL);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+2, AXE_EQUIP_INFO);
//damage
const CreatureInfo *cinfo = m_creature->GetCreatureInfo();
@@ -475,8 +475,8 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI
Creature *axe = m_creature->SummonCreature(MALCHEZARS_AXE, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1000);
if(axe)
{
- axe->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, AXE_EQUIP_MODEL);
- //axe->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, AXE_EQUIP_INFO);
+ axe->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, AXE_EQUIP_MODEL);
+ axe->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, AXE_EQUIP_INFO);
axe->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
axe->setFaction(m_creature->getFaction());
diff --git a/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_headless_horseman.cpp b/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_headless_horseman.cpp
index d546c5b2d6f..f66e20ed5cd 100644
--- a/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_headless_horseman.cpp
+++ b/src/bindings/scripts/scripts/zone/scarlet_monastery/boss_headless_horseman.cpp
@@ -736,7 +736,7 @@ struct TRINITY_DLL_DECL mob_pulsing_pumpkinAI : public ScriptedAI
sprouted = false;
DoCast(m_creature,SPELL_PUMPKIN_AURA,true);
DoCast(m_creature,SPELL_SPROUTING);
- m_creature->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_STUNNED);
+ m_creature->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_DISABLE_ROTATE);
}
void Aggro(Unit *who){}
@@ -747,7 +747,7 @@ struct TRINITY_DLL_DECL mob_pulsing_pumpkinAI : public ScriptedAI
{
sprouted = true;
m_creature->RemoveAllAuras();
- m_creature->RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_STUNNED);
+ m_creature->RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_DISABLE_ROTATE);
DoCast(m_creature,SPELL_SPROUT_BODY,true);
m_creature->UpdateEntry(PUMPKIN_FIEND);
DoStartMovement(m_creature->getVictim());
diff --git a/src/bindings/scripts/scripts/zone/scarlet_monastery/instance_scarlet_monastery.cpp b/src/bindings/scripts/scripts/zone/scarlet_monastery/instance_scarlet_monastery.cpp
index 0db9f283374..86051831fb5 100644
--- a/src/bindings/scripts/scripts/zone/scarlet_monastery/instance_scarlet_monastery.cpp
+++ b/src/bindings/scripts/scripts/zone/scarlet_monastery/instance_scarlet_monastery.cpp
@@ -92,7 +92,7 @@ struct TRINITY_DLL_DECL instance_scarlet_monastery : public ScriptedInstance
{
GameObject *Shrine = instance->GetGameObjectInMap(PumpkinShrineGUID);
if(Shrine)
- Shrine->SetGoState(1);
+ Shrine->SetUInt32Value(GAMEOBJECT_STATE,1);
}break;
case DATA_HORSEMAN_EVENT:
if (data == DONE)
@@ -106,7 +106,7 @@ struct TRINITY_DLL_DECL instance_scarlet_monastery : public ScriptedInstance
HorsemanAdds.clear();
GameObject *Shrine = instance->GetGameObjectInMap(PumpkinShrineGUID);
if(Shrine)
- Shrine->SetGoState(1);
+ Shrine->SetUInt32Value(GAMEOBJECT_STATE,1);
}
break;
}
diff --git a/src/bindings/scripts/scripts/zone/shadowfang_keep/instance_shadowfang_keep.cpp b/src/bindings/scripts/scripts/zone/shadowfang_keep/instance_shadowfang_keep.cpp
index 61aca9df2e3..e9454d713ed 100644
--- a/src/bindings/scripts/scripts/zone/shadowfang_keep/instance_shadowfang_keep.cpp
+++ b/src/bindings/scripts/scripts/zone/shadowfang_keep/instance_shadowfang_keep.cpp
@@ -59,7 +59,7 @@ struct TRINITY_DLL_DECL instance_shadowfang_keep : public ScriptedInstance
void OpenDoor(uint64 DoorGUID, bool open)
{
if(GameObject *Door = instance->GetGameObjectInMap(DoorGUID))
- Door->SetGoState(open ? 0 : 1);
+ Door->SetUInt32Value(GAMEOBJECT_STATE, open ? 0 : 1);
}
void SetData(uint32 type, uint32 data)
diff --git a/src/bindings/scripts/scripts/zone/uldaman/instance_uldaman.cpp b/src/bindings/scripts/scripts/zone/uldaman/instance_uldaman.cpp
index ca231a6bd12..c564088be76 100644
--- a/src/bindings/scripts/scripts/zone/uldaman/instance_uldaman.cpp
+++ b/src/bindings/scripts/scripts/zone/uldaman/instance_uldaman.cpp
@@ -70,7 +70,7 @@ struct TRINITY_DLL_DECL instance_uldaman : public ScriptedInstance
break;
case ANCIENT_VAULT_DOOR:
- go->SetGoState(1);
+ go->SetUInt32Value(GAMEOBJECT_STATE,1);
go->SetUInt32Value(GAMEOBJECT_FLAGS, 33);
ancientVaultDoor = go->GetGUID();
break;
@@ -93,7 +93,7 @@ struct TRINITY_DLL_DECL instance_uldaman : public ScriptedInstance
return;
go->SetUInt32Value(GAMEOBJECT_FLAGS, 33);
- go->SetGoState(0);
+ go->SetUInt32Value(GAMEOBJECT_STATE, 0);
}
void ActivateStoneKeepers()
diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_hexlord.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_hexlord.cpp
index 4c56d230263..82a993c3894 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/boss_hexlord.cpp
+++ b/src/bindings/scripts/scripts/zone/zulaman/boss_hexlord.cpp
@@ -237,7 +237,8 @@ struct TRINITY_DLL_DECL boss_hex_lord_malacrassAI : public ScriptedAI
SpawnAdds();
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 46916);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 46916);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, 50268674);
m_creature->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE );
}
diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_nalorakk.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_nalorakk.cpp
index f9a90809c89..8017033a4bd 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/boss_nalorakk.cpp
+++ b/src/bindings/scripts/scripts/zone/zulaman/boss_nalorakk.cpp
@@ -149,7 +149,7 @@ struct TRINITY_DLL_DECL boss_nalorakkAI : public ScriptedAI
TankGUID = 0;
inBearForm = false;
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 5122);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY + 1, 5122);
}
void SendAttacker(Unit* target)
@@ -388,7 +388,7 @@ struct TRINITY_DLL_DECL boss_nalorakkAI : public ScriptedAI
{
if(inBearForm)
{
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 5122);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY + 1, 5122);
DoYell(YELL_SHIFTEDTOTROLL, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_YELL_TOTROLL);
m_creature->RemoveAurasDueToSpell(SPELL_BEARFORM);
@@ -400,7 +400,7 @@ struct TRINITY_DLL_DECL boss_nalorakkAI : public ScriptedAI
}
else
{
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY + 1, 0);
DoYell(YELL_SHIFTEDTOBEAR, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(m_creature, SOUND_YELL_TOBEAR);
DoCast(m_creature, SPELL_BEARFORM, true);
diff --git a/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp b/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp
index 3ace2e79e22..2c50875e4ad 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp
+++ b/src/bindings/scripts/scripts/zone/zulaman/boss_zuljin.cpp
@@ -207,9 +207,9 @@ struct TRINITY_DLL_DECL boss_zuljinAI : public ScriptedAI
Summons.DespawnAll();
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 47174);
- //m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, 218172674);
- //m_creature->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 47174);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, 218172674);
+ m_creature->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE);
}
void Aggro(Unit *who)
@@ -341,7 +341,7 @@ struct TRINITY_DLL_DECL boss_zuljinAI : public ScriptedAI
m_creature->Relocate(CENTER_X, CENTER_Y, CENTER_Z,0);
m_creature->SendMonsterMove(CENTER_X, CENTER_Y, CENTER_Z,0,0,100);
DoResetThreat();
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0);
m_creature->RemoveAurasDueToSpell(Transform[Phase].unaura);
DoCast(m_creature, Transform[Phase].spell);
DoYell(Transform[Phase].text, LANG_UNIVERSAL, NULL);
diff --git a/src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp b/src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp
index b510f74bb67..95e62063e26 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp
+++ b/src/bindings/scripts/scripts/zone/zulaman/instance_zulaman.cpp
@@ -140,7 +140,7 @@ struct TRINITY_DLL_DECL instance_zulaman : public ScriptedInstance
void OpenDoor(uint64 DoorGUID, bool open)
{
if(GameObject *Door = instance->GetGameObjectInMap(DoorGUID))
- Door->SetGoState(open ? 0 : 1);
+ Door->SetUInt32Value(GAMEOBJECT_STATE, open ? 0 : 1);
}
void SummonHostage(uint8 num)
diff --git a/src/bindings/scripts/scripts/zone/zulgurub/boss_renataki.cpp b/src/bindings/scripts/scripts/zone/zulgurub/boss_renataki.cpp
index 8b993815c00..f79247bbfc0 100644
--- a/src/bindings/scripts/scripts/zone/zulgurub/boss_renataki.cpp
+++ b/src/bindings/scripts/scripts/zone/zulgurub/boss_renataki.cpp
@@ -65,9 +65,9 @@ struct TRINITY_DLL_DECL boss_renatakiAI : public ScriptedAI
if (Invisible_Timer < diff)
{
m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
- m_creature->SetUInt32Value( UNIT_VIRTUAL_ITEM_SLOT_ID, 0);
- //m_creature->SetUInt32Value( UNIT_VIRTUAL_ITEM_INFO , 218171138);
- //m_creature->SetUInt32Value( UNIT_VIRTUAL_ITEM_INFO + 1, 3);
+ m_creature->SetUInt32Value( UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0);
+ m_creature->SetUInt32Value( UNIT_VIRTUAL_ITEM_INFO , 218171138);
+ m_creature->SetUInt32Value( UNIT_VIRTUAL_ITEM_INFO + 1, 3);
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID,11686);
Invisible = true;
@@ -100,9 +100,9 @@ struct TRINITY_DLL_DECL boss_renatakiAI : public ScriptedAI
m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID,15268);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- m_creature->SetUInt32Value( UNIT_VIRTUAL_ITEM_SLOT_ID, 31818);
- //m_creature->SetUInt32Value( UNIT_VIRTUAL_ITEM_INFO , 218171138);
- //m_creature->SetUInt32Value( UNIT_VIRTUAL_ITEM_INFO + 1, 3);
+ m_creature->SetUInt32Value( UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 31818);
+ m_creature->SetUInt32Value( UNIT_VIRTUAL_ITEM_INFO , 218171138);
+ m_creature->SetUInt32Value( UNIT_VIRTUAL_ITEM_INFO + 1, 3);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
Invisible = false;
diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp
deleted file mode 100644
index e4e26dec111..00000000000
--- a/src/game/AchievementMgr.cpp
+++ /dev/null
@@ -1,910 +0,0 @@
-/*
- * Copyright (C) 2005-2008 MaNGOS <http://getmangos.com/>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include "AchievementMgr.h"
-#include "Common.h"
-#include "Player.h"
-#include "WorldPacket.h"
-#include "Database/DBCEnums.h"
-#include "ObjectMgr.h"
-#include "Guild.h"
-#include "Database/DatabaseEnv.h"
-#include "GameEvent.h"
-#include "World.h"
-#include "SpellMgr.h"
-
-const CriteriaCastSpellRequirement AchievementMgr::criteriaCastSpellRequirements[CRITERIA_CAST_SPELL_REQ_COUNT] =
- {
- {5272, 3057, 0, 0},
- {5273, 2784, 0, 0},
- {5752, 9099, 0, 0},
- {5753, 8403, 0, 0},
- {5772, 0, 0, RACE_GNOME},
- {5774, 0, 0, RACE_BLOODELF},
- {5775, 0, 0, RACE_DRAENEI},
- {5776, 0, 0, RACE_DWARF},
- {5777, 0, 0, RACE_HUMAN},
- {5778, 0, 0, RACE_NIGHTELF},
- {5779, 0, 0, RACE_ORC},
- {5780, 0, 0, RACE_TAUREN},
- {5781, 0, 0, RACE_TROLL},
- {5782, 0, 0, RACE_UNDEAD_PLAYER},
- {6225, 5661, 0, 0},
- {6226, 26044, 0, 0},
- {6228, 739, 0, 0},
- {6229, 927, 0, 0},
- {6230, 1444, 0, 0},
- {6231, 8140, 0, 0},
- {6232, 5489, 0, 0},
- {6233,12336, 0, 0},
- {6234, 1351, 0, 0},
- {6235, 5484, 0, 0},
- {6236, 1182, 0, 0},
- {6237, 0, CLASS_DEATH_KNIGHT, RACE_ORC},
- {6238, 0, CLASS_WARRIOR, RACE_HUMAN},
- {6239, 0, CLASS_SHAMAN, RACE_TAUREN},
- {6240, 0, CLASS_DRUID, RACE_NIGHTELF},
- {6241, 0, CLASS_ROGUE, RACE_UNDEAD_PLAYER},
- {6242, 0, CLASS_HUNTER, RACE_TROLL},
- {6243, 0, CLASS_MAGE, RACE_GNOME},
- {6244, 0, CLASS_PALADIN, RACE_DWARF},
- {6245, 0, CLASS_WARLOCK, RACE_BLOODELF},
- {6246, 0, CLASS_PRIEST, RACE_DRAENEI},
- {6312, 0, CLASS_WARLOCK, RACE_GNOME},
- {6313, 0, CLASS_DEATH_KNIGHT, RACE_HUMAN},
- {6314, 0, CLASS_PRIEST, RACE_NIGHTELF},
- {6315, 0, CLASS_SHAMAN, RACE_ORC},
- {6316, 0, CLASS_DRUID, RACE_TAUREN},
- {6317, 0, CLASS_ROGUE, RACE_TROLL},
- {6318, 0, CLASS_WARRIOR, RACE_UNDEAD_PLAYER},
- {6319, 0, CLASS_MAGE, RACE_BLOODELF},
- {6320, 0, CLASS_PALADIN, RACE_DRAENEI},
- {6321, 0, CLASS_HUNTER, RACE_DWARF},
- {6662, 31261, 0, 0}
- };
-
-const AchievementReward AchievementMgr::achievementRewards[ACHIEVEMENT_REWARD_COUNT] =
- {
- // achievementId, horde titleid, alliance titleid, itemid
- {45, 0, 0, 43348},
- {46, 78, 78, 0},
- {230, 72, 72, 0},
- {456, 139, 139, 0},
- {614, 0, 0, 44223},
- {619, 0, 0, 44224},
- {714, 47, 47, 0},
- {762, 130, 130, 0},
- {870, 127, 126, 0},
- {871, 144, 144, 0},
- {876, 0, 0, 43349},
- {907, 48, 48, 0},
- {913, 74, 74, 0},
- {942, 79, 79, 0},
- {943, 79, 79, 0},
- {945, 131, 131, 0},
- {948, 130, 130, 0},
- {953, 132, 132, 0},
- {978, 81, 81, 0},
- {1015, 77, 77, 0},
- {1021, 0, 0, 40643},
- {1038, 75, 75, 0},
- {1039, 76, 76, 0},
- {1163, 128, 128, 0},
- {1174, 82, 82, 0},
- {1175, 72, 72, 0},
- {1250, 0, 0, 40653},
- {1400, 120, 120, 0},
- {1402, 122, 122, 0},
- {1516, 83, 83, 0},
- {1563, 84, 84, 0},
- {1656, 124, 124, 0},
- {1657, 124, 124, 0},
- {1658, 129, 129, 0},
- {1681, 125, 125, 43300},
- {1682, 125, 125, 43300},
- {1683, 133, 133, 0},
- {1684, 133, 133, 0},
- {1691, 134, 134, 0},
- {1692, 134, 134, 0},
- {1693, 135, 135, 0},
- {1707, 135, 135, 0},
- {1784, 84, 84, 0},
- {1793, 137, 137, 0},
- {1956, 0, 0, 43824},
- {2051, 140, 140, 0},
- {2054, 121, 121, 0},
- {2096, 0, 0, 44430},
- {2136, 0, 0, 0},// <- TODO: find item for spell 59961
- {2137, 0, 0, 0},// <- TODO: find item for spell 60021
- {2138, 0, 0, 0},// <- TODO: find item for spell 59976
- {2143, 0, 0, 44178},
- {2144, 0, 0, 0},// <- TODO: find item for spell 60024
- {2145, 0, 0, 0},// <- TODO: find item for spell 60024
- {2186, 141, 141, 0},
- {2187, 142, 142, 0},
- {2188, 143, 143, 0}
- };
-
-AchievementMgr::AchievementMgr(Player *player)
-{
- m_player = player;
-}
-
-AchievementMgr::~AchievementMgr()
-{
-}
-
-void AchievementMgr::SaveToDB()
-{
- if(!m_completedAchievements.empty())
- {
- bool need_execute = false;
- std::ostringstream ssdel;
- std::ostringstream ssins;
- for(CompletedAchievementMap::iterator iter = m_completedAchievements.begin(); iter!=m_completedAchievements.end(); iter++)
- {
- if(!iter->second.changed)
- continue;
-
- /// first new/changed record prefix
- if(!need_execute)
- {
- ssdel << "DELETE FROM character_achievement WHERE guid = " << GetPlayer()->GetGUIDLow() << " AND achievement IN (";
- ssins << "INSERT INTO character_achievement (guid, achievement, date) VALUES ";
- need_execute = true;
- }
- /// next new/changed record prefix
- else
- {
- ssdel << ", ";
- ssins << ", ";
- }
-
- // new/changed record data
- ssdel << iter->first;
- ssins << "("<<GetPlayer()->GetGUIDLow() << ", " << iter->first << ", " << uint64(iter->second.date) << ")";
-
- /// mark as saved in db
- iter->second.changed = false;
- }
-
- if(need_execute)
- ssdel << ")";
-
- if(need_execute)
- {
- CharacterDatabase.BeginTransaction ();
- CharacterDatabase.Execute( ssdel.str().c_str() );
- CharacterDatabase.Execute( ssins.str().c_str() );
- CharacterDatabase.CommitTransaction ();
- }
- }
-
- if(!m_criteriaProgress.empty())
- {
- /// prepare deleting and insert
- bool need_execute = false;
- std::ostringstream ssdel;
- std::ostringstream ssins;
- for(CriteriaProgressMap::iterator iter = m_criteriaProgress.begin(); iter!=m_criteriaProgress.end(); ++iter)
- {
- if(!iter->second.changed)
- continue;
-
- /// first new/changed record prefix
- if(!need_execute)
- {
- ssdel << "DELETE FROM character_achievement_progress WHERE guid = " << GetPlayer()->GetGUIDLow() << " AND criteria IN (";
- ssins << "INSERT INTO character_achievement_progress (guid, criteria, counter, date) VALUES ";
- need_execute = true;
- }
- /// next new/changed record prefix
- else
- {
- ssdel << ", ";
- ssins << ", ";
- }
-
- // new/changed record data
- ssdel << iter->first;
- ssins << "(" << GetPlayer()->GetGUIDLow() << ", " << iter->first << ", " << iter->second.counter << ", " << iter->second.date << ")";
-
- /// mark as saved in db
- iter->second.changed = false;
- }
-
- if(need_execute)
- ssdel << ")";
-
- if(need_execute)
- {
- CharacterDatabase.BeginTransaction ();
- CharacterDatabase.Execute( ssdel.str().c_str() );
- CharacterDatabase.Execute( ssins.str().c_str() );
- CharacterDatabase.CommitTransaction ();
- }
- }
-}
-
-void AchievementMgr::LoadFromDB(QueryResult *achievementResult, QueryResult *criteriaResult)
-{
- if(achievementResult)
- {
- do
- {
- Field *fields = achievementResult->Fetch();
- CompletedAchievementData& ca = m_completedAchievements[fields[0].GetUInt32()];
- ca.date = time_t(fields[1].GetUInt64());
- ca.changed = false;
- } while(achievementResult->NextRow());
- delete achievementResult;
- }
-
- if(criteriaResult)
- {
- do
- {
- Field *fields = criteriaResult->Fetch();
-
- uint32 id = fields[0].GetUInt32();
- uint32 counter = fields[1].GetUInt32();
- time_t date = time_t(fields[2].GetUInt64());
-
- AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(id);
- if(!criteria || criteria->timeLimit && date + criteria->timeLimit < time(NULL))
- continue;
-
- CriteriaProgress& progress = m_criteriaProgress[id];
- progress.counter = counter;
- progress.date = date;
- progress.changed = false;
- } while(criteriaResult->NextRow());
- delete criteriaResult;
- }
-
-}
-
-void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievement)
-{
- sLog.outString("AchievementMgr::SendAchievementEarned(%u)", achievement->ID);
-
- const char *msg = "|Hplayer:$N|h[$N]|h has earned the achievement $a!";
- if(Guild* guild = objmgr.GetGuildById(GetPlayer()->GetGuildId()))
- {
- WorldPacket data(SMSG_MESSAGECHAT, 200);
- data << uint8(CHAT_MSG_ACHIEVEMENT);
- data << uint8(CHAT_MSG_GUILD_ACHIEVEMENT);
- data << uint32(LANG_UNIVERSAL);
- data << uint64(GetPlayer()->GetGUID());
- data << uint32(5);
- data << uint64(GetPlayer()->GetGUID());
- data << uint32(strlen(msg)+1);
- data << msg;
- data << uint8(0);
- data << uint32(achievement->ID);
- guild->BroadcastPacket(&data);
- }
- if(achievement->flags & (ACHIEVEMENT_FLAG_REALM_FIRST_KILL|ACHIEVEMENT_FLAG_REALM_FIRST_REACH))
- {
- // broadcast realm first reached
- WorldPacket data(SMSG_SERVER_FIRST_ACHIEVEMENT, strlen(GetPlayer()->GetName())+1+8+4+4);
- data << GetPlayer()->GetName();
- data << uint64(GetPlayer()->GetGUID());
- data << uint32(achievement->ID);
- data << uint32(0); // 1=link supplied string as player name, 0=display plain string
- sWorld.SendGlobalMessage(&data);
- }
- else
- {
- WorldPacket data(SMSG_MESSAGECHAT, 200);
- data << uint8(CHAT_MSG_ACHIEVEMENT);
- data << uint32(LANG_UNIVERSAL);
- data << uint64(GetPlayer()->GetGUID());
- data << uint32(5);
- data << uint64(GetPlayer()->GetGUID());
- data << uint32(strlen(msg)+1);
- data << msg;
- data << uint8(0);
- data << uint32(achievement->ID);
- GetPlayer()->SendMessageToSet(&data, true);
-
- }
- WorldPacket data(SMSG_ACHIEVEMENT_EARNED, 8+4+8);
- data.append(GetPlayer()->GetPackGUID());
- data << uint32(achievement->ID);
- data << uint32(secsToTimeBitFields(time(NULL)));
- data << uint32(0);
- GetPlayer()->SendMessageToSet(&data, true);
-}
-
-void AchievementMgr::SendCriteriaUpdate(uint32 id, CriteriaProgress const* progress)
-{
- WorldPacket data(SMSG_CRITERIA_UPDATE, 8+4+8);
- data << uint32(id);
-
- // the counter is packed like a packed Guid
- data.appendPackGUID(progress->counter);
-
- data.append(GetPlayer()->GetPackGUID());
- data << uint32(0);
- data << uint32(secsToTimeBitFields(progress->date));
- data << uint32(0); // timer 1
- data << uint32(0); // timer 2
- GetPlayer()->SendMessageToSet(&data, true);
-}
-
-/**
- * called at player login. The player might have fulfilled some achievements when the achievement system wasn't working yet
- */
-void AchievementMgr::CheckAllAchievementCriteria()
-{
- // suppress sending packets
- for(uint32 i=0; i<ACHIEVEMENT_CRITERIA_TYPE_TOTAL; i++)
- UpdateAchievementCriteria(AchievementCriteriaTypes(i));
-}
-
-/**
- * this function will be called whenever the user might have done a criteria relevant action
- */
-void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscvalue1, uint32 miscvalue2, Unit *unit, uint32 time)
-{
- sLog.outString("AchievementMgr::UpdateAchievementCriteria(%u, %u, %u, %u)", type, miscvalue1, miscvalue2, time);
- AchievementCriteriaEntryList const& achievementCriteriaList = objmgr.GetAchievementCriteriaByType(type);
- for(AchievementCriteriaEntryList::const_iterator i = achievementCriteriaList.begin(); i!=achievementCriteriaList.end(); ++i)
- {
- AchievementCriteriaEntry const *achievementCriteria = (*i);
-
- // don't update already completed criteria
- if(IsCompletedCriteria(achievementCriteria))
- continue;
-
- if(achievementCriteria->groupFlag & ACHIEVEMENT_CRITERIA_GROUP_NOT_IN_GROUP && GetPlayer()->GetGroup())
- continue;
-
- AchievementEntry const *achievement = sAchievementStore.LookupEntry(achievementCriteria->referredAchievement);
- if(!achievement)
- continue;
-
- if(achievement->factionFlag == ACHIEVEMENT_FACTION_FLAG_HORDE && GetPlayer()->GetTeam() != HORDE ||
- achievement->factionFlag == ACHIEVEMENT_FACTION_FLAG_ALLIANCE && GetPlayer()->GetTeam() != ALLIANCE)
- continue;
-
- switch (type)
- {
- case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL:
- SetCriteriaProgress(achievementCriteria, GetPlayer()->getLevel());
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT:
- SetCriteriaProgress(achievementCriteria, GetPlayer()->GetByteValue(PLAYER_BYTES_2, 2)+1);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
- // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
- if(!miscvalue1)
- continue;
- if(achievementCriteria->kill_creature.creatureID != miscvalue1)
- continue;
- SetCriteriaProgress(achievementCriteria, miscvalue2, true);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL:
- if(uint32 skillvalue = GetPlayer()->GetBaseSkillValue(achievementCriteria->reach_skill_level.skillID))
- SetCriteriaProgress(achievementCriteria, skillvalue);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT:
- {
- uint32 counter =0;
- for(QuestStatusMap::iterator itr = GetPlayer()->getQuestStatusMap().begin(); itr!=GetPlayer()->getQuestStatusMap().end(); itr++)
- if(itr->second.m_rewarded)
- counter++;
- SetCriteriaProgress(achievementCriteria, counter);
- break;
- }
- case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE:
- {
- uint32 counter =0;
- for(QuestStatusMap::iterator itr = GetPlayer()->getQuestStatusMap().begin(); itr!=GetPlayer()->getQuestStatusMap().end(); itr++)
- {
- Quest const* quest = objmgr.GetQuestTemplate(itr->first);
- if(itr->second.m_rewarded && quest->GetZoneOrSort() == achievementCriteria->complete_quests_in_zone.zoneID)
- counter++;
- }
- SetCriteriaProgress(achievementCriteria, counter);
- break;
- }
- case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST:
- // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
- if(!miscvalue1)
- continue;
- SetCriteriaProgress(achievementCriteria, miscvalue1, true);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND:
- // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
- if(!miscvalue1)
- continue;
- if(GetPlayer()->GetMapId() != achievementCriteria->complete_battleground.mapID)
- continue;
- SetCriteriaProgress(achievementCriteria, miscvalue1, true);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL:
- if(GetPlayer()->HasSpell(achievementCriteria->learn_spell.spellID))
- SetCriteriaProgress(achievementCriteria, 1);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP:
- // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
- if(!miscvalue1)
- continue;
- if(GetPlayer()->GetMapId() != achievementCriteria->death_at_map.mapID)
- continue;
- SetCriteriaProgress(achievementCriteria, 1, true);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE:
- // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
- if(!miscvalue1)
- continue;
- if(miscvalue1 != achievementCriteria->killed_by_creature.creatureEntry)
- continue;
- SetCriteriaProgress(achievementCriteria, 1, true);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER:
- // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
- if(!miscvalue1)
- continue;
- SetCriteriaProgress(achievementCriteria, 1, true);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING:
- {
- // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
- if(!miscvalue1)
- continue;
- if(achievement->ID == 1260)
- {
- if(Player::GetDrunkenstateByValue(GetPlayer()->GetDrunkValue()) != DRUNKEN_SMASHED)
- continue;
- // TODO: hardcoding eventid is bad, it can differ from DB to DB - maye implement something using HolidayNames.dbc?
- if(!gameeventmgr.IsActiveEvent(26))
- continue;
- }
- // miscvalue1 is the ingame fallheight*100 as stored in dbc
- SetCriteriaProgress(achievementCriteria, miscvalue1);
- break;
- }
- case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST:
- if(GetPlayer()->GetQuestRewardStatus(achievementCriteria->complete_quest.questID))
- SetCriteriaProgress(achievementCriteria, 1);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM:
- // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
- if(!miscvalue1)
- continue;
- if(achievementCriteria->use_item.itemID != miscvalue1)
- continue;
- SetCriteriaProgress(achievementCriteria, 1, true);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM:
- // speedup for non-login case
- if(miscvalue1 && achievementCriteria->own_item.itemID!=miscvalue1)
- continue;
- SetCriteriaProgress(achievementCriteria, GetPlayer()->GetItemCount(achievementCriteria->own_item.itemID, true));
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM:
- // You _have_ to loot that item, just owning it when logging in does _not_ count!
- if(!miscvalue1)
- continue;
- if(miscvalue1 != achievementCriteria->own_item.itemID)
- continue;
- SetCriteriaProgress(achievementCriteria, miscvalue2, true);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET:
- case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2:
- if (!miscvalue1 || miscvalue1 != achievementCriteria->be_spell_target.spellID)
- continue;
- SetCriteriaProgress(achievementCriteria, 1, true);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL:
- if (!miscvalue1 || miscvalue1 != achievementCriteria->cast_spell.spellID)
- continue;
- SetCriteriaProgress(achievementCriteria, 1, true);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2:
- {
- if (!miscvalue1 || miscvalue1 != achievementCriteria->cast_spell.spellID)
- continue;
- // those requirements couldn't be found in the dbc
-
- const CriteriaCastSpellRequirement *requirement = NULL;
- for (uint32 i=0; i<CRITERIA_CAST_SPELL_REQ_COUNT; i++)
- {
- if (criteriaCastSpellRequirements[i].achievementCriteriaId == achievementCriteria->ID)
- {
- requirement = &criteriaCastSpellRequirements[i];
- break;
- }
- }
-
- if (requirement)
- {
- if (!unit)
- continue;
-
- if (requirement->creatureEntry && unit->GetEntry() != requirement->creatureEntry)
- continue;
-
- if (requirement->playerRace && (unit->GetTypeId() != TYPEID_PLAYER || unit->getRace()!=requirement->playerRace))
- continue;
-
- if (requirement->playerClass && (unit->GetTypeId() != TYPEID_PLAYER || unit->getClass()!=requirement->playerClass))
- continue;
- }
- SetCriteriaProgress(achievementCriteria, 1, true);
- break;
- }
- case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS:
- {
- uint32 spellCount = 0;
- for (PlayerSpellMap::const_iterator spellIter = GetPlayer()->GetSpellMap().begin();
- spellIter != GetPlayer()->GetSpellMap().end();
- spellIter++)
- {
- for(SkillLineAbilityMap::const_iterator skillIter = spellmgr.GetBeginSkillLineAbilityMap(spellIter->first);
- skillIter != spellmgr.GetEndSkillLineAbilityMap(spellIter->first);
- skillIter++)
- {
- if(skillIter->second->skillId == achievementCriteria->learn_skilline_spell.skillLine)
- spellCount++;
- }
- }
- SetCriteriaProgress(achievementCriteria, spellCount);
- break;
- }
- case ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP:
- {
- // skip for login case
- if(!miscvalue1)
- continue;
- SetCriteriaProgress(achievementCriteria, 1);
- break;
- }
- case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION:
- {
- int32 reputation = GetPlayer()->GetReputation(achievementCriteria->gain_reputation.factionID);
- if (reputation > 0)
- SetCriteriaProgress(achievementCriteria, reputation);
- break;
- }
- case ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION:
- {
- uint32 counter = 0;
- const FactionStateList factionStateList = GetPlayer()->GetFactionStateList();
- for (FactionStateList::const_iterator iter = factionStateList.begin(); iter!= factionStateList.end(); iter++)
- {
- if(GetPlayer()->ReputationToRank(iter->second.Standing) >= REP_EXALTED)
- ++counter;
- }
- SetCriteriaProgress(achievementCriteria, counter);
- break;
- }
- case ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA:
- {
- WorldMapOverlayEntry const* worldOverlayEntry = sWorldMapOverlayStore.LookupEntry(achievementCriteria->explore_area.areaReference);
- if(!worldOverlayEntry)
- break;
-
- int32 exploreFlag = GetAreaFlagByAreaID(worldOverlayEntry->areatableID);
- if(exploreFlag < 0)
- break;
-
- uint32 playerIndexOffset = uint32(exploreFlag) / 32;
- uint32 mask = 1<< (uint32(exploreFlag) % 32);
-
- if(GetPlayer()->GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + playerIndexOffset) & mask)
- SetCriteriaProgress(achievementCriteria, 1);
- break;
- }
-
- }
- if(IsCompletedCriteria(achievementCriteria))
- CompletedCriteria(achievementCriteria);
- }
-}
-
-bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achievementCriteria)
-{
- AchievementEntry const* achievement = sAchievementStore.LookupEntry(achievementCriteria->referredAchievement);
- if(!achievement)
- return false;
-
- // counter can never complete
- if(achievement->flags & ACHIEVEMENT_FLAG_COUNTER)
- return false;
-
- if(achievement->flags & (ACHIEVEMENT_FLAG_REALM_FIRST_REACH | ACHIEVEMENT_FLAG_REALM_FIRST_KILL))
- {
- // someone on this realm has already completed that achievement
- if(objmgr.allCompletedAchievements.find(achievement->ID)!=objmgr.allCompletedAchievements.end())
- return false;
- }
-
- CriteriaProgressMap::const_iterator itr = m_criteriaProgress.find(achievementCriteria->ID);
- if(itr == m_criteriaProgress.end())
- return false;
-
- CriteriaProgress const* progress = &itr->second;
-
- switch(achievementCriteria->requiredType)
- {
- case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL:
- if(achievement->ID == 467 && GetPlayer()->getClass() != CLASS_SHAMAN ||
- achievement->ID == 466 && GetPlayer()->getClass() != CLASS_DRUID ||
- achievement->ID == 465 && GetPlayer()->getClass() != CLASS_PALADIN ||
- achievement->ID == 464 && GetPlayer()->getClass() != CLASS_PRIEST ||
- achievement->ID == 463 && GetPlayer()->getClass() != CLASS_WARLOCK ||
- achievement->ID == 462 && GetPlayer()->getClass() != CLASS_HUNTER ||
- achievement->ID == 461 && GetPlayer()->getClass() != CLASS_DEATH_KNIGHT ||
- achievement->ID == 460 && GetPlayer()->getClass() != CLASS_MAGE ||
- achievement->ID == 459 && GetPlayer()->getClass() != CLASS_WARRIOR ||
- achievement->ID == 458 && GetPlayer()->getClass() != CLASS_ROGUE ||
-
- achievement->ID == 1404 && GetPlayer()->getRace() != RACE_GNOME ||
- achievement->ID == 1405 && GetPlayer()->getRace() != RACE_BLOODELF ||
- achievement->ID == 1406 && GetPlayer()->getRace() != RACE_DRAENEI ||
- achievement->ID == 1407 && GetPlayer()->getRace() != RACE_DWARF ||
- achievement->ID == 1408 && GetPlayer()->getRace() != RACE_HUMAN ||
- achievement->ID == 1409 && GetPlayer()->getRace() != RACE_NIGHTELF ||
- achievement->ID == 1410 && GetPlayer()->getRace() != RACE_ORC ||
- achievement->ID == 1411 && GetPlayer()->getRace() != RACE_TAUREN ||
- achievement->ID == 1412 && GetPlayer()->getRace() != RACE_TROLL ||
- achievement->ID == 1413 && GetPlayer()->getRace() != RACE_UNDEAD_PLAYER )
- return false;
- return progress->counter >= achievementCriteria->reach_level.level;
- case ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT:
- return progress->counter >= achievementCriteria->buy_bank_slot.numberOfSlots;
- case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
- return progress->counter >= achievementCriteria->kill_creature.creatureCount;
- case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT:
- return m_completedAchievements.find(achievementCriteria->complete_achievement.linkedAchievement) != m_completedAchievements.end();
- case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL:
- return progress->counter >= achievementCriteria->reach_skill_level.skillLevel;
- case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE:
- return progress->counter >= achievementCriteria->complete_quests_in_zone.questCount;
- case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST:
- return progress->counter >= achievementCriteria->complete_daily_quest.questCount;
- case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL:
- return progress->counter >= 1;
- case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING:
- return progress->counter >= achievementCriteria->fall_without_dying.fallHeight;
- case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST:
- return progress->counter >= 1;
- case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM:
- return progress->counter >= achievementCriteria->use_item.itemCount;
- case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM:
- return progress->counter >= achievementCriteria->own_item.itemCount;
- case ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM:
- return progress->counter >= achievementCriteria->loot_item.itemCount;
- case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET:
- case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2:
- return progress->counter >= achievementCriteria->be_spell_target.spellCount;
- case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL:
- case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2:
- return progress->counter >= achievementCriteria->cast_spell.castCount;
- case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS:
- return progress->counter >= achievementCriteria->learn_skilline_spell.spellCount;
- case ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP:
- return progress->counter >= achievementCriteria->visit_barber.numberOfVisits;
- case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION:
- return progress->counter >= achievementCriteria->gain_reputation.reputationAmount;
- case ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION:
- return progress->counter >= achievementCriteria->gain_exalted_reputation.numberOfExaltedFactions;
- case ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA:
- return progress->counter >= 1;
-
- // handle all statistic-only criteria here
- case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND:
- case ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP:
- case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE:
- case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER:
- return false;
- }
- return false;
-}
-
-void AchievementMgr::CompletedCriteria(AchievementCriteriaEntry const* criteria)
-{
- AchievementEntry const* achievement = sAchievementStore.LookupEntry(criteria->referredAchievement);
- if(!achievement)
- return;
- // counter can never complete
- if(achievement->flags & ACHIEVEMENT_FLAG_COUNTER)
- return;
-
- if(criteria->completionFlag & ACHIEVEMENT_CRITERIA_COMPLETE_FLAG_ALL || GetAchievementCompletionState(achievement)==ACHIEVEMENT_COMPLETED_COMPLETED_NOT_STORED)
- {
- CompletedAchievement(achievement);
- }
-}
-
-// TODO: achievement 705 requires 4 criteria to be fulfilled
-AchievementCompletionState AchievementMgr::GetAchievementCompletionState(AchievementEntry const* entry)
-{
- if(m_completedAchievements.find(entry->ID)!=m_completedAchievements.end())
- return ACHIEVEMENT_COMPLETED_COMPLETED_STORED;
-
- bool foundOutstanding = false;
- for (uint32 entryId = 0; entryId<sAchievementCriteriaStore.GetNumRows(); entryId++)
- {
- AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(entryId);
- if(!criteria || criteria->referredAchievement!= entry->ID)
- continue;
-
- if(IsCompletedCriteria(criteria) && criteria->completionFlag & ACHIEVEMENT_CRITERIA_COMPLETE_FLAG_ALL)
- return ACHIEVEMENT_COMPLETED_COMPLETED_NOT_STORED;
-
- // found an umcompleted criteria, but DONT return false yet - there might be a completed criteria with ACHIEVEMENT_CRITERIA_COMPLETE_FLAG_ALL
- if(!IsCompletedCriteria(criteria))
- foundOutstanding = true;
- }
- if(foundOutstanding)
- return ACHIEVEMENT_COMPLETED_NONE;
- else
- return ACHIEVEMENT_COMPLETED_COMPLETED_NOT_STORED;
-}
-
-void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* entry, uint32 newValue, bool relative)
-{
- sLog.outString("AchievementMgr::SetCriteriaProgress(%u, %u)", entry->ID, newValue);
- CriteriaProgress *progress = NULL;
-
- CriteriaProgressMap::iterator iter = m_criteriaProgress.find(entry->ID);
-
- if(iter == m_criteriaProgress.end())
- {
- progress = &m_criteriaProgress[entry->ID];
- progress->counter = 0;
- progress->date = time(NULL);
- }
- else
- {
- progress = &iter->second;
- if(relative)
- newValue += progress->counter;
- if(progress->counter == newValue)
- return;
- progress->counter = newValue;
- }
-
- progress->changed = true;
-
- if(entry->timeLimit)
- {
- time_t now = time(NULL);
- if(progress->date + entry->timeLimit < now)
- {
- progress->counter = 1;
- }
- // also it seems illogical, the timeframe will be extended at every criteria update
- progress->date = now;
- }
- SendCriteriaUpdate(entry->ID,progress);
-}
-
-void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement)
-{
- sLog.outString("AchievementMgr::CompletedAchievement(%u)", achievement->ID);
- if(achievement->flags & ACHIEVEMENT_FLAG_COUNTER || m_completedAchievements.find(achievement->ID)!=m_completedAchievements.end())
- return;
-
- SendAchievementEarned(achievement);
- CompletedAchievementData& ca = m_completedAchievements[achievement->ID];
- ca.date = time(NULL);
- ca.changed = true;
-
- // don't insert for ACHIEVEMENT_FLAG_REALM_FIRST_KILL since otherwise only the first group member would reach that achievement
- // TODO: where do set this instead?
- if(!(achievement->flags & ACHIEVEMENT_FLAG_REALM_FIRST_KILL))
- objmgr.allCompletedAchievements.insert(achievement->ID);
-
- UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT);
-
- // reward items and titles
- AchievementReward const* reward = NULL;
- for (uint32 i=0; i<ACHIEVEMENT_REWARD_COUNT; i++)
- {
- if (achievementRewards[i].achievementId == achievement->ID)
- {
- reward = &achievementRewards[i];
- break;
- }
- }
-
- if (reward)
- {
- sLog.outString("achiev %u, title= %u, %u", reward->achievementId, reward->titleId[0], reward->titleId[1]);
- uint32 titleId = reward->titleId[GetPlayer()->GetTeam() == HORDE?0:1];
- if(CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(titleId))
- GetPlayer()->SetTitle(titleEntry);
-
- if (reward->itemId)
- {
- ItemPrototype const *pProto = objmgr.GetItemPrototype( reward->itemId );
-
- if(!pProto)
- {
- GetPlayer()->SendEquipError( EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL );
- return;
- }
-
- ItemPosCountVec dest;
- uint32 no_space = 0;
- uint8 msg = GetPlayer()->CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, reward->itemId, 1, &no_space );
-
- if( msg != EQUIP_ERR_OK )
- {
- GetPlayer()->SendEquipError( msg, NULL, NULL );
- return;
- }
- Item* pItem = GetPlayer()->StoreNewItem( dest, reward->itemId, true);
-
- if(!pItem)
- {
- GetPlayer()->SendEquipError( EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL );
- return;
- }
- }
- }
-}
-
-void AchievementMgr::SendAllAchievementData()
-{
- // since we don't know the exact size of the packed GUIDs this is just an approximation
- WorldPacket data(SMSG_ALL_ACHIEVEMENT_DATA, 4*2+m_completedAchievements.size()*4*2+m_completedAchievements.size()*7*4);
- BuildAllDataPacket(&data);
- GetPlayer()->GetSession()->SendPacket(&data);
-}
-
-void AchievementMgr::SendRespondInspectAchievements(Player* player)
-{
- // since we don't know the exact size of the packed GUIDs this is just an approximation
- WorldPacket data(SMSG_RESPOND_INSPECT_ACHIEVEMENTS, 4+4*2+m_completedAchievements.size()*4*2+m_completedAchievements.size()*7*4);
- data.append(GetPlayer()->GetPackGUID());
- BuildAllDataPacket(&data);
- player->GetSession()->SendPacket(&data);
-}
-
-/**
- * used by both SMSG_ALL_ACHIEVEMENT_DATA and SMSG_RESPOND_INSPECT_ACHIEVEMENT
- */
-void AchievementMgr::BuildAllDataPacket(WorldPacket *data)
-{
- for(CompletedAchievementMap::const_iterator iter = m_completedAchievements.begin(); iter!=m_completedAchievements.end(); ++iter)
- {
- *data << uint32(iter->first);
- *data << uint32(secsToTimeBitFields(iter->second.date));
- }
- *data << int32(-1);
-
- for(CriteriaProgressMap::const_iterator iter = m_criteriaProgress.begin(); iter!=m_criteriaProgress.end(); ++iter)
- {
- *data << uint32(iter->first);
- data->appendPackGUID(iter->second.counter);
- data->append(GetPlayer()->GetPackGUID());
- *data << uint32(0);
- *data << uint32(secsToTimeBitFields(iter->second.date));
- *data << uint32(0);
- *data << uint32(0);
- }
-
- *data << int32(-1);
-}
diff --git a/src/game/AchievementMgr.h b/src/game/AchievementMgr.h
deleted file mode 100644
index 6392a9fc647..00000000000
--- a/src/game/AchievementMgr.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2005-2008 MaNGOS <http://getmangos.com/>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-#ifndef __MANGOS_ACHIEVEMENTMGR_H
-#define __MANGOS_ACHIEVEMENTMGR_H
-
-#include "Common.h"
-#include "Database/DBCEnums.h"
-#include "Database/DBCStores.h"
-#include "Database/DatabaseEnv.h"
-
-#define CRITERIA_CAST_SPELL_REQ_COUNT 46
-#define ACHIEVEMENT_REWARD_COUNT 57
-
-struct CriteriaProgress
-{
- uint32 counter;
- time_t date;
- bool changed;
-};
-
-struct CriteriaCastSpellRequirement
-{
- uint32 achievementCriteriaId;
- uint32 creatureEntry;
- uint8 playerClass;
- uint8 playerRace;
-};
-
-struct AchievementReward
-{
- uint32 achievementId;
- uint32 titleId[2];
- uint32 itemId;
-};
-
-struct CompletedAchievementData
-{
- time_t date;
- bool changed;
-};
-
-typedef UNORDERED_MAP<uint32, CriteriaProgress> CriteriaProgressMap;
-typedef UNORDERED_MAP<uint32, CompletedAchievementData> CompletedAchievementMap;
-
-class Unit;
-class Player;
-class WorldPacket;
-
-enum AchievementCompletionState
-{
- ACHIEVEMENT_COMPLETED_NONE,
- ACHIEVEMENT_COMPLETED_COMPLETED_NOT_STORED,
- ACHIEVEMENT_COMPLETED_COMPLETED_STORED,
-};
-
-class AchievementMgr
-{
- public:
- AchievementMgr(Player* pl);
- ~AchievementMgr();
-
- void LoadFromDB(QueryResult *achievementResult, QueryResult *criteriaResult);
- void SaveToDB();
- void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscvalue1=0, uint32 miscvalue2=0, Unit *unit=NULL, uint32 time=0);
- void CheckAllAchievementCriteria();
- void SendAllAchievementData();
- void SendRespondInspectAchievements(Player* player);
- Player* GetPlayer() { return m_player;}
-
- private:
- void SendAchievementEarned(AchievementEntry const* achievement);
- void SendCriteriaUpdate(uint32 id, CriteriaProgress const* progress);
- void SetCriteriaProgress(AchievementCriteriaEntry const* entry, uint32 newValue, bool relative=false);
- void CompletedCriteria(AchievementCriteriaEntry const* entry);
- void CompletedAchievement(AchievementEntry const* entry);
- bool IsCompletedCriteria(AchievementCriteriaEntry const* entry);
- AchievementCompletionState GetAchievementCompletionState(AchievementEntry const* entry);
- void BuildAllDataPacket(WorldPacket *data);
-
- Player* m_player;
- CriteriaProgressMap m_criteriaProgress;
- CompletedAchievementMap m_completedAchievements;
- static const CriteriaCastSpellRequirement criteriaCastSpellRequirements[];
- static const AchievementReward achievementRewards[];
-};
-#endif
diff --git a/src/game/AuctionHouse.cpp b/src/game/AuctionHouse.cpp
index a12e8a8f238..71a8bb495b4 100644
--- a/src/game/AuctionHouse.cpp
+++ b/src/game/AuctionHouse.cpp
@@ -752,23 +752,3 @@ void WorldSession::HandleAuctionListItems( WorldPacket & recv_data )
data << (uint32) 300; // unk 2.3.0 const?
SendPacket(&data);
}
-
-void WorldSession::HandleAuctionListPendingSales( WorldPacket & recv_data )
-{
- sLog.outDebug("CMSG_AUCTION_LIST_PENDING_SALES");
- recv_data.hexlike();
-
- uint32 count = 0;
-
- WorldPacket data(SMSG_AUCTION_LIST_PENDING_SALES, 4);
- data << uint32(count); // count
- /*for(uint32 i = 0; i < count; ++i)
- {
- data << ""; // string
- data << ""; // string
- data << uint32(0);
- data << uint32(0);
- data << float(0);
- }*/
- SendPacket(&data);
-}
diff --git a/src/game/Bag.cpp b/src/game/Bag.cpp
index 5c870bdb2b7..765d40f3962 100644
--- a/src/game/Bag.cpp
+++ b/src/game/Bag.cpp
@@ -34,7 +34,7 @@ Bag::Bag( ): Item()
m_valuesCount = CONTAINER_END;
- memset(m_bagslot, 0, sizeof(Item *) * MAX_BAG_SIZE);
+ memset(m_bagslot, 0, sizeof(Item *) * MAX_BAG_SIZE); // Maximum 20 Slots
}
Bag::~Bag()
diff --git a/src/game/BattleGround.cpp b/src/game/BattleGround.cpp
index b562517dc08..d392f074600 100644
--- a/src/game/BattleGround.cpp
+++ b/src/game/BattleGround.cpp
@@ -576,7 +576,6 @@ void BattleGround::EndBattleGround(uint32 winner)
uint32 bgQueueTypeId = sBattleGroundMgr.BGQueueTypeId(GetTypeID(), GetArenaType());
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, this, plr->GetTeam(), plr->GetBattleGroundQueueIndex(bgQueueTypeId), STATUS_IN_PROGRESS, TIME_TO_AUTOREMOVE, GetStartTime());
plr->GetSession()->SendPacket(&data);
- plr->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND, 1);
}
if(isArena() && isRated() && winner_arena_team && loser_arena_team)
@@ -1406,10 +1405,10 @@ bool BattleGround::AddSpiritGuide(uint32 type, float x, float y, float z, float
pCreature->SetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT, pCreature->GetGUID());
// aura
- pCreature->SetVisibleAura(0, SPELL_SPIRIT_HEAL_CHANNEL);
- //pCreature->SetUInt32Value(UNIT_FIELD_AURAFLAGS, 0x00000009);
- //pCreature->SetUInt32Value(UNIT_FIELD_AURALEVELS, 0x0000003C);
- //pCreature->SetUInt32Value(UNIT_FIELD_AURAAPPLICATIONS, 0x000000FF);
+ pCreature->SetUInt32Value(UNIT_FIELD_AURA, SPELL_SPIRIT_HEAL_CHANNEL);
+ pCreature->SetUInt32Value(UNIT_FIELD_AURAFLAGS, 0x00000009);
+ pCreature->SetUInt32Value(UNIT_FIELD_AURALEVELS, 0x0000003C);
+ pCreature->SetUInt32Value(UNIT_FIELD_AURAAPPLICATIONS, 0x000000FF);
// casting visual effect
pCreature->SetUInt32Value(UNIT_CHANNEL_SPELL, SPELL_SPIRIT_HEAL_CHANNEL);
// correct cast speed
diff --git a/src/game/BattleGround.h b/src/game/BattleGround.h
index 7b93adb7dfb..3c98afe6d17 100644
--- a/src/game/BattleGround.h
+++ b/src/game/BattleGround.h
@@ -132,6 +132,8 @@ struct BattleGroundObjectInfo
uint32 spellid;
};
+#define MAX_QUEUED_PLAYERS_MAP 7
+
enum BattleGroundTypeId
{
BATTLEGROUND_AV = 1,
@@ -141,10 +143,7 @@ enum BattleGroundTypeId
BATTLEGROUND_BE = 5,
BATTLEGROUND_AA = 6,
BATTLEGROUND_EY = 7,
- BATTLEGROUND_RL = 8,
- BATTLEGROUND_SA = 9,
- BATTLEGROUND_DS = 10,
- BATTLEGROUND_RV = 11
+ BATTLEGROUND_RL = 8
};
// handle the queue types and bg types separately to enable joining queue for different sized arenas at the same time
diff --git a/src/game/BattleGroundMgr.cpp b/src/game/BattleGroundMgr.cpp
index de525ae209d..4be2320be6a 100644
--- a/src/game/BattleGroundMgr.cpp
+++ b/src/game/BattleGroundMgr.cpp
@@ -1267,16 +1267,13 @@ void BattleGroundMgr::BuildPvpLogDataPacket(WorldPacket *data, BattleGround *bg)
*data << (uint32)((BattleGroundABScore*)itr->second)->BasesDefended; // bases defended
break;
case BATTLEGROUND_EY:
- *data << (uint32)0x00000001; // count of next fields
+ *data << (uint32)0x00000001; // count of next fields
*data << (uint32)((BattleGroundEYScore*)itr->second)->FlagCaptures; // flag captures
break;
case BATTLEGROUND_NA:
case BATTLEGROUND_BE:
case BATTLEGROUND_AA:
case BATTLEGROUND_RL:
- case BATTLEGROUND_SA: // wotlk
- case BATTLEGROUND_DS: // wotlk
- case BATTLEGROUND_RV: // wotlk
*data << (int32)0; // 0
break;
default:
diff --git a/src/game/BattleGroundMgr.h b/src/game/BattleGroundMgr.h
index 7ca3efed59b..b217c1d692e 100644
--- a/src/game/BattleGroundMgr.h
+++ b/src/game/BattleGroundMgr.h
@@ -32,9 +32,9 @@ typedef std::map<uint32, BattleGround*> BattleGroundSet;
//typedef std::map<uint32, BattleGroundQueue*> BattleGroundQueueSet;
typedef std::deque<BattleGround*> BGFreeSlotQueueType;
-#define MAX_BATTLEGROUND_QUEUES 8 // for level ranges 10-19, 20-29, 30-39, 40-49, 50-59, 60-69, 70-79, 80+
+#define MAX_BATTLEGROUND_QUEUES 7 // for level ranges 10-19, 20-29, 30-39, 40-49, 50-59, 60-69, 70+
-#define MAX_BATTLEGROUND_TYPES 12 // each BG type will be in array
+#define MAX_BATTLEGROUND_TYPES 9 // each BG type will be in array
#define MAX_BATTLEGROUND_QUEUE_TYPES 8
diff --git a/src/game/Calendar.cpp b/src/game/Calendar.cpp
deleted file mode 100644
index cebf7252e78..00000000000
--- a/src/game/Calendar.cpp
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Copyright (C) 2005-2008 MaNGOS <http://getmangos.com/>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
diff --git a/src/game/Calendar.h b/src/game/Calendar.h
deleted file mode 100644
index 94e4ff103f5..00000000000
--- a/src/game/Calendar.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2005-2008 MaNGOS <http://getmangos.com/>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef MANGOS_CALENDAR_H
-#define MANGOS_CALENDAR_H
-
-class Calendar
-{
-
-};
-#endif
diff --git a/src/game/CalendarHandler.cpp b/src/game/CalendarHandler.cpp
deleted file mode 100644
index 9c69e3a91f6..00000000000
--- a/src/game/CalendarHandler.cpp
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include "Common.h"
-#include "Log.h"
-#include "Player.h"
-#include "WorldPacket.h"
-#include "WorldSession.h"
-#include "Opcodes.h"
-
-void WorldSession::HandleCalendarGetCalendar(WorldPacket &recv_data)
-{
- sLog.outDebug("WORLD: CMSG_CALENDAR_GET_CALENDAR");
- recv_data.hexlike();
-}
-
-void WorldSession::HandleCalendarGetEvent(WorldPacket &recv_data)
-{
- sLog.outDebug("WORLD: CMSG_CALENDAR_GET_EVENT");
- recv_data.hexlike();
-}
-
-void WorldSession::HandleCalendarGuildFilter(WorldPacket &recv_data)
-{
- sLog.outDebug("WORLD: CMSG_CALENDAR_GUILD_FILTER");
- recv_data.hexlike();
-}
-
-void WorldSession::HandleCalendarArenaTeam(WorldPacket &recv_data)
-{
- sLog.outDebug("WORLD: CMSG_CALENDAR_ARENA_TEAM");
- recv_data.hexlike();
-}
-
-void WorldSession::HandleCalendarAddEvent(WorldPacket &recv_data)
-{
- sLog.outDebug("WORLD: CMSG_CALENDAR_ADD_EVENT");
- recv_data.hexlike();
-}
-
-void WorldSession::HandleCalendarUpdateEvent(WorldPacket &recv_data)
-{
- sLog.outDebug("WORLD: CMSG_CALENDAR_UPDATE_EVENT");
- recv_data.hexlike();
-}
-
-void WorldSession::HandleCalendarRemoveEvent(WorldPacket &recv_data)
-{
- sLog.outDebug("WORLD: CMSG_CALENDAR_REMOVE_EVENT");
- recv_data.hexlike();
-}
-
-void WorldSession::HandleCalendarCopyEvent(WorldPacket &recv_data)
-{
- sLog.outDebug("WORLD: CMSG_CALENDAR_COPY_EVENT");
- recv_data.hexlike();
-}
-
-void WorldSession::HandleCalendarEventInvite(WorldPacket &recv_data)
-{
- sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_INVITE");
- recv_data.hexlike();
-}
-
-void WorldSession::HandleCalendarEventRsvp(WorldPacket &recv_data)
-{
- sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_RSVP");
- recv_data.hexlike();
-}
-
-void WorldSession::HandleCalendarEventRemoveInvite(WorldPacket &recv_data)
-{
- sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_REMOVE_INVITE");
- recv_data.hexlike();
-}
-
-void WorldSession::HandleCalendarEventStatus(WorldPacket &recv_data)
-{
- sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_STATUS");
- recv_data.hexlike();
-}
-
-void WorldSession::HandleCalendarEventModeratorStatus(WorldPacket &recv_data)
-{
- sLog.outDebug("WORLD: CMSG_CALENDAR_EVENT_MODERATOR_STATUS");
- recv_data.hexlike();
-}
-
-void WorldSession::HandleCalendarComplain(WorldPacket &recv_data)
-{
- sLog.outDebug("WORLD: CMSG_CALENDAR_COMPLAIN");
- recv_data.hexlike();
-}
-
-void WorldSession::HandleCalendarGetNumPending(WorldPacket &recv_data)
-{
- sLog.outDebug("WORLD: CMSG_CALENDAR_GET_NUM_PENDING");
- recv_data.hexlike();
-
- WorldPacket data(SMSG_CALENDAR_SEND_NUM_PENDING, 4);
- data << uint32(0); // 0 - no pending invites, 1 - some pending invites
- SendPacket(&data);
-}
diff --git a/src/game/CharacterHandler.cpp b/src/game/CharacterHandler.cpp
index 121a9b0d98d..aa884ddd2df 100644
--- a/src/game/CharacterHandler.cpp
+++ b/src/game/CharacterHandler.cpp
@@ -82,9 +82,7 @@ bool LoginQueryHolder::Initialize()
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADDECLINEDNAMES, "SELECT genitive, dative, accusative, instrumental, prepositional FROM character_declinedname WHERE guid = '%u'",GUID_LOPART(m_guid));
// in other case still be dummy query
res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADGUILD, "SELECT guildid,rank FROM guild_member WHERE guid = '%u'", GUID_LOPART(m_guid));
- res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADARENAINFO, "SELECT arenateamid, played_week, played_season, personal_rating FROM arena_team_member WHERE guid='%u'", GUID_LOPART(m_guid));
- res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADACHIEVEMENTS, "SELECT achievement, date FROM character_achievement WHERE guid = '%u'", GUID_LOPART(m_guid));
- res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADCRITERIAPROGRESS,"SELECT criteria, counter, date FROM character_achievement_progress WHERE guid = '%u'", GUID_LOPART(m_guid));
+ res &= SetPQuery(PLAYER_LOGIN_QUERY_LOADARENAINFO, "SELECT arenateamid, played_week, played_season, personal_rating FROM arena_team_member WHERE guid='%u'", GUID_LOPART(m_guid));
return res;
}
@@ -234,16 +232,17 @@ void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data )
if (raceEntry->addon > Expansion())
{
data << (uint8)CHAR_CREATE_EXPANSION;
- sLog.outError("Expansion %u account:[%d] tried to Create character with expansion %u race (%u)",Expansion(),GetAccountId(),raceEntry->addon,race_);
+ sLog.outError("Not Expansion 1 account:[%d] but tried to Create character with expansion 1 race (%u)",GetAccountId(),race_);
SendPacket( &data );
return;
}
// prevent character creating Expansion class without Expansion account
- if (classEntry->addon > Expansion())
+ // TODO: use possible addon field in ChrClassesEntry in next dbc version
+ if (Expansion() < 2 && class_ == CLASS_DEATH_KNIGHT)
{
- data << (uint8)CHAR_CREATE_EXPANSION_CLASS;
- sLog.outError("Expansion %u account:[%d] tried to Create character with expansion %u class (%u)",Expansion(),GetAccountId(),classEntry->addon,class_);
+ data << (uint8)CHAR_CREATE_EXPANSION;
+ sLog.outError("Not Expansion 2 account:[%d] but tried to Create character with expansion 2 class (%u)",GetAccountId(),class_);
SendPacket( &data );
return;
}
@@ -310,77 +309,29 @@ void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data )
}
}
- // speedup check for heroic class disabled case
- uint32 heroic_free_slots = sWorld.getConfig(CONFIG_HEROIC_CHARACTERS_PER_REALM);
- if(heroic_free_slots==0 && GetSecurity()==SEC_PLAYER && class_ == CLASS_DEATH_KNIGHT)
- {
- data << (uint8)CHAR_CREATE_UNIQUE_CLASS_LIMIT;
- SendPacket( &data );
- return;
- }
-
- // speedup check for heroic class disabled case
- uint32 req_level_for_heroic = sWorld.getConfig(CONFIG_MIN_LEVEL_FOR_HEROIC_CHARACTER_CREATING);
- if(GetSecurity()==SEC_PLAYER && class_ == CLASS_DEATH_KNIGHT && req_level_for_heroic > sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL))
- {
- data << (uint8)CHAR_CREATE_LEVEL_REQUIREMENT;
- SendPacket( &data );
- return;
- }
-
bool AllowTwoSideAccounts = !sWorld.IsPvPRealm() || sWorld.getConfig(CONFIG_ALLOW_TWO_SIDE_ACCOUNTS) || GetSecurity() > SEC_PLAYER;
uint32 skipCinematics = sWorld.getConfig(CONFIG_SKIP_CINEMATICS);
bool have_same_race = false;
-
- // if 0 then allowed creating without any characters
- bool have_req_level_for_heroic = (req_level_for_heroic==0);
-
- if(!AllowTwoSideAccounts || skipCinematics == 1 || class_ == CLASS_DEATH_KNIGHT)
+ if(!AllowTwoSideAccounts || skipCinematics == 1)
{
- QueryResult *result2 = CharacterDatabase.PQuery("SELECT guid,race,class FROM characters WHERE account = '%u' %s",
- GetAccountId(), (skipCinematics == 1 || class_ == CLASS_DEATH_KNIGHT) ? "" : "LIMIT 1");
+ QueryResult *result2 = CharacterDatabase.PQuery("SELECT DISTINCT race FROM characters WHERE account = '%u' %s", GetAccountId(),skipCinematics == 1 ? "" : "LIMIT 1");
if(result2)
{
uint32 team_= Player::TeamForRace(race_);
Field* field = result2->Fetch();
- uint8 acc_race = field[1].GetUInt32();
-
- if(GetSecurity()==SEC_PLAYER && class_ == CLASS_DEATH_KNIGHT)
- {
- uint8 acc_class = field[2].GetUInt32();
- if(acc_class == CLASS_DEATH_KNIGHT)
- {
- if(heroic_free_slots > 0)
- --heroic_free_slots;
-
- if(heroic_free_slots==0)
- {
- data << (uint8)CHAR_CREATE_UNIQUE_CLASS_LIMIT;
- SendPacket( &data );
- return;
- }
- }
-
- if(!have_req_level_for_heroic)
- {
- uint32 acc_guid = field[0].GetUInt32();
- uint32 acc_level = Player::GetUInt32ValueFromDB(UNIT_FIELD_LEVEL,acc_guid);
- if(acc_level >= req_level_for_heroic)
- have_req_level_for_heroic = true;
- }
- }
+ uint8 race = field[0].GetUInt32();
// need to check team only for first character
// TODO: what to if account already has characters of both races?
if (!AllowTwoSideAccounts)
{
- uint32 acc_team=0;
- if(acc_race > 0)
- acc_team = Player::TeamForRace(acc_race);
+ uint32 team=0;
+ if(race > 0)
+ team = Player::TeamForRace(race);
- if(acc_team != team_)
+ if(team != team_)
{
data << (uint8)CHAR_CREATE_PVP_TEAMS_VIOLATION;
SendPacket( &data );
@@ -389,55 +340,20 @@ void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data )
}
}
- // search same race for cinematic or same class if need
- // TODO: check if cinematic already shown? (already logged in?; cinematic field)
- while ((skipCinematics == 1 && !have_same_race) || class_ == CLASS_DEATH_KNIGHT)
+ if (skipCinematics == 1)
{
- if(!result2->NextRow())
- break;
-
- field = result2->Fetch();
- acc_race = field[1].GetUInt32();
-
- if(!have_same_race)
- have_same_race = race_ == acc_race;
-
- if(GetSecurity()==SEC_PLAYER && class_ == CLASS_DEATH_KNIGHT)
+ // TODO: check if cinematic already shown? (already logged in?; cinematic field)
+ while (race_ != race && result2->NextRow())
{
- uint8 acc_class = field[2].GetUInt32();
- if(acc_class == CLASS_DEATH_KNIGHT)
- {
- if(heroic_free_slots > 0)
- --heroic_free_slots;
-
- if(heroic_free_slots==0)
- {
- data << (uint8)CHAR_CREATE_UNIQUE_CLASS_LIMIT;
- SendPacket( &data );
- return;
- }
- }
-
- if(!have_req_level_for_heroic)
- {
- uint32 acc_guid = field[0].GetUInt32();
- uint32 acc_level = Player::GetUInt32ValueFromDB(UNIT_FIELD_LEVEL,acc_guid);
- if(acc_level >= req_level_for_heroic)
- have_req_level_for_heroic = true;
- }
+ field = result2->Fetch();
+ race = field[0].GetUInt32();
}
+ have_same_race = race_ == race;
}
delete result2;
}
}
- if(GetSecurity()==SEC_PLAYER && class_ == CLASS_DEATH_KNIGHT && !have_req_level_for_heroic)
- {
- data << (uint8)CHAR_CREATE_LEVEL_REQUIREMENT;
- SendPacket( &data );
- return;
- }
-
// extract other data required for player creating
uint8 gender, skin, face, hairStyle, hairColor, facialHair, outfitId;
recv_data >> gender >> skin >> face;
@@ -594,11 +510,9 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder)
data << pCurrChar->GetOrientation();
SendPacket(&data);
- data.Initialize( SMSG_ACCOUNT_DATA_TIMES, 4+1+8*4 ); // changed in WotLK
- data << uint32(time(NULL)); // unix time of something
- data << uint8(1);
- for(int i = 0; i < NUM_ACCOUNT_DATA_TYPES; i++)
- data << uint32(GetAccountData(i)->Time); // also unix time
+ data.Initialize( SMSG_ACCOUNT_DATA_TIMES, 128 );
+ for(int i = 0; i < 32; i++)
+ data << uint32(0);
SendPacket(&data);
data.Initialize(SMSG_FEATURE_SYSTEM_STATUS, 2); // added in 2.2.0
@@ -695,20 +609,12 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder)
{
pCurrChar->setCinematic(1);
- if(ChrClassesEntry const* cEntry = sChrClassesStore.LookupEntry(pCurrChar->getClass()))
+ ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(pCurrChar->getRace());
+ if(rEntry)
{
- if(cEntry->CinematicSequence)
- {
- data.Initialize(SMSG_TRIGGER_CINEMATIC, 4);
- data << uint32(cEntry->CinematicSequence);
- SendPacket( &data );
- }
- else if(ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(pCurrChar->getRace()))
- {
- data.Initialize(SMSG_TRIGGER_CINEMATIC, 4);
- data << uint32(rEntry->CinematicSequence);
- SendPacket( &data );
- }
+ data.Initialize( SMSG_TRIGGER_CINEMATIC,4 );
+ data << uint32(rEntry->startmovie);
+ SendPacket( &data );
}
}
@@ -752,6 +658,22 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder)
pCurrChar->CastSpell(pCurrChar, 20584, true, 0);// auras SPELL_AURA_INCREASE_SPEED(+speed in wisp form), SPELL_AURA_INCREASE_SWIM_SPEED(+swim speed in wisp form), SPELL_AURA_TRANSFORM (to wisp form)
pCurrChar->CastSpell(pCurrChar, 8326, true, 0); // auras SPELL_AURA_GHOST, SPELL_AURA_INCREASE_SPEED(why?), SPELL_AURA_INCREASE_SWIM_SPEED(why?)
+ //pCurrChar->SetUInt32Value(UNIT_FIELD_AURA+41, 8326);
+ //pCurrChar->SetUInt32Value(UNIT_FIELD_AURA+42, 20584);
+ //pCurrChar->SetUInt32Value(UNIT_FIELD_AURAFLAGS+6, 238);
+ //pCurrChar->SetUInt32Value(UNIT_FIELD_AURALEVELS+11, 514);
+ //pCurrChar->SetUInt32Value(UNIT_FIELD_AURAAPPLICATIONS+11, 65535);
+ //pCurrChar->SetUInt32Value(UNIT_FIELD_DISPLAYID, 1825);
+ //if (pCurrChar->getRace() == RACE_NIGHTELF)
+ //{
+ // pCurrChar->SetSpeed(MOVE_RUN, 1.5f*1.2f, true);
+ // pCurrChar->SetSpeed(MOVE_SWIM, 1.5f*1.2f, true);
+ //}
+ //else
+ //{
+ // pCurrChar->SetSpeed(MOVE_RUN, 1.5f, true);
+ // pCurrChar->SetSpeed(MOVE_SWIM, 1.5f, true);
+ //}
pCurrChar->SetMovement(MOVE_WATER_WALK);
}
@@ -981,11 +903,11 @@ void WorldSession::HandleToggleCloakOpcode( WorldPacket & /*recv_data*/ )
void WorldSession::HandleChangePlayerNameOpcode(WorldPacket& recv_data)
{
- CHECK_PACKET_SIZE(recv_data, 8+1);
-
uint64 guid;
std::string newname;
+ CHECK_PACKET_SIZE(recv_data, 8+1);
+
recv_data >> guid;
recv_data >> newname;
@@ -993,15 +915,15 @@ void WorldSession::HandleChangePlayerNameOpcode(WorldPacket& recv_data)
if(!normalizePlayerName(newname))
{
WorldPacket data(SMSG_CHAR_RENAME, 1);
- data << uint8(CHAR_NAME_NO_NAME);
+ data << (uint8)CHAR_NAME_NO_NAME;
SendPacket( &data );
return;
}
- if(!ObjectMgr::IsValidName(newname, true))
+ if(!ObjectMgr::IsValidName(newname,true))
{
WorldPacket data(SMSG_CHAR_RENAME, 1);
- data << uint8(CHAR_NAME_INVALID_CHARACTER);
+ data << (uint8)CHAR_NAME_INVALID_CHARACTER;
SendPacket( &data );
return;
}
@@ -1010,7 +932,7 @@ void WorldSession::HandleChangePlayerNameOpcode(WorldPacket& recv_data)
if(GetSecurity() == SEC_PLAYER && objmgr.IsReservedName(newname))
{
WorldPacket data(SMSG_CHAR_RENAME, 1);
- data << uint8(CHAR_NAME_RESERVED);
+ data << (uint8)CHAR_NAME_RESERVED;
SendPacket( &data );
return;
}
@@ -1039,7 +961,7 @@ void WorldSession::HandleChangePlayerNameOpcodeCallBack(QueryResult *result, uin
if (!result)
{
WorldPacket data(SMSG_CHAR_RENAME, 1);
- data << uint8(CHAR_CREATE_ERROR);
+ data << (uint8)CHAR_CREATE_ERROR;
session->SendPacket( &data );
return;
}
@@ -1053,11 +975,11 @@ void WorldSession::HandleChangePlayerNameOpcodeCallBack(QueryResult *result, uin
CharacterDatabase.PExecute("UPDATE characters set name = '%s', at_login = at_login & ~ %u WHERE guid ='%u'", newname.c_str(), uint32(AT_LOGIN_RENAME), guidLow);
CharacterDatabase.PExecute("DELETE FROM character_declinedname WHERE guid ='%u'", guidLow);
- sLog.outChar("Account: %d (IP: %s) Character:[%s] (guid:%u) Changed name to: %s", session->GetAccountId(), session->GetRemoteAddress().c_str(), oldname.c_str(), guidLow, newname.c_str());
+ sLog.outChar("Account: %d (IP: %s) Character:[%s] (guid:%u) Changed name to: %s",session->GetAccountId(), session->GetRemoteAddress().c_str(), oldname.c_str(), guidLow, newname.c_str());
- WorldPacket data(SMSG_CHAR_RENAME, 1+8+(newname.size()+1));
- data << uint8(RESPONSE_SUCCESS);
- data << uint64(guid);
+ WorldPacket data(SMSG_CHAR_RENAME,1+8+(newname.size()+1));
+ data << (uint8)RESPONSE_SUCCESS;
+ data << guid;
data << newname;
session->SendPacket(&data);
}
@@ -1151,166 +1073,3 @@ void WorldSession::HandleDeclinedPlayerNameOpcode(WorldPacket& recv_data)
data << uint64(guid);
SendPacket(&data);
}
-
-void WorldSession::HandleAlterAppearance( WorldPacket & recv_data )
-{
- sLog.outDebug("CMSG_ALTER_APPEARANCE");
-
- CHECK_PACKET_SIZE(recv_data, 4+4+4);
-
- uint32 Hair, Color, FacialHair;
- recv_data >> Hair >> Color >> FacialHair;
-
- BarberShopStyleEntry const* bs_hair = sBarberShopStyleStore.LookupEntry(Hair);
-
- if(!bs_hair || bs_hair->type != 0 || bs_hair->race != _player->getRace() || bs_hair->gender != _player->getGender())
- return;
-
- BarberShopStyleEntry const* bs_facialHair = sBarberShopStyleStore.LookupEntry(FacialHair);
-
- if(!bs_facialHair || bs_facialHair->type != 2 || bs_facialHair->race != _player->getRace() || bs_facialHair->gender != _player->getGender())
- return;
-
- uint32 Cost = _player->GetBarberShopCost(bs_hair->hair_id, Color, bs_facialHair->hair_id);
-
- // 0 - ok
- // 1,3 - not enough money
- // 2 - you have to seat on barber chair
- if(_player->GetMoney() < Cost)
- {
- WorldPacket data(SMSG_BARBER_SHOP_RESULT, 4);
- data << uint32(1); // no money
- SendPacket(&data);
- return;
- }
- else
- {
- WorldPacket data(SMSG_BARBER_SHOP_RESULT, 4);
- data << uint32(0); // ok
- SendPacket(&data);
- }
-
- _player->SetMoney(_player->GetMoney() - Cost); // it isn't free
-
- _player->SetByteValue(PLAYER_BYTES, 2, uint8(bs_hair->hair_id));
- _player->SetByteValue(PLAYER_BYTES, 3, uint8(Color));
- _player->SetByteValue(PLAYER_BYTES_2, 0, uint8(bs_facialHair->hair_id));
-
- _player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP, 1);
-
- _player->SetStandState(0); // stand up
-}
-
-void WorldSession::HandleRemoveGlyph( WorldPacket & recv_data )
-{
- CHECK_PACKET_SIZE(recv_data, 4);
-
- uint32 slot;
- recv_data >> slot;
-
- if(slot > 5)
- {
- sLog.outDebug("Client sent wrong glyph slot number in opcode CMSG_REMOVE_GLYPH %u", slot);
- return;
- }
-
- if(uint32 glyph = _player->GetGlyph(slot))
- {
- if(GlyphPropertiesEntry const *gp = sGlyphPropertiesStore.LookupEntry(glyph))
- {
- _player->RemoveAurasDueToSpell(gp->SpellId);
- _player->SetGlyph(slot, 0);
- }
- }
-}
-
-void WorldSession::HandleCharCustomize(WorldPacket& recv_data)
-{
- CHECK_PACKET_SIZE(recv_data, 8+1);
-
- uint64 guid;
- std::string newname;
-
- recv_data >> guid;
- recv_data >> newname;
-
- CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+1+1+1+1+1+1);
-
- uint8 gender, skin, face, hairStyle, hairColor, facialHair;
- recv_data >> gender >> skin >> face >> hairStyle >> hairColor >> facialHair;
-
- QueryResult *result = CharacterDatabase.PQuery("SELECT at_login FROM characters WHERE guid ='%u'", GUID_LOPART(guid));
- if (!result)
- {
- WorldPacket data(SMSG_CHAR_CUSTOMIZE, 1);
- data << uint8(CHAR_CREATE_ERROR);
- SendPacket( &data );
- return;
- }
-
- Field *fields = result->Fetch();
- uint32 at_loginFlags = fields[0].GetUInt32();
- delete result;
-
- if (!(at_loginFlags & AT_LOGIN_CUSTOMIZE))
- {
- WorldPacket data(SMSG_CHAR_CUSTOMIZE, 1);
- data << uint8(CHAR_CREATE_ERROR);
- SendPacket( &data );
- return;
- }
-
- // prevent character rename to invalid name
- if(!normalizePlayerName(newname))
- {
- WorldPacket data(SMSG_CHAR_CUSTOMIZE, 1);
- data << uint8(CHAR_NAME_NO_NAME);
- SendPacket( &data );
- return;
- }
-
- if(!ObjectMgr::IsValidName(newname,true))
- {
- WorldPacket data(SMSG_CHAR_CUSTOMIZE, 1);
- data << uint8(CHAR_NAME_INVALID_CHARACTER);
- SendPacket( &data );
- return;
- }
-
- // check name limitations
- if(GetSecurity() == SEC_PLAYER && objmgr.IsReservedName(newname))
- {
- WorldPacket data(SMSG_CHAR_CUSTOMIZE, 1);
- data << uint8(CHAR_NAME_RESERVED);
- SendPacket( &data );
- return;
- }
-
- if(objmgr.GetPlayerGUIDByName(newname)) // character with this name already exist
- {
- WorldPacket data(SMSG_CHAR_CUSTOMIZE, 1);
- data << uint8(CHAR_CREATE_NAME_IN_USE);
- SendPacket( &data );
- return;
- }
-
- CharacterDatabase.escape_string(newname);
- Player::Customize(guid, gender, skin, face, hairStyle, hairColor, facialHair);
- CharacterDatabase.PExecute("UPDATE characters set name = '%s', at_login = at_login & ~ %u WHERE guid ='%u'", newname.c_str(), uint32(AT_LOGIN_CUSTOMIZE), GUID_LOPART(guid));
- CharacterDatabase.PExecute("DELETE FROM character_declinedname WHERE guid ='%u'", GUID_LOPART(guid));
-
- std::string IP_str = GetRemoteAddress();
- sLog.outChar("Account: %d (IP: %s), Character guid: %u Customized to: %s", GetAccountId(), IP_str.c_str(), GUID_LOPART(guid), newname.c_str());
-
- WorldPacket data(SMSG_CHAR_CUSTOMIZE, 1+8+(newname.size()+1)+6);
- data << uint8(RESPONSE_SUCCESS);
- data << uint64(guid);
- data << newname;
- data << uint8(gender);
- data << uint8(skin);
- data << uint8(face);
- data << uint8(hairStyle);
- data << uint8(hairColor);
- data << uint8(facialHair);
- SendPacket(&data);
-}
diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp
index 2cee426fded..203f8f6c624 100644
--- a/src/game/Chat.cpp
+++ b/src/game/Chat.cpp
@@ -190,7 +190,6 @@ ChatCommand * ChatHandler::getCommandTable()
{ "sellerr", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSellErrorCommand, "", NULL },
{ "buyerr", SEC_ADMINISTRATOR, false, &ChatHandler::HandleBuyErrorCommand, "", NULL },
{ "sendopcode", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSendOpcodeCommand, "", NULL },
- { "spawnvehicle", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSpawnVehicle, "", NULL },
{ "uws", SEC_ADMINISTRATOR, false, &ChatHandler::HandleUpdateWorldStateCommand, "", NULL },
{ "ps", SEC_ADMINISTRATOR, false, &ChatHandler::HandlePlaySound2Command, "", NULL },
{ "scn", SEC_ADMINISTRATOR, false, &ChatHandler::HandleSendChannelNotifyCommand, "", NULL },
@@ -264,7 +263,6 @@ ChatCommand * ChatHandler::getCommandTable()
{ "item_enchantment_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadItemEnchantementsCommand, "", NULL },
{ "item_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesItemCommand, "", NULL },
{ "trinity_string", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadTrinityStringCommand, "", NULL },
- { "milling_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesMillingCommand, "", NULL },
{ "npc_gossip", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcGossipCommand, "", NULL },
{ "npc_option", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcOptionCommand, "", NULL },
{ "npc_trainer", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcTrainerCommand, "", NULL },
@@ -591,7 +589,6 @@ ChatCommand * ChatHandler::getCommandTable()
{ "sendmail", SEC_MODERATOR, true, &ChatHandler::HandleSendMailCommand, "", NULL },
{ "sendmoney", SEC_ADMINISTRATOR, true, &ChatHandler::HandleSendMoneyCommand, "", NULL },
{ "rename", SEC_GAMEMASTER, true, &ChatHandler::HandleRenameCommand, "", NULL },
- { "customize", SEC_GAMEMASTER, true, &ChatHandler::HandleCustomizeCommand, "", NULL },
{ "loadscripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleLoadScriptsCommand, "", NULL },
{ "mute", SEC_GAMEMASTER, true, &ChatHandler::HandleMuteCommand, "", NULL },
{ "unmute", SEC_GAMEMASTER, true, &ChatHandler::HandleUnmuteCommand, "", NULL },
diff --git a/src/game/Chat.h b/src/game/Chat.h
index b324d2d5f5e..16f764366ac 100644
--- a/src/game/Chat.h
+++ b/src/game/Chat.h
@@ -233,7 +233,6 @@ class ChatHandler
bool HandleReloadLootTemplatesFishingCommand(const char* args);
bool HandleReloadLootTemplatesGameobjectCommand(const char* args);
bool HandleReloadLootTemplatesItemCommand(const char* args);
- bool HandleReloadLootTemplatesMillingCommand(const char* args);
bool HandleReloadLootTemplatesPickpocketingCommand(const char* args);
bool HandleReloadLootTemplatesProspectingCommand(const char* args);
bool HandleReloadLootTemplatesReferenceCommand(const char* args);
@@ -435,7 +434,6 @@ class ChatHandler
bool HandleSendChannelNotifyCommand(const char* args);
bool HandleSendChatMsgCommand(const char* args);
bool HandleRenameCommand(const char * args);
- bool HandleCustomizeCommand(const char * args);
bool HandleLoadPDumpCommand(const char *args);
bool HandleWritePDumpCommand(const char *args);
bool HandleCastCommand(const char *args);
@@ -469,7 +467,6 @@ class ChatHandler
bool HandleUnPossessCommand(const char* args);
bool HandleBindSightCommand(const char* args);
bool HandleUnbindSightCommand(const char* args);
- bool HandleSpawnVehicle(const char * args);
Player* getSelectedPlayer();
Creature* getSelectedCreature();
diff --git a/src/game/Corpse.cpp b/src/game/Corpse.cpp
index 77b553f6856..989ccd61151 100644
--- a/src/game/Corpse.cpp
+++ b/src/game/Corpse.cpp
@@ -36,7 +36,7 @@ Corpse::Corpse(CorpseType type) : WorldObject()
m_objectType |= TYPEMASK_CORPSE;
m_objectTypeId = TYPEID_CORPSE;
// 2.3.2 - 0x58
- m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION);
+ m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HASPOSITION);
m_valuesCount = CORPSE_END;
diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp
index 5a3e9512bd0..c0065212207 100644
--- a/src/game/Creature.cpp
+++ b/src/game/Creature.cpp
@@ -145,12 +145,11 @@ Unit(), i_AI(NULL), i_AI_possessed(NULL),
lootForPickPocketed(false), lootForBody(false), m_groupLootTimer(0), lootingGroupLeaderGUID(0),
m_lootMoney(0), m_lootRecipient(0),
m_deathTimer(0), m_respawnTime(0), m_respawnDelay(25), m_corpseDelay(60), m_respawnradius(0.0f),
-m_gossipOptionLoaded(false), m_emoteState(0), m_isPet(false), m_isTotem(false), m_isVehicle(false), m_reactState(REACT_AGGRESSIVE),
-m_defaultMovementType(IDLE_MOTION_TYPE), m_equipmentId(0),
+m_gossipOptionLoaded(false), m_emoteState(0), m_isPet(false), m_isTotem(false), m_reactState(REACT_AGGRESSIVE),
+m_regenTimer(2000), m_defaultMovementType(IDLE_MOTION_TYPE), m_equipmentId(0),
m_AlreadyCallAssistance(false), m_regenHealth(true), m_AI_locked(false), m_isDeadByDefault(false),
m_meleeDamageSchoolMask(SPELL_SCHOOL_MASK_NORMAL),m_creatureInfo(NULL), m_DBTableGuid(0), m_formationID(0)
{
- m_regenTimer = 200;
m_valuesCount = UNIT_END;
for(int i =0; i<4; ++i)
@@ -316,6 +315,7 @@ bool Creature::UpdateEntry(uint32 Entry, uint32 team, const CreatureData *data )
// creatures always have melee weapon ready if any
SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE );
+ SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_AURAS );
SelectLevel(GetCreatureInfo());
if (team == HORDE)
@@ -765,11 +765,8 @@ bool Creature::isCanInteractWithBattleMaster(Player* pPlayer, bool msg) const
case BATTLEGROUND_NA:
case BATTLEGROUND_BE:
case BATTLEGROUND_AA:
- case BATTLEGROUND_RL:
- case BATTLEGROUND_SA:
- case BATTLEGROUND_DS:
- case BATTLEGROUND_RV: pPlayer->PlayerTalkClass->SendGossipMenu(10024,GetGUID()); break;
- default: break;
+ case BATTLEGROUND_RL: pPlayer->PlayerTalkClass->SendGossipMenu(10024,GetGUID()); break;
+ break;
}
return false;
}
@@ -1462,7 +1459,11 @@ void Creature::LoadEquipment(uint32 equip_entry, bool force)
if (force)
{
for (uint8 i = 0; i < 3; i++)
- SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + i, 0);
+ {
+ SetUInt32Value( UNIT_VIRTUAL_ITEM_SLOT_DISPLAY + i, 0);
+ SetUInt32Value( UNIT_VIRTUAL_ITEM_INFO + (i * 2), 0);
+ SetUInt32Value( UNIT_VIRTUAL_ITEM_INFO + (i * 2) + 1, 0);
+ }
m_equipmentId = 0;
}
return;
@@ -1474,7 +1475,11 @@ void Creature::LoadEquipment(uint32 equip_entry, bool force)
m_equipmentId = equip_entry;
for (uint8 i = 0; i < 3; i++)
- SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + i, einfo->equipentry[i]);
+ {
+ SetUInt32Value( UNIT_VIRTUAL_ITEM_SLOT_DISPLAY + i, einfo->equipmodel[i]);
+ SetUInt32Value( UNIT_VIRTUAL_ITEM_INFO + (i * 2), einfo->equipinfo[i]);
+ SetUInt32Value( UNIT_VIRTUAL_ITEM_INFO + (i * 2) + 1, einfo->equipslot[i]);
+ }
}
bool Creature::hasQuest(uint32 quest_id) const
diff --git a/src/game/Creature.h b/src/game/Creature.h
index ff512fb5da0..1ae41b86776 100644
--- a/src/game/Creature.h
+++ b/src/game/Creature.h
@@ -244,7 +244,9 @@ struct NpcOptionLocale
struct EquipmentInfo
{
uint32 entry;
- uint32 equipentry[3];
+ uint32 equipmodel[3];
+ uint32 equipinfo[3];
+ uint32 equipslot[3];
};
// from `creature` table
@@ -421,7 +423,6 @@ class TRINITY_DLL_SPEC Creature : public Unit
uint32 GetEquipmentId() const { return m_equipmentId; }
bool isPet() const { return m_isPet; }
- bool isVehicle() const { return m_isVehicle; }
void SetCorpseDelay(uint32 delay) { m_corpseDelay = delay; }
bool isTotem() const { return m_isTotem; }
bool isRacialLeader() const { return GetCreatureInfo()->RacialLeader; }
@@ -656,11 +657,11 @@ class TRINITY_DLL_SPEC Creature : public Unit
uint8 m_emoteState;
bool m_isPet; // set only in Pet::Pet
- bool m_isVehicle; // set only in Vehicle::Vehicle
bool m_isTotem; // set only in Totem::Totem
ReactStates m_reactState; // for AI, not charmInfo
void RegenerateMana();
void RegenerateHealth();
+ uint32 m_regenTimer;
MovementGeneratorType m_defaultMovementType;
Cell m_currentCell; // store current cell where creature listed
uint32 m_DBTableGuid; ///< For new or temporary creatures is 0 for saved it is lowguid
diff --git a/src/game/DynamicObject.cpp b/src/game/DynamicObject.cpp
index 0dc69829728..d7badd57892 100644
--- a/src/game/DynamicObject.cpp
+++ b/src/game/DynamicObject.cpp
@@ -38,7 +38,7 @@ DynamicObject::DynamicObject() : WorldObject()
m_objectType |= TYPEMASK_DYNAMICOBJECT;
m_objectTypeId = TYPEID_DYNAMICOBJECT;
// 2.3.2 - 0x58
- m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION);
+ m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HASPOSITION);
m_valuesCount = DYNAMICOBJECT_END;
}
diff --git a/src/game/GameObject.cpp b/src/game/GameObject.cpp
index 53a7d36aef4..28c39ee5bbe 100644
--- a/src/game/GameObject.cpp
+++ b/src/game/GameObject.cpp
@@ -46,7 +46,7 @@ GameObject::GameObject() : WorldObject()
m_objectType |= TYPEMASK_GAMEOBJECT;
m_objectTypeId = TYPEID_GAMEOBJECT;
// 2.3.2 - 0x58
- m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION);
+ m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HASPOSITION);
m_valuesCount = GAMEOBJECT_END;
m_respawnTime = 0;
@@ -127,33 +127,17 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map *map, float x, float
SetFloatValue(GAMEOBJECT_POS_Z, z);
SetFloatValue(GAMEOBJECT_FACING, ang); //this is not facing angle
- int64 rotation = 0;
-
- float f_rot1 = sin(ang / 2.0f);
- int64 i_rot1 = f_rot1 / atan(pow(2.0f, -20.0f));
- rotation |= (i_rot1 << 43 >> 43) & 0x00000000001FFFFF;
-
- //float f_rot2 = sin(0.0f / 2.0f);
- //int64 i_rot2 = f_rot2 / atan(pow(2.0f, -20.0f));
- //rotation |= (((i_rot2 << 22) >> 32) >> 11) & 0x000003FFFFE00000;
-
- //float f_rot3 = sin(0.0f / 2.0f);
- //int64 i_rot3 = f_rot3 / atan(pow(2.0f, -21.0f));
- //rotation |= (i_rot3 >> 42) & 0x7FFFFC0000000000;
-
- SetUInt64Value(GAMEOBJECT_ROTATION, rotation);
-
- SetFloatValue(GAMEOBJECT_PARENTROTATION+0, rotation0);
- SetFloatValue(GAMEOBJECT_PARENTROTATION+1, rotation1);
- SetFloatValue(GAMEOBJECT_PARENTROTATION+2, rotation2);
- SetFloatValue(GAMEOBJECT_PARENTROTATION+3, rotation3);
+ SetFloatValue (GAMEOBJECT_ROTATION, rotation0);
+ SetFloatValue (GAMEOBJECT_ROTATION+1, rotation1);
+ SetFloatValue (GAMEOBJECT_ROTATION+2, rotation2);
+ SetFloatValue (GAMEOBJECT_ROTATION+3, rotation3);
SetFloatValue(OBJECT_FIELD_SCALE_X, goinfo->size);
SetUInt32Value(GAMEOBJECT_FACTION, goinfo->faction);
SetUInt32Value(GAMEOBJECT_FLAGS, goinfo->flags);
- SetEntry(goinfo->id);
+ SetUInt32Value(OBJECT_FIELD_ENTRY, goinfo->id);
SetUInt32Value(GAMEOBJECT_DISPLAYID, goinfo->displayId);
@@ -162,6 +146,8 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map *map, float x, float
SetGoAnimProgress(animprogress);
+ SetUInt32Value (GAMEOBJECT_ARTKIT, ArtKit);
+
// Spell charges for GAMEOBJECT_TYPE_SPELLCASTER (22)
if (goinfo->type == GAMEOBJECT_TYPE_SPELLCASTER)
m_charges = goinfo->spellcaster.charges;
@@ -278,7 +264,7 @@ void GameObject::Update(uint32 /*p_time*/)
return;
}
// respawn timer
- GetMap()->Add(this);
+ MapManager::Instance().GetMap(GetMapId(), this)->Add(this);
break;
}
}
@@ -428,7 +414,7 @@ void GameObject::Update(uint32 /*p_time*/)
//burning flags in some battlegrounds, if you find better condition, just add it
if (GetGoAnimProgress() > 0)
{
- SendObjectDeSpawnAnim(GetGUID());
+ SendObjectDeSpawnAnim(this->GetGUID());
//reset flags
SetUInt32Value(GAMEOBJECT_FLAGS, GetGOInfo()->flags);
}
@@ -465,7 +451,7 @@ void GameObject::Refresh()
return;
if(isSpawned())
- GetMap()->Add(this);
+ MapManager::Instance().GetMap(GetMapId(), this)->Add(this);
}
void GameObject::AddUniqueUse(Player* player)
@@ -518,7 +504,7 @@ void GameObject::SaveToDB(uint32 mapid, uint8 spawnMask)
if (!goI)
return;
-
+
if (!m_DBTableGuid)
m_DBTableGuid = GetGUIDLow();
// update in loaded data (changing data only in this place)
@@ -531,33 +517,34 @@ void GameObject::SaveToDB(uint32 mapid, uint8 spawnMask)
data.posY = GetFloatValue(GAMEOBJECT_POS_Y);
data.posZ = GetFloatValue(GAMEOBJECT_POS_Z);
data.orientation = GetFloatValue(GAMEOBJECT_FACING);
- data.rotation0 = GetFloatValue(GAMEOBJECT_PARENTROTATION+0);
- data.rotation1 = GetFloatValue(GAMEOBJECT_PARENTROTATION+1);
- data.rotation2 = GetFloatValue(GAMEOBJECT_PARENTROTATION+2);
- data.rotation3 = GetFloatValue(GAMEOBJECT_PARENTROTATION+3);
+ data.rotation0 = GetFloatValue(GAMEOBJECT_ROTATION+0);
+ data.rotation1 = GetFloatValue(GAMEOBJECT_ROTATION+1);
+ data.rotation2 = GetFloatValue(GAMEOBJECT_ROTATION+2);
+ data.rotation3 = GetFloatValue(GAMEOBJECT_ROTATION+3);
data.spawntimesecs = m_spawnedByDefault ? m_respawnDelayTime : -(int32)m_respawnDelayTime;
data.animprogress = GetGoAnimProgress();
data.go_state = GetGoState();
data.spawnMask = spawnMask;
+ data.ArtKit = GetUInt32Value (GAMEOBJECT_ARTKIT);
// updated in DB
std::ostringstream ss;
ss << "INSERT INTO gameobject VALUES ( "
<< m_DBTableGuid << ", "
- << GetEntry() << ", "
+ << GetUInt32Value (OBJECT_FIELD_ENTRY) << ", "
<< mapid << ", "
<< (uint32)spawnMask << ", "
<< GetFloatValue(GAMEOBJECT_POS_X) << ", "
<< GetFloatValue(GAMEOBJECT_POS_Y) << ", "
<< GetFloatValue(GAMEOBJECT_POS_Z) << ", "
<< GetFloatValue(GAMEOBJECT_FACING) << ", "
- << GetFloatValue(GAMEOBJECT_PARENTROTATION) << ", "
- << GetFloatValue(GAMEOBJECT_PARENTROTATION+1) << ", "
- << GetFloatValue(GAMEOBJECT_PARENTROTATION+2) << ", "
- << GetFloatValue(GAMEOBJECT_PARENTROTATION+3) << ", "
+ << GetFloatValue(GAMEOBJECT_ROTATION) << ", "
+ << GetFloatValue(GAMEOBJECT_ROTATION+1) << ", "
+ << GetFloatValue(GAMEOBJECT_ROTATION+2) << ", "
+ << GetFloatValue(GAMEOBJECT_ROTATION+3) << ", "
<< m_respawnDelayTime << ", "
- << (uint32)GetGoAnimProgress() << ", "
- << (uint32)GetGoState() << ")";
+ << GetGoAnimProgress() << ", "
+ << GetGoState() << ")";
WorldDatabase.BeginTransaction();
WorldDatabase.PExecuteLog("DELETE FROM gameobject WHERE guid = '%u'", m_DBTableGuid);
@@ -576,7 +563,7 @@ bool GameObject::LoadFromDB(uint32 guid, Map *map)
}
uint32 entry = data->id;
- //uint32 map_id = data->mapid; // already used before call
+ uint32 map_id = data->mapid;
float x = data->posX;
float y = data->posY;
float z = data->posZ;
@@ -589,11 +576,12 @@ bool GameObject::LoadFromDB(uint32 guid, Map *map)
uint32 animprogress = data->animprogress;
uint32 go_state = data->go_state;
+ uint32 ArtKit = data->ArtKit;
m_DBTableGuid = guid;
if (map->GetInstanceId() != 0) guid = objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT);
- if (!Create(guid,entry, map, x, y, z, ang, rotation0, rotation1, rotation2, rotation3, animprogress, go_state) )
+ if (!Create(guid,entry, map, x, y, z, ang, rotation0, rotation1, rotation2, rotation3, animprogress, go_state, ArtKit) )
return false;
switch(GetGOInfo()->type)
@@ -858,6 +846,14 @@ void GameObject::UseDoorOrButton(uint32 time_to_restore)
}
+void GameObject::SetGoArtKit(uint32 kit)
+{
+ SetUInt32Value(GAMEOBJECT_ARTKIT, kit);
+ GameObjectData *data = const_cast<GameObjectData*>(objmgr.GetGOData(m_DBTableGuid));
+ if(data)
+ data->ArtKit = kit;
+}
+
void GameObject::SwitchDoorOrButton(bool activate)
{
if(activate)
@@ -1213,7 +1209,7 @@ void GameObject::Use(Unit* user)
Player* player = (Player*)user;
- if( player->isAllowUseBattleGroundObject() )
+ if( player->isAllowUseBattleGroundObject() )
{
// in battleground check
BattleGround *bg = player->GetBattleGround();
@@ -1251,26 +1247,6 @@ void GameObject::Use(Unit* user)
}
break;
}
- case GAMEOBJECT_TYPE_BARBER_CHAIR: //32
- {
- GameObjectInfo const* info = GetGOInfo();
- if(!info)
- return;
-
- if(user->GetTypeId()!=TYPEID_PLAYER)
- return;
-
- Player* player = (Player*)user;
-
- // fallback, will always work
- player->TeleportTo(GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation(),TELE_TO_NOT_LEAVE_TRANSPORT | TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET);
-
- WorldPacket data(SMSG_ENABLE_BARBER_SHOP, 0);
- player->GetSession()->SendPacket(&data);
-
- player->SetStandState(PLAYER_STATE_SIT_LOW_CHAIR+info->barberChair.chairheight);
- return;
- }
default:
sLog.outDebug("Unknown Object Type %u", GetGoType());
break;
diff --git a/src/game/GameObject.h b/src/game/GameObject.h
index 9a570eb54da..afeaba98cc9 100644
--- a/src/game/GameObject.h
+++ b/src/game/GameObject.h
@@ -336,12 +336,12 @@ struct GameObjectInfo
uint32 mapID; //0
uint32 difficulty; //1
} dungeonDifficulty;
- //32 GAMEOBJECT_TYPE_BARBER_CHAIR
+ //32 GAMEOBJECT_TYPE_DO_NOT_USE_YET
struct
{
- uint32 chairheight; //0
- uint32 heightOffset; //1
- } barberChair;
+ uint32 mapID; //0
+ uint32 difficulty; //1
+ } doNotUseYet;
//33 GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING
struct
{
@@ -350,13 +350,6 @@ struct GameObjectInfo
uint32 state1Name; //2
uint32 state2Name; //3
} destructibleBuilding;
- //34 GAMEOBJECT_TYPE_TRAPDOOR
- struct
- {
- uint32 whenToPause; // 0
- uint32 startOpen; // 1
- uint32 autoClose; // 2
- } trapDoor;
// not use for specific field access (only for output with loop by all filed), also this determinate max union size
struct // GAMEOBJECT_TYPE_SPELLCASTER
@@ -511,14 +504,14 @@ class TRINITY_DLL_SPEC GameObject : public WorldObject
void SetSpellId(uint32 id) { m_spellId = id;}
uint32 GetSpellId() const { return m_spellId;}
void getFishLoot(Loot *loot);
- GameobjectTypes GetGoType() const { return GameobjectTypes(GetByteValue(GAMEOBJECT_BYTES_1, 1)); }
- void SetGoType(GameobjectTypes type) { SetByteValue(GAMEOBJECT_BYTES_1, 1, type); }
- uint8 GetGoState() const { return GetByteValue(GAMEOBJECT_BYTES_1, 0); }
- void SetGoState(uint8 state) { SetByteValue(GAMEOBJECT_BYTES_1, 0, state); }
- uint8 GetGoArtKit() const { return GetByteValue(GAMEOBJECT_BYTES_1, 2); }
- void SetGoArtKit(uint8 artkit) { SetByteValue(GAMEOBJECT_BYTES_1, 2, artkit); }
- uint8 GetGoAnimProgress() const { return GetByteValue(GAMEOBJECT_BYTES_1, 3); }
- void SetGoAnimProgress(uint8 animprogress) { SetByteValue(GAMEOBJECT_BYTES_1, 3, animprogress); }
+ GameobjectTypes GetGoType() const { return GameobjectTypes(GetUInt32Value(GAMEOBJECT_TYPE_ID)); }
+ void SetGoType(GameobjectTypes type) { SetUInt32Value(GAMEOBJECT_TYPE_ID, type); }
+ uint32 GetGoState() const { return GetUInt32Value(GAMEOBJECT_STATE); }
+ void SetGoState(uint32 state) { SetUInt32Value(GAMEOBJECT_STATE, state); }
+ uint32 GetGoArtKit() const { return GetUInt32Value(GAMEOBJECT_ARTKIT); }
+ void SetGoArtKit(uint32 artkit);
+ uint32 GetGoAnimProgress() const { return GetUInt32Value(GAMEOBJECT_ANIMPROGRESS); }
+ void SetGoAnimProgress(uint32 animprogress) { SetUInt32Value(GAMEOBJECT_ANIMPROGRESS, animprogress); }
void Use(Unit* user);
diff --git a/src/game/GossipDef.cpp b/src/game/GossipDef.cpp
index 90aa7304c90..85414fa3372 100644
--- a/src/game/GossipDef.cpp
+++ b/src/game/GossipDef.cpp
@@ -417,14 +417,10 @@ void PlayerMenu::SendQuestGiverQuestDetails( Quest const *pQuest, uint64 npcGUID
}
data << uint64(npcGUID);
- data << uint64(0); // wotlk, something todo with quest sharing?
data << uint32(pQuest->GetQuestId());
- data << Title;
- data << Details;
- data << Objectives;
+ data << Title << Details << Objectives;
data << uint32(ActivateAccept);
data << uint32(pQuest->GetSuggestedPlayers());
- data << uint8(0); // new wotlk
if (pQuest->HasFlag(QUEST_FLAGS_HIDDEN_REWARDS))
{
@@ -470,7 +466,6 @@ void PlayerMenu::SendQuestGiverQuestDetails( Quest const *pQuest, uint64 npcGUID
data << uint32(pQuest->GetRewSpell()); // reward spell, this spell will display (icon) (casted if RewSpellCast==0)
data << uint32(pQuest->GetRewSpellCast()); // casted spell
data << uint32(pQuest->GetCharTitleId()); // CharTitleId, new 2.4.0, player gets this title (id from CharTitles)
- data << uint32(pQuest->GetBonusTalents()); // bonus talents
data << uint32(QUEST_EMOTE_COUNT);
for (uint32 i=0; i < QUEST_EMOTE_COUNT; i++)
@@ -547,8 +542,6 @@ void PlayerMenu::SendQuestQueryResponse( Quest const *pQuest )
data << uint32(pQuest->GetSrcItemId());
data << uint32(pQuest->GetFlags() & 0xFFFF);
data << uint32(pQuest->GetCharTitleId()); // CharTitleId, new 2.4.0, player gets this title (id from CharTitles)
- data << uint32(pQuest->GetPlayersSlain()); // players slain
- data << uint32(pQuest->GetBonusTalents()); // bonus talents
int iI;
@@ -597,14 +590,13 @@ void PlayerMenu::SendQuestQueryResponse( Quest const *pQuest )
data << uint32(pQuest->ReqCreatureOrGOCount[iI]);
data << uint32(pQuest->ReqItemId[iI]);
data << uint32(pQuest->ReqItemCount[iI]);
- data << uint32(0); // added in WotLK, dunno if offset if correct
}
for (iI = 0; iI < QUEST_OBJECTIVES_COUNT; iI++)
data << ObjectiveText[iI];
pSession->SendPacket( &data );
- sLog.outDebug( "WORLD: Sent SMSG_QUEST_QUERY_RESPONSE questid=%u", pQuest->GetQuestId() );
+ sLog.outDebug( "WORLD: Sent SMSG_QUEST_QUERY_RESPONSE questid=%u",pQuest->GetQuestId() );
}
void PlayerMenu::SendQuestGiverOfferReward( Quest const* pQuest, uint64 npcGUID, bool EnbleNext )
@@ -686,10 +678,9 @@ void PlayerMenu::SendQuestGiverOfferReward( Quest const* pQuest, uint64 npcGUID,
data << uint32(0x08); // unused by client?
data << uint32(pQuest->GetRewSpell()); // reward spell, this spell will display (icon) (casted if RewSpellCast==0)
data << uint32(pQuest->GetRewSpellCast()); // casted spell
- data << uint32(0); // unknown
- data << uint32(pQuest->GetBonusTalents()); // bonus talents
+ data << uint32(0x00); // unk, NOT honor
pSession->SendPacket( &data );
- sLog.outDebug( "WORLD: Sent SMSG_QUESTGIVER_OFFER_REWARD NPCGuid=%u, questid=%u", GUID_LOPART(npcGUID), pQuest->GetQuestId() );
+ sLog.outDebug( "WORLD: Sent SMSG_QUESTGIVER_OFFER_REWARD NPCGuid=%u, questid=%u",GUID_LOPART(npcGUID),pQuest->GetQuestId() );
}
void PlayerMenu::SendQuestGiverRequestItems( Quest const *pQuest, uint64 npcGUID, bool Completable, bool CloseOnCancel )
diff --git a/src/game/GridNotifiers.cpp b/src/game/GridNotifiers.cpp
index b69e185c171..0c952f69649 100644
--- a/src/game/GridNotifiers.cpp
+++ b/src/game/GridNotifiers.cpp
@@ -140,7 +140,7 @@ VisibleNotifier::Notify()
// send data at target visibility change (adding to client)
for(std::set<WorldObject*>::const_iterator vItr = i_visibleNow.begin(); vItr != i_visibleNow.end(); ++vItr)
if((*vItr)!=&i_player && (*vItr)->isType(TYPEMASK_UNIT))
- i_player.SendAurasForTarget((Unit*)(*vItr));
+ i_player.SendAuraDurationsForTarget((Unit*)(*vItr));
}
void
diff --git a/src/game/Group.h b/src/game/Group.h
index 5edc99f8c0c..8417a145268 100644
--- a/src/game/Group.h
+++ b/src/game/Group.h
@@ -66,25 +66,24 @@ enum GroupUpdateFlags
{
GROUP_UPDATE_FLAG_NONE = 0x00000000, // nothing
GROUP_UPDATE_FLAG_STATUS = 0x00000001, // uint16, flags
- GROUP_UPDATE_FLAG_CUR_HP = 0x00000002, // uint32
- GROUP_UPDATE_FLAG_MAX_HP = 0x00000004, // uint32
+ GROUP_UPDATE_FLAG_CUR_HP = 0x00000002, // uint16
+ GROUP_UPDATE_FLAG_MAX_HP = 0x00000004, // uint16
GROUP_UPDATE_FLAG_POWER_TYPE = 0x00000008, // uint8
GROUP_UPDATE_FLAG_CUR_POWER = 0x00000010, // uint16
GROUP_UPDATE_FLAG_MAX_POWER = 0x00000020, // uint16
GROUP_UPDATE_FLAG_LEVEL = 0x00000040, // uint16
GROUP_UPDATE_FLAG_ZONE = 0x00000080, // uint16
GROUP_UPDATE_FLAG_POSITION = 0x00000100, // uint16, uint16
- GROUP_UPDATE_FLAG_AURAS = 0x00000200, // uint64 mask, for each bit set uint32 spellid + uint8 unk
+ GROUP_UPDATE_FLAG_AURAS = 0x00000200, // uint64 mask, for each bit set uint16 spellid + uint8 unk
GROUP_UPDATE_FLAG_PET_GUID = 0x00000400, // uint64 pet guid
GROUP_UPDATE_FLAG_PET_NAME = 0x00000800, // pet name, NULL terminated string
GROUP_UPDATE_FLAG_PET_MODEL_ID = 0x00001000, // uint16, model id
- GROUP_UPDATE_FLAG_PET_CUR_HP = 0x00002000, // uint32 pet cur health
- GROUP_UPDATE_FLAG_PET_MAX_HP = 0x00004000, // uint32 pet max health
+ GROUP_UPDATE_FLAG_PET_CUR_HP = 0x00002000, // uint16 pet cur health
+ GROUP_UPDATE_FLAG_PET_MAX_HP = 0x00004000, // uint16 pet max health
GROUP_UPDATE_FLAG_PET_POWER_TYPE = 0x00008000, // uint8 pet power type
GROUP_UPDATE_FLAG_PET_CUR_POWER = 0x00010000, // uint16 pet cur power
GROUP_UPDATE_FLAG_PET_MAX_POWER = 0x00020000, // uint16 pet max power
- GROUP_UPDATE_FLAG_PET_AURAS = 0x00040000, // uint64 mask, for each bit set uint32 spellid + uint8 unk, pet auras...
- GROUP_UPDATE_FLAG_VEHICLE_SEAT = 0x00080000, // uint32 vehicle_seat_id (index from VehicleSeat.dbc)
+ GROUP_UPDATE_FLAG_PET_AURAS = 0x00040000, // uint64 mask, for each bit set uint16 spellid + uint8 unk, pet auras...
GROUP_UPDATE_PET = 0x0007FC00, // all pet flags
GROUP_UPDATE_FULL = 0x0007FFFF, // all known flags
};
diff --git a/src/game/GroupHandler.cpp b/src/game/GroupHandler.cpp
index 7a4f0a2720c..3890a9f77a6 100644
--- a/src/game/GroupHandler.cpp
+++ b/src/game/GroupHandler.cpp
@@ -688,10 +688,10 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player *player, WorldPacke
}
if (mask & GROUP_UPDATE_FLAG_CUR_HP)
- *data << (uint32) player->GetHealth();
+ *data << (uint16) player->GetHealth();
if (mask & GROUP_UPDATE_FLAG_MAX_HP)
- *data << (uint32) player->GetMaxHealth();
+ *data << (uint16) player->GetMaxHealth();
Powers powerType = player->getPowerType();
if (mask & GROUP_UPDATE_FLAG_POWER_TYPE)
@@ -720,7 +720,7 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player *player, WorldPacke
{
if(auramask & (uint64(1) << i))
{
- *data << uint32(player->GetVisibleAura(i));
+ *data << uint16(player->GetUInt32Value(UNIT_FIELD_AURA + i));
*data << uint8(1);
}
}
@@ -754,17 +754,17 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player *player, WorldPacke
if (mask & GROUP_UPDATE_FLAG_PET_CUR_HP)
{
if(pet)
- *data << (uint32) pet->GetHealth();
+ *data << (uint16) pet->GetHealth();
else
- *data << (uint32) 0;
+ *data << (uint16) 0;
}
if (mask & GROUP_UPDATE_FLAG_PET_MAX_HP)
{
if(pet)
- *data << (uint32) pet->GetMaxHealth();
+ *data << (uint16) pet->GetMaxHealth();
else
- *data << (uint32) 0;
+ *data << (uint16) 0;
}
if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE)
@@ -801,7 +801,7 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player *player, WorldPacke
{
if(auramask & (uint64(1) << i))
{
- *data << uint32(pet->GetVisibleAura(i));
+ *data << uint16(pet->GetUInt32Value(UNIT_FIELD_AURA + i));
*data << uint8(1);
}
}
@@ -824,7 +824,6 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode( WorldPacket &recv_data )
if(!player)
{
WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 3+4+2);
- data << uint8(0); // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related
data.appendPackGUID(Guid);
data << (uint32) GROUP_UPDATE_FLAG_STATUS;
data << (uint16) MEMBER_STATUS_OFFLINE;
@@ -835,7 +834,6 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode( WorldPacket &recv_data )
Pet *pet = player->GetPet();
WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 4+2+2+2+1+2*6+8+1+8);
- data << uint8(0); // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related
data.append(player->GetPackGUID());
uint32 mask1 = 0x00040BFF; // common mask, real flags used 0x000040BFF
@@ -845,8 +843,8 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode( WorldPacket &recv_data )
Powers powerType = player->getPowerType();
data << (uint32) mask1; // group update mask
data << (uint16) MEMBER_STATUS_ONLINE; // member's online status
- data << (uint32) player->GetHealth(); // GROUP_UPDATE_FLAG_CUR_HP
- data << (uint32) player->GetMaxHealth(); // GROUP_UPDATE_FLAG_MAX_HP
+ data << (uint16) player->GetHealth(); // GROUP_UPDATE_FLAG_CUR_HP
+ data << (uint16) player->GetMaxHealth(); // GROUP_UPDATE_FLAG_MAX_HP
data << (uint8) powerType; // GROUP_UPDATE_FLAG_POWER_TYPE
data << (uint16) player->GetPower(powerType); // GROUP_UPDATE_FLAG_CUR_POWER
data << (uint16) player->GetMaxPower(powerType); // GROUP_UPDATE_FLAG_MAX_POWER
@@ -860,11 +858,11 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode( WorldPacket &recv_data )
data << (uint64) auramask; // placeholder
for(uint8 i = 0; i < MAX_AURAS; ++i)
{
- if(uint32 aura = player->GetVisibleAura(i))
+ if(uint32 aura = player->GetUInt32Value(UNIT_FIELD_AURA + i))
{
auramask |= (uint64(1) << i);
- data << (uint32) aura;
- data << (uint8) 1;
+ data << uint16(aura);
+ data << uint8(1);
}
}
data.put<uint64>(maskPos,auramask); // GROUP_UPDATE_FLAG_AURAS
@@ -875,8 +873,8 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode( WorldPacket &recv_data )
data << (uint64) pet->GetGUID(); // GROUP_UPDATE_FLAG_PET_GUID
data << pet->GetName(); // GROUP_UPDATE_FLAG_PET_NAME
data << (uint16) pet->GetDisplayId(); // GROUP_UPDATE_FLAG_PET_MODEL_ID
- data << (uint32) pet->GetHealth(); // GROUP_UPDATE_FLAG_PET_CUR_HP
- data << (uint32) pet->GetMaxHealth(); // GROUP_UPDATE_FLAG_PET_MAX_HP
+ data << (uint16) pet->GetHealth(); // GROUP_UPDATE_FLAG_PET_CUR_HP
+ data << (uint16) pet->GetMaxHealth(); // GROUP_UPDATE_FLAG_PET_MAX_HP
data << (uint8) petpowertype; // GROUP_UPDATE_FLAG_PET_POWER_TYPE
data << (uint16) pet->GetPower(petpowertype); // GROUP_UPDATE_FLAG_PET_CUR_POWER
data << (uint16) pet->GetMaxPower(petpowertype); // GROUP_UPDATE_FLAG_PET_MAX_POWER
@@ -886,10 +884,10 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode( WorldPacket &recv_data )
data << (uint64) petauramask; // placeholder
for(uint8 i = 0; i < MAX_AURAS; ++i)
{
- if(uint32 petaura = pet->GetVisibleAura(i))
+ if(uint32 petaura = pet->GetUInt32Value(UNIT_FIELD_AURA + i))
{
petauramask |= (uint64(1) << i);
- data << (uint32) petaura;
+ data << (uint16) petaura;
data << (uint8) 1;
}
}
diff --git a/src/game/Guild.cpp b/src/game/Guild.cpp
index 55ad071a74b..897110afe55 100644
--- a/src/game/Guild.cpp
+++ b/src/game/Guild.cpp
@@ -785,7 +785,6 @@ void Guild::Query(WorldSession *session)
data << uint32(BorderStyle);
data << uint32(BorderColor);
data << uint32(BackgroundColor);
- data << uint32(0); // something new in WotLK
session->SendPacket( &data );
sLog.outDebug( "WORLD: Sent (SMSG_GUILD_QUERY_RESPONSE)" );
@@ -1603,21 +1602,7 @@ void Guild::DisplayGuildBankLogs(WorldSession *session, uint8 TabId)
{
data << uint8((*itr)->LogEntry);
data << uint64(MAKE_NEW_GUID((*itr)->PlayerGuid,0,HIGHGUID_PLAYER));
- if ((*itr)->LogEntry == GUILD_BANK_LOG_DEPOSIT_MONEY ||
- (*itr)->LogEntry == GUILD_BANK_LOG_WITHDRAW_MONEY ||
- (*itr)->LogEntry == GUILD_BANK_LOG_REPAIR_MONEY ||
- (*itr)->LogEntry == GUILD_BANK_LOG_UNK1 ||
- (*itr)->LogEntry == GUILD_BANK_LOG_UNK2)
- {
- data << uint32((*itr)->ItemOrMoney);
- }
- else
- {
- data << uint32((*itr)->ItemOrMoney);
- data << uint32((*itr)->ItemStackCount);
- if ((*itr)->LogEntry == GUILD_BANK_LOG_MOVE_ITEM || (*itr)->LogEntry == GUILD_BANK_LOG_MOVE_ITEM2)
- data << uint8((*itr)->DestTabId); // moved tab
- }
+ data << uint32((*itr)->ItemOrMoney);
data << uint32(time(NULL)-(*itr)->TimeStamp);
}
session->SendPacket(&data);
@@ -1633,21 +1618,10 @@ void Guild::DisplayGuildBankLogs(WorldSession *session, uint8 TabId)
{
data << uint8((*itr)->LogEntry);
data << uint64(MAKE_NEW_GUID((*itr)->PlayerGuid,0,HIGHGUID_PLAYER));
- if ((*itr)->LogEntry == GUILD_BANK_LOG_DEPOSIT_MONEY ||
- (*itr)->LogEntry == GUILD_BANK_LOG_WITHDRAW_MONEY ||
- (*itr)->LogEntry == GUILD_BANK_LOG_REPAIR_MONEY ||
- (*itr)->LogEntry == GUILD_BANK_LOG_UNK1 ||
- (*itr)->LogEntry == GUILD_BANK_LOG_UNK2)
- {
- data << uint32((*itr)->ItemOrMoney);
- }
- else
- {
- data << uint32((*itr)->ItemOrMoney);
- data << uint32((*itr)->ItemStackCount);
- if ((*itr)->LogEntry == GUILD_BANK_LOG_MOVE_ITEM || (*itr)->LogEntry == GUILD_BANK_LOG_MOVE_ITEM2)
- data << uint8((*itr)->DestTabId); // moved tab
- }
+ data << uint32((*itr)->ItemOrMoney);
+ data << uint8((*itr)->ItemStackCount);
+ if ((*itr)->LogEntry == GUILD_BANK_LOG_MOVE_ITEM || (*itr)->LogEntry == GUILD_BANK_LOG_MOVE_ITEM2)
+ data << uint8((*itr)->DestTabId); // moved tab
data << uint32(time(NULL)-(*itr)->TimeStamp);
}
session->SendPacket(&data);
@@ -1729,7 +1703,7 @@ void Guild::AppendDisplayGuildBankSlot( WorldPacket& data, GuildBankTab const *t
// SuffixFactor +4
data << (uint32) pItem->GetItemSuffixFactor();
// +12 // ITEM_FIELD_STACK_COUNT
- data << uint32(pItem->GetCount());
+ data << uint8(pItem->GetCount());
data << uint32(0); // +16 // Unknown value
data << uint8(0); // unknown 2.4.2
if (uint32 Enchant0 = pItem->GetEnchantmentId(PERM_ENCHANTMENT_SLOT))
diff --git a/src/game/Guild.h b/src/game/Guild.h
index f51ba5a6d27..683ff980e3a 100644
--- a/src/game/Guild.h
+++ b/src/game/Guild.h
@@ -56,8 +56,7 @@ enum GuildRankRights
GR_RIGHT_REPAIR_FROM_GUILD = 0x00020000, // unused in 2.4.x?, Remove money withdraw capacity
GR_RIGHT_WITHDRAW_REPAIR = 0x00040000, // withdraw for repair
GR_RIGHT_WITHDRAW_GOLD = 0x00080000, // withdraw gold
- GR_RIGHT_CREATE_GUILD_EVENT = 0x00100000, // wotlk
- GR_RIGHT_ALL = 0x001FF1FF
+ GR_RIGHT_ALL = 0x000FF1FF
};
enum Typecommand
@@ -157,8 +156,6 @@ enum GuildBankLogEntries
GUILD_BANK_LOG_WITHDRAW_MONEY = 5,
GUILD_BANK_LOG_REPAIR_MONEY = 6,
GUILD_BANK_LOG_MOVE_ITEM2 = 7,
- GUILD_BANK_LOG_UNK1 = 8,
- GUILD_BANK_LOG_UNK2 = 9,
};
enum GuildEventLogEntryTypes
diff --git a/src/game/Item.cpp b/src/game/Item.cpp
index 8b4b124669e..0c264a76d8b 100644
--- a/src/game/Item.cpp
+++ b/src/game/Item.cpp
@@ -206,10 +206,6 @@ bool ItemCanGoIntoBag(ItemPrototype const *pProto, ItemPrototype const *pBagProt
if(!(pProto->BagFamily & BAG_FAMILY_MASK_LEATHERWORKING_SUPP))
return false;
return true;
- case ITEM_SUBCLASS_INSCRIPTION_CONTAINER:
- if(!(pProto->BagFamily & BAG_FAMILY_MASK_INSCRIPTION_SUPP))
- return false;
- return true;
default:
return false;
}
@@ -454,7 +450,7 @@ uint32 Item::GetSkill()
const static uint32 item_armor_skills[MAX_ITEM_SUBCLASS_ARMOR] =
{
- 0,SKILL_CLOTH,SKILL_LEATHER,SKILL_MAIL,SKILL_PLATE_MAIL,0,SKILL_SHIELD,0,0,0,0
+ 0,SKILL_CLOTH,SKILL_LEATHER,SKILL_MAIL,SKILL_PLATE_MAIL,0,SKILL_SHIELD,0,0,0
};
ItemPrototype const* proto = GetProto();
@@ -769,9 +765,9 @@ void Item::SetEnchantment(EnchantmentSlot slot, uint32 id, uint32 duration, uint
if((GetEnchantmentId(slot) == id) && (GetEnchantmentDuration(slot) == duration) && (GetEnchantmentCharges(slot) == charges))
return;
- SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET,id);
- SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET,duration);
- SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET,charges);
+ SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET,id);
+ SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET,duration);
+ SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET,charges);
SetState(ITEM_CHANGED);
}
@@ -780,7 +776,7 @@ void Item::SetEnchantmentDuration(EnchantmentSlot slot, uint32 duration)
if(GetEnchantmentDuration(slot) == duration)
return;
- SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET,duration);
+ SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET,duration);
SetState(ITEM_CHANGED);
}
@@ -789,7 +785,7 @@ void Item::SetEnchantmentCharges(EnchantmentSlot slot, uint32 charges)
if(GetEnchantmentCharges(slot) == charges)
return;
- SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET,charges);
+ SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET,charges);
SetState(ITEM_CHANGED);
}
@@ -799,7 +795,7 @@ void Item::ClearEnchantment(EnchantmentSlot slot)
return;
for(uint8 x = 0; x < 3; ++x)
- SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + x, 0);
+ SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + x, 0);
SetState(ITEM_CHANGED);
}
diff --git a/src/game/Item.h b/src/game/Item.h
index 4be1d42a32a..72c09b0c1da 100644
--- a/src/game/Item.h
+++ b/src/game/Item.h
@@ -148,30 +148,29 @@ enum SellFailure
// -1 from client enchantment slot number
enum EnchantmentSlot
{
- PERM_ENCHANTMENT_SLOT = 0,
- TEMP_ENCHANTMENT_SLOT = 1,
- SOCK_ENCHANTMENT_SLOT = 2,
- SOCK_ENCHANTMENT_SLOT_2 = 3,
- SOCK_ENCHANTMENT_SLOT_3 = 4,
- BONUS_ENCHANTMENT_SLOT = 5,
- WOTLK_ENCHANTMENT_SLOT = 6,
- MAX_INSPECTED_ENCHANTMENT_SLOT = 7,
-
- PROP_ENCHANTMENT_SLOT_0 = 7, // used with RandomSuffix
- PROP_ENCHANTMENT_SLOT_1 = 8, // used with RandomSuffix
- PROP_ENCHANTMENT_SLOT_2 = 9, // used with RandomSuffix and RandomProperty
- PROP_ENCHANTMENT_SLOT_3 = 10, // used with RandomProperty
- PROP_ENCHANTMENT_SLOT_4 = 11, // used with RandomProperty
- MAX_ENCHANTMENT_SLOT = 12
+ PERM_ENCHANTMENT_SLOT = 0,
+ TEMP_ENCHANTMENT_SLOT = 1,
+ SOCK_ENCHANTMENT_SLOT = 2,
+ SOCK_ENCHANTMENT_SLOT_2 = 3,
+ SOCK_ENCHANTMENT_SLOT_3 = 4,
+ BONUS_ENCHANTMENT_SLOT = 5,
+ MAX_INSPECTED_ENCHANTMENT_SLOT = 6,
+
+ PROP_ENCHANTMENT_SLOT_0 = 6, // used with RandomSuffix
+ PROP_ENCHANTMENT_SLOT_1 = 7, // used with RandomSuffix
+ PROP_ENCHANTMENT_SLOT_2 = 8, // used with RandomSuffix and RandomProperty
+ PROP_ENCHANTMENT_SLOT_3 = 9, // used with RandomProperty
+ PROP_ENCHANTMENT_SLOT_4 = 10, // used with RandomProperty
+ MAX_ENCHANTMENT_SLOT = 11
};
-#define MAX_VISIBLE_ITEM_OFFSET 18 // 18 fields per visible item (creator(2) + enchantments(13) + properties(1) + seed(1) + pad(1))
+#define MAX_VISIBLE_ITEM_OFFSET 16 // 16 fields per visible item (creator(2) + enchantments(12) + properties(1) + pad(1))
enum EnchantmentOffset
{
ENCHANTMENT_ID_OFFSET = 0,
ENCHANTMENT_DURATION_OFFSET = 1,
- ENCHANTMENT_CHARGES_OFFSET = 2 // now here not only charges, but something new in wotlk
+ ENCHANTMENT_CHARGES_OFFSET = 2
};
#define MAX_ENCHANTMENT_OFFSET 3
@@ -212,7 +211,6 @@ class TRINITY_DLL_SPEC Item : public Object
void SetBinding(bool val) { ApplyModFlag(ITEM_FIELD_FLAGS,ITEM_FLAGS_BINDED,val); }
bool IsSoulBound() const { return HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAGS_BINDED); }
- bool IsAccountBound() const { return HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAGS_BOA); }
bool IsBindedNotWith(uint64 guid) const { return IsSoulBound() && GetOwnerGUID()!= guid; }
bool IsBoundByEnchant() const;
virtual void SaveToDB();
@@ -258,9 +256,9 @@ class TRINITY_DLL_SPEC Item : public Object
void SetEnchantmentDuration(EnchantmentSlot slot, uint32 duration);
void SetEnchantmentCharges(EnchantmentSlot slot, uint32 charges);
void ClearEnchantment(EnchantmentSlot slot);
- uint32 GetEnchantmentId(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET);}
- uint32 GetEnchantmentDuration(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET);}
- uint32 GetEnchantmentCharges(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET);}
+ uint32 GetEnchantmentId(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET);}
+ uint32 GetEnchantmentDuration(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET);}
+ uint32 GetEnchantmentCharges(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET);}
void SendTimeUpdate(Player* owner);
void UpdateDuration(Player* owner, uint32 diff);
diff --git a/src/game/ItemHandler.cpp b/src/game/ItemHandler.cpp
index 3437495bc48..085c9553a30 100644
--- a/src/game/ItemHandler.cpp
+++ b/src/game/ItemHandler.cpp
@@ -324,7 +324,7 @@ void WorldSession::HandleItemQuerySingleOpcode( WorldPacket & recv_data )
data << pProto->ItemId;
data << pProto->Class;
data << pProto->SubClass;
- data << pProto->Unk0; // new 2.0.3, not exist in wdb cache?
+ data << uint32(-1); // new 2.0.3, not exist in wdb cache?
data << Name;
data << uint8(0x00); //pProto->Name2; // blizz not send name there, just uint8(0x00); <-- \0 = empty string = empty name...
data << uint8(0x00); //pProto->Name3; // blizz not send name there, just uint8(0x00);
@@ -349,14 +349,11 @@ void WorldSession::HandleItemQuerySingleOpcode( WorldPacket & recv_data )
data << pProto->MaxCount;
data << pProto->Stackable;
data << pProto->ContainerSlots;
- data << pProto->StatsCount; // item stats count
- for(int i = 0; i < pProto->StatsCount; i++)
+ for(int i = 0; i < 10; i++)
{
data << pProto->ItemStat[i].ItemStatType;
data << pProto->ItemStat[i].ItemStatValue;
}
- data << pProto->ScalingStatDistribution; // scaling stats distribution
- data << pProto->ScalingStatValue; // some kind of flags used to determine stat values column
for(int i = 0; i < 5; i++)
{
data << pProto->Damage[i].DamageMin;
@@ -440,8 +437,7 @@ void WorldSession::HandleItemQuerySingleOpcode( WorldPacket & recv_data )
data << pProto->GemProperties;
data << pProto->RequiredDisenchantSkill;
data << pProto->ArmorDamageModifier;
- data << pProto->Duration; // added in 2.4.2.8209, duration (seconds)
- data << pProto->ItemLimitCategory; // WotLK, ItemLimitCategory
+ data << uint32(0); // added in 2.4.2.8209, duration (seconds)
SendPacket( &data );
}
else
@@ -849,7 +845,6 @@ void WorldSession::HandleBuyBankSlotOpcode(WorldPacket& /*recvPacket*/)
if (_player->GetMoney() < price)
return;
- _player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT, slot);
_player->SetByteValue(PLAYER_BYTES_2, 2, slot);
_player->ModifyMoney(-int32(price));
}
diff --git a/src/game/ItemPrototype.h b/src/game/ItemPrototype.h
index 60c92ad2d70..1ca412d246a 100644
--- a/src/game/ItemPrototype.h
+++ b/src/game/ItemPrototype.h
@@ -57,18 +57,10 @@ enum ItemModType
ITEM_MOD_CRIT_TAKEN_RATING = 34,
ITEM_MOD_RESILIENCE_RATING = 35,
ITEM_MOD_HASTE_RATING = 36,
- ITEM_MOD_EXPERTISE_RATING = 37,
- ITEM_MOD_ATTACK_POWER = 38,
- ITEM_MOD_RANGED_ATTACK_POWER = 39,
- ITEM_MOD_FERAL_ATTACK_POWER = 40,
- ITEM_MOD_SPELL_HEALING_DONE = 41,
- ITEM_MOD_SPELL_DAMAGE_DONE = 42,
- ITEM_MOD_MANA_REGENERATION = 43,
- ITEM_MOD_ARMOR_PENETRATION_RATING = 44,
- ITEM_MOD_SPELL_POWER = 45
+ ITEM_MOD_EXPERTISE_RATING = 37
};
-#define MAX_ITEM_MOD 46
+#define MAX_ITEM_MOD 38
enum ItemSpelltriggerType
{
@@ -193,11 +185,10 @@ enum ItemClass
ITEM_CLASS_QUEST = 12,
ITEM_CLASS_KEY = 13,
ITEM_CLASS_PERMANENT = 14,
- ITEM_CLASS_MISC = 15,
- ITEM_CLASS_GLYPH = 16
+ ITEM_CLASS_JUNK = 15
};
-#define MAX_ITEM_CLASS 17
+#define MAX_ITEM_CLASS 16
enum ItemSubclassConsumable
{
@@ -223,11 +214,10 @@ enum ItemSubclassContainer
ITEM_SUBCLASS_ENGINEERING_CONTAINER = 4,
ITEM_SUBCLASS_GEM_CONTAINER = 5,
ITEM_SUBCLASS_MINING_CONTAINER = 6,
- ITEM_SUBCLASS_LEATHERWORKING_CONTAINER = 7,
- ITEM_SUBCLASS_INSCRIPTION_CONTAINER = 8
+ ITEM_SUBCLASS_LEATHERWORKING_CONTAINER = 7
};
-#define MAX_ITEM_SUBCLASS_CONTAINER 9
+#define MAX_ITEM_SUBCLASS_CONTAINER 8
enum ItemSubclassWeapon
{
@@ -282,11 +272,10 @@ enum ItemSubclassArmor
ITEM_SUBCLASS_ARMOR_SHIELD = 6,
ITEM_SUBCLASS_ARMOR_LIBRAM = 7,
ITEM_SUBCLASS_ARMOR_IDOL = 8,
- ITEM_SUBCLASS_ARMOR_TOTEM = 9,
- ITEM_SUBCLASS_ARMOR_SIGIL = 10
+ ITEM_SUBCLASS_ARMOR_TOTEM = 9
};
-#define MAX_ITEM_SUBCLASS_ARMOR 11
+#define MAX_ITEM_SUBCLASS_ARMOR 10
enum ItemSubclassReagent
{
@@ -321,12 +310,10 @@ enum ItemSubclassTradeGoods
ITEM_SUBCLASS_ELEMENTAL = 10,
ITEM_SUBCLASS_TRADE_GOODS_OTHER = 11,
ITEM_SUBCLASS_ENCHANTING = 12,
- ITEM_SUBCLASS_MATERIAL = 13,
- ITEM_SUBCLASS_ARMOR_ENCHANTMENT = 14,
- ITEM_SUBCLASS_WEAPON_ENCHANTMENT = 15
+ ITEM_SUBCLASS_MATERIAL = 13 // Added in 2.4.2
};
-#define MAX_ITEM_SUBCLASS_TRADE_GOODS 16
+#define MAX_ITEM_SUBCLASS_TRADE_GOODS 14
enum ItemSubclassGeneric
{
@@ -436,8 +423,7 @@ const uint32 MaxItemSubclassValues[MAX_ITEM_CLASS] =
MAX_ITEM_SUBCLASS_QUEST,
MAX_ITEM_SUBCLASS_KEY,
MAX_ITEM_SUBCLASS_PERMANENT,
- MAX_ITEM_SUBCLASS_JUNK,
- MAX_ITEM_SUBCLASS_GLYPH
+ MAX_ITEM_SUBCLASS_JUNK
};
inline uint8 ItemSubClassToDurabilityMultiplierId(uint32 ItemClass, uint32 ItemSubClass)
@@ -514,10 +500,7 @@ struct ItemPrototype
uint32 MaxCount;
uint32 Stackable;
uint32 ContainerSlots;
- uint32 StatsCount;
_ItemStat ItemStat[10];
- uint32 ScalingStatDistribution; // id from ScalingStatDistribution.dbc
- uint32 ScalingStatValue; // mask for selecting column in ScalingStatValues.dbc
_Damage Damage[5];
uint32 Armor;
uint32 HolyRes;
@@ -553,13 +536,12 @@ struct ItemPrototype
uint32 GemProperties; // id from GemProperties.dbc
uint32 RequiredDisenchantSkill;
float ArmorDamageModifier;
- int32 Duration; // negative = realtime, positive = ingame time
- uint32 ItemLimitCategory; // id from ItemLimitCategory.dbc
uint32 ScriptId;
uint32 DisenchantID;
uint32 FoodType;
uint32 MinMoneyLoot;
uint32 MaxMoneyLoot;
+ int32 Duration; // negative = realtime, positive = ingame time
// helpers
bool CanChangeEquipStateInCombat() const
@@ -581,46 +563,6 @@ struct ItemPrototype
return false;
}
-
- uint32 GetScalingStatValuesColumn() const
- {
- if(ScalingStatValue & 0x00000001) // stat mod
- return 0;
- if(ScalingStatValue & 0x00000002) // stat mod
- return 1;
- if(ScalingStatValue & 0x00000004) // stat mod
- return 2;
- if(ScalingStatValue & 0x00000008) // stat mod
- return 3;
- if(ScalingStatValue & 0x00000010) // stat mod
- return 4;
- if(ScalingStatValue & 0x00000020) // armor mod
- return 5;
- if(ScalingStatValue & 0x00000040) // armor mod
- return 6;
- if(ScalingStatValue & 0x00000080) // armor mod
- return 7;
- if(ScalingStatValue & 0x00000100) // armor mod
- return 8;
- if(ScalingStatValue & 0x00000200) // damage mod
- return 9;
- if(ScalingStatValue & 0x00000400) // damage mod
- return 10;
- if(ScalingStatValue & 0x00000800) // damage mod
- return 11;
- if(ScalingStatValue & 0x00001000) // damage mod
- return 12;
- if(ScalingStatValue & 0x00002000) // damage mod
- return 13;
- if(ScalingStatValue & 0x00004000) // damage mod
- return 14;
- if(ScalingStatValue & 0x00008000) // spell power
- return 15;
- if(ScalingStatValue & 0x00020000) // feral AP
- return 16;
-
- return 0;
- }
};
struct ItemLocale
diff --git a/src/game/Language.h b/src/game/Language.h
index 68106edf8db..be6401596ea 100644
--- a/src/game/Language.h
+++ b/src/game/Language.h
@@ -328,8 +328,6 @@ enum TrinityStrings
LANG_CREATURE_NOT_FOLLOW_YOU_NOW = 342,
LANG_CREATURE_NON_TAMEABLE = 343,
LANG_YOU_ALREADY_HAVE_PET = 344,
- LANG_CUSTOMIZE_PLAYER = 345,
- LANG_CUSTOMIZE_PLAYER_GUID = 346,
// Room for more level 2 345-399 not used
// level 3 chat
diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp
index db5a0b5c660..2b75b9324c1 100644
--- a/src/game/Level2.cpp
+++ b/src/game/Level2.cpp
@@ -950,7 +950,7 @@ bool ChatHandler::HandleNpcDeleteCommand(const char* args)
else
unit = getSelectedCreature();
- if(!unit || unit->isPet() || unit->isTotem() || unit->isVehicle())
+ if(!unit || unit->isPet() || unit->isTotem())
{
SendSysMessage(LANG_SELECT_CREATURE);
SetSentErrorMessage(true);
@@ -1063,8 +1063,8 @@ bool ChatHandler::HandleTurnObjectCommand(const char* args)
obj->Relocate(obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), o);
obj->SetFloatValue(GAMEOBJECT_FACING, o);
- obj->SetFloatValue(GAMEOBJECT_PARENTROTATION+2, rot2);
- obj->SetFloatValue(GAMEOBJECT_PARENTROTATION+3, rot3);
+ obj->SetFloatValue(GAMEOBJECT_ROTATION+2, rot2);
+ obj->SetFloatValue(GAMEOBJECT_ROTATION+3, rot3);
map->Add(obj);
@@ -3213,59 +3213,6 @@ bool ChatHandler::HandleRenameCommand(const char* args)
return true;
}
-// customize characters
-bool ChatHandler::HandleCustomizeCommand(const char* args)
-{
- Player* target = NULL;
- uint64 targetGUID = 0;
- std::string oldname;
-
- char* px = strtok((char*)args, " ");
-
- if(px)
- {
- oldname = px;
-
- if(!normalizePlayerName(oldname))
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
- target = objmgr.GetPlayer(oldname.c_str());
-
- if (!target)
- targetGUID = objmgr.GetPlayerGUIDByName(oldname);
- }
-
- if(!target && !targetGUID)
- {
- target = getSelectedPlayer();
- }
-
- if(!target && !targetGUID)
- {
- SendSysMessage(LANG_PLAYER_NOT_FOUND);
- SetSentErrorMessage(true);
- return false;
- }
-
- if(target)
- {
- PSendSysMessage(LANG_CUSTOMIZE_PLAYER, target->GetName());
- target->SetAtLoginFlag(AT_LOGIN_CUSTOMIZE);
- CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '8' WHERE guid = '%u'", target->GetGUIDLow());
- }
- else
- {
- PSendSysMessage(LANG_CUSTOMIZE_PLAYER_GUID, oldname.c_str(), GUID_LOPART(targetGUID));
- CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '8' WHERE guid = '%u'", GUID_LOPART(targetGUID));
- }
-
- return true;
-}
-
//spawn go
bool ChatHandler::HandleGameObjectCommand(const char* args)
{
@@ -3893,36 +3840,6 @@ bool ChatHandler::HandleRepairitemsCommand(const char* /*args*/)
return true;
}
-bool ChatHandler::HandleWaterwalkCommand(const char* args)
-{
- if(!*args)
- return false;
-
- Player *player = getSelectedPlayer();
-
- if(!player)
- {
- PSendSysMessage(LANG_NO_CHAR_SELECTED);
- SetSentErrorMessage(true);
- return false;
- }
-
- if (strncmp(args, "on", 3) == 0)
- player->SetMovement(MOVE_WATER_WALK); // ON
- else if (strncmp(args, "off", 4) == 0)
- player->SetMovement(MOVE_LAND_WALK); // OFF
- else
- {
- SendSysMessage(LANG_USE_BOL);
- return false;
- }
-
- PSendSysMessage(LANG_YOU_SET_WATERWALK, args, player->GetName());
- if(needReportToTarget(player))
- ChatHandler(player).PSendSysMessage(LANG_YOUR_WATERWALK_SET, args, GetName());
- return true;
-}
-
bool ChatHandler::HandleNpcFollowCommand(const char* /*args*/)
{
Player *player = m_session->GetPlayer();
@@ -3979,72 +3896,6 @@ bool ChatHandler::HandleNpcUnFollowCommand(const char* /*args*/)
return true;
}
-bool ChatHandler::HandleNpcTameCommand(const char* /*args*/)
-{
- Creature *creatureTarget = getSelectedCreature ();
- if (!creatureTarget || creatureTarget->isPet ())
- {
- PSendSysMessage (LANG_SELECT_CREATURE);
- SetSentErrorMessage (true);
- return false;
- }
-
- Player *player = m_session->GetPlayer ();
-
- if(player->GetPetGUID ())
- {
- SendSysMessage (LANG_YOU_ALREADY_HAVE_PET);
- SetSentErrorMessage (true);
- return false;
- }
-
- CreatureInfo const* cInfo = creatureTarget->GetCreatureInfo();
-
- if (!cInfo->isTameable ())
- {
- PSendSysMessage (LANG_CREATURE_NON_TAMEABLE,cInfo->Entry);
- SetSentErrorMessage (true);
- return false;
- }
-
- // Everything looks OK, create new pet
- Pet* pet = player->CreateTamedPetFrom (creatureTarget);
- if (!pet)
- {
- PSendSysMessage (LANG_CREATURE_NON_TAMEABLE,cInfo->Entry);
- SetSentErrorMessage (true);
- return false;
- }
-
- // place pet before player
- float x,y,z;
- player->GetClosePoint (x,y,z,creatureTarget->GetObjectSize (),CONTACT_DISTANCE);
- pet->Relocate (x,y,z,M_PI-player->GetOrientation ());
-
- // set pet to defensive mode by default (some classes can't control controlled pets in fact).
- pet->GetCharmInfo()->SetReactState(REACT_DEFENSIVE);
-
- // calculate proper level
- uint32 level = (creatureTarget->getLevel() < (player->getLevel() - 5)) ? (player->getLevel() - 5) : creatureTarget->getLevel();
-
- // prepare visual effect for levelup
- pet->SetUInt32Value(UNIT_FIELD_LEVEL, level - 1);
-
- // add to world
- pet->GetMap()->Add((Creature*)pet);
-
- // visual effect for levelup
- pet->SetUInt32Value(UNIT_FIELD_LEVEL, level);
-
- // caster have pet now
- player->SetPet(pet);
-
- pet->SavePetToDB(PET_SAVE_AS_CURRENT);
- player->PetSpellInitialize();
-
- return true;
-}
-
bool ChatHandler::HandleCreatePetCommand(const char* args)
{
Player *player = m_session->GetPlayer();
@@ -4204,7 +4055,7 @@ bool ChatHandler::HandlePetTpCommand(const char *args)
uint32 tp = atol(args);
- //pet->SetTP(tp);
+ pet->SetTP(tp);
PSendSysMessage("Pet's tp changed to %u", tp);
return true;
@@ -4243,4 +4094,4 @@ bool ChatHandler::HandleActivateObjectCommand(const char *args)
PSendSysMessage("Object activated!");
return true;
-} \ No newline at end of file
+}
diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp
index 6bdffe0b187..c507df4c858 100644
--- a/src/game/Level3.cpp
+++ b/src/game/Level3.cpp
@@ -299,15 +299,6 @@ bool ChatHandler::HandleReloadLootTemplatesItemCommand(const char*)
return true;
}
-bool ChatHandler::HandleReloadLootTemplatesMillingCommand(const char*)
-{
- sLog.outString( "Re-Loading Loot Tables... (`milling_loot_template`)" );
- LoadLootTemplates_Milling();
- LootTemplates_Milling.CheckLootRefs();
- SendGlobalSysMessage("DB table `milling_loot_template` reloaded.");
- return true;
-}
-
bool ChatHandler::HandleReloadLootTemplatesPickpocketingCommand(const char*)
{
sLog.outString( "Re-Loading Loot Tables... (`pickpocketing_loot_template`)" );
@@ -1750,10 +1741,6 @@ bool ChatHandler::HandleLearnAllMySpellsCommand(const char* /*args*/)
if(!spellInfo)
continue;
- // skip server-side/triggered spells
- if(spellInfo->spellLevel==0)
- continue;
-
// skip wrong class/race skills
if(!m_session->GetPlayer()->IsSpellFitByClassAndRace(spellInfo->Id))
continue;
@@ -1762,6 +1749,8 @@ bool ChatHandler::HandleLearnAllMySpellsCommand(const char* /*args*/)
if( spellInfo->SpellFamilyName != family)
continue;
+ //TODO: skip triggered spells
+
// skip spells with first rank learned as talent (and all talents then also)
uint32 first_rank = spellmgr.GetFirstSpellInChain(spellInfo->Id);
if(GetTalentSpellCost(first_rank) > 0 )
@@ -3824,6 +3813,36 @@ bool ChatHandler::HandleHoverCommand(const char* args)
return true;
}
+bool ChatHandler::HandleWaterwalkCommand(const char* args)
+{
+ if(!args)
+ return false;
+
+ Player *player = getSelectedPlayer();
+ if(!player)
+ {
+ PSendSysMessage(LANG_NO_CHAR_SELECTED);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (strncmp(args, "on", 3) == 0)
+ player->SetMovement(MOVE_WATER_WALK); // ON
+ else if (strncmp(args, "off", 4) == 0)
+ player->SetMovement(MOVE_LAND_WALK); // OFF
+ else
+ {
+ SendSysMessage(LANG_USE_BOL);
+ return false;
+ }
+
+ PSendSysMessage(LANG_YOU_SET_WATERWALK, args, player->GetName());
+ if(needReportToTarget(player))
+ ChatHandler(player).PSendSysMessage(LANG_YOUR_WATERWALK_SET, args, GetName());
+ return true;
+
+}
+
bool ChatHandler::HandleLevelUpCommand(const char* args)
{
char* px = strtok((char*)args, " ");
@@ -4439,7 +4458,7 @@ static bool HandleResetStatsOrLevelHelper(Player* player)
// set UNIT_FIELD_BYTES_1 to init state but preserve m_form value
player->SetUInt32Value(UNIT_FIELD_BYTES_1, unitfield);
- player->SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP );
+ player->SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_UNK3 | UNIT_BYTE2_FLAG_UNK5 );
player->SetByteValue(UNIT_FIELD_BYTES_2, 3, player->m_form);
player->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
@@ -4484,7 +4503,6 @@ bool ChatHandler::HandleResetLevelCommand(const char * args)
player->SetLevel(1);
player->InitStatsForLevel(true);
player->InitTaxiNodesForLevel();
- player->InitGlyphsForLevel();
player->InitTalentForLevel();
player->SetUInt32Value(PLAYER_XP,0);
@@ -4528,7 +4546,6 @@ bool ChatHandler::HandleResetStatsCommand(const char * args)
player->InitStatsForLevel(true);
player->InitTaxiNodesForLevel();
- player->InitGlyphsForLevel();
player->InitTalentForLevel();
return true;
@@ -6591,27 +6608,30 @@ bool ChatHandler::HandleModifyGenderCommand(const char *args)
return false;
}
- PlayerInfo const* info = objmgr.GetPlayerInfo(player->getRace(), player->getClass());
- if(!info)
- return false;
-
char const* gender_str = (char*)args;
int gender_len = strlen(gender_str);
+ uint32 displayId = player->GetNativeDisplayId();
+ char const* gender_full = NULL;
+ uint32 new_displayId = displayId;
Gender gender;
- if(!strncmp(gender_str, "male", gender_len)) // MALE
+ if(!strncmp(gender_str,"male",gender_len)) // MALE
{
if(player->getGender() == GENDER_MALE)
return true;
+ gender_full = "male";
+ new_displayId = player->getRace() == RACE_BLOODELF ? displayId+1 : displayId-1;
gender = GENDER_MALE;
}
- else if (!strncmp(gender_str, "female", gender_len)) // FEMALE
+ else if (!strncmp(gender_str,"female",gender_len)) // FEMALE
{
if(player->getGender() == GENDER_FEMALE)
return true;
+ gender_full = "female";
+ new_displayId = player->getRace() == RACE_BLOODELF ? displayId-1 : displayId+1;
gender = GENDER_FEMALE;
}
else
@@ -6623,19 +6643,14 @@ bool ChatHandler::HandleModifyGenderCommand(const char *args)
// Set gender
player->SetByteValue(UNIT_FIELD_BYTES_0, 2, gender);
- player->SetByteValue(PLAYER_BYTES_3, 0, gender);
// Change display ID
- player->SetDisplayId(gender ? info->displayId_f : info->displayId_m);
- player->SetNativeDisplayId(gender ? info->displayId_f : info->displayId_m);
-
- char const* gender_full = gender ? "female" : "male";
-
- PSendSysMessage(LANG_YOU_CHANGE_GENDER, player->GetName(), gender_full);
+ player->SetDisplayId(new_displayId);
+ player->SetNativeDisplayId(new_displayId);
+ PSendSysMessage(LANG_YOU_CHANGE_GENDER, player->GetName(),gender_full);
if (needReportToTarget(player))
- ChatHandler(player).PSendSysMessage(LANG_YOUR_GENDER_CHANGED, gender_full, GetName());
-
+ ChatHandler(player).PSendSysMessage(LANG_YOUR_GENDER_CHANGED, gender_full,GetName());
return true;
}
diff --git a/src/game/LootHandler.cpp b/src/game/LootHandler.cpp
index f1110ca3853..a4a8a7a1f01 100644
--- a/src/game/LootHandler.cpp
+++ b/src/game/LootHandler.cpp
@@ -154,7 +154,6 @@ void WorldSession::HandleAutostoreLootItemOpcode( WorldPacket & recv_data )
--loot->unlootedCount;
player->SendNewItem(newitem, uint32(item->count), false, false, true);
- player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, item->itemid, item->count);
}
else
player->SendEquipError( msg, NULL, NULL );
@@ -327,7 +326,7 @@ void WorldSession::DoLootRelease( uint64 lguid )
int32 ReqValue = 175;
LockEntry const *lockInfo = sLockStore.LookupEntry(go->GetGOInfo()->chest.lockId);
if(lockInfo)
- ReqValue = lockInfo->Skill[0];
+ ReqValue = lockInfo->requiredminingskill;
float skill = float(player->GetSkillValue(SKILL_MINING))/(ReqValue+25);
double chance = pow(0.8*chance_rate,4*(1/double(max_amount))*double(uses));
if(roll_chance_f(100*chance+skill))
@@ -496,7 +495,6 @@ void WorldSession::HandleLootMasterGiveOpcode( WorldPacket & recv_data )
// not move item from loot to target inventory
Item * newitem = target->StoreNewItem( dest, item.itemid, true, item.randomPropertyId );
target->SendNewItem(newitem, uint32(item.count), false, false, true );
- target->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, item.itemid, item.count);
// mark as looted
item.count=0;
diff --git a/src/game/LootMgr.cpp b/src/game/LootMgr.cpp
index 61c626a544c..4a34f51d672 100644
--- a/src/game/LootMgr.cpp
+++ b/src/game/LootMgr.cpp
@@ -41,7 +41,6 @@ LootStore LootTemplates_Disenchant( "disenchant_loot_template", "item disenc
LootStore LootTemplates_Fishing( "fishing_loot_template", "area id");
LootStore LootTemplates_Gameobject( "gameobject_loot_template", "gameobject entry");
LootStore LootTemplates_Item( "item_loot_template", "item entry");
-LootStore LootTemplates_Milling( "milling_loot_template", "item entry");
LootStore LootTemplates_Pickpocketing("pickpocketing_loot_template","creature pickpocket lootid");
LootStore LootTemplates_Prospecting( "prospecting_loot_template", "item entry");
LootStore LootTemplates_QuestMail( "quest_mail_loot_template", "quest id");
@@ -1139,21 +1138,6 @@ void LoadLootTemplates_Item()
LootTemplates_Item.ReportUnusedIds(ids_set);
}
-void LoadLootTemplates_Milling()
-{
- LootIdSet ids_set;
- LootTemplates_Milling.LoadAndCollectLootIds(ids_set);
-
- // remove real entries and check existence loot
- for(uint32 i = 1; i < sItemStorage.MaxEntry; ++i )
- if(ItemPrototype const* proto = sItemStorage.LookupEntry<ItemPrototype>(i))
- if(ids_set.count(proto->ItemId))
- ids_set.erase(proto->ItemId);
-
- // output error for any still listed (not referenced from appropriate table) ids
- LootTemplates_Milling.ReportUnusedIds(ids_set);
-}
-
void LoadLootTemplates_Pickpocketing()
{
LootIdSet ids_set, ids_setUsed;
@@ -1246,7 +1230,6 @@ void LoadLootTemplates_Reference()
LootTemplates_Fishing.CheckLootRefs(&ids_set);
LootTemplates_Gameobject.CheckLootRefs(&ids_set);
LootTemplates_Item.CheckLootRefs(&ids_set);
- LootTemplates_Milling.CheckLootRefs(&ids_set);
LootTemplates_Pickpocketing.CheckLootRefs(&ids_set);
LootTemplates_Skinning.CheckLootRefs(&ids_set);
LootTemplates_Disenchant.CheckLootRefs(&ids_set);
diff --git a/src/game/LootMgr.h b/src/game/LootMgr.h
index f9fed651a1c..1cb02c29bfc 100644
--- a/src/game/LootMgr.h
+++ b/src/game/LootMgr.h
@@ -297,7 +297,6 @@ extern LootStore LootTemplates_Creature;
extern LootStore LootTemplates_Fishing;
extern LootStore LootTemplates_Gameobject;
extern LootStore LootTemplates_Item;
-extern LootStore LootTemplates_Milling;
extern LootStore LootTemplates_Pickpocketing;
extern LootStore LootTemplates_Skinning;
extern LootStore LootTemplates_Disenchant;
@@ -308,7 +307,6 @@ void LoadLootTemplates_Creature();
void LoadLootTemplates_Fishing();
void LoadLootTemplates_Gameobject();
void LoadLootTemplates_Item();
-void LoadLootTemplates_Milling();
void LoadLootTemplates_Pickpocketing();
void LoadLootTemplates_Skinning();
void LoadLootTemplates_Disenchant();
@@ -322,7 +320,6 @@ inline void LoadLootTables()
LoadLootTemplates_Fishing();
LoadLootTemplates_Gameobject();
LoadLootTemplates_Item();
- LoadLootTemplates_Milling();
LoadLootTemplates_Pickpocketing();
LoadLootTemplates_Skinning();
LoadLootTemplates_Disenchant();
diff --git a/src/game/Mail.cpp b/src/game/Mail.cpp
index 3d4126bd22a..00211094d4e 100644
--- a/src/game/Mail.cpp
+++ b/src/game/Mail.cpp
@@ -593,7 +593,7 @@ void WorldSession::HandleGetMail(WorldPacket & recv_data )
data << (uint32) (*itr)->mailTemplateId; // mail template (MailTemplate.dbc)
data << (*itr)->subject; // Subject string - once 00, when mail type = 3
- data << (uint8) item_count; // client limit is 0x10
+ data << (uint8) item_count;
for(uint8 i = 0; i < item_count; ++i)
{
@@ -604,7 +604,7 @@ void WorldSession::HandleGetMail(WorldPacket & recv_data )
data << (uint32) (item ? item->GetGUIDLow() : 0);
// entry
data << (uint32) (item ? item->GetEntry() : 0);
- for(uint8 j = 0; j < 7; ++j)
+ for(uint8 j = 0; j < 6; ++j)
{
// unsure
data << (uint32) (item ? item->GetEnchantmentCharges((EnchantmentSlot)j) : 0);
@@ -618,15 +618,13 @@ void WorldSession::HandleGetMail(WorldPacket & recv_data )
// unk
data << (uint32) (item ? item->GetItemSuffixFactor() : 0);
// stack count
- data << (uint32) (item ? item->GetCount() : 0);
+ data << (uint8) (item ? item->GetCount() : 0);
// charges
data << (uint32) (item ? item->GetSpellCharges() : 0);
// durability
data << (uint32) (item ? item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY) : 0);
// durability
data << (uint32) (item ? item->GetUInt32Value(ITEM_FIELD_DURABILITY) : 0);
- // unknown wotlk
- data << (uint8) 0;
}
mails_count += 1;
diff --git a/src/game/Makefile.am b/src/game/Makefile.am
index 2aee7919cf0..81259aef1a7 100644
--- a/src/game/Makefile.am
+++ b/src/game/Makefile.am
@@ -28,7 +28,6 @@ AM_CPPFLAGS =
# later.
noinst_LIBRARIES = libgame.a
-<<<<<<< HEAD:src/game/Makefile.am
libgame_a_CPPFLAGS = \
$(MYSQL_INCLUDES) \
$(POSTGRE_INCLUDES) \
@@ -37,258 +36,6 @@ $(TRINI_INCLUDES) \
-I$(top_srcdir)/src/framework \
-I$(top_srcdir)/src/shared \
-I$(top_srcdir)/src/shared/vmap
-=======
-# libmangossgame library will later be reused by ...
-libmangosgame_a_SOURCES = \
- AccountMgr.cpp \
- AccountMgr.h \
- AchievementMgr.h \
- AchievementMgr.cpp \
- AddonHandler.cpp \
- AddonHandler.h \
- AggressorAI.cpp \
- AggressorAI.h \
- AnimalRandomMovementGenerator.h \
- ArenaTeam.cpp \
- ArenaTeam.h \
- ArenaTeamHandler.cpp \
- AuctionHouse.cpp \
- AuctionHouseObject.h \
- Bag.cpp \
- Bag.h \
- BattleGround.cpp \
- BattleGroundAA.cpp \
- BattleGroundAB.cpp \
- BattleGroundAV.cpp \
- BattleGroundBE.cpp \
- BattleGroundEY.cpp \
- BattleGroundNA.cpp \
- BattleGroundRL.cpp \
- BattleGroundWS.cpp \
- BattleGround.h \
- BattleGroundAA.h \
- BattleGroundAB.h \
- BattleGroundAV.h \
- BattleGroundBE.h \
- BattleGroundEY.h \
- BattleGroundNA.h \
- BattleGroundRL.h \
- BattleGroundWS.h \
- BattleGroundHandler.cpp \
- BattleGroundMgr.cpp \
- BattleGroundMgr.h \
- Calendar.cpp \
- Calendar.h \
- CalendarHandler.cpp \
- Cell.h \
- CellImpl.h \
- Channel.cpp \
- Channel.h \
- ChannelHandler.cpp \
- ChannelMgr.h \
- CharacterHandler.cpp \
- Chat.cpp \
- Chat.h \
- ChatHandler.cpp \
- CombatHandler.cpp \
- ConfusedMovementGenerator.cpp \
- ConfusedMovementGenerator.h \
- Corpse.cpp \
- Corpse.h \
- CreatureAI.cpp \
- CreatureAI.h \
- CreatureAIImpl.h \
- CreatureAIRegistry.cpp \
- CreatureAIRegistry.h \
- CreatureAISelector.cpp \
- CreatureAISelector.h \
- Creature.cpp \
- Creature.h \
- debugcmds.cpp \
- DestinationHolder.cpp \
- DestinationHolder.h \
- DestinationHolderImp.h \
- DuelHandler.cpp \
- DynamicObject.cpp \
- DynamicObject.h \
- FleeingMovementGenerator.cpp \
- FleeingMovementGenerator.h \
- Formulas.h \
- GameEvent.cpp \
- GameEvent.h \
- GameObject.cpp \
- GameObject.h \
- GlobalEvents.cpp \
- GlobalEvents.h \
- GMTicketHandler.cpp \
- GMTicketMgr.cpp \
- GMTicketMgr.h \
- GossipDef.cpp \
- GossipDef.h \
- GridDefines.h \
- GridNotifiers.cpp \
- GridNotifiers.h \
- GridNotifiersImpl.h \
- GridStates.cpp \
- GridStates.h \
- Group.cpp \
- Group.h \
- GroupHandler.cpp \
- GuardAI.cpp \
- GuardAI.h \
- Guild.cpp \
- Guild.h \
- GuildHandler.cpp \
- HomeMovementGenerator.cpp \
- HomeMovementGenerator.h \
- HostilRefManager.cpp \
- HostilRefManager.h \
- IdleMovementGenerator.cpp \
- IdleMovementGenerator.h \
- InstanceData.cpp \
- InstanceData.h \
- InstanceSaveMgr.cpp \
- InstanceSaveMgr.h \
- Item.cpp \
- Item.h \
- ItemEnchantmentMgr.cpp \
- ItemEnchantmentMgr.h \
- ItemHandler.cpp \
- ItemPrototype.h \
- Language.h \
- Level0.cpp \
- Level1.cpp \
- Level2.cpp \
- Level3.cpp \
- LFGHandler.cpp \
- LootHandler.cpp \
- LootMgr.cpp \
- LootMgr.h \
- Mail.cpp \
- Mail.h \
- Map.cpp \
- Map.h \
- MapInstanced.cpp \
- MapInstanced.h \
- MapManager.cpp \
- MapManager.h \
- MapReference.h \
- MapRefManager.h \
- MiscHandler.cpp \
- MotionMaster.cpp \
- MotionMaster.h \
- MovementGenerator.cpp \
- MovementGenerator.h \
- MovementGeneratorImpl.h \
- MovementHandler.cpp \
- NPCHandler.cpp \
- NPCHandler.h \
- NullCreatureAI.cpp \
- NullCreatureAI.h \
- ObjectAccessor.cpp \
- ObjectAccessor.h \
- Object.cpp \
- ObjectDefines.h \
- ObjectGridLoader.cpp \
- ObjectGridLoader.h \
- Object.h \
- ObjectMgr.cpp \
- ObjectMgr.h \
- ObjectPosSelector.cpp \
- ObjectPosSelector.h \
- Opcodes.cpp \
- Opcodes.h \
- Path.h \
- PetAI.cpp \
- PetAI.h \
- Pet.cpp \
- Pet.h \
- PetHandler.cpp \
- PetitionsHandler.cpp \
- Player.cpp \
- Player.h \
- PlayerDump.cpp \
- PlayerDump.h \
- PointMovementGenerator.cpp \
- PointMovementGenerator.h \
- QueryHandler.cpp \
- QuestDef.cpp \
- QuestDef.h \
- QuestHandler.cpp \
- RandomMovementGenerator.cpp \
- RandomMovementGenerator.h \
- ReactorAI.cpp \
- ReactorAI.h \
- ScriptCalls.cpp \
- ScriptCalls.h \
- SharedDefines.h \
- SkillHandler.cpp \
- SpellAuraDefines.h \
- SpellAuras.cpp \
- SpellAuras.h \
- Spell.cpp \
- SpellEffects.cpp \
- Spell.h \
- SkillDiscovery.cpp \
- SkillDiscovery.h \
- SkillExtraItems.cpp \
- SkillExtraItems.h \
- SpellHandler.cpp \
- SocialMgr.cpp \
- SocialMgr.h \
- SpellMgr.cpp \
- SpellMgr.h \
- StatSystem.cpp \
- TargetedMovementGenerator.cpp \
- TargetedMovementGenerator.h \
- TaxiHandler.cpp \
- TemporarySummon.cpp \
- TemporarySummon.h \
- tools.cpp \
- Tools.h \
- TotemAI.cpp \
- TotemAI.h \
- Totem.cpp \
- Totem.h \
- TradeHandler.cpp \
- Transports.cpp \
- Transports.h \
- ThreatManager.cpp \
- ThreatManager.h \
- Traveller.h \
- Unit.cpp \
- Unit.h \
- UnitEvents.h \
- UpdateData.cpp \
- UpdateData.h \
- UpdateFields.h \
- UpdateMask.h \
- Vehicle.cpp \
- Vehicle.h \
- VoiceChatHandler.cpp \
- WaypointManager.cpp \
- WaypointManager.h \
- WaypointMovementGenerator.cpp \
- WaypointMovementGenerator.h \
- Weather.cpp \
- Weather.h \
- World.cpp \
- World.h \
- WorldLog.cpp \
- WorldLog.h \
- WorldSession.cpp \
- WorldSession.h \
- WorldSocket.cpp \
- WorldSocket.h \
- WorldSocketMgr.cpp \
- WorldSocketMgr.h \
- FollowerReference.cpp \
- FollowerReference.h \
- FollowerRefManager.h \
- GroupReference.cpp \
- GroupReference.h \
- GroupRefManager.h
->>>>>>> upstream/master:src/game/Makefile.am
# libmangossgame library will later be reused by ...
libgame_a_SOURCES = \
diff --git a/src/game/Map.cpp b/src/game/Map.cpp
index 8116510df9b..531f32e75e9 100644
--- a/src/game/Map.cpp
+++ b/src/game/Map.cpp
@@ -45,7 +45,7 @@
#define MAX_GRID_LOAD_TIME 50
// magic *.map header
-const char MAP_MAGIC[] = "MAP_2.01";
+const char MAP_MAGIC[] = "MAP_2.00";
GridState* si_GridStates[MAX_GRID_STATE];
@@ -257,7 +257,7 @@ template<>
void Map::AddToGrid(Creature* obj, NGridType *grid, Cell const& cell)
{
// add to world object registry in grid
- if(obj->isPet() || obj->isPossessedByPlayer() || obj->isVehicle())
+ if(obj->isPet() || obj->isPossessedByPlayer())
{
(*grid)(cell.CellX(), cell.CellY()).AddWorldObject<Creature>(obj, obj->GetGUID());
obj->SetCurrentCell(cell);
@@ -301,7 +301,7 @@ template<>
void Map::RemoveFromGrid(Creature* obj, NGridType *grid, Cell const& cell)
{
// remove from world object registry in grid
- if(obj->isPet() || obj->isPossessedByPlayer() || obj->isVehicle())
+ if(obj->isPet() || obj->isPossessedByPlayer())
{
(*grid)(cell.CellX(), cell.CellY()).RemoveWorldObject<Creature>(obj, obj->GetGUID());
}
diff --git a/src/game/Map.h b/src/game/Map.h
index 43f9326c108..23b2ea1f3fa 100644
--- a/src/game/Map.h
+++ b/src/game/Map.h
@@ -224,17 +224,6 @@ class TRINITY_DLL_SPEC Map : public GridRefManager<NGridType>, public Trinity::O
bool IsBattleGround() const { return i_mapEntry && i_mapEntry->IsBattleGround(); }
bool IsBattleArena() const { return i_mapEntry && i_mapEntry->IsBattleArena(); }
bool IsBattleGroundOrArena() const { return i_mapEntry && i_mapEntry->IsBattleGroundOrArena(); }
- bool GetEntrancePos(int32 &mapid, float &x, float &y)
- {
- if(!i_mapEntry)
- return false;
- if(i_mapEntry->entrance_map < 0)
- return false;
- mapid = i_mapEntry->entrance_map;
- x = i_mapEntry->entrance_x;
- y = i_mapEntry->entrance_y;
- return true;
- }
void AddObjectToRemoveList(WorldObject *obj);
void DoDelayedMovesAndRemoves();
diff --git a/src/game/MapManager.cpp b/src/game/MapManager.cpp
index 47be039d415..26279cb76ec 100644
--- a/src/game/MapManager.cpp
+++ b/src/game/MapManager.cpp
@@ -175,8 +175,7 @@ bool MapManager::CanPlayerEnter(uint32 mapid, Player* player)
//The player has a heroic mode and tries to enter into instance which has no a heroic mode
if (!entry->SupportsHeroicMode() && player->GetDifficulty() == DIFFICULTY_HEROIC)
{
- //Send aborted message
- player->SendTransferAborted(mapid, TRANSFER_ABORT_DIFFICULTY, DIFFICULTY_HEROIC);
+ player->SendTransferAborted(mapid, TRANSFER_ABORT_DIFFICULTY2); //Send aborted message
return false;
}
@@ -281,8 +280,7 @@ bool MapManager::ExistMapAndVMap(uint32 mapid, float x,float y)
bool MapManager::IsValidMAP(uint32 mapid)
{
MapEntry const* mEntry = sMapStore.LookupEntry(mapid);
- return mEntry && (!mEntry->IsDungeon() || objmgr.GetInstanceTemplate(mapid));
- // TODO: add check for battleground template
+ return mEntry && (!mEntry->Instanceable() || objmgr.GetInstanceTemplate(mapid));
}
void MapManager::LoadGrid(int mapid, float x, float y, const WorldObject* obj, bool no_unload)
diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp
index e52afcb80a9..f5ee5dbcf4c 100644
--- a/src/game/MiscHandler.cpp
+++ b/src/game/MiscHandler.cpp
@@ -45,7 +45,6 @@
#include "Pet.h"
#include "SocialMgr.h"
#include "CellImpl.h"
-#include "Tools.h"
void WorldSession::HandleRepopRequestOpcode( WorldPacket & /*recv_data*/ )
{
@@ -313,7 +312,7 @@ void WorldSession::HandleLogoutRequestOpcode( WorldPacket & /*recv_data*/ )
data.append(GetPlayer()->GetPackGUID());
data << (uint32)2;
SendPacket( &data );
- GetPlayer()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
+ GetPlayer()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_ROTATE);
}
WorldPacket data( SMSG_LOGOUT_RESPONSE, 5 );
@@ -350,7 +349,7 @@ void WorldSession::HandleLogoutCancelOpcode( WorldPacket & /*recv_data*/ )
GetPlayer()->SetStandState(PLAYER_STATE_NONE);
//! DISABLE_ROTATE
- GetPlayer()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
+ GetPlayer()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_ROTATE);
}
sLog.outDebug( "WORLD: sent SMSG_LOGOUT_CANCEL_ACK Message" );
@@ -364,12 +363,10 @@ void WorldSession::HandleTogglePvP( WorldPacket & recv_data )
bool newPvPStatus;
recv_data >> newPvPStatus;
GetPlayer()->ApplyModFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP, newPvPStatus);
- GetPlayer()->ApplyModFlag(PLAYER_FLAGS, PLAYER_FLAGS_PVP_TIMER, !newPvPStatus);
}
else
{
GetPlayer()->ToggleFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP);
- GetPlayer()->ToggleFlag(PLAYER_FLAGS, PLAYER_FLAGS_PVP_TIMER);
}
if(GetPlayer()->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP))
@@ -885,7 +882,7 @@ void WorldSession::HandleAreaTriggerOpcode(WorldPacket & recv_data)
if(missingItem)
SendAreaTriggerMessage(GetTrinityString(LANG_LEVEL_MINREQUIRED_AND_ITEM), at->requiredLevel, objmgr.GetItemPrototype(missingItem)->Name1);
else if(missingKey)
- GetPlayer()->SendTransferAborted(at->target_mapId, TRANSFER_ABORT_DIFFICULTY, DIFFICULTY_HEROIC);
+ GetPlayer()->SendTransferAborted(at->target_mapId, TRANSFER_ABORT_DIFFICULTY2);
else if(missingQuest)
SendAreaTriggerMessage(at->requiredFailedText.c_str());
else if(missingLevel)
@@ -897,96 +894,16 @@ void WorldSession::HandleAreaTriggerOpcode(WorldPacket & recv_data)
GetPlayer()->TeleportTo(at->target_mapId,at->target_X,at->target_Y,at->target_Z,at->target_Orientation,TELE_TO_NOT_LEAVE_TRANSPORT);
}
-void WorldSession::HandleUpdateAccountData(WorldPacket &recv_data)
+void WorldSession::HandleUpdateAccountData(WorldPacket &/*recv_data*/)
{
sLog.outDetail("WORLD: Received CMSG_UPDATE_ACCOUNT_DATA");
-
- CHECK_PACKET_SIZE(recv_data, 4+4+4);
-
- uint32 type, timestamp, decompressedSize;
- recv_data >> type >> timestamp >> decompressedSize;
-
- sLog.outDebug("UAD: type %u, time %u, decompressedSize %u", type, timestamp, decompressedSize);
-
- if(type > NUM_ACCOUNT_DATA_TYPES)
- return;
-
- if(decompressedSize == 0) // erase
- {
- SetAccountData(type, timestamp, "");
-
- WorldPacket data(SMSG_UPDATE_ACCOUNT_DATA_COMPLETE, 4+4);
- data << uint32(type);
- data << uint32(0);
- SendPacket(&data);
-
- return;
- }
-
- if(decompressedSize > 0xFFFF)
- {
- sLog.outError("UAD: Account data packet too big, size %u", decompressedSize);
- return;
- }
-
- ByteBuffer dest;
- dest.resize(decompressedSize);
-
- uLongf realSize = decompressedSize;
- if(uncompress(const_cast<uint8*>(dest.contents()), &realSize, const_cast<uint8*>(recv_data.contents() + recv_data.rpos()), recv_data.size() - recv_data.rpos()) != Z_OK)
- {
- sLog.outError("UAD: Failed to decompress account data");
- return;
- }
-
- std::string adata;
- dest >> adata;
-
- SetAccountData(type, timestamp, adata);
-
- WorldPacket data(SMSG_UPDATE_ACCOUNT_DATA_COMPLETE, 4+4);
- data << uint32(type);
- data << uint32(0);
- SendPacket(&data);
+ //recv_data.hexlike();
}
-void WorldSession::HandleRequestAccountData(WorldPacket& recv_data)
+void WorldSession::HandleRequestAccountData(WorldPacket& /*recv_data*/)
{
sLog.outDetail("WORLD: Received CMSG_REQUEST_ACCOUNT_DATA");
-
- CHECK_PACKET_SIZE(recv_data, 4);
-
- uint32 type;
- recv_data >> type;
-
- sLog.outDebug("RAD: type %u", type);
-
- if(type > NUM_ACCOUNT_DATA_TYPES)
- return;
-
- AccountData *adata = GetAccountData(type);
-
- uint32 size = adata->Data.size();
-
- ByteBuffer dest;
- dest.resize(size);
-
- uLongf destSize = size;
- if(compress(const_cast<uint8*>(dest.contents()), &destSize, (uint8*)adata->Data.c_str(), size) != Z_OK)
- {
- sLog.outDebug("RAD: Failed to compress account data");
- return;
- }
-
- dest.resize(destSize);
-
- WorldPacket data (SMSG_UPDATE_ACCOUNT_DATA, 8+4+4+4+destSize);
- data << uint64(_player->GetGUID()); // player guid
- data << uint32(type); // type (0-7)
- data << uint32(adata->Time); // unix time
- data << uint32(size); // decompressed length
- data.append(dest); // compressed data
- SendPacket(&data);
+ //recv_data.hexlike();
}
void WorldSession::HandleSetActionButtonOpcode(WorldPacket& recv_data)
@@ -1517,11 +1434,11 @@ void WorldSession::HandleChooseTitleOpcode( WorldPacket & recv_data )
GetPlayer()->SetUInt32Value(PLAYER_CHOSEN_TITLE, title);
}
-void WorldSession::HandleTimeSyncResp( WorldPacket & recv_data )
+void WorldSession::HandleAllowMoveAckOpcode( WorldPacket & recv_data )
{
CHECK_PACKET_SIZE(recv_data, 4+4);
- sLog.outDebug("CMSG_TIME_SYNC_RESP");
+ sLog.outDebug("CMSG_ALLOW_MOVE_ACK");
uint32 counter, time_;
recv_data >> counter >> time_;
@@ -1591,6 +1508,26 @@ void WorldSession::HandleDungeonDifficultyOpcode( WorldPacket & recv_data )
}
}
+void WorldSession::HandleNewUnknownOpcode( WorldPacket & recv_data )
+{
+ sLog.outDebug("New Unknown Opcode %u", recv_data.GetOpcode());
+ recv_data.hexlike();
+ /*
+ New Unknown Opcode 837
+ STORAGE_SIZE: 60
+ 02 00 00 00 00 00 00 00 | 00 00 00 00 01 20 00 00
+ 89 EB 33 01 71 5C 24 C4 | 15 03 35 45 74 47 8B 42
+ BA B8 1B 40 00 00 00 00 | 00 00 00 00 77 66 42 BF
+ 23 91 26 3F 00 00 60 41 | 00 00 00 00
+
+ New Unknown Opcode 837
+ STORAGE_SIZE: 44
+ 02 00 00 00 00 00 00 00 | 00 00 00 00 00 00 80 00
+ 7B 80 34 01 84 EA 2B C4 | 5F A1 36 45 C9 39 1C 42
+ BA B8 1B 40 CE 06 00 00 | 00 00 80 3F
+ */
+}
+
void WorldSession::HandleDismountOpcode( WorldPacket & /*recv_data*/ )
{
sLog.outDebug("WORLD: CMSG_CANCEL_MOUNT_AURA");
@@ -1657,32 +1594,3 @@ void WorldSession::HandleSetTaxiBenchmarkOpcode( WorldPacket & recv_data )
sLog.outDebug("Client used \"/timetest %d\" command", mode);
}
-
-void WorldSession::HandleSpellClick( WorldPacket & recv_data )
-{
- CHECK_PACKET_SIZE(recv_data, 8);
-
- uint64 guid;
- recv_data >> guid;
-
- Vehicle *vehicle = ObjectAccessor::GetVehicle(guid);
-
- if(!vehicle)
- return;
-
- _player->EnterVehicle(vehicle);
-}
-
-void WorldSession::HandleInspectAchievements( WorldPacket & recv_data )
-{
- CHECK_PACKET_SIZE(recv_data, 1);
- uint64 guid;
- if(!readGUID(recv_data, guid))
- return;
-
- Player *player = objmgr.GetPlayer(guid);
- if(!player)
- return;
-
- player->GetAchievementMgr().SendRespondInspectAchievements(_player);
-}
diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp
index 29f673061b4..0a310cddd96 100644
--- a/src/game/MovementHandler.cpp
+++ b/src/game/MovementHandler.cpp
@@ -178,12 +178,64 @@ void WorldSession::HandleMoveWorldportAckOpcode()
void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
{
- uint32 opcode = recv_data.GetOpcode();
- sLog.outDebug("WORLD: Recvd %s (%u, 0x%X) opcode", LookupOpcodeName(opcode), opcode, opcode);
+ CHECK_PACKET_SIZE(recv_data, 4+1+4+4+4+4+4);
/* extract packet */
MovementInfo movementInfo;
- ReadMovementInfo(recv_data, &movementInfo);
+ uint32 MovementFlags;
+
+ recv_data >> MovementFlags;
+ recv_data >> movementInfo.unk1;
+ recv_data >> movementInfo.time;
+ recv_data >> movementInfo.x;
+ recv_data >> movementInfo.y;
+ recv_data >> movementInfo.z;
+ recv_data >> movementInfo.o;
+
+ if(MovementFlags & MOVEMENTFLAG_ONTRANSPORT)
+ {
+ // recheck
+ CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+8+4+4+4+4+4);
+
+ recv_data >> movementInfo.t_guid;
+ recv_data >> movementInfo.t_x;
+ recv_data >> movementInfo.t_y;
+ recv_data >> movementInfo.t_z;
+ recv_data >> movementInfo.t_o;
+ recv_data >> movementInfo.t_time;
+ }
+
+ if(MovementFlags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING2))
+ {
+ // recheck
+ CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+4);
+
+ recv_data >> movementInfo.s_pitch; // pitch, -1.55=looking down, 0=looking straight forward, +1.55=looking up
+ }
+
+ // recheck
+ CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+4);
+
+ recv_data >> movementInfo.fallTime; // duration of last jump (when in jump duration from jump begin to now)
+
+ if(MovementFlags & MOVEMENTFLAG_JUMPING)
+ {
+ // recheck
+ CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+4+4+4+4);
+
+ recv_data >> movementInfo.j_unk; // constant, but different when jumping in water and on land?
+ recv_data >> movementInfo.j_sinAngle; // sin of angle between orientation0 and players orientation
+ recv_data >> movementInfo.j_cosAngle; // cos of angle between orientation0 and players orientation
+ recv_data >> movementInfo.j_xyspeed; // speed of xy movement
+ }
+
+ if(MovementFlags & MOVEMENTFLAG_SPLINE)
+ {
+ // recheck
+ CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+4);
+
+ recv_data >> movementInfo.u_unk1; // unknown
+ }
/*----------------*/
if(recv_data.size() != recv_data.rpos())
@@ -200,7 +252,7 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
Unit* pos_unit = GetPlayer()->GetCharm();
if (pos_unit && pos_unit->isPossessed()) // can be charmed but not possessed
{
- HandlePossessedMovement(recv_data, movementInfo, movementInfo.flags);
+ HandlePossessedMovement(recv_data, movementInfo, MovementFlags);
return;
}
@@ -208,10 +260,10 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
return;
//Save movement flags
- GetPlayer()->SetUnitMovementFlags(movementInfo.flags);
+ GetPlayer()->SetUnitMovementFlags(MovementFlags);
/* handle special cases */
- if (movementInfo.flags & MOVEMENTFLAG_ONTRANSPORT)
+ if (MovementFlags & MOVEMENTFLAG_ONTRANSPORT)
{
// transports size limited
// (also received at zeppelin leave by some reason with t_* as absolute in continent coordinates, can be safely skipped)
@@ -230,6 +282,9 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
{
if ((*iter)->GetGUID() == movementInfo.t_guid)
{
+ // unmount before boarding
+ GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_MOUNTED);
+
GetPlayer()->m_transport = (*iter);
(*iter)->AddPassenger(GetPlayer());
break;
@@ -246,14 +301,13 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
movementInfo.t_z = 0.0f;
movementInfo.t_o = 0.0f;
movementInfo.t_time = 0;
- movementInfo.t_seat = -1;
}
// fall damage generation (ignore in flight case that can be triggered also at lags in moment teleportation to another map).
- if (opcode == MSG_MOVE_FALL_LAND && !GetPlayer()->isInFlight())
+ if (recv_data.GetOpcode() == MSG_MOVE_FALL_LAND && !GetPlayer()->isInFlight())
GetPlayer()->HandleFallDamage(movementInfo);
- if(((movementInfo.flags & MOVEMENTFLAG_SWIMMING) != 0) != GetPlayer()->IsInWater())
+ if(((MovementFlags & MOVEMENTFLAG_SWIMMING) != 0) != GetPlayer()->IsInWater())
{
// now client not include swimming flag in case jumping under water
GetPlayer()->SetInWater( !GetPlayer()->IsInWater() || GetPlayer()->GetBaseMap()->IsUnderWater(movementInfo.x, movementInfo.y, movementInfo.z) );
@@ -262,35 +316,14 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
/*----------------------*/
/* process position-change */
- Unit *mover = _player->m_mover;
- recv_data.put<uint32>(6, getMSTime()); // fix time, offset flags(4) + unk(2)
- WorldPacket data(recv_data.GetOpcode(), (mover->GetPackGUID().size()+recv_data.size()));
- data.append(_player->m_mover->GetPackGUID()); // use mover guid
+ recv_data.put<uint32>(5, getMSTime()); // offset flags(4) + unk(1)
+ WorldPacket data(recv_data.GetOpcode(), (GetPlayer()->GetPackGUID().size()+recv_data.size()));
+ data.append(GetPlayer()->GetPackGUID());
data.append(recv_data.contents(), recv_data.size());
GetPlayer()->SendMessageToSet(&data, false);
- if(!_player->GetCharmGUID()) // nothing is charmed
- {
- _player->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o);
- _player->m_movementInfo = movementInfo;
- _player->SetUnitMovementFlags(movementInfo.flags);
- }
- else
- {
- if(mover->GetTypeId() != TYPEID_PLAYER) // unit, creature, pet, vehicle...
- {
- if(Map *map = mover->GetMap())
- map->CreatureRelocation((Creature*)mover, movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o);
- mover->SetUnitMovementFlags(movementInfo.flags);
- }
- else // player
- {
- ((Player*)mover)->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o);
- ((Player*)mover)->m_movementInfo = movementInfo;
- ((Player*)mover)->SetUnitMovementFlags(movementInfo.flags);
- }
- }
-
+ GetPlayer()->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o);
+ GetPlayer()->m_movementInfo = movementInfo;
if (GetPlayer()->m_lastFallTime >= movementInfo.fallTime || GetPlayer()->m_lastFallZ <=movementInfo.z || recv_data.GetOpcode() == MSG_MOVE_FALL_LAND)
GetPlayer()->SetFallInformation(movementInfo.fallTime, movementInfo.z);
@@ -363,13 +396,20 @@ void WorldSession::HandlePossessedMovement(WorldPacket& recv_data, MovementInfo&
void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recv_data)
{
- sLog.outDebug("WORLD: Recvd %s (%u, 0x%X) opcode", LookupOpcodeName(recv_data.GetOpcode()), recv_data.GetOpcode(), recv_data.GetOpcode());
-
- CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+8+4);
+ CHECK_PACKET_SIZE(recv_data, 8+4+4+1+4+4+4+4+4);
/* extract packet */
uint64 guid;
- uint32 unk1;
+ uint8 unkB;
+ uint32 unk1, flags, time, fallTime;
+ float x, y, z, orientation;
+
+ uint64 t_GUID;
+ float t_x, t_y, t_z, t_o;
+ uint32 t_time;
+ float s_pitch;
+ float j_unk1, j_sinAngle, j_cosAngle, j_xyspeed;
+ float u_unk1;
float newspeed;
recv_data >> guid;
@@ -380,10 +420,47 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recv_data)
// continue parse packet
- recv_data >> unk1; // counter or moveEvent
+ recv_data >> unk1;
+ recv_data >> flags >> unkB >> time;
+ recv_data >> x >> y >> z >> orientation;
+ if (flags & MOVEMENTFLAG_ONTRANSPORT)
+ {
+ // recheck
+ CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+8+4+4+4+4+4);
- MovementInfo movementInfo;
- ReadMovementInfo(recv_data, &movementInfo);
+ recv_data >> t_GUID;
+ recv_data >> t_x >> t_y >> t_z >> t_o >> t_time;
+ }
+ if (flags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING2))
+ {
+ // recheck
+ CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+4);
+
+ recv_data >> s_pitch; // pitch, -1.55=looking down, 0=looking straight forward, +1.55=looking up
+ }
+
+ // recheck
+ CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+4);
+
+ recv_data >> fallTime; // duration of last jump (when in jump duration from jump begin to now)
+
+ if ((flags & MOVEMENTFLAG_JUMPING) || (flags & MOVEMENTFLAG_FALLING))
+ {
+ // recheck
+ CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+4+4+4+4);
+
+ recv_data >> j_unk1; // ?constant, but different when jumping in water and on land?
+ recv_data >> j_sinAngle >> j_cosAngle; // sin + cos of angle between orientation0 and players orientation
+ recv_data >> j_xyspeed; // speed of xy movement
+ }
+
+ if(flags & MOVEMENTFLAG_SPLINE)
+ {
+ // recheck
+ CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+4);
+
+ recv_data >> u_unk1; // unknown
+ }
// recheck
CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+4);
@@ -396,7 +473,7 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recv_data)
UnitMoveType move_type;
UnitMoveType force_move_type;
- static char const* move_type_name[MAX_MOVE_TYPE] = { "Walk", "Run", "RunBack", "Swim", "SwimBack", "TurnRate", "Flight", "FlightBack", "PitchRate" };
+ static char const* move_type_name[MAX_MOVE_TYPE] = { "Walk", "Run", "RunBack", "Swim", "SwimBack", "TurnRate", "Flight", "FlightBack" };
uint16 opcode = recv_data.GetOpcode();
switch(opcode)
@@ -409,7 +486,6 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recv_data)
case CMSG_FORCE_TURN_RATE_CHANGE_ACK: move_type = MOVE_TURN_RATE; force_move_type = MOVE_TURN_RATE; break;
case CMSG_FORCE_FLIGHT_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT; force_move_type = MOVE_FLIGHT; break;
case CMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT_BACK; force_move_type = MOVE_FLIGHT_BACK; break;
- case CMSG_FORCE_PITCH_RATE_CHANGE_ACK: move_type = MOVE_PITCH_RATE; force_move_type = MOVE_PITCH_RATE; break;
default:
sLog.outError("WorldSession::HandleForceSpeedChangeAck: Unknown move type opcode: %u", opcode);
return;
@@ -444,61 +520,20 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recv_data)
void WorldSession::HandleSetActiveMoverOpcode(WorldPacket &recv_data)
{
sLog.outDebug("WORLD: Recvd CMSG_SET_ACTIVE_MOVER");
- recv_data.hexlike();
- CHECK_PACKET_SIZE(recv_data, 8);
+ CHECK_PACKET_SIZE(recv_data,8);
uint64 guid;
recv_data >> guid;
- if(_player->m_mover->GetGUID() != guid)
- {
- sLog.outError("HandleSetActiveMoverOpcode: incorrect mover guid: mover is " I64FMT " and should be " I64FMT, _player->m_mover->GetGUID(), guid);
- return;
- }
+ WorldPacket data(SMSG_TIME_SYNC_REQ, 4); // new 2.0.x, enable movement
+ data << uint32(0x00000000); // on blizz it increments periodically
+ SendPacket(&data);
}
-void WorldSession::HandleMoveNotActiveMover(WorldPacket &recv_data)
+void WorldSession::HandleNotActiveMoverOpcode(WorldPacket& /*recv_data*/)
{
sLog.outDebug("WORLD: Recvd CMSG_MOVE_NOT_ACTIVE_MOVER");
- recv_data.hexlike();
-
- CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+8);
-
- uint64 old_mover_guid;
- recv_data >> old_mover_guid;
-
- if(_player->m_mover->GetGUID() == old_mover_guid)
- {
- sLog.outError("HandleMoveNotActiveMover: incorrect mover guid: mover is " I64FMT " and should be " I64FMT " instead of " I64FMT, _player->m_mover->GetGUID(), _player->GetGUID(), old_mover_guid);
- return;
- }
-
- MovementInfo mi;
- ReadMovementInfo(recv_data, &mi);
- _player->m_movementInfo = mi;
-}
-
-void WorldSession::HandleDismissControlledVehicle(WorldPacket &recv_data)
-{
- sLog.outDebug("WORLD: Recvd CMSG_DISMISS_CONTROLLED_VEHICLE");
- recv_data.hexlike();
-
- uint64 vehicleGUID = _player->GetCharmGUID();
-
- if(!vehicleGUID) // something wrong here...
- return;
-
- MovementInfo mi;
- ReadMovementInfo(recv_data, &mi);
- _player->m_movementInfo = mi;
-
- // using charm guid, because we don't have vehicle guid...
- if(Vehicle *vehicle = ObjectAccessor::GetVehicle(vehicleGUID))
- {
- _player->ExitVehicle(vehicle);
- vehicle->Dismiss();
- }
}
void WorldSession::HandleMountSpecialAnimOpcode(WorldPacket& /*recvdata*/)
diff --git a/src/game/NPCHandler.cpp b/src/game/NPCHandler.cpp
index c6751512e02..6bb916d9fe0 100644
--- a/src/game/NPCHandler.cpp
+++ b/src/game/NPCHandler.cpp
@@ -524,12 +524,13 @@ void WorldSession::SendStablePet(uint64 guid )
data << uint32(pet->GetEntry());
data << uint32(pet->getLevel());
data << pet->GetName(); // petname
- data << uint8(0x01); // flags?, client slot 1 == current pet (0)
+ data << uint32(pet->GetLoyaltyLevel()); // loyalty
+ data << uint8(0x01); // client slot 1 == current pet (0)
++num;
}
- // 0 1 2 3 4 5
- QueryResult* result = CharacterDatabase.PQuery("SELECT owner, slot, id, entry, level, name FROM character_pet WHERE owner = '%u' AND slot > 0 AND slot < 5",_player->GetGUIDLow());
+ // 0 1 2 3 4 5 6
+ QueryResult* result = CharacterDatabase.PQuery("SELECT owner, slot, id, entry, level, loyalty, name FROM character_pet WHERE owner = '%u' AND slot > 0 AND slot < 3",_player->GetGUIDLow());
if(result)
{
@@ -540,7 +541,8 @@ void WorldSession::SendStablePet(uint64 guid )
data << uint32(fields[2].GetUInt32()); // petnumber
data << uint32(fields[3].GetUInt32()); // creature entry
data << uint32(fields[4].GetUInt32()); // level
- data << fields[5].GetString(); // name
+ data << fields[6].GetString(); // name
+ data << uint32(fields[5].GetUInt32()); // loyalty
data << uint8(fields[1].GetUInt32()+1); // slot
++num;
@@ -590,7 +592,7 @@ void WorldSession::HandleStablePet( WorldPacket & recv_data )
uint32 free_slot = 1;
- QueryResult *result = CharacterDatabase.PQuery("SELECT owner,slot,id FROM character_pet WHERE owner = '%u' AND slot > 0 AND slot < 5 ORDER BY slot ",_player->GetGUIDLow());
+ QueryResult *result = CharacterDatabase.PQuery("SELECT owner,slot,id FROM character_pet WHERE owner = '%u' AND slot > 0 AND slot < 3 ORDER BY slot ",_player->GetGUIDLow());
if(result)
{
do
@@ -654,7 +656,7 @@ void WorldSession::HandleUnstablePet( WorldPacket & recv_data )
Pet *newpet = NULL;
- QueryResult *result = CharacterDatabase.PQuery("SELECT entry FROM character_pet WHERE owner = '%u' AND id = '%u' AND slot > 0 AND slot < 5",_player->GetGUIDLow(),petnumber);
+ QueryResult *result = CharacterDatabase.PQuery("SELECT entry FROM character_pet WHERE owner = '%u' AND id = '%u' AND slot > 0 AND slot < 3",_player->GetGUIDLow(),petnumber);
if(result)
{
Field *fields = result->Fetch();
@@ -698,7 +700,7 @@ void WorldSession::HandleBuyStableSlot( WorldPacket & recv_data )
WorldPacket data(SMSG_STABLE_RESULT, 200);
- if(GetPlayer()->m_stableSlots < 4) // max slots amount = 4
+ if(GetPlayer()->m_stableSlots < 2) // max slots amount = 2
{
StableSlotPricesEntry const *SlotPrice = sStableSlotPricesStore.LookupEntry(GetPlayer()->m_stableSlots+1);
if(_player->GetMoney() >= SlotPrice->Price)
diff --git a/src/game/Object.cpp b/src/game/Object.cpp
index e4e5230bfb6..efd041f34c2 100644
--- a/src/game/Object.cpp
+++ b/src/game/Object.cpp
@@ -146,9 +146,15 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) c
/** lower flag1 **/
if(target == this) // building packet for oneself
+ {
flags |= UPDATEFLAG_SELF;
- if(flags & UPDATEFLAG_HAS_POSITION)
+ /*** temporary reverted - until real source of stack corruption will not found
+ updatetype = UPDATETYPE_CREATE_OBJECT2;
+ ****/
+ }
+
+ if(flags & UPDATEFLAG_HASPOSITION)
{
// UPDATETYPE_CREATE_OBJECT2 dynamic objects, corpses...
if(isType(TYPEMASK_DYNAMICOBJECT) || isType(TYPEMASK_CORPSE) || isType(TYPEMASK_PLAYER))
@@ -174,12 +180,6 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) c
break;
}
}
-
- if(isType(TYPEMASK_UNIT))
- {
- if(((Unit*)this)->getVictim())
- flags |= UPDATEFLAG_HAS_TARGET;
- }
}
//sLog.outDebug("BuildCreateUpdate: update-type: %u, object-type: %u got flags: %X, flags2: %X", updatetype, m_objectTypeId, flags, flags2);
@@ -251,18 +251,11 @@ void Object::DestroyForPlayer(Player *target) const
WorldPacket data(SMSG_DESTROY_OBJECT, 8);
data << GetGUID();
- data << uint8(0); // WotLK (bool)
target->GetSession()->SendPacket( &data );
}
-void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2) const
+void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2 ) const
{
- uint16 unk_flags = ((GetTypeId() == TYPEID_PLAYER) ? ((Player*)this)->m_movementInfo.unk1 : 0);
-
- if(GetTypeId() == TYPEID_UNIT)
- if(((Creature*)this)->isVehicle())
- unk_flags |= 0x20; // always allow pitch
-
*data << (uint8)flags; // update flags
// 0x20
@@ -299,12 +292,12 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2)
}
*data << uint32(flags2); // movement flags
- *data << uint16(unk_flags); // unknown 2.3.0
+ *data << uint8(0); // unk 2.3.0
*data << uint32(getMSTime()); // time (in milliseconds)
}
// 0x40
- if (flags & UPDATEFLAG_HAS_POSITION)
+ if (flags & UPDATEFLAG_HASPOSITION)
{
// 0x02
if(flags & UPDATEFLAG_TRANSPORT && ((GameObject*)this)->GetGoType() == GAMEOBJECT_TYPE_MO_TRANSPORT)
@@ -337,13 +330,12 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2)
*data << (float)((Player*)this)->GetTransOffsetZ();
*data << (float)((Player*)this)->GetTransOffsetO();
*data << (uint32)((Player*)this)->GetTransTime();
- *data << (int8)((Player*)this)->GetTransSeat();
}
//TrinIty currently not have support for other than player on transport
}
// 0x02200000
- if((flags2 & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING2)) || (unk_flags & 0x20))
+ if(flags2 & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING2))
{
if(GetTypeId() == TYPEID_PLAYER)
*data << (float)((Player*)this)->m_movementInfo.s_pitch;
@@ -392,7 +384,6 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2)
*data << ((Unit*)this)->GetSpeed( MOVE_FLIGHT );
*data << ((Unit*)this)->GetSpeed( MOVE_FLIGHT_BACK );
*data << ((Unit*)this)->GetSpeed( MOVE_TURN_RATE );
- *data << ((Unit*)this)->GetSpeed( MOVE_PITCH_RATE );
// 0x08000000
if(flags2 & MOVEMENTFLAG_SPLINE2)
@@ -494,7 +485,7 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2)
break;
case TYPEID_PLAYER:
if(flags & UPDATEFLAG_SELF)
- *data << uint32(0x0000002F); // unk, can be 0x15 or 0x22
+ *data << uint32(0x00000015); // unk, can be 0x15 or 0x22
else
*data << uint32(0x00000008); // unk, can be 0x7 or 0x8
break;
@@ -517,15 +508,6 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2)
case TYPEID_CORPSE:
*data << uint32(GetGUIDHigh()); // GetGUIDHigh()
break;
- case TYPEID_UNIT:
- *data << uint32(0x0000000B); // unk, can be 0xB or 0xC
- break;
- case TYPEID_PLAYER:
- if(flags & UPDATEFLAG_SELF)
- *data << uint32(0x0000002F); // unk, can be 0x15 or 0x22
- else
- *data << uint32(0x00000008); // unk, can be 0x7 or 0x8
- break;
default:
*data << uint32(0x00000000); // unk
break;
@@ -533,12 +515,9 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2)
}
// 0x4
- if(flags & UPDATEFLAG_HAS_TARGET) // packed guid (current target guid)
+ if(flags & UPDATEFLAG_FULLGUID)
{
- if(Unit *victim = ((Unit*)this)->getVictim())
- data->append(victim->GetPackGUID());
- else
- *data << uint8(0);
+ *data << uint8(0); // packed guid (probably target guid)
}
// 0x2
@@ -546,13 +525,6 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2)
{
*data << uint32(getMSTime()); // ms time
}
-
- // 0x80
- if(flags & UPDATEFLAG_VEHICLE) // unused for now
- {
- *data << uint32(((Vehicle*)this)->GetVehicleId()); // vehicle id
- *data << float(0); // facing adjustment
- }
}
void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask *updateMask, Player *target) const
@@ -568,8 +540,10 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
if ( ((GameObject*)this)->ActivateToQuest(target) || target->isGameMaster())
{
IsActivateToQuest = true;
- updateMask->SetBit(GAMEOBJECT_DYNAMIC);
+ updateMask->SetBit(GAMEOBJECT_DYN_FLAGS);
}
+ if (GetUInt32Value(GAMEOBJECT_ARTKIT))
+ updateMask->SetBit(GAMEOBJECT_ARTKIT);
}
}
else //case UPDATETYPE_VALUES
@@ -580,8 +554,8 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
{
IsActivateToQuest = true;
}
- updateMask->SetBit(GAMEOBJECT_DYNAMIC);
- updateMask->SetBit(GAMEOBJECT_BYTES_1);
+ updateMask->SetBit(GAMEOBJECT_DYN_FLAGS);
+ updateMask->SetBit(GAMEOBJECT_ANIMPROGRESS);
}
}
@@ -598,6 +572,7 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
if( updateMask->GetBit( index ) )
{
// remove custom flag before send
+
if( index == UNIT_NPC_FLAGS )
*data << uint32(m_uint32Values[ index ] & ~(UNIT_NPC_FLAG_GUARD + UNIT_NPC_FLAG_OUTDOORPVP));
// FIXME: Some values at server stored in float format but must be sent to client in uint32 format
@@ -666,7 +641,7 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
if( updateMask->GetBit( index ) )
{
// send in current format (float as float, uint32 as uint32)
- if ( index == GAMEOBJECT_DYNAMIC )
+ if ( index == GAMEOBJECT_DYN_FLAGS )
{
if(IsActivateToQuest )
{
@@ -1118,7 +1093,7 @@ uint32 WorldObject::GetAreaId() const
InstanceData* WorldObject::GetInstanceData()
{
- Map *map = GetMap();
+ Map *map = MapManager::Instance().GetMap(m_mapId, this);
return map->IsDungeon() ? ((InstanceMap*)map)->GetInstanceData() : NULL;
}
@@ -1328,7 +1303,7 @@ namespace Trinity
{
public:
MessageChatLocaleCacheDo(WorldObject const& obj, ChatMsg msgtype, int32 textId, uint32 language, uint64 targetGUID, float dist)
- : i_object(obj), i_msgtype(msgtype), i_textId(textId), i_language(language),
+ : i_object(obj), i_msgtype(msgtype), i_textId(textId), i_language(language),
i_targetGUID(targetGUID), i_dist(dist)
{
}
@@ -1473,7 +1448,7 @@ void WorldObject::BuildHeartBeatMsg(WorldPacket *data) const
data->Initialize(MSG_MOVE_HEARTBEAT, 32);
data->append(GetPackGUID());
*data << uint32(((Unit*)this)->GetUnitMovementFlags()); // movement flags
- *data << uint16(0); // 2.3.0
+ *data << uint8(0); // 2.3.0
*data << getMSTime(); // time
*data << m_positionX;
*data << m_positionY;
@@ -1492,7 +1467,7 @@ void WorldObject::BuildTeleportAckMsg(WorldPacket *data, float x, float y, float
data->append(GetPackGUID());
*data << uint32(0); // this value increments every time
*data << uint32(((Unit*)this)->GetUnitMovementFlags()); // movement flags
- *data << uint16(0); // 2.3.0
+ *data << uint8(0); // 2.3.0
*data << getMSTime(); // time
*data << x;
*data << y;
@@ -1645,4 +1620,4 @@ void WorldObject::GetNearPoint(WorldObject const* searcher, float &x, float &y,
z = GetPositionZ();
UpdateGroundPositionZ(x,y,z);
-}
+} \ No newline at end of file
diff --git a/src/game/ObjectAccessor.cpp b/src/game/ObjectAccessor.cpp
index 4e876d99418..7d51c4c0291 100644
--- a/src/game/ObjectAccessor.cpp
+++ b/src/game/ObjectAccessor.cpp
@@ -134,9 +134,6 @@ ObjectAccessor::GetCreatureOrPet(WorldObject const &u, uint64 guid)
if(Creature *unit = GetPet(guid))
return unit;
- if(Creature *unit = GetVehicle(guid))
- return unit;
-
return GetCreature(u, guid);
}
@@ -354,12 +351,6 @@ ObjectAccessor::GetPet(uint64 guid)
return GetObjectInWorld(guid, (Pet*)NULL);
}
-Vehicle*
-ObjectAccessor::GetVehicle(uint64 guid)
-{
- return GetObjectInWorld(guid, (Vehicle*)NULL);
-}
-
Corpse*
ObjectAccessor::GetCorpseForPlayerGUID(uint64 guid)
{
@@ -611,7 +602,6 @@ template <class T> ZThread::FastMutex HashMapHolder<T>::i_lock;
template class HashMapHolder<Player>;
template class HashMapHolder<Pet>;
-template class HashMapHolder<Vehicle>;
template class HashMapHolder<GameObject>;
template class HashMapHolder<DynamicObject>;
template class HashMapHolder<Creature>;
@@ -619,7 +609,6 @@ template class HashMapHolder<Corpse>;
template Player* ObjectAccessor::GetObjectInWorld<Player>(uint32 mapid, float x, float y, uint64 guid, Player* /*fake*/);
template Pet* ObjectAccessor::GetObjectInWorld<Pet>(uint32 mapid, float x, float y, uint64 guid, Pet* /*fake*/);
-template Vehicle* ObjectAccessor::GetObjectInWorld<Vehicle>(uint32 mapid, float x, float y, uint64 guid, Vehicle* /*fake*/);
template Creature* ObjectAccessor::GetObjectInWorld<Creature>(uint32 mapid, float x, float y, uint64 guid, Creature* /*fake*/);
template Corpse* ObjectAccessor::GetObjectInWorld<Corpse>(uint32 mapid, float x, float y, uint64 guid, Corpse* /*fake*/);
template GameObject* ObjectAccessor::GetObjectInWorld<GameObject>(uint32 mapid, float x, float y, uint64 guid, GameObject* /*fake*/);
diff --git a/src/game/ObjectAccessor.h b/src/game/ObjectAccessor.h
index 2202748cd5a..844a6b49e4d 100644
--- a/src/game/ObjectAccessor.h
+++ b/src/game/ObjectAccessor.h
@@ -33,7 +33,6 @@
#include "GridDefines.h"
#include "Object.h"
#include "Player.h"
-#include "Vehicle.h"
#include <set>
@@ -151,7 +150,6 @@ class TRINITY_DLL_DECL ObjectAccessor : public Trinity::Singleton<ObjectAccessor
static DynamicObject* GetDynamicObject(Unit const &, uint64);
static Corpse* GetCorpse(WorldObject const &u, uint64 guid);
static Pet* GetPet(uint64 guid);
- static Vehicle* GetVehicle(uint64 guid);
static Player* FindPlayer(uint64);
Player* FindPlayerByName(const char *name) ;
diff --git a/src/game/ObjectDefines.h b/src/game/ObjectDefines.h
index 06072cb9917..88840ebd251 100644
--- a/src/game/ObjectDefines.h
+++ b/src/game/ObjectDefines.h
@@ -41,7 +41,6 @@ enum HighGuid
HIGHGUID_TRANSPORT = 0xF120, // blizz F120 (for GAMEOBJECT_TYPE_TRANSPORT)
HIGHGUID_UNIT = 0xF130, // blizz F130
HIGHGUID_PET = 0xF140, // blizz F140
- HIGHGUID_VEHICLE = 0xF150, // blizz F550
HIGHGUID_DYNAMICOBJECT = 0xF100, // blizz F100
HIGHGUID_CORPSE = 0xF101, // blizz F100
HIGHGUID_MO_TRANSPORT = 0x1FC0, // blizz 1FC0 (for GAMEOBJECT_TYPE_MO_TRANSPORT)
@@ -51,7 +50,6 @@ enum HighGuid
#define IS_CREATURE_GUID(Guid) ( GUID_HIPART(Guid) == HIGHGUID_UNIT )
#define IS_PET_GUID(Guid) ( GUID_HIPART(Guid) == HIGHGUID_PET )
-#define IS_VEHICLE_GUID(Guid) ( GUID_HIPART(Guid) == HIGHGUID_VEHICLE )
#define IS_CREATURE_OR_PET_GUID(Guid)( IS_CREATURE_GUID(Guid) || IS_PET_GUID(Guid) )
#define IS_PLAYER_GUID(Guid) ( GUID_HIPART(Guid) == HIGHGUID_PLAYER && Guid!=0 )
#define IS_UNIT_GUID(Guid) ( IS_CREATURE_OR_PET_GUID(Guid) || IS_PLAYER_GUID(Guid) )
@@ -89,7 +87,6 @@ inline bool IsGuidHaveEnPart(uint64 const& guid)
case HIGHGUID_TRANSPORT:
case HIGHGUID_UNIT:
case HIGHGUID_PET:
- case HIGHGUID_VEHICLE:
case HIGHGUID_MO_TRANSPORT:
default:
return true;
@@ -109,7 +106,6 @@ inline char const* GetLogNameForGuid(uint64 guid)
case HIGHGUID_TRANSPORT: return "transport";
case HIGHGUID_UNIT: return "creature";
case HIGHGUID_PET: return "pet";
- case HIGHGUID_VEHICLE: return "vehicle";
case HIGHGUID_DYNAMICOBJECT:return "dynobject";
case HIGHGUID_CORPSE: return "corpse";
case HIGHGUID_MO_TRANSPORT: return "mo_transport";
diff --git a/src/game/ObjectGridLoader.cpp b/src/game/ObjectGridLoader.cpp
index e58ef1d7de5..0e2b6ae329d 100644
--- a/src/game/ObjectGridLoader.cpp
+++ b/src/game/ObjectGridLoader.cpp
@@ -59,7 +59,7 @@ ObjectGridRespawnMover::Visit(CreatureMapType &m)
Creature * c = iter->getSource();
- assert((!c->isPet() || !c->isVehicle()) && "ObjectGridRespawnMover don't must be called for pets");
+ assert(!c->isPet() && "ObjectGridRespawnMover don't must be called for pets");
Cell const& cur_cell = c->GetCurrentCell();
diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp
index add9fa793af..594cfaf0877 100644
--- a/src/game/ObjectMgr.cpp
+++ b/src/game/ObjectMgr.cpp
@@ -116,7 +116,6 @@ ObjectMgr::ObjectMgr()
m_hiCharGuid = 1;
m_hiCreatureGuid = 1;
m_hiPetGuid = 1;
- m_hiVehicleGuid = 1;
m_hiItemGuid = 1;
m_hiGoGuid = 1;
m_hiDoGuid = 1;
@@ -642,22 +641,6 @@ void ObjectMgr::LoadCreatureLocales()
sLog.outString( ">> Loaded %u creature locale strings", mCreatureLocaleMap.size() );
}
-void ObjectMgr::LoadCompletedAchievements()
-{
- QueryResult *result = CharacterDatabase.Query("SELECT achievement FROM character_achievement GROUP BY achievement");
-
- if(!result)
- return;
-
- do
- {
- Field *fields = result->Fetch();
- allCompletedAchievements.insert(fields[0].GetUInt32());
- } while(result->NextRow());
-
- delete result;
-}
-
void ObjectMgr::LoadNpcOptionLocales()
{
mNpcOptionLocaleMap.clear(); // need for reload case
@@ -1020,47 +1003,8 @@ void ObjectMgr::LoadEquipmentTemplates()
{
sEquipmentStorage.Load();
- for(uint32 i=0; i< sEquipmentStorage.MaxEntry; ++i)
- {
- EquipmentInfo const* eqInfo = sEquipmentStorage.LookupEntry<EquipmentInfo>(i);
-
- if(!eqInfo)
- continue;
-
- for(uint8 j=0; j<3; j++)
- {
- if(!eqInfo->equipentry[j])
- continue;
-
- ItemEntry const *dbcitem = sItemStore.LookupEntry(eqInfo->equipentry[j]);
-
- if(!dbcitem)
- {
- sLog.outErrorDb("Unknown item (entry=%u) in creature_equip_template.equipentry%u for entry = %u, forced to 0.", eqInfo->equipentry[j], j+1, i);
- const_cast<EquipmentInfo*>(eqInfo)->equipentry[j] = 0;
- continue;
- }
-
- if(dbcitem->InventoryType != INVTYPE_WEAPON &&
- dbcitem->InventoryType != INVTYPE_SHIELD &&
- dbcitem->InventoryType != INVTYPE_RANGED &&
- dbcitem->InventoryType != INVTYPE_2HWEAPON &&
- dbcitem->InventoryType != INVTYPE_WEAPONMAINHAND &&
- dbcitem->InventoryType != INVTYPE_WEAPONOFFHAND &&
- dbcitem->InventoryType != INVTYPE_HOLDABLE &&
- dbcitem->InventoryType != INVTYPE_THROWN &&
- dbcitem->InventoryType != INVTYPE_RANGEDRIGHT)
- {
- sLog.outErrorDb("Item (entry=%u) in creature_equip_template.equipentry%u for entry = %u is not equipable in a hand, forced to 0.", eqInfo->equipentry[j], j+1, i);
- const_cast<EquipmentInfo*>(eqInfo)->equipentry[j] = 0;
- }
- }
- }
sLog.outString( ">> Loaded %u equipment template", sEquipmentStorage.RecordCount );
sLog.outString();
-
- // This DBC is currently only used for item templates and creature equipments checks.
- sItemStore.Clear();
}
CreatureModelInfo const* ObjectMgr::GetCreatureModelInfo(uint32 modelid)
@@ -1734,7 +1678,7 @@ void ObjectMgr::LoadItemPrototypes()
if(proto->Class >= MAX_ITEM_CLASS)
{
sLog.outErrorDb("Item (Entry: %u) has wrong Class value (%u)",i,proto->Class);
- const_cast<ItemPrototype*>(proto)->Class = ITEM_CLASS_MISC;
+ const_cast<ItemPrototype*>(proto)->Class = ITEM_CLASS_JUNK;
}
if(proto->SubClass >= MaxItemSubclassValues[proto->Class])
@@ -1831,7 +1775,7 @@ void ObjectMgr::LoadItemPrototypes()
}
// special format
- if((proto->Spells[0].SpellId == SPELL_ID_GENERIC_LEARN) || (proto->Spells[0].SpellId == SPELL_ID_GENERIC_LEARN_PET))
+ if(proto->Spells[0].SpellId == SPELL_ID_GENERIC_LEARN)
{
// spell_1
if(proto->Spells[0].SpellTrigger != ITEM_SPELLTRIGGER_ON_USE)
@@ -1868,7 +1812,7 @@ void ObjectMgr::LoadItemPrototypes()
const_cast<ItemPrototype*>(proto)->Spells[1].SpellTrigger = ITEM_SPELLTRIGGER_ON_USE;
}
// allowed only in special format
- else if((proto->Spells[1].SpellId==SPELL_ID_GENERIC_LEARN) || (proto->Spells[1].SpellId==SPELL_ID_GENERIC_LEARN_PET))
+ else if(proto->Spells[1].SpellId==SPELL_ID_GENERIC_LEARN)
{
sLog.outErrorDb("Item (Entry: %u) has broken spell in spellid_%d (%u)",i,1+1,proto->Spells[1].SpellId);
const_cast<ItemPrototype*>(proto)->Spells[0].SpellId = 0;
@@ -1914,7 +1858,7 @@ void ObjectMgr::LoadItemPrototypes()
const_cast<ItemPrototype*>(proto)->Spells[j].SpellId = 0;
}
// allowed only in special format
- else if((proto->Spells[j].SpellId==SPELL_ID_GENERIC_LEARN) || (proto->Spells[j].SpellId==SPELL_ID_GENERIC_LEARN_PET))
+ else if(proto->Spells[j].SpellId==SPELL_ID_GENERIC_LEARN)
{
sLog.outErrorDb("Item (Entry: %u) has broken spell in spellid_%d (%u)",i,j+1,proto->Spells[j].SpellId);
const_cast<ItemPrototype*>(proto)->Spells[j].SpellId = 0;
@@ -1983,6 +1927,9 @@ void ObjectMgr::LoadItemPrototypes()
const_cast<ItemPrototype*>(proto)->FoodType = 0;
}
}
+
+ // this DBC used currently only for check item templates in DB.
+ sItemStore.Clear();
}
void ObjectMgr::LoadAuctionItems()
@@ -2972,31 +2919,31 @@ void ObjectMgr::LoadQuests()
QueryResult *result = WorldDatabase.Query("SELECT entry, Method, ZoneOrSort, SkillOrClass, MinLevel, QuestLevel, Type, RequiredRaces, RequiredSkillValue,"
// 9 10 11 12 13 14 15 16
"RepObjectiveFaction, RepObjectiveValue, RequiredMinRepFaction, RequiredMinRepValue, RequiredMaxRepFaction, RequiredMaxRepValue, SuggestedPlayers, LimitTime,"
- // 17 18 19 20 21 22 23 24 25 26 27 28
- "QuestFlags, SpecialFlags, CharTitleId, PlayersSlain, BonusTalents, PrevQuestId, NextQuestId, ExclusiveGroup, NextQuestInChain, SrcItemId, SrcItemCount, SrcSpell,"
- // 29 30 31 32 33 34 35 36 37 38
+ // 17 18 19 20 21 22 23 24 25 26
+ "QuestFlags, SpecialFlags, CharTitleId, PrevQuestId, NextQuestId, ExclusiveGroup, NextQuestInChain, SrcItemId, SrcItemCount, SrcSpell,"
+ // 27 28 29 30 31 32 33 34 35 36
"Title, Details, Objectives, OfferRewardText, RequestItemsText, EndText, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4,"
- // 39 40 41 42 43 44 45 46
+ // 37 38 39 40 41 42 43 44
"ReqItemId1, ReqItemId2, ReqItemId3, ReqItemId4, ReqItemCount1, ReqItemCount2, ReqItemCount3, ReqItemCount4,"
- // 47 48 49 50 51 52 53 54 55 56 57 58
+ // 45 46 47 48 49 50 51 52 53 54 54 55
"ReqSourceId1, ReqSourceId2, ReqSourceId3, ReqSourceId4, ReqSourceCount1, ReqSourceCount2, ReqSourceCount3, ReqSourceCount4, ReqSourceRef1, ReqSourceRef2, ReqSourceRef3, ReqSourceRef4,"
- // 59 60 61 62 63 64 65 66
+ // 57 58 59 60 61 62 63 64
"ReqCreatureOrGOId1, ReqCreatureOrGOId2, ReqCreatureOrGOId3, ReqCreatureOrGOId4, ReqCreatureOrGOCount1, ReqCreatureOrGOCount2, ReqCreatureOrGOCount3, ReqCreatureOrGOCount4,"
- // 67 68 69 70
+ // 65 66 67 68
"ReqSpellCast1, ReqSpellCast2, ReqSpellCast3, ReqSpellCast4,"
- // 71 72 73 74 75 76
+ // 69 70 71 72 73 74
"RewChoiceItemId1, RewChoiceItemId2, RewChoiceItemId3, RewChoiceItemId4, RewChoiceItemId5, RewChoiceItemId6,"
- // 77 78 79 80 81 82
+ // 75 76 77 78 79 80
"RewChoiceItemCount1, RewChoiceItemCount2, RewChoiceItemCount3, RewChoiceItemCount4, RewChoiceItemCount5, RewChoiceItemCount6,"
- // 83 84 85 86 87 88 89 90
+ // 81 82 83 84 85 86 87 88
"RewItemId1, RewItemId2, RewItemId3, RewItemId4, RewItemCount1, RewItemCount2, RewItemCount3, RewItemCount4,"
- // 91 92 93 94 95 96 97 98 99 100
+ // 89 90 91 92 93 94 95 96 97 98
"RewRepFaction1, RewRepFaction2, RewRepFaction3, RewRepFaction4, RewRepFaction5, RewRepValue1, RewRepValue2, RewRepValue3, RewRepValue4, RewRepValue5,"
- // 101 102 103 104 105 106 107 108 109 110 111
+ // 99 100 101 102 103 104 105 106 107 108 109
"RewHonorableKills, RewOrReqMoney, RewMoneyMaxLevel, RewSpell, RewSpellCast, RewMailTemplateId, RewMailDelaySecs, PointMapId, PointX, PointY, PointOpt,"
- // 112 113 114 115 116 117 118 119 120 121
+ // 110 111 112 113 114 115 116 117 118 119
"DetailsEmote1, DetailsEmote2, DetailsEmote3, DetailsEmote4,IncompleteEmote, CompleteEmote, OfferRewardEmote1, OfferRewardEmote2, OfferRewardEmote3, OfferRewardEmote4,"
- // 122 123
+ // 120 121
"StartScript, CompleteScript"
" FROM quest_template");
if(result == NULL)
@@ -4829,19 +4776,17 @@ uint16 ObjectMgr::GetTaxiMount( uint32 id, uint32 team )
TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(id);
if(node)
{
- if (team == ALLIANCE)
- {
- mount_entry = node->MountCreatureID[1];
- CreatureInfo const *ci = GetCreatureTemplate(mount_entry);
- if(ci)
- mount_id = ci->Modelid1;
- }
- if (team == HORDE)
+ if (team == ALLIANCE) mount_entry = node->alliance_mount_type;
+ else mount_entry = node->horde_mount_type;
+
+ CreatureInfo const *cinfo = GetCreatureTemplate(mount_entry);
+ if (cinfo)
{
- mount_entry = node->MountCreatureID[0];
- CreatureInfo const *ci = GetCreatureTemplate(mount_entry);
- if(ci)
- mount_id = ci->Modelid3;
+ if(! (mount_id = cinfo->GetRandomValidModelId()))
+ {
+ sLog.outErrorDb("No displayid found for the taxi mount with the entry %u! Can't load it!", mount_entry);
+ return false;
+ }
}
}
@@ -5320,8 +5265,6 @@ void ObjectMgr::SetHighestGuids()
// pet guids are not saved to DB, set to 0 (pet guid != pet id)
m_hiPetGuid = 0;
- // same for vehicles
- m_hiVehicleGuid = 0;
result = CharacterDatabase.Query( "SELECT MAX(guid) FROM item_instance" );
if( result )
@@ -5475,14 +5418,6 @@ uint32 ObjectMgr::GenerateLowGuid(HighGuid guidhigh)
World::StopNow(ERROR_EXIT_CODE);
}
return m_hiPetGuid++;
- case HIGHGUID_VEHICLE:
- ++m_hiVehicleGuid;
- if(m_hiVehicleGuid>=0x00FFFFFF)
- {
- sLog.outError("Vehicle guid overflow!! Can't continue, shutting down server. ");
- World::StopNow(ERROR_EXIT_CODE);
- }
- return m_hiVehicleGuid++;
case HIGHGUID_PLAYER:
if(m_hiCharGuid>=0xFFFFFFFE)
{
@@ -6445,23 +6380,6 @@ int ObjectMgr::GetOrNewIndexForLocale( LocaleConstant loc )
return m_LocalForIndex.size()-1;
}
-AchievementCriteriaEntryList const& ObjectMgr::GetAchievementCriteriaByType(AchievementCriteriaTypes type)
-{
- return m_AchievementCriteriasByType[type];
-}
-
-void ObjectMgr::LoadAchievementCriteriaList()
-{
- for (uint32 entryId = 0; entryId<sAchievementCriteriaStore.GetNumRows(); entryId++)
- {
- AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(entryId);
- if(!criteria)
- continue;
-
- m_AchievementCriteriasByType[criteria->requiredType].push_back(criteria);
- }
-}
-
void ObjectMgr::LoadBattleMastersEntry()
{
mBattleMastersMap.clear(); // need for reload case
@@ -6838,7 +6756,7 @@ bool PlayerCondition::Meets(Player const * player) const
{
Unit::AuraMap const& auras = player->GetAuras();
for(Unit::AuraMap::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
- if((itr->second->GetSpellProto()->Attributes & 0x1000010) && itr->second->GetSpellProto()->SpellVisual[0]==3580)
+ if((itr->second->GetSpellProto()->Attributes & 0x1000010) && itr->second->GetSpellProto()->SpellVisual==3580)
return true;
return false;
}
@@ -7015,7 +6933,7 @@ SkillRangeType GetSkillRangeType(SkillLineEntry const *pSkill, bool racial)
return SKILL_RANGE_MONO;
case SKILL_CATEGORY_ARMOR:
case SKILL_CATEGORY_CLASS:
- if(pSkill->id != SKILL_LOCKPICKING)
+ if(pSkill->id != SKILL_POISONS && pSkill->id != SKILL_LOCKPICKING)
return SKILL_RANGE_MONO;
else
return SKILL_RANGE_LEVEL;
@@ -7030,7 +6948,7 @@ SkillRangeType GetSkillRangeType(SkillLineEntry const *pSkill, bool racial)
return SKILL_RANGE_MONO;
default:
case SKILL_CATEGORY_ATTRIBUTES: //not found in dbc
- case SKILL_CATEGORY_GENERIC: //only GENERIC(DND)
+ case SKILL_CATEGORY_NOT_DISPLAYED: //only GENEREC(DND)
return SKILL_RANGE_NONE;
}
}
diff --git a/src/game/ObjectMgr.h b/src/game/ObjectMgr.h
index ccb3884b163..4a35f98b679 100644
--- a/src/game/ObjectMgr.h
+++ b/src/game/ObjectMgr.h
@@ -264,8 +264,6 @@ typedef std::list<GossipOption> CacheNpcOptionList;
typedef UNORDERED_MAP<uint32, VendorItemData> CacheVendorItemMap;
typedef UNORDERED_MAP<uint32, TrainerSpellData> CacheTrainerSpellMap;
-typedef std::list<const AchievementCriteriaEntry*> AchievementCriteriaEntryList;
-
enum SkillRangeType
{
SKILL_RANGE_LANGUAGE, // 300..300
@@ -590,7 +588,6 @@ class ObjectMgr
void LoadNpcTextId();
void LoadVendors();
void LoadTrainerSpell();
- void LoadCompletedAchievements();
std::string GeneratePetName(uint32 entry);
uint32 GetBaseXP(uint32 level);
@@ -804,10 +801,6 @@ class ObjectMgr
bool RemoveVendorItem(uint32 entry,uint32 item, bool savetodb = true); // for event
bool IsVendorItemValid( uint32 vendor_entry, uint32 item, uint32 maxcount, uint32 ptime, uint32 ExtendedCost, Player* pl = NULL, std::set<uint32>* skip_vendors = NULL, uint32 ORnpcflag = 0 ) const;
- void LoadAchievementCriteriaList();
- AchievementCriteriaEntryList const& GetAchievementCriteriaByType(AchievementCriteriaTypes type);
- std::set<uint32> allCompletedAchievements;
-
void LoadScriptNames();
ScriptNameMap &GetScriptNames() { return m_scriptNames; }
const char * GetScriptName(uint32 id) { return id < m_scriptNames.size() ? m_scriptNames[id].c_str() : ""; }
@@ -826,7 +819,6 @@ class ObjectMgr
uint32 m_hiCharGuid;
uint32 m_hiCreatureGuid;
uint32 m_hiPetGuid;
- uint32 m_hiVehicleGuid;
uint32 m_hiItemGuid;
uint32 m_hiGoGuid;
uint32 m_hiDoGuid;
@@ -937,9 +929,6 @@ class ObjectMgr
CacheNpcTextIdMap m_mCacheNpcTextIdMap;
CacheVendorItemMap m_mCacheVendorItemMap;
CacheTrainerSpellMap m_mCacheTrainerSpellMap;
-
- // store achievement criterias by type to speed up lookup
- AchievementCriteriaEntryList m_AchievementCriteriasByType[ACHIEVEMENT_CRITERIA_TYPE_TOTAL];
};
#define objmgr Trinity::Singleton<ObjectMgr>::Instance()
diff --git a/src/game/Opcodes.cpp b/src/game/Opcodes.cpp
index 2120c5dae70..57c3c0ca879 100644
--- a/src/game/Opcodes.cpp
+++ b/src/game/Opcodes.cpp
@@ -28,1194 +28,1064 @@
/// Correspondence between opcodes and their names
OpcodeHandler opcodeTable[NUM_MSG_TYPES] =
{
- /*0x000*/ { "MSG_NULL_ACTION", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x001*/ { "CMSG_BOOTME", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x002*/ { "CMSG_DBLOOKUP", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x003*/ { "SMSG_DBLOOKUP", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x004*/ { "CMSG_QUERY_OBJECT_POSITION", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x005*/ { "SMSG_QUERY_OBJECT_POSITION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x006*/ { "CMSG_QUERY_OBJECT_ROTATION", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x007*/ { "SMSG_QUERY_OBJECT_ROTATION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x008*/ { "CMSG_WORLD_TELEPORT", STATUS_LOGGEDIN, &WorldSession::HandleWorldTeleportOpcode },
- /*0x009*/ { "CMSG_TELEPORT_TO_UNIT", STATUS_LOGGEDIN, &WorldSession::Handle_NULL },
- /*0x00A*/ { "CMSG_ZONE_MAP", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x00B*/ { "SMSG_ZONE_MAP", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x00C*/ { "CMSG_DEBUG_CHANGECELLZONE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x00D*/ { "CMSG_MOVE_CHARACTER_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x00E*/ { "SMSG_MOVE_CHARACTER_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x00F*/ { "CMSG_RECHARGE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x010*/ { "CMSG_LEARN_SPELL", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x011*/ { "CMSG_CREATEMONSTER", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x012*/ { "CMSG_DESTROYMONSTER", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x013*/ { "CMSG_CREATEITEM", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x014*/ { "CMSG_CREATEGAMEOBJECT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x015*/ { "SMSG_CHECK_FOR_BOTS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x016*/ { "CMSG_MAKEMONSTERATTACKGUID", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x017*/ { "CMSG_BOT_DETECTED2", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x018*/ { "CMSG_FORCEACTION", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x019*/ { "CMSG_FORCEACTIONONOTHER", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x01A*/ { "CMSG_FORCEACTIONSHOW", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x01B*/ { "SMSG_FORCEACTIONSHOW", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x01C*/ { "CMSG_PETGODMODE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x01D*/ { "SMSG_PETGODMODE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x01E*/ { "SMSG_REFER_A_FRIEND_EXPIRED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x01F*/ { "CMSG_WEATHER_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x020*/ { "CMSG_UNDRESSPLAYER", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x021*/ { "CMSG_BEASTMASTER", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x022*/ { "CMSG_GODMODE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x023*/ { "SMSG_GODMODE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x024*/ { "CMSG_CHEAT_SETMONEY", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x025*/ { "CMSG_LEVEL_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x026*/ { "CMSG_PET_LEVEL_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x027*/ { "CMSG_SET_WORLDSTATE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x028*/ { "CMSG_COOLDOWN_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x029*/ { "CMSG_USE_SKILL_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x02A*/ { "CMSG_FLAG_QUEST", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x02B*/ { "CMSG_FLAG_QUEST_FINISH", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x02C*/ { "CMSG_CLEAR_QUEST", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x02D*/ { "CMSG_SEND_EVENT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x02E*/ { "CMSG_DEBUG_AISTATE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x02F*/ { "SMSG_DEBUG_AISTATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x030*/ { "CMSG_DISABLE_PVP_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x031*/ { "CMSG_ADVANCE_SPAWN_TIME", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x032*/ { "SMSG_DESTRUCTIBLE_BUILDING_DAMAGE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x033*/ { "CMSG_AUTH_SRP6_BEGIN", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x034*/ { "CMSG_AUTH_SRP6_PROOF", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x035*/ { "CMSG_AUTH_SRP6_RECODE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x036*/ { "CMSG_CHAR_CREATE", STATUS_AUTHED, &WorldSession::HandleCharCreateOpcode },
- /*0x037*/ { "CMSG_CHAR_ENUM", STATUS_AUTHED, &WorldSession::HandleCharEnumOpcode },
- /*0x038*/ { "CMSG_CHAR_DELETE", STATUS_AUTHED, &WorldSession::HandleCharDeleteOpcode },
- /*0x039*/ { "SMSG_AUTH_SRP6_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x03A*/ { "SMSG_CHAR_CREATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x03B*/ { "SMSG_CHAR_ENUM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x03C*/ { "SMSG_CHAR_DELETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x03D*/ { "CMSG_PLAYER_LOGIN", STATUS_AUTHED, &WorldSession::HandlePlayerLoginOpcode },
- /*0x03E*/ { "SMSG_NEW_WORLD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x03F*/ { "SMSG_TRANSFER_PENDING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x040*/ { "SMSG_TRANSFER_ABORTED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x041*/ { "SMSG_CHARACTER_LOGIN_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x042*/ { "SMSG_LOGIN_SETTIMESPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x043*/ { "SMSG_GAMETIME_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x044*/ { "CMSG_GAMETIME_SET", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x045*/ { "SMSG_GAMETIME_SET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x046*/ { "CMSG_GAMESPEED_SET", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x047*/ { "SMSG_GAMESPEED_SET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x048*/ { "CMSG_SERVERTIME", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x049*/ { "SMSG_SERVERTIME", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x04A*/ { "CMSG_PLAYER_LOGOUT", STATUS_LOGGEDIN, &WorldSession::HandlePlayerLogoutOpcode },
- /*0x04B*/ { "CMSG_LOGOUT_REQUEST", STATUS_LOGGEDIN, &WorldSession::HandleLogoutRequestOpcode },
- /*0x04C*/ { "SMSG_LOGOUT_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x04D*/ { "SMSG_LOGOUT_COMPLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x04E*/ { "CMSG_LOGOUT_CANCEL", STATUS_LOGGEDIN, &WorldSession::HandleLogoutCancelOpcode },
- /*0x04F*/ { "SMSG_LOGOUT_CANCEL_ACK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x050*/ { "CMSG_NAME_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleNameQueryOpcode },
- /*0x051*/ { "SMSG_NAME_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x052*/ { "CMSG_PET_NAME_QUERY", STATUS_LOGGEDIN, &WorldSession::HandlePetNameQuery },
- /*0x053*/ { "SMSG_PET_NAME_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x054*/ { "CMSG_GUILD_QUERY", STATUS_AUTHED, &WorldSession::HandleGuildQueryOpcode },
- /*0x055*/ { "SMSG_GUILD_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x056*/ { "CMSG_ITEM_QUERY_SINGLE", STATUS_LOGGEDIN, &WorldSession::HandleItemQuerySingleOpcode },
- /*0x057*/ { "CMSG_ITEM_QUERY_MULTIPLE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x058*/ { "SMSG_ITEM_QUERY_SINGLE_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x059*/ { "SMSG_ITEM_QUERY_MULTIPLE_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x05A*/ { "CMSG_PAGE_TEXT_QUERY", STATUS_LOGGEDIN, &WorldSession::HandlePageQueryOpcode },
- /*0x05B*/ { "SMSG_PAGE_TEXT_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x05C*/ { "CMSG_QUEST_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleQuestQueryOpcode },
- /*0x05D*/ { "SMSG_QUEST_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x05E*/ { "CMSG_GAMEOBJECT_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleGameObjectQueryOpcode },
- /*0x05F*/ { "SMSG_GAMEOBJECT_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x060*/ { "CMSG_CREATURE_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleCreatureQueryOpcode },
- /*0x061*/ { "SMSG_CREATURE_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x062*/ { "CMSG_WHO", STATUS_LOGGEDIN, &WorldSession::HandleWhoOpcode },
- /*0x063*/ { "SMSG_WHO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x064*/ { "CMSG_WHOIS", STATUS_LOGGEDIN, &WorldSession::HandleWhoisOpcode },
- /*0x065*/ { "SMSG_WHOIS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x066*/ { "CMSG_CONTACT_LIST", STATUS_LOGGEDIN, &WorldSession::HandleFriendListOpcode },
- /*0x067*/ { "SMSG_CONTACT_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x068*/ { "SMSG_FRIEND_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x069*/ { "CMSG_ADD_FRIEND", STATUS_LOGGEDIN, &WorldSession::HandleAddFriendOpcode },
- /*0x06A*/ { "CMSG_DEL_FRIEND", STATUS_LOGGEDIN, &WorldSession::HandleDelFriendOpcode },
- /*0x06B*/ { "CMSG_SET_CONTACT_NOTES", STATUS_LOGGEDIN, &WorldSession::HandleSetFriendNoteOpcode },
- /*0x06C*/ { "CMSG_ADD_IGNORE", STATUS_LOGGEDIN, &WorldSession::HandleAddIgnoreOpcode },
- /*0x06D*/ { "CMSG_DEL_IGNORE", STATUS_LOGGEDIN, &WorldSession::HandleDelIgnoreOpcode },
- /*0x06E*/ { "CMSG_GROUP_INVITE", STATUS_LOGGEDIN, &WorldSession::HandleGroupInviteOpcode },
- /*0x06F*/ { "SMSG_GROUP_INVITE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x070*/ { "CMSG_GROUP_CANCEL", STATUS_LOGGEDIN, &WorldSession::Handle_Deprecated },
- /*0x071*/ { "SMSG_GROUP_CANCEL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x072*/ { "CMSG_GROUP_ACCEPT", STATUS_LOGGEDIN, &WorldSession::HandleGroupAcceptOpcode },
- /*0x073*/ { "CMSG_GROUP_DECLINE", STATUS_LOGGEDIN, &WorldSession::HandleGroupDeclineOpcode },
- /*0x074*/ { "SMSG_GROUP_DECLINE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x075*/ { "CMSG_GROUP_UNINVITE", STATUS_LOGGEDIN, &WorldSession::HandleGroupUninviteNameOpcode },
- /*0x076*/ { "CMSG_GROUP_UNINVITE_GUID", STATUS_LOGGEDIN, &WorldSession::HandleGroupUninviteGuidOpcode },
- /*0x077*/ { "SMSG_GROUP_UNINVITE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x078*/ { "CMSG_GROUP_SET_LEADER", STATUS_LOGGEDIN, &WorldSession::HandleGroupSetLeaderOpcode },
- /*0x079*/ { "SMSG_GROUP_SET_LEADER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x07A*/ { "CMSG_LOOT_METHOD", STATUS_LOGGEDIN, &WorldSession::HandleLootMethodOpcode },
- /*0x07B*/ { "CMSG_GROUP_DISBAND", STATUS_LOGGEDIN, &WorldSession::HandleGroupLeaveOpcode },
- /*0x07C*/ { "SMSG_GROUP_DESTROYED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x07D*/ { "SMSG_GROUP_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x07E*/ { "SMSG_PARTY_MEMBER_STATS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x07F*/ { "SMSG_PARTY_COMMAND_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x080*/ { "UMSG_UPDATE_GROUP_MEMBERS", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x081*/ { "CMSG_GUILD_CREATE", STATUS_LOGGEDIN, &WorldSession::HandleGuildCreateOpcode },
- /*0x082*/ { "CMSG_GUILD_INVITE", STATUS_LOGGEDIN, &WorldSession::HandleGuildInviteOpcode },
- /*0x083*/ { "SMSG_GUILD_INVITE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x084*/ { "CMSG_GUILD_ACCEPT", STATUS_LOGGEDIN, &WorldSession::HandleGuildAcceptOpcode },
- /*0x085*/ { "CMSG_GUILD_DECLINE", STATUS_LOGGEDIN, &WorldSession::HandleGuildDeclineOpcode },
- /*0x086*/ { "SMSG_GUILD_DECLINE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x087*/ { "CMSG_GUILD_INFO", STATUS_LOGGEDIN, &WorldSession::HandleGuildInfoOpcode },
- /*0x088*/ { "SMSG_GUILD_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x089*/ { "CMSG_GUILD_ROSTER", STATUS_LOGGEDIN, &WorldSession::HandleGuildRosterOpcode },
- /*0x08A*/ { "SMSG_GUILD_ROSTER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x08B*/ { "CMSG_GUILD_PROMOTE", STATUS_LOGGEDIN, &WorldSession::HandleGuildPromoteOpcode },
- /*0x08C*/ { "CMSG_GUILD_DEMOTE", STATUS_LOGGEDIN, &WorldSession::HandleGuildDemoteOpcode },
- /*0x08D*/ { "CMSG_GUILD_LEAVE", STATUS_LOGGEDIN, &WorldSession::HandleGuildLeaveOpcode },
- /*0x08E*/ { "CMSG_GUILD_REMOVE", STATUS_LOGGEDIN, &WorldSession::HandleGuildRemoveOpcode },
- /*0x08F*/ { "CMSG_GUILD_DISBAND", STATUS_LOGGEDIN, &WorldSession::HandleGuildDisbandOpcode },
- /*0x090*/ { "CMSG_GUILD_LEADER", STATUS_LOGGEDIN, &WorldSession::HandleGuildLeaderOpcode },
- /*0x091*/ { "CMSG_GUILD_MOTD", STATUS_LOGGEDIN, &WorldSession::HandleGuildMOTDOpcode },
- /*0x092*/ { "SMSG_GUILD_EVENT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x093*/ { "SMSG_GUILD_COMMAND_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x094*/ { "UMSG_UPDATE_GUILD", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x095*/ { "CMSG_MESSAGECHAT", STATUS_LOGGEDIN, &WorldSession::HandleMessagechatOpcode },
- /*0x096*/ { "SMSG_MESSAGECHAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x097*/ { "CMSG_JOIN_CHANNEL", STATUS_LOGGEDIN, &WorldSession::HandleChannelJoin },
- /*0x098*/ { "CMSG_LEAVE_CHANNEL", STATUS_LOGGEDIN, &WorldSession::HandleChannelLeave },
- /*0x099*/ { "SMSG_CHANNEL_NOTIFY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x09A*/ { "CMSG_CHANNEL_LIST", STATUS_LOGGEDIN, &WorldSession::HandleChannelList },
- /*0x09B*/ { "SMSG_CHANNEL_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x09C*/ { "CMSG_CHANNEL_PASSWORD", STATUS_LOGGEDIN, &WorldSession::HandleChannelPassword },
- /*0x09D*/ { "CMSG_CHANNEL_SET_OWNER", STATUS_LOGGEDIN, &WorldSession::HandleChannelSetOwner },
- /*0x09E*/ { "CMSG_CHANNEL_OWNER", STATUS_LOGGEDIN, &WorldSession::HandleChannelOwner },
- /*0x09F*/ { "CMSG_CHANNEL_MODERATOR", STATUS_LOGGEDIN, &WorldSession::HandleChannelModerator },
- /*0x0A0*/ { "CMSG_CHANNEL_UNMODERATOR", STATUS_LOGGEDIN, &WorldSession::HandleChannelUnmoderator },
- /*0x0A1*/ { "CMSG_CHANNEL_MUTE", STATUS_LOGGEDIN, &WorldSession::HandleChannelMute },
- /*0x0A2*/ { "CMSG_CHANNEL_UNMUTE", STATUS_LOGGEDIN, &WorldSession::HandleChannelUnmute },
- /*0x0A3*/ { "CMSG_CHANNEL_INVITE", STATUS_LOGGEDIN, &WorldSession::HandleChannelInvite },
- /*0x0A4*/ { "CMSG_CHANNEL_KICK", STATUS_LOGGEDIN, &WorldSession::HandleChannelKick },
- /*0x0A5*/ { "CMSG_CHANNEL_BAN", STATUS_LOGGEDIN, &WorldSession::HandleChannelBan },
- /*0x0A6*/ { "CMSG_CHANNEL_UNBAN", STATUS_LOGGEDIN, &WorldSession::HandleChannelUnban },
- /*0x0A7*/ { "CMSG_CHANNEL_ANNOUNCEMENTS", STATUS_LOGGEDIN, &WorldSession::HandleChannelAnnounce },
- /*0x0A8*/ { "CMSG_CHANNEL_MODERATE", STATUS_LOGGEDIN, &WorldSession::HandleChannelModerate },
- /*0x0A9*/ { "SMSG_UPDATE_OBJECT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0AA*/ { "SMSG_DESTROY_OBJECT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0AB*/ { "CMSG_USE_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleUseItemOpcode },
- /*0x0AC*/ { "CMSG_OPEN_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleOpenItemOpcode },
- /*0x0AD*/ { "CMSG_READ_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleReadItem },
- /*0x0AE*/ { "SMSG_READ_ITEM_OK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0AF*/ { "SMSG_READ_ITEM_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0B0*/ { "SMSG_ITEM_COOLDOWN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0B1*/ { "CMSG_GAMEOBJ_USE", STATUS_LOGGEDIN, &WorldSession::HandleGameObjectUseOpcode },
- /*0x0B2*/ { "CMSG_DESTROY_ITEMS", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0B3*/ { "SMSG_GAMEOBJECT_CUSTOM_ANIM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0B4*/ { "CMSG_AREATRIGGER", STATUS_LOGGEDIN, &WorldSession::HandleAreaTriggerOpcode },
- /*0x0B5*/ { "MSG_MOVE_START_FORWARD", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0B6*/ { "MSG_MOVE_START_BACKWARD", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0B7*/ { "MSG_MOVE_STOP", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0B8*/ { "MSG_MOVE_START_STRAFE_LEFT", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0B9*/ { "MSG_MOVE_START_STRAFE_RIGHT", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0BA*/ { "MSG_MOVE_STOP_STRAFE", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0BB*/ { "MSG_MOVE_JUMP", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0BC*/ { "MSG_MOVE_START_TURN_LEFT", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0BD*/ { "MSG_MOVE_START_TURN_RIGHT", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0BE*/ { "MSG_MOVE_STOP_TURN", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0BF*/ { "MSG_MOVE_START_PITCH_UP", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0C0*/ { "MSG_MOVE_START_PITCH_DOWN", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0C1*/ { "MSG_MOVE_STOP_PITCH", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0C2*/ { "MSG_MOVE_SET_RUN_MODE", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0C3*/ { "MSG_MOVE_SET_WALK_MODE", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0C4*/ { "MSG_MOVE_TOGGLE_LOGGING", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0C5*/ { "MSG_MOVE_TELEPORT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0C6*/ { "MSG_MOVE_TELEPORT_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0C7*/ { "MSG_MOVE_TELEPORT_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveTeleportAck },
- /*0x0C8*/ { "MSG_MOVE_TOGGLE_FALL_LOGGING", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0C9*/ { "MSG_MOVE_FALL_LAND", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0CA*/ { "MSG_MOVE_START_SWIM", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0CB*/ { "MSG_MOVE_STOP_SWIM", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0CC*/ { "MSG_MOVE_SET_RUN_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0CD*/ { "MSG_MOVE_SET_RUN_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0CE*/ { "MSG_MOVE_SET_RUN_BACK_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0CF*/ { "MSG_MOVE_SET_RUN_BACK_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0D0*/ { "MSG_MOVE_SET_WALK_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0D1*/ { "MSG_MOVE_SET_WALK_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0D2*/ { "MSG_MOVE_SET_SWIM_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0D3*/ { "MSG_MOVE_SET_SWIM_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0D4*/ { "MSG_MOVE_SET_SWIM_BACK_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0D5*/ { "MSG_MOVE_SET_SWIM_BACK_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0D6*/ { "MSG_MOVE_SET_ALL_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0D7*/ { "MSG_MOVE_SET_TURN_RATE_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0D8*/ { "MSG_MOVE_SET_TURN_RATE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0D9*/ { "MSG_MOVE_TOGGLE_COLLISION_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0DA*/ { "MSG_MOVE_SET_FACING", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0DB*/ { "MSG_MOVE_SET_PITCH", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0DC*/ { "MSG_MOVE_WORLDPORT_ACK", STATUS_TRANSFER_PENDING,&WorldSession::HandleMoveWorldportAckOpcode},
- /*0x0DD*/ { "SMSG_MONSTER_MOVE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0DE*/ { "SMSG_MOVE_WATER_WALK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0DF*/ { "SMSG_MOVE_LAND_WALK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0E0*/ { "MSG_MOVE_SET_RAW_POSITION_ACK", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0E1*/ { "CMSG_MOVE_SET_RAW_POSITION", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0E2*/ { "SMSG_FORCE_RUN_SPEED_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0E3*/ { "CMSG_FORCE_RUN_SPEED_CHANGE_ACK", STATUS_LOGGEDIN, &WorldSession::HandleForceSpeedChangeAck },
- /*0x0E4*/ { "SMSG_FORCE_RUN_BACK_SPEED_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0E5*/ { "CMSG_FORCE_RUN_BACK_SPEED_CHANGE_ACK", STATUS_LOGGEDIN, &WorldSession::HandleForceSpeedChangeAck },
- /*0x0E6*/ { "SMSG_FORCE_SWIM_SPEED_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0E7*/ { "CMSG_FORCE_SWIM_SPEED_CHANGE_ACK", STATUS_LOGGEDIN, &WorldSession::HandleForceSpeedChangeAck },
- /*0x0E8*/ { "SMSG_FORCE_MOVE_ROOT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0E9*/ { "CMSG_FORCE_MOVE_ROOT_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveRootAck },
- /*0x0EA*/ { "SMSG_FORCE_MOVE_UNROOT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0EB*/ { "CMSG_FORCE_MOVE_UNROOT_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveUnRootAck },
- /*0x0EC*/ { "MSG_MOVE_ROOT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0ED*/ { "MSG_MOVE_UNROOT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0EE*/ { "MSG_MOVE_HEARTBEAT", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x0EF*/ { "SMSG_MOVE_KNOCK_BACK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0F0*/ { "CMSG_MOVE_KNOCK_BACK_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveKnockBackAck },
- /*0x0F1*/ { "MSG_MOVE_KNOCK_BACK", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0F2*/ { "SMSG_MOVE_FEATHER_FALL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0F3*/ { "SMSG_MOVE_NORMAL_FALL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0F4*/ { "SMSG_MOVE_SET_HOVER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0F5*/ { "SMSG_MOVE_UNSET_HOVER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0F6*/ { "CMSG_MOVE_HOVER_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveHoverAck },
- /*0x0F7*/ { "MSG_MOVE_HOVER", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0F8*/ { "CMSG_TRIGGER_CINEMATIC_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0F9*/ { "CMSG_OPENING_CINEMATIC", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x0FA*/ { "SMSG_TRIGGER_CINEMATIC", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0FB*/ { "CMSG_NEXT_CINEMATIC_CAMERA", STATUS_LOGGEDIN, &WorldSession::HandleNextCinematicCamera },
- /*0x0FC*/ { "CMSG_COMPLETE_CINEMATIC", STATUS_LOGGEDIN, &WorldSession::HandleCompleteCinema },
- /*0x0FD*/ { "SMSG_TUTORIAL_FLAGS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x0FE*/ { "CMSG_TUTORIAL_FLAG", STATUS_LOGGEDIN, &WorldSession::HandleTutorialFlag },
- /*0x0FF*/ { "CMSG_TUTORIAL_CLEAR", STATUS_LOGGEDIN, &WorldSession::HandleTutorialClear },
- /*0x100*/ { "CMSG_TUTORIAL_RESET", STATUS_LOGGEDIN, &WorldSession::HandleTutorialReset },
- /*0x101*/ { "CMSG_STANDSTATECHANGE", STATUS_LOGGEDIN, &WorldSession::HandleStandStateChangeOpcode },
- /*0x102*/ { "CMSG_EMOTE", STATUS_LOGGEDIN, &WorldSession::HandleEmoteOpcode },
- /*0x103*/ { "SMSG_EMOTE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x104*/ { "CMSG_TEXT_EMOTE", STATUS_LOGGEDIN, &WorldSession::HandleTextEmoteOpcode },
- /*0x105*/ { "SMSG_TEXT_EMOTE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x106*/ { "CMSG_AUTOEQUIP_GROUND_ITEM", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x107*/ { "CMSG_AUTOSTORE_GROUND_ITEM", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x108*/ { "CMSG_AUTOSTORE_LOOT_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAutostoreLootItemOpcode },
- /*0x109*/ { "CMSG_STORE_LOOT_IN_SLOT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x10A*/ { "CMSG_AUTOEQUIP_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAutoEquipItemOpcode },
- /*0x10B*/ { "CMSG_AUTOSTORE_BAG_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAutoStoreBagItemOpcode },
- /*0x10C*/ { "CMSG_SWAP_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleSwapItem },
- /*0x10D*/ { "CMSG_SWAP_INV_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleSwapInvItemOpcode },
- /*0x10E*/ { "CMSG_SPLIT_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleSplitItemOpcode },
- /*0x10F*/ { "CMSG_AUTOEQUIP_ITEM_SLOT", STATUS_LOGGEDIN, &WorldSession::HandleAutoEquipItemSlotOpcode },
- /*0x110*/ { "OBSOLETE_DROP_ITEM", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x111*/ { "CMSG_DESTROYITEM", STATUS_LOGGEDIN, &WorldSession::HandleDestroyItemOpcode },
- /*0x112*/ { "SMSG_INVENTORY_CHANGE_FAILURE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x113*/ { "SMSG_OPEN_CONTAINER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x114*/ { "CMSG_INSPECT", STATUS_LOGGEDIN, &WorldSession::HandleInspectOpcode },
- /*0x115*/ { "SMSG_INSPECT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x116*/ { "CMSG_INITIATE_TRADE", STATUS_LOGGEDIN, &WorldSession::HandleInitiateTradeOpcode },
- /*0x117*/ { "CMSG_BEGIN_TRADE", STATUS_LOGGEDIN, &WorldSession::HandleBeginTradeOpcode },
- /*0x118*/ { "CMSG_BUSY_TRADE", STATUS_LOGGEDIN, &WorldSession::HandleBusyTradeOpcode },
- /*0x119*/ { "CMSG_IGNORE_TRADE", STATUS_LOGGEDIN, &WorldSession::HandleIgnoreTradeOpcode },
- /*0x11A*/ { "CMSG_ACCEPT_TRADE", STATUS_LOGGEDIN, &WorldSession::HandleAcceptTradeOpcode },
- /*0x11B*/ { "CMSG_UNACCEPT_TRADE", STATUS_LOGGEDIN, &WorldSession::HandleUnacceptTradeOpcode },
- /*0x11C*/ { "CMSG_CANCEL_TRADE", STATUS_AUTHED, &WorldSession::HandleCancelTradeOpcode },
- /*0x11D*/ { "CMSG_SET_TRADE_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleSetTradeItemOpcode },
- /*0x11E*/ { "CMSG_CLEAR_TRADE_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleClearTradeItemOpcode },
- /*0x11F*/ { "CMSG_SET_TRADE_GOLD", STATUS_LOGGEDIN, &WorldSession::HandleSetTradeGoldOpcode },
- /*0x120*/ { "SMSG_TRADE_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x121*/ { "SMSG_TRADE_STATUS_EXTENDED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x122*/ { "SMSG_INITIALIZE_FACTIONS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x123*/ { "SMSG_SET_FACTION_VISIBLE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x124*/ { "SMSG_SET_FACTION_STANDING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x125*/ { "CMSG_SET_FACTION_ATWAR", STATUS_LOGGEDIN, &WorldSession::HandleSetFactionAtWar },
- /*0x126*/ { "CMSG_SET_FACTION_CHEAT", STATUS_LOGGEDIN, &WorldSession::HandleSetFactionCheat },
- /*0x127*/ { "SMSG_SET_PROFICIENCY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x128*/ { "CMSG_SET_ACTION_BUTTON", STATUS_LOGGEDIN, &WorldSession::HandleSetActionButtonOpcode },
- /*0x129*/ { "SMSG_ACTION_BUTTONS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x12A*/ { "SMSG_INITIAL_SPELLS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x12B*/ { "SMSG_LEARNED_SPELL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x12C*/ { "SMSG_SUPERCEDED_SPELL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x12D*/ { "CMSG_NEW_SPELL_SLOT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x12E*/ { "CMSG_CAST_SPELL", STATUS_LOGGEDIN, &WorldSession::HandleCastSpellOpcode },
- /*0x12F*/ { "CMSG_CANCEL_CAST", STATUS_LOGGEDIN, &WorldSession::HandleCancelCastOpcode },
- /*0x130*/ { "SMSG_CAST_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x131*/ { "SMSG_SPELL_START", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x132*/ { "SMSG_SPELL_GO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x133*/ { "SMSG_SPELL_FAILURE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x134*/ { "SMSG_SPELL_COOLDOWN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x135*/ { "SMSG_COOLDOWN_EVENT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x136*/ { "CMSG_CANCEL_AURA", STATUS_LOGGEDIN, &WorldSession::HandleCancelAuraOpcode },
- /*0x137*/ { "SMSG_UPDATE_AURA_DURATION_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x138*/ { "SMSG_PET_CAST_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x139*/ { "MSG_CHANNEL_START", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x13A*/ { "MSG_CHANNEL_UPDATE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x13B*/ { "CMSG_CANCEL_CHANNELLING", STATUS_LOGGEDIN, &WorldSession::HandleCancelChanneling },
- /*0x13C*/ { "SMSG_AI_REACTION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x13D*/ { "CMSG_SET_SELECTION", STATUS_LOGGEDIN, &WorldSession::HandleSetSelectionOpcode },
- /*0x13E*/ { "CMSG_SET_TARGET_OBSOLETE", STATUS_LOGGEDIN, &WorldSession::HandleSetTargetOpcode },
- /*0x13F*/ { "CMSG_UNUSED", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x140*/ { "CMSG_UNUSED2", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x141*/ { "CMSG_ATTACKSWING", STATUS_LOGGEDIN, &WorldSession::HandleAttackSwingOpcode },
- /*0x142*/ { "CMSG_ATTACKSTOP", STATUS_LOGGEDIN, &WorldSession::HandleAttackStopOpcode },
- /*0x143*/ { "SMSG_ATTACKSTART", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x144*/ { "SMSG_ATTACKSTOP", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x145*/ { "SMSG_ATTACKSWING_NOTINRANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x146*/ { "SMSG_ATTACKSWING_BADFACING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x147*/ { "SMSG_ATTACKSWING_NOTSTANDING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x148*/ { "SMSG_ATTACKSWING_DEADTARGET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x149*/ { "SMSG_ATTACKSWING_CANT_ATTACK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x14A*/ { "SMSG_ATTACKERSTATEUPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x14B*/ { "SMSG_VICTIMSTATEUPDATE_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x14C*/ { "SMSG_DAMAGE_DONE_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x14D*/ { "SMSG_DAMAGE_TAKEN_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x14E*/ { "SMSG_CANCEL_COMBAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x14F*/ { "SMSG_SPELLBREAKLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x150*/ { "SMSG_SPELLHEALLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x151*/ { "SMSG_SPELLENERGIZELOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x152*/ { "SMSG_BREAK_TARGET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x153*/ { "CMSG_SAVE_PLAYER", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x154*/ { "CMSG_SETDEATHBINDPOINT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x155*/ { "SMSG_BINDPOINTUPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x156*/ { "CMSG_GETDEATHBINDZONE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x157*/ { "SMSG_BINDZONEREPLY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x158*/ { "SMSG_PLAYERBOUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x159*/ { "SMSG_CLIENT_CONTROL_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x15A*/ { "CMSG_REPOP_REQUEST", STATUS_LOGGEDIN, &WorldSession::HandleRepopRequestOpcode },
- /*0x15B*/ { "SMSG_RESURRECT_REQUEST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x15C*/ { "CMSG_RESURRECT_RESPONSE", STATUS_LOGGEDIN, &WorldSession::HandleResurrectResponseOpcode },
- /*0x15D*/ { "CMSG_LOOT", STATUS_LOGGEDIN, &WorldSession::HandleLootOpcode },
- /*0x15E*/ { "CMSG_LOOT_MONEY", STATUS_LOGGEDIN, &WorldSession::HandleLootMoneyOpcode },
- /*0x15F*/ { "CMSG_LOOT_RELEASE", STATUS_LOGGEDIN, &WorldSession::HandleLootReleaseOpcode },
- /*0x160*/ { "SMSG_LOOT_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x161*/ { "SMSG_LOOT_RELEASE_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x162*/ { "SMSG_LOOT_REMOVED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x163*/ { "SMSG_LOOT_MONEY_NOTIFY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x164*/ { "SMSG_LOOT_ITEM_NOTIFY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x165*/ { "SMSG_LOOT_CLEAR_MONEY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x166*/ { "SMSG_ITEM_PUSH_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x167*/ { "SMSG_DUEL_REQUESTED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x168*/ { "SMSG_DUEL_OUTOFBOUNDS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x169*/ { "SMSG_DUEL_INBOUNDS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x16A*/ { "SMSG_DUEL_COMPLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x16B*/ { "SMSG_DUEL_WINNER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x16C*/ { "CMSG_DUEL_ACCEPTED", STATUS_LOGGEDIN, &WorldSession::HandleDuelAcceptedOpcode },
- /*0x16D*/ { "CMSG_DUEL_CANCELLED", STATUS_LOGGEDIN, &WorldSession::HandleDuelCancelledOpcode },
- /*0x16E*/ { "SMSG_MOUNTRESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x16F*/ { "SMSG_DISMOUNTRESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x170*/ { "SMSG_PUREMOUNT_CANCELLED_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x171*/ { "CMSG_MOUNTSPECIAL_ANIM", STATUS_LOGGEDIN, &WorldSession::HandleMountSpecialAnimOpcode },
- /*0x172*/ { "SMSG_MOUNTSPECIAL_ANIM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x173*/ { "SMSG_PET_TAME_FAILURE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x174*/ { "CMSG_PET_SET_ACTION", STATUS_LOGGEDIN, &WorldSession::HandlePetSetAction },
- /*0x175*/ { "CMSG_PET_ACTION", STATUS_LOGGEDIN, &WorldSession::HandlePetAction },
- /*0x176*/ { "CMSG_PET_ABANDON", STATUS_LOGGEDIN, &WorldSession::HandlePetAbandon },
- /*0x177*/ { "CMSG_PET_RENAME", STATUS_LOGGEDIN, &WorldSession::HandlePetRename },
- /*0x178*/ { "SMSG_PET_NAME_INVALID", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x179*/ { "SMSG_PET_SPELLS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x17A*/ { "SMSG_PET_MODE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x17B*/ { "CMSG_GOSSIP_HELLO", STATUS_LOGGEDIN, &WorldSession::HandleGossipHelloOpcode },
- /*0x17C*/ { "CMSG_GOSSIP_SELECT_OPTION", STATUS_LOGGEDIN, &WorldSession::HandleGossipSelectOptionOpcode },
- /*0x17D*/ { "SMSG_GOSSIP_MESSAGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x17E*/ { "SMSG_GOSSIP_COMPLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x17F*/ { "CMSG_NPC_TEXT_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleNpcTextQueryOpcode },
- /*0x180*/ { "SMSG_NPC_TEXT_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x181*/ { "SMSG_NPC_WONT_TALK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x182*/ { "CMSG_QUESTGIVER_STATUS_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverStatusQueryOpcode},
- /*0x183*/ { "SMSG_QUESTGIVER_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x184*/ { "CMSG_QUESTGIVER_HELLO", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverHelloOpcode },
- /*0x185*/ { "SMSG_QUESTGIVER_QUEST_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x186*/ { "CMSG_QUESTGIVER_QUERY_QUEST", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverQuestQueryOpcode},
- /*0x187*/ { "CMSG_QUESTGIVER_QUEST_AUTOLAUNCH", STATUS_LOGGEDIN, &WorldSession::HandleQuestAutoLaunch },
- /*0x188*/ { "SMSG_QUESTGIVER_QUEST_DETAILS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x189*/ { "CMSG_QUESTGIVER_ACCEPT_QUEST", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverAcceptQuestOpcode},
- /*0x18A*/ { "CMSG_QUESTGIVER_COMPLETE_QUEST", STATUS_LOGGEDIN, &WorldSession::HandleQuestComplete },
- /*0x18B*/ { "SMSG_QUESTGIVER_REQUEST_ITEMS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x18C*/ { "CMSG_QUESTGIVER_REQUEST_REWARD", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverRequestRewardOpcode},
- /*0x18D*/ { "SMSG_QUESTGIVER_OFFER_REWARD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x18E*/ { "CMSG_QUESTGIVER_CHOOSE_REWARD", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverChooseRewardOpcode},
- /*0x18F*/ { "SMSG_QUESTGIVER_QUEST_INVALID", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x190*/ { "CMSG_QUESTGIVER_CANCEL", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverCancel },
- /*0x191*/ { "SMSG_QUESTGIVER_QUEST_COMPLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x192*/ { "SMSG_QUESTGIVER_QUEST_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x193*/ { "CMSG_QUESTLOG_SWAP_QUEST", STATUS_LOGGEDIN, &WorldSession::HandleQuestLogSwapQuest },
- /*0x194*/ { "CMSG_QUESTLOG_REMOVE_QUEST", STATUS_LOGGEDIN, &WorldSession::HandleQuestLogRemoveQuest },
- /*0x195*/ { "SMSG_QUESTLOG_FULL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x196*/ { "SMSG_QUESTUPDATE_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x197*/ { "SMSG_QUESTUPDATE_FAILEDTIMER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x198*/ { "SMSG_QUESTUPDATE_COMPLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x199*/ { "SMSG_QUESTUPDATE_ADD_KILL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x19A*/ { "SMSG_QUESTUPDATE_ADD_ITEM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x19B*/ { "CMSG_QUEST_CONFIRM_ACCEPT", STATUS_LOGGEDIN, &WorldSession::HandleQuestConfirmAccept },
- /*0x19C*/ { "SMSG_QUEST_CONFIRM_ACCEPT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x19D*/ { "CMSG_PUSHQUESTTOPARTY", STATUS_LOGGEDIN, &WorldSession::HandleQuestPushToParty },
- /*0x19E*/ { "CMSG_LIST_INVENTORY", STATUS_LOGGEDIN, &WorldSession::HandleListInventoryOpcode },
- /*0x19F*/ { "SMSG_LIST_INVENTORY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1A0*/ { "CMSG_SELL_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleSellItemOpcode },
- /*0x1A1*/ { "SMSG_SELL_ITEM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1A2*/ { "CMSG_BUY_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleBuyItemOpcode },
- /*0x1A3*/ { "CMSG_BUY_ITEM_IN_SLOT", STATUS_LOGGEDIN, &WorldSession::HandleBuyItemInSlotOpcode },
- /*0x1A4*/ { "SMSG_BUY_ITEM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1A5*/ { "SMSG_BUY_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1A6*/ { "CMSG_TAXICLEARALLNODES", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x1A7*/ { "CMSG_TAXIENABLEALLNODES", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x1A8*/ { "CMSG_TAXISHOWNODES", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x1A9*/ { "SMSG_SHOWTAXINODES", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1AA*/ { "CMSG_TAXINODE_STATUS_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleTaxiNodeStatusQueryOpcode },
- /*0x1AB*/ { "SMSG_TAXINODE_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1AC*/ { "CMSG_TAXIQUERYAVAILABLENODES", STATUS_LOGGEDIN, &WorldSession::HandleTaxiQueryAvailableNodes },
- /*0x1AD*/ { "CMSG_ACTIVATETAXI", STATUS_LOGGEDIN, &WorldSession::HandleActivateTaxiOpcode },
- /*0x1AE*/ { "SMSG_ACTIVATETAXIREPLY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1AF*/ { "SMSG_NEW_TAXI_PATH", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1B0*/ { "CMSG_TRAINER_LIST", STATUS_LOGGEDIN, &WorldSession::HandleTrainerListOpcode },
- /*0x1B1*/ { "SMSG_TRAINER_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1B2*/ { "CMSG_TRAINER_BUY_SPELL", STATUS_LOGGEDIN, &WorldSession::HandleTrainerBuySpellOpcode },
- /*0x1B3*/ { "SMSG_TRAINER_BUY_SUCCEEDED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1B4*/ { "SMSG_TRAINER_BUY_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1B5*/ { "CMSG_BINDER_ACTIVATE", STATUS_LOGGEDIN, &WorldSession::HandleBinderActivateOpcode },
- /*0x1B6*/ { "SMSG_PLAYERBINDERROR", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1B7*/ { "CMSG_BANKER_ACTIVATE", STATUS_LOGGEDIN, &WorldSession::HandleBankerActivateOpcode },
- /*0x1B8*/ { "SMSG_SHOW_BANK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1B9*/ { "CMSG_BUY_BANK_SLOT", STATUS_LOGGEDIN, &WorldSession::HandleBuyBankSlotOpcode },
- /*0x1BA*/ { "SMSG_BUY_BANK_SLOT_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1BB*/ { "CMSG_PETITION_SHOWLIST", STATUS_LOGGEDIN, &WorldSession::HandlePetitionShowListOpcode },
- /*0x1BC*/ { "SMSG_PETITION_SHOWLIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1BD*/ { "CMSG_PETITION_BUY", STATUS_LOGGEDIN, &WorldSession::HandlePetitionBuyOpcode },
- /*0x1BE*/ { "CMSG_PETITION_SHOW_SIGNATURES", STATUS_LOGGEDIN, &WorldSession::HandlePetitionShowSignOpcode },
- /*0x1BF*/ { "SMSG_PETITION_SHOW_SIGNATURES", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1C0*/ { "CMSG_PETITION_SIGN", STATUS_LOGGEDIN, &WorldSession::HandlePetitionSignOpcode },
- /*0x1C1*/ { "SMSG_PETITION_SIGN_RESULTS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1C2*/ { "MSG_PETITION_DECLINE", STATUS_LOGGEDIN, &WorldSession::HandlePetitionDeclineOpcode },
- /*0x1C3*/ { "CMSG_OFFER_PETITION", STATUS_LOGGEDIN, &WorldSession::HandleOfferPetitionOpcode },
- /*0x1C4*/ { "CMSG_TURN_IN_PETITION", STATUS_LOGGEDIN, &WorldSession::HandleTurnInPetitionOpcode },
- /*0x1C5*/ { "SMSG_TURN_IN_PETITION_RESULTS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1C6*/ { "CMSG_PETITION_QUERY", STATUS_LOGGEDIN, &WorldSession::HandlePetitionQueryOpcode },
- /*0x1C7*/ { "SMSG_PETITION_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1C8*/ { "SMSG_FISH_NOT_HOOKED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1C9*/ { "SMSG_FISH_ESCAPED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1CA*/ { "CMSG_BUG", STATUS_LOGGEDIN, &WorldSession::HandleBugOpcode },
- /*0x1CB*/ { "SMSG_NOTIFICATION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1CC*/ { "CMSG_PLAYED_TIME", STATUS_LOGGEDIN, &WorldSession::HandlePlayedTime },
- /*0x1CD*/ { "SMSG_PLAYED_TIME", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1CE*/ { "CMSG_QUERY_TIME", STATUS_LOGGEDIN, &WorldSession::HandleQueryTimeOpcode },
- /*0x1CF*/ { "SMSG_QUERY_TIME_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1D0*/ { "SMSG_LOG_XPGAIN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1D1*/ { "SMSG_AURACASTLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1D2*/ { "CMSG_RECLAIM_CORPSE", STATUS_LOGGEDIN, &WorldSession::HandleCorpseReclaimOpcode },
- /*0x1D3*/ { "CMSG_WRAP_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleWrapItemOpcode },
- /*0x1D4*/ { "SMSG_LEVELUP_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1D5*/ { "MSG_MINIMAP_PING", STATUS_LOGGEDIN, &WorldSession::HandleMinimapPingOpcode },
- /*0x1D6*/ { "SMSG_RESISTLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1D7*/ { "SMSG_ENCHANTMENTLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1D8*/ { "CMSG_SET_SKILL_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x1D9*/ { "SMSG_START_MIRROR_TIMER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1DA*/ { "SMSG_PAUSE_MIRROR_TIMER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1DB*/ { "SMSG_STOP_MIRROR_TIMER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1DC*/ { "CMSG_PING", STATUS_NEVER, &WorldSession::Handle_EarlyProccess },
- /*0x1DD*/ { "SMSG_PONG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1DE*/ { "SMSG_CLEAR_COOLDOWN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1DF*/ { "SMSG_GAMEOBJECT_PAGETEXT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1E0*/ { "CMSG_SETSHEATHED", STATUS_LOGGEDIN, &WorldSession::HandleSetSheathedOpcode },
- /*0x1E1*/ { "SMSG_COOLDOWN_CHEAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1E2*/ { "SMSG_SPELL_DELAYED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1E3*/ { "CMSG_PLAYER_MACRO_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x1E4*/ { "SMSG_PLAYER_MACRO_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1E5*/ { "CMSG_GHOST", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x1E6*/ { "CMSG_GM_INVIS", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x1E7*/ { "SMSG_INVALID_PROMOTION_CODE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1E8*/ { "MSG_GM_BIND_OTHER", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x1E9*/ { "MSG_GM_SUMMON", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x1EA*/ { "SMSG_ITEM_TIME_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1EB*/ { "SMSG_ITEM_ENCHANT_TIME_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1EC*/ { "SMSG_AUTH_CHALLENGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1ED*/ { "CMSG_AUTH_SESSION", STATUS_NEVER, &WorldSession::Handle_EarlyProccess },
- /*0x1EE*/ { "SMSG_AUTH_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1EF*/ { "MSG_GM_SHOWLABEL", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x1F0*/ { "CMSG_PET_CAST_SPELL", STATUS_LOGGEDIN, &WorldSession::HandlePetCastSpellOpcode },
- /*0x1F1*/ { "MSG_SAVE_GUILD_EMBLEM", STATUS_LOGGEDIN, &WorldSession::HandleGuildSaveEmblemOpcode },
- /*0x1F2*/ { "MSG_TABARDVENDOR_ACTIVATE", STATUS_LOGGEDIN, &WorldSession::HandleTabardVendorActivateOpcode},
- /*0x1F3*/ { "SMSG_PLAY_SPELL_VISUAL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1F4*/ { "CMSG_ZONEUPDATE", STATUS_LOGGEDIN, &WorldSession::HandleZoneUpdateOpcode },
- /*0x1F5*/ { "SMSG_PARTYKILLLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1F6*/ { "SMSG_COMPRESSED_UPDATE_OBJECT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1F7*/ { "SMSG_PLAY_SPELL_IMPACT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1F8*/ { "SMSG_EXPLORATION_EXPERIENCE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1F9*/ { "CMSG_GM_SET_SECURITY_GROUP", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x1FA*/ { "CMSG_GM_NUKE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x1FB*/ { "MSG_RANDOM_ROLL", STATUS_LOGGEDIN, &WorldSession::HandleRandomRollOpcode },
- /*0x1FC*/ { "SMSG_ENVIRONMENTALDAMAGELOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1FD*/ { "CMSG_RWHOIS_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x1FE*/ { "SMSG_RWHOIS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x1FF*/ { "MSG_LOOKING_FOR_GROUP", STATUS_LOGGEDIN, &WorldSession::HandleLookingForGroup },
- /*0x200*/ { "CMSG_SET_LOOKING_FOR_GROUP", STATUS_LOGGEDIN, &WorldSession::HandleSetLfgOpcode },
- /*0x201*/ { "CMSG_UNLEARN_SPELL", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x202*/ { "CMSG_UNLEARN_SKILL", STATUS_LOGGEDIN, &WorldSession::HandleUnlearnSkillOpcode },
- /*0x203*/ { "SMSG_REMOVED_SPELL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x204*/ { "CMSG_DECHARGE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x205*/ { "CMSG_GMTICKET_CREATE", STATUS_LOGGEDIN, &WorldSession::HandleGMTicketCreateOpcode },
- /*0x206*/ { "SMSG_GMTICKET_CREATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x207*/ { "CMSG_GMTICKET_UPDATETEXT", STATUS_LOGGEDIN, &WorldSession::HandleGMTicketUpdateTextOpcode },
- /*0x208*/ { "SMSG_GMTICKET_UPDATETEXT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x209*/ { "SMSG_ACCOUNT_DATA_TIMES", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x20A*/ { "CMSG_REQUEST_ACCOUNT_DATA", STATUS_LOGGEDIN, &WorldSession::HandleRequestAccountData },
- /*0x20B*/ { "CMSG_UPDATE_ACCOUNT_DATA", STATUS_AUTHED, &WorldSession::HandleUpdateAccountData },
- /*0x20C*/ { "SMSG_UPDATE_ACCOUNT_DATA", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x20D*/ { "SMSG_CLEAR_FAR_SIGHT_IMMEDIATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x20E*/ { "SMSG_POWERGAINLOG_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x20F*/ { "CMSG_GM_TEACH", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x210*/ { "CMSG_GM_CREATE_ITEM_TARGET", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x211*/ { "CMSG_GMTICKET_GETTICKET", STATUS_LOGGEDIN, &WorldSession::HandleGMTicketGetTicketOpcode },
- /*0x212*/ { "SMSG_GMTICKET_GETTICKET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x213*/ { "CMSG_UNLEARN_TALENTS", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x214*/ { "SMSG_GAMEOBJECT_SPAWN_ANIM_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x215*/ { "SMSG_GAMEOBJECT_DESPAWN_ANIM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x216*/ { "MSG_CORPSE_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleCorpseQueryOpcode },
- /*0x217*/ { "CMSG_GMTICKET_DELETETICKET", STATUS_LOGGEDIN, &WorldSession::HandleGMTicketDeleteOpcode },
- /*0x218*/ { "SMSG_GMTICKET_DELETETICKET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x219*/ { "SMSG_CHAT_WRONG_FACTION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x21A*/ { "CMSG_GMTICKET_SYSTEMSTATUS", STATUS_LOGGEDIN, &WorldSession::HandleGMTicketSystemStatusOpcode},
- /*0x21B*/ { "SMSG_GMTICKET_SYSTEMSTATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x21C*/ { "CMSG_SPIRIT_HEALER_ACTIVATE", STATUS_LOGGEDIN, &WorldSession::HandleSpiritHealerActivateOpcode},
- /*0x21D*/ { "CMSG_SET_STAT_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x21E*/ { "SMSG_SET_REST_START_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x21F*/ { "CMSG_SKILL_BUY_STEP", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x220*/ { "CMSG_SKILL_BUY_RANK", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x221*/ { "CMSG_XP_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x222*/ { "SMSG_SPIRIT_HEALER_CONFIRM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x223*/ { "CMSG_CHARACTER_POINT_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x224*/ { "SMSG_GOSSIP_POI", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x225*/ { "CMSG_CHAT_IGNORED", STATUS_LOGGEDIN, &WorldSession::HandleChatIgnoredOpcode },
- /*0x226*/ { "CMSG_GM_VISION", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x227*/ { "CMSG_SERVER_COMMAND", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x228*/ { "CMSG_GM_SILENCE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x229*/ { "CMSG_GM_REVEALTO", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x22A*/ { "CMSG_GM_RESURRECT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x22B*/ { "CMSG_GM_SUMMONMOB", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x22C*/ { "CMSG_GM_MOVECORPSE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x22D*/ { "CMSG_GM_FREEZE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x22E*/ { "CMSG_GM_UBERINVIS", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x22F*/ { "CMSG_GM_REQUEST_PLAYER_INFO", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x230*/ { "SMSG_GM_PLAYER_INFO", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x231*/ { "CMSG_GUILD_RANK", STATUS_LOGGEDIN, &WorldSession::HandleGuildRankOpcode },
- /*0x232*/ { "CMSG_GUILD_ADD_RANK", STATUS_LOGGEDIN, &WorldSession::HandleGuildAddRankOpcode },
- /*0x233*/ { "CMSG_GUILD_DEL_RANK", STATUS_LOGGEDIN, &WorldSession::HandleGuildDelRankOpcode },
- /*0x234*/ { "CMSG_GUILD_SET_PUBLIC_NOTE", STATUS_LOGGEDIN, &WorldSession::HandleGuildSetPublicNoteOpcode },
- /*0x235*/ { "CMSG_GUILD_SET_OFFICER_NOTE", STATUS_LOGGEDIN, &WorldSession::HandleGuildSetOfficerNoteOpcode },
- /*0x236*/ { "SMSG_LOGIN_VERIFY_WORLD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x237*/ { "CMSG_CLEAR_EXPLORATION", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x238*/ { "CMSG_SEND_MAIL", STATUS_LOGGEDIN, &WorldSession::HandleSendMail },
- /*0x239*/ { "SMSG_SEND_MAIL_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x23A*/ { "CMSG_GET_MAIL_LIST", STATUS_LOGGEDIN, &WorldSession::HandleGetMail },
- /*0x23B*/ { "SMSG_MAIL_LIST_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x23C*/ { "CMSG_BATTLEFIELD_LIST", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundListOpcode },
- /*0x23D*/ { "SMSG_BATTLEFIELD_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x23E*/ { "CMSG_BATTLEFIELD_JOIN", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x23F*/ { "SMSG_BATTLEFIELD_WIN_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x240*/ { "SMSG_BATTLEFIELD_LOSE_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x241*/ { "CMSG_TAXICLEARNODE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x242*/ { "CMSG_TAXIENABLENODE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x243*/ { "CMSG_ITEM_TEXT_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleItemTextQuery },
- /*0x244*/ { "SMSG_ITEM_TEXT_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x245*/ { "CMSG_MAIL_TAKE_MONEY", STATUS_LOGGEDIN, &WorldSession::HandleTakeMoney },
- /*0x246*/ { "CMSG_MAIL_TAKE_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleTakeItem },
- /*0x247*/ { "CMSG_MAIL_MARK_AS_READ", STATUS_LOGGEDIN, &WorldSession::HandleMarkAsRead },
- /*0x248*/ { "CMSG_MAIL_RETURN_TO_SENDER", STATUS_LOGGEDIN, &WorldSession::HandleReturnToSender },
- /*0x249*/ { "CMSG_MAIL_DELETE", STATUS_LOGGEDIN, &WorldSession::HandleMailDelete },
- /*0x24A*/ { "CMSG_MAIL_CREATE_TEXT_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleMailCreateTextItem },
- /*0x24B*/ { "SMSG_SPELLLOGMISS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x24C*/ { "SMSG_SPELLLOGEXECUTE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x24D*/ { "SMSG_DEBUGAURAPROC", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x24E*/ { "SMSG_PERIODICAURALOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x24F*/ { "SMSG_SPELLDAMAGESHIELD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x250*/ { "SMSG_SPELLNONMELEEDAMAGELOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x251*/ { "CMSG_LEARN_TALENT", STATUS_LOGGEDIN, &WorldSession::HandleLearnTalentOpcode },
- /*0x252*/ { "SMSG_RESURRECT_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x253*/ { "CMSG_TOGGLE_PVP", STATUS_LOGGEDIN, &WorldSession::HandleTogglePvP },
- /*0x254*/ { "SMSG_ZONE_UNDER_ATTACK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x255*/ { "MSG_AUCTION_HELLO", STATUS_LOGGEDIN, &WorldSession::HandleAuctionHelloOpcode },
- /*0x256*/ { "CMSG_AUCTION_SELL_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAuctionSellItem },
- /*0x257*/ { "CMSG_AUCTION_REMOVE_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAuctionRemoveItem },
- /*0x258*/ { "CMSG_AUCTION_LIST_ITEMS", STATUS_LOGGEDIN, &WorldSession::HandleAuctionListItems },
- /*0x259*/ { "CMSG_AUCTION_LIST_OWNER_ITEMS", STATUS_LOGGEDIN, &WorldSession::HandleAuctionListOwnerItems },
- /*0x25A*/ { "CMSG_AUCTION_PLACE_BID", STATUS_LOGGEDIN, &WorldSession::HandleAuctionPlaceBid },
- /*0x25B*/ { "SMSG_AUCTION_COMMAND_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x25C*/ { "SMSG_AUCTION_LIST_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x25D*/ { "SMSG_AUCTION_OWNER_LIST_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x25E*/ { "SMSG_AUCTION_BIDDER_NOTIFICATION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x25F*/ { "SMSG_AUCTION_OWNER_NOTIFICATION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x260*/ { "SMSG_PROCRESIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x261*/ { "SMSG_STANDSTATE_CHANGE_FAILURE_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x262*/ { "SMSG_DISPEL_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x263*/ { "SMSG_SPELLORDAMAGE_IMMUNE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x264*/ { "CMSG_AUCTION_LIST_BIDDER_ITEMS", STATUS_LOGGEDIN, &WorldSession::HandleAuctionListBidderItems },
- /*0x265*/ { "SMSG_AUCTION_BIDDER_LIST_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x266*/ { "SMSG_SET_FLAT_SPELL_MODIFIER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x267*/ { "SMSG_SET_PCT_SPELL_MODIFIER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x268*/ { "CMSG_SET_AMMO", STATUS_LOGGEDIN, &WorldSession::HandleSetAmmoOpcode },
- /*0x269*/ { "SMSG_CORPSE_RECLAIM_DELAY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x26A*/ { "CMSG_SET_ACTIVE_MOVER", STATUS_LOGGEDIN, &WorldSession::HandleSetActiveMoverOpcode },
- /*0x26B*/ { "CMSG_PET_CANCEL_AURA", STATUS_LOGGEDIN, &WorldSession::HandlePetCancelAuraOpcode },
- /*0x26C*/ { "CMSG_PLAYER_AI_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x26D*/ { "CMSG_CANCEL_AUTO_REPEAT_SPELL", STATUS_LOGGEDIN, &WorldSession::HandleCancelAutoRepeatSpellOpcode},
- /*0x26E*/ { "MSG_GM_ACCOUNT_ONLINE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x26F*/ { "MSG_LIST_STABLED_PETS", STATUS_LOGGEDIN, &WorldSession::HandleListStabledPetsOpcode },
- /*0x270*/ { "CMSG_STABLE_PET", STATUS_LOGGEDIN, &WorldSession::HandleStablePet },
- /*0x271*/ { "CMSG_UNSTABLE_PET", STATUS_LOGGEDIN, &WorldSession::HandleUnstablePet },
- /*0x272*/ { "CMSG_BUY_STABLE_SLOT", STATUS_LOGGEDIN, &WorldSession::HandleBuyStableSlot },
- /*0x273*/ { "SMSG_STABLE_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x274*/ { "CMSG_STABLE_REVIVE_PET", STATUS_LOGGEDIN, &WorldSession::HandleStableRevivePet },
- /*0x275*/ { "CMSG_STABLE_SWAP_PET", STATUS_LOGGEDIN, &WorldSession::HandleStableSwapPet },
- /*0x276*/ { "MSG_QUEST_PUSH_RESULT", STATUS_LOGGEDIN, &WorldSession::HandleQuestPushResult },
- /*0x277*/ { "SMSG_PLAY_MUSIC", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x278*/ { "SMSG_PLAY_OBJECT_SOUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x279*/ { "CMSG_REQUEST_PET_INFO", STATUS_LOGGEDIN, &WorldSession::HandleRequestPetInfoOpcode },
- /*0x27A*/ { "CMSG_FAR_SIGHT", STATUS_LOGGEDIN, &WorldSession::HandleFarSightOpcode },
- /*0x27B*/ { "SMSG_SPELLDISPELLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x27C*/ { "SMSG_DAMAGE_CALC_LOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x27D*/ { "CMSG_ENABLE_DAMAGE_LOG", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x27E*/ { "CMSG_GROUP_CHANGE_SUB_GROUP", STATUS_LOGGEDIN, &WorldSession::HandleGroupChangeSubGroupOpcode },
- /*0x27F*/ { "CMSG_REQUEST_PARTY_MEMBER_STATS", STATUS_LOGGEDIN, &WorldSession::HandleRequestPartyMemberStatsOpcode},
- /*0x280*/ { "CMSG_GROUP_SWAP_SUB_GROUP", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x281*/ { "CMSG_RESET_FACTION_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x282*/ { "CMSG_AUTOSTORE_BANK_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAutoStoreBankItemOpcode },
- /*0x283*/ { "CMSG_AUTOBANK_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAutoBankItemOpcode },
- /*0x284*/ { "MSG_QUERY_NEXT_MAIL_TIME", STATUS_LOGGEDIN, &WorldSession::HandleMsgQueryNextMailtime },
- /*0x285*/ { "SMSG_RECEIVED_MAIL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x286*/ { "SMSG_RAID_GROUP_ONLY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x287*/ { "CMSG_SET_DURABILITY_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x288*/ { "CMSG_SET_PVP_RANK_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x289*/ { "CMSG_ADD_PVP_MEDAL_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x28A*/ { "CMSG_DEL_PVP_MEDAL_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x28B*/ { "CMSG_SET_PVP_TITLE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x28C*/ { "SMSG_PVP_CREDIT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x28D*/ { "SMSG_AUCTION_REMOVED_NOTIFICATION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x28E*/ { "CMSG_GROUP_RAID_CONVERT", STATUS_LOGGEDIN, &WorldSession::HandleRaidConvertOpcode },
- /*0x28F*/ { "CMSG_GROUP_ASSISTANT_LEADER", STATUS_LOGGEDIN, &WorldSession::HandleGroupAssistantOpcode },
- /*0x290*/ { "CMSG_BUYBACK_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleBuybackItem },
- /*0x291*/ { "SMSG_SERVER_MESSAGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x292*/ { "CMSG_MEETINGSTONE_JOIN", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x293*/ { "CMSG_MEETINGSTONE_LEAVE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x294*/ { "CMSG_MEETINGSTONE_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x295*/ { "SMSG_MEETINGSTONE_SETQUEUE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x296*/ { "CMSG_MEETINGSTONE_INFO", STATUS_LOGGEDIN, &WorldSession::HandleMeetingStoneInfo },
- /*0x297*/ { "SMSG_MEETINGSTONE_COMPLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x298*/ { "SMSG_MEETINGSTONE_IN_PROGRESS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x299*/ { "SMSG_MEETINGSTONE_MEMBER_ADDED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x29A*/ { "CMSG_GMTICKETSYSTEM_TOGGLE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x29B*/ { "CMSG_CANCEL_GROWTH_AURA", STATUS_LOGGEDIN, &WorldSession::HandleCancelGrowthAuraOpcode },
- /*0x29C*/ { "SMSG_CANCEL_AUTO_REPEAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x29D*/ { "SMSG_STANDSTATE_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x29E*/ { "SMSG_LOOT_ALL_PASSED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x29F*/ { "SMSG_LOOT_ROLL_WON", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2A0*/ { "CMSG_LOOT_ROLL", STATUS_LOGGEDIN, &WorldSession::HandleLootRoll },
- /*0x2A1*/ { "SMSG_LOOT_START_ROLL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2A2*/ { "SMSG_LOOT_ROLL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2A3*/ { "CMSG_LOOT_MASTER_GIVE", STATUS_LOGGEDIN, &WorldSession::HandleLootMasterGiveOpcode },
- /*0x2A4*/ { "SMSG_LOOT_MASTER_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2A5*/ { "SMSG_SET_FORCED_REACTIONS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2A6*/ { "SMSG_SPELL_FAILED_OTHER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2A7*/ { "SMSG_GAMEOBJECT_RESET_STATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2A8*/ { "CMSG_REPAIR_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleRepairItemOpcode },
- /*0x2A9*/ { "SMSG_CHAT_PLAYER_NOT_FOUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2AA*/ { "MSG_TALENT_WIPE_CONFIRM", STATUS_LOGGEDIN, &WorldSession::HandleTalentWipeOpcode },
- /*0x2AB*/ { "SMSG_SUMMON_REQUEST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2AC*/ { "CMSG_SUMMON_RESPONSE", STATUS_LOGGEDIN, &WorldSession::HandleSummonResponseOpcode },
- /*0x2AD*/ { "MSG_MOVE_TOGGLE_GRAVITY_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x2AE*/ { "SMSG_MONSTER_MOVE_TRANSPORT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2AF*/ { "SMSG_PET_BROKEN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2B0*/ { "MSG_MOVE_FEATHER_FALL", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x2B1*/ { "MSG_MOVE_WATER_WALK", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x2B2*/ { "CMSG_SERVER_BROADCAST", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x2B3*/ { "CMSG_SELF_RES", STATUS_LOGGEDIN, &WorldSession::HandleSelfResOpcode },
- /*0x2B4*/ { "SMSG_FEIGN_DEATH_RESISTED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2B5*/ { "CMSG_RUN_SCRIPT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x2B6*/ { "SMSG_SCRIPT_MESSAGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2B7*/ { "SMSG_DUEL_COUNTDOWN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2B8*/ { "SMSG_AREA_TRIGGER_MESSAGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2B9*/ { "CMSG_SHOWING_HELM", STATUS_LOGGEDIN, &WorldSession::HandleToggleHelmOpcode },
- /*0x2BA*/ { "CMSG_SHOWING_CLOAK", STATUS_LOGGEDIN, &WorldSession::HandleToggleCloakOpcode },
- /*0x2BB*/ { "SMSG_MEETINGSTONE_JOINFAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2BC*/ { "SMSG_PLAYER_SKINNED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2BD*/ { "SMSG_DURABILITY_DAMAGE_DEATH", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2BE*/ { "CMSG_SET_EXPLORATION", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x2BF*/ { "CMSG_SET_ACTIONBAR_TOGGLES", STATUS_AUTHED, &WorldSession::HandleSetActionBar },
- /*0x2C0*/ { "UMSG_DELETE_GUILD_CHARTER", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x2C1*/ { "MSG_PETITION_RENAME", STATUS_LOGGEDIN, &WorldSession::HandlePetitionRenameOpcode },
- /*0x2C2*/ { "SMSG_INIT_WORLD_STATES", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2C3*/ { "SMSG_UPDATE_WORLD_STATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2C4*/ { "CMSG_ITEM_NAME_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleItemNameQueryOpcode },
- /*0x2C5*/ { "SMSG_ITEM_NAME_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2C6*/ { "SMSG_PET_ACTION_FEEDBACK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2C7*/ { "CMSG_CHAR_RENAME", STATUS_AUTHED, &WorldSession::HandleChangePlayerNameOpcode },
- /*0x2C8*/ { "SMSG_CHAR_RENAME", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2C9*/ { "CMSG_MOVE_SPLINE_DONE", STATUS_LOGGEDIN, &WorldSession::HandleTaxiNextDestinationOpcode },
- /*0x2CA*/ { "CMSG_MOVE_FALL_RESET", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x2CB*/ { "SMSG_INSTANCE_SAVE_CREATED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2CC*/ { "SMSG_RAID_INSTANCE_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2CD*/ { "CMSG_REQUEST_RAID_INFO", STATUS_LOGGEDIN, &WorldSession::HandleRequestRaidInfoOpcode },
- /*0x2CE*/ { "CMSG_MOVE_TIME_SKIPPED", STATUS_LOGGEDIN, &WorldSession::HandleMoveTimeSkippedOpcode },
- /*0x2CF*/ { "CMSG_MOVE_FEATHER_FALL_ACK", STATUS_LOGGEDIN, &WorldSession::HandleFeatherFallAck },
- /*0x2D0*/ { "CMSG_MOVE_WATER_WALK_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveWaterWalkAck },
- /*0x2D1*/ { "CMSG_MOVE_NOT_ACTIVE_MOVER", STATUS_LOGGEDIN, &WorldSession::HandleMoveNotActiveMover },
- /*0x2D2*/ { "SMSG_PLAY_SOUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2D3*/ { "CMSG_BATTLEFIELD_STATUS", STATUS_LOGGEDIN, &WorldSession::HandleBattlefieldStatusOpcode },
- /*0x2D4*/ { "SMSG_BATTLEFIELD_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2D5*/ { "CMSG_BATTLEFIELD_PORT", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundPlayerPortOpcode},
- /*0x2D6*/ { "MSG_INSPECT_HONOR_STATS", STATUS_LOGGEDIN, &WorldSession::HandleInspectHonorStatsOpcode },
- /*0x2D7*/ { "CMSG_BATTLEMASTER_HELLO", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundHelloOpcode },
- /*0x2D8*/ { "CMSG_MOVE_START_SWIM_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x2D9*/ { "CMSG_MOVE_STOP_SWIM_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x2DA*/ { "SMSG_FORCE_WALK_SPEED_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2DB*/ { "CMSG_FORCE_WALK_SPEED_CHANGE_ACK", STATUS_LOGGEDIN, &WorldSession::HandleForceSpeedChangeAck },
- /*0x2DC*/ { "SMSG_FORCE_SWIM_BACK_SPEED_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2DD*/ { "CMSG_FORCE_SWIM_BACK_SPEED_CHANGE_ACK", STATUS_LOGGEDIN, &WorldSession::HandleForceSpeedChangeAck },
- /*0x2DE*/ { "SMSG_FORCE_TURN_RATE_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2DF*/ { "CMSG_FORCE_TURN_RATE_CHANGE_ACK", STATUS_LOGGEDIN, &WorldSession::HandleForceSpeedChangeAck },
- /*0x2E0*/ { "MSG_PVP_LOG_DATA", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundPVPlogdataOpcode},
- /*0x2E1*/ { "CMSG_LEAVE_BATTLEFIELD", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundLeaveOpcode },
- /*0x2E2*/ { "CMSG_AREA_SPIRIT_HEALER_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleAreaSpiritHealerQueryOpcode},
- /*0x2E3*/ { "CMSG_AREA_SPIRIT_HEALER_QUEUE", STATUS_LOGGEDIN, &WorldSession::HandleAreaSpiritHealerQueueOpcode},
- /*0x2E4*/ { "SMSG_AREA_SPIRIT_HEALER_TIME", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2E5*/ { "CMSG_GM_UNTEACH", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x2E6*/ { "SMSG_WARDEN_DATA", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2E7*/ { "CMSG_WARDEN_DATA", STATUS_LOGGEDIN, &WorldSession::HandleWardenDataOpcode },
- /*0x2E8*/ { "SMSG_GROUP_JOINED_BATTLEGROUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2E9*/ { "MSG_BATTLEGROUND_PLAYER_POSITIONS", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundPlayerPositionsOpcode},
- /*0x2EA*/ { "CMSG_PET_STOP_ATTACK", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x2EB*/ { "SMSG_BINDER_CONFIRM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2EC*/ { "SMSG_BATTLEGROUND_PLAYER_JOINED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2ED*/ { "SMSG_BATTLEGROUND_PLAYER_LEFT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2EE*/ { "CMSG_BATTLEMASTER_JOIN", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundJoinOpcode },
- /*0x2EF*/ { "SMSG_ADDON_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2F0*/ { "CMSG_PET_UNLEARN", STATUS_LOGGEDIN, &WorldSession::HandlePetUnlearnOpcode },
- /*0x2F1*/ { "SMSG_PET_UNLEARN_CONFIRM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2F2*/ { "SMSG_PARTY_MEMBER_STATS_FULL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2F3*/ { "CMSG_PET_SPELL_AUTOCAST", STATUS_LOGGEDIN, &WorldSession::HandlePetSpellAutocastOpcode },
- /*0x2F4*/ { "SMSG_WEATHER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2F5*/ { "SMSG_PLAY_TIME_WARNING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2F6*/ { "SMSG_MINIGAME_SETUP", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2F7*/ { "SMSG_MINIGAME_STATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2F8*/ { "CMSG_MINIGAME_MOVE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x2F9*/ { "SMSG_MINIGAME_MOVE_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2FA*/ { "SMSG_RAID_INSTANCE_MESSAGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2FB*/ { "SMSG_COMPRESSED_MOVES", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2FC*/ { "CMSG_GUILD_INFO_TEXT", STATUS_LOGGEDIN, &WorldSession::HandleGuildChangeInfoOpcode },
- /*0x2FD*/ { "SMSG_CHAT_RESTRICTED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2FE*/ { "SMSG_SPLINE_SET_RUN_SPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x2FF*/ { "SMSG_SPLINE_SET_RUN_BACK_SPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x300*/ { "SMSG_SPLINE_SET_SWIM_SPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x301*/ { "SMSG_SPLINE_SET_WALK_SPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x302*/ { "SMSG_SPLINE_SET_SWIM_BACK_SPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x303*/ { "SMSG_SPLINE_SET_TURN_RATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x304*/ { "SMSG_SPLINE_MOVE_UNROOT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x305*/ { "SMSG_SPLINE_MOVE_FEATHER_FALL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x306*/ { "SMSG_SPLINE_MOVE_NORMAL_FALL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x307*/ { "SMSG_SPLINE_MOVE_SET_HOVER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x308*/ { "SMSG_SPLINE_MOVE_UNSET_HOVER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x309*/ { "SMSG_SPLINE_MOVE_WATER_WALK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x30A*/ { "SMSG_SPLINE_MOVE_LAND_WALK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x30B*/ { "SMSG_SPLINE_MOVE_START_SWIM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x30C*/ { "SMSG_SPLINE_MOVE_STOP_SWIM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x30D*/ { "SMSG_SPLINE_MOVE_SET_RUN_MODE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x30E*/ { "SMSG_SPLINE_MOVE_SET_WALK_MODE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x30F*/ { "CMSG_GM_NUKE_ACCOUNT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x310*/ { "MSG_GM_DESTROY_CORPSE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x311*/ { "CMSG_GM_DESTROY_ONLINE_CORPSE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x312*/ { "CMSG_ACTIVATETAXIEXPRESS", STATUS_LOGGEDIN, &WorldSession::HandleActivateTaxiFarOpcode },
- /*0x313*/ { "SMSG_SET_FACTION_ATWAR", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x314*/ { "SMSG_GAMETIMEBIAS_SET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x315*/ { "CMSG_DEBUG_ACTIONS_START", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x316*/ { "CMSG_DEBUG_ACTIONS_STOP", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x317*/ { "CMSG_SET_FACTION_INACTIVE", STATUS_LOGGEDIN, &WorldSession::HandleSetWatchedFactionInactiveOpcode},
- /*0x318*/ { "CMSG_SET_WATCHED_FACTION", STATUS_LOGGEDIN, &WorldSession::HandleSetWatchedFactionIndexOpcode},
- /*0x319*/ { "MSG_MOVE_TIME_SKIPPED", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x31A*/ { "SMSG_SPLINE_MOVE_ROOT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x31B*/ { "CMSG_SET_EXPLORATION_ALL", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x31C*/ { "SMSG_INVALIDATE_PLAYER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x31D*/ { "CMSG_RESET_INSTANCES", STATUS_LOGGEDIN, &WorldSession::HandleResetInstancesOpcode },
- /*0x31E*/ { "SMSG_INSTANCE_RESET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x31F*/ { "SMSG_INSTANCE_RESET_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x320*/ { "SMSG_UPDATE_LAST_INSTANCE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x321*/ { "MSG_RAID_TARGET_UPDATE", STATUS_LOGGEDIN, &WorldSession::HandleRaidIconTargetOpcode },
- /*0x322*/ { "MSG_RAID_READY_CHECK", STATUS_LOGGEDIN, &WorldSession::HandleRaidReadyCheckOpcode },
- /*0x323*/ { "CMSG_LUA_USAGE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x324*/ { "SMSG_PET_ACTION_SOUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x325*/ { "SMSG_PET_DISMISS_SOUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x326*/ { "SMSG_GHOSTEE_GONE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x327*/ { "CMSG_GM_UPDATE_TICKET_STATUS", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x328*/ { "SMSG_GM_TICKET_STATUS_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x329*/ { "MSG_SET_DUNGEON_DIFFICULTY", STATUS_LOGGEDIN, &WorldSession::HandleDungeonDifficultyOpcode },
- /*0x32A*/ { "CMSG_GMSURVEY_SUBMIT", STATUS_LOGGEDIN, &WorldSession::HandleGMSurveySubmit },
- /*0x32B*/ { "SMSG_UPDATE_INSTANCE_OWNERSHIP", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x32C*/ { "CMSG_IGNORE_KNOCKBACK_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x32D*/ { "SMSG_CHAT_PLAYER_AMBIGUOUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x32E*/ { "MSG_DELAY_GHOST_TELEPORT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x32F*/ { "SMSG_SPELLINSTAKILLLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x330*/ { "SMSG_SPELL_UPDATE_CHAIN_TARGETS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x331*/ { "CMSG_CHAT_FILTERED", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x332*/ { "SMSG_EXPECTED_SPAM_RECORDS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x333*/ { "SMSG_SPELLSTEALLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x334*/ { "CMSG_LOTTERY_QUERY_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x335*/ { "SMSG_LOTTERY_QUERY_RESULT_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x336*/ { "CMSG_BUY_LOTTERY_TICKET_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x337*/ { "SMSG_LOTTERY_RESULT_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x338*/ { "SMSG_CHARACTER_PROFILE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x339*/ { "SMSG_CHARACTER_PROFILE_REALM_CONNECTED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x33A*/ { "SMSG_DEFENSE_MESSAGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x33B*/ { "SMSG_INSTANCE_DIFFICULTY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x33C*/ { "MSG_GM_RESETINSTANCELIMIT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x33D*/ { "SMSG_MOTD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x33E*/ { "SMSG_MOVE_SET_FLIGHT_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x33F*/ { "SMSG_MOVE_UNSET_FLIGHT_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x340*/ { "CMSG_MOVE_FLIGHT_ACK_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x341*/ { "MSG_MOVE_START_SWIM_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x342*/ { "MSG_MOVE_STOP_SWIM_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x343*/ { "SMSG_MOVE_SET_CAN_FLY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x344*/ { "SMSG_MOVE_UNSET_CAN_FLY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x345*/ { "CMSG_MOVE_SET_CAN_FLY_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveFlyModeChangeAckOpcode},
- /*0x346*/ { "CMSG_MOVE_SET_FLY", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x347*/ { "CMSG_SOCKET_GEMS", STATUS_LOGGEDIN, &WorldSession::HandleSocketOpcode },
- /*0x348*/ { "CMSG_ARENA_TEAM_CREATE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x349*/ { "SMSG_ARENA_TEAM_COMMAND_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x34A*/ { "UMSG_UPDATE_ARENA_TEAM_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x34B*/ { "CMSG_ARENA_TEAM_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamQueryOpcode },
- /*0x34C*/ { "SMSG_ARENA_TEAM_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x34D*/ { "CMSG_ARENA_TEAM_ROSTER", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamRosterOpcode },
- /*0x34E*/ { "SMSG_ARENA_TEAM_ROSTER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x34F*/ { "CMSG_ARENA_TEAM_INVITE", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamAddMemberOpcode },
- /*0x350*/ { "SMSG_ARENA_TEAM_INVITE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x351*/ { "CMSG_ARENA_TEAM_ACCEPT", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamInviteAcceptOpcode},
- /*0x352*/ { "CMSG_ARENA_TEAM_DECLINE", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamInviteDeclineOpcode},
- /*0x353*/ { "CMSG_ARENA_TEAM_LEAVE", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamLeaveOpcode },
- /*0x354*/ { "CMSG_ARENA_TEAM_REMOVE", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamRemoveFromTeamOpcode},
- /*0x355*/ { "CMSG_ARENA_TEAM_DISBAND", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamDisbandOpcode },
- /*0x356*/ { "CMSG_ARENA_TEAM_LEADER", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamPromoteToCaptainOpcode},
- /*0x357*/ { "SMSG_ARENA_TEAM_EVENT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x358*/ { "CMSG_BATTLEMASTER_JOIN_ARENA", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundArenaJoin },
- /*0x359*/ { "MSG_MOVE_START_ASCEND", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x35A*/ { "MSG_MOVE_STOP_ASCEND", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x35B*/ { "SMSG_ARENA_TEAM_STATS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x35C*/ { "CMSG_LFG_SET_AUTOJOIN", STATUS_AUTHED, &WorldSession::HandleLfgAutoJoinOpcode },
- /*0x35D*/ { "CMSG_LFG_CLEAR_AUTOJOIN", STATUS_LOGGEDIN, &WorldSession::HandleLfgCancelAutoJoinOpcode },
- /*0x35E*/ { "CMSG_LFM_SET_AUTOFILL", STATUS_AUTHED, &WorldSession::HandleLfmAutoAddMembersOpcode },
- /*0x35F*/ { "CMSG_LFM_CLEAR_AUTOFILL", STATUS_LOGGEDIN, &WorldSession::HandleLfmCancelAutoAddmembersOpcode},
- /*0x360*/ { "CMSG_ACCEPT_LFG_MATCH", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x361*/ { "CMSG_DECLINE_LFG_MATCH", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x362*/ { "CMSG_CANCEL_PENDING_LFG", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x363*/ { "CMSG_CLEAR_LOOKING_FOR_GROUP", STATUS_LOGGEDIN, &WorldSession::HandleLfgClearOpcode },
- /*0x364*/ { "CMSG_CLEAR_LOOKING_FOR_MORE", STATUS_LOGGEDIN, &WorldSession::HandleLfmSetNoneOpcode },
- /*0x365*/ { "CMSG_SET_LOOKING_FOR_MORE", STATUS_LOGGEDIN, &WorldSession::HandleLfmSetOpcode },
- /*0x366*/ { "CMSG_SET_LFG_COMMENT", STATUS_LOGGEDIN, &WorldSession::HandleLfgSetCommentOpcode },
- /*0x367*/ { "SMSG_LFG_TIMEDOUT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x368*/ { "SMSG_LFG_OTHER_TIMEDOUT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x369*/ { "SMSG_LFG_AUTOJOIN_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x36A*/ { "SMSG_LFG_AUTOJOIN_FAILED_NO_PLAYER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x36B*/ { "SMSG_LFG_LEADER_IS_LFM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x36C*/ { "SMSG_LFG_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x36D*/ { "SMSG_LFG_UPDATE_LFM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x36E*/ { "SMSG_LFG_UPDATE_LFG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x36F*/ { "SMSG_LFG_UPDATE_QUEUED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x370*/ { "SMSG_LFG_PENDING_INVITE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x371*/ { "SMSG_LFG_PENDING_MATCH", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x372*/ { "SMSG_LFG_PENDING_MATCH_DONE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x373*/ { "SMSG_TITLE_EARNED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x374*/ { "CMSG_SET_TITLE", STATUS_LOGGEDIN, &WorldSession::HandleChooseTitleOpcode },
- /*0x375*/ { "CMSG_CANCEL_MOUNT_AURA", STATUS_LOGGEDIN, &WorldSession::HandleDismountOpcode },
- /*0x376*/ { "SMSG_ARENA_ERROR", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x377*/ { "MSG_INSPECT_ARENA_TEAMS", STATUS_LOGGEDIN, &WorldSession::HandleInspectArenaStatsOpcode },
- /*0x378*/ { "SMSG_DEATH_RELEASE_LOC", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x379*/ { "CMSG_CANCEL_TEMP_ENCHANTMENT", STATUS_LOGGEDIN, &WorldSession::HandleCancelTempItemEnchantmentOpcode},
- /*0x37A*/ { "SMSG_FORCED_DEATH_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x37B*/ { "CMSG_CHEAT_SET_HONOR_CURRENCY", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x37C*/ { "CMSG_CHEAT_SET_ARENA_CURRENCY", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x37D*/ { "MSG_MOVE_SET_FLIGHT_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x37E*/ { "MSG_MOVE_SET_FLIGHT_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x37F*/ { "MSG_MOVE_SET_FLIGHT_BACK_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x380*/ { "MSG_MOVE_SET_FLIGHT_BACK_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x381*/ { "SMSG_FORCE_FLIGHT_SPEED_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x382*/ { "CMSG_FORCE_FLIGHT_SPEED_CHANGE_ACK", STATUS_LOGGEDIN, &WorldSession::HandleForceSpeedChangeAck },
- /*0x383*/ { "SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x384*/ { "CMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK", STATUS_LOGGEDIN, &WorldSession::HandleForceSpeedChangeAck },
- /*0x385*/ { "SMSG_SPLINE_SET_FLIGHT_SPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x386*/ { "SMSG_SPLINE_SET_FLIGHT_BACK_SPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x387*/ { "CMSG_MAELSTROM_INVALIDATE_CACHE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x388*/ { "SMSG_FLIGHT_SPLINE_SYNC", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x389*/ { "CMSG_SET_TAXI_BENCHMARK_MODE", STATUS_AUTHED, &WorldSession::HandleSetTaxiBenchmarkOpcode },
- /*0x38A*/ { "SMSG_JOINED_BATTLEGROUND_QUEUE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x38B*/ { "SMSG_REALM_SPLIT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x38C*/ { "CMSG_REALM_SPLIT", STATUS_AUTHED, &WorldSession::HandleRealmStateRequestOpcode },
- /*0x38D*/ { "CMSG_MOVE_CHNG_TRANSPORT", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x38E*/ { "MSG_PARTY_ASSIGNMENT", STATUS_LOGGEDIN, &WorldSession::HandleGroupPromoteOpcode },
- /*0x38F*/ { "SMSG_OFFER_PETITION_ERROR", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x390*/ { "SMSG_TIME_SYNC_REQ", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x391*/ { "CMSG_TIME_SYNC_RESP", STATUS_LOGGEDIN, &WorldSession::HandleTimeSyncResp },
- /*0x392*/ { "CMSG_SEND_LOCAL_EVENT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x393*/ { "CMSG_SEND_GENERAL_TRIGGER", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x394*/ { "CMSG_SEND_COMBAT_TRIGGER", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x395*/ { "CMSG_MAELSTROM_GM_SENT_MAIL", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x396*/ { "SMSG_RESET_FAILED_NOTIFY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x397*/ { "SMSG_REAL_GROUP_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x398*/ { "SMSG_LFG_DISABLED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x399*/ { "CMSG_ACTIVE_PVP_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x39A*/ { "CMSG_CHEAT_DUMP_ITEMS_DEBUG_ONLY", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x39B*/ { "SMSG_CHEAT_DUMP_ITEMS_DEBUG_ONLY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x39C*/ { "SMSG_CHEAT_DUMP_ITEMS_DEBUG_ONLY_RESPONSE_WRITE_FILE",STATUS_NEVER,&WorldSession::Handle_ServerSide },
- /*0x39D*/ { "SMSG_UPDATE_COMBO_POINTS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x39E*/ { "SMSG_VOICE_SESSION_ROSTER_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x39F*/ { "SMSG_VOICE_SESSION_LEAVE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3A0*/ { "SMSG_VOICE_SESSION_ADJUST_PRIORITY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3A1*/ { "CMSG_VOICE_SET_TALKER_MUTED_REQUEST", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3A2*/ { "SMSG_VOICE_SET_TALKER_MUTED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3A3*/ { "SMSG_INIT_EXTRA_AURA_INFO_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3A4*/ { "SMSG_SET_EXTRA_AURA_INFO_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3A5*/ { "SMSG_SET_EXTRA_AURA_INFO_NEED_UPDATE_OBSOLETE",STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3A6*/ { "SMSG_CLEAR_EXTRA_AURA_INFO_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3A7*/ { "MSG_MOVE_START_DESCEND", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
- /*0x3A8*/ { "CMSG_IGNORE_REQUIREMENTS_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3A9*/ { "SMSG_IGNORE_REQUIREMENTS_CHEAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3AA*/ { "SMSG_SPELL_CHANCE_PROC_LOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3AB*/ { "CMSG_MOVE_SET_RUN_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3AC*/ { "SMSG_DISMOUNT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3AD*/ { "MSG_MOVE_UPDATE_CAN_FLY", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3AE*/ { "MSG_RAID_READY_CHECK_CONFIRM", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3AF*/ { "CMSG_VOICE_SESSION_ENABLE", STATUS_AUTHED, &WorldSession::HandleVoiceSettingsOpcode },
- /*0x3B0*/ { "SMSG_VOICE_SESSION_ENABLE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3B1*/ { "SMSG_VOICE_PARENTAL_CONTROLS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3B2*/ { "CMSG_GM_WHISPER", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3B3*/ { "SMSG_GM_MESSAGECHAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3B4*/ { "MSG_GM_GEARRATING", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3B5*/ { "CMSG_COMMENTATOR_ENABLE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3B6*/ { "SMSG_COMMENTATOR_STATE_CHANGED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3B7*/ { "CMSG_COMMENTATOR_GET_MAP_INFO", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3B8*/ { "SMSG_COMMENTATOR_MAP_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3B9*/ { "CMSG_COMMENTATOR_GET_PLAYER_INFO", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3BA*/ { "SMSG_COMMENTATOR_GET_PLAYER_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3BB*/ { "SMSG_COMMENTATOR_PLAYER_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3BC*/ { "CMSG_COMMENTATOR_ENTER_INSTANCE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3BD*/ { "CMSG_COMMENTATOR_EXIT_INSTANCE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3BE*/ { "CMSG_COMMENTATOR_INSTANCE_COMMAND", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3BF*/ { "SMSG_CLEAR_TARGET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3C0*/ { "CMSG_BOT_DETECTED", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3C1*/ { "SMSG_CROSSED_INEBRIATION_THRESHOLD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3C2*/ { "CMSG_CHEAT_PLAYER_LOGIN", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3C3*/ { "CMSG_CHEAT_PLAYER_LOOKUP", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3C4*/ { "SMSG_CHEAT_PLAYER_LOOKUP", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3C5*/ { "SMSG_KICK_REASON", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3C6*/ { "MSG_RAID_READY_CHECK_FINISHED", STATUS_LOGGEDIN, &WorldSession::HandleRaidReadyCheckFinishOpcode},
- /*0x3C7*/ { "CMSG_COMPLAIN", STATUS_LOGGEDIN, &WorldSession::HandleReportSpamOpcode },
- /*0x3C8*/ { "SMSG_COMPLAIN_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3C9*/ { "SMSG_FEATURE_SYSTEM_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3CA*/ { "CMSG_GM_SHOW_COMPLAINTS", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3CB*/ { "CMSG_GM_UNSQUELCH", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3CC*/ { "CMSG_CHANNEL_SILENCE_VOICE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3CD*/ { "CMSG_CHANNEL_SILENCE_ALL", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3CE*/ { "CMSG_CHANNEL_UNSILENCE_VOICE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3CF*/ { "CMSG_CHANNEL_UNSILENCE_ALL", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3D0*/ { "CMSG_TARGET_CAST", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3D1*/ { "CMSG_TARGET_SCRIPT_CAST", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3D2*/ { "CMSG_CHANNEL_DISPLAY_LIST", STATUS_LOGGEDIN, &WorldSession::HandleChannelRosterQuery },
- /*0x3D3*/ { "CMSG_SET_ACTIVE_VOICE_CHANNEL", STATUS_AUTHED, &WorldSession::HandleChannelVoiceChatQuery },
- /*0x3D4*/ { "CMSG_GET_CHANNEL_MEMBER_COUNT", STATUS_LOGGEDIN, &WorldSession::HandleChannelInfoQuery },
- /*0x3D5*/ { "SMSG_CHANNEL_MEMBER_COUNT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3D6*/ { "CMSG_CHANNEL_VOICE_ON", STATUS_LOGGEDIN, &WorldSession::HandleChannelEnableVoiceOpcode },
- /*0x3D7*/ { "CMSG_CHANNEL_VOICE_OFF", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3D8*/ { "CMSG_DEBUG_LIST_TARGETS", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3D9*/ { "SMSG_DEBUG_LIST_TARGETS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3DA*/ { "SMSG_AVAILABLE_VOICE_CHANNEL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3DB*/ { "CMSG_ADD_VOICE_IGNORE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3DC*/ { "CMSG_DEL_VOICE_IGNORE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3DD*/ { "CMSG_PARTY_SILENCE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3DE*/ { "CMSG_PARTY_UNSILENCE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3DF*/ { "MSG_NOTIFY_PARTY_SQUELCH", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3E0*/ { "SMSG_COMSAT_RECONNECT_TRY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3E1*/ { "SMSG_COMSAT_DISCONNECT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3E2*/ { "SMSG_COMSAT_CONNECT_FAIL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3E3*/ { "SMSG_VOICE_CHAT_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3E4*/ { "CMSG_REPORT_PVP_AFK", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundReportAFK },
- /*0x3E5*/ { "CMSG_REPORT_PVP_AFK_RESULT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3E6*/ { "CMSG_GUILD_BANKER_ACTIVATE", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankQuery },
- /*0x3E7*/ { "CMSG_GUILD_BANK_QUERY_TAB", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankTabColon },
- /*0x3E8*/ { "SMSG_GUILD_BANK_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3E9*/ { "CMSG_GUILD_BANK_SWAP_ITEMS", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankDepositItem },
- /*0x3EA*/ { "CMSG_GUILD_BANK_BUY_TAB", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankBuyTab },
- /*0x3EB*/ { "CMSG_GUILD_BANK_UPDATE_TAB", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankModifyTab },
- /*0x3EC*/ { "CMSG_GUILD_BANK_DEPOSIT_MONEY", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankDeposit },
- /*0x3ED*/ { "CMSG_GUILD_BANK_WITHDRAW_MONEY", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankWithdraw },
- /*0x3EE*/ { "MSG_GUILD_BANK_LOG_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankLog },
- /*0x3EF*/ { "CMSG_SET_CHANNEL_WATCH", STATUS_LOGGEDIN, &WorldSession::HandleChannelJoinNotify },
- /*0x3F0*/ { "SMSG_USERLIST_ADD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3F1*/ { "SMSG_USERLIST_REMOVE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3F2*/ { "SMSG_USERLIST_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3F3*/ { "CMSG_CLEAR_CHANNEL_WATCH", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3F4*/ { "SMSG_INSPECT_TALENT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3F5*/ { "SMSG_GOGOGO_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3F6*/ { "SMSG_ECHO_PARTY_SQUELCH", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3F7*/ { "CMSG_SET_TITLE_SUFFIX", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3F8*/ { "CMSG_SPELLCLICK", STATUS_LOGGEDIN, &WorldSession::HandleSpellClick },
- /*0x3F9*/ { "SMSG_LOOT_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3FA*/ { "CMSG_GM_CHARACTER_RESTORE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3FB*/ { "CMSG_GM_CHARACTER_SAVE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x3FC*/ { "SMSG_VOICESESSION_FULL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x3FD*/ { "MSG_GUILD_PERMISSIONS", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankGetRights },
- /*0x3FE*/ { "MSG_GUILD_BANK_MONEY_WITHDRAWN", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankGetMoneyAmount },
- /*0x3FF*/ { "MSG_GUILD_EVENT_LOG_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleGuildEventLogOpcode },
- /*0x400*/ { "CMSG_MAELSTROM_RENAME_GUILD", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x401*/ { "CMSG_GET_MIRRORIMAGE_DATA", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x402*/ { "SMSG_MIRRORIMAGE_DATA", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x403*/ { "SMSG_FORCE_DISPLAY_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x404*/ { "SMSG_SPELL_CHANCE_RESIST_PUSHBACK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x405*/ { "CMSG_IGNORE_DIMINISHING_RETURNS_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x406*/ { "SMSG_IGNORE_DIMINISHING_RETURNS_CHEAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x407*/ { "CMSG_KEEP_ALIVE", STATUS_NEVER, &WorldSession::Handle_EarlyProccess },
- /*0x408*/ { "SMSG_RAID_READY_CHECK_ERROR", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x409*/ { "CMSG_OPT_OUT_OF_LOOT", STATUS_AUTHED, &WorldSession::HandleGroupPassOnLootOpcode },
- /*0x40A*/ { "MSG_QUERY_GUILD_BANK_TEXT", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankTabText },
- /*0x40B*/ { "CMSG_SET_GUILD_BANK_TEXT", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankSetTabText },
- /*0x40C*/ { "CMSG_SET_GRANTABLE_LEVELS", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x40D*/ { "CMSG_GRANT_LEVEL", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x40E*/ { "CMSG_REFER_A_FRIEND", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x40F*/ { "MSG_GM_CHANGE_ARENA_RATING", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x410*/ { "CMSG_DECLINE_CHANNEL_INVITE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x411*/ { "CMSG_GROUPACTION_THROTTLED", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x412*/ { "SMSG_OVERRIDE_LIGHT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x413*/ { "SMSG_TOTEM_CREATED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x414*/ { "CMSG_TOTEM_DESTROYED", STATUS_LOGGEDIN, &WorldSession::HandleTotemDestroy },
- /*0x415*/ { "CMSG_EXPIRE_RAID_INSTANCE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x416*/ { "CMSG_NO_SPELL_VARIANCE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x417*/ { "CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverStatusQueryMultipleOpcode},
- /*0x418*/ { "SMSG_QUESTGIVER_STATUS_MULTIPLE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x419*/ { "CMSG_SET_PLAYER_DECLINED_NAMES", STATUS_AUTHED, &WorldSession::HandleDeclinedPlayerNameOpcode },
- /*0x41A*/ { "SMSG_SET_PLAYER_DECLINED_NAMES_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x41B*/ { "CMSG_QUERY_SERVER_BUCK_DATA", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x41C*/ { "CMSG_CLEAR_SERVER_BUCK_DATA", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x41D*/ { "SMSG_SERVER_BUCK_DATA", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x41E*/ { "SMSG_SEND_UNLEARN_SPELLS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x41F*/ { "SMSG_PROPOSE_LEVEL_GRANT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x420*/ { "CMSG_ACCEPT_LEVEL_GRANT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x421*/ { "SMSG_REFER_A_FRIEND_FAILURE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x422*/ { "SMSG_SPLINE_MOVE_SET_FLYING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x423*/ { "SMSG_SPLINE_MOVE_UNSET_FLYING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x424*/ { "SMSG_SUMMON_CANCEL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x425*/ { "CMSG_CHANGE_PERSONAL_ARENA_RATING", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x426*/ { "CMSG_ALTER_APPEARANCE", STATUS_LOGGEDIN, &WorldSession::HandleAlterAppearance },
- /*0x427*/ { "SMSG_ENABLE_BARBER_SHOP", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x428*/ { "SMSG_BARBER_SHOP_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x429*/ { "CMSG_CALENDAR_GET_CALENDAR", STATUS_LOGGEDIN, &WorldSession::HandleCalendarGetCalendar },
- /*0x42A*/ { "CMSG_CALENDAR_GET_EVENT", STATUS_LOGGEDIN, &WorldSession::HandleCalendarGetEvent },
- /*0x42B*/ { "CMSG_CALENDAR_GUILD_FILTER", STATUS_LOGGEDIN, &WorldSession::HandleCalendarGuildFilter },
- /*0x42C*/ { "CMSG_CALENDAR_ARENA_TEAM", STATUS_LOGGEDIN, &WorldSession::HandleCalendarArenaTeam },
- /*0x42D*/ { "CMSG_CALENDAR_ADD_EVENT", STATUS_LOGGEDIN, &WorldSession::HandleCalendarAddEvent },
- /*0x42E*/ { "CMSG_CALENDAR_UPDATE_EVENT", STATUS_LOGGEDIN, &WorldSession::HandleCalendarUpdateEvent },
- /*0x42F*/ { "CMSG_CALENDAR_REMOVE_EVENT", STATUS_LOGGEDIN, &WorldSession::HandleCalendarRemoveEvent },
- /*0x430*/ { "CMSG_CALENDAR_COPY_EVENT", STATUS_LOGGEDIN, &WorldSession::HandleCalendarCopyEvent },
- /*0x431*/ { "CMSG_CALENDAR_EVENT_INVITE", STATUS_LOGGEDIN, &WorldSession::HandleCalendarEventInvite },
- /*0x432*/ { "CMSG_CALENDAR_EVENT_RSVP", STATUS_LOGGEDIN, &WorldSession::HandleCalendarEventRsvp },
- /*0x433*/ { "CMSG_CALENDAR_EVENT_REMOVE_INVITE", STATUS_LOGGEDIN, &WorldSession::HandleCalendarEventRemoveInvite },
- /*0x434*/ { "CMSG_CALENDAR_EVENT_STATUS", STATUS_LOGGEDIN, &WorldSession::HandleCalendarEventStatus },
- /*0x435*/ { "CMSG_CALENDAR_EVENT_MODERATOR_STATUS", STATUS_LOGGEDIN, &WorldSession::HandleCalendarEventModeratorStatus},
- /*0x436*/ { "SMSG_CALENDAR_SEND_CALENDAR", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x437*/ { "SMSG_CALENDAR_SEND_EVENT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x438*/ { "SMSG_CALENDAR_FILTER_GUILD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x439*/ { "SMSG_CALENDAR_ARENA_TEAM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x43A*/ { "SMSG_CALENDAR_EVENT_INVITE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x43B*/ { "SMSG_CALENDAR_EVENT_INVITE_REMOVED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x43C*/ { "SMSG_CALENDAR_EVENT_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x43D*/ { "SMSG_CALENDAR_COMMAND_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x43E*/ { "SMSG_CALENDAR_RAID_LOCKOUT_ADDED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x43F*/ { "SMSG_CALENDAR_RAID_LOCKOUT_REMOVED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x440*/ { "SMSG_CALENDAR_EVENT_INVITE_ALERT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x441*/ { "SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x442*/ { "SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x443*/ { "SMSG_CALENDAR_EVENT_REMOVED_ALERT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x444*/ { "SMSG_CALENDAR_EVENT_UPDATED_ALERT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x445*/ { "SMSG_CALENDAR_EVENT_MODERATOR_STATUS_ALERT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x446*/ { "CMSG_CALENDAR_COMPLAIN", STATUS_LOGGEDIN, &WorldSession::HandleCalendarComplain },
- /*0x447*/ { "CMSG_CALENDAR_GET_NUM_PENDING", STATUS_LOGGEDIN, &WorldSession::HandleCalendarGetNumPending },
- /*0x448*/ { "SMSG_CALENDAR_SEND_NUM_PENDING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x449*/ { "CMSG_SAVE_DANCE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x44A*/ { "SMSG_NOTIFY_DANCE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x44B*/ { "CMSG_PLAY_DANCE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x44C*/ { "SMSG_PLAY_DANCE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x44D*/ { "CMSG_LOAD_DANCES", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x44E*/ { "CMSG_STOP_DANCE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x44F*/ { "SMSG_STOP_DANCE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x450*/ { "CMSG_SYNC_DANCE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x451*/ { "CMSG_DANCE_QUERY", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x452*/ { "SMSG_DANCE_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x453*/ { "SMSG_INVALIDATE_DANCE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x454*/ { "CMSG_DELETE_DANCE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x455*/ { "SMSG_LEARNED_DANCE_MOVES", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x456*/ { "CMSG_LEARN_DANCE_MOVE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x457*/ { "CMSG_UNLEARN_DANCE_MOVE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x458*/ { "CMSG_SET_RUNE_COUNT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x459*/ { "CMSG_SET_RUNE_COOLDOWN", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x45A*/ { "MSG_MOVE_SET_PITCH_RATE_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x45B*/ { "MSG_MOVE_SET_PITCH_RATE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x45C*/ { "SMSG_FORCE_PITCH_RATE_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x45D*/ { "CMSG_FORCE_PITCH_RATE_CHANGE_ACK", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x45E*/ { "SMSG_SPLINE_SET_PITCH_RATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x45F*/ { "SMSG_MOVE_ABANDON_TRANSPORT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x460*/ { "MSG_MOVE_ABANDON_TRANSPORT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x461*/ { "CMSG_MOVE_ABANDON_TRANSPORT_ACK", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x462*/ { "CMSG_UPDATE_MISSILE_TRAJECTORY", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x463*/ { "SMSG_UPDATE_ACCOUNT_DATA_COMPLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x464*/ { "SMSG_TRIGGER_MOVIE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x465*/ { "CMSG_COMPLETE_MOVIE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x466*/ { "CMSG_SET_GLYPH_SLOT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x467*/ { "CMSG_SET_GLYPH", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x468*/ { "SMSG_ACHIEVEMENT_EARNED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x469*/ { "SMSG_DYNAMIC_DROP_ROLL_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x46A*/ { "SMSG_CRITERIA_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x46B*/ { "CMSG_QUERY_INSPECT_ACHIEVEMENTS", STATUS_LOGGEDIN, &WorldSession::HandleInspectAchievements },
- /*0x46C*/ { "SMSG_RESPOND_INSPECT_ACHIEVEMENTS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x46D*/ { "CMSG_DISMISS_CONTROLLED_VEHICLE", STATUS_LOGGEDIN, &WorldSession::HandleDismissControlledVehicle },
- /*0x46E*/ { "CMSG_COMPLETE_ACHIEVEMENT_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x46F*/ { "SMSG_QUESTUPDATE_ADD_PVP_KILL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x470*/ { "CMSG_SET_CRITERIA_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x471*/ { "SMSG_GROUP_SWAP_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x472*/ { "CMSG_UNITANIMTIER_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x473*/ { "CMSG_CHAR_CUSTOMIZE", STATUS_AUTHED, &WorldSession::HandleCharCustomize },
- /*0x474*/ { "SMSG_CHAR_CUSTOMIZE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x475*/ { "SMSG_PET_RENAMEABLE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x476*/ { "CMSG_REQUEST_VEHICLE_EXIT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x477*/ { "CMSG_REQUEST_VEHICLE_PREV_SEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x478*/ { "CMSG_REQUEST_VEHICLE_NEXT_SEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x479*/ { "CMSG_REQUEST_VEHICLE_SWITCH_SEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x47A*/ { "CMSG_PET_LEARN_TALENT", STATUS_LOGGEDIN, &WorldSession::HandlePetLearnTalent },
- /*0x47B*/ { "CMSG_PET_UNLEARN_TALENTS", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x47C*/ { "SMSG_SET_PHASE_SHIFT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x47D*/ { "SMSG_ALL_ACHIEVEMENT_DATA", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x47E*/ { "CMSG_FORCE_SAY_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x47F*/ { "SMSG_HEALTH_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x480*/ { "SMSG_POWER_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x481*/ { "CMSG_GAMEOBJ_REPORT_USE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x482*/ { "SMSG_HIGHEST_THREAT_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x483*/ { "SMSG_THREAT_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x484*/ { "SMSG_THREAT_REMOVE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x485*/ { "SMSG_THREAT_CLEAR", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x486*/ { "SMSG_CONVERT_RUNE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x487*/ { "SMSG_RESYNC_RUNES", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x488*/ { "SMSG_ADD_RUNE_POWER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x489*/ { "CMSG_START_QUEST", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x48A*/ { "CMSG_REMOVE_GLYPH", STATUS_LOGGEDIN, &WorldSession::HandleRemoveGlyph },
- /*0x48B*/ { "CMSG_DUMP_OBJECTS", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x48C*/ { "SMSG_DUMP_OBJECTS_DATA", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x48D*/ { "CMSG_DISMISS_CRITTER", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x48E*/ { "SMSG_NOTIFY_DEST_LOC_SPELL_CAST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x48F*/ { "CMSG_AUCTION_LIST_PENDING_SALES", STATUS_LOGGEDIN, &WorldSession::HandleAuctionListPendingSales },
- /*0x490*/ { "SMSG_AUCTION_LIST_PENDING_SALES", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x491*/ { "SMSG_MODIFY_COOLDOWN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x492*/ { "SMSG_PET_UPDATE_COMBO_POINTS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x493*/ { "CMSG_ENABLETAXI", STATUS_LOGGEDIN, &WorldSession::HandleTaxiQueryAvailableNodes },
- /*0x494*/ { "SMSG_PRE_RESURRECT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x495*/ { "SMSG_AURA_UPDATE_ALL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x496*/ { "SMSG_AURA_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x497*/ { "CMSG_FLOOD_GRACE_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x498*/ { "SMSG_SERVER_FIRST_ACHIEVEMENT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x499*/ { "SMSG_PET_LEARNED_SPELL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x49A*/ { "SMSG_PET_REMOVED_SPELL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x49B*/ { "CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x49C*/ { "CMSG_HEARTH_AND_RESURRECT", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x49D*/ { "SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x49E*/ { "SMSG_CRITERIA_DELETED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x49F*/ { "SMSG_ACHIEVEMENT_DELETED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x4A0*/ { "CMSG_SERVER_INFO_QUERY", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x4A1*/ { "SMSG_SERVER_INFO_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x4A2*/ { "CMSG_CHECK_LOGIN_CRITERIA", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x4A3*/ { "SMSG_SERVER_BUCK_DATA_START", STATUS_NEVER, &WorldSession::Handle_ServerSide },
- /*0x4A4*/ { "CMSG_QUERY_VEHICLE_STATUS", STATUS_NEVER, &WorldSession::Handle_NULL },
- /*0x4A5*/ { "SMSG_PET_GUIDS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x000*/ { "MSG_NULL_ACTION", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x001*/ { "CMSG_BOOTME", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x002*/ { "CMSG_DBLOOKUP", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x003*/ { "SMSG_DBLOOKUP", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x004*/ { "CMSG_QUERY_OBJECT_POSITION", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x005*/ { "SMSG_QUERY_OBJECT_POSITION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x006*/ { "CMSG_QUERY_OBJECT_ROTATION", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x007*/ { "SMSG_QUERY_OBJECT_ROTATION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x008*/ { "CMSG_WORLD_TELEPORT", STATUS_LOGGEDIN, &WorldSession::HandleWorldTeleportOpcode },
+ /*0x009*/ { "CMSG_TELEPORT_TO_UNIT", STATUS_LOGGEDIN, &WorldSession::Handle_NULL },
+ /*0x00A*/ { "CMSG_ZONE_MAP", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x00B*/ { "SMSG_ZONE_MAP", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x00C*/ { "CMSG_DEBUG_CHANGECELLZONE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x00D*/ { "CMSG_EMBLAZON_TABARD_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x00E*/ { "CMSG_UNEMBLAZON_TABARD_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x00F*/ { "CMSG_RECHARGE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x010*/ { "CMSG_LEARN_SPELL", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x011*/ { "CMSG_CREATEMONSTER", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x012*/ { "CMSG_DESTROYMONSTER", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x013*/ { "CMSG_CREATEITEM", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x014*/ { "CMSG_CREATEGAMEOBJECT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x015*/ { "SMSG_CHECK_FOR_BOTS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x016*/ { "CMSG_MAKEMONSTERATTACKGUID", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x017*/ { "CMSG_BOT_DETECTED2", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x018*/ { "CMSG_FORCEACTION", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x019*/ { "CMSG_FORCEACTIONONOTHER", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x01A*/ { "CMSG_FORCEACTIONSHOW", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x01B*/ { "SMSG_FORCEACTIONSHOW", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x01C*/ { "CMSG_PETGODMODE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x01D*/ { "SMSG_PETGODMODE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x01E*/ { "SMSG_DEBUGINFOSPELLMISS_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x01F*/ { "CMSG_WEATHER_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x020*/ { "CMSG_UNDRESSPLAYER", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x021*/ { "CMSG_BEASTMASTER", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x022*/ { "CMSG_GODMODE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x023*/ { "SMSG_GODMODE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x024*/ { "CMSG_CHEAT_SETMONEY", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x025*/ { "CMSG_LEVEL_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x026*/ { "CMSG_PET_LEVEL_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x027*/ { "CMSG_SET_WORLDSTATE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x028*/ { "CMSG_COOLDOWN_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x029*/ { "CMSG_USE_SKILL_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x02A*/ { "CMSG_FLAG_QUEST", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x02B*/ { "CMSG_FLAG_QUEST_FINISH", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x02C*/ { "CMSG_CLEAR_QUEST", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x02D*/ { "CMSG_SEND_EVENT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x02E*/ { "CMSG_DEBUG_AISTATE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x02F*/ { "SMSG_DEBUG_AISTATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x030*/ { "CMSG_DISABLE_PVP_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x031*/ { "CMSG_ADVANCE_SPAWN_TIME", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x032*/ { "CMSG_PVP_PORT_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x033*/ { "CMSG_AUTH_SRP6_BEGIN", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x034*/ { "CMSG_AUTH_SRP6_PROOF", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x035*/ { "CMSG_AUTH_SRP6_RECODE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x036*/ { "CMSG_CHAR_CREATE", STATUS_AUTHED, &WorldSession::HandleCharCreateOpcode },
+ /*0x037*/ { "CMSG_CHAR_ENUM", STATUS_AUTHED, &WorldSession::HandleCharEnumOpcode },
+ /*0x038*/ { "CMSG_CHAR_DELETE", STATUS_AUTHED, &WorldSession::HandleCharDeleteOpcode },
+ /*0x039*/ { "SMSG_AUTH_SRP6_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x03A*/ { "SMSG_CHAR_CREATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x03B*/ { "SMSG_CHAR_ENUM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x03C*/ { "SMSG_CHAR_DELETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x03D*/ { "CMSG_PLAYER_LOGIN", STATUS_AUTHED, &WorldSession::HandlePlayerLoginOpcode },
+ /*0x03E*/ { "SMSG_NEW_WORLD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x03F*/ { "SMSG_TRANSFER_PENDING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x040*/ { "SMSG_TRANSFER_ABORTED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x041*/ { "SMSG_CHARACTER_LOGIN_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x042*/ { "SMSG_LOGIN_SETTIMESPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x043*/ { "SMSG_GAMETIME_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x044*/ { "CMSG_GAMETIME_SET", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x045*/ { "SMSG_GAMETIME_SET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x046*/ { "CMSG_GAMESPEED_SET", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x047*/ { "SMSG_GAMESPEED_SET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x048*/ { "CMSG_SERVERTIME", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x049*/ { "SMSG_SERVERTIME", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x04A*/ { "CMSG_PLAYER_LOGOUT", STATUS_LOGGEDIN, &WorldSession::HandlePlayerLogoutOpcode },
+ /*0x04B*/ { "CMSG_LOGOUT_REQUEST", STATUS_LOGGEDIN, &WorldSession::HandleLogoutRequestOpcode },
+ /*0x04C*/ { "SMSG_LOGOUT_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x04D*/ { "SMSG_LOGOUT_COMPLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x04E*/ { "CMSG_LOGOUT_CANCEL", STATUS_LOGGEDIN, &WorldSession::HandleLogoutCancelOpcode },
+ /*0x04F*/ { "SMSG_LOGOUT_CANCEL_ACK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x050*/ { "CMSG_NAME_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleNameQueryOpcode },
+ /*0x051*/ { "SMSG_NAME_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x052*/ { "CMSG_PET_NAME_QUERY", STATUS_LOGGEDIN, &WorldSession::HandlePetNameQuery },
+ /*0x053*/ { "SMSG_PET_NAME_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x054*/ { "CMSG_GUILD_QUERY", STATUS_AUTHED, &WorldSession::HandleGuildQueryOpcode },
+ /*0x055*/ { "SMSG_GUILD_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x056*/ { "CMSG_ITEM_QUERY_SINGLE", STATUS_LOGGEDIN, &WorldSession::HandleItemQuerySingleOpcode },
+ /*0x057*/ { "CMSG_ITEM_QUERY_MULTIPLE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x058*/ { "SMSG_ITEM_QUERY_SINGLE_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x059*/ { "SMSG_ITEM_QUERY_MULTIPLE_RESPONSE",STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x05A*/ { "CMSG_PAGE_TEXT_QUERY", STATUS_LOGGEDIN, &WorldSession::HandlePageQueryOpcode },
+ /*0x05B*/ { "SMSG_PAGE_TEXT_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x05C*/ { "CMSG_QUEST_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleQuestQueryOpcode },
+ /*0x05D*/ { "SMSG_QUEST_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x05E*/ { "CMSG_GAMEOBJECT_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleGameObjectQueryOpcode },
+ /*0x05F*/ { "SMSG_GAMEOBJECT_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x060*/ { "CMSG_CREATURE_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleCreatureQueryOpcode },
+ /*0x061*/ { "SMSG_CREATURE_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x062*/ { "CMSG_WHO", STATUS_LOGGEDIN, &WorldSession::HandleWhoOpcode },
+ /*0x063*/ { "SMSG_WHO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x064*/ { "CMSG_WHOIS", STATUS_LOGGEDIN, &WorldSession::HandleWhoisOpcode },
+ /*0x065*/ { "SMSG_WHOIS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x066*/ { "CMSG_CONTACT_LIST", STATUS_LOGGEDIN, &WorldSession::HandleFriendListOpcode },
+ /*0x067*/ { "SMSG_CONTACT_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x068*/ { "SMSG_FRIEND_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x069*/ { "CMSG_ADD_FRIEND", STATUS_LOGGEDIN, &WorldSession::HandleAddFriendOpcode },
+ /*0x06A*/ { "CMSG_DEL_FRIEND", STATUS_LOGGEDIN, &WorldSession::HandleDelFriendOpcode },
+ /*0x06B*/ { "CMSG_SET_CONTACT_NOTES", STATUS_LOGGEDIN, &WorldSession::HandleSetFriendNoteOpcode },
+ /*0x06C*/ { "CMSG_ADD_IGNORE", STATUS_LOGGEDIN, &WorldSession::HandleAddIgnoreOpcode },
+ /*0x06D*/ { "CMSG_DEL_IGNORE", STATUS_LOGGEDIN, &WorldSession::HandleDelIgnoreOpcode },
+ /*0x06E*/ { "CMSG_GROUP_INVITE", STATUS_LOGGEDIN, &WorldSession::HandleGroupInviteOpcode },
+ /*0x06F*/ { "SMSG_GROUP_INVITE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x070*/ { "CMSG_GROUP_CANCEL", STATUS_LOGGEDIN, &WorldSession::Handle_Deprecated },
+ /*0x071*/ { "SMSG_GROUP_CANCEL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x072*/ { "CMSG_GROUP_ACCEPT", STATUS_LOGGEDIN, &WorldSession::HandleGroupAcceptOpcode },
+ /*0x073*/ { "CMSG_GROUP_DECLINE", STATUS_LOGGEDIN, &WorldSession::HandleGroupDeclineOpcode },
+ /*0x074*/ { "SMSG_GROUP_DECLINE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x075*/ { "CMSG_GROUP_UNINVITE", STATUS_LOGGEDIN, &WorldSession::HandleGroupUninviteNameOpcode },
+ /*0x076*/ { "CMSG_GROUP_UNINVITE_GUID", STATUS_LOGGEDIN, &WorldSession::HandleGroupUninviteGuidOpcode },
+ /*0x077*/ { "SMSG_GROUP_UNINVITE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x078*/ { "CMSG_GROUP_SET_LEADER", STATUS_LOGGEDIN, &WorldSession::HandleGroupSetLeaderOpcode },
+ /*0x079*/ { "SMSG_GROUP_SET_LEADER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x07A*/ { "CMSG_LOOT_METHOD", STATUS_LOGGEDIN, &WorldSession::HandleLootMethodOpcode },
+ /*0x07B*/ { "CMSG_GROUP_DISBAND", STATUS_LOGGEDIN, &WorldSession::HandleGroupLeaveOpcode },
+ /*0x07C*/ { "SMSG_GROUP_DESTROYED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x07D*/ { "SMSG_GROUP_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x07E*/ { "SMSG_PARTY_MEMBER_STATS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x07F*/ { "SMSG_PARTY_COMMAND_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x080*/ { "UMSG_UPDATE_GROUP_MEMBERS", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x081*/ { "CMSG_GUILD_CREATE", STATUS_LOGGEDIN, &WorldSession::HandleGuildCreateOpcode },
+ /*0x082*/ { "CMSG_GUILD_INVITE", STATUS_LOGGEDIN, &WorldSession::HandleGuildInviteOpcode },
+ /*0x083*/ { "SMSG_GUILD_INVITE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x084*/ { "CMSG_GUILD_ACCEPT", STATUS_LOGGEDIN, &WorldSession::HandleGuildAcceptOpcode },
+ /*0x085*/ { "CMSG_GUILD_DECLINE", STATUS_LOGGEDIN, &WorldSession::HandleGuildDeclineOpcode },
+ /*0x086*/ { "SMSG_GUILD_DECLINE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x087*/ { "CMSG_GUILD_INFO", STATUS_LOGGEDIN, &WorldSession::HandleGuildInfoOpcode },
+ /*0x088*/ { "SMSG_GUILD_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x089*/ { "CMSG_GUILD_ROSTER", STATUS_LOGGEDIN, &WorldSession::HandleGuildRosterOpcode },
+ /*0x08A*/ { "SMSG_GUILD_ROSTER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x08B*/ { "CMSG_GUILD_PROMOTE", STATUS_LOGGEDIN, &WorldSession::HandleGuildPromoteOpcode },
+ /*0x08C*/ { "CMSG_GUILD_DEMOTE", STATUS_LOGGEDIN, &WorldSession::HandleGuildDemoteOpcode },
+ /*0x08D*/ { "CMSG_GUILD_LEAVE", STATUS_LOGGEDIN, &WorldSession::HandleGuildLeaveOpcode },
+ /*0x08E*/ { "CMSG_GUILD_REMOVE", STATUS_LOGGEDIN, &WorldSession::HandleGuildRemoveOpcode },
+ /*0x08F*/ { "CMSG_GUILD_DISBAND", STATUS_LOGGEDIN, &WorldSession::HandleGuildDisbandOpcode },
+ /*0x090*/ { "CMSG_GUILD_LEADER", STATUS_LOGGEDIN, &WorldSession::HandleGuildLeaderOpcode },
+ /*0x091*/ { "CMSG_GUILD_MOTD", STATUS_LOGGEDIN, &WorldSession::HandleGuildMOTDOpcode },
+ /*0x092*/ { "SMSG_GUILD_EVENT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x093*/ { "SMSG_GUILD_COMMAND_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x094*/ { "UMSG_UPDATE_GUILD", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x095*/ { "CMSG_MESSAGECHAT", STATUS_LOGGEDIN, &WorldSession::HandleMessagechatOpcode },
+ /*0x096*/ { "SMSG_MESSAGECHAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x097*/ { "CMSG_JOIN_CHANNEL", STATUS_LOGGEDIN, &WorldSession::HandleChannelJoin },
+ /*0x098*/ { "CMSG_LEAVE_CHANNEL", STATUS_LOGGEDIN, &WorldSession::HandleChannelLeave },
+ /*0x099*/ { "SMSG_CHANNEL_NOTIFY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x09A*/ { "CMSG_CHANNEL_LIST", STATUS_LOGGEDIN, &WorldSession::HandleChannelList },
+ /*0x09B*/ { "SMSG_CHANNEL_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x09C*/ { "CMSG_CHANNEL_PASSWORD", STATUS_LOGGEDIN, &WorldSession::HandleChannelPassword },
+ /*0x09D*/ { "CMSG_CHANNEL_SET_OWNER", STATUS_LOGGEDIN, &WorldSession::HandleChannelSetOwner },
+ /*0x09E*/ { "CMSG_CHANNEL_OWNER", STATUS_LOGGEDIN, &WorldSession::HandleChannelOwner },
+ /*0x09F*/ { "CMSG_CHANNEL_MODERATOR", STATUS_LOGGEDIN, &WorldSession::HandleChannelModerator },
+ /*0x0A0*/ { "CMSG_CHANNEL_UNMODERATOR", STATUS_LOGGEDIN, &WorldSession::HandleChannelUnmoderator },
+ /*0x0A1*/ { "CMSG_CHANNEL_MUTE", STATUS_LOGGEDIN, &WorldSession::HandleChannelMute },
+ /*0x0A2*/ { "CMSG_CHANNEL_UNMUTE", STATUS_LOGGEDIN, &WorldSession::HandleChannelUnmute },
+ /*0x0A3*/ { "CMSG_CHANNEL_INVITE", STATUS_LOGGEDIN, &WorldSession::HandleChannelInvite },
+ /*0x0A4*/ { "CMSG_CHANNEL_KICK", STATUS_LOGGEDIN, &WorldSession::HandleChannelKick },
+ /*0x0A5*/ { "CMSG_CHANNEL_BAN", STATUS_LOGGEDIN, &WorldSession::HandleChannelBan },
+ /*0x0A6*/ { "CMSG_CHANNEL_UNBAN", STATUS_LOGGEDIN, &WorldSession::HandleChannelUnban },
+ /*0x0A7*/ { "CMSG_CHANNEL_ANNOUNCEMENTS", STATUS_LOGGEDIN, &WorldSession::HandleChannelAnnounce },
+ /*0x0A8*/ { "CMSG_CHANNEL_MODERATE", STATUS_LOGGEDIN, &WorldSession::HandleChannelModerate },
+ /*0x0A9*/ { "SMSG_UPDATE_OBJECT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0AA*/ { "SMSG_DESTROY_OBJECT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0AB*/ { "CMSG_USE_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleUseItemOpcode },
+ /*0x0AC*/ { "CMSG_OPEN_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleOpenItemOpcode },
+ /*0x0AD*/ { "CMSG_READ_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleReadItem },
+ /*0x0AE*/ { "SMSG_READ_ITEM_OK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0AF*/ { "SMSG_READ_ITEM_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0B0*/ { "SMSG_ITEM_COOLDOWN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0B1*/ { "CMSG_GAMEOBJ_USE", STATUS_LOGGEDIN, &WorldSession::HandleGameObjectUseOpcode },
+ /*0x0B2*/ { "CMSG_GAMEOBJ_CHAIR_USE_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0B3*/ { "SMSG_GAMEOBJECT_CUSTOM_ANIM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0B4*/ { "CMSG_AREATRIGGER", STATUS_LOGGEDIN, &WorldSession::HandleAreaTriggerOpcode },
+ /*0x0B5*/ { "MSG_MOVE_START_FORWARD", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0B6*/ { "MSG_MOVE_START_BACKWARD", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0B7*/ { "MSG_MOVE_STOP", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0B8*/ { "MSG_MOVE_START_STRAFE_LEFT", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0B9*/ { "MSG_MOVE_START_STRAFE_RIGHT", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0BA*/ { "MSG_MOVE_STOP_STRAFE", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0BB*/ { "MSG_MOVE_JUMP", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0BC*/ { "MSG_MOVE_START_TURN_LEFT", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0BD*/ { "MSG_MOVE_START_TURN_RIGHT", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0BE*/ { "MSG_MOVE_STOP_TURN", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0BF*/ { "MSG_MOVE_START_PITCH_UP", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0C0*/ { "MSG_MOVE_START_PITCH_DOWN", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0C1*/ { "MSG_MOVE_STOP_PITCH", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0C2*/ { "MSG_MOVE_SET_RUN_MODE", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0C3*/ { "MSG_MOVE_SET_WALK_MODE", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0C4*/ { "MSG_MOVE_TOGGLE_LOGGING", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0C5*/ { "MSG_MOVE_TELEPORT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0C6*/ { "MSG_MOVE_TELEPORT_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0C7*/ { "MSG_MOVE_TELEPORT_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveTeleportAck },
+ /*0x0C8*/ { "MSG_MOVE_TOGGLE_FALL_LOGGING", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0C9*/ { "MSG_MOVE_FALL_LAND", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0CA*/ { "MSG_MOVE_START_SWIM", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0CB*/ { "MSG_MOVE_STOP_SWIM", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0CC*/ { "MSG_MOVE_SET_RUN_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0CD*/ { "MSG_MOVE_SET_RUN_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0CE*/ { "MSG_MOVE_SET_RUN_BACK_SPEED_CHEAT",STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0CF*/ { "MSG_MOVE_SET_RUN_BACK_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0D0*/ { "MSG_MOVE_SET_WALK_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0D1*/ { "MSG_MOVE_SET_WALK_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0D2*/ { "MSG_MOVE_SET_SWIM_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0D3*/ { "MSG_MOVE_SET_SWIM_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0D4*/ { "MSG_MOVE_SET_SWIM_BACK_SPEED_CHEAT",STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0D5*/ { "MSG_MOVE_SET_SWIM_BACK_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0D6*/ { "MSG_MOVE_SET_ALL_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0D7*/ { "MSG_MOVE_SET_TURN_RATE_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0D8*/ { "MSG_MOVE_SET_TURN_RATE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0D9*/ { "MSG_MOVE_TOGGLE_COLLISION_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0DA*/ { "MSG_MOVE_SET_FACING", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0DB*/ { "MSG_MOVE_SET_PITCH", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0DC*/ { "MSG_MOVE_WORLDPORT_ACK", STATUS_TRANSFER_PENDING, &WorldSession::HandleMoveWorldportAckOpcode},
+ /*0x0DD*/ { "SMSG_MONSTER_MOVE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0DE*/ { "SMSG_MOVE_WATER_WALK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0DF*/ { "SMSG_MOVE_LAND_WALK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0E0*/ { "MSG_MOVE_SET_RAW_POSITION_ACK", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0E1*/ { "CMSG_MOVE_SET_RAW_POSITION", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0E2*/ { "SMSG_FORCE_RUN_SPEED_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0E3*/ { "CMSG_FORCE_RUN_SPEED_CHANGE_ACK", STATUS_LOGGEDIN, &WorldSession::HandleForceSpeedChangeAck },
+ /*0x0E4*/ { "SMSG_FORCE_RUN_BACK_SPEED_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0E5*/ { "CMSG_FORCE_RUN_BACK_SPEED_CHANGE_ACK",STATUS_LOGGEDIN,&WorldSession::HandleForceSpeedChangeAck },
+ /*0x0E6*/ { "SMSG_FORCE_SWIM_SPEED_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0E7*/ { "CMSG_FORCE_SWIM_SPEED_CHANGE_ACK", STATUS_LOGGEDIN, &WorldSession::HandleForceSpeedChangeAck },
+ /*0x0E8*/ { "SMSG_FORCE_MOVE_ROOT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0E9*/ { "CMSG_FORCE_MOVE_ROOT_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveRootAck },
+ /*0x0EA*/ { "SMSG_FORCE_MOVE_UNROOT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0EB*/ { "CMSG_FORCE_MOVE_UNROOT_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveUnRootAck },
+ /*0x0EC*/ { "MSG_MOVE_ROOT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0ED*/ { "MSG_MOVE_UNROOT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0EE*/ { "MSG_MOVE_HEARTBEAT", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x0EF*/ { "SMSG_MOVE_KNOCK_BACK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0F0*/ { "CMSG_MOVE_KNOCK_BACK_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveKnockBackAck },
+ /*0x0F1*/ { "MSG_MOVE_KNOCK_BACK", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0F2*/ { "SMSG_MOVE_FEATHER_FALL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0F3*/ { "SMSG_MOVE_NORMAL_FALL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0F4*/ { "SMSG_MOVE_SET_HOVER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0F5*/ { "SMSG_MOVE_UNSET_HOVER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0F6*/ { "CMSG_MOVE_HOVER_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveHoverAck },
+ /*0x0F7*/ { "MSG_MOVE_HOVER", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0F8*/ { "CMSG_TRIGGER_CINEMATIC_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0F9*/ { "CMSG_OPENING_CINEMATIC", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x0FA*/ { "SMSG_TRIGGER_CINEMATIC", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0FB*/ { "CMSG_NEXT_CINEMATIC_CAMERA", STATUS_LOGGEDIN, &WorldSession::HandleNextCinematicCamera },
+ /*0x0FC*/ { "CMSG_COMPLETE_CINEMATIC", STATUS_LOGGEDIN, &WorldSession::HandleCompleteCinema },
+ /*0x0FD*/ { "SMSG_TUTORIAL_FLAGS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x0FE*/ { "CMSG_TUTORIAL_FLAG", STATUS_LOGGEDIN, &WorldSession::HandleTutorialFlag },
+ /*0x0FF*/ { "CMSG_TUTORIAL_CLEAR", STATUS_LOGGEDIN, &WorldSession::HandleTutorialClear },
+ /*0x100*/ { "CMSG_TUTORIAL_RESET", STATUS_LOGGEDIN, &WorldSession::HandleTutorialReset },
+ /*0x101*/ { "CMSG_STANDSTATECHANGE", STATUS_LOGGEDIN, &WorldSession::HandleStandStateChangeOpcode },
+ /*0x102*/ { "CMSG_EMOTE", STATUS_LOGGEDIN, &WorldSession::HandleEmoteOpcode },
+ /*0x103*/ { "SMSG_EMOTE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x104*/ { "CMSG_TEXT_EMOTE", STATUS_LOGGEDIN, &WorldSession::HandleTextEmoteOpcode },
+ /*0x105*/ { "SMSG_TEXT_EMOTE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x106*/ { "CMSG_AUTOEQUIP_GROUND_ITEM", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x107*/ { "CMSG_AUTOSTORE_GROUND_ITEM", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x108*/ { "CMSG_AUTOSTORE_LOOT_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAutostoreLootItemOpcode },
+ /*0x109*/ { "CMSG_STORE_LOOT_IN_SLOT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x10A*/ { "CMSG_AUTOEQUIP_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAutoEquipItemOpcode },
+ /*0x10B*/ { "CMSG_AUTOSTORE_BAG_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAutoStoreBagItemOpcode },
+ /*0x10C*/ { "CMSG_SWAP_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleSwapItem },
+ /*0x10D*/ { "CMSG_SWAP_INV_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleSwapInvItemOpcode },
+ /*0x10E*/ { "CMSG_SPLIT_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleSplitItemOpcode },
+ /*0x10F*/ { "CMSG_AUTOEQUIP_ITEM_SLOT", STATUS_LOGGEDIN, &WorldSession::HandleAutoEquipItemSlotOpcode },
+ /*0x110*/ { "OBSOLETE_DROP_ITEM", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x111*/ { "CMSG_DESTROYITEM", STATUS_LOGGEDIN, &WorldSession::HandleDestroyItemOpcode },
+ /*0x112*/ { "SMSG_INVENTORY_CHANGE_FAILURE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x113*/ { "SMSG_OPEN_CONTAINER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x114*/ { "CMSG_INSPECT", STATUS_LOGGEDIN, &WorldSession::HandleInspectOpcode },
+ /*0x115*/ { "SMSG_INSPECT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x116*/ { "CMSG_INITIATE_TRADE", STATUS_LOGGEDIN, &WorldSession::HandleInitiateTradeOpcode },
+ /*0x117*/ { "CMSG_BEGIN_TRADE", STATUS_LOGGEDIN, &WorldSession::HandleBeginTradeOpcode },
+ /*0x118*/ { "CMSG_BUSY_TRADE", STATUS_LOGGEDIN, &WorldSession::HandleBusyTradeOpcode },
+ /*0x119*/ { "CMSG_IGNORE_TRADE", STATUS_LOGGEDIN, &WorldSession::HandleIgnoreTradeOpcode },
+ /*0x11A*/ { "CMSG_ACCEPT_TRADE", STATUS_LOGGEDIN, &WorldSession::HandleAcceptTradeOpcode },
+ /*0x11B*/ { "CMSG_UNACCEPT_TRADE", STATUS_LOGGEDIN, &WorldSession::HandleUnacceptTradeOpcode },
+ /*0x11C*/ { "CMSG_CANCEL_TRADE", STATUS_AUTHED, &WorldSession::HandleCancelTradeOpcode },
+ /*0x11D*/ { "CMSG_SET_TRADE_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleSetTradeItemOpcode },
+ /*0x11E*/ { "CMSG_CLEAR_TRADE_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleClearTradeItemOpcode },
+ /*0x11F*/ { "CMSG_SET_TRADE_GOLD", STATUS_LOGGEDIN, &WorldSession::HandleSetTradeGoldOpcode },
+ /*0x120*/ { "SMSG_TRADE_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x121*/ { "SMSG_TRADE_STATUS_EXTENDED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x122*/ { "SMSG_INITIALIZE_FACTIONS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x123*/ { "SMSG_SET_FACTION_VISIBLE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x124*/ { "SMSG_SET_FACTION_STANDING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x125*/ { "CMSG_SET_FACTION_ATWAR", STATUS_LOGGEDIN, &WorldSession::HandleSetFactionAtWar },
+ /*0x126*/ { "CMSG_SET_FACTION_CHEAT", STATUS_LOGGEDIN, &WorldSession::HandleSetFactionCheat },
+ /*0x127*/ { "SMSG_SET_PROFICIENCY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x128*/ { "CMSG_SET_ACTION_BUTTON", STATUS_LOGGEDIN, &WorldSession::HandleSetActionButtonOpcode },
+ /*0x129*/ { "SMSG_ACTION_BUTTONS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x12A*/ { "SMSG_INITIAL_SPELLS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x12B*/ { "SMSG_LEARNED_SPELL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x12C*/ { "SMSG_SUPERCEDED_SPELL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x12D*/ { "CMSG_NEW_SPELL_SLOT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x12E*/ { "CMSG_CAST_SPELL", STATUS_LOGGEDIN, &WorldSession::HandleCastSpellOpcode },
+ /*0x12F*/ { "CMSG_CANCEL_CAST", STATUS_LOGGEDIN, &WorldSession::HandleCancelCastOpcode },
+ /*0x130*/ { "SMSG_CAST_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x131*/ { "SMSG_SPELL_START", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x132*/ { "SMSG_SPELL_GO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x133*/ { "SMSG_SPELL_FAILURE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x134*/ { "SMSG_SPELL_COOLDOWN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x135*/ { "SMSG_COOLDOWN_EVENT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x136*/ { "CMSG_CANCEL_AURA", STATUS_LOGGEDIN, &WorldSession::HandleCancelAuraOpcode },
+ /*0x137*/ { "SMSG_UPDATE_AURA_DURATION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x138*/ { "SMSG_PET_CAST_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x139*/ { "MSG_CHANNEL_START", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x13A*/ { "MSG_CHANNEL_UPDATE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x13B*/ { "CMSG_CANCEL_CHANNELLING", STATUS_LOGGEDIN, &WorldSession::HandleCancelChanneling },
+ /*0x13C*/ { "SMSG_AI_REACTION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x13D*/ { "CMSG_SET_SELECTION", STATUS_LOGGEDIN, &WorldSession::HandleSetSelectionOpcode },
+ /*0x13E*/ { "CMSG_SET_TARGET_OBSOLETE", STATUS_LOGGEDIN, &WorldSession::HandleSetTargetOpcode },
+ /*0x13F*/ { "CMSG_UNUSED", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x140*/ { "CMSG_UNUSED2", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x141*/ { "CMSG_ATTACKSWING", STATUS_LOGGEDIN, &WorldSession::HandleAttackSwingOpcode },
+ /*0x142*/ { "CMSG_ATTACKSTOP", STATUS_LOGGEDIN, &WorldSession::HandleAttackStopOpcode },
+ /*0x143*/ { "SMSG_ATTACKSTART", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x144*/ { "SMSG_ATTACKSTOP", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x145*/ { "SMSG_ATTACKSWING_NOTINRANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x146*/ { "SMSG_ATTACKSWING_BADFACING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x147*/ { "SMSG_ATTACKSWING_NOTSTANDING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x148*/ { "SMSG_ATTACKSWING_DEADTARGET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x149*/ { "SMSG_ATTACKSWING_CANT_ATTACK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x14A*/ { "SMSG_ATTACKERSTATEUPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x14B*/ { "SMSG_VICTIMSTATEUPDATE_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x14C*/ { "SMSG_DAMAGE_DONE_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x14D*/ { "SMSG_DAMAGE_TAKEN_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x14E*/ { "SMSG_CANCEL_COMBAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x14F*/ { "SMSG_PLAYER_COMBAT_XP_GAIN_OBSOLETE",STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x150*/ { "SMSG_SPELLHEALLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x151*/ { "SMSG_SPELLENERGIZELOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x152*/ { "CMSG_SHEATHE_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x153*/ { "CMSG_SAVE_PLAYER", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x154*/ { "CMSG_SETDEATHBINDPOINT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x155*/ { "SMSG_BINDPOINTUPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x156*/ { "CMSG_GETDEATHBINDZONE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x157*/ { "SMSG_BINDZONEREPLY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x158*/ { "SMSG_PLAYERBOUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x159*/ { "SMSG_CLIENT_CONTROL_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x15A*/ { "CMSG_REPOP_REQUEST", STATUS_LOGGEDIN, &WorldSession::HandleRepopRequestOpcode },
+ /*0x15B*/ { "SMSG_RESURRECT_REQUEST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x15C*/ { "CMSG_RESURRECT_RESPONSE", STATUS_LOGGEDIN, &WorldSession::HandleResurrectResponseOpcode },
+ /*0x15D*/ { "CMSG_LOOT", STATUS_LOGGEDIN, &WorldSession::HandleLootOpcode },
+ /*0x15E*/ { "CMSG_LOOT_MONEY", STATUS_LOGGEDIN, &WorldSession::HandleLootMoneyOpcode },
+ /*0x15F*/ { "CMSG_LOOT_RELEASE", STATUS_LOGGEDIN, &WorldSession::HandleLootReleaseOpcode },
+ /*0x160*/ { "SMSG_LOOT_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x161*/ { "SMSG_LOOT_RELEASE_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x162*/ { "SMSG_LOOT_REMOVED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x163*/ { "SMSG_LOOT_MONEY_NOTIFY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x164*/ { "SMSG_LOOT_ITEM_NOTIFY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x165*/ { "SMSG_LOOT_CLEAR_MONEY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x166*/ { "SMSG_ITEM_PUSH_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x167*/ { "SMSG_DUEL_REQUESTED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x168*/ { "SMSG_DUEL_OUTOFBOUNDS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x169*/ { "SMSG_DUEL_INBOUNDS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x16A*/ { "SMSG_DUEL_COMPLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x16B*/ { "SMSG_DUEL_WINNER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x16C*/ { "CMSG_DUEL_ACCEPTED", STATUS_LOGGEDIN, &WorldSession::HandleDuelAcceptedOpcode },
+ /*0x16D*/ { "CMSG_DUEL_CANCELLED", STATUS_LOGGEDIN, &WorldSession::HandleDuelCancelledOpcode },
+ /*0x16E*/ { "SMSG_MOUNTRESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x16F*/ { "SMSG_DISMOUNTRESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x170*/ { "SMSG_PUREMOUNT_CANCELLED_OBSOLETE",STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x171*/ { "CMSG_MOUNTSPECIAL_ANIM", STATUS_LOGGEDIN, &WorldSession::HandleMountSpecialAnimOpcode },
+ /*0x172*/ { "SMSG_MOUNTSPECIAL_ANIM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x173*/ { "SMSG_PET_TAME_FAILURE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x174*/ { "CMSG_PET_SET_ACTION", STATUS_LOGGEDIN, &WorldSession::HandlePetSetAction },
+ /*0x175*/ { "CMSG_PET_ACTION", STATUS_LOGGEDIN, &WorldSession::HandlePetAction },
+ /*0x176*/ { "CMSG_PET_ABANDON", STATUS_LOGGEDIN, &WorldSession::HandlePetAbandon },
+ /*0x177*/ { "CMSG_PET_RENAME", STATUS_LOGGEDIN, &WorldSession::HandlePetRename },
+ /*0x178*/ { "SMSG_PET_NAME_INVALID", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x179*/ { "SMSG_PET_SPELLS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x17A*/ { "SMSG_PET_MODE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x17B*/ { "CMSG_GOSSIP_HELLO", STATUS_LOGGEDIN, &WorldSession::HandleGossipHelloOpcode },
+ /*0x17C*/ { "CMSG_GOSSIP_SELECT_OPTION", STATUS_LOGGEDIN, &WorldSession::HandleGossipSelectOptionOpcode },
+ /*0x17D*/ { "SMSG_GOSSIP_MESSAGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x17E*/ { "SMSG_GOSSIP_COMPLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x17F*/ { "CMSG_NPC_TEXT_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleNpcTextQueryOpcode },
+ /*0x180*/ { "SMSG_NPC_TEXT_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x181*/ { "SMSG_NPC_WONT_TALK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x182*/ { "CMSG_QUESTGIVER_STATUS_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverStatusQueryOpcode},
+ /*0x183*/ { "SMSG_QUESTGIVER_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x184*/ { "CMSG_QUESTGIVER_HELLO", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverHelloOpcode },
+ /*0x185*/ { "SMSG_QUESTGIVER_QUEST_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x186*/ { "CMSG_QUESTGIVER_QUERY_QUEST", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverQuestQueryOpcode},
+ /*0x187*/ { "CMSG_QUESTGIVER_QUEST_AUTOLAUNCH", STATUS_LOGGEDIN, &WorldSession::HandleQuestAutoLaunch },
+ /*0x188*/ { "SMSG_QUESTGIVER_QUEST_DETAILS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x189*/ { "CMSG_QUESTGIVER_ACCEPT_QUEST", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverAcceptQuestOpcode},
+ /*0x18A*/ { "CMSG_QUESTGIVER_COMPLETE_QUEST", STATUS_LOGGEDIN, &WorldSession::HandleQuestComplete },
+ /*0x18B*/ { "SMSG_QUESTGIVER_REQUEST_ITEMS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x18C*/ { "CMSG_QUESTGIVER_REQUEST_REWARD", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverRequestRewardOpcode},
+ /*0x18D*/ { "SMSG_QUESTGIVER_OFFER_REWARD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x18E*/ { "CMSG_QUESTGIVER_CHOOSE_REWARD", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverChooseRewardOpcode},
+ /*0x18F*/ { "SMSG_QUESTGIVER_QUEST_INVALID", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x190*/ { "CMSG_QUESTGIVER_CANCEL", STATUS_LOGGEDIN, &WorldSession::HandleQuestgiverCancel },
+ /*0x191*/ { "SMSG_QUESTGIVER_QUEST_COMPLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x192*/ { "SMSG_QUESTGIVER_QUEST_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x193*/ { "CMSG_QUESTLOG_SWAP_QUEST", STATUS_LOGGEDIN, &WorldSession::HandleQuestLogSwapQuest },
+ /*0x194*/ { "CMSG_QUESTLOG_REMOVE_QUEST", STATUS_LOGGEDIN, &WorldSession::HandleQuestLogRemoveQuest },
+ /*0x195*/ { "SMSG_QUESTLOG_FULL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x196*/ { "SMSG_QUESTUPDATE_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x197*/ { "SMSG_QUESTUPDATE_FAILEDTIMER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x198*/ { "SMSG_QUESTUPDATE_COMPLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x199*/ { "SMSG_QUESTUPDATE_ADD_KILL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x19A*/ { "SMSG_QUESTUPDATE_ADD_ITEM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x19B*/ { "CMSG_QUEST_CONFIRM_ACCEPT", STATUS_LOGGEDIN, &WorldSession::HandleQuestConfirmAccept },
+ /*0x19C*/ { "SMSG_QUEST_CONFIRM_ACCEPT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x19D*/ { "CMSG_PUSHQUESTTOPARTY", STATUS_LOGGEDIN, &WorldSession::HandleQuestPushToParty },
+ /*0x19E*/ { "CMSG_LIST_INVENTORY", STATUS_LOGGEDIN, &WorldSession::HandleListInventoryOpcode },
+ /*0x19F*/ { "SMSG_LIST_INVENTORY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1A0*/ { "CMSG_SELL_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleSellItemOpcode },
+ /*0x1A1*/ { "SMSG_SELL_ITEM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1A2*/ { "CMSG_BUY_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleBuyItemOpcode },
+ /*0x1A3*/ { "CMSG_BUY_ITEM_IN_SLOT", STATUS_LOGGEDIN, &WorldSession::HandleBuyItemInSlotOpcode },
+ /*0x1A4*/ { "SMSG_BUY_ITEM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1A5*/ { "SMSG_BUY_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1A6*/ { "CMSG_TAXICLEARALLNODES", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x1A7*/ { "CMSG_TAXIENABLEALLNODES", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x1A8*/ { "CMSG_TAXISHOWNODES", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x1A9*/ { "SMSG_SHOWTAXINODES", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1AA*/ { "CMSG_TAXINODE_STATUS_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleTaxiNodeStatusQueryOpcode },
+ /*0x1AB*/ { "SMSG_TAXINODE_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1AC*/ { "CMSG_TAXIQUERYAVAILABLENODES", STATUS_LOGGEDIN, &WorldSession::HandleTaxiQueryAvailableNodesOpcode},
+ /*0x1AD*/ { "CMSG_ACTIVATETAXI", STATUS_LOGGEDIN, &WorldSession::HandleActivateTaxiOpcode },
+ /*0x1AE*/ { "SMSG_ACTIVATETAXIREPLY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1AF*/ { "SMSG_NEW_TAXI_PATH", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1B0*/ { "CMSG_TRAINER_LIST", STATUS_LOGGEDIN, &WorldSession::HandleTrainerListOpcode },
+ /*0x1B1*/ { "SMSG_TRAINER_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1B2*/ { "CMSG_TRAINER_BUY_SPELL", STATUS_LOGGEDIN, &WorldSession::HandleTrainerBuySpellOpcode },
+ /*0x1B3*/ { "SMSG_TRAINER_BUY_SUCCEEDED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1B4*/ { "SMSG_TRAINER_BUY_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1B5*/ { "CMSG_BINDER_ACTIVATE", STATUS_LOGGEDIN, &WorldSession::HandleBinderActivateOpcode },
+ /*0x1B6*/ { "SMSG_PLAYERBINDERROR", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1B7*/ { "CMSG_BANKER_ACTIVATE", STATUS_LOGGEDIN, &WorldSession::HandleBankerActivateOpcode },
+ /*0x1B8*/ { "SMSG_SHOW_BANK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1B9*/ { "CMSG_BUY_BANK_SLOT", STATUS_LOGGEDIN, &WorldSession::HandleBuyBankSlotOpcode },
+ /*0x1BA*/ { "SMSG_BUY_BANK_SLOT_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1BB*/ { "CMSG_PETITION_SHOWLIST", STATUS_LOGGEDIN, &WorldSession::HandlePetitionShowListOpcode },
+ /*0x1BC*/ { "SMSG_PETITION_SHOWLIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1BD*/ { "CMSG_PETITION_BUY", STATUS_LOGGEDIN, &WorldSession::HandlePetitionBuyOpcode },
+ /*0x1BE*/ { "CMSG_PETITION_SHOW_SIGNATURES", STATUS_LOGGEDIN, &WorldSession::HandlePetitionShowSignOpcode },
+ /*0x1BF*/ { "SMSG_PETITION_SHOW_SIGNATURES", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1C0*/ { "CMSG_PETITION_SIGN", STATUS_LOGGEDIN, &WorldSession::HandlePetitionSignOpcode },
+ /*0x1C1*/ { "SMSG_PETITION_SIGN_RESULTS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1C2*/ { "MSG_PETITION_DECLINE", STATUS_LOGGEDIN, &WorldSession::HandlePetitionDeclineOpcode },
+ /*0x1C3*/ { "CMSG_OFFER_PETITION", STATUS_LOGGEDIN, &WorldSession::HandleOfferPetitionOpcode },
+ /*0x1C4*/ { "CMSG_TURN_IN_PETITION", STATUS_LOGGEDIN, &WorldSession::HandleTurnInPetitionOpcode },
+ /*0x1C5*/ { "SMSG_TURN_IN_PETITION_RESULTS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1C6*/ { "CMSG_PETITION_QUERY", STATUS_LOGGEDIN, &WorldSession::HandlePetitionQueryOpcode },
+ /*0x1C7*/ { "SMSG_PETITION_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1C8*/ { "SMSG_FISH_NOT_HOOKED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1C9*/ { "SMSG_FISH_ESCAPED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1CA*/ { "CMSG_BUG", STATUS_LOGGEDIN, &WorldSession::HandleBugOpcode },
+ /*0x1CB*/ { "SMSG_NOTIFICATION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1CC*/ { "CMSG_PLAYED_TIME", STATUS_LOGGEDIN, &WorldSession::HandlePlayedTime },
+ /*0x1CD*/ { "SMSG_PLAYED_TIME", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1CE*/ { "CMSG_QUERY_TIME", STATUS_LOGGEDIN, &WorldSession::HandleQueryTimeOpcode },
+ /*0x1CF*/ { "SMSG_QUERY_TIME_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1D0*/ { "SMSG_LOG_XPGAIN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1D1*/ { "SMSG_AURACASTLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1D2*/ { "CMSG_RECLAIM_CORPSE", STATUS_LOGGEDIN, &WorldSession::HandleCorpseReclaimOpcode },
+ /*0x1D3*/ { "CMSG_WRAP_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleWrapItemOpcode },
+ /*0x1D4*/ { "SMSG_LEVELUP_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1D5*/ { "MSG_MINIMAP_PING", STATUS_LOGGEDIN, &WorldSession::HandleMinimapPingOpcode },
+ /*0x1D6*/ { "SMSG_RESISTLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1D7*/ { "SMSG_ENCHANTMENTLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1D8*/ { "CMSG_SET_SKILL_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x1D9*/ { "SMSG_START_MIRROR_TIMER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1DA*/ { "SMSG_PAUSE_MIRROR_TIMER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1DB*/ { "SMSG_STOP_MIRROR_TIMER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1DC*/ { "CMSG_PING", STATUS_NEVER, &WorldSession::Handle_EarlyProccess },
+ /*0x1DD*/ { "SMSG_PONG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1DE*/ { "SMSG_CLEAR_COOLDOWN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1DF*/ { "SMSG_GAMEOBJECT_PAGETEXT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1E0*/ { "CMSG_SETSHEATHED", STATUS_LOGGEDIN, &WorldSession::HandleSetSheathedOpcode },
+ /*0x1E1*/ { "SMSG_COOLDOWN_CHEAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1E2*/ { "SMSG_SPELL_DELAYED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1E3*/ { "CMSG_PLAYER_MACRO_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x1E4*/ { "SMSG_PLAYER_MACRO_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1E5*/ { "CMSG_GHOST", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x1E6*/ { "CMSG_GM_INVIS", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x1E7*/ { "SMSG_INVALID_PROMOTION_CODE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1E8*/ { "MSG_GM_BIND_OTHER", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x1E9*/ { "MSG_GM_SUMMON", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x1EA*/ { "SMSG_ITEM_TIME_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1EB*/ { "SMSG_ITEM_ENCHANT_TIME_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1EC*/ { "SMSG_AUTH_CHALLENGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1ED*/ { "CMSG_AUTH_SESSION", STATUS_NEVER, &WorldSession::Handle_EarlyProccess },
+ /*0x1EE*/ { "SMSG_AUTH_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1EF*/ { "MSG_GM_SHOWLABEL", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x1F0*/ { "CMSG_PET_CAST_SPELL", STATUS_LOGGEDIN, &WorldSession::HandlePetCastSpellOpcode },
+ /*0x1F1*/ { "MSG_SAVE_GUILD_EMBLEM", STATUS_LOGGEDIN, &WorldSession::HandleGuildSaveEmblemOpcode },
+ /*0x1F2*/ { "MSG_TABARDVENDOR_ACTIVATE", STATUS_LOGGEDIN, &WorldSession::HandleTabardVendorActivateOpcode},
+ /*0x1F3*/ { "SMSG_PLAY_SPELL_VISUAL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1F4*/ { "CMSG_ZONEUPDATE", STATUS_LOGGEDIN, &WorldSession::HandleZoneUpdateOpcode },
+ /*0x1F5*/ { "SMSG_PARTYKILLLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1F6*/ { "SMSG_COMPRESSED_UPDATE_OBJECT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1F7*/ { "SMSG_PLAY_SPELL_IMPACT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1F8*/ { "SMSG_EXPLORATION_EXPERIENCE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1F9*/ { "CMSG_GM_SET_SECURITY_GROUP", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x1FA*/ { "CMSG_GM_NUKE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x1FB*/ { "MSG_RANDOM_ROLL", STATUS_LOGGEDIN, &WorldSession::HandleRandomRollOpcode },
+ /*0x1FC*/ { "SMSG_ENVIRONMENTALDAMAGELOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1FD*/ { "CMSG_RWHOIS_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x1FE*/ { "SMSG_RWHOIS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x1FF*/ { "MSG_LOOKING_FOR_GROUP", STATUS_LOGGEDIN, &WorldSession::HandleLookingForGroup },
+ /*0x200*/ { "CMSG_SET_LOOKING_FOR_GROUP", STATUS_LOGGEDIN, &WorldSession::HandleSetLfgOpcode },
+ /*0x201*/ { "CMSG_UNLEARN_SPELL", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x202*/ { "CMSG_UNLEARN_SKILL", STATUS_LOGGEDIN, &WorldSession::HandleUnlearnSkillOpcode },
+ /*0x203*/ { "SMSG_REMOVED_SPELL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x204*/ { "CMSG_DECHARGE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x205*/ { "CMSG_GMTICKET_CREATE", STATUS_LOGGEDIN, &WorldSession::HandleGMTicketCreateOpcode },
+ /*0x206*/ { "SMSG_GMTICKET_CREATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x207*/ { "CMSG_GMTICKET_UPDATETEXT", STATUS_LOGGEDIN, &WorldSession::HandleGMTicketUpdateTextOpcode },
+ /*0x208*/ { "SMSG_GMTICKET_UPDATETEXT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x209*/ { "SMSG_ACCOUNT_DATA_TIMES", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x20A*/ { "CMSG_REQUEST_ACCOUNT_DATA", STATUS_LOGGEDIN, &WorldSession::HandleRequestAccountData },
+ /*0x20B*/ { "CMSG_UPDATE_ACCOUNT_DATA", STATUS_LOGGEDIN, &WorldSession::HandleUpdateAccountData },
+ /*0x20C*/ { "SMSG_UPDATE_ACCOUNT_DATA", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x20D*/ { "SMSG_CLEAR_FAR_SIGHT_IMMEDIATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x20E*/ { "SMSG_POWERGAINLOG_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x20F*/ { "CMSG_GM_TEACH", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x210*/ { "CMSG_GM_CREATE_ITEM_TARGET", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x211*/ { "CMSG_GMTICKET_GETTICKET", STATUS_LOGGEDIN, &WorldSession::HandleGMTicketGetTicketOpcode },
+ /*0x212*/ { "SMSG_GMTICKET_GETTICKET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x213*/ { "CMSG_UNLEARN_TALENTS", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x214*/ { "SMSG_GAMEOBJECT_SPAWN_ANIM_OBSOLETE",STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x215*/ { "SMSG_GAMEOBJECT_DESPAWN_ANIM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x216*/ { "MSG_CORPSE_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleCorpseQueryOpcode },
+ /*0x217*/ { "CMSG_GMTICKET_DELETETICKET", STATUS_LOGGEDIN, &WorldSession::HandleGMTicketDeleteOpcode },
+ /*0x218*/ { "SMSG_GMTICKET_DELETETICKET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x219*/ { "SMSG_CHAT_WRONG_FACTION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x21A*/ { "CMSG_GMTICKET_SYSTEMSTATUS", STATUS_LOGGEDIN, &WorldSession::HandleGMTicketSystemStatusOpcode},
+ /*0x21B*/ { "SMSG_GMTICKET_SYSTEMSTATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x21C*/ { "CMSG_SPIRIT_HEALER_ACTIVATE", STATUS_LOGGEDIN, &WorldSession::HandleSpiritHealerActivateOpcode},
+ /*0x21D*/ { "CMSG_SET_STAT_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x21E*/ { "SMSG_SET_REST_START", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x21F*/ { "CMSG_SKILL_BUY_STEP", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x220*/ { "CMSG_SKILL_BUY_RANK", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x221*/ { "CMSG_XP_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x222*/ { "SMSG_SPIRIT_HEALER_CONFIRM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x223*/ { "CMSG_CHARACTER_POINT_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x224*/ { "SMSG_GOSSIP_POI", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x225*/ { "CMSG_CHAT_IGNORED", STATUS_LOGGEDIN, &WorldSession::HandleChatIgnoredOpcode },
+ /*0x226*/ { "CMSG_GM_VISION", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x227*/ { "CMSG_SERVER_COMMAND", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x228*/ { "CMSG_GM_SILENCE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x229*/ { "CMSG_GM_REVEALTO", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x22A*/ { "CMSG_GM_RESURRECT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x22B*/ { "CMSG_GM_SUMMONMOB", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x22C*/ { "CMSG_GM_MOVECORPSE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x22D*/ { "CMSG_GM_FREEZE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x22E*/ { "CMSG_GM_UBERINVIS", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x22F*/ { "CMSG_GM_REQUEST_PLAYER_INFO", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x230*/ { "SMSG_GM_PLAYER_INFO", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x231*/ { "CMSG_GUILD_RANK", STATUS_LOGGEDIN, &WorldSession::HandleGuildRankOpcode },
+ /*0x232*/ { "CMSG_GUILD_ADD_RANK", STATUS_LOGGEDIN, &WorldSession::HandleGuildAddRankOpcode },
+ /*0x233*/ { "CMSG_GUILD_DEL_RANK", STATUS_LOGGEDIN, &WorldSession::HandleGuildDelRankOpcode },
+ /*0x234*/ { "CMSG_GUILD_SET_PUBLIC_NOTE", STATUS_LOGGEDIN, &WorldSession::HandleGuildSetPublicNoteOpcode },
+ /*0x235*/ { "CMSG_GUILD_SET_OFFICER_NOTE", STATUS_LOGGEDIN, &WorldSession::HandleGuildSetOfficerNoteOpcode },
+ /*0x236*/ { "SMSG_LOGIN_VERIFY_WORLD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x237*/ { "CMSG_CLEAR_EXPLORATION", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x238*/ { "CMSG_SEND_MAIL", STATUS_LOGGEDIN, &WorldSession::HandleSendMail },
+ /*0x239*/ { "SMSG_SEND_MAIL_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x23A*/ { "CMSG_GET_MAIL_LIST", STATUS_LOGGEDIN, &WorldSession::HandleGetMail },
+ /*0x23B*/ { "SMSG_MAIL_LIST_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x23C*/ { "CMSG_BATTLEFIELD_LIST", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundListOpcode },
+ /*0x23D*/ { "SMSG_BATTLEFIELD_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x23E*/ { "CMSG_BATTLEFIELD_JOIN", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x23F*/ { "SMSG_BATTLEFIELD_WIN_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x240*/ { "SMSG_BATTLEFIELD_LOSE_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x241*/ { "CMSG_TAXICLEARNODE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x242*/ { "CMSG_TAXIENABLENODE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x243*/ { "CMSG_ITEM_TEXT_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleItemTextQuery },
+ /*0x244*/ { "SMSG_ITEM_TEXT_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x245*/ { "CMSG_MAIL_TAKE_MONEY", STATUS_LOGGEDIN, &WorldSession::HandleTakeMoney },
+ /*0x246*/ { "CMSG_MAIL_TAKE_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleTakeItem },
+ /*0x247*/ { "CMSG_MAIL_MARK_AS_READ", STATUS_LOGGEDIN, &WorldSession::HandleMarkAsRead },
+ /*0x248*/ { "CMSG_MAIL_RETURN_TO_SENDER", STATUS_LOGGEDIN, &WorldSession::HandleReturnToSender },
+ /*0x249*/ { "CMSG_MAIL_DELETE", STATUS_LOGGEDIN, &WorldSession::HandleMailDelete },
+ /*0x24A*/ { "CMSG_MAIL_CREATE_TEXT_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleMailCreateTextItem },
+ /*0x24B*/ { "SMSG_SPELLLOGMISS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x24C*/ { "SMSG_SPELLLOGEXECUTE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x24D*/ { "SMSG_DEBUGAURAPROC", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x24E*/ { "SMSG_PERIODICAURALOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x24F*/ { "SMSG_SPELLDAMAGESHIELD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x250*/ { "SMSG_SPELLNONMELEEDAMAGELOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x251*/ { "CMSG_LEARN_TALENT", STATUS_LOGGEDIN, &WorldSession::HandleLearnTalentOpcode },
+ /*0x252*/ { "SMSG_RESURRECT_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x253*/ { "CMSG_TOGGLE_PVP", STATUS_LOGGEDIN, &WorldSession::HandleTogglePvP },
+ /*0x254*/ { "SMSG_ZONE_UNDER_ATTACK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x255*/ { "MSG_AUCTION_HELLO", STATUS_LOGGEDIN, &WorldSession::HandleAuctionHelloOpcode },
+ /*0x256*/ { "CMSG_AUCTION_SELL_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAuctionSellItem },
+ /*0x257*/ { "CMSG_AUCTION_REMOVE_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAuctionRemoveItem },
+ /*0x258*/ { "CMSG_AUCTION_LIST_ITEMS", STATUS_LOGGEDIN, &WorldSession::HandleAuctionListItems },
+ /*0x259*/ { "CMSG_AUCTION_LIST_OWNER_ITEMS", STATUS_LOGGEDIN, &WorldSession::HandleAuctionListOwnerItems },
+ /*0x25A*/ { "CMSG_AUCTION_PLACE_BID", STATUS_LOGGEDIN, &WorldSession::HandleAuctionPlaceBid },
+ /*0x25B*/ { "SMSG_AUCTION_COMMAND_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x25C*/ { "SMSG_AUCTION_LIST_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x25D*/ { "SMSG_AUCTION_OWNER_LIST_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x25E*/ { "SMSG_AUCTION_BIDDER_NOTIFICATION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x25F*/ { "SMSG_AUCTION_OWNER_NOTIFICATION", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x260*/ { "SMSG_PROCRESIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x261*/ { "SMSG_STANDSTATE_CHANGE_FAILURE_OBSOLETE",STATUS_NEVER,&WorldSession::Handle_ServerSide },
+ /*0x262*/ { "SMSG_DISPEL_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x263*/ { "SMSG_SPELLORDAMAGE_IMMUNE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x264*/ { "CMSG_AUCTION_LIST_BIDDER_ITEMS", STATUS_LOGGEDIN, &WorldSession::HandleAuctionListBidderItems },
+ /*0x265*/ { "SMSG_AUCTION_BIDDER_LIST_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x266*/ { "SMSG_SET_FLAT_SPELL_MODIFIER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x267*/ { "SMSG_SET_PCT_SPELL_MODIFIER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x268*/ { "CMSG_SET_AMMO", STATUS_LOGGEDIN, &WorldSession::HandleSetAmmoOpcode },
+ /*0x269*/ { "SMSG_CORPSE_RECLAIM_DELAY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x26A*/ { "CMSG_SET_ACTIVE_MOVER", STATUS_LOGGEDIN, &WorldSession::HandleSetActiveMoverOpcode },
+ /*0x26B*/ { "CMSG_PET_CANCEL_AURA", STATUS_LOGGEDIN, &WorldSession::HandlePetCancelAuraOpcode },
+ /*0x26C*/ { "CMSG_PLAYER_AI_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x26D*/ { "CMSG_CANCEL_AUTO_REPEAT_SPELL", STATUS_LOGGEDIN, &WorldSession::HandleCancelAutoRepeatSpellOpcode},
+ /*0x26E*/ { "MSG_GM_ACCOUNT_ONLINE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x26F*/ { "MSG_LIST_STABLED_PETS", STATUS_LOGGEDIN, &WorldSession::HandleListStabledPetsOpcode },
+ /*0x270*/ { "CMSG_STABLE_PET", STATUS_LOGGEDIN, &WorldSession::HandleStablePet },
+ /*0x271*/ { "CMSG_UNSTABLE_PET", STATUS_LOGGEDIN, &WorldSession::HandleUnstablePet },
+ /*0x272*/ { "CMSG_BUY_STABLE_SLOT", STATUS_LOGGEDIN, &WorldSession::HandleBuyStableSlot },
+ /*0x273*/ { "SMSG_STABLE_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x274*/ { "CMSG_STABLE_REVIVE_PET", STATUS_LOGGEDIN, &WorldSession::HandleStableRevivePet },
+ /*0x275*/ { "CMSG_STABLE_SWAP_PET", STATUS_LOGGEDIN, &WorldSession::HandleStableSwapPet },
+ /*0x276*/ { "MSG_QUEST_PUSH_RESULT", STATUS_LOGGEDIN, &WorldSession::HandleQuestPushResult },
+ /*0x277*/ { "SMSG_PLAY_MUSIC", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x278*/ { "SMSG_PLAY_OBJECT_SOUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x279*/ { "CMSG_REQUEST_PET_INFO", STATUS_LOGGEDIN, &WorldSession::HandleRequestPetInfoOpcode },
+ /*0x27A*/ { "CMSG_FAR_SIGHT", STATUS_LOGGEDIN, &WorldSession::HandleFarSightOpcode },
+ /*0x27B*/ { "SMSG_SPELLDISPELLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x27C*/ { "SMSG_DAMAGE_CALC_LOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x27D*/ { "CMSG_ENABLE_DAMAGE_LOG", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x27E*/ { "CMSG_GROUP_CHANGE_SUB_GROUP", STATUS_LOGGEDIN, &WorldSession::HandleGroupChangeSubGroupOpcode },
+ /*0x27F*/ { "CMSG_REQUEST_PARTY_MEMBER_STATS", STATUS_LOGGEDIN, &WorldSession::HandleRequestPartyMemberStatsOpcode},
+ /*0x280*/ { "CMSG_GROUP_SWAP_SUB_GROUP", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x281*/ { "CMSG_RESET_FACTION_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x282*/ { "CMSG_AUTOSTORE_BANK_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAutoStoreBankItemOpcode },
+ /*0x283*/ { "CMSG_AUTOBANK_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleAutoBankItemOpcode },
+ /*0x284*/ { "MSG_QUERY_NEXT_MAIL_TIME", STATUS_LOGGEDIN, &WorldSession::HandleMsgQueryNextMailtime },
+ /*0x285*/ { "SMSG_RECEIVED_MAIL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x286*/ { "SMSG_RAID_GROUP_ONLY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x287*/ { "CMSG_SET_DURABILITY_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x288*/ { "CMSG_SET_PVP_RANK_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x289*/ { "CMSG_ADD_PVP_MEDAL_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x28A*/ { "CMSG_DEL_PVP_MEDAL_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x28B*/ { "CMSG_SET_PVP_TITLE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x28C*/ { "SMSG_PVP_CREDIT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x28D*/ { "SMSG_AUCTION_REMOVED_NOTIFICATION",STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x28E*/ { "CMSG_GROUP_RAID_CONVERT", STATUS_LOGGEDIN, &WorldSession::HandleRaidConvertOpcode },
+ /*0x28F*/ { "CMSG_GROUP_ASSISTANT_LEADER", STATUS_LOGGEDIN, &WorldSession::HandleGroupAssistantOpcode },
+ /*0x290*/ { "CMSG_BUYBACK_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleBuybackItem },
+ /*0x291*/ { "SMSG_SERVER_MESSAGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x292*/ { "CMSG_MEETINGSTONE_JOIN", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x293*/ { "CMSG_MEETINGSTONE_LEAVE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x294*/ { "CMSG_MEETINGSTONE_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x295*/ { "SMSG_MEETINGSTONE_SETQUEUE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x296*/ { "CMSG_MEETINGSTONE_INFO", STATUS_LOGGEDIN, &WorldSession::HandleMeetingStoneInfo },
+ /*0x297*/ { "SMSG_MEETINGSTONE_COMPLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x298*/ { "SMSG_MEETINGSTONE_IN_PROGRESS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x299*/ { "SMSG_MEETINGSTONE_MEMBER_ADDED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x29A*/ { "CMSG_GMTICKETSYSTEM_TOGGLE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x29B*/ { "CMSG_CANCEL_GROWTH_AURA", STATUS_LOGGEDIN, &WorldSession::HandleCancelGrowthAuraOpcode },
+ /*0x29C*/ { "SMSG_CANCEL_AUTO_REPEAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x29D*/ { "SMSG_STANDSTATE_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x29E*/ { "SMSG_LOOT_ALL_PASSED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x29F*/ { "SMSG_LOOT_ROLL_WON", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2A0*/ { "CMSG_LOOT_ROLL", STATUS_LOGGEDIN, &WorldSession::HandleLootRoll },
+ /*0x2A1*/ { "SMSG_LOOT_START_ROLL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2A2*/ { "SMSG_LOOT_ROLL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2A3*/ { "CMSG_LOOT_MASTER_GIVE", STATUS_LOGGEDIN, &WorldSession::HandleLootMasterGiveOpcode },
+ /*0x2A4*/ { "SMSG_LOOT_MASTER_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2A5*/ { "SMSG_SET_FORCED_REACTIONS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2A6*/ { "SMSG_SPELL_FAILED_OTHER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2A7*/ { "SMSG_GAMEOBJECT_RESET_STATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2A8*/ { "CMSG_REPAIR_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleRepairItemOpcode },
+ /*0x2A9*/ { "SMSG_CHAT_PLAYER_NOT_FOUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2AA*/ { "MSG_TALENT_WIPE_CONFIRM", STATUS_LOGGEDIN, &WorldSession::HandleTalentWipeOpcode },
+ /*0x2AB*/ { "SMSG_SUMMON_REQUEST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2AC*/ { "CMSG_SUMMON_RESPONSE", STATUS_LOGGEDIN, &WorldSession::HandleSummonResponseOpcode },
+ /*0x2AD*/ { "MSG_MOVE_TOGGLE_GRAVITY_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x2AE*/ { "SMSG_MONSTER_MOVE_TRANSPORT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2AF*/ { "SMSG_PET_BROKEN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2B0*/ { "MSG_MOVE_FEATHER_FALL", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x2B1*/ { "MSG_MOVE_WATER_WALK", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x2B2*/ { "CMSG_SERVER_BROADCAST", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x2B3*/ { "CMSG_SELF_RES", STATUS_LOGGEDIN, &WorldSession::HandleSelfResOpcode },
+ /*0x2B4*/ { "SMSG_FEIGN_DEATH_RESISTED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2B5*/ { "CMSG_RUN_SCRIPT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x2B6*/ { "SMSG_SCRIPT_MESSAGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2B7*/ { "SMSG_DUEL_COUNTDOWN", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2B8*/ { "SMSG_AREA_TRIGGER_MESSAGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2B9*/ { "CMSG_TOGGLE_HELM", STATUS_LOGGEDIN, &WorldSession::HandleToggleHelmOpcode },
+ /*0x2BA*/ { "CMSG_TOGGLE_CLOAK", STATUS_LOGGEDIN, &WorldSession::HandleToggleCloakOpcode },
+ /*0x2BB*/ { "SMSG_MEETINGSTONE_JOINFAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2BC*/ { "SMSG_PLAYER_SKINNED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2BD*/ { "SMSG_DURABILITY_DAMAGE_DEATH", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2BE*/ { "CMSG_SET_EXPLORATION", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x2BF*/ { "CMSG_SET_ACTIONBAR_TOGGLES", STATUS_AUTHED, &WorldSession::HandleSetActionBar },
+ /*0x2C0*/ { "UMSG_DELETE_GUILD_CHARTER", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x2C1*/ { "MSG_PETITION_RENAME", STATUS_LOGGEDIN, &WorldSession::HandlePetitionRenameOpcode },
+ /*0x2C2*/ { "SMSG_INIT_WORLD_STATES", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2C3*/ { "SMSG_UPDATE_WORLD_STATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2C4*/ { "CMSG_ITEM_NAME_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleItemNameQueryOpcode },
+ /*0x2C5*/ { "SMSG_ITEM_NAME_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2C6*/ { "SMSG_PET_ACTION_FEEDBACK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2C7*/ { "CMSG_CHAR_RENAME", STATUS_AUTHED, &WorldSession::HandleChangePlayerNameOpcode },
+ /*0x2C8*/ { "SMSG_CHAR_RENAME", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2C9*/ { "CMSG_MOVE_SPLINE_DONE", STATUS_LOGGEDIN, &WorldSession::HandleTaxiNextDestinationOpcode },
+ /*0x2CA*/ { "CMSG_MOVE_FALL_RESET", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x2CB*/ { "SMSG_INSTANCE_SAVE_CREATED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2CC*/ { "SMSG_RAID_INSTANCE_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2CD*/ { "CMSG_REQUEST_RAID_INFO", STATUS_LOGGEDIN, &WorldSession::HandleRequestRaidInfoOpcode },
+ /*0x2CE*/ { "CMSG_MOVE_TIME_SKIPPED", STATUS_LOGGEDIN, &WorldSession::HandleMoveTimeSkippedOpcode },
+ /*0x2CF*/ { "CMSG_MOVE_FEATHER_FALL_ACK", STATUS_LOGGEDIN, &WorldSession::HandleFeatherFallAck },
+ /*0x2D0*/ { "CMSG_MOVE_WATER_WALK_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveWaterWalkAck },
+ /*0x2D1*/ { "CMSG_MOVE_NOT_ACTIVE_MOVER", STATUS_LOGGEDIN, &WorldSession::HandleNotActiveMoverOpcode },
+ /*0x2D2*/ { "SMSG_PLAY_SOUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2D3*/ { "CMSG_BATTLEFIELD_STATUS", STATUS_LOGGEDIN, &WorldSession::HandleBattlefieldStatusOpcode },
+ /*0x2D4*/ { "SMSG_BATTLEFIELD_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2D5*/ { "CMSG_BATTLEFIELD_PORT", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundPlayerPortOpcode},
+ /*0x2D6*/ { "MSG_INSPECT_HONOR_STATS", STATUS_LOGGEDIN, &WorldSession::HandleInspectHonorStatsOpcode },
+ /*0x2D7*/ { "CMSG_BATTLEMASTER_HELLO", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundHelloOpcode },
+ /*0x2D8*/ { "CMSG_MOVE_START_SWIM_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x2D9*/ { "CMSG_MOVE_STOP_SWIM_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x2DA*/ { "SMSG_FORCE_WALK_SPEED_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2DB*/ { "CMSG_FORCE_WALK_SPEED_CHANGE_ACK", STATUS_LOGGEDIN, &WorldSession::HandleForceSpeedChangeAck },
+ /*0x2DC*/ { "SMSG_FORCE_SWIM_BACK_SPEED_CHANGE",STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2DD*/ { "CMSG_FORCE_SWIM_BACK_SPEED_CHANGE_ACK",STATUS_LOGGEDIN,&WorldSession::HandleForceSpeedChangeAck },
+ /*0x2DE*/ { "SMSG_FORCE_TURN_RATE_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2DF*/ { "CMSG_FORCE_TURN_RATE_CHANGE_ACK", STATUS_LOGGEDIN, &WorldSession::HandleForceSpeedChangeAck },
+ /*0x2E0*/ { "MSG_PVP_LOG_DATA", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundPVPlogdataOpcode},
+ /*0x2E1*/ { "CMSG_LEAVE_BATTLEFIELD", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundLeaveOpcode },
+ /*0x2E2*/ { "CMSG_AREA_SPIRIT_HEALER_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleAreaSpiritHealerQueryOpcode},
+ /*0x2E3*/ { "CMSG_AREA_SPIRIT_HEALER_QUEUE", STATUS_LOGGEDIN, &WorldSession::HandleAreaSpiritHealerQueueOpcode},
+ /*0x2E4*/ { "SMSG_AREA_SPIRIT_HEALER_TIME", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2E5*/ { "CMSG_GM_UNTEACH", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x2E6*/ { "SMSG_WARDEN_DATA", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2E7*/ { "CMSG_WARDEN_DATA", STATUS_LOGGEDIN, &WorldSession::HandleWardenDataOpcode },
+ /*0x2E8*/ { "SMSG_GROUP_JOINED_BATTLEGROUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2E9*/ { "MSG_BATTLEGROUND_PLAYER_POSITIONS",STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundPlayerPositionsOpcode},
+ /*0x2EA*/ { "CMSG_PET_STOP_ATTACK", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x2EB*/ { "SMSG_BINDER_CONFIRM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2EC*/ { "SMSG_BATTLEGROUND_PLAYER_JOINED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2ED*/ { "SMSG_BATTLEGROUND_PLAYER_LEFT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2EE*/ { "CMSG_BATTLEMASTER_JOIN", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundJoinOpcode },
+ /*0x2EF*/ { "SMSG_ADDON_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2F0*/ { "CMSG_PET_UNLEARN", STATUS_LOGGEDIN, &WorldSession::HandlePetUnlearnOpcode },
+ /*0x2F1*/ { "SMSG_PET_UNLEARN_CONFIRM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2F2*/ { "SMSG_PARTY_MEMBER_STATS_FULL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2F3*/ { "CMSG_PET_SPELL_AUTOCAST", STATUS_LOGGEDIN, &WorldSession::HandlePetSpellAutocastOpcode },
+ /*0x2F4*/ { "SMSG_WEATHER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2F5*/ { "SMSG_PLAY_TIME_WARNING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2F6*/ { "SMSG_MINIGAME_SETUP", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2F7*/ { "SMSG_MINIGAME_STATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2F8*/ { "CMSG_MINIGAME_MOVE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x2F9*/ { "SMSG_MINIGAME_MOVE_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2FA*/ { "SMSG_RAID_INSTANCE_MESSAGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2FB*/ { "SMSG_COMPRESSED_MOVES", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2FC*/ { "CMSG_GUILD_INFO_TEXT", STATUS_LOGGEDIN, &WorldSession::HandleGuildChangeInfoOpcode },
+ /*0x2FD*/ { "SMSG_CHAT_RESTRICTED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2FE*/ { "SMSG_SPLINE_SET_RUN_SPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x2FF*/ { "SMSG_SPLINE_SET_RUN_BACK_SPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x300*/ { "SMSG_SPLINE_SET_SWIM_SPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x301*/ { "SMSG_SPLINE_SET_WALK_SPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x302*/ { "SMSG_SPLINE_SET_SWIM_BACK_SPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x303*/ { "SMSG_SPLINE_SET_TURN_RATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x304*/ { "SMSG_SPLINE_MOVE_UNROOT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x305*/ { "SMSG_SPLINE_MOVE_FEATHER_FALL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x306*/ { "SMSG_SPLINE_MOVE_NORMAL_FALL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x307*/ { "SMSG_SPLINE_MOVE_SET_HOVER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x308*/ { "SMSG_SPLINE_MOVE_UNSET_HOVER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x309*/ { "SMSG_SPLINE_MOVE_WATER_WALK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x30A*/ { "SMSG_SPLINE_MOVE_LAND_WALK", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x30B*/ { "SMSG_SPLINE_MOVE_START_SWIM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x30C*/ { "SMSG_SPLINE_MOVE_STOP_SWIM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x30D*/ { "SMSG_SPLINE_MOVE_SET_RUN_MODE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x30E*/ { "SMSG_SPLINE_MOVE_SET_WALK_MODE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x30F*/ { "CMSG_GM_NUKE_ACCOUNT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x310*/ { "MSG_GM_DESTROY_CORPSE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x311*/ { "CMSG_GM_DESTROY_ONLINE_CORPSE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x312*/ { "CMSG_ACTIVATETAXIEXPRESS", STATUS_LOGGEDIN, &WorldSession::HandleActivateTaxiFarOpcode },
+ /*0x313*/ { "SMSG_SET_FACTION_ATWAR", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x314*/ { "SMSG_GAMETIMEBIAS_SET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x315*/ { "CMSG_DEBUG_ACTIONS_START", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x316*/ { "CMSG_DEBUG_ACTIONS_STOP", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x317*/ { "CMSG_SET_FACTION_INACTIVE", STATUS_LOGGEDIN, &WorldSession::HandleSetWatchedFactionInactiveOpcode},
+ /*0x318*/ { "CMSG_SET_WATCHED_FACTION", STATUS_LOGGEDIN, &WorldSession::HandleSetWatchedFactionIndexOpcode},
+ /*0x319*/ { "MSG_MOVE_TIME_SKIPPED", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x31A*/ { "SMSG_SPLINE_MOVE_ROOT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x31B*/ { "CMSG_SET_EXPLORATION_ALL", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x31C*/ { "SMSG_INVALIDATE_PLAYER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x31D*/ { "CMSG_RESET_INSTANCES", STATUS_LOGGEDIN, &WorldSession::HandleResetInstancesOpcode },
+ /*0x31E*/ { "SMSG_INSTANCE_RESET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x31F*/ { "SMSG_INSTANCE_RESET_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x320*/ { "SMSG_UPDATE_LAST_INSTANCE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x321*/ { "MSG_RAID_TARGET_UPDATE", STATUS_LOGGEDIN, &WorldSession::HandleRaidIconTargetOpcode },
+ /*0x322*/ { "MSG_RAID_READY_CHECK", STATUS_LOGGEDIN, &WorldSession::HandleRaidReadyCheckOpcode },
+ /*0x323*/ { "CMSG_LUA_USAGE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x324*/ { "SMSG_PET_ACTION_SOUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x325*/ { "SMSG_PET_DISMISS_SOUND", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x326*/ { "SMSG_GHOSTEE_GONE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x327*/ { "CMSG_GM_UPDATE_TICKET_STATUS", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x328*/ { "SMSG_GM_TICKET_STATUS_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x329*/ { "MSG_SET_DUNGEON_DIFFICULTY", STATUS_LOGGEDIN, &WorldSession::HandleDungeonDifficultyOpcode },
+ /*0x32A*/ { "CMSG_GMSURVEY_SUBMIT", STATUS_LOGGEDIN, &WorldSession::HandleGMSurveySubmit },
+ /*0x32B*/ { "SMSG_UPDATE_INSTANCE_OWNERSHIP", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x32C*/ { "CMSG_IGNORE_KNOCKBACK_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x32D*/ { "SMSG_CHAT_PLAYER_AMBIGUOUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x32E*/ { "MSG_DELAY_GHOST_TELEPORT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x32F*/ { "SMSG_SPELLINSTAKILLLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x330*/ { "SMSG_SPELL_UPDATE_CHAIN_TARGETS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x331*/ { "CMSG_CHAT_FILTERED", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x332*/ { "SMSG_EXPECTED_SPAM_RECORDS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x333*/ { "SMSG_SPELLSTEALLOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x334*/ { "CMSG_LOTTERY_QUERY_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x335*/ { "SMSG_LOTTERY_QUERY_RESULT_OBSOLETE",STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x336*/ { "CMSG_BUY_LOTTERY_TICKET_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x337*/ { "SMSG_LOTTERY_RESULT_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x338*/ { "SMSG_CHARACTER_PROFILE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x339*/ { "SMSG_CHARACTER_PROFILE_REALM_CONNECTED",STATUS_NEVER,&WorldSession::Handle_ServerSide },
+ /*0x33A*/ { "SMSG_DEFENSE_MESSAGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x33B*/ { "SMSG_INSTANCE_DIFFICULTY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x33C*/ { "MSG_GM_RESETINSTANCELIMIT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x33D*/ { "SMSG_MOTD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x33E*/ { "SMSG_MOVE_SET_FLIGHT_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x33F*/ { "SMSG_MOVE_UNSET_FLIGHT_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x340*/ { "CMSG_MOVE_FLIGHT_ACK_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x341*/ { "MSG_MOVE_START_SWIM_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x342*/ { "MSG_MOVE_STOP_SWIM_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x343*/ { "SMSG_MOVE_SET_CAN_FLY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x344*/ { "SMSG_MOVE_UNSET_CAN_FLY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x345*/ { "CMSG_MOVE_SET_CAN_FLY_ACK", STATUS_LOGGEDIN, &WorldSession::HandleMoveFlyModeChangeAckOpcode},
+ /*0x346*/ { "CMSG_MOVE_SET_FLY", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x347*/ { "CMSG_SOCKET_GEMS", STATUS_LOGGEDIN, &WorldSession::HandleSocketOpcode },
+ /*0x348*/ { "CMSG_ARENA_TEAM_CREATE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x349*/ { "SMSG_ARENA_TEAM_COMMAND_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x34A*/ { "UMSG_UPDATE_ARENA_TEAM_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x34B*/ { "CMSG_ARENA_TEAM_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamQueryOpcode },
+ /*0x34C*/ { "SMSG_ARENA_TEAM_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x34D*/ { "CMSG_ARENA_TEAM_ROSTER", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamRosterOpcode },
+ /*0x34E*/ { "SMSG_ARENA_TEAM_ROSTER", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x34F*/ { "CMSG_ARENA_TEAM_INVITE", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamAddMemberOpcode },
+ /*0x350*/ { "SMSG_ARENA_TEAM_INVITE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x351*/ { "CMSG_ARENA_TEAM_ACCEPT", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamInviteAcceptOpcode},
+ /*0x352*/ { "CMSG_ARENA_TEAM_DECLINE", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamInviteDeclineOpcode},
+ /*0x353*/ { "CMSG_ARENA_TEAM_LEAVE", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamLeaveOpcode },
+ /*0x354*/ { "CMSG_ARENA_TEAM_REMOVE", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamRemoveFromTeamOpcode},
+ /*0x355*/ { "CMSG_ARENA_TEAM_DISBAND", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamDisbandOpcode },
+ /*0x356*/ { "CMSG_ARENA_TEAM_LEADER", STATUS_LOGGEDIN, &WorldSession::HandleArenaTeamPromoteToCaptainOpcode},
+ /*0x357*/ { "SMSG_ARENA_TEAM_EVENT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x358*/ { "CMSG_BATTLEMASTER_JOIN_ARENA", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundArenaJoin },
+ /*0x359*/ { "MSG_MOVE_START_ASCEND", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x35A*/ { "MSG_MOVE_STOP_ASCEND", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x35B*/ { "SMSG_ARENA_TEAM_STATS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x35C*/ { "CMSG_LFG_SET_AUTOJOIN", STATUS_AUTHED, &WorldSession::HandleLfgAutoJoinOpcode },
+ /*0x35D*/ { "CMSG_LFG_CLEAR_AUTOJOIN", STATUS_LOGGEDIN, &WorldSession::HandleLfgCancelAutoJoinOpcode },
+ /*0x35E*/ { "CMSG_LFM_SET_AUTOFILL", STATUS_AUTHED, &WorldSession::HandleLfmAutoAddMembersOpcode },
+ /*0x35F*/ { "CMSG_LFM_CLEAR_AUTOFILL", STATUS_LOGGEDIN, &WorldSession::HandleLfmCancelAutoAddmembersOpcode},
+ /*0x360*/ { "CMSG_ACCEPT_LFG_MATCH", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x361*/ { "CMSG_DECLINE_LFG_MATCH", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x362*/ { "CMSG_CANCEL_PENDING_LFG", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x363*/ { "CMSG_CLEAR_LOOKING_FOR_GROUP", STATUS_LOGGEDIN, &WorldSession::HandleLfgClearOpcode },
+ /*0x364*/ { "CMSG_CLEAR_LOOKING_FOR_MORE", STATUS_LOGGEDIN, &WorldSession::HandleLfmSetNoneOpcode },
+ /*0x365*/ { "CMSG_SET_LOOKING_FOR_MORE", STATUS_LOGGEDIN, &WorldSession::HandleLfmSetOpcode },
+ /*0x366*/ { "CMSG_SET_LFG_COMMENT", STATUS_LOGGEDIN, &WorldSession::HandleLfgSetCommentOpcode },
+ /*0x367*/ { "SMSG_LFG_TIMEDOUT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x368*/ { "SMSG_LFG_OTHER_TIMEDOUT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x369*/ { "SMSG_LFG_AUTOJOIN_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x36A*/ { "SMSG_LFG_AUTOJOIN_FAILED_NO_PLAYER",STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x36B*/ { "SMSG_LFG_LEADER_IS_LFM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x36C*/ { "SMSG_LFG_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x36D*/ { "SMSG_LFG_UPDATE_LFM", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x36E*/ { "SMSG_LFG_UPDATE_LFG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x36F*/ { "SMSG_LFG_UPDATE_QUEUED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x370*/ { "SMSG_LFG_PENDING_INVITE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x371*/ { "SMSG_LFG_PENDING_MATCH", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x372*/ { "SMSG_LFG_PENDING_MATCH_DONE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x373*/ { "SMSG_TITLE_EARNED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x374*/ { "CMSG_SET_TITLE", STATUS_LOGGEDIN, &WorldSession::HandleChooseTitleOpcode },
+ /*0x375*/ { "CMSG_CANCEL_MOUNT_AURA", STATUS_LOGGEDIN, &WorldSession::HandleDismountOpcode },
+ /*0x376*/ { "SMSG_ARENA_ERROR", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x377*/ { "MSG_INSPECT_ARENA_TEAMS", STATUS_LOGGEDIN, &WorldSession::HandleInspectArenaStatsOpcode },
+ /*0x378*/ { "SMSG_DEATH_RELEASE_LOC", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x379*/ { "CMSG_CANCEL_TEMP_ENCHANTMENT", STATUS_LOGGEDIN, &WorldSession::HandleCancelTempItemEnchantmentOpcode},
+ /*0x37A*/ { "SMSG_FORCED_DEATH_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x37B*/ { "CMSG_CHEAT_SET_HONOR_CURRENCY", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x37C*/ { "CMSG_CHEAT_SET_ARENA_CURRENCY", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x37D*/ { "MSG_MOVE_SET_FLIGHT_SPEED_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x37E*/ { "MSG_MOVE_SET_FLIGHT_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x37F*/ { "MSG_MOVE_SET_FLIGHT_BACK_SPEED_CHEAT",STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x380*/ { "MSG_MOVE_SET_FLIGHT_BACK_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x381*/ { "SMSG_FORCE_FLIGHT_SPEED_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x382*/ { "CMSG_FORCE_FLIGHT_SPEED_CHANGE_ACK",STATUS_LOGGEDIN,&WorldSession::HandleForceSpeedChangeAck },
+ /*0x383*/ { "SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE",STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x384*/ { "CMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK",STATUS_LOGGEDIN,&WorldSession::HandleForceSpeedChangeAck },
+ /*0x385*/ { "SMSG_SPLINE_SET_FLIGHT_SPEED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x386*/ { "SMSG_SPLINE_SET_FLIGHT_BACK_SPEED",STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x387*/ { "CMSG_MAELSTROM_INVALIDATE_CACHE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x388*/ { "SMSG_FLIGHT_SPLINE_SYNC", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x389*/ { "CMSG_SET_TAXI_BENCHMARK_MODE", STATUS_AUTHED, &WorldSession::HandleSetTaxiBenchmarkOpcode },
+ /*0x38A*/ { "SMSG_JOINED_BATTLEGROUND_QUEUE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x38B*/ { "SMSG_REALM_SPLIT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x38C*/ { "CMSG_REALM_SPLIT", STATUS_AUTHED, &WorldSession::HandleRealmStateRequestOpcode },
+ /*0x38D*/ { "CMSG_MOVE_CHNG_TRANSPORT", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x38E*/ { "MSG_PARTY_ASSIGNMENT", STATUS_LOGGEDIN, &WorldSession::HandleGroupPromoteOpcode },
+ /*0x38F*/ { "SMSG_OFFER_PETITION_ERROR", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x390*/ { "SMSG_TIME_SYNC_REQ", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x391*/ { "CMSG_TIME_SYNC_RESP", STATUS_LOGGEDIN, &WorldSession::HandleAllowMoveAckOpcode },
+ /*0x392*/ { "CMSG_SEND_LOCAL_EVENT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x393*/ { "CMSG_SEND_GENERAL_TRIGGER", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x394*/ { "CMSG_SEND_COMBAT_TRIGGER", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x395*/ { "CMSG_MAELSTROM_GM_SENT_MAIL", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x396*/ { "SMSG_RESET_FAILED_NOTIFY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x397*/ { "SMSG_REAL_GROUP_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x398*/ { "SMSG_LFG_DISABLED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x399*/ { "CMSG_ACTIVE_PVP_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x39A*/ { "CMSG_CHEAT_DUMP_ITEMS_DEBUG_ONLY", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x39B*/ { "SMSG_CHEAT_DUMP_ITEMS_DEBUG_ONLY_RESPONSE",STATUS_NEVER,&WorldSession::Handle_ServerSide },
+ /*0x39C*/ { "SMSG_CHEAT_DUMP_ITEMS_DEBUG_ONLY_RESPONSE_WRITE_FILE",STATUS_NEVER,&WorldSession::Handle_ServerSide},
+ /*0x39D*/ { "SMSG_UPDATE_COMBO_POINTS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x39E*/ { "SMSG_VOICE_SESSION_ROSTER_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x39F*/ { "SMSG_VOICE_SESSION_LEAVE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3A0*/ { "SMSG_VOICE_SESSION_ADJUST_PRIORITY",STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3A1*/ { "CMSG_VOICE_SET_TALKER_MUTED_REQUEST",STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3A2*/ { "SMSG_VOICE_SET_TALKER_MUTED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3A3*/ { "SMSG_INIT_EXTRA_AURA_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3A4*/ { "SMSG_SET_EXTRA_AURA_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3A5*/ { "SMSG_SET_EXTRA_AURA_INFO_NEED_UPDATE",STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3A6*/ { "SMSG_CLEAR_EXTRA_AURA_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3A7*/ { "MSG_MOVE_START_DESCEND", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes },
+ /*0x3A8*/ { "CMSG_IGNORE_REQUIREMENTS_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3A9*/ { "SMSG_IGNORE_REQUIREMENTS_CHEAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3AA*/ { "SMSG_SPELL_CHANCE_PROC_LOG", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3AB*/ { "CMSG_MOVE_SET_RUN_SPEED", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3AC*/ { "SMSG_DISMOUNT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3AD*/ { "MSG_MOVE_UPDATE_CAN_FLY", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3AE*/ { "MSG_RAID_READY_CHECK_CONFIRM", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3AF*/ { "CMSG_VOICE_SESSION_ENABLE", STATUS_AUTHED, &WorldSession::HandleVoiceSettingsOpcode },
+ /*0x3B0*/ { "SMSG_VOICE_PARENTAL_CONTROLS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3B1*/ { "CMSG_GM_WHISPER", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3B2*/ { "SMSG_GM_MESSAGECHAT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3B3*/ { "MSG_GM_GEARRATING", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3B4*/ { "CMSG_COMMENTATOR_ENABLE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3B5*/ { "SMSG_COMMENTATOR_STATE_CHANGED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3B6*/ { "CMSG_COMMENTATOR_GET_MAP_INFO", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3B7*/ { "SMSG_COMMENTATOR_MAP_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3B8*/ { "CMSG_COMMENTATOR_GET_PLAYER_INFO", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3B9*/ { "SMSG_COMMENTATOR_GET_PLAYER_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3BA*/ { "SMSG_COMMENTATOR_PLAYER_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3BB*/ { "CMSG_COMMENTATOR_ENTER_INSTANCE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3BC*/ { "CMSG_COMMENTATOR_EXIT_INSTANCE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3BD*/ { "CMSG_COMMENTATOR_INSTANCE_COMMAND",STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3BE*/ { "SMSG_CLEAR_TARGET", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3BF*/ { "CMSG_BOT_DETECTED", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3C0*/ { "SMSG_CROSSED_INEBRIATION_THRESHOLD",STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3C1*/ { "CMSG_CHEAT_PLAYER_LOGIN", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3C2*/ { "CMSG_CHEAT_PLAYER_LOOKUP", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3C3*/ { "SMSG_CHEAT_PLAYER_LOOKUP", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3C4*/ { "SMSG_KICK_REASON", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3C5*/ { "MSG_RAID_READY_CHECK_FINISHED", STATUS_LOGGEDIN, &WorldSession::HandleRaidReadyCheckFinishOpcode},
+ /*0x3C6*/ { "CMSG_COMPLAIN", STATUS_LOGGEDIN, &WorldSession::HandleReportSpamOpcode },
+ /*0x3C7*/ { "SMSG_COMPLAIN_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3C8*/ { "SMSG_FEATURE_SYSTEM_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3C9*/ { "CMSG_GM_SHOW_COMPLAINTS", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3CA*/ { "CMSG_GM_UNSQUELCH", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3CB*/ { "CMSG_CHANNEL_SILENCE_VOICE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3CC*/ { "CMSG_CHANNEL_SILENCE_ALL", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3CD*/ { "CMSG_CHANNEL_UNSILENCE_VOICE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3CE*/ { "CMSG_CHANNEL_UNSILENCE_ALL", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3CF*/ { "CMSG_TARGET_CAST", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3D0*/ { "CMSG_TARGET_SCRIPT_CAST", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3D1*/ { "CMSG_CHANNEL_DISPLAY_LIST", STATUS_LOGGEDIN, &WorldSession::HandleChannelRosterQuery },
+ /*0x3D2*/ { "CMSG_SET_ACTIVE_VOICE_CHANNEL", STATUS_AUTHED, &WorldSession::HandleChannelVoiceChatQuery },
+ /*0x3D3*/ { "CMSG_GET_CHANNEL_MEMBER_COUNT", STATUS_LOGGEDIN, &WorldSession::HandleChannelInfoQuery },
+ /*0x3D4*/ { "SMSG_CHANNEL_MEMBER_COUNT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3D5*/ { "CMSG_CHANNEL_VOICE_ON", STATUS_LOGGEDIN, &WorldSession::HandleChannelEnableVoiceOpcode },
+ /*0x3D6*/ { "CMSG_CHANNEL_VOICE_OFF", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3D7*/ { "CMSG_DEBUG_LIST_TARGETS", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3D8*/ { "SMSG_DEBUG_LIST_TARGETS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3D9*/ { "SMSG_AVAILABLE_VOICE_CHANNEL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3DA*/ { "CMSG_ADD_VOICE_IGNORE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3DB*/ { "CMSG_DEL_VOICE_IGNORE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3DC*/ { "CMSG_PARTY_SILENCE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3DD*/ { "CMSG_PARTY_UNSILENCE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3DE*/ { "MSG_NOTIFY_PARTY_SQUELCH", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3DF*/ { "SMSG_COMSAT_RECONNECT_TRY", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3E0*/ { "SMSG_COMSAT_DISCONNECT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3E1*/ { "SMSG_COMSAT_CONNECT_FAIL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3E2*/ { "SMSG_VOICE_CHAT_STATUS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3E3*/ { "CMSG_REPORT_PVP_AFK", STATUS_LOGGEDIN, &WorldSession::HandleBattleGroundReportAFK },
+ /*0x3E4*/ { "CMSG_REPORT_PVP_AFK_RESULT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3E5*/ { "CMSG_GUILD_BANKER_ACTIVATE", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankQuery },
+ /*0x3E6*/ { "CMSG_GUILD_BANK_QUERY_TAB", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankTabColon },
+ /*0x3E7*/ { "SMSG_GUILD_BANK_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3E8*/ { "CMSG_GUILD_BANK_SWAP_ITEMS", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankDepositItem },
+ /*0x3E9*/ { "CMSG_GUILD_BANK_BUY_TAB", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankBuyTab },
+ /*0x3EA*/ { "CMSG_GUILD_BANK_UPDATE_TAB", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankModifyTab },
+ /*0x3EB*/ { "CMSG_GUILD_BANK_DEPOSIT_MONEY", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankDeposit },
+ /*0x3EC*/ { "CMSG_GUILD_BANK_WITHDRAW_MONEY", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankWithdraw },
+ /*0x3ED*/ { "MSG_GUILD_BANK_LOG_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankLog },
+ /*0x3EE*/ { "CMSG_SET_CHANNEL_WATCH", STATUS_LOGGEDIN, &WorldSession::HandleChannelJoinNotify },
+ /*0x3EF*/ { "SMSG_USERLIST_ADD", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3F0*/ { "SMSG_USERLIST_REMOVE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3F1*/ { "SMSG_USERLIST_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3F2*/ { "CMSG_CLEAR_CHANNEL_WATCH", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3F3*/ { "SMSG_INSPECT_TALENT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3F4*/ { "SMSG_GOGOGO_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3F5*/ { "SMSG_ECHO_PARTY_SQUELCH", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3F6*/ { "CMSG_SET_TITLE_SUFFIX", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3F7*/ { "CMSG_SPELLCLICK", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3F8*/ { "SMSG_LOOT_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3F9*/ { "CMSG_GM_CHARACTER_RESTORE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3FA*/ { "CMSG_GM_CHARACTER_SAVE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x3FB*/ { "SMSG_VOICESESSION_FULL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x3FC*/ { "MSG_GUILD_PERMISSIONS", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankGetRights },
+ /*0x3FD*/ { "MSG_GUILD_BANK_MONEY_WITHDRAWN", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankGetMoneyAmount },
+ /*0x3FE*/ { "MSG_GUILD_EVENT_LOG_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleGuildEventLogOpcode },
+ /*0x3FF*/ { "CMSG_MAELSTROM_RENAME_GUILD", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x400*/ { "CMSG_GET_MIRRORIMAGE_DATA", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x401*/ { "SMSG_MIRRORIMAGE_DATA", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x402*/ { "SMSG_FORCE_DISPLAY_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x403*/ { "SMSG_SPELL_CHANCE_RESIST_PUSHBACK",STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x404*/ { "CMSG_IGNORE_DIMINISHING_RETURNS_CHEAT",STATUS_NEVER,&WorldSession::Handle_NULL },
+ /*0x405*/ { "SMSG_IGNORE_DIMINISHING_RETURNS_CHEAT",STATUS_NEVER,&WorldSession::Handle_ServerSide },
+ /*0x406*/ { "CMSG_KEEP_ALIVE", STATUS_NEVER, &WorldSession::Handle_EarlyProccess },
+ /*0x407*/ { "SMSG_RAID_READY_CHECK_ERROR", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x408*/ { "CMSG_OPT_OUT_OF_LOOT", STATUS_AUTHED, &WorldSession::HandleGroupPassOnLootOpcode },
+ /*0x409*/ { "MSG_QUERY_GUILD_BANK_TEXT", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankTabText },
+ /*0x40A*/ { "CMSG_SET_GUILD_BANK_TEXT", STATUS_LOGGEDIN, &WorldSession::HandleGuildBankSetTabText },
+ /*0x40B*/ { "CMSG_SET_GRANTABLE_LEVELS", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x40C*/ { "CMSG_GRANT_LEVEL", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x40D*/ { "CMSG_REFER_A_FRIEND", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x40E*/ { "MSG_GM_CHANGE_ARENA_RATING", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x40F*/ { "CMSG_DECLINE_CHANNEL_INVITE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x410*/ { "CMSG_GROUPACTION_THROTTLED", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x411*/ { "SMSG_OVERRIDE_LIGHT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x412*/ { "SMSG_TOTEM_CREATED", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x413*/ { "CMSG_TOTEM_DESTROYED", STATUS_LOGGEDIN, &WorldSession::HandleTotemDestroy },
+ /*0x414*/ { "CMSG_EXPIRE_RAID_INSTANCE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x415*/ { "CMSG_NO_SPELL_VARIANCE", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x416*/ { "CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY",STATUS_LOGGEDIN,&WorldSession::HandleQuestgiverStatusQueryMultipleOpcode},
+ /*0x417*/ { "SMSG_QUESTGIVER_STATUS_MULTIPLE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x418*/ { "CMSG_SET_PLAYER_DECLINED_NAMES", STATUS_AUTHED, &WorldSession::HandleDeclinedPlayerNameOpcode },
+ /*0x419*/ { "SMSG_SET_PLAYER_DECLINED_NAMES_RESULT",STATUS_NEVER,&WorldSession::Handle_ServerSide },
+ /*0x41A*/ { "CMSG_QUERY_SERVER_BUCK_DATA", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x41B*/ { "CMSG_CLEAR_SERVER_BUCK_DATA", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x41C*/ { "SMSG_SERVER_BUCK_DATA", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x41D*/ { "SMSG_SEND_UNLEARN_SPELLS", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x41E*/ { "SMSG_PROPOSE_LEVEL_GRANT", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x41F*/ { "CMSG_ACCEPT_LEVEL_GRANT", STATUS_NEVER, &WorldSession::Handle_NULL },
+ /*0x420*/ { "SMSG_REFER_A_FRIEND_FAILURE", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x421*/ { "SMSG_SPLINE_MOVE_SET_FLYING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x422*/ { "SMSG_SPLINE_MOVE_UNSET_FLYING", STATUS_NEVER, &WorldSession::Handle_ServerSide },
+ /*0x423*/ { "SMSG_SUMMON_CANCEL", STATUS_NEVER, &WorldSession::Handle_ServerSide },
};
diff --git a/src/game/Opcodes.h b/src/game/Opcodes.h
index 7bc3a7c0640..202166a57a0 100644
--- a/src/game/Opcodes.h
+++ b/src/game/Opcodes.h
@@ -49,8 +49,8 @@ enum Opcodes
CMSG_ZONE_MAP = 0x00A,
SMSG_ZONE_MAP = 0x00B,
CMSG_DEBUG_CHANGECELLZONE = 0x00C,
- CMSG_MOVE_CHARACTER_CHEAT = 0x00D,
- SMSG_MOVE_CHARACTER_CHEAT = 0x00E,
+ CMSG_EMBLAZON_TABARD_OBSOLETE = 0x00D,
+ CMSG_UNEMBLAZON_TABARD_OBSOLETE = 0x00E,
CMSG_RECHARGE = 0x00F,
CMSG_LEARN_SPELL = 0x010,
CMSG_CREATEMONSTER = 0x011,
@@ -66,7 +66,7 @@ enum Opcodes
SMSG_FORCEACTIONSHOW = 0x01B,
CMSG_PETGODMODE = 0x01C,
SMSG_PETGODMODE = 0x01D,
- SMSG_REFER_A_FRIEND_EXPIRED = 0x01E,
+ SMSG_DEBUGINFOSPELLMISS_OBSOLETE = 0x01E,
CMSG_WEATHER_SPEED_CHEAT = 0x01F,
CMSG_UNDRESSPLAYER = 0x020,
CMSG_BEASTMASTER = 0x021,
@@ -86,7 +86,7 @@ enum Opcodes
SMSG_DEBUG_AISTATE = 0x02F,
CMSG_DISABLE_PVP_CHEAT = 0x030,
CMSG_ADVANCE_SPAWN_TIME = 0x031,
- SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x032,
+ CMSG_PVP_PORT_OBSOLETE = 0x032,
CMSG_AUTH_SRP6_BEGIN = 0x033,
CMSG_AUTH_SRP6_PROOF = 0x034,
CMSG_AUTH_SRP6_RECODE = 0x035,
@@ -214,7 +214,7 @@ enum Opcodes
SMSG_READ_ITEM_FAILED = 0x0AF,
SMSG_ITEM_COOLDOWN = 0x0B0,
CMSG_GAMEOBJ_USE = 0x0B1,
- CMSG_DESTROY_ITEMS = 0x0B2,
+ CMSG_GAMEOBJ_CHAIR_USE_OBSOLETE = 0x0B2,
SMSG_GAMEOBJECT_CUSTOM_ANIM = 0x0B3,
CMSG_AREATRIGGER = 0x0B4,
MSG_MOVE_START_FORWARD = 0x0B5,
@@ -347,7 +347,7 @@ enum Opcodes
SMSG_SPELL_COOLDOWN = 0x134,
SMSG_COOLDOWN_EVENT = 0x135,
CMSG_CANCEL_AURA = 0x136,
- SMSG_UPDATE_AURA_DURATION_OBSOLETE = 0x137,
+ SMSG_UPDATE_AURA_DURATION = 0x137,
SMSG_PET_CAST_FAILED = 0x138,
MSG_CHANNEL_START = 0x139,
MSG_CHANNEL_UPDATE = 0x13A,
@@ -371,10 +371,10 @@ enum Opcodes
SMSG_DAMAGE_DONE_OBSOLETE = 0x14C,
SMSG_DAMAGE_TAKEN_OBSOLETE = 0x14D,
SMSG_CANCEL_COMBAT = 0x14E,
- SMSG_SPELLBREAKLOG = 0x14F,
+ SMSG_PLAYER_COMBAT_XP_GAIN_OBSOLETE = 0x14F,
SMSG_SPELLHEALLOG = 0x150,
SMSG_SPELLENERGIZELOG = 0x151,
- SMSG_BREAK_TARGET = 0x152,
+ CMSG_SHEATHE_OBSOLETE = 0x152,
CMSG_SAVE_PLAYER = 0x153,
CMSG_SETDEATHBINDPOINT = 0x154,
SMSG_BINDPOINTUPDATE = 0x155,
@@ -578,7 +578,7 @@ enum Opcodes
SMSG_GMTICKET_SYSTEMSTATUS = 0x21B,
CMSG_SPIRIT_HEALER_ACTIVATE = 0x21C,
CMSG_SET_STAT_CHEAT = 0x21D,
- SMSG_SET_REST_START_OBSOLETE = 0x21E,
+ SMSG_SET_REST_START = 0x21E,
CMSG_SKILL_BUY_STEP = 0x21F,
CMSG_SKILL_BUY_RANK = 0x220,
CMSG_XP_CHEAT = 0x221,
@@ -733,8 +733,8 @@ enum Opcodes
SMSG_SCRIPT_MESSAGE = 0x2B6,
SMSG_DUEL_COUNTDOWN = 0x2B7,
SMSG_AREA_TRIGGER_MESSAGE = 0x2B8,
- CMSG_SHOWING_HELM = 0x2B9,
- CMSG_SHOWING_CLOAK = 0x2BA,
+ CMSG_TOGGLE_HELM = 0x2B9,
+ CMSG_TOGGLE_CLOAK = 0x2BA,
SMSG_MEETINGSTONE_JOINFAILED = 0x2BB,
SMSG_PLAYER_SKINNED = 0x2BC,
SMSG_DURABILITY_DAMAGE_DEATH = 0x2BD,
@@ -967,10 +967,10 @@ enum Opcodes
SMSG_VOICE_SESSION_ADJUST_PRIORITY = 0x3A0,
CMSG_VOICE_SET_TALKER_MUTED_REQUEST = 0x3A1,
SMSG_VOICE_SET_TALKER_MUTED = 0x3A2,
- SMSG_INIT_EXTRA_AURA_INFO_OBSOLETE = 0x3A3,
- SMSG_SET_EXTRA_AURA_INFO_OBSOLETE = 0x3A4,
- SMSG_SET_EXTRA_AURA_INFO_NEED_UPDATE_OBSOLETE = 0x3A5,
- SMSG_CLEAR_EXTRA_AURA_INFO_OBSOLETE = 0x3A6,
+ SMSG_INIT_EXTRA_AURA_INFO = 0x3A3,
+ SMSG_SET_EXTRA_AURA_INFO = 0x3A4,
+ SMSG_SET_EXTRA_AURA_INFO_NEED_UPDATE = 0x3A5,
+ SMSG_CLEAR_EXTRA_AURA_INFO = 0x3A6,
MSG_MOVE_START_DESCEND = 0x3A7,
CMSG_IGNORE_REQUIREMENTS_CHEAT = 0x3A8,
SMSG_IGNORE_REQUIREMENTS_CHEAT = 0x3A9,
@@ -980,255 +980,127 @@ enum Opcodes
MSG_MOVE_UPDATE_CAN_FLY = 0x3AD,
MSG_RAID_READY_CHECK_CONFIRM = 0x3AE,
CMSG_VOICE_SESSION_ENABLE = 0x3AF,
- SMSG_VOICE_SESSION_ENABLE = 0x3B0,
- SMSG_VOICE_PARENTAL_CONTROLS = 0x3B1,
- CMSG_GM_WHISPER = 0x3B2,
- SMSG_GM_MESSAGECHAT = 0x3B3,
- MSG_GM_GEARRATING = 0x3B4,
- CMSG_COMMENTATOR_ENABLE = 0x3B5,
- SMSG_COMMENTATOR_STATE_CHANGED = 0x3B6,
- CMSG_COMMENTATOR_GET_MAP_INFO = 0x3B7,
- SMSG_COMMENTATOR_MAP_INFO = 0x3B8,
- CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x3B9,
- SMSG_COMMENTATOR_GET_PLAYER_INFO = 0x3BA,
- SMSG_COMMENTATOR_PLAYER_INFO = 0x3BB,
- CMSG_COMMENTATOR_ENTER_INSTANCE = 0x3BC,
- CMSG_COMMENTATOR_EXIT_INSTANCE = 0x3BD,
- CMSG_COMMENTATOR_INSTANCE_COMMAND = 0x3BE,
- SMSG_CLEAR_TARGET = 0x3BF,
- CMSG_BOT_DETECTED = 0x3C0,
- SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x3C1,
- CMSG_CHEAT_PLAYER_LOGIN = 0x3C2,
- CMSG_CHEAT_PLAYER_LOOKUP = 0x3C3,
- SMSG_CHEAT_PLAYER_LOOKUP = 0x3C4,
- SMSG_KICK_REASON = 0x3C5,
- MSG_RAID_READY_CHECK_FINISHED = 0x3C6,
- CMSG_COMPLAIN = 0x3C7,
- SMSG_COMPLAIN_RESULT = 0x3C8,
- SMSG_FEATURE_SYSTEM_STATUS = 0x3C9,
- CMSG_GM_SHOW_COMPLAINTS = 0x3CA,
- CMSG_GM_UNSQUELCH = 0x3CB,
- CMSG_CHANNEL_SILENCE_VOICE = 0x3CC,
- CMSG_CHANNEL_SILENCE_ALL = 0x3CD,
- CMSG_CHANNEL_UNSILENCE_VOICE = 0x3CE,
- CMSG_CHANNEL_UNSILENCE_ALL = 0x3CF,
- CMSG_TARGET_CAST = 0x3D0,
- CMSG_TARGET_SCRIPT_CAST = 0x3D1,
- CMSG_CHANNEL_DISPLAY_LIST = 0x3D2,
- CMSG_SET_ACTIVE_VOICE_CHANNEL = 0x3D3,
- CMSG_GET_CHANNEL_MEMBER_COUNT = 0x3D4,
- SMSG_CHANNEL_MEMBER_COUNT = 0x3D5,
- CMSG_CHANNEL_VOICE_ON = 0x3D6,
- CMSG_CHANNEL_VOICE_OFF = 0x3D7,
- CMSG_DEBUG_LIST_TARGETS = 0x3D8,
- SMSG_DEBUG_LIST_TARGETS = 0x3D9,
- SMSG_AVAILABLE_VOICE_CHANNEL = 0x3DA,
- CMSG_ADD_VOICE_IGNORE = 0x3DB,
- CMSG_DEL_VOICE_IGNORE = 0x3DC,
- CMSG_PARTY_SILENCE = 0x3DD,
- CMSG_PARTY_UNSILENCE = 0x3DE,
- MSG_NOTIFY_PARTY_SQUELCH = 0x3DF,
- SMSG_COMSAT_RECONNECT_TRY = 0x3E0,
- SMSG_COMSAT_DISCONNECT = 0x3E1,
- SMSG_COMSAT_CONNECT_FAIL = 0x3E2,
- SMSG_VOICE_CHAT_STATUS = 0x3E3,
- CMSG_REPORT_PVP_AFK = 0x3E4,
- CMSG_REPORT_PVP_AFK_RESULT = 0x3E5,
- CMSG_GUILD_BANKER_ACTIVATE = 0x3E6,
- CMSG_GUILD_BANK_QUERY_TAB = 0x3E7,
- SMSG_GUILD_BANK_LIST = 0x3E8,
- CMSG_GUILD_BANK_SWAP_ITEMS = 0x3E9,
- CMSG_GUILD_BANK_BUY_TAB = 0x3EA,
- CMSG_GUILD_BANK_UPDATE_TAB = 0x3EB,
- CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x3EC,
- CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x3ED,
- MSG_GUILD_BANK_LOG_QUERY = 0x3EE,
- CMSG_SET_CHANNEL_WATCH = 0x3EF,
- SMSG_USERLIST_ADD = 0x3F0,
- SMSG_USERLIST_REMOVE = 0x3F1,
- SMSG_USERLIST_UPDATE = 0x3F2,
- CMSG_CLEAR_CHANNEL_WATCH = 0x3F3,
- SMSG_INSPECT_TALENT = 0x3F4,
- SMSG_GOGOGO_OBSOLETE = 0x3F5,
- SMSG_ECHO_PARTY_SQUELCH = 0x3F6,
- CMSG_SET_TITLE_SUFFIX = 0x3F7,
- CMSG_SPELLCLICK = 0x3F8,
- SMSG_LOOT_LIST = 0x3F9,
- CMSG_GM_CHARACTER_RESTORE = 0x3FA,
- CMSG_GM_CHARACTER_SAVE = 0x3FB,
- SMSG_VOICESESSION_FULL = 0x3FC,
- MSG_GUILD_PERMISSIONS = 0x3FD,
- MSG_GUILD_BANK_MONEY_WITHDRAWN = 0x3FE,
- MSG_GUILD_EVENT_LOG_QUERY = 0x3FF,
- CMSG_MAELSTROM_RENAME_GUILD = 0x400,
- CMSG_GET_MIRRORIMAGE_DATA = 0x401,
- SMSG_MIRRORIMAGE_DATA = 0x402,
- SMSG_FORCE_DISPLAY_UPDATE = 0x403,
- SMSG_SPELL_CHANCE_RESIST_PUSHBACK = 0x404,
- CMSG_IGNORE_DIMINISHING_RETURNS_CHEAT = 0x405,
- SMSG_IGNORE_DIMINISHING_RETURNS_CHEAT = 0x406,
- CMSG_KEEP_ALIVE = 0x407,
- SMSG_RAID_READY_CHECK_ERROR = 0x408,
- CMSG_OPT_OUT_OF_LOOT = 0x409,
- MSG_QUERY_GUILD_BANK_TEXT = 0x40A,
- CMSG_SET_GUILD_BANK_TEXT = 0x40B,
- CMSG_SET_GRANTABLE_LEVELS = 0x40C,
- CMSG_GRANT_LEVEL = 0x40D,
- CMSG_REFER_A_FRIEND = 0x40E,
- MSG_GM_CHANGE_ARENA_RATING = 0x40F,
- CMSG_DECLINE_CHANNEL_INVITE = 0x410,
- CMSG_GROUPACTION_THROTTLED = 0x411,
- SMSG_OVERRIDE_LIGHT = 0x412,
- SMSG_TOTEM_CREATED = 0x413,
- CMSG_TOTEM_DESTROYED = 0x414,
- CMSG_EXPIRE_RAID_INSTANCE = 0x415,
- CMSG_NO_SPELL_VARIANCE = 0x416,
- CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY = 0x417,
- SMSG_QUESTGIVER_STATUS_MULTIPLE = 0x418,
- CMSG_SET_PLAYER_DECLINED_NAMES = 0x419,
- SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x41A,
- CMSG_QUERY_SERVER_BUCK_DATA = 0x41B,
- CMSG_CLEAR_SERVER_BUCK_DATA = 0x41C,
- SMSG_SERVER_BUCK_DATA = 0x41D,
- SMSG_SEND_UNLEARN_SPELLS = 0x41E,
- SMSG_PROPOSE_LEVEL_GRANT = 0x41F,
- CMSG_ACCEPT_LEVEL_GRANT = 0x420,
- SMSG_REFER_A_FRIEND_FAILURE = 0x421,
- SMSG_SPLINE_MOVE_SET_FLYING = 0x422,
- SMSG_SPLINE_MOVE_UNSET_FLYING = 0x423,
- SMSG_SUMMON_CANCEL = 0x424,
- CMSG_CHANGE_PERSONAL_ARENA_RATING = 0x425,
- CMSG_ALTER_APPEARANCE = 0x426,
- SMSG_ENABLE_BARBER_SHOP = 0x427,
- SMSG_BARBER_SHOP_RESULT = 0x428,
- CMSG_CALENDAR_GET_CALENDAR = 0x429,
- CMSG_CALENDAR_GET_EVENT = 0x42A,
- CMSG_CALENDAR_GUILD_FILTER = 0x42B,
- CMSG_CALENDAR_ARENA_TEAM = 0x42C,
- CMSG_CALENDAR_ADD_EVENT = 0x42D,
- CMSG_CALENDAR_UPDATE_EVENT = 0x42E,
- CMSG_CALENDAR_REMOVE_EVENT = 0x42F,
- CMSG_CALENDAR_COPY_EVENT = 0x430,
- CMSG_CALENDAR_EVENT_INVITE = 0x431,
- CMSG_CALENDAR_EVENT_RSVP = 0x432,
- CMSG_CALENDAR_EVENT_REMOVE_INVITE = 0x433,
- CMSG_CALENDAR_EVENT_STATUS = 0x434,
- CMSG_CALENDAR_EVENT_MODERATOR_STATUS = 0x435,
- SMSG_CALENDAR_SEND_CALENDAR = 0x436,
- SMSG_CALENDAR_SEND_EVENT = 0x437,
- SMSG_CALENDAR_FILTER_GUILD = 0x438,
- SMSG_CALENDAR_ARENA_TEAM = 0x439,
- SMSG_CALENDAR_EVENT_INVITE = 0x43A,
- SMSG_CALENDAR_EVENT_INVITE_REMOVED = 0x43B,
- SMSG_CALENDAR_EVENT_STATUS = 0x43C,
- SMSG_CALENDAR_COMMAND_RESULT = 0x43D,
- SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x43E,
- SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x43F,
- SMSG_CALENDAR_EVENT_INVITE_ALERT = 0x440,
- SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT = 0x441,
- SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT = 0x442,
- SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x443,
- SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x444,
- SMSG_CALENDAR_EVENT_MODERATOR_STATUS_ALERT = 0x445,
- CMSG_CALENDAR_COMPLAIN = 0x446,
- CMSG_CALENDAR_GET_NUM_PENDING = 0x447,
- SMSG_CALENDAR_SEND_NUM_PENDING = 0x448,
- CMSG_SAVE_DANCE = 0x449,
- SMSG_NOTIFY_DANCE = 0x44A,
- CMSG_PLAY_DANCE = 0x44B,
- SMSG_PLAY_DANCE = 0x44C,
- CMSG_LOAD_DANCES = 0x44D,
- CMSG_STOP_DANCE = 0x44E,
- SMSG_STOP_DANCE = 0x44F,
- CMSG_SYNC_DANCE = 0x450,
- CMSG_DANCE_QUERY = 0x451,
- SMSG_DANCE_QUERY_RESPONSE = 0x452,
- SMSG_INVALIDATE_DANCE = 0x453,
- CMSG_DELETE_DANCE = 0x454,
- SMSG_LEARNED_DANCE_MOVES = 0x455,
- CMSG_LEARN_DANCE_MOVE = 0x456,
- CMSG_UNLEARN_DANCE_MOVE = 0x457,
- CMSG_SET_RUNE_COUNT = 0x458,
- CMSG_SET_RUNE_COOLDOWN = 0x459,
- MSG_MOVE_SET_PITCH_RATE_CHEAT = 0x45A,
- MSG_MOVE_SET_PITCH_RATE = 0x45B,
- SMSG_FORCE_PITCH_RATE_CHANGE = 0x45C,
- CMSG_FORCE_PITCH_RATE_CHANGE_ACK = 0x45D,
- SMSG_SPLINE_SET_PITCH_RATE = 0x45E,
- SMSG_MOVE_ABANDON_TRANSPORT = 0x45F,
- MSG_MOVE_ABANDON_TRANSPORT = 0x460,
- CMSG_MOVE_ABANDON_TRANSPORT_ACK = 0x461,
- CMSG_UPDATE_MISSILE_TRAJECTORY = 0x462,
- SMSG_UPDATE_ACCOUNT_DATA_COMPLETE = 0x463,
- SMSG_TRIGGER_MOVIE = 0x464,
- CMSG_COMPLETE_MOVIE = 0x465,
- CMSG_SET_GLYPH_SLOT = 0x466,
- CMSG_SET_GLYPH = 0x467,
- SMSG_ACHIEVEMENT_EARNED = 0x468,
- SMSG_DYNAMIC_DROP_ROLL_RESULT = 0x469,
- SMSG_CRITERIA_UPDATE = 0x46A,
- CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0x46B,
- SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x46C,
- CMSG_DISMISS_CONTROLLED_VEHICLE = 0x46D,
- CMSG_COMPLETE_ACHIEVEMENT_CHEAT = 0x46E,
- SMSG_QUESTUPDATE_ADD_PVP_KILL = 0x46F,
- CMSG_SET_CRITERIA_CHEAT = 0x470,
- SMSG_GROUP_SWAP_FAILED = 0x471,
- CMSG_UNITANIMTIER_CHEAT = 0x472,
- CMSG_CHAR_CUSTOMIZE = 0x473,
- SMSG_CHAR_CUSTOMIZE = 0x474,
- SMSG_PET_RENAMEABLE = 0x475,
- CMSG_REQUEST_VEHICLE_EXIT = 0x476,
- CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x477,
- CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x478,
- CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x479,
- CMSG_PET_LEARN_TALENT = 0x47A,
- CMSG_PET_UNLEARN_TALENTS = 0x47B,
- SMSG_SET_PHASE_SHIFT = 0x47C,
- SMSG_ALL_ACHIEVEMENT_DATA = 0x47D,
- CMSG_FORCE_SAY_CHEAT = 0x47E,
- SMSG_HEALTH_UPDATE = 0x47F,
- SMSG_POWER_UPDATE = 0x480,
- CMSG_GAMEOBJ_REPORT_USE = 0x481,
- SMSG_HIGHEST_THREAT_UPDATE = 0x482,
- SMSG_THREAT_UPDATE = 0x483,
- SMSG_THREAT_REMOVE = 0x484,
- SMSG_THREAT_CLEAR = 0x485,
- SMSG_CONVERT_RUNE = 0x486,
- SMSG_RESYNC_RUNES = 0x487,
- SMSG_ADD_RUNE_POWER = 0x488,
- CMSG_START_QUEST = 0x489,
- CMSG_REMOVE_GLYPH = 0x48A,
- CMSG_DUMP_OBJECTS = 0x48B,
- SMSG_DUMP_OBJECTS_DATA = 0x48C,
- CMSG_DISMISS_CRITTER = 0x48D,
- SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x48E,
- CMSG_AUCTION_LIST_PENDING_SALES = 0x48F,
- SMSG_AUCTION_LIST_PENDING_SALES = 0x490,
- SMSG_MODIFY_COOLDOWN = 0x491,
- SMSG_PET_UPDATE_COMBO_POINTS = 0x492,
- CMSG_ENABLETAXI = 0x493,
- SMSG_PRE_RESURRECT = 0x494,
- SMSG_AURA_UPDATE_ALL = 0x495,
- SMSG_AURA_UPDATE = 0x496,
- CMSG_FLOOD_GRACE_CHEAT = 0x497,
- SMSG_SERVER_FIRST_ACHIEVEMENT = 0x498,
- SMSG_PET_LEARNED_SPELL = 0x499,
- SMSG_PET_REMOVED_SPELL = 0x49A,
- CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE = 0x49B,
- CMSG_HEARTH_AND_RESURRECT = 0x49C,
- SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x49D,
- SMSG_CRITERIA_DELETED = 0x49E,
- SMSG_ACHIEVEMENT_DELETED = 0x49F,
- CMSG_SERVER_INFO_QUERY = 0x4A0,
- SMSG_SERVER_INFO_RESPONSE = 0x4A1,
- CMSG_CHECK_LOGIN_CRITERIA = 0x4A2,
- SMSG_SERVER_BUCK_DATA_START = 0x4A3,
- CMSG_QUERY_VEHICLE_STATUS = 0x4A4,
- SMSG_PET_GUIDS = 0x4A5,
- NUM_MSG_TYPES = 0x4A6
+ SMSG_VOICE_PARENTAL_CONTROLS = 0x3B0,
+ CMSG_GM_WHISPER = 0x3B1,
+ SMSG_GM_MESSAGECHAT = 0x3B2,
+ MSG_GM_GEARRATING = 0x3B3,
+ CMSG_COMMENTATOR_ENABLE = 0x3B4,
+ SMSG_COMMENTATOR_STATE_CHANGED = 0x3B5,
+ CMSG_COMMENTATOR_GET_MAP_INFO = 0x3B6,
+ SMSG_COMMENTATOR_MAP_INFO = 0x3B7,
+ CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x3B8,
+ SMSG_COMMENTATOR_GET_PLAYER_INFO = 0x3B9,
+ SMSG_COMMENTATOR_PLAYER_INFO = 0x3BA,
+ CMSG_COMMENTATOR_ENTER_INSTANCE = 0x3BB,
+ CMSG_COMMENTATOR_EXIT_INSTANCE = 0x3BC,
+ CMSG_COMMENTATOR_INSTANCE_COMMAND = 0x3BD,
+ SMSG_CLEAR_TARGET = 0x3BE,
+ CMSG_BOT_DETECTED = 0x3BF,
+ SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x3C0,
+ CMSG_CHEAT_PLAYER_LOGIN = 0x3C1,
+ CMSG_CHEAT_PLAYER_LOOKUP = 0x3C2,
+ SMSG_CHEAT_PLAYER_LOOKUP = 0x3C3,
+ SMSG_KICK_REASON = 0x3C4,
+ MSG_RAID_READY_CHECK_FINISHED = 0x3C5,
+ CMSG_COMPLAIN = 0x3C6,
+ SMSG_COMPLAIN_RESULT = 0x3C7,
+ SMSG_FEATURE_SYSTEM_STATUS = 0x3C8,
+ CMSG_GM_SHOW_COMPLAINTS = 0x3C9,
+ CMSG_GM_UNSQUELCH = 0x3CA,
+ CMSG_CHANNEL_SILENCE_VOICE = 0x3CB,
+ CMSG_CHANNEL_SILENCE_ALL = 0x3CC,
+ CMSG_CHANNEL_UNSILENCE_VOICE = 0x3CD,
+ CMSG_CHANNEL_UNSILENCE_ALL = 0x3CE,
+ CMSG_TARGET_CAST = 0x3CF,
+ CMSG_TARGET_SCRIPT_CAST = 0x3D0,
+ CMSG_CHANNEL_DISPLAY_LIST = 0x3D1,
+ CMSG_SET_ACTIVE_VOICE_CHANNEL = 0x3D2,
+ CMSG_GET_CHANNEL_MEMBER_COUNT = 0x3D3,
+ SMSG_CHANNEL_MEMBER_COUNT = 0x3D4,
+ CMSG_CHANNEL_VOICE_ON = 0x3D5,
+ CMSG_CHANNEL_VOICE_OFF = 0x3D6,
+ CMSG_DEBUG_LIST_TARGETS = 0x3D7,
+ SMSG_DEBUG_LIST_TARGETS = 0x3D8,
+ SMSG_AVAILABLE_VOICE_CHANNEL = 0x3D9,
+ CMSG_ADD_VOICE_IGNORE = 0x3DA,
+ CMSG_DEL_VOICE_IGNORE = 0x3DB,
+ CMSG_PARTY_SILENCE = 0x3DC,
+ CMSG_PARTY_UNSILENCE = 0x3DD,
+ MSG_NOTIFY_PARTY_SQUELCH = 0x3DE,
+ SMSG_COMSAT_RECONNECT_TRY = 0x3DF,
+ SMSG_COMSAT_DISCONNECT = 0x3E0,
+ SMSG_COMSAT_CONNECT_FAIL = 0x3E1,
+ SMSG_VOICE_CHAT_STATUS = 0x3E2,
+ CMSG_REPORT_PVP_AFK = 0x3E3,
+ CMSG_REPORT_PVP_AFK_RESULT = 0x3E4,
+ CMSG_GUILD_BANKER_ACTIVATE = 0x3E5,
+ CMSG_GUILD_BANK_QUERY_TAB = 0x3E6,
+ SMSG_GUILD_BANK_LIST = 0x3E7,
+ CMSG_GUILD_BANK_SWAP_ITEMS = 0x3E8,
+ CMSG_GUILD_BANK_BUY_TAB = 0x3E9,
+ CMSG_GUILD_BANK_UPDATE_TAB = 0x3EA,
+ CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x3EB,
+ CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x3EC,
+ MSG_GUILD_BANK_LOG_QUERY = 0x3ED,
+ CMSG_SET_CHANNEL_WATCH = 0x3EE,
+ SMSG_USERLIST_ADD = 0x3EF,
+ SMSG_USERLIST_REMOVE = 0x3F0,
+ SMSG_USERLIST_UPDATE = 0x3F1,
+ CMSG_CLEAR_CHANNEL_WATCH = 0x3F2,
+ SMSG_INSPECT_TALENT = 0x3F3,
+ SMSG_GOGOGO_OBSOLETE = 0x3F4,
+ SMSG_ECHO_PARTY_SQUELCH = 0x3F5,
+ CMSG_SET_TITLE_SUFFIX = 0x3F6,
+ CMSG_SPELLCLICK = 0x3F7,
+ SMSG_LOOT_LIST = 0x3F8,
+ CMSG_GM_CHARACTER_RESTORE = 0x3F9,
+ CMSG_GM_CHARACTER_SAVE = 0x3FA,
+ SMSG_VOICESESSION_FULL = 0x3FB,
+ MSG_GUILD_PERMISSIONS = 0x3FC,
+ MSG_GUILD_BANK_MONEY_WITHDRAWN = 0x3FD,
+ MSG_GUILD_EVENT_LOG_QUERY = 0x3FE,
+ CMSG_MAELSTROM_RENAME_GUILD = 0x3FF,
+ CMSG_GET_MIRRORIMAGE_DATA = 0x400,
+ SMSG_MIRRORIMAGE_DATA = 0x401,
+ SMSG_FORCE_DISPLAY_UPDATE = 0x402,
+ SMSG_SPELL_CHANCE_RESIST_PUSHBACK = 0x403,
+ CMSG_IGNORE_DIMINISHING_RETURNS_CHEAT = 0x404,
+ SMSG_IGNORE_DIMINISHING_RETURNS_CHEAT = 0x405,
+ CMSG_KEEP_ALIVE = 0x406,
+ SMSG_RAID_READY_CHECK_ERROR = 0x407,
+ CMSG_OPT_OUT_OF_LOOT = 0x408,
+ MSG_QUERY_GUILD_BANK_TEXT = 0x409,
+ CMSG_SET_GUILD_BANK_TEXT = 0x40A,
+ CMSG_SET_GRANTABLE_LEVELS = 0x40B,
+ CMSG_GRANT_LEVEL = 0x40C,
+ CMSG_REFER_A_FRIEND = 0x40D,
+ MSG_GM_CHANGE_ARENA_RATING = 0x40E,
+ CMSG_DECLINE_CHANNEL_INVITE = 0x40F,
+ CMSG_GROUPACTION_THROTTLED = 0x410,
+ SMSG_OVERRIDE_LIGHT = 0x411,
+ SMSG_TOTEM_CREATED = 0x412,
+ CMSG_TOTEM_DESTROYED = 0x413,
+ CMSG_EXPIRE_RAID_INSTANCE = 0x414,
+ CMSG_NO_SPELL_VARIANCE = 0x415,
+ CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY = 0x416,
+ SMSG_QUESTGIVER_STATUS_MULTIPLE = 0x417,
+ CMSG_SET_PLAYER_DECLINED_NAMES = 0x418,
+ SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x419,
+ CMSG_QUERY_SERVER_BUCK_DATA = 0x41A,
+ CMSG_CLEAR_SERVER_BUCK_DATA = 0x41B,
+ SMSG_SERVER_BUCK_DATA = 0x41C,
+ SMSG_SEND_UNLEARN_SPELLS = 0x41D,
+ SMSG_PROPOSE_LEVEL_GRANT = 0x41E,
+ CMSG_ACCEPT_LEVEL_GRANT = 0x41F,
+ SMSG_REFER_A_FRIEND_FAILURE = 0x420,
+ SMSG_SPLINE_MOVE_SET_FLYING = 0x421,
+ SMSG_SPLINE_MOVE_UNSET_FLYING = 0x422,
+ SMSG_SUMMON_CANCEL = 0x423
};
+// Don't forget to change this value and add opcode name to Opcodes.cpp when you add new opcode!
+#define NUM_MSG_TYPES 0x424
+
/// Player state
enum SessionStatus
{
diff --git a/src/game/Pet.cpp b/src/game/Pet.cpp
index d56ae59158e..836ee6d8459 100644
--- a/src/game/Pet.cpp
+++ b/src/game/Pet.cpp
@@ -41,6 +41,27 @@ char const* petTypeSuffix[MAX_PET_TYPE] =
"'s Companion" // MINI_PET
};
+//numbers represent minutes * 100 while happy (you get 100 loyalty points per min while happy)
+uint32 const LevelUpLoyalty[6] =
+{
+ 5500,
+ 11500,
+ 17000,
+ 23500,
+ 31000,
+ 39500,
+};
+
+uint32 const LevelStartLoyalty[6] =
+{
+ 2000,
+ 4500,
+ 7000,
+ 10000,
+ 13500,
+ 17500,
+};
+
Pet::Pet(PetType type) : Creature()
{
m_isPet = true;
@@ -50,16 +71,17 @@ Pet::Pet(PetType type) : Creature()
m_removed = false;
m_regenTimer = 4000;
m_happinessTimer = 7500;
+ m_loyaltyTimer = 12000;
m_duration = 0;
m_bonusdamage = 0;
+ m_loyaltyPoints = 0;
+ m_TrainingPoints = 0;
m_resetTalentsCost = 0;
m_resetTalentsTime = 0;
m_auraUpdateMask = 0;
- m_loading = false;
-
// pets always have a charminfo, even if they are not actually charmed
CharmInfo* charmInfo = InitCharmInfo(this);
@@ -106,26 +128,24 @@ void Pet::RemoveFromWorld()
bool Pet::LoadPetFromDB( Unit* owner, uint32 petentry, uint32 petnumber, bool current )
{
- m_loading = true;
-
uint32 ownerid = owner->GetGUIDLow();
QueryResult *result;
if(petnumber)
- // known petnumber entry 0 1 2(?) 3 4 5 6 7 8(?) 9 10 11 12 13 14 15 16 17 18 19 20
- result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, talentpoints, slot, name, renamed, curhealth, curmana, curhappiness, abdata, TeachSpelldata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType FROM character_pet WHERE owner = '%u' AND id = '%u'",ownerid, petnumber);
+ // known petnumber entry 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
+ result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, loyaltypoints, loyalty, trainpoint, slot, name, renamed, curhealth, curmana, curhappiness, abdata, TeachSpelldata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType FROM character_pet WHERE owner = '%u' AND id = '%u'",ownerid, petnumber);
else if(current)
- // current pet (slot 0) 0 1 2(?) 3 4 5 6 7 8(?) 9 10 11 12 13 14 15 16 17 18 19 20
- result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, talentpoints, slot, name, renamed, curhealth, curmana, curhappiness, abdata, TeachSpelldata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType FROM character_pet WHERE owner = '%u' AND slot = '0'",ownerid );
+ // current pet (slot 0) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
+ result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, loyaltypoints, loyalty, trainpoint, slot, name, renamed, curhealth, curmana, curhappiness, abdata, TeachSpelldata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType FROM character_pet WHERE owner = '%u' AND slot = '0'",ownerid );
else if(petentry)
// known petentry entry (unique for summoned pet, but non unique for hunter pet (only from current or not stabled pets)
- // 0 1 2(?) 3 4 5 6 7 8(?) 9 10 11 12 13 14 15 16 17 18 19 20
- result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, talentpoints, slot, name, renamed, curhealth, curmana, curhappiness, abdata, TeachSpelldata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType FROM character_pet WHERE owner = '%u' AND entry = '%u' AND (slot = '0' OR slot = '3') ",ownerid, petentry );
+ // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
+ result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, loyaltypoints, loyalty, trainpoint, slot, name, renamed, curhealth, curmana, curhappiness, abdata, TeachSpelldata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType FROM character_pet WHERE owner = '%u' AND entry = '%u' AND (slot = '0' OR slot = '3') ",ownerid, petentry );
else
// any current or other non-stabled pet (for hunter "call pet")
- // 0 1 2(?) 3 4 5 6 7 8(?) 9 10 11 12 13 14 15 16 17 18 19 20
- result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, talentpoints, slot, name, renamed, curhealth, curmana, curhappiness, abdata, TeachSpelldata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType FROM character_pet WHERE owner = '%u' AND (slot = '0' OR slot = '3') ",ownerid);
+ // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
+ result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, loyaltypoints, loyalty, trainpoint, slot, name, renamed, curhealth, curmana, curhappiness, abdata, TeachSpelldata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType FROM character_pet WHERE owner = '%u' AND (slot = '0' OR slot = '3') ",ownerid);
if(!result)
return false;
@@ -140,7 +160,7 @@ bool Pet::LoadPetFromDB( Unit* owner, uint32 petentry, uint32 petnumber, bool cu
return false;
}
- uint32 summon_spell_id = fields[19].GetUInt32();
+ uint32 summon_spell_id = fields[21].GetUInt32();
SpellEntry const* spellInfo = sSpellStore.LookupEntry(summon_spell_id);
bool is_temporary_summoned = spellInfo && GetSpellDuration(spellInfo) > 0;
@@ -174,8 +194,8 @@ bool Pet::LoadPetFromDB( Unit* owner, uint32 petentry, uint32 petnumber, bool cu
return false;
}
- setPetType(PetType(fields[20].GetUInt8()));
- SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, owner->getFaction());
+ setPetType(PetType(fields[22].GetUInt8()));
+ SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE,owner->getFaction());
SetUInt32Value(UNIT_CREATED_BY_SPELL, summon_spell_id);
CreatureInfo const *cinfo = GetCreatureInfo();
@@ -186,67 +206,72 @@ bool Pet::LoadPetFromDB( Unit* owner, uint32 petentry, uint32 petnumber, bool cu
delete result;
return true;
}
-
- if(getPetType() == HUNTER_PET || (getPetType() == SUMMON_PET && cinfo->type == CREATURE_TYPE_DEMON && owner->getClass() == CLASS_WARLOCK))
+ if(getPetType()==HUNTER_PET || (getPetType()==SUMMON_PET && cinfo->type == CREATURE_TYPE_DEMON && owner->getClass() == CLASS_WARLOCK))
m_charmInfo->SetPetNumber(pet_number, true);
else
m_charmInfo->SetPetNumber(pet_number, false);
-
- SetOwnerGUID(owner->GetGUID());
+ SetUInt64Value(UNIT_FIELD_SUMMONEDBY, owner->GetGUID());
SetDisplayId(fields[3].GetUInt32());
SetNativeDisplayId(fields[3].GetUInt32());
- uint32 petlevel = fields[4].GetUInt32();
- SetUInt32Value(UNIT_NPC_FLAGS, 0);
- SetName(fields[9].GetString());
+ uint32 petlevel=fields[4].GetUInt32();
+ SetUInt32Value(UNIT_NPC_FLAGS , 0);
+ SetName(fields[11].GetString());
switch(getPetType())
{
+
case SUMMON_PET:
petlevel=owner->getLevel();
- SetUInt32Value(UNIT_FIELD_BYTES_0, 2048);
+ SetUInt32Value(UNIT_FIELD_BYTES_0,2048);
SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
// this enables popup window (pet dismiss, cancel)
break;
case HUNTER_PET:
SetUInt32Value(UNIT_FIELD_BYTES_0, 0x02020100);
- SetByteValue(UNIT_FIELD_BYTES_1, 1, fields[7].GetUInt32());
- SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE);
- SetByteValue(UNIT_FIELD_BYTES_2, 2, fields[10].GetBool() ? UNIT_RENAME_NOT_ALLOWED : UNIT_RENAME_ALLOWED);
+ SetByteValue(UNIT_FIELD_BYTES_1, 1, fields[8].GetUInt32());
+ SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE );
+ SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_UNK3 | UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5 );
+
+ if(fields[12].GetBool())
+ SetByteValue(UNIT_FIELD_BYTES_2, 2, UNIT_RENAME_NOT_ALLOWED);
+ else
+ SetByteValue(UNIT_FIELD_BYTES_2, 2, UNIT_RENAME_ALLOWED);
SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
// this enables popup window (pet abandon, cancel)
- SetMaxPower(POWER_HAPPINESS, GetCreatePowers(POWER_HAPPINESS));
- SetPower(POWER_HAPPINESS, fields[13].GetUInt32());
+ SetTP(fields[9].GetInt32());
+ SetMaxPower(POWER_HAPPINESS,GetCreatePowers(POWER_HAPPINESS));
+ SetPower( POWER_HAPPINESS,fields[15].GetUInt32());
setPowerType(POWER_FOCUS);
break;
default:
- sLog.outError("Pet have incorrect type (%u) for pet loading.", getPetType());
+ sLog.outError("Pet have incorrect type (%u) for pet loading.",getPetType());
}
-
- InitStatsForLevel(petlevel);
+ InitStatsForLevel( petlevel);
SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, time(NULL));
SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, fields[5].GetUInt32());
- SetCreatorGUID(owner->GetGUID());
+ SetUInt64Value(UNIT_FIELD_CREATEDBY, owner->GetGUID());
- m_charmInfo->SetReactState(ReactStates(fields[6].GetUInt8()));
+ m_charmInfo->SetReactState( ReactStates( fields[6].GetUInt8() ));
+ m_loyaltyPoints = fields[7].GetInt32();
- uint32 savedhealth = fields[11].GetUInt32();
- uint32 savedmana = fields[12].GetUInt32();
+ uint32 savedhealth = fields[13].GetUInt32();
+ uint32 savedmana = fields[14].GetUInt32();
// set current pet as current
- if(fields[8].GetUInt32() != 0)
+ if(fields[10].GetUInt32() != 0)
{
CharacterDatabase.BeginTransaction();
- CharacterDatabase.PExecute("UPDATE character_pet SET slot = '3' WHERE owner = '%u' AND slot = '0' AND id <> '%u'", ownerid, m_charmInfo->GetPetNumber());
- CharacterDatabase.PExecute("UPDATE character_pet SET slot = '0' WHERE owner = '%u' AND id = '%u'", ownerid, m_charmInfo->GetPetNumber());
+ CharacterDatabase.PExecute("UPDATE character_pet SET slot = '3' WHERE owner = '%u' AND slot = '0' AND id <> '%u'",ownerid, m_charmInfo->GetPetNumber());
+ CharacterDatabase.PExecute("UPDATE character_pet SET slot = '0' WHERE owner = '%u' AND id = '%u'",ownerid, m_charmInfo->GetPetNumber());
CharacterDatabase.CommitTransaction();
}
if(!is_temporary_summoned)
{
// permanent controlled pets store state in DB
- Tokens tokens = StrSplit(fields[14].GetString(), " ");
+ Tokens tokens = StrSplit(fields[16].GetString(), " ");
if(tokens.size() != 20)
{
@@ -265,11 +290,11 @@ bool Pet::LoadPetFromDB( Unit* owner, uint32 petentry, uint32 petnumber, bool cu
// patch for old data where some spells have ACT_DECIDE but should have ACT_CAST
// so overwrite old state
SpellEntry const *spellInfo = sSpellStore.LookupEntry(m_charmInfo->GetActionBarEntry(index)->SpellOrAction);
- if (spellInfo && spellInfo->AttributesEx & SPELL_ATTR_EX_UNAUTOCASTABLE_BY_PET) m_charmInfo->GetActionBarEntry(index)->Type = ACT_ENABLED;
+ if (spellInfo && spellInfo->AttributesEx & SPELL_ATTR_EX_UNAUTOCASTABLE_BY_PET) m_charmInfo->GetActionBarEntry(index)->Type = ACT_CAST;
}
//init teach spells
- tokens = StrSplit(fields[15].GetString(), " ");
+ tokens = StrSplit(fields[17].GetString(), " ");
for (iter = tokens.begin(), index = 0; index < 4; ++iter, ++index)
{
uint32 tmp = atol((*iter).c_str());
@@ -284,10 +309,7 @@ bool Pet::LoadPetFromDB( Unit* owner, uint32 petentry, uint32 petnumber, bool cu
}
// since last save (in seconds)
- uint32 timediff = (time(NULL) - fields[16].GetUInt32());
-
- m_resetTalentsCost = fields[17].GetUInt32();
- m_resetTalentsTime = fields[18].GetUInt64();
+ uint32 timediff = (time(NULL) - fields[18].GetUInt32());
delete result;
@@ -353,7 +375,6 @@ bool Pet::LoadPetFromDB( Unit* owner, uint32 petentry, uint32 petnumber, bool cu
}
}
- m_loading = false;
return true;
}
@@ -396,6 +417,10 @@ void Pet::SavePetToDB(PetSaveMode mode)
case PET_SAVE_IN_STABLE_SLOT_2:
case PET_SAVE_NOT_IN_SLOT:
{
+ uint32 loyalty =1;
+ if(getPetType()!=HUNTER_PET)
+ loyalty = GetLoyaltyLevel();
+
uint32 owner = GUID_LOPART(GetOwnerGUID());
std::string name = m_name;
CharacterDatabase.escape_string(name);
@@ -412,7 +437,7 @@ void Pet::SavePetToDB(PetSaveMode mode)
CharacterDatabase.PExecute("DELETE FROM character_pet WHERE owner = '%u' AND (slot = '0' OR slot = '3')", owner );
// save pet
std::ostringstream ss;
- ss << "INSERT INTO character_pet ( id, entry, owner, modelid, level, exp, Reactstate, talentpoints, slot, name, renamed, curhealth, curmana, curhappiness, abdata, TeachSpelldata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType) "
+ ss << "INSERT INTO character_pet ( id, entry, owner, modelid, level, exp, Reactstate, loyaltypoints, loyalty, trainpoint, slot, name, renamed, curhealth, curmana, curhappiness, abdata,TeachSpelldata,savetime,resettalents_cost,resettalents_time,CreatedBySpell,PetType) "
<< "VALUES ("
<< m_charmInfo->GetPetNumber() << ", "
<< GetEntry() << ", "
@@ -421,7 +446,9 @@ void Pet::SavePetToDB(PetSaveMode mode)
<< getLevel() << ", "
<< GetUInt32Value(UNIT_FIELD_PETEXPERIENCE) << ", "
<< uint32(m_charmInfo->GetReactState()) << ", "
- << uint32(GetFreeTalentPoints()) << ", "
+ << m_loyaltyPoints << ", "
+ << GetLoyaltyLevel() << ", "
+ << m_TrainingPoints << ", "
<< uint32(mode) << ", '"
<< name.c_str() << "', "
<< uint32((GetByteValue(UNIT_FIELD_BYTES_2, 2) == UNIT_RENAME_ALLOWED)?0:1) << ", "
@@ -494,12 +521,12 @@ void Pet::setDeathState(DeathState s) // overwrite virtual
if(!mapEntry || (mapEntry->map_type != MAP_ARENA && mapEntry->map_type != MAP_BATTLEGROUND))
ModifyPower(POWER_HAPPINESS, -HAPPINESS_LEVEL_SIZE);
- SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
+ SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_ROTATE);
}
}
else if(getDeathState()==ALIVE)
{
- RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
+ RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_ROTATE);
CastPetAuras(true);
}
}
@@ -526,7 +553,6 @@ void Pet::Update(uint32 diff)
// unsummon pet that lost owner
Unit* owner = GetOwner();
if(!owner || (!IsWithinDistInMap(owner, OWNER_MAX_DISTANCE) && !isPossessed()) || isControlled() && !owner->GetPetGUID())
- //if(!owner || (!IsWithinDistInMap(owner, OWNER_MAX_DISTANCE) && (owner->GetCharmGUID() && (owner->GetCharmGUID() != GetGUID()))) || (isControlled() && !owner->GetPetGUID()))
{
Remove(PET_SAVE_NOT_IN_SLOT, true);
return;
@@ -572,6 +598,14 @@ void Pet::Update(uint32 diff)
else
m_happinessTimer -= diff;
+ if(m_loyaltyTimer <= diff)
+ {
+ TickLoyaltyChange();
+ m_loyaltyTimer = 12000;
+ }
+ else
+ m_loyaltyTimer -= diff;
+
break;
}
default:
@@ -603,12 +637,83 @@ void Pet::LooseHappiness()
uint32 curValue = GetPower(POWER_HAPPINESS);
if (curValue <= 0)
return;
- int32 addvalue = 670; //value is 70/35/17/8/4 (per min) * 1000 / 8 (timer 7.5 secs)
+ int32 addvalue = (140 >> GetLoyaltyLevel()) * 125; //value is 70/35/17/8/4 (per min) * 1000 / 8 (timer 7.5 secs)
if(isInCombat()) //we know in combat happiness fades faster, multiplier guess
addvalue = int32(addvalue * 1.5);
ModifyPower(POWER_HAPPINESS, -addvalue);
}
+void Pet::ModifyLoyalty(int32 addvalue)
+{
+ uint32 loyaltylevel = GetLoyaltyLevel();
+
+ if(addvalue > 0) //only gain influenced, not loss
+ addvalue = int32((float)addvalue * sWorld.getRate(RATE_LOYALTY));
+
+ if(loyaltylevel >= BEST_FRIEND && (addvalue + m_loyaltyPoints) > int32(GetMaxLoyaltyPoints(loyaltylevel)))
+ return;
+
+ m_loyaltyPoints += addvalue;
+
+ if(m_loyaltyPoints < 0)
+ {
+ if(loyaltylevel > REBELLIOUS)
+ {
+ //level down
+ --loyaltylevel;
+ SetLoyaltyLevel(LoyaltyLevel(loyaltylevel));
+ m_loyaltyPoints = GetStartLoyaltyPoints(loyaltylevel);
+ SetTP(m_TrainingPoints - int32(getLevel()));
+ }
+ else
+ {
+ m_loyaltyPoints = 0;
+ Unit* owner = GetOwner();
+ if(owner && owner->GetTypeId() == TYPEID_PLAYER)
+ {
+ WorldPacket data(SMSG_PET_BROKEN, 0);
+ ((Player*)owner)->GetSession()->SendPacket(&data);
+
+ //run away
+ ((Player*)owner)->RemovePet(this,PET_SAVE_AS_DELETED);
+ }
+ }
+ }
+ //level up
+ else if(m_loyaltyPoints > int32(GetMaxLoyaltyPoints(loyaltylevel)))
+ {
+ ++loyaltylevel;
+ SetLoyaltyLevel(LoyaltyLevel(loyaltylevel));
+ m_loyaltyPoints = GetStartLoyaltyPoints(loyaltylevel);
+ SetTP(m_TrainingPoints + getLevel());
+ }
+}
+
+void Pet::TickLoyaltyChange()
+{
+ int32 addvalue;
+
+ switch(GetHappinessState())
+ {
+ case HAPPY: addvalue = 20; break;
+ case CONTENT: addvalue = 10; break;
+ case UNHAPPY: addvalue = -20; break;
+ default:
+ return;
+ }
+ ModifyLoyalty(addvalue);
+}
+
+void Pet::KillLoyaltyBonus(uint32 level)
+{
+ if(level > 100)
+ return;
+
+ //at lower levels gain is faster | the lower loyalty the more loyalty is gained
+ uint32 bonus = uint32(((100 - level) / 10) + (6 - GetLoyaltyLevel()));
+ ModifyLoyalty(bonus);
+}
+
HappinessState Pet::GetHappinessState()
{
if(GetPower(POWER_HAPPINESS) < HAPPINESS_LEVEL_SIZE)
@@ -619,6 +724,11 @@ HappinessState Pet::GetHappinessState()
return CONTENT;
}
+void Pet::SetLoyaltyLevel(LoyaltyLevel level)
+{
+ SetByteValue(UNIT_FIELD_BYTES_1, 1, level);
+}
+
bool Pet::CanTakeMoreActiveSpells(uint32 spellid)
{
uint8 activecount = 1;
@@ -655,6 +765,82 @@ bool Pet::CanTakeMoreActiveSpells(uint32 spellid)
return true;
}
+bool Pet::HasTPForSpell(uint32 spellid)
+{
+ int32 neededtrainp = GetTPForSpell(spellid);
+ if((m_TrainingPoints - neededtrainp < 0 || neededtrainp < 0) && neededtrainp != 0)
+ return false;
+ return true;
+}
+
+int32 Pet::GetTPForSpell(uint32 spellid)
+{
+ uint32 basetrainp = 0;
+
+ SkillLineAbilityMap::const_iterator lower = spellmgr.GetBeginSkillLineAbilityMap(spellid);
+ SkillLineAbilityMap::const_iterator upper = spellmgr.GetEndSkillLineAbilityMap(spellid);
+ for(SkillLineAbilityMap::const_iterator _spell_idx = lower; _spell_idx != upper; ++_spell_idx)
+ {
+ if(!_spell_idx->second->reqtrainpoints)
+ return 0;
+
+ basetrainp = _spell_idx->second->reqtrainpoints;
+ break;
+ }
+
+ uint32 spenttrainp = 0;
+ uint32 chainstart = spellmgr.GetFirstSpellInChain(spellid);
+
+ for (PetSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
+ {
+ if(itr->second->state == PETSPELL_REMOVED)
+ continue;
+
+ if(spellmgr.GetFirstSpellInChain(itr->first) == chainstart)
+ {
+ SkillLineAbilityMap::const_iterator _lower = spellmgr.GetBeginSkillLineAbilityMap(itr->first);
+ SkillLineAbilityMap::const_iterator _upper = spellmgr.GetEndSkillLineAbilityMap(itr->first);
+
+ for(SkillLineAbilityMap::const_iterator _spell_idx2 = _lower; _spell_idx2 != _upper; ++_spell_idx2)
+ {
+ if(_spell_idx2->second->reqtrainpoints > spenttrainp)
+ {
+ spenttrainp = _spell_idx2->second->reqtrainpoints;
+ break;
+ }
+ }
+ }
+ }
+
+ return int32(basetrainp) - int32(spenttrainp);
+}
+
+uint32 Pet::GetMaxLoyaltyPoints(uint32 level)
+{
+ return LevelUpLoyalty[level - 1];
+}
+
+uint32 Pet::GetStartLoyaltyPoints(uint32 level)
+{
+ return LevelStartLoyalty[level - 1];
+}
+
+void Pet::SetTP(int32 TP)
+{
+ m_TrainingPoints = TP;
+ SetUInt32Value(UNIT_TRAINING_POINTS, (uint32)GetDispTP());
+}
+
+int32 Pet::GetDispTP()
+{
+ if(getPetType()!= HUNTER_PET)
+ return(0);
+ if(m_TrainingPoints < 0)
+ return -m_TrainingPoints;
+ else
+ return -(m_TrainingPoints + 1);
+}
+
void Pet::Remove(PetSaveMode mode, bool returnreagent)
{
Unit* owner = GetOwner();
@@ -717,6 +903,9 @@ void Pet::GivePetXP(uint32 xp)
}
SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, newXP);
+
+ if(getPetType() == HUNTER_PET)
+ KillLoyaltyBonus(level);
}
void Pet::GivePetLevel(uint32 level)
@@ -724,7 +913,9 @@ void Pet::GivePetLevel(uint32 level)
if(!level)
return;
- InitStatsForLevel(level);
+ InitStatsForLevel( level);
+
+ SetTP(m_TrainingPoints + (GetLoyaltyLevel() - 1));
}
bool Pet::CreateBaseAtCreature(Creature* creature)
@@ -782,12 +973,16 @@ bool Pet::CreateBaseAtCreature(Creature* creature)
else
SetName(creature->GetName());
+ m_loyaltyPoints = 1000;
if(cinfo->type == CREATURE_TYPE_BEAST)
{
SetUInt32Value(UNIT_FIELD_BYTES_0, 0x02020100);
SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE );
+ SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_UNK3 | UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5 );
SetByteValue(UNIT_FIELD_BYTES_2, 2, UNIT_RENAME_ALLOWED);
- SetUInt32Value(UNIT_MOD_CAST_SPEED, creature->GetUInt32Value(UNIT_MOD_CAST_SPEED));
+
+ SetUInt32Value(UNIT_MOD_CAST_SPEED, creature->GetUInt32Value(UNIT_MOD_CAST_SPEED) );
+ SetLoyaltyLevel(REBELLIOUS);
}
return true;
}
@@ -917,7 +1112,7 @@ bool Pet::InitStatsForLevel(uint32 petlevel)
case HUNTER_PET:
{
SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, uint32((Trinity::XP::xp_to_level(petlevel))/4));
- learnLevelupSpells();
+
//these formula may not be correct; however, it is designed to be close to what it should be
//this makes dps 0.5 of pets level
SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, float(petlevel - (petlevel / 4)) );
@@ -1128,6 +1323,10 @@ void Pet::_LoadAuras(uint32 timediff)
for (int i = 0; i < TOTAL_AURAS; i++)
m_modAuras[i].clear();
+ // all aura related fields
+ for(int i = UNIT_FIELD_AURA; i <= UNIT_FIELD_AURASTATE; ++i)
+ SetUInt32Value(i, 0);
+
QueryResult *result = CharacterDatabase.PQuery("SELECT caster_guid,spell,effect_index,stackcount,amount,maxduration,remaintime,remaincharges FROM pet_aura WHERE guid = '%u'",m_charmInfo->GetPetNumber());
if(result)
@@ -1268,7 +1467,7 @@ bool Pet::addSpell(uint16 spell_id, uint16 active, PetSpellState state, uint16 s
// same spells don't have autocast option
if (spellInfo->AttributesEx & SPELL_ATTR_EX_UNAUTOCASTABLE_BY_PET)
- active = ACT_ENABLED;
+ active = ACT_CAST;
PetSpellMap::iterator itr = m_spells.find(spell_id);
if (itr != m_spells.end())
@@ -1320,12 +1519,11 @@ bool Pet::addSpell(uint16 spell_id, uint16 active, PetSpellState state, uint16 s
ToggleAutocast(itr->first, false);
oldspell_id = itr->first;
- unlearnSpell(itr->first);
- break;
+ removeSpell(itr->first);
}
}
- uint16 tmpslot = slot_id;
+ uint16 tmpslot=slot_id;
if (tmpslot == 0xffff)
{
@@ -1359,65 +1557,20 @@ bool Pet::learnSpell(uint16 spell_id)
if (!addSpell(spell_id))
return false;
- if(GetOwner()->GetTypeId() == TYPEID_PLAYER)
- {
- if(!m_loading)
- {
- WorldPacket data(SMSG_PET_LEARNED_SPELL, 2);
- data << uint16(spell_id);
- ((Player*)GetOwner())->GetSession()->SendPacket(&data);
- }
- }
-
Unit* owner = GetOwner();
- if(owner->GetTypeId() == TYPEID_PLAYER)
+ if(owner->GetTypeId()==TYPEID_PLAYER)
((Player*)owner)->PetSpellInitialize();
return true;
}
-void Pet::learnLevelupSpells()
-{
- PetLevelupSpellSet const *levelupSpells = spellmgr.GetPetLevelupSpellList(GetCreatureInfo()->family);
- if(!levelupSpells)
- return;
-
- uint32 level = getLevel();
-
- for(PetLevelupSpellSet::const_iterator itr = levelupSpells->begin(); itr != levelupSpells->end(); ++itr)
- {
- if(itr->first <= level)
- learnSpell(itr->second);
- else
- unlearnSpell(itr->second);
- }
-}
-
-bool Pet::unlearnSpell(uint16 spell_id)
-{
- if(removeSpell(spell_id))
- {
- if(GetOwner()->GetTypeId() == TYPEID_PLAYER)
- {
- if(!m_loading)
- {
- WorldPacket data(SMSG_PET_REMOVED_SPELL, 2);
- data << uint16(spell_id);
- ((Player*)GetOwner())->GetSession()->SendPacket(&data);
- }
- }
- return true;
- }
- return false;
-}
-
-bool Pet::removeSpell(uint16 spell_id)
+void Pet::removeSpell(uint16 spell_id)
{
PetSpellMap::iterator itr = m_spells.find(spell_id);
if (itr == m_spells.end())
- return false;
+ return;
if(itr->second->state == PETSPELL_REMOVED)
- return false;
+ return;
if(itr->second->state == PETSPELL_NEW)
{
@@ -1428,8 +1581,6 @@ bool Pet::removeSpell(uint16 spell_id)
itr->second->state = PETSPELL_REMOVED;
RemoveAurasDueToSpell(spell_id);
-
- return true;
}
bool Pet::_removeSpell(uint16 spell_id)
@@ -1449,7 +1600,7 @@ void Pet::InitPetCreateSpells()
m_charmInfo->InitPetActionBar();
m_spells.clear();
- int32 petspellid;
+ int32 usedtrainpoints = 0, petspellid;
PetCreateSpellEntry const* CreateSpells = objmgr.GetPetCreateSpellEntry(GetEntry());
if(CreateSpells)
{
@@ -1478,12 +1629,23 @@ void Pet::InitPetCreateSpells()
petspellid = learn_spellproto->Id;
addSpell(petspellid);
+
+ SkillLineAbilityMap::const_iterator lower = spellmgr.GetBeginSkillLineAbilityMap(learn_spellproto->EffectTriggerSpell[0]);
+ SkillLineAbilityMap::const_iterator upper = spellmgr.GetEndSkillLineAbilityMap(learn_spellproto->EffectTriggerSpell[0]);
+
+ for(SkillLineAbilityMap::const_iterator _spell_idx = lower; _spell_idx != upper; ++_spell_idx)
+ {
+ usedtrainpoints += _spell_idx->second->reqtrainpoints;
+ break;
+ }
}
}
LearnPetPassives();
CastPetAuras(false);
+
+ SetTP(-usedtrainpoints);
}
void Pet::CheckLearning(uint32 spellid)
@@ -1542,9 +1704,7 @@ void Pet::ToggleAutocast(uint32 spellid, bool apply)
if(apply)
{
- for (i = 0; i < m_autospells.size() && m_autospells[i] != spellid; i++)
- ; // just search
-
+ for (i = 0; i < m_autospells.size() && m_autospells[i] != spellid; i++);
if (i == m_autospells.size())
{
m_autospells.push_back(spellid);
@@ -1555,9 +1715,7 @@ void Pet::ToggleAutocast(uint32 spellid, bool apply)
else
{
AutoSpellList::iterator itr2 = m_autospells.begin();
- for (i = 0; i < m_autospells.size() && m_autospells[i] != spellid; i++, itr2++)
- ; // just search
-
+ for (i = 0; i < m_autospells.size() && m_autospells[i] != spellid; i++, itr2++);
if (i < m_autospells.size())
{
m_autospells.erase(itr2);
@@ -1580,7 +1738,8 @@ bool Pet::Create(uint32 guidlow, Map *map, uint32 Entry, uint32 pet_number)
if(!InitEntry(Entry))
return false;
- SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE);
+ SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE );
+ SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_UNK3 | UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5 );
if(getPetType() == MINI_PET) // always non-attackable
SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
diff --git a/src/game/Pet.h b/src/game/Pet.h
index 0082392400b..1057abc0edf 100644
--- a/src/game/Pet.h
+++ b/src/game/Pet.h
@@ -52,6 +52,16 @@ enum HappinessState
HAPPY = 3
};
+enum LoyaltyLevel
+{
+ REBELLIOUS = 1,
+ UNRULY = 2,
+ SUBMISSIVE = 3,
+ DEPENDABLE = 4,
+ FAITHFUL = 5,
+ BEST_FRIEND = 6
+};
+
enum PetSpellState
{
PETSPELL_UNCHANGED = 0,
@@ -112,6 +122,9 @@ typedef std::vector<uint32> AutoSpellList;
#define HAPPINESS_LEVEL_SIZE 333000
+extern const uint32 LevelUpLoyalty[6];
+extern const uint32 LevelStartLoyalty[6];
+
#define ACTIVE_SPELLS_MAX 4
#define OWNER_MAX_DISTANCE 100
@@ -154,7 +167,14 @@ class Pet : public Creature
void RegenerateFocus();
void LooseHappiness();
+ void TickLoyaltyChange();
+ void ModifyLoyalty(int32 addvalue);
HappinessState GetHappinessState();
+ uint32 GetMaxLoyaltyPoints(uint32 level);
+ uint32 GetStartLoyaltyPoints(uint32 level);
+ void KillLoyaltyBonus(uint32 level);
+ uint32 GetLoyaltyLevel() { return GetByteValue(UNIT_FIELD_BYTES_1, 1); }
+ void SetLoyaltyLevel(LoyaltyLevel level);
void GivePetXP(uint32 xp);
void GivePetLevel(uint32 level);
bool InitStatsForLevel(uint32 level);
@@ -174,8 +194,10 @@ class Pet : public Creature
void UpdateAttackPowerAndDamage(bool ranged = false);
void UpdateDamagePhysical(WeaponAttackType attType);
- bool CanTakeMoreActiveSpells(uint32 SpellIconID);
- void ToggleAutocast(uint32 spellid, bool apply);
+ bool CanTakeMoreActiveSpells(uint32 SpellIconID);
+ void ToggleAutocast(uint32 spellid, bool apply);
+ bool HasTPForSpell(uint32 spellid);
+ int32 GetTPForSpell(uint32 spellid);
bool HasSpell(uint32 spell) const;
void AddTeachSpell(uint32 learned_id, uint32 source_id) { m_teachspells[learned_id] = source_id; }
@@ -193,9 +215,7 @@ class Pet : public Creature
bool addSpell(uint16 spell_id,uint16 active = ACT_DECIDE, PetSpellState state = PETSPELL_NEW, uint16 slot_id=0xffff, PetSpellType type = PETSPELL_NORMAL);
bool learnSpell(uint16 spell_id);
- void learnLevelupSpells();
- bool unlearnSpell(uint16 spell_id);
- bool removeSpell(uint16 spell_id);
+ void removeSpell(uint16 spell_id);
bool _removeSpell(uint16 spell_id);
PetSpellMap m_spells;
@@ -205,10 +225,11 @@ class Pet : public Creature
void InitPetCreateSpells();
void CheckLearning(uint32 spellid);
uint32 resetTalentsCost() const;
- uint8 GetMaxTalentPointsForLevel(uint32 level) { return (level >= 20) ? ((level - 16) / 4) : 0; }
- uint8 GetFreeTalentPoints() { return GetByteValue(UNIT_FIELD_BYTES_1, 1); }
- void SetFreeTalentPoints(uint8 points) { SetByteValue(UNIT_FIELD_BYTES_1, 1, points); }
+ void SetTP(int32 TP);
+ int32 GetDispTP();
+
+ int32 m_TrainingPoints;
uint32 m_resetTalentsCost;
time_t m_resetTalentsTime;
@@ -220,12 +241,14 @@ class Pet : public Creature
bool m_removed; // prevent overwrite pet state in DB at next Pet::Update if pet already removed(saved)
protected:
+ uint32 m_regenTimer;
uint32 m_happinessTimer;
+ uint32 m_loyaltyTimer;
PetType m_petType;
int32 m_duration; // time until unsummon (used mostly for summoned guardians and not used for controlled pets)
+ int32 m_loyaltyPoints;
int32 m_bonusdamage;
uint64 m_auraUpdateMask;
- bool m_loading;
DeclinedName *m_declinedname;
diff --git a/src/game/PetHandler.cpp b/src/game/PetHandler.cpp
index f059662987c..e4269ddafd6 100644
--- a/src/game/PetHandler.cpp
+++ b/src/game/PetHandler.cpp
@@ -174,9 +174,9 @@ void WorldSession::HandlePetAction( WorldPacket & recv_data )
break;
}
break;
- case ACT_DISABLED: // 0x8100 spell (disabled), ignore
- case ACT_PASSIVE: // 0x0100
- case ACT_ENABLED: // 0xC100 spell
+ case ACT_DISABLED: //0x8100 spell (disabled), ignore
+ case ACT_CAST: //0x0100
+ case ACT_ENABLED: //0xc100 spell
{
Unit* unit_target;
if(guid2)
@@ -257,7 +257,7 @@ void WorldSession::HandlePetAction( WorldPacket & recv_data )
if(pet->isPossessed())
{
WorldPacket data(SMSG_CAST_FAILED, (4+1+1));
- data << uint8(0) << uint32(spellid) << uint8(result);
+ data << uint32(spellid) << uint8(2) << uint8(result);
switch (result)
{
case SPELL_FAILED_REQUIRES_SPELL_FOCUS:
@@ -369,7 +369,7 @@ void WorldSession::HandlePetSetAction( WorldPacket & recv_data )
sLog.outDetail( "Player %s has changed pet spell action. Position: %u, Spell: %u, State: 0x%X\n", _player->GetName(), position, spell_id, act_state);
//if it's act for spell (en/disable/cast) and there is a spell given (0 = remove spell) which pet doesn't know, don't add
- if(!((act_state == ACT_ENABLED || act_state == ACT_DISABLED || act_state == ACT_PASSIVE) && spell_id && !pet->HasSpell(spell_id)))
+ if(!((act_state == ACT_ENABLED || act_state == ACT_DISABLED || act_state == ACT_CAST) && spell_id && !pet->HasSpell(spell_id)))
{
//sign for autocast
if(act_state == ACT_ENABLED && spell_id)
@@ -542,10 +542,11 @@ void WorldSession::HandlePetUnlearnOpcode(WorldPacket& recvPacket)
{
uint32 spell_id = itr->first; // Pet::removeSpell can invalidate iterator at erase NEW spell
++itr;
- //pet->removeSpell(spell_id);
- pet->unlearnSpell(spell_id);
+ pet->removeSpell(spell_id);
}
+ pet->SetTP(pet->getLevel() * (pet->GetLoyaltyLevel() - 1));
+
for(uint8 i = 0; i < 10; i++)
{
if(charmInfo->GetActionBarEntry(i)->SpellOrAction && charmInfo->GetActionBarEntry(i)->Type == ACT_ENABLED || charmInfo->GetActionBarEntry(i)->Type == ACT_DISABLED)
@@ -615,15 +616,11 @@ void WorldSession::HandlePetCastSpellOpcode( WorldPacket& recvPacket )
{
sLog.outDetail("WORLD: CMSG_PET_CAST_SPELL");
- CHECK_PACKET_SIZE(recvPacket,8+1+4+1);
+ CHECK_PACKET_SIZE(recvPacket,8+4);
uint64 guid;
uint32 spellid;
- uint8 cast_count;
- uint8 unk_flags; // flags (if 0x02 - some additional data are received)
-
- recvPacket >> guid >> cast_count >> spellid >> unk_flags;
- sLog.outDebug("WORLD: CMSG_PET_CAST_SPELL, cast_count: %u, spellid %u, unk_flags %u", cast_count, spellid, unk_flags);
+ recvPacket >> guid >> spellid;
// This opcode is also sent from charmed and possessed units (players and creatures)
if(!_player->GetPet() && !_player->GetCharm())
@@ -658,7 +655,6 @@ void WorldSession::HandlePetCastSpellOpcode( WorldPacket& recvPacket )
caster->clearUnitState(UNIT_STAT_FOLLOW);
Spell *spell = new Spell(caster, spellInfo, false);
- spell->m_cast_count = cast_count; // probably pending spell cast
spell->m_targets = targets;
int16 result = spell->PetCanCast(NULL);
@@ -717,132 +713,3 @@ void WorldSession::SendPetNameInvalid(uint32 error, const std::string& name, Dec
data << uint8(0);
SendPacket(&data);
}
-
-void WorldSession::HandlePetLearnTalent( WorldPacket & recv_data )
-{
- sLog.outDebug("WORLD: CMSG_PET_LEARN_TALENT");
- recv_data.hexlike();
-
- CHECK_PACKET_SIZE(recv_data, 8+4+4);
-
- uint64 guid;
- uint32 talent_id, requested_rank;
- recv_data >> guid >> talent_id >> requested_rank;
-
- Pet *pet = _player->GetPet();
-
- if(!pet)
- return;
-
- if(guid != pet->GetGUID())
- return;
-
- uint32 CurTalentPoints = pet->GetFreeTalentPoints();
-
- if(CurTalentPoints == 0)
- return;
-
- if (requested_rank > 4)
- return;
-
- TalentEntry const *talentInfo = sTalentStore.LookupEntry(talent_id);
-
- if(!talentInfo)
- return;
-
- TalentTabEntry const *talentTabInfo = sTalentTabStore.LookupEntry(talentInfo->TalentTab);
-
- if(!talentTabInfo)
- return;
-
- CreatureInfo const *ci = pet->GetCreatureInfo();
-
- if(!ci)
- return;
-
- CreatureFamilyEntry const *pet_family = sCreatureFamilyStore.LookupEntry(ci->family);
-
- if(!pet_family)
- return;
-
- if(pet_family->petTalentType < 0) // not hunter pet
- return;
-
- // prevent learn talent for different family (cheating)
- if(!((1 << pet_family->petTalentType) & talentTabInfo->petTalentMask))
- return;
-
- // prevent skip talent ranks (cheating)
- if(requested_rank > 0 && !pet->HasSpell(talentInfo->RankID[requested_rank-1]))
- return;
-
- // Check if it requires another talent
- if (talentInfo->DependsOn > 0)
- {
- if(TalentEntry const *depTalentInfo = sTalentStore.LookupEntry(talentInfo->DependsOn))
- {
- bool hasEnoughRank = false;
- for (int i = talentInfo->DependsOnRank; i <= 4; i++)
- {
- if (depTalentInfo->RankID[i] != 0)
- if (pet->HasSpell(depTalentInfo->RankID[i]))
- hasEnoughRank = true;
- }
- if (!hasEnoughRank)
- return;
- }
- }
-
- // Find out how many points we have in this field
- uint32 spentPoints = 0;
-
- uint32 tTab = talentInfo->TalentTab;
- if (talentInfo->Row > 0)
- {
- unsigned int numRows = sTalentStore.GetNumRows();
- for (unsigned int i = 0; i < numRows; i++) // Loop through all talents.
- {
- // Someday, someone needs to revamp
- const TalentEntry *tmpTalent = sTalentStore.LookupEntry(i);
- if (tmpTalent) // the way talents are tracked
- {
- if (tmpTalent->TalentTab == tTab)
- {
- for (int j = 0; j <= 4; j++)
- {
- if (tmpTalent->RankID[j] != 0)
- {
- if (pet->HasSpell(tmpTalent->RankID[j]))
- {
- spentPoints += j + 1;
- }
- }
- }
- }
- }
- }
- }
-
- // not have required min points spent in talent tree
- if(spentPoints < (talentInfo->Row * 3))
- return;
-
- // spell not set in talent.dbc
- uint32 spellid = talentInfo->RankID[requested_rank];
- if( spellid == 0 )
- {
- sLog.outError("Talent.dbc have for talent: %u Rank: %u spell id = 0", talent_id, requested_rank);
- return;
- }
-
- // already known
- if(pet->HasSpell(spellid))
- return;
-
- // learn! (other talent ranks will unlearned at learning)
- pet->learnSpell(spellid);
- sLog.outDetail("TalentID: %u Rank: %u Spell: %u\n", talent_id, requested_rank, spellid);
-
- // update free talent points
- pet->SetFreeTalentPoints(CurTalentPoints - 1);
-}
diff --git a/src/game/PetitionsHandler.cpp b/src/game/PetitionsHandler.cpp
index ad3893ce110..8fc18b1c259 100644
--- a/src/game/PetitionsHandler.cpp
+++ b/src/game/PetitionsHandler.cpp
@@ -199,9 +199,9 @@ void WorldSession::HandlePetitionBuyOpcode(WorldPacket & recv_data)
if(!charter)
return;
- charter->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1, charter->GetGUIDLow());
- // ITEM_FIELD_ENCHANTMENT_1_1 is guild/arenateam id
- // ITEM_FIELD_ENCHANTMENT_1_1+1 is current signatures count (showed on item)
+ charter->SetUInt32Value(ITEM_FIELD_ENCHANTMENT, charter->GetGUIDLow());
+ // ITEM_FIELD_ENCHANTMENT is guild/arenateam id
+ // ITEM_FIELD_ENCHANTMENT+1 is current signatures count (showed on item)
charter->SetState(ITEM_CHANGED, _player);
_player->SendNewItem(charter, 1, true, false);
@@ -565,7 +565,7 @@ void WorldSession::HandlePetitionSignOpcode(WorldPacket & recv_data)
// update signs count on charter, required testing...
//Item *item = _player->GetItemByGuid(petitionguid));
//if(item)
- // item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1+1, signs);
+ // item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT+1, signs);
// update for owner if online
if(Player *owner = objmgr.GetPlayer(ownerguid))
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index 712ecbc59ec..4b187023be4 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -64,7 +64,6 @@
#include "Spell.h"
#include "SocialMgr.h"
#include "GameEvent.h"
-#include "AchievementMgr.h"
#include <cmath>
@@ -133,7 +132,7 @@ PlayerTaxi::PlayerTaxi()
memset(m_taximask, 0, sizeof(m_taximask));
}
-void PlayerTaxi::InitTaxiNodesForLevel(uint32 race, uint32 chrClass, uint32 level)
+void PlayerTaxi::InitTaxiNodesForLevel(uint32 race, uint32 level)
{
// capital and taxi hub masks
switch(race)
@@ -150,13 +149,6 @@ void PlayerTaxi::InitTaxiNodesForLevel(uint32 race, uint32 chrClass, uint32 leve
case RACE_BLOODELF: SetTaximaskNode(82); break; // Blood Elf
case RACE_DRAENEI: SetTaximaskNode(94); break; // Draenei
}
-
- switch(chrClass)
- {
- case CLASS_DEATH_KNIGHT: // TODO: figure out initial known nodes
- break;
- }
-
// new continent starting masks (It will be accessible only at new map)
switch(Player::TeamForRace(race))
{
@@ -259,7 +251,7 @@ const int32 Player::ReputationRank_Length[MAX_REPUTATION_RANK] = {36000, 3000, 3
UpdateMask Player::updateVisualBits;
-Player::Player (WorldSession *session): Unit(), m_achievementMgr(this)
+Player::Player (WorldSession *session): Unit()
{
m_transport = 0;
@@ -372,7 +364,6 @@ Player::Player (WorldSession *session): Unit(), m_achievementMgr(this)
m_canParry = false;
m_canBlock = false;
m_canDualWield = false;
- m_canTitanGrip = false;
m_ammoDPS = 0.0f;
m_temporaryUnsummonedPetNumber = 0;
@@ -417,9 +408,6 @@ Player::Player (WorldSession *session): Unit(), m_achievementMgr(this)
m_auraBaseMod[i][PCT_MOD] = 1.0f;
}
- for (int i = 0; i < MAX_COMBAT_RATING; i++)
- m_baseRatingValue[i] = 0;
-
// Honor System
m_lastHonorUpdateTime = time(NULL);
@@ -433,8 +421,6 @@ Player::Player (WorldSession *session): Unit(), m_achievementMgr(this)
//Default movement to run mode
m_unit_movement_flags = 0;
- m_mover = NULL;
-
m_miniPet = 0;
m_bgAfkReportedTimer = 0;
m_contestedPvPTimer = 0;
@@ -444,8 +430,6 @@ Player::Player (WorldSession *session): Unit(), m_achievementMgr(this)
m_isActive = true;
m_farsightVision = false;
-
- m_runes = NULL;
}
Player::~Player ()
@@ -493,7 +477,6 @@ Player::~Player ()
RemovePossess(false);
delete m_declinedname;
- delete m_runes;
}
void Player::CleanupsBeforeDelete()
@@ -539,9 +522,9 @@ bool Player::Create( uint32 guidlow, const std::string& name, uint8 race, uint8
uint8 powertype = cEntry->powerType;
- //uint32 unitfield;
+ uint32 unitfield;
- /*switch(powertype)
+ switch(powertype)
{
case POWER_ENERGY:
case POWER_MANA:
@@ -550,16 +533,13 @@ bool Player::Create( uint32 guidlow, const std::string& name, uint8 race, uint8
case POWER_RAGE:
unitfield = 0x00110000;
break;
- case POWER_RUNIC_POWER:
- unitfield = 0x0000EE00; //TODO: find correct unitfield here
- break;
default:
sLog.outError("Invalid default powertype %u for player (class %u)",powertype,class_);
return false;
- }*/
+ }
- SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, DEFAULT_WORLD_OBJECT_SIZE);
- SetFloatValue(UNIT_FIELD_COMBATREACH, 1.5f);
+ SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, DEFAULT_WORLD_OBJECT_SIZE );
+ SetFloatValue(UNIT_FIELD_COMBATREACH, DEFAULT_COMBAT_REACH );
switch(gender)
{
@@ -582,14 +562,12 @@ bool Player::Create( uint32 guidlow, const std::string& name, uint8 race, uint8
uint32 RaceClassGender = ( race ) | ( class_ << 8 ) | ( gender << 16 );
SetUInt32Value(UNIT_FIELD_BYTES_0, ( RaceClassGender | ( powertype << 24 ) ) );
- //SetUInt32Value(UNIT_FIELD_BYTES_1, unitfield);
- SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP );
- SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE );
- SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_REGENERATE_POWER);
+ SetUInt32Value(UNIT_FIELD_BYTES_1, unitfield);
+ SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_UNK3 | UNIT_BYTE2_FLAG_UNK5 );
+ SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE );
SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f); // fix cast time showed in spell tooltip on client
- SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 1.0f); // default for players in 3.0.3
- // -1 is default value
+ //-1 is default value
SetUInt32Value(PLAYER_FIELD_WATCHED_FACTION_INDEX, uint32(-1));
SetUInt32Value(PLAYER_BYTES, (skin | (face << 8) | (hairStyle << 16) | (hairColor << 24)));
@@ -601,35 +579,17 @@ bool Player::Create( uint32 guidlow, const std::string& name, uint8 race, uint8
SetUInt32Value( PLAYER_GUILD_TIMESTAMP, 0 );
SetUInt64Value( PLAYER__FIELD_KNOWN_TITLES, 0 ); // 0=disabled
- SetUInt64Value( PLAYER__FIELD_KNOWN_TITLES1, 0 ); // 0=disabled
SetUInt32Value( PLAYER_CHOSEN_TITLE, 0 );
SetUInt32Value( PLAYER_FIELD_KILLS, 0 );
SetUInt32Value( PLAYER_FIELD_LIFETIME_HONORBALE_KILLS, 0 );
SetUInt32Value( PLAYER_FIELD_TODAY_CONTRIBUTION, 0 );
SetUInt32Value( PLAYER_FIELD_YESTERDAY_CONTRIBUTION, 0 );
- for(uint32 i = 0; i < sGlyphSlotStore.GetNumRows(); ++i)
- {
- GlyphSlotEntry const * gs = sGlyphSlotStore.LookupEntry(i);
- if(gs && gs->Order)
- SetGlyphSlot(gs->Order - 1, gs->Id);
- }
-
// set starting level
- uint32 start_level = getClass() != CLASS_DEATH_KNIGHT
- ? sWorld.getConfig(CONFIG_START_PLAYER_LEVEL)
- : sWorld.getConfig(CONFIG_START_HEROIC_PLAYER_LEVEL);
-
if (GetSession()->GetSecurity() >= SEC_MODERATOR)
- {
- uint32 gm_level = sWorld.getConfig(CONFIG_START_GM_LEVEL);
- if(gm_level > start_level)
- start_level = gm_level;
- }
-
- SetUInt32Value(UNIT_FIELD_LEVEL, start_level);
-
- InitRunes();
+ SetUInt32Value (UNIT_FIELD_LEVEL, sWorld.getConfig(CONFIG_START_GM_LEVEL));
+ else
+ SetUInt32Value (UNIT_FIELD_LEVEL, sWorld.getConfig(CONFIG_START_PLAYER_LEVEL));
SetUInt32Value (PLAYER_FIELD_COINAGE, sWorld.getConfig(CONFIG_START_PLAYER_MONEY));
SetUInt32Value (PLAYER_FIELD_HONOR_CURRENCY, sWorld.getConfig(CONFIG_START_HONOR_POINTS));
@@ -693,7 +653,6 @@ bool Player::Create( uint32 guidlow, const std::string& name, uint8 race, uint8
// base stats and related field values
InitStatsForLevel();
InitTaxiNodesForLevel();
- InitGlyphsForLevel();
InitTalentForLevel();
InitPrimaryProffesions(); // to max set before any spell added
@@ -706,14 +665,6 @@ bool Player::Create( uint32 guidlow, const std::string& name, uint8 race, uint8
SetPower(POWER_MANA,GetMaxPower(POWER_MANA));
}
- if(getPowerType() == POWER_RUNIC_POWER)
- {
- SetPower(POWER_RUNE, 8);
- SetMaxPower(POWER_RUNE, 8);
- SetPower(POWER_RUNIC_POWER, 0);
- SetMaxPower(POWER_RUNIC_POWER, 1000);
- }
-
// original spells
learnDefaultSpells(true);
@@ -757,11 +708,6 @@ bool Player::Create( uint32 guidlow, const std::string& name, uint8 race, uint8
uint32 item_id = oEntry->ItemId[j];
-
- // Hack for not existed item id in dbc 3.0.3
- if(item_id==40582)
- continue;
-
ItemPrototype const* iProto = objmgr.GetItemPrototype(item_id);
if(!iProto)
{
@@ -989,29 +935,53 @@ void Player::HandleDrowning()
void Player::HandleLava()
{
+ bool ValidArea = false;
+
if ((m_isunderwater & 0x80) && isAlive())
{
- // Single trigger Set BreathTimer
+ //Single trigger Set BreathTimer
if (!(m_isunderwater & 0x80))
{
m_isunderwater|= 0x04;
m_breathTimer = 1000;
}
-
- // Reset BreathTimer and still in the lava
+ //Reset BreathTimer and still in the lava
if (!m_breathTimer)
{
uint64 guid = GetGUID();
uint32 damage = urand(600, 700); // TODO: Get more detailed information about lava damage
+ uint32 dmgZone = GetZoneId(); // TODO: Find correct "lava dealing zone" flag in Area Table
+
+ // Deal lava damage only in lava zones.
+ switch(dmgZone)
+ {
+ case 0x8D:
+ ValidArea = false;
+ break;
+ case 0x94:
+ ValidArea = false;
+ break;
+ case 0x2CE:
+ ValidArea = false;
+ break;
+ case 0x2CF:
+ ValidArea = false;
+ break;
+ default:
+ if (dmgZone / 5 & 0x408)
+ ValidArea = true;
+ }
- // if not gamemaster then deal damage
- if ( !isGameMaster() )
+ // if is valid area and is not gamemaster then deal damage
+ if ( ValidArea && !isGameMaster() )
EnvironmentalDamage(guid, DAMAGE_LAVA, damage);
m_breathTimer = 1000;
}
+
}
- else if (m_deathState == DEAD) // Disable breath timer and reset underwater flags
+ //Death timer disabled and WaterFlags reset
+ else if (m_deathState == DEAD)
{
m_breathTimer = 0;
m_isunderwater = 0;
@@ -1346,7 +1316,6 @@ void Player::Update( uint32 p_time )
Pet* pet = GetPet();
if(pet && !IsWithinDistInMap(pet, OWNER_MAX_DISTANCE) && !pet->isPossessed())
- //if(pet && !IsWithinDistInMap(pet, OWNER_MAX_DISTANCE) && (GetCharmGUID() && (pet->GetGUID() != GetCharmGUID())))
{
RemovePet(pet, PET_SAVE_NOT_IN_SLOT, true);
return;
@@ -1396,7 +1365,6 @@ void Player::setDeathState(DeathState s)
// passive spell
if(!ressSpellId)
ressSpellId = GetResurrectionSpellId();
- GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP, 1);
}
Unit::setDeathState(s);
@@ -1417,15 +1385,13 @@ void Player::setDeathState(DeathState s)
void Player::BuildEnumData( QueryResult * result, WorldPacket * p_data )
{
- Field *fields = result->Fetch();
-
- *p_data << uint64(GetGUID());
+ *p_data << GetGUID();
*p_data << m_name;
- *p_data << uint8(getRace());
+ *p_data << getRace();
uint8 pClass = getClass();
- *p_data << uint8(pClass);
- *p_data << uint8(getGender());
+ *p_data << pClass;
+ *p_data << getGender();
uint32 bytes = GetUInt32Value(PLAYER_BYTES);
*p_data << uint8(bytes);
@@ -1440,15 +1406,14 @@ void Player::BuildEnumData( QueryResult * result, WorldPacket * p_data )
// do not use GetMap! it will spawn a new instance since the bound instances are not loaded
uint32 zoneId = MapManager::Instance().GetZoneId(GetMapId(), GetPositionX(),GetPositionY());
sLog.outDebug("Player::BuildEnumData: m:%u, x:%f, y:%f, z:%f zone:%u", GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), zoneId);
- *p_data << uint32(zoneId);
- *p_data << uint32(GetMapId());
+ *p_data << zoneId;
+ *p_data << GetMapId();
*p_data << GetPositionX();
*p_data << GetPositionY();
*p_data << GetPositionZ();
- // guild id
- *p_data << (result ? fields[13].GetUInt32() : 0);
+ *p_data << (result ? result->Fetch()[13].GetUInt32() : 0);
uint32 char_flags = 0;
if(HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_HELM))
@@ -1459,13 +1424,14 @@ void Player::BuildEnumData( QueryResult * result, WorldPacket * p_data )
char_flags |= CHARACTER_FLAG_GHOST;
if(HasAtLoginFlag(AT_LOGIN_RENAME))
char_flags |= CHARACTER_FLAG_RENAME;
- if(sWorld.getConfig(CONFIG_DECLINED_NAMES_USED) && (fields[14].GetCppString() != ""))
+ // always send the flag if declined names aren't used
+ // to let the client select a default method of declining the name
+ if(!sWorld.getConfig(CONFIG_DECLINED_NAMES_USED) || (result && result->Fetch()[14].GetCppString() != ""))
char_flags |= CHARACTER_FLAG_DECLINED;
- *p_data << uint32(char_flags); // character flags
- // character customize (flags?)
- *p_data << uint32(HasAtLoginFlag(AT_LOGIN_CUSTOMIZE) ? 1 : 0);
- *p_data << uint8(1); // unknown
+ *p_data << (uint32)char_flags; // character flags
+
+ *p_data << (uint8)1; // unknown
// Pets info
{
@@ -1476,6 +1442,8 @@ void Player::BuildEnumData( QueryResult * result, WorldPacket * p_data )
// show pet at selection character in character list only for non-ghost character
if(result && isAlive() && (pClass == CLASS_WARLOCK || pClass == CLASS_HUNTER))
{
+ Field* fields = result->Fetch();
+
uint32 entry = fields[10].GetUInt32();
CreatureInfo const* cInfo = sCreatureStorage.LookupEntry<CreatureInfo>(entry);
if(cInfo)
@@ -1486,11 +1454,36 @@ void Player::BuildEnumData( QueryResult * result, WorldPacket * p_data )
}
}
- *p_data << uint32(petDisplayId);
- *p_data << uint32(petLevel);
- *p_data << uint32(petFamily);
+ *p_data << (uint32)petDisplayId;
+ *p_data << (uint32)petLevel;
+ *p_data << (uint32)petFamily;
}
+ /*ItemPrototype const *items[EQUIPMENT_SLOT_END];
+ for (int i = 0; i < EQUIPMENT_SLOT_END; i++)
+ items[i] = NULL;
+
+ QueryResult *result = CharacterDatabase.PQuery("SELECT slot,item_template FROM character_inventory WHERE guid = '%u' AND bag = 0",GetGUIDLow());
+ if (result)
+ {
+ do
+ {
+ Field *fields = result->Fetch();
+ uint8 slot = fields[0].GetUInt8() & 255;
+ uint32 item_id = fields[1].GetUInt32();
+ if( slot >= EQUIPMENT_SLOT_END )
+ continue;
+
+ items[slot] = objmgr.GetItemPrototype(item_id);
+ if(!items[slot])
+ {
+ sLog.outError( "Player::BuildEnumData: Player %s have unknown item (id: #%u) in inventory, skipped.", GetName(),item_id );
+ continue;
+ }
+ } while (result->NextRow());
+ delete result;
+ }*/
+
for (uint8 slot = 0; slot < EQUIPMENT_SLOT_END; slot++)
{
uint32 visualbase = PLAYER_VISIBLE_ITEM_1_0 + (slot * MAX_VISIBLE_ITEM_OFFSET);
@@ -1507,20 +1500,20 @@ void Player::BuildEnumData( QueryResult * result, WorldPacket * p_data )
if (proto != NULL)
{
- *p_data << uint32(proto->DisplayInfoID);
- *p_data << uint8(proto->InventoryType);
- *p_data << uint32(enchant ? enchant->aura_id : 0);
+ *p_data << (uint32)proto->DisplayInfoID;
+ *p_data << (uint8)proto->InventoryType;
+ *p_data << (uint32)(enchant?enchant->aura_id:0);
}
else
{
- *p_data << uint32(0);
- *p_data << uint8(0);
- *p_data << uint32(0); // enchant?
+ *p_data << (uint32)0;
+ *p_data << (uint8)0;
+ *p_data << (uint32)0; // enchant?
}
}
- *p_data << uint32(0); // first bag display id
- *p_data << uint8(0); // first bag inventory type
- *p_data << uint32(0); // enchant?
+ *p_data << (uint32)0; // first bag display id
+ *p_data << (uint8)0; // first bag inventory type
+ *p_data << (uint32)0; // enchant?
}
bool Player::ToggleAFK()
@@ -1592,7 +1585,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
if(GetTransport())
RepopAtGraveyard(); // teleport to near graveyard if on transport, looks blizz like :)
- SendTransferAborted(mapid, TRANSFER_ABORT_INSUF_EXPAN_LVL, mEntry->Expansion());
+ SendTransferAborted(mapid, TRANSFER_ABORT_INSUF_EXPAN_LVL1);
return false; // normal client can't teleport to this map...
}
@@ -1901,20 +1894,13 @@ void Player::RegenerateAll()
{
RegenerateHealth();
if (!isInCombat() && !HasAuraType(SPELL_AURA_INTERRUPT_REGEN))
- {
Regenerate(POWER_RAGE);
- if(getClass() == CLASS_DEATH_KNIGHT)
- Regenerate(POWER_RUNIC_POWER);
- }
}
Regenerate( POWER_ENERGY );
Regenerate( POWER_MANA );
- if(getClass() == CLASS_DEATH_KNIGHT)
- Regenerate( POWER_RUNE );
-
m_regenTimer = regenDelay;
}
@@ -1934,11 +1920,11 @@ void Player::Regenerate(Powers power)
if (recentCast)
{
// Trinity Updates Mana in intervals of 2s, which is correct
- addvalue = GetFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER) * ManaIncreaseRate * 2.00f;
+ addvalue = GetFloatValue(PLAYER_FIELD_MOD_MANA_REGEN_INTERRUPT) * ManaIncreaseRate * 2.00f;
}
else
{
- addvalue = GetFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER) * ManaIncreaseRate * 2.00f;
+ addvalue = GetFloatValue(PLAYER_FIELD_MOD_MANA_REGEN) * ManaIncreaseRate * 2.00f;
}
} break;
case POWER_RAGE: // Regenerate rage
@@ -1949,17 +1935,6 @@ void Player::Regenerate(Powers power)
case POWER_ENERGY: // Regenerate energy (rogue)
addvalue = 20;
break;
- case POWER_RUNIC_POWER:
- {
- float RunicPowerDecreaseRate = sWorld.getRate(RATE_POWER_RUNICPOWER_LOSS);
- addvalue = 30 * RunicPowerDecreaseRate; // 3 RunicPower by tick
- } break;
- case POWER_RUNE:
- {
- for(uint32 i = 0; i < MAX_RUNES; ++i)
- if(uint8 cd = GetRuneCooldown(i)) // if we have cooldown, reduce it...
- SetRuneCooldown(i, cd - 1); // ... by 2 sec (because update is every 2 sec)
- } break;
case POWER_FOCUS:
case POWER_HAPPINESS:
break;
@@ -1975,7 +1950,7 @@ void Player::Regenerate(Powers power)
addvalue *= ((*i)->GetModifierValue() + 100) / 100.0f;
}
- if (power != POWER_RAGE && power != POWER_RUNIC_POWER)
+ if (power != POWER_RAGE)
{
curValue += uint32(addvalue);
if (curValue > maxValue)
@@ -2259,8 +2234,6 @@ void Player::GiveLevel(uint32 level)
data << uint32(0);
data << uint32(0);
data << uint32(0);
- data << uint32(0);
- data << uint32(0);
// end for
for(int i = STAT_STRENGTH; i < MAX_STATS; ++i) // Stats loop (0-4)
data << uint32(int32(info.stats[i]) - GetCreateStat(Stats(i)));
@@ -2284,7 +2257,6 @@ void Player::GiveLevel(uint32 level)
InitTalentForLevel();
InitTaxiNodesForLevel();
- InitGlyphsForLevel();
UpdateAllStats();
@@ -2304,7 +2276,6 @@ void Player::GiveLevel(uint32 level)
Pet* pet = GetPet();
if(pet && pet->getPetType()==SUMMON_PET)
pet->GivePetLevel(level);
- GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL);
}
void Player::InitTalentForLevel()
@@ -2441,9 +2412,6 @@ void Player::InitStatsForLevel(bool reapplyMods)
SetFloatValue(UNIT_FIELD_POWER_COST_MODIFIER+i,0.0f);
SetFloatValue(UNIT_FIELD_POWER_COST_MULTIPLIER+i,0.0f);
}
- // Reset no reagent cost field
- for(int i = 0; i < 3; i++)
- SetUInt32Value(PLAYER_NO_REAGENT_COST_1 + i, 0);
// Init data for form but skip reapply item mods for form
InitDataForForm(reapplyMods);
@@ -2460,7 +2428,7 @@ void Player::InitStatsForLevel(bool reapplyMods)
RemoveFlag( UNIT_FIELD_FLAGS,
UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NOT_ATTACKABLE_1 |
UNIT_FLAG_PET_IN_COMBAT | UNIT_FLAG_SILENCED | UNIT_FLAG_PACIFIED |
- UNIT_FLAG_STUNNED | UNIT_FLAG_IN_COMBAT | UNIT_FLAG_DISARMED |
+ UNIT_FLAG_DISABLE_ROTATE | UNIT_FLAG_IN_COMBAT | UNIT_FLAG_DISARMED |
UNIT_FLAG_CONFUSED | UNIT_FLAG_FLEEING | UNIT_FLAG_NOT_SELECTABLE |
UNIT_FLAG_SKINNABLE | UNIT_FLAG_MOUNT | UNIT_FLAG_TAXI_FLIGHT );
SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE ); // must be set
@@ -2484,7 +2452,6 @@ void Player::InitStatsForLevel(bool reapplyMods)
SetPower(POWER_RAGE, GetMaxPower(POWER_RAGE));
SetPower(POWER_FOCUS, 0);
SetPower(POWER_HAPPINESS, 0);
- SetPower(POWER_RUNIC_POWER, 0);
}
void Player::SendInitialSpells()
@@ -2899,6 +2866,8 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool loading,
continue;
if(_spell_idx->second->learnOnGetSkill == ABILITY_LEARNED_ON_GET_RACE_OR_CLASS_SKILL ||
+ // poison special case, not have ABILITY_LEARNED_ON_GET_RACE_OR_CLASS_SKILL
+ pSkill->id==SKILL_POISONS && _spell_idx->second->max_value==0 ||
// lockpicking special case, not have ABILITY_LEARNED_ON_GET_RACE_OR_CLASS_SKILL
pSkill->id==SKILL_LOCKPICKING && _spell_idx->second->max_value==0 )
{
@@ -2935,12 +2904,6 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool loading,
}
}
- if(!loading)
- {
- GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL);
- GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS);
- }
-
// return true (for send learn packet) only if spell active (in case ranked spells) and not replace old spell
return active && !disabled && !superceded_old;
}
@@ -3090,6 +3053,8 @@ void Player::removeSpell(uint32 spell_id, bool disabled)
continue;
if(_spell_idx->second->learnOnGetSkill == ABILITY_LEARNED_ON_GET_RACE_OR_CLASS_SKILL ||
+ // poison special case, not have ABILITY_LEARNED_ON_GET_RACE_OR_CLASS_SKILL
+ pSkill->id==SKILL_POISONS && _spell_idx->second->max_value==0 ||
// lockpicking special case, not have ABILITY_LEARNED_ON_GET_RACE_OR_CLASS_SKILL
pSkill->id==SKILL_LOCKPICKING && _spell_idx->second->max_value==0 )
{
@@ -3389,46 +3354,50 @@ void Player::InitVisibleBits()
{
updateVisualBits.SetCount(PLAYER_END);
+ // TODO: really implement OWNER_ONLY and GROUP_ONLY. Flags can be found in UpdateFields.h
+
updateVisualBits.SetBit(OBJECT_FIELD_GUID);
updateVisualBits.SetBit(OBJECT_FIELD_TYPE);
- updateVisualBits.SetBit(OBJECT_FIELD_ENTRY);
updateVisualBits.SetBit(OBJECT_FIELD_SCALE_X);
- updateVisualBits.SetBit(UNIT_FIELD_CHARM + 0);
- updateVisualBits.SetBit(UNIT_FIELD_CHARM + 1);
- updateVisualBits.SetBit(UNIT_FIELD_SUMMON + 0);
- updateVisualBits.SetBit(UNIT_FIELD_SUMMON + 1);
- updateVisualBits.SetBit(UNIT_FIELD_CHARMEDBY + 0);
- updateVisualBits.SetBit(UNIT_FIELD_CHARMEDBY + 1);
- updateVisualBits.SetBit(UNIT_FIELD_TARGET + 0);
- updateVisualBits.SetBit(UNIT_FIELD_TARGET + 1);
- updateVisualBits.SetBit(UNIT_FIELD_CHANNEL_OBJECT + 0);
- updateVisualBits.SetBit(UNIT_FIELD_CHANNEL_OBJECT + 1);
- updateVisualBits.SetBit(UNIT_FIELD_BYTES_0);
+
+ updateVisualBits.SetBit(UNIT_FIELD_CHARM);
+ updateVisualBits.SetBit(UNIT_FIELD_CHARM+1);
+
+ updateVisualBits.SetBit(UNIT_FIELD_SUMMON);
+ updateVisualBits.SetBit(UNIT_FIELD_SUMMON+1);
+
+ updateVisualBits.SetBit(UNIT_FIELD_CHARMEDBY);
+ updateVisualBits.SetBit(UNIT_FIELD_CHARMEDBY+1);
+
+ updateVisualBits.SetBit(UNIT_FIELD_TARGET);
+ updateVisualBits.SetBit(UNIT_FIELD_TARGET+1);
+
+ updateVisualBits.SetBit(UNIT_FIELD_CHANNEL_OBJECT);
+ updateVisualBits.SetBit(UNIT_FIELD_CHANNEL_OBJECT+1);
+
updateVisualBits.SetBit(UNIT_FIELD_HEALTH);
updateVisualBits.SetBit(UNIT_FIELD_POWER1);
updateVisualBits.SetBit(UNIT_FIELD_POWER2);
updateVisualBits.SetBit(UNIT_FIELD_POWER3);
updateVisualBits.SetBit(UNIT_FIELD_POWER4);
updateVisualBits.SetBit(UNIT_FIELD_POWER5);
- updateVisualBits.SetBit(UNIT_FIELD_POWER6);
- updateVisualBits.SetBit(UNIT_FIELD_POWER7);
+
updateVisualBits.SetBit(UNIT_FIELD_MAXHEALTH);
updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER1);
updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER2);
updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER3);
updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER4);
updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER5);
- updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER6);
- updateVisualBits.SetBit(UNIT_FIELD_MAXPOWER7);
+
updateVisualBits.SetBit(UNIT_FIELD_LEVEL);
updateVisualBits.SetBit(UNIT_FIELD_FACTIONTEMPLATE);
- updateVisualBits.SetBit(UNIT_VIRTUAL_ITEM_SLOT_ID + 0);
- updateVisualBits.SetBit(UNIT_VIRTUAL_ITEM_SLOT_ID + 1);
- updateVisualBits.SetBit(UNIT_VIRTUAL_ITEM_SLOT_ID + 2);
+ updateVisualBits.SetBit(UNIT_FIELD_BYTES_0);
updateVisualBits.SetBit(UNIT_FIELD_FLAGS);
updateVisualBits.SetBit(UNIT_FIELD_FLAGS_2);
+ for(uint16 i = UNIT_FIELD_AURA; i < UNIT_FIELD_AURASTATE; ++i)
+ updateVisualBits.SetBit(i);
updateVisualBits.SetBit(UNIT_FIELD_AURASTATE);
- updateVisualBits.SetBit(UNIT_FIELD_BASEATTACKTIME + 0);
+ updateVisualBits.SetBit(UNIT_FIELD_BASEATTACKTIME);
updateVisualBits.SetBit(UNIT_FIELD_BASEATTACKTIME + 1);
updateVisualBits.SetBit(UNIT_FIELD_BOUNDINGRADIUS);
updateVisualBits.SetBit(UNIT_FIELD_COMBATREACH);
@@ -3441,12 +3410,10 @@ void Player::InitVisibleBits()
updateVisualBits.SetBit(UNIT_DYNAMIC_FLAGS);
updateVisualBits.SetBit(UNIT_CHANNEL_SPELL);
updateVisualBits.SetBit(UNIT_MOD_CAST_SPEED);
- updateVisualBits.SetBit(UNIT_FIELD_BASE_MANA);
updateVisualBits.SetBit(UNIT_FIELD_BYTES_2);
- updateVisualBits.SetBit(UNIT_FIELD_HOVERHEIGHT);
- updateVisualBits.SetBit(PLAYER_DUEL_ARBITER + 0);
- updateVisualBits.SetBit(PLAYER_DUEL_ARBITER + 1);
+ updateVisualBits.SetBit(PLAYER_DUEL_ARBITER);
+ updateVisualBits.SetBit(PLAYER_DUEL_ARBITER+1);
updateVisualBits.SetBit(PLAYER_FLAGS);
updateVisualBits.SetBit(PLAYER_GUILDID);
updateVisualBits.SetBit(PLAYER_GUILDRANK);
@@ -3457,29 +3424,29 @@ void Player::InitVisibleBits()
updateVisualBits.SetBit(PLAYER_GUILD_TIMESTAMP);
// PLAYER_QUEST_LOG_x also visible bit on official (but only on party/raid)...
- for(uint16 i = PLAYER_QUEST_LOG_1_1; i < PLAYER_QUEST_LOG_25_2; i += 4)
+ for(uint16 i = PLAYER_QUEST_LOG_1_1; i < PLAYER_QUEST_LOG_25_2; i+=4)
updateVisualBits.SetBit(i);
- // Players visible items are not inventory stuff
- for(uint16 i = 0; i < EQUIPMENT_SLOT_END; ++i)
+ //Players visible items are not inventory stuff
+ //431) = 884 (0x374) = main weapon
+ for(uint16 i = 0; i < EQUIPMENT_SLOT_END; i++)
{
- uint32 offset = i * MAX_VISIBLE_ITEM_OFFSET;
-
// item creator
- updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_CREATOR + 0 + offset);
- updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_CREATOR + 1 + offset);
+ updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_CREATOR + (i*MAX_VISIBLE_ITEM_OFFSET) + 0);
+ updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_CREATOR + (i*MAX_VISIBLE_ITEM_OFFSET) + 1);
+
+ uint16 visual_base = PLAYER_VISIBLE_ITEM_1_0 + (i*MAX_VISIBLE_ITEM_OFFSET);
// item entry
- updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_0 + 0 + offset);
+ updateVisualBits.SetBit(visual_base + 0);
- // item enchantments
- for(uint8 j = 0; j < MAX_ENCHANTMENT_SLOT; ++j)
- updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_0 + 1 + j + offset);
+ // item enchantment IDs
+ for(uint8 j = 0; j < MAX_INSPECTED_ENCHANTMENT_SLOT; ++j)
+ updateVisualBits.SetBit(visual_base + 1 + j);
// random properties
- updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_PROPERTIES + offset);
- updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_SEED + offset);
- updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_PAD + offset);
+ updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_PROPERTIES + 0 + (i*MAX_VISIBLE_ITEM_OFFSET));
+ updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_PROPERTIES + 1 + (i*MAX_VISIBLE_ITEM_OFFSET));
}
updateVisualBits.SetBit(PLAYER_CHOSEN_TITLE);
@@ -3497,6 +3464,7 @@ void Player::BuildCreateUpdateBlockForPlayer( UpdateData *data, Player *target )
if(target == this)
{
+
for(int i = INVENTORY_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
{
if(m_items[i] == NULL)
@@ -3504,7 +3472,7 @@ void Player::BuildCreateUpdateBlockForPlayer( UpdateData *data, Player *target )
m_items[i]->BuildCreateUpdateBlockForPlayer( data, target );
}
- for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
+ for(int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
{
if(m_items[i] == NULL)
continue;
@@ -3537,7 +3505,7 @@ void Player::DestroyForPlayer( Player *target ) const
m_items[i]->DestroyForPlayer( target );
}
- for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
+ for(int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
{
if(m_items[i] == NULL)
continue;
@@ -3767,8 +3735,6 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC
CharacterDatabase.PExecute("DELETE FROM mail_items WHERE receiver = '%u'",guid);
CharacterDatabase.PExecute("DELETE FROM character_pet WHERE owner = '%u'",guid);
CharacterDatabase.PExecute("DELETE FROM character_pet_declinedname WHERE owner = '%u'",guid);
- CharacterDatabase.PExecute("DELETE FROM character_achievement WHERE guid = '%u'",guid);
- CharacterDatabase.PExecute("DELETE FROM character_achievement_progress WHERE guid = '%u'",guid);
CharacterDatabase.CommitTransaction();
//loginDatabase.PExecute("UPDATE realmcharacters SET numchars = numchars - 1 WHERE acctid = %d AND realmid = %d", accountId, realmID);
@@ -3799,10 +3765,6 @@ void Player::SetMovement(PlayerMovementType pType)
*/
void Player::BuildPlayerRepop()
{
- WorldPacket data(SMSG_PRE_RESURRECT, GetPackGUID().size());
- data.append(GetPackGUID());
- GetSession()->SendPacket(&data);
-
if(getRace() == RACE_NIGHTELF)
CastSpell(this, 20584, true); // auras SPELL_AURA_INCREASE_SPEED(+speed in wisp form), SPELL_AURA_INCREASE_SWIM_SPEED(+swim speed in wisp form), SPELL_AURA_TRANSFORM (to wisp form)
CastSpell(this, 8326, true); // auras SPELL_AURA_GHOST, SPELL_AURA_INCREASE_SPEED(why?), SPELL_AURA_INCREASE_SWIM_SPEED(why?)
@@ -3923,7 +3885,7 @@ void Player::ResurrectPlayer(float restore_percent, bool applySickness)
if(Aura* Aur = GetAura(SPELL_ID_PASSIVE_RESURRECTION_SICKNESS,i))
{
Aur->SetAuraDuration(delta*1000);
- Aur->SendAuraUpdate(false);
+ Aur->UpdateAuraDuration();
}
}
}
@@ -4460,7 +4422,7 @@ uint32 Player::GetShieldBlockValue() const
{
BaseModGroup modGroup = SHIELD_BLOCK_VALUE;
- float value = GetTotalBaseModValue(modGroup) + GetStat(STAT_STRENGTH) * 0.5f - 10;
+ float value = GetTotalBaseModValue(modGroup) + GetStat(STAT_STRENGTH)/20 - 1;
value = (value < 0) ? 0 : value;
@@ -4649,18 +4611,7 @@ float Player::OCTRegenMPPerSpirit()
void Player::ApplyRatingMod(CombatRating cr, int32 value, bool apply)
{
- m_baseRatingValue[cr]+=(apply ? value : -value);
-
- int32 amount = uint32(m_baseRatingValue[cr]);
- // Apply bonus from SPELL_AURA_MOD_RATING_FROM_STAT
- // stat used stored in miscValueB for this aura
- AuraList const& modRatingFromStat = GetAurasByType(SPELL_AURA_MOD_RATING_FROM_STAT);
- for(AuraList::const_iterator i = modRatingFromStat.begin();i != modRatingFromStat.end(); ++i)
- if ((*i)->GetMiscValue() & (1<<cr))
- amount += GetStat(Stats((*i)->GetMiscBValue())) * (*i)->GetModifier()->m_amount / 100.0f;
- if (amount < 0)
- amount = 0;
- SetUInt32Value(PLAYER_FIELD_COMBAT_RATING_1 + cr, uint32(amount));
+ ApplyModUInt32Value(PLAYER_FIELD_COMBAT_RATING_1 + cr, value, apply);
float RatingCoeffecient = GetRatingCoefficient(cr);
float RatingChange = 0.0f;
@@ -4683,13 +4634,16 @@ void Player::ApplyRatingMod(CombatRating cr, int32 value, bool apply)
UpdateBlockPercentage();
break;
case CR_HIT_MELEE:
- UpdateMeleeHitChances();
+ RatingChange = value / RatingCoeffecient;
+ m_modMeleeHitChance += apply ? RatingChange : -RatingChange;
break;
case CR_HIT_RANGED:
- UpdateRangedHitChances();
+ RatingChange = value / RatingCoeffecient;
+ m_modRangedHitChance += apply ? RatingChange : -RatingChange;
break;
case CR_HIT_SPELL:
- UpdateSpellHitChances();
+ RatingChange = value / RatingCoeffecient;
+ m_modSpellHitChance += apply ? RatingChange : -RatingChange;
break;
case CR_CRIT_MELEE:
if(affectStats)
@@ -4787,7 +4741,6 @@ bool Player::UpdateSkill(uint32 skill_id, uint32 step)
new_value = max;
SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(i),MAKE_SKILL_VALUE(new_value,max));
- GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL);
return true;
}
@@ -4850,7 +4803,6 @@ bool Player::UpdateGatherSkill(uint32 SkillId, uint32 SkillValue, uint32 RedLeve
case SKILL_HERBALISM:
case SKILL_LOCKPICKING:
case SKILL_JEWELCRAFTING:
- case SKILL_INSCRIPTION:
return UpdateSkillPro(SkillId, SkillGainChance(SkillValue, RedLevel+100, RedLevel+50, RedLevel+25)*Multiplicator,gathering_skill_gain);
case SKILL_SKINNING:
if( sWorld.getConfig(CONFIG_SKILL_CHANCE_SKINNING_STEPS)==0)
@@ -4913,7 +4865,6 @@ bool Player::UpdateSkillPro(uint16 SkillId, int32 Chance, uint32 step)
new_value = MaxValue;
SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(i),MAKE_SKILL_VALUE(new_value,MaxValue));
- GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL);
sLog.outDebug("Player::UpdateSkillPro Chance=%3.1f%% taken", Chance/10.0);
return true;
}
@@ -5101,10 +5052,7 @@ void Player::SetSkill(uint32 id, uint16 currVal, uint16 maxVal)
if(i<PLAYER_MAX_SKILLS) //has skill
{
if(currVal)
- {
SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(i),MAKE_SKILL_VALUE(currVal,maxVal));
- GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL);
- }
else //remove
{
// clear skill fields
@@ -5152,7 +5100,6 @@ void Player::SetSkill(uint32 id, uint16 currVal, uint16 maxVal)
else
SetUInt32Value(PLAYER_SKILL_INDEX(i), MAKE_PAIR32(id,0));
SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(i),MAKE_SKILL_VALUE(currVal,maxVal));
- GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL);
// apply skill bonuses
SetUInt32Value(PLAYER_SKILL_BONUS_INDEX(i),0);
@@ -5467,8 +5414,6 @@ void Player::CheckExploreSystem()
{
SetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset, (uint32)(currFields | val));
- GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA);
-
AreaTableEntry const *p = GetAreaEntryByAreaFlagAndMap(areaFlag,GetMapId());
if(!p)
{
@@ -5565,7 +5510,6 @@ void Player::SendFactionState(FactionState const* faction) const
{
WorldPacket data(SMSG_SET_FACTION_STANDING, (16)); // last check 2.4.0
data << (float) 0; // unk 2.4.0
- data << (uint8) 0; // wotlk 8634
data << (uint32) 1; // count
// for
data << (uint32) faction->ReputationListID;
@@ -5897,8 +5841,7 @@ bool Player::ModifyOneFactionReputation(FactionEntry const* factionEntry, int32
}
}
}
- GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION);
- GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION);
+
SendFactionState(&(itr->second));
return true;
@@ -5964,8 +5907,6 @@ bool Player::SetOneFactionReputation(FactionEntry const* factionEntry, int32 sta
SetFactionAtWar(&itr->second,true);
SendFactionState(&(itr->second));
- GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION);
- GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION);
return true;
}
return false;
@@ -6676,43 +6617,19 @@ void Player::_ApplyItemMods(Item *item, uint8 slot,bool apply)
sLog.outDebug("_ApplyItemMods complete.");
}
-void Player::_ApplyItemBonuses(ItemPrototype const *proto, uint8 slot, bool apply)
+void Player::_ApplyItemBonuses(ItemPrototype const *proto,uint8 slot,bool apply)
{
if(slot >= INVENTORY_SLOT_BAG_END || !proto)
return;
for (int i = 0; i < 10; i++)
{
- uint32 statType = 0;
- int32 val = 0;
+ float val = float (proto->ItemStat[i].ItemStatValue);
- if(proto->ScalingStatDistribution)
- {
- if(ScalingStatDistributionEntry const *ssd = sScalingStatDistributionStore.LookupEntry(proto->ScalingStatDistribution))
- {
- statType = ssd->StatMod[i];
-
- if(uint32 modifier = ssd->Modifier[i])
- {
- uint32 level = ((getLevel() > ssd->MaxLevel) ? ssd->MaxLevel : getLevel());
- if(ScalingStatValuesEntry const *ssv = sScalingStatValuesStore.LookupEntry(level))
- {
- int multiplier = ssv->Multiplier[proto->GetScalingStatValuesColumn()];
- val = (multiplier * modifier) / 10000;
- }
- }
- }
- }
- else
- {
- statType = proto->ItemStat[i].ItemStatType;
- val = float(proto->ItemStat[i].ItemStatValue);
- }
-
- if(val == 0)
+ if(val==0)
continue;
- switch (statType)
+ switch (proto->ItemStat[i].ItemStatType)
{
case ITEM_MOD_MANA:
HandleStatModifier(UNIT_MOD_MANA, BASE_VALUE, float(val), apply);
@@ -6830,9 +6747,6 @@ void Player::_ApplyItemBonuses(ItemPrototype const *proto, uint8 slot, bool appl
case ITEM_MOD_EXPERTISE_RATING:
ApplyRatingMod(CR_EXPERTISE, int32(val), apply);
break;
- case ITEM_MOD_ARMOR_PENETRATION_RATING:
- ApplyRatingMod(CR_ARMOR_PENETRATION, int32(val), apply);
- break;
}
}
@@ -7448,17 +7362,6 @@ void Player::SendLoot(uint64 guid, LootType loot_type)
loot->FillLoot(item->GetEntry(), LootTemplates_Prospecting, this);
}
}
- else if(loot_type == LOOT_MILLING)
- {
- loot = &item->loot;
-
- if(!item->m_lootGenerated)
- {
- item->m_lootGenerated = true;
- loot->clear();
- loot->FillLoot(item->GetEntry(), LootTemplates_Milling, this);
- }
- }
else
{
loot = &item->loot;
@@ -7654,8 +7557,8 @@ void Player::SendLoot(uint64 guid, LootType loot_type)
conditional_list = itr->second;
}
- // LOOT_PICKPOCKETING, LOOT_PROSPECTING, LOOT_DISENCHANTING, LOOT_INSIGNIA and LOOT_MILLING unsupported by client, sending LOOT_SKINNING instead
- if(loot_type == LOOT_PICKPOCKETING || loot_type == LOOT_DISENCHANTING || loot_type == LOOT_PROSPECTING || loot_type == LOOT_INSIGNIA || loot_type == LOOT_MILLING)
+ // LOOT_PICKPOCKETING, LOOT_PROSPECTING, LOOT_DISENCHANTING and LOOT_INSIGNIA unsupported by client, sending LOOT_SKINNING instead
+ if(loot_type == LOOT_PICKPOCKETING || loot_type == LOOT_DISENCHANTING || loot_type == LOOT_PROSPECTING || loot_type == LOOT_INSIGNIA)
loot_type = LOOT_SKINNING;
if(loot_type == LOOT_FISHINGHOLE)
@@ -8379,8 +8282,7 @@ uint8 Player::FindEquipSlot( ItemPrototype const* proto, uint32 slot, bool swap
// (this will be replace mainhand weapon at auto equip instead unwonted "you don't known dual wielding" ...
if(CanDualWield())
slots[1] = EQUIPMENT_SLOT_OFFHAND;
- break;
- };
+ };break;
case INVTYPE_SHIELD:
slots[0] = EQUIPMENT_SLOT_OFFHAND;
break;
@@ -8389,8 +8291,6 @@ uint8 Player::FindEquipSlot( ItemPrototype const* proto, uint32 slot, bool swap
break;
case INVTYPE_2HWEAPON:
slots[0] = EQUIPMENT_SLOT_MAINHAND;
- if (CanDualWield() && CanTitanGrip())
- slots[1] = EQUIPMENT_SLOT_OFFHAND;
break;
case INVTYPE_TABARD:
slots[0] = EQUIPMENT_SLOT_TABARD;
@@ -8436,10 +8336,6 @@ uint8 Player::FindEquipSlot( ItemPrototype const* proto, uint32 slot, bool swap
if (pClass == CLASS_WARLOCK)
slots[0] = EQUIPMENT_SLOT_RANGED;
break;
- case ITEM_SUBCLASS_ARMOR_SIGIL:
- if (pClass == CLASS_DEATH_KNIGHT)
- slots[0] = EQUIPMENT_SLOT_RANGED;
- break;
}
break;
}
@@ -8465,8 +8361,14 @@ uint8 Player::FindEquipSlot( ItemPrototype const* proto, uint32 slot, bool swap
{
if ( slots[i] != NULL_SLOT && !GetItemByPos( INVENTORY_SLOT_BAG_0, slots[i] ) )
{
- // in case 2hand equipped weapon (without titan grip) offhand slot empty but not free
- if(slots[i]!=EQUIPMENT_SLOT_OFFHAND || !IsTwoHandUsed())
+ // in case 2hand equipped weapon offhand slot empty but not free
+ if(slots[i]==EQUIPMENT_SLOT_OFFHAND)
+ {
+ Item* mainItem = GetItemByPos( INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND );
+ if(!mainItem || mainItem->GetProto()->InventoryType != INVTYPE_2HWEAPON)
+ return slots[i];
+ }
+ else
return slots[i];
}
}
@@ -8516,7 +8418,7 @@ uint8 Player::CanUnequipItems( uint32 item, uint32 count ) const
return EQUIP_ERR_OK;
}
}
- for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
+ for(int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
{
pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && pItem->GetEntry() == item )
@@ -8558,7 +8460,7 @@ uint32 Player::GetItemCount( uint32 item, bool inBankAlso, Item* skipItem ) cons
if( pItem && pItem != skipItem && pItem->GetEntry() == item )
count += pItem->GetCount();
}
- for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
+ for(int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
{
Item *pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && pItem != skipItem && pItem->GetEntry() == item )
@@ -8618,7 +8520,7 @@ Item* Player::GetItemByGuid( uint64 guid ) const
if( pItem && pItem->GetGUID() == guid )
return pItem;
}
- for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
+ for(int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
{
Item *pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && pItem->GetGUID() == guid )
@@ -8664,7 +8566,7 @@ Item* Player::GetItemByPos( uint16 pos ) const
Item* Player::GetItemByPos( uint8 bag, uint8 slot ) const
{
- if( bag == INVENTORY_SLOT_BAG_0 && ( slot < BANK_SLOT_BAG_END || slot >= KEYRING_SLOT_START && slot < QUESTBAG_SLOT_END ) )
+ if( bag == INVENTORY_SLOT_BAG_0 && ( slot < BANK_SLOT_BAG_END || slot >= KEYRING_SLOT_START && slot < KEYRING_SLOT_END ) )
return m_items[slot];
else if(bag >= INVENTORY_SLOT_BAG_START && bag < INVENTORY_SLOT_BAG_END
|| bag >= BANK_SLOT_BAG_START && bag < BANK_SLOT_BAG_END )
@@ -8742,7 +8644,7 @@ bool Player::IsInventoryPos( uint8 bag, uint8 slot )
return true;
if( bag >= INVENTORY_SLOT_BAG_START && bag < INVENTORY_SLOT_BAG_END )
return true;
- if( bag == INVENTORY_SLOT_BAG_0 && ( slot >= KEYRING_SLOT_START && slot < QUESTBAG_SLOT_END ) )
+ if( bag == INVENTORY_SLOT_BAG_0 && ( slot >= KEYRING_SLOT_START && slot < KEYRING_SLOT_END ) )
return true;
return false;
}
@@ -8863,7 +8765,7 @@ bool Player::HasItemCount( uint32 item, uint32 count, bool inBankAlso ) const
return true;
}
}
- for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
+ for(int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
{
Item *pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && pItem->GetEntry() == item )
@@ -8985,7 +8887,7 @@ bool Player::HasItemTotemCategory( uint32 TotemCategory ) const
if( pItem && IsTotemCategoryCompatiableWith(pItem->GetProto()->TotemCategory,TotemCategory ))
return true;
}
- for(uint8 i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; ++i)
+ for(uint8 i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; ++i)
{
pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && IsTotemCategoryCompatiableWith(pItem->GetProto()->TotemCategory,TotemCategory ))
@@ -9025,18 +8927,6 @@ uint8 Player::_CanStoreItem_InSpecificSlot( uint8 bag, uint8 slot, ItemPosCountV
if(slot >= KEYRING_SLOT_START && slot < KEYRING_SLOT_START+GetMaxKeyringSize() && !(pProto->BagFamily & BAG_FAMILY_MASK_KEYS))
return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG;
- // vanitypet case
- if(slot >= VANITYPET_SLOT_START && slot < VANITYPET_SLOT_END && !(pProto->BagFamily & BAG_FAMILY_MASK_VANITY_PETS))
- return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG;
-
- // currencytoken case
- if(slot >= CURRENCYTOKEN_SLOT_START && slot < CURRENCYTOKEN_SLOT_END && !(pProto->BagFamily & BAG_FAMILY_MASK_CURRENCY_TOKENS))
- return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG;
-
- // guestbag case
- if(slot >= QUESTBAG_SLOT_START && slot < QUESTBAG_SLOT_END && !(pProto->BagFamily & BAG_FAMILY_MASK_QUEST_ITEMS))
- return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG;
-
// prevent cheating
if(slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END || slot >= PLAYER_SLOT_END)
return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG;
@@ -9281,7 +9171,7 @@ uint8 Player::_CanStoreItem( uint8 bag, uint8 slot, ItemPosCountVec &dest, uint3
{
if( bag == INVENTORY_SLOT_BAG_0 ) // inventory
{
- res = _CanStoreItem_InInventorySlots(KEYRING_SLOT_START,QUESTBAG_SLOT_END,dest,pProto,count,true,pItem,bag,slot);
+ res = _CanStoreItem_InInventorySlots(KEYRING_SLOT_START,KEYRING_SLOT_END,dest,pProto,count,true,pItem,bag,slot);
if(res!=EQUIP_ERR_OK)
{
if(no_space_count)
@@ -9368,66 +9258,6 @@ uint8 Player::_CanStoreItem( uint8 bag, uint8 slot, ItemPosCountVec &dest, uint3
return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS;
}
}
- else if(pProto->BagFamily & BAG_FAMILY_MASK_VANITY_PETS)
- {
- res = _CanStoreItem_InInventorySlots(VANITYPET_SLOT_START,VANITYPET_SLOT_END,dest,pProto,count,false,pItem,bag,slot);
- if(res!=EQUIP_ERR_OK)
- {
- if(no_space_count)
- *no_space_count = count + no_similar_count;
- return res;
- }
-
- if(count==0)
- {
- if(no_similar_count==0)
- return EQUIP_ERR_OK;
-
- if(no_space_count)
- *no_space_count = count + no_similar_count;
- return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS;
- }
- }
- else if(pProto->BagFamily & BAG_FAMILY_MASK_CURRENCY_TOKENS)
- {
- res = _CanStoreItem_InInventorySlots(CURRENCYTOKEN_SLOT_START,CURRENCYTOKEN_SLOT_END,dest,pProto,count,false,pItem,bag,slot);
- if(res!=EQUIP_ERR_OK)
- {
- if(no_space_count)
- *no_space_count = count + no_similar_count;
- return res;
- }
-
- if(count==0)
- {
- if(no_similar_count==0)
- return EQUIP_ERR_OK;
-
- if(no_space_count)
- *no_space_count = count + no_similar_count;
- return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS;
- }
- }
- else if(pProto->BagFamily & BAG_FAMILY_MASK_QUEST_ITEMS)
- {
- res = _CanStoreItem_InInventorySlots(QUESTBAG_SLOT_START,QUESTBAG_SLOT_END,dest,pProto,count,false,pItem,bag,slot);
- if(res!=EQUIP_ERR_OK)
- {
- if(no_space_count)
- *no_space_count = count + no_similar_count;
- return res;
- }
-
- if(count==0)
- {
- if(no_similar_count==0)
- return EQUIP_ERR_OK;
-
- if(no_space_count)
- *no_space_count = count + no_similar_count;
- return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS;
- }
- }
res = _CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START,INVENTORY_SLOT_ITEM_END,dest,pProto,count,false,pItem,bag,slot);
if(res!=EQUIP_ERR_OK)
@@ -9477,7 +9307,7 @@ uint8 Player::_CanStoreItem( uint8 bag, uint8 slot, ItemPosCountVec &dest, uint3
// search stack for merge to
if( pProto->Stackable > 1 )
{
- res = _CanStoreItem_InInventorySlots(KEYRING_SLOT_START,QUESTBAG_SLOT_END,dest,pProto,count,true,pItem,bag,slot);
+ res = _CanStoreItem_InInventorySlots(KEYRING_SLOT_START,KEYRING_SLOT_END,dest,pProto,count,true,pItem,bag,slot);
if(res!=EQUIP_ERR_OK)
{
if(no_space_count)
@@ -9575,66 +9405,6 @@ uint8 Player::_CanStoreItem( uint8 bag, uint8 slot, ItemPosCountVec &dest, uint3
return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS;
}
}
- else if(pProto->BagFamily & BAG_FAMILY_MASK_VANITY_PETS)
- {
- res = _CanStoreItem_InInventorySlots(VANITYPET_SLOT_START,VANITYPET_SLOT_END,dest,pProto,count,false,pItem,bag,slot);
- if(res!=EQUIP_ERR_OK)
- {
- if(no_space_count)
- *no_space_count = count + no_similar_count;
- return res;
- }
-
- if(count==0)
- {
- if(no_similar_count==0)
- return EQUIP_ERR_OK;
-
- if(no_space_count)
- *no_space_count = count + no_similar_count;
- return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS;
- }
- }
- else if(pProto->BagFamily & BAG_FAMILY_MASK_CURRENCY_TOKENS)
- {
- res = _CanStoreItem_InInventorySlots(CURRENCYTOKEN_SLOT_START,CURRENCYTOKEN_SLOT_END,dest,pProto,count,false,pItem,bag,slot);
- if(res!=EQUIP_ERR_OK)
- {
- if(no_space_count)
- *no_space_count = count + no_similar_count;
- return res;
- }
-
- if(count==0)
- {
- if(no_similar_count==0)
- return EQUIP_ERR_OK;
-
- if(no_space_count)
- *no_space_count = count + no_similar_count;
- return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS;
- }
- }
- else if(pProto->BagFamily & BAG_FAMILY_MASK_QUEST_ITEMS)
- {
- res = _CanStoreItem_InInventorySlots(QUESTBAG_SLOT_START,QUESTBAG_SLOT_END,dest,pProto,count,false,pItem,bag,slot);
- if(res!=EQUIP_ERR_OK)
- {
- if(no_space_count)
- *no_space_count = count + no_similar_count;
- return res;
- }
-
- if(count==0)
- {
- if(no_similar_count==0)
- return EQUIP_ERR_OK;
-
- if(no_space_count)
- *no_space_count = count + no_similar_count;
- return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS;
- }
- }
for(int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
{
@@ -9705,16 +9475,10 @@ uint8 Player::CanStoreItems( Item **pItems,int count) const
int inv_slot_items[INVENTORY_SLOT_ITEM_END-INVENTORY_SLOT_ITEM_START];
int inv_bags[INVENTORY_SLOT_BAG_END-INVENTORY_SLOT_BAG_START][MAX_BAG_SIZE];
int inv_keys[KEYRING_SLOT_END-KEYRING_SLOT_START];
- int inv_pets[VANITYPET_SLOT_END-VANITYPET_SLOT_START];
- int inv_tokens[CURRENCYTOKEN_SLOT_END-CURRENCYTOKEN_SLOT_START];
- int inv_quests[QUESTBAG_SLOT_END-QUESTBAG_SLOT_START];
memset(inv_slot_items,0,sizeof(int)*(INVENTORY_SLOT_ITEM_END-INVENTORY_SLOT_ITEM_START));
memset(inv_bags,0,sizeof(int)*(INVENTORY_SLOT_BAG_END-INVENTORY_SLOT_BAG_START)*MAX_BAG_SIZE);
memset(inv_keys,0,sizeof(int)*(KEYRING_SLOT_END-KEYRING_SLOT_START));
- memset(inv_pets,0,sizeof(int)*(VANITYPET_SLOT_END-VANITYPET_SLOT_START));
- memset(inv_tokens,0,sizeof(int)*(CURRENCYTOKEN_SLOT_END-CURRENCYTOKEN_SLOT_START));
- memset(inv_quests,0,sizeof(int)*(QUESTBAG_SLOT_END-QUESTBAG_SLOT_START));
for(int i = INVENTORY_SLOT_ITEM_START; i < INVENTORY_SLOT_ITEM_END; i++)
{
@@ -9736,36 +9500,6 @@ uint8 Player::CanStoreItems( Item **pItems,int count) const
}
}
- for(int i = VANITYPET_SLOT_START; i < VANITYPET_SLOT_END; i++)
- {
- pItem2 = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
-
- if (pItem2 && !pItem2->IsInTrade())
- {
- inv_pets[i-VANITYPET_SLOT_START] = pItem2->GetCount();
- }
- }
-
- for(int i = CURRENCYTOKEN_SLOT_START; i < CURRENCYTOKEN_SLOT_END; i++)
- {
- pItem2 = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
-
- if (pItem2 && !pItem2->IsInTrade())
- {
- inv_tokens[i-CURRENCYTOKEN_SLOT_START] = pItem2->GetCount();
- }
- }
-
- for(int i = QUESTBAG_SLOT_START; i < QUESTBAG_SLOT_END; i++)
- {
- pItem2 = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
-
- if (pItem2 && !pItem2->IsInTrade())
- {
- inv_quests[i-QUESTBAG_SLOT_START] = pItem2->GetCount();
- }
- }
-
for(int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
{
if(Bag* pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, i ))
@@ -9825,42 +9559,6 @@ uint8 Player::CanStoreItems( Item **pItems,int count) const
}
if (b_found) continue;
- for(int t = VANITYPET_SLOT_START; t < VANITYPET_SLOT_END; t++)
- {
- pItem2 = GetItemByPos( INVENTORY_SLOT_BAG_0, t );
- if( pItem2 && pItem2->GetEntry() == pItem->GetEntry() && inv_pets[t-VANITYPET_SLOT_START] + pItem->GetCount() <= pProto->Stackable )
- {
- inv_pets[t-VANITYPET_SLOT_START] += pItem->GetCount();
- b_found = true;
- break;
- }
- }
- if (b_found) continue;
-
- for(int t = CURRENCYTOKEN_SLOT_START; t < CURRENCYTOKEN_SLOT_END; t++)
- {
- pItem2 = GetItemByPos( INVENTORY_SLOT_BAG_0, t );
- if( pItem2 && pItem2->GetEntry() == pItem->GetEntry() && inv_tokens[t-CURRENCYTOKEN_SLOT_START] + pItem->GetCount() <= pProto->Stackable )
- {
- inv_tokens[t-CURRENCYTOKEN_SLOT_START] += pItem->GetCount();
- b_found = true;
- break;
- }
- }
- if (b_found) continue;
-
- for(int t = QUESTBAG_SLOT_START; t < QUESTBAG_SLOT_END; t++)
- {
- pItem2 = GetItemByPos( INVENTORY_SLOT_BAG_0, t );
- if( pItem2 && pItem2->GetEntry() == pItem->GetEntry() && inv_quests[t-QUESTBAG_SLOT_START] + pItem->GetCount() <= pProto->Stackable )
- {
- inv_quests[t-QUESTBAG_SLOT_START] += pItem->GetCount();
- b_found = true;
- break;
- }
- }
- if (b_found) continue;
-
for(int t = INVENTORY_SLOT_ITEM_START; t < INVENTORY_SLOT_ITEM_END; t++)
{
pItem2 = GetItemByPos( INVENTORY_SLOT_BAG_0, t );
@@ -9913,51 +9611,6 @@ uint8 Player::CanStoreItems( Item **pItems,int count) const
if (b_found) continue;
- if(pProto->BagFamily & BAG_FAMILY_MASK_VANITY_PETS)
- {
- for(uint32 t = VANITYPET_SLOT_START; t < VANITYPET_SLOT_END; ++t)
- {
- if( inv_pets[t-VANITYPET_SLOT_START] == 0 )
- {
- inv_pets[t-VANITYPET_SLOT_START] = 1;
- b_found = true;
- break;
- }
- }
- }
-
- if (b_found) continue;
-
- if(pProto->BagFamily & BAG_FAMILY_MASK_CURRENCY_TOKENS)
- {
- for(uint32 t = CURRENCYTOKEN_SLOT_START; t < CURRENCYTOKEN_SLOT_END; ++t)
- {
- if( inv_tokens[t-CURRENCYTOKEN_SLOT_START] == 0 )
- {
- inv_tokens[t-CURRENCYTOKEN_SLOT_START] = 1;
- b_found = true;
- break;
- }
- }
- }
-
- if (b_found) continue;
-
- if(pProto->BagFamily & BAG_FAMILY_MASK_QUEST_ITEMS)
- {
- for(uint32 t = QUESTBAG_SLOT_START; t < QUESTBAG_SLOT_END; ++t)
- {
- if( inv_quests[t-QUESTBAG_SLOT_START] == 0 )
- {
- inv_quests[t-QUESTBAG_SLOT_START] = 1;
- b_found = true;
- break;
- }
- }
- }
-
- if (b_found) continue;
-
for(int t = INVENTORY_SLOT_BAG_START; !b_found && t < INVENTORY_SLOT_BAG_END; t++)
{
pBag = (Bag*)GetItemByPos( INVENTORY_SLOT_BAG_0, t );
@@ -10143,42 +9796,33 @@ uint8 Player::CanEquipItem( uint8 slot, uint16 &dest, Item *pItem, bool swap, bo
if(eslot == EQUIPMENT_SLOT_OFFHAND)
{
- if (type == INVTYPE_WEAPON || type == INVTYPE_WEAPONOFFHAND)
+ if( type == INVTYPE_WEAPON || type == INVTYPE_WEAPONOFFHAND )
{
if(!CanDualWield())
return EQUIP_ERR_CANT_DUAL_WIELD;
}
- else if (type == INVTYPE_2HWEAPON)
+
+ Item *mainItem = GetItemByPos( INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND );
+ if(mainItem)
{
- if(!CanDualWield() || !CanTitanGrip())
- return EQUIP_ERR_CANT_DUAL_WIELD;
+ if(mainItem->GetProto()->InventoryType == INVTYPE_2HWEAPON)
+ return EQUIP_ERR_CANT_EQUIP_WITH_TWOHANDED;
}
-
- if(IsTwoHandUsed())
- return EQUIP_ERR_CANT_EQUIP_WITH_TWOHANDED;
}
// equip two-hand weapon case (with possible unequip 2 items)
if( type == INVTYPE_2HWEAPON )
{
- if (eslot == EQUIPMENT_SLOT_OFFHAND)
- {
- if (!CanTitanGrip())
- return EQUIP_ERR_ITEM_CANT_BE_EQUIPPED;
- }
- else if (eslot != EQUIPMENT_SLOT_MAINHAND)
+ if(eslot != EQUIPMENT_SLOT_MAINHAND)
return EQUIP_ERR_ITEM_CANT_BE_EQUIPPED;
- if (!CanTitanGrip())
- {
- // offhand item must can be stored in inventory for offhand item and it also must be unequipped
- Item *offItem = GetItemByPos( INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND );
- ItemPosCountVec off_dest;
- if( offItem && (!not_loading ||
- CanUnequipItem(uint16(INVENTORY_SLOT_BAG_0) << 8 | EQUIPMENT_SLOT_OFFHAND,false) != EQUIP_ERR_OK ||
- CanStoreItem( NULL_BAG, NULL_SLOT, off_dest, offItem, false ) != EQUIP_ERR_OK ) )
- return swap ? EQUIP_ERR_ITEMS_CANT_BE_SWAPPED : EQUIP_ERR_INVENTORY_FULL;
- }
+ // offhand item must can be stored in inventory for offhand item and it also must be unequipped
+ Item *offItem = GetItemByPos( INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND );
+ ItemPosCountVec off_dest;
+ if( offItem && (!not_loading ||
+ CanUnequipItem(uint16(INVENTORY_SLOT_BAG_0) << 8 | EQUIPMENT_SLOT_OFFHAND,false) != EQUIP_ERR_OK ||
+ CanStoreItem( NULL_BAG, NULL_SLOT, off_dest, offItem, false ) != EQUIP_ERR_OK ) )
+ return swap ? EQUIP_ERR_ITEMS_CANT_BE_SWAPPED : EQUIP_ERR_INVENTORY_FULL;
}
dest = ((INVENTORY_SLOT_BAG_0 << 8) | eslot);
return EQUIP_ERR_OK;
@@ -11098,7 +10742,7 @@ void Player::DestroyItemCount( uint32 item, uint32 count, bool update, bool uneq
}
}
}
- for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
+ for(int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
{
pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && pItem->GetEntry() == item )
@@ -11201,7 +10845,7 @@ void Player::DestroyZoneLimitedItem( bool update, uint32 new_zone )
if( pItem && pItem->IsLimitedToAnotherMapOrZone(GetMapId(),new_zone) )
DestroyItem( INVENTORY_SLOT_BAG_0, i, update);
}
- for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
+ for(int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
{
Item* pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && pItem->IsLimitedToAnotherMapOrZone(GetMapId(),new_zone) )
@@ -12198,10 +11842,6 @@ void Player::ApplyEnchantment(Item *item,EnchantmentSlot slot,bool apply, bool a
((Player*)this)->ApplyRatingMod(CR_EXPERTISE, enchant_amount, apply);
sLog.outDebug("+ %u EXPERTISE", enchant_amount);
break;
- case ITEM_MOD_ARMOR_PENETRATION_RATING:
- ((Player*)this)->ApplyRatingMod(CR_ARMOR_PENETRATION, enchant_amount, apply);
- sLog.outDebug("+ %u ARMOR PENETRATION", enchant_amount);
- break;
default:
break;
}
@@ -12924,10 +12564,7 @@ void Player::RewardQuest( Quest const *pQuest, uint32 reward, Object* questGiver
}
if(pQuest->IsDaily())
- {
SetDailyQuestStatus(quest_id);
- GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST, 1);
- }
if ( !pQuest->IsRepeatable() )
SetQuestStatus(quest_id, QUEST_STATUS_COMPLETE);
@@ -12940,8 +12577,6 @@ void Player::RewardQuest( Quest const *pQuest, uint32 reward, Object* questGiver
SendQuestReward( pQuest, XP, questGiver );
if (q_status.uState != QUEST_NEW) q_status.uState = QUEST_CHANGED;
- GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT);
- GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST);
}
void Player::FailQuest( uint32 quest_id )
@@ -13567,7 +13202,6 @@ void Player::ItemAddedQuestCheck( uint32 entry, uint32 count )
}
}
UpdateForQuestsGO();
- GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM, entry);
}
void Player::ItemRemovedQuestCheck( uint32 entry, uint32 count )
@@ -13614,7 +13248,6 @@ void Player::ItemRemovedQuestCheck( uint32 entry, uint32 count )
void Player::KilledMonster( uint32 entry, uint64 guid )
{
uint32 addkillcount = 1;
- GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, entry, addkillcount);
for( int i = 0; i < MAX_QUEST_LOG_SIZE; i++ )
{
uint32 questid = GetQuestSlotQuestId(i);
@@ -13893,12 +13526,13 @@ void Player::SendQuestReward( Quest const *pQuest, uint32 XP, Object * questGive
uint32 questid = pQuest->GetQuestId();
sLog.outDebug( "WORLD: Sent SMSG_QUESTGIVER_QUEST_COMPLETE quest = %u", questid );
gameeventmgr.HandleQuestComplete(questid);
- WorldPacket data( SMSG_QUESTGIVER_QUEST_COMPLETE, (4+4+4+4+4) );
- data << uint32(questid);
+ WorldPacket data( SMSG_QUESTGIVER_QUEST_COMPLETE, (4+4+4+4+4+4+pQuest->GetRewItemsCount()*8) );
+ data << questid;
+ data << uint32(0x03);
if ( getLevel() < sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL) )
{
- data << uint32(XP);
+ data << XP;
data << uint32(pQuest->GetRewOrReqMoney());
}
else
@@ -13906,9 +13540,16 @@ void Player::SendQuestReward( Quest const *pQuest, uint32 XP, Object * questGive
data << uint32(0);
data << uint32(pQuest->GetRewOrReqMoney() + int32(pQuest->GetRewMoneyMaxLevel() * sWorld.getRate(RATE_DROP_MONEY)));
}
+ data << uint32(0); // new 2.3.0, HonorPoints?
+ data << uint32( pQuest->GetRewItemsCount() ); // max is 5
- data << uint32(10*Trinity::Honor::hk_honor_at_level(getLevel(), pQuest->GetRewHonorableKills()));
- data << uint32(pQuest->GetBonusTalents()); // bonus talents
+ for (uint32 i = 0; i < pQuest->GetRewItemsCount(); ++i)
+ {
+ if ( pQuest->RewItemId[i] > 0 )
+ data << pQuest->RewItemId[i] << pQuest->RewItemCount[i];
+ else
+ data << uint32(0) << uint32(0);
+ }
GetSession()->SendPacket( &data );
if (pQuest->GetQuestCompleteScript() != 0)
@@ -13919,9 +13560,8 @@ void Player::SendQuestFailed( uint32 quest_id )
{
if( quest_id )
{
- WorldPacket data( SMSG_QUESTGIVER_QUEST_FAILED, 4+4 );
+ WorldPacket data( SMSG_QUESTGIVER_QUEST_FAILED, 4 );
data << quest_id;
- data << uint32(0); // failed reason (4 for inventory is full)
GetSession()->SendPacket( &data );
sLog.outDebug("WORLD: Sent SMSG_QUESTGIVER_QUEST_FAILED");
}
@@ -13960,10 +13600,10 @@ void Player::SendPushToPartyResponse( Player *pPlayer, uint32 msg )
void Player::SendQuestUpdateAddItem( Quest const* pQuest, uint32 item_idx, uint32 count )
{
- WorldPacket data( SMSG_QUESTUPDATE_ADD_ITEM, 0 );
+ WorldPacket data( SMSG_QUESTUPDATE_ADD_ITEM, (4+4) );
sLog.outDebug( "WORLD: Sent SMSG_QUESTUPDATE_ADD_ITEM" );
- //data << pQuest->ReqItemId[item_idx];
- //data << count;
+ data << pQuest->ReqItemId[item_idx];
+ data << count;
GetSession()->SendPacket( &data );
}
@@ -14009,7 +13649,7 @@ bool Player::MinimalLoadFromDB( QueryResult *result, uint32 guid )
if(!LoadValues( fields[1].GetString()))
{
- sLog.outError("ERROR: Player #%d have broken data in `data` field. Can't be loaded for character list.",GUID_LOPART(guid));
+ sLog.outError("ERROR: Player #%d have broken data in `data` field. Can't be loaded.",GUID_LOPART(guid));
if(delete_result) delete result;
return false;
}
@@ -14079,7 +13719,7 @@ void Player::_LoadArenaTeamInfo(QueryResult *result)
ArenaTeam* aTeam = objmgr.GetArenaTeamById(arenateamid);
if(!aTeam)
{
- sLog.outError("Player::_LoadArenaTeamInfo: couldn't load arenateam %u, week %u, season %u, rating %u", arenateamid, played_week, played_season, personal_rating);
+ sLog.outError("FATAL: couldn't load arenateam %u", arenateamid);
continue;
}
uint8 arenaSlot = aTeam->GetSlot();
@@ -14481,10 +14121,10 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
uint32 extraflags = fields[25].GetUInt32();
m_stableSlots = fields[26].GetUInt32();
- if(m_stableSlots > 4)
+ if(m_stableSlots > 2)
{
- sLog.outError("Player can have not more 4 stable slots, but have in DB %u",uint32(m_stableSlots));
- m_stableSlots = 4;
+ sLog.outError("Player can have not more 2 stable slots, but have in DB %u",uint32(m_stableSlots));
+ m_stableSlots = 2;
}
m_atLoginFlags = fields[27].GetUInt32();
@@ -14553,8 +14193,6 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
// reset stats before loading any modifiers
InitStatsForLevel();
InitTaxiNodesForLevel();
- InitGlyphsForLevel();
- InitRunes();
// apply original stats mods before spell loading or item equipment that call before equip _RemoveStatsMods()
@@ -14711,8 +14349,6 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
_LoadDeclinedNames(holder->GetResult(PLAYER_LOGIN_QUERY_LOADDECLINEDNAMES));
- m_achievementMgr.LoadFromDB(holder->GetResult(PLAYER_LOGIN_QUERY_LOADACHIEVEMENTS), holder->GetResult(PLAYER_LOGIN_QUERY_LOADCRITERIAPROGRESS));
- m_achievementMgr.CheckAllAchievementCriteria();
return true;
}
@@ -14766,6 +14402,10 @@ void Player::_LoadAuras(QueryResult *result, uint32 timediff)
for (int i = 0; i < TOTAL_AURAS; i++)
m_modAuras[i].clear();
+ // all aura related fields
+ for(int i = UNIT_FIELD_AURA; i <= UNIT_FIELD_AURASTATE; ++i)
+ SetUInt32Value(i, 0);
+
//QueryResult *result = CharacterDatabase.PQuery("SELECT caster_guid,spell,effect_index,stackcount,amount,maxduration,remaintime,remaincharges FROM character_aura WHERE guid = '%u'",GetGUIDLow());
if(result)
@@ -15677,7 +15317,7 @@ void Player::SaveToDB()
SetByteValue(UNIT_FIELD_BYTES_1, 0, 0); // stand state
SetByteValue(UNIT_FIELD_BYTES_2, 3, 0); // shapeshift
SetByteValue(UNIT_FIELD_BYTES_1, 3, 0); // stand flags?
- RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
+ RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_ROTATE);
SetDisplayId(GetNativeDisplayId());
bool inworld = IsInWorld();
@@ -15828,7 +15468,7 @@ void Player::SaveToDB()
pet->SavePetToDB(PET_SAVE_AS_CURRENT);
//to prevent access to DB we should cache some data, which is used very often
- /*CachePlayerInfoMap::iterator _iter = objmgr.m_mPlayerInfoMap.find(GetGUIDLow());
+ CachePlayerInfoMap::iterator _iter = objmgr.m_mPlayerInfoMap.find(GetGUIDLow());
if(_iter != objmgr.m_mPlayerInfoMap.end())//skip new players
{
_iter->second->unLevel = getLevel();
@@ -15842,8 +15482,7 @@ void Player::SaveToDB()
_iter->second->unArenaInfoId0 = GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (0 * 6));
_iter->second->unArenaInfoId1 = GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (1 * 6));
_iter->second->unArenaInfoId2 = GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (2 * 6));
- }*/
- m_achievementMgr.SaveToDB();
+ }
}
// fast save function for item/money cheating preventing - save only inventory and money state
@@ -16305,42 +15944,6 @@ void Player::SetFloatValueInDB(uint16 index, float value, uint64 guid)
Player::SetUInt32ValueInDB(index, temp, guid);
}
-void Player::Customize(uint64 guid, uint8 gender, uint8 skin, uint8 face, uint8 hairStyle, uint8 hairColor, uint8 facialHair)
-{
- Tokens tokens;
- if(!LoadValuesArrayFromDB(tokens, guid))
- return;
-
- uint32 unit_bytes0 = GetUInt32ValueFromArray(tokens, UNIT_FIELD_BYTES_0);
- uint8 race = unit_bytes0 & 0xFF;
- uint8 class_ = (unit_bytes0 >> 8) & 0xFF;
-
- PlayerInfo const* info = objmgr.GetPlayerInfo(race, class_);
- if(!info)
- return;
-
- unit_bytes0 &= ~(0xFF << 16);
- unit_bytes0 |= (gender << 16);
- SetUInt32ValueInArray(tokens, UNIT_FIELD_BYTES_0, unit_bytes0);
-
- SetUInt32ValueInArray(tokens, UNIT_FIELD_DISPLAYID, gender ? info->displayId_f : info->displayId_m);
- SetUInt32ValueInArray(tokens, UNIT_FIELD_NATIVEDISPLAYID, gender ? info->displayId_f : info->displayId_m);
-
- SetUInt32ValueInArray(tokens, PLAYER_BYTES, (skin | (face << 8) | (hairStyle << 16) | (hairColor << 24)));
-
- uint32 player_bytes2 = GetUInt32ValueFromArray(tokens, PLAYER_BYTES_2);
- player_bytes2 &= ~0xFF;
- player_bytes2 |= facialHair;
- SetUInt32ValueInArray(tokens, PLAYER_BYTES_2, player_bytes2);
-
- uint32 player_bytes3 = GetUInt32ValueFromArray(tokens, PLAYER_BYTES_3);
- player_bytes3 &= ~0xFF;
- player_bytes3 |= gender;
- SetUInt32ValueInArray(tokens, PLAYER_BYTES_3, player_bytes3);
-
- SaveValuesArrayInDB(tokens, guid);
-}
-
void Player::SendAttackSwingNotStanding()
{
WorldPacket data(SMSG_ATTACKSWING_NOTSTANDING, 0);
@@ -16373,8 +15976,7 @@ void Player::SendAttackSwingBadFacingAttack()
void Player::SendAutoRepeatCancel()
{
- WorldPacket data(SMSG_CANCEL_AUTO_REPEAT, GetPackGUID().size());
- data.append(GetPackGUID()); // may be it's target guid
+ WorldPacket data(SMSG_CANCEL_AUTO_REPEAT, 0);
GetSession()->SendPacket( &data );
}
@@ -16603,7 +16205,6 @@ void Player::RemovePet(Pet* pet, PetSaveMode mode, bool returnreagent)
{
WorldPacket data(SMSG_PET_SPELLS, 8);
data << uint64(0);
- data << uint32(0);
GetSession()->SendPacket(&data);
if(GetGroup())
@@ -16735,79 +16336,65 @@ void Player::PetSpellInitialize()
{
Pet* pet = GetPet();
- if(!pet)
- return;
-
- sLog.outDebug("Pet Spells Groups");
-
- CharmInfo *charmInfo = pet->GetCharmInfo();
-
- WorldPacket data(SMSG_PET_SPELLS, 8+4+4+4+10*4);
- data << uint64(pet->GetGUID());
- data << uint32(pet->GetCreatureInfo()->family); // creature family (required for pet talents)
- data << uint32(0);
- data << uint8(charmInfo->GetReactState()) << uint8(charmInfo->GetCommandState()) << uint16(0);
-
- // action bar loop
- for(uint32 i = 0; i < 10; i++)
+ if(pet)
{
- data << uint32(charmInfo->GetActionBarEntry(i)->Raw);
- }
+ uint8 addlist = 0;
- size_t spellsCountPos = data.wpos();
+ sLog.outDebug("Pet Spells Groups");
- // spells count
- uint8 addlist = 0;
- data << uint8(addlist); // placeholder
+ CreatureInfo const *cinfo = pet->GetCreatureInfo();
- if(pet->isControlled() && ((pet->getPetType() == HUNTER_PET) || ((pet->GetCreatureInfo()->type == CREATURE_TYPE_DEMON) && (getClass() == CLASS_WARLOCK))))
- {
- // spells loop
- for (PetSpellMap::iterator itr = pet->m_spells.begin(); itr != pet->m_spells.end(); ++itr)
+ if(pet->isControlled() && (pet->getPetType() == HUNTER_PET || cinfo && cinfo->type == CREATURE_TYPE_DEMON && getClass() == CLASS_WARLOCK))
{
- if(itr->second->state == PETSPELL_REMOVED)
- continue;
-
- data << uint16(itr->first);
- data << uint16(itr->second->active); // pet spell active state isn't boolean
- ++addlist;
+ for(PetSpellMap::iterator itr = pet->m_spells.begin();itr != pet->m_spells.end();++itr)
+ {
+ if(itr->second->state == PETSPELL_REMOVED)
+ continue;
+ ++addlist;
+ }
}
- }
- data.put<uint8>(spellsCountPos, addlist);
+ // first line + actionbar + spellcount + spells + last adds
+ WorldPacket data(SMSG_PET_SPELLS, 16+40+1+4*addlist+25);
- uint8 cooldownsCount = pet->m_CreatureSpellCooldowns.size() + pet->m_CreatureCategoryCooldowns.size();
- data << uint8(cooldownsCount);
+ CharmInfo *charmInfo = pet->GetCharmInfo();
- time_t curTime = time(NULL);
+ //16
+ data << (uint64)pet->GetGUID() << uint32(0x00000000) << uint8(charmInfo->GetReactState()) << uint8(charmInfo->GetCommandState()) << uint16(0);
- for(CreatureSpellCooldowns::const_iterator itr = pet->m_CreatureSpellCooldowns.begin(); itr != pet->m_CreatureSpellCooldowns.end(); ++itr)
- {
- time_t cooldown = 0;
+ for(uint32 i = 0; i < 10; i++) //40
+ {
+ data << uint16(charmInfo->GetActionBarEntry(i)->SpellOrAction) << uint16(charmInfo->GetActionBarEntry(i)->Type);
+ }
- if(itr->second > curTime)
- cooldown = (itr->second - curTime) * 1000;
+ data << uint8(addlist); //1
- data << uint16(itr->first); // spellid
- data << uint16(0); // spell category?
- data << uint32(itr->second); // cooldown
- data << uint32(0); // category cooldown
- }
+ if(addlist && pet->isControlled())
+ {
+ for (PetSpellMap::iterator itr = pet->m_spells.begin(); itr != pet->m_spells.end(); ++itr)
+ {
+ if(itr->second->state == PETSPELL_REMOVED)
+ continue;
- for(CreatureSpellCooldowns::const_iterator itr = pet->m_CreatureCategoryCooldowns.begin(); itr != pet->m_CreatureCategoryCooldowns.end(); ++itr)
- {
- time_t cooldown = 0;
+ data << uint16(itr->first);
+ data << uint16(itr->second->active); // pet spell active state isn't boolean
+ }
+ }
- if(itr->second > curTime)
- cooldown = (itr->second - curTime) * 1000;
+ //data << uint8(0x01) << uint32(0x6010) << uint32(0x01) << uint32(0x05) << uint16(0x00); //15
+ uint8 count = 3; //1+8+8+8=25
- data << uint16(itr->first); // spellid
- data << uint16(0); // spell category?
- data << uint32(0); // cooldown
- data << uint32(itr->second); // category cooldown
- }
+ // if count = 0, then end of packet...
+ data << count;
+ // uint32 value is spell id...
+ // uint64 value is constant 0, unknown...
+ data << uint32(0x6010) << uint64(0); // if count = 1, 2 or 3
+ //data << uint32(0x5fd1) << uint64(0); // if count = 2
+ data << uint32(0x8e8c) << uint64(0); // if count = 3
+ data << uint32(0x8e8b) << uint64(0); // if count = 3
- GetSession()->SendPacket(&data);
+ GetSession()->SendPacket(&data);
+ }
}
void Player::PossessSpellInitialize()
@@ -16829,10 +16416,7 @@ void Player::PossessSpellInitialize()
WorldPacket data(SMSG_PET_SPELLS, 16+40+1+4*addlist+25);// first line + actionbar + spellcount + spells + last adds
//16
- data << uint64(charm->GetGUID());
- data << uint32(0x00000000);
- data << uint32(0);
- data << uint8(0) << uint8(0) << uint16(0);
+ data << (uint64)charm->GetGUID() << uint32(0x00000000) << uint8(0) << uint8(0) << uint16(0);
for(uint32 i = 0; i < 10; i++) //40
{
@@ -16841,8 +16425,11 @@ void Player::PossessSpellInitialize()
data << uint8(addlist); //1
- uint8 count = 0;
- data << uint8(count); // cooldowns count
+ uint8 count = 3;
+ data << count;
+ data << uint32(0x6010) << uint64(0); // if count = 1, 2 or 3
+ data << uint32(0x8e8c) << uint64(0); // if count = 3
+ data << uint32(0x8e8b) << uint64(0); // if count = 3
GetSession()->SendPacket(&data);
}
@@ -16879,13 +16466,13 @@ void Player::CharmSpellInitialize()
WorldPacket data(SMSG_PET_SPELLS, 16+40+1+4*addlist+25);// first line + actionbar + spellcount + spells + last adds
- data << uint64(charm->GetGUID());
- data << uint32(0x00000000);
- data << uint32(0);
+ data << (uint64)charm->GetGUID() << uint32(0x00000000);
+
if(charm->GetTypeId() != TYPEID_PLAYER)
data << uint8(charmInfo->GetReactState()) << uint8(charmInfo->GetCommandState());
else
data << uint8(0) << uint8(0);
+
data << uint16(0);
for(uint32 i = 0; i < 10; i++) //40
@@ -16908,12 +16495,51 @@ void Player::CharmSpellInitialize()
}
}
- uint8 count = 0;
- data << uint8(count); // cooldowns count
+ uint8 count = 3;
+ data << count;
+ data << uint32(0x6010) << uint64(0); // if count = 1, 2 or 3
+ data << uint32(0x8e8c) << uint64(0); // if count = 3
+ data << uint32(0x8e8b) << uint64(0); // if count = 3
GetSession()->SendPacket(&data);
}
+int32 Player::GetTotalFlatMods(uint32 spellId, SpellModOp op)
+{
+ SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellId);
+ if (!spellInfo) return 0;
+ int32 total = 0;
+ for (SpellModList::iterator itr = m_spellMods[op].begin(); itr != m_spellMods[op].end(); ++itr)
+ {
+ SpellModifier *mod = *itr;
+
+ if(!IsAffectedBySpellmod(spellInfo,mod))
+ continue;
+
+ if (mod->type == SPELLMOD_FLAT)
+ total += mod->value;
+ }
+ return total;
+}
+
+int32 Player::GetTotalPctMods(uint32 spellId, SpellModOp op)
+{
+ SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellId);
+ if (!spellInfo) return 0;
+ int32 total = 0;
+ for (SpellModList::iterator itr = m_spellMods[op].begin(); itr != m_spellMods[op].end(); ++itr)
+ {
+ SpellModifier *mod = *itr;
+
+ if(!IsAffectedBySpellmod(spellInfo,mod))
+ continue;
+
+ if (mod->type == SPELLMOD_PCT)
+ total += mod->value;
+ }
+ return total;
+}
+
bool Player::IsAffectedBySpellmod(SpellEntry const *spellInfo, SpellModifier *mod, Spell const* spell)
{
if (!mod || !spellInfo)
@@ -16931,25 +16557,22 @@ bool Player::IsAffectedBySpellmod(SpellEntry const *spellInfo, SpellModifier *mo
return false;
}
- return spellmgr.IsAffectedByMod(spellInfo, mod);
+ return spellmgr.IsAffectedBySpell(spellInfo,mod->spellId,mod->effectId,mod->mask);
}
void Player::AddSpellMod(SpellModifier* mod, bool apply)
{
uint16 Opcode= (mod->type == SPELLMOD_FLAT) ? SMSG_SET_FLAT_SPELL_MODIFIER : SMSG_SET_PCT_SPELL_MODIFIER;
- for(int eff=0;eff<96;++eff)
+ for(int eff=0;eff<64;++eff)
{
- uint64 _mask = 0;
- uint64 _mask2= 0;
- if (eff<64) _mask = uint64(1) << (eff- 0);
- else _mask2= uint64(1) << (eff-64);
- if ( mod->mask & _mask || mod->mask2 & _mask2)
+ uint64 _mask = uint64(1) << eff;
+ if ( mod->mask & _mask)
{
int32 val = 0;
for (SpellModList::iterator itr = m_spellMods[mod->op].begin(); itr != m_spellMods[mod->op].end(); ++itr)
{
- if ((*itr)->type == mod->type && ((*itr)->mask & _mask || (*itr)->mask2 & _mask2))
+ if ((*itr)->type == mod->type && (*itr)->mask & _mask)
val += (*itr)->value;
}
val += apply ? mod->value : -(mod->value);
@@ -17097,7 +16720,7 @@ void Player::HandleStealthedUnitsDetection()
// send data at target visibility change (adding to client)
if((*i)!=this && (*i)->isType(TYPEMASK_UNIT))
{
- SendAurasForTarget(*i);
+ SendAuraDurationsForTarget(*i);
//if(((Unit*)(*i))->isAlive()) //should be always alive
{
if((*i)->GetTypeId()==TYPEID_UNIT)
@@ -18091,7 +17714,7 @@ void Player::UpdateVisibilityOf(WorldObject* target)
// send data at target visibility change (adding to client)
if(target!=this && target->isType(TYPEMASK_UNIT))
{
- SendAurasForTarget((Unit*)target);
+ SendAuraDurationsForTarget((Unit*)target);
if(((Unit*)target)->isAlive())
{
if(target->GetTypeId()==TYPEID_UNIT)
@@ -18270,7 +17893,7 @@ void Player::SetGroup(Group *group, int8 subgroup)
void Player::SendInitialPacketsBeforeAddToMap()
{
- WorldPacket data(SMSG_SET_REST_START_OBSOLETE, 4);
+ WorldPacket data(SMSG_SET_REST_START, 4);
data << uint32(0); // unknown, may be rest state time or experience
GetSession()->SendPacket(&data);
@@ -18298,7 +17921,6 @@ void Player::SendInitialPacketsBeforeAddToMap()
SendInitialActionButtons();
SendInitialReputations();
- m_achievementMgr.SendAllAchievementData();
UpdateZone(GetZoneId());
SendInitWorldStates();
@@ -18309,23 +17931,13 @@ void Player::SendInitialPacketsBeforeAddToMap()
data << (float)0.01666667f; // game speed
GetSession()->SendPacket( &data );
- data.Initialize(SMSG_TIME_SYNC_REQ, 4); // new 2.0.x, enable movement
- data << uint32(0x00000000); // on blizz it increments periodically
- GetSession()->SendPacket(&data);
-
// set fly flag if in fly form or taxi flight to prevent visually drop at ground in showup moment
if(HasAuraType(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED) || isInFlight())
AddUnitMovementFlag(MOVEMENTFLAG_FLYING2);
-
- m_mover = this;
}
void Player::SendInitialPacketsAfterAddToMap()
{
- WorldPacket data(SMSG_TIME_SYNC_REQ, 4); // new 2.0.x, enable movement
- data << uint32(0x00000000); // on blizz it increments periodically
- GetSession()->SendPacket(&data);
-
CastSpell(this, 836, true); // LOGINEFFECT
// set some aura effects that send packet to player client after add player to map
@@ -18356,7 +17968,6 @@ void Player::SendInitialPacketsAfterAddToMap()
SendMessageToSet(&data,true);
}
- SendAurasForTarget(this);
SendEnchantmentDurations(); // must be after add to map
SendItemDurations(); // must be after add to map
}
@@ -18374,19 +17985,11 @@ void Player::SendUpdateToOutOfRangeGroupMembers()
pet->ResetAuraUpdateMask();
}
-void Player::SendTransferAborted(uint32 mapid, uint8 reason, uint8 arg)
+void Player::SendTransferAborted(uint32 mapid, uint16 reason)
{
WorldPacket data(SMSG_TRANSFER_ABORTED, 4+2);
data << uint32(mapid);
- data << uint8(reason); // transfer abort reason
- switch(reason)
- {
- case TRANSFER_ABORT_INSUF_EXPAN_LVL:
- case TRANSFER_ABORT_DIFFICULTY:
- case TRANSFER_ABORT_UNIQUE_MESSAGE:
- data << uint8(arg);
- break;
- }
+ data << uint16(reason); // transfer abort reason
GetSession()->SendPacket(&data);
}
@@ -18596,51 +18199,16 @@ void Player::learnSkillRewardedSpells()
}
}
-void Player::SendAurasForTarget(Unit *target)
+void Player::SendAuraDurationsForTarget(Unit* target)
{
- if(target->GetVisibleAuras()->empty()) // speedup things
- return;
-
- WorldPacket data(SMSG_AURA_UPDATE_ALL);
- data.append(target->GetPackGUID());
-
- Unit::VisibleAuraMap const *visibleAuras = target->GetVisibleAuras();
- for(Unit::VisibleAuraMap::const_iterator itr = visibleAuras->begin(); itr != visibleAuras->end(); ++itr)
+ for(Unit::AuraMap::const_iterator itr = target->GetAuras().begin(); itr != target->GetAuras().end(); ++itr)
{
- for(uint32 j = 0; j < 3; ++j)
- {
- if(Aura *aura = target->GetAura(itr->second, j))
- {
- data << uint8(aura->GetAuraSlot());
- data << uint32(aura->GetId());
-
- if(aura->GetId())
- {
- uint8 auraFlags = aura->GetAuraFlags();
- // flags
- data << uint8(auraFlags);
- // level
- data << uint8(aura->GetAuraLevel());
- // charges
- data << uint8(aura->m_procCharges >= 0 ? aura->m_procCharges : 0 );
-
- if(!(auraFlags & AFLAG_NOT_CASTER))
- {
- data << uint8(0); // packed GUID of someone (caster?)
- }
+ Aura* aura = itr->second;
+ if(aura->GetAuraSlot() >= MAX_AURAS || aura->IsPassive() || aura->GetCasterGUID()!=GetGUID())
+ continue;
- if(auraFlags & AFLAG_DURATION) // include aura duration
- {
- data << uint32(aura->GetAuraMaxDuration());
- data << uint32(aura->GetAuraDuration());
- }
- }
- break;
- }
- }
+ aura->SendAuraDurationForCaster(this);
}
-
- GetSession()->SendPacket(&data);
}
void Player::SetDailyQuestStatus( uint32 quest_id )
@@ -18702,15 +18270,15 @@ uint32 Player::GetMinLevelForBattleGroundQueueId(uint32 queue_id)
if(queue_id < 1)
return 0;
- if(queue_id >=7)
- queue_id = 7;
+ if(queue_id >=6)
+ queue_id = 6;
return 10*(queue_id+1);
}
uint32 Player::GetMaxLevelForBattleGroundQueueId(uint32 queue_id)
{
- if(queue_id >=7)
+ if(queue_id >=6)
return 255; // hardcoded max level
return 10*(queue_id+2)-1;
@@ -18722,8 +18290,8 @@ uint32 Player::GetBattleGroundQueueIdFromLevel() const
uint32 level = getLevel();
if(level <= 19)
return 0;
- else if (level > 79)
- return 7;
+ else if (level > 69)
+ return 6;
else
return level/10 - 1; // 20..29 -> 1, 30-39 -> 2, ...
/*
@@ -18869,8 +18437,9 @@ void Player::AutoUnequipOffhandIfNeed()
if(!offItem)
return;
- // need unequip for 2h-weapon without TitanGrip
- if (!IsTwoHandUsed())
+ Item *mainItem = GetItemByPos( INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND );
+
+ if(!mainItem || mainItem->GetProto()->InventoryType != INVTYPE_2HWEAPON)
return;
ItemPosCountVec off_dest;
@@ -18936,23 +18505,6 @@ bool Player::HasItemFitToSpellReqirements(SpellEntry const* spellInfo, Item cons
return false;
}
-bool Player::CanNoReagentCast(SpellEntry const* spellInfo) const
-{
- // don't take reagents for spells with SPELL_ATTR_EX5_NO_REAGENT_WHILE_PREP
- if (spellInfo->AttributesEx5 & SPELL_ATTR_EX5_NO_REAGENT_WHILE_PREP &&
- HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PREPARATION))
- return true;
-
- // Check no reagent use mask
- uint64 noReagentMask_0_1 = GetUInt64Value(PLAYER_NO_REAGENT_COST_1);
- uint32 noReagentMask_2 = GetUInt64Value(PLAYER_NO_REAGENT_COST_1+2);
- if (spellInfo->SpellFamilyFlags & noReagentMask_0_1 ||
- spellInfo->SpellFamilyFlags2 & noReagentMask_2)
- return true;
-
- return false;
-}
-
void Player::RemoveItemDependentAurasAndCasts( Item * pItem )
{
AuraMap& auras = GetAuras();
@@ -18998,7 +18550,7 @@ uint32 Player::GetResurrectionSpellId()
for(AuraList::const_iterator itr = dummyAuras.begin(); itr != dummyAuras.end(); ++itr)
{
// Soulstone Resurrection // prio: 3 (max, non death persistent)
- if( prio < 2 && (*itr)->GetSpellProto()->SpellVisual[0] == 99 && (*itr)->GetSpellProto()->SpellIconID == 92 )
+ if( prio < 2 && (*itr)->GetSpellProto()->SpellVisual == 99 && (*itr)->GetSpellProto()->SpellIconID == 92 )
{
switch((*itr)->GetId())
{
@@ -19157,9 +18709,6 @@ uint32 Player::GetBaseWeaponSkillValue (WeaponAttackType attType) const
void Player::ResurectUsingRequestData()
{
- /// Teleport before resurrecting, otherwise the player might get attacked from creatures near his corpse
- TeleportTo(m_resurrectMap, m_resurrectX, m_resurrectY, m_resurrectZ, GetOrientation());
-
ResurrectPlayer(0.0f,false);
if(GetMaxHealth() > m_resurrectHealth)
@@ -19177,6 +18726,8 @@ void Player::ResurectUsingRequestData()
SetPower(POWER_ENERGY, GetMaxPower(POWER_ENERGY) );
SpawnCorpseBones();
+
+ TeleportTo(m_resurrectMap, m_resurrectX, m_resurrectY, m_resurrectZ, GetOrientation());
}
void Player::SetClientControl(Unit* target, uint8 allowMove)
@@ -19190,8 +18741,8 @@ void Player::SetClientControl(Unit* target, uint8 allowMove)
void Player::UpdateZoneDependentAuras( uint32 newZone )
{
// remove new continent flight forms
- uint32 v_map = GetVirtualMapForMapAndZone(GetMapId(), newZone);
- if( !isGameMaster() && v_map != 530 && v_map != 571)
+ if( !isGameMaster() &&
+ GetVirtualMapForMapAndZone(GetMapId(),newZone) != 530)
{
RemoveSpellsCausingAura(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED);
RemoveSpellsCausingAura(SPELL_AURA_FLY);
@@ -19411,8 +18962,8 @@ bool ItemPosCount::isContainedIn(ItemPosCountVec const& vec) const
void Player::HandleFallDamage(MovementInfo& movementInfo)
{
- //if(movementInfo.fallTime < 1500)
- // return;
+ if(movementInfo.fallTime < 1500)
+ return;
// calculate total z distance of the fall
float z_diff = m_lastFallZ - movementInfo.z;
@@ -19718,152 +19269,6 @@ bool Player::isAllowUseBattleGroundObject()
);
}
-uint32 Player::GetBarberShopCost(uint8 newhairstyle, uint8 newhaircolor, uint8 newfacialhair)
-{
- uint32 level = getLevel();
-
- if(level > GT_MAX_LEVEL)
- level = GT_MAX_LEVEL; // max level in this dbc
-
- uint8 hairstyle = GetByteValue(PLAYER_BYTES, 2);
- uint8 haircolor = GetByteValue(PLAYER_BYTES, 3);
- uint8 facialhair = GetByteValue(PLAYER_BYTES_2, 0);
-
- if((hairstyle == newhairstyle) && (haircolor == newhaircolor) && (facialhair == newfacialhair))
- return 0;
-
- GtBarberShopCostBaseEntry const *bsc = sGtBarberShopCostBaseStore.LookupEntry(level - 1);
-
- if(!bsc) // shouldn't happen
- return 0xFFFFFFFF;
-
- float cost = 0;
-
- if(hairstyle != newhairstyle)
- cost += bsc->cost; // full price
-
- if((haircolor != newhaircolor) && (hairstyle == newhairstyle))
- cost += bsc->cost * 0.5f; // +1/2 of price
-
- if(facialhair != newfacialhair)
- cost += bsc->cost * 0.75f; // +3/4 of price
-
- return uint32(cost);
-}
-
-void Player::InitGlyphsForLevel()
-{
- uint32 level = getLevel();
- uint32 value = 0;
-
- // 0x3F = 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 for 80 level
- if(level >= 15)
- value |= (0x01 | 0x02);
- if(level >= 30)
- value |= 0x04;
- if(level >= 50)
- value |= 0x08;
- if(level >= 70)
- value |= 0x10;
- if(level >= 80)
- value |= 0x20;
-
- SetUInt32Value(PLAYER_GLYPHS_ENABLED, value);
-}
-
-void Player::EnterVehicle(Vehicle *vehicle)
-{
- VehicleEntry const *ve = sVehicleStore.LookupEntry(vehicle->GetVehicleId());
- if(!ve)
- return;
-
- VehicleSeatEntry const *veSeat = sVehicleSeatStore.LookupEntry(ve->m_seatID[0]);
- if(!veSeat)
- return;
-
- vehicle->SetCharmerGUID(GetGUID());
- vehicle->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
- vehicle->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNKNOWN5);
- vehicle->setFaction(getFaction());
-
- SetCharm(vehicle); // charm
- SetFarSight(vehicle->GetGUID()); // set view
-
- SetClientControl(vehicle, 1); // redirect controls to vehicle
-
- WorldPacket data(SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, 0);
- GetSession()->SendPacket(&data);
-
- data.Initialize(MSG_MOVE_TELEPORT_ACK, 30);
- data.append(GetPackGUID());
- data << uint32(0); // counter?
- data << uint32(MOVEMENTFLAG_ONTRANSPORT); // transport
- data << uint16(0); // special flags
- data << uint32(getMSTime()); // time
- data << vehicle->GetPositionX(); // x
- data << vehicle->GetPositionY(); // y
- data << vehicle->GetPositionZ(); // z
- data << vehicle->GetOrientation(); // o
- // transport part, TODO: load/calculate seat offsets
- data << uint64(vehicle->GetGUID()); // transport guid
- data << float(veSeat->m_attachmentOffsetX); // transport offsetX
- data << float(veSeat->m_attachmentOffsetY); // transport offsetY
- data << float(veSeat->m_attachmentOffsetZ); // transport offsetZ
- data << float(0); // transport orientation
- data << uint32(getMSTime()); // transport time
- data << uint8(0); // seat
- // end of transport part
- data << uint32(0); // fall time
- GetSession()->SendPacket(&data);
-
- data.Initialize(SMSG_PET_SPELLS, 8+4+4+4+4*10+1+1);
- data << uint64(vehicle->GetGUID());
- data << uint32(0x00000000);
- data << uint32(0x00000000);
- data << uint32(0x00000101);
-
- for(uint32 i = 0; i < 10; ++i)
- data << uint16(0) << uint8(0) << uint8(i+8);
-
- data << uint8(0);
- data << uint8(0);
- GetSession()->SendPacket(&data);
-}
-
-void Player::ExitVehicle(Vehicle *vehicle)
-{
- vehicle->SetCharmerGUID(0);
- vehicle->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
- vehicle->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNKNOWN5);
- vehicle->setFaction((GetTeam() == ALLIANCE) ? vehicle->GetCreatureInfo()->faction_A : vehicle->GetCreatureInfo()->faction_H);
-
- SetCharm(NULL);
- SetFarSight(NULL);
-
- SetClientControl(vehicle, 0);
-
- WorldPacket data(MSG_MOVE_TELEPORT_ACK, 30);
- data.append(GetPackGUID());
- data << uint32(0); // counter?
- data << uint32(MOVEMENTFLAG_FLY_UNK1); // fly unk
- data << uint16(0x40); // special flags
- data << uint32(getMSTime()); // time
- data << vehicle->GetPositionX(); // x
- data << vehicle->GetPositionY(); // y
- data << vehicle->GetPositionZ(); // z
- data << vehicle->GetOrientation(); // o
- data << uint32(0); // fall time
- GetSession()->SendPacket(&data);
-
- data.Initialize(SMSG_PET_SPELLS, 8+4);
- data << uint64(0);
- data << uint32(0);
- GetSession()->SendPacket(&data);
-
- // only for flyable vehicles?
- CastSpell(this, 45472, true); // Parachute
-}
-
bool Player::HasTitle(uint32 bitIndex)
{
if (bitIndex > 128)
@@ -19881,6 +19286,7 @@ void Player::SetTitle(CharTitlesEntry const* title)
SetFlag(PLAYER__FIELD_KNOWN_TITLES+fieldIndexOffset, flag);
}
+
/*-----------------------TRINITY--------------------------*/
bool Player::isTotalImmunity()
{
@@ -19937,52 +19343,3 @@ void Player::UpdateCharmedAI()
Attack(target, true);
}
}
-
-void Player::ConvertRune(uint8 index, uint8 newType)
-{
- SetCurrentRune(index, newType);
-
- WorldPacket data(SMSG_CONVERT_RUNE, 2);
- data << uint8(index);
- data << uint8(newType);
- GetSession()->SendPacket(&data);
-}
-
-void Player::ResyncRunes(uint8 count)
-{
- WorldPacket data(SMSG_RESYNC_RUNES, count * 2);
- for(uint32 i = 0; i < count; ++i)
- {
- data << uint8(GetCurrentRune(i)); // rune type
- data << uint8(255 - (GetRuneCooldown(i) * 51)); // passed cooldown time (0-255)
- }
- GetSession()->SendPacket(&data);
-}
-
-void Player::AddRunePower(uint8 index)
-{
- WorldPacket data(SMSG_ADD_RUNE_POWER, 4);
- data << uint32(1 << index); // mask (0x00-0x3F probably)
- GetSession()->SendPacket(&data);
-}
-
-void Player::InitRunes()
-{
- if(getClass() != CLASS_DEATH_KNIGHT)
- return;
-
- m_runes = new Runes;
-
- m_runes->runeState = 0;
-
- for(uint32 i = 0; i < MAX_RUNES; ++i)
- {
- SetBaseRune(i, i / 2); // init base types
- SetCurrentRune(i, i / 2); // init current types
- SetRuneCooldown(i, 0); // reset cooldowns
- m_runes->SetRuneState(i);
- }
-
- for(uint32 i = 0; i < NUM_RUNE_TYPES; ++i)
- SetFloatValue(PLAYER_RUNE_REGEN_1 + i, 0.1f);
-}
diff --git a/src/game/Player.h b/src/game/Player.h
index 3b236c5e4e5..9187ca3968d 100644
--- a/src/game/Player.h
+++ b/src/game/Player.h
@@ -35,7 +35,6 @@
#include "Pet.h"
#include "MapReference.h"
#include "Util.h" // for Tokens typedef
-#include "AchievementMgr.h"
#include<string>
#include<vector>
@@ -50,8 +49,6 @@ class Transport;
class UpdateMask;
class PlayerSocial;
class OutdoorPvP;
-class AchievementMgr;
-class Vehicle;
typedef std::deque<Mail*> PlayerMails;
@@ -83,17 +80,15 @@ struct PlayerSpell
#define SPELL_WITHOUT_SLOT_ID uint16(-1)
-// Spell modifier (used for modify other spells)
struct SpellModifier
{
- SpellModifier() : charges(0), lastAffected(NULL) {}
SpellModOp op : 8;
SpellModType type : 8;
int16 charges : 16;
int32 value;
uint64 mask;
- uint64 mask2;
uint32 spellId;
+ uint32 effectId;
Spell const* lastAffected;
};
@@ -229,39 +224,6 @@ struct Areas
float y2;
};
-#define MAX_RUNES 6
-#define RUNE_COOLDOWN 5 // 5*2=10 sec
-
-enum RuneType
-{
- RUNE_BLOOD = 0,
- RUNE_UNHOLY = 1,
- RUNE_FROST = 2,
- RUNE_DEATH = 3,
- NUM_RUNE_TYPES = 4
-};
-
-struct RuneInfo
-{
- uint8 BaseRune;
- uint8 CurrentRune;
- uint8 Cooldown;
-};
-
-struct Runes
-{
- RuneInfo runes[MAX_RUNES];
- uint8 runeState; // mask of available runes
-
- void SetRuneState(uint8 index, bool set = true)
- {
- if(set)
- runeState |= (1 << index); // usable
- else
- runeState &= ~(1 << index); // on cooldown
- }
-};
-
enum FactionFlags
{
FACTION_FLAG_VISIBLE = 0x01, // makes visible in client (set or can be set at interaction with target of this faction)
@@ -430,7 +392,7 @@ enum PlayerFlags
PLAYER_FLAGS_UNK3 = 0x00008000, // strange visual effect (2.0.1), looks like PLAYER_FLAGS_GHOST flag
PLAYER_FLAGS_SANCTUARY = 0x00010000, // player entered sanctuary
PLAYER_FLAGS_UNK4 = 0x00020000, // taxi benchmark mode (on/off) (2.0.1)
- PLAYER_FLAGS_PVP_TIMER = 0x00040000, // 3.0.2, pvp timer active (after you disable pvp manually)
+ PLAYER_UNK = 0x00040000, // 2.0.8...
};
// used for PLAYER__FIELD_KNOWN_TITLES field (uint64), (1<<bit_index) without (-1)
@@ -519,8 +481,7 @@ enum LootType
LOOT_DISENCHANTING = 5, // unsupported by client, sending LOOT_SKINNING instead
LOOT_PROSPECTING = 6, // unsupported by client, sending LOOT_SKINNING instead
LOOT_INSIGNIA = 7, // unsupported by client, sending LOOT_SKINNING instead
- LOOT_FISHINGHOLE = 8, // unsupported by client, sending LOOT_FISHING instead
- LOOT_MILLING = 9 // unsupported by client, sending LOOT_SKINNING instead
+ LOOT_FISHINGHOLE = 8 // unsupported by client, sending LOOT_FISHING instead
};
enum MirrorTimerType
@@ -551,8 +512,7 @@ enum AtLoginFlags
AT_LOGIN_NONE = 0,
AT_LOGIN_RENAME = 1,
AT_LOGIN_RESET_SPELLS = 2,
- AT_LOGIN_RESET_TALENTS = 4,
- AT_LOGIN_CUSTOMIZE = 8
+ AT_LOGIN_RESET_TALENTS = 4
};
typedef std::map<uint32, QuestStatusData> QuestStatusMap;
@@ -584,7 +544,7 @@ enum PlayerSlots
// first slot for item stored (in any way in player m_items data)
PLAYER_SLOT_START = 0,
// last+1 slot for item stored (in any way in player m_items data)
- PLAYER_SLOT_END = 200,
+ PLAYER_SLOT_END = 118,
PLAYER_SLOTS_COUNT = (PLAYER_SLOT_END - PLAYER_SLOT_START)
};
@@ -712,24 +672,6 @@ enum KeyRingSlots
KEYRING_SLOT_END = 118
};
-enum VanityPetSlots
-{
- VANITYPET_SLOT_START = 118,
- VANITYPET_SLOT_END = 136
-};
-
-enum CurrencyTokenSlots
-{
- CURRENCYTOKEN_SLOT_START = 136,
- CURRENCYTOKEN_SLOT_END = 168
-};
-
-enum QuestBagSlots
-{
- QUESTBAG_SLOT_START = 168,
- QUESTBAG_SLOT_END = 200
-};
-
struct ItemPosCount
{
ItemPosCount(uint16 _pos, uint8 _count) : pos(_pos), count(_count) {}
@@ -748,15 +690,14 @@ enum TradeSlots
enum TransferAbortReason
{
- TRANSFER_ABORT_ERROR = 0x00,
- TRANSFER_ABORT_MAX_PLAYERS = 0x01, // Transfer Aborted: instance is full
- TRANSFER_ABORT_NOT_FOUND = 0x02, // Transfer Aborted: instance not found
- TRANSFER_ABORT_TOO_MANY_INSTANCES = 0x03, // You have entered too many instances recently.
- TRANSFER_ABORT_ZONE_IN_COMBAT = 0x05, // Unable to zone in while an encounter is in progress.
- TRANSFER_ABORT_INSUF_EXPAN_LVL = 0x06, // You must have <TBC,WotLK> expansion installed to access this area.
- TRANSFER_ABORT_DIFFICULTY = 0x07, // <Normal,Heroic,Epic> difficulty mode is not available for %s.
- TRANSFER_ABORT_UNIQUE_MESSAGE = 0x08, // Until you've escaped TLK's grasp, you cannot leave this place!
- TRANSFER_ABORT_TOO_MANY_REALM_INSTANCES = 0x09 // Additional instances cannot be launched, please try again later.
+ TRANSFER_ABORT_MAX_PLAYERS = 0x0001, // Transfer Aborted: instance is full
+ TRANSFER_ABORT_NOT_FOUND = 0x0002, // Transfer Aborted: instance not found
+ TRANSFER_ABORT_TOO_MANY_INSTANCES = 0x0003, // You have entered too many instances recently.
+ TRANSFER_ABORT_ZONE_IN_COMBAT = 0x0005, // Unable to zone in while an encounter is in progress.
+ TRANSFER_ABORT_INSUF_EXPAN_LVL1 = 0x0106, // You must have TBC expansion installed to access this area.
+ TRANSFER_ABORT_DIFFICULTY1 = 0x0007, // Normal difficulty mode is not available for %s.
+ TRANSFER_ABORT_DIFFICULTY2 = 0x0107, // Heroic difficulty mode is not available for %s.
+ TRANSFER_ABORT_DIFFICULTY3 = 0x0207 // Epic difficulty mode is not available for %s.
};
enum InstanceResetWarningType
@@ -770,16 +711,15 @@ enum InstanceResetWarningType
struct MovementInfo
{
// common
- uint32 flags;
- uint16 unk1;
+ //uint32 flags;
+ uint8 unk1;
uint32 time;
float x, y, z, o;
// transport
uint64 t_guid;
float t_x, t_y, t_z, t_o;
uint32 t_time;
- int8 t_seat;
- // swimming and unknown
+ // swimming and unk
float s_pitch;
// last fall time
uint32 fallTime;
@@ -790,17 +730,17 @@ struct MovementInfo
MovementInfo()
{
- flags = 0;
+ //flags =
time = t_time = fallTime = 0;
unk1 = 0;
x = y = z = o = t_x = t_y = t_z = t_o = s_pitch = j_unk = j_sinAngle = j_cosAngle = j_xyspeed = u_unk1 = 0.0f;
t_guid = 0;
}
- void SetMovementFlags(uint32 _flags)
+ /*void SetMovementFlags(uint32 _flags)
{
flags = _flags;
- }
+ }*/
};
// flags that use in movement check for example at spell casting
@@ -873,11 +813,9 @@ enum PlayerLoginQueryIndex
PLAYER_LOGIN_QUERY_LOADDECLINEDNAMES = 16,
PLAYER_LOGIN_QUERY_LOADGUILD = 17,
PLAYER_LOGIN_QUERY_LOADARENAINFO = 18,
- PLAYER_LOGIN_QUERY_LOADACHIEVEMENTS = 19,
- PLAYER_LOGIN_QUERY_LOADCRITERIAPROGRESS = 20,
- MAX_PLAYER_LOGIN_QUERY = 21
-};
+ MAX_PLAYER_LOGIN_QUERY
+};
// Player summoning auto-decline time (in secs)
#define MAX_PLAYER_SUMMON_DELAY (2*MINUTE)
@@ -899,7 +837,7 @@ class TRINITY_DLL_SPEC PlayerTaxi
PlayerTaxi();
~PlayerTaxi() {}
// Nodes
- void InitTaxiNodesForLevel(uint32 race, uint32 chrClass, uint32 level);
+ void InitTaxiNodesForLevel(uint32 race, uint32 level);
void LoadTaxiMask(const char* data);
void SaveTaxiMask(const char* data);
@@ -1002,7 +940,7 @@ class TRINITY_DLL_SPEC Player : public Unit
void SendInitialPacketsBeforeAddToMap();
void SendInitialPacketsAfterAddToMap();
- void SendTransferAborted(uint32 mapid, uint8 reason, uint8 arg = 0);
+ void SendTransferAborted(uint32 mapid, uint16 reason);
void SendInstanceResetWarning(uint32 mapid, uint32 time);
bool CanInteractWithNPCs(bool alive = true) const;
@@ -1015,12 +953,10 @@ class TRINITY_DLL_SPEC Player : public Unit
std::string afkMsg;
std::string dndMsg;
- uint32 GetBarberShopCost(uint8 newhairstyle, uint8 newhaircolor, uint8 newfacialhair);
-
PlayerSocial *GetSocial() { return m_social; }
PlayerTaxi m_taxi;
- void InitTaxiNodesForLevel() { m_taxi.InitTaxiNodesForLevel(getRace(), getClass(), getLevel()); }
+ void InitTaxiNodesForLevel() { m_taxi.InitTaxiNodesForLevel(getRace(),getLevel()); }
bool ActivateTaxiPathTo(std::vector<uint32> const& nodes, uint32 mount_id = 0 , Creature* npc = NULL);
// mount_id can be used in scripting calls
bool isAcceptTickets() const { return GetSession()->GetSecurity() >= SEC_GAMEMASTER && (m_ExtraFlags & PLAYER_EXTRA_GM_ACCEPT_TICKETS); }
@@ -1116,7 +1052,6 @@ class TRINITY_DLL_SPEC Player : public Unit
bool HasBankBagSlot( uint8 slot ) const;
bool HasItemCount( uint32 item, uint32 count, bool inBankAlso = false ) const;
bool HasItemFitToSpellReqirements(SpellEntry const* spellInfo, Item const* ignoreItem = NULL);
- bool CanNoReagentCast(SpellEntry const* spellInfo) const;
Item* GetItemOrItemWithGemEquipped( uint32 item ) const;
uint8 CanTakeMoreSimilarItems(Item* pItem) const { return _CanTakeMoreSimilarItems(pItem->GetEntry(),pItem->GetCount(),pItem); }
uint8 CanTakeMoreSimilarItems(uint32 entry, uint32 count) const { return _CanTakeMoreSimilarItems(entry,count,NULL); }
@@ -1195,11 +1130,6 @@ class TRINITY_DLL_SPEC Player : public Unit
// disarm applied only to mainhand weapon
return !IsInFeralForm() && (!mainhand || !HasFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_DISARMED) );
}
- bool IsTwoHandUsed() const
- {
- Item* mainItem = GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND);
- return mainItem && mainItem->GetProto()->InventoryType == INVTYPE_2HWEAPON && !CanTitanGrip();
- }
void SendNewItem( Item *item, uint32 count, bool received, bool created, bool broadcast = false );
bool BuyItemFromVendor(uint64 vendorguid, uint32 item, uint8 count, uint64 bagguid, uint8 slot);
@@ -1355,7 +1285,6 @@ class TRINITY_DLL_SPEC Player : public Unit
static void SetFloatValueInArray(Tokens& data,uint16 index, float value);
static void SetUInt32ValueInDB(uint16 index, uint32 value, uint64 guid);
static void SetFloatValueInDB(uint16 index, float value, uint64 guid);
- static void Customize(uint64 guid, uint8 gender, uint8 skin, uint8 face, uint8 hairStyle, uint8 hairColor, uint8 facialHair);
static void SavePositionInDB(uint32 mapid, float x,float y,float z,float o,uint32 zone,uint64 guid);
bool m_mailsLoaded;
@@ -1494,12 +1423,6 @@ class TRINITY_DLL_SPEC Player : public Unit
uint32 resetTalentsCost() const;
void InitTalentForLevel();
- void InitGlyphsForLevel();
- void SetGlyphSlot(uint8 slot, uint32 slottype) { SetUInt32Value(PLAYER_FIELD_GLYPH_SLOTS_1 + slot, slottype); }
- uint32 GetGlyphSlot(uint8 slot) { return GetUInt32Value(PLAYER_FIELD_GLYPH_SLOTS_1 + slot); }
- void SetGlyph(uint8 slot, uint32 glyph) { SetUInt32Value(PLAYER_FIELD_GLYPHS_1 + slot, glyph); }
- uint32 GetGlyph(uint8 slot) { return GetUInt32Value(PLAYER_FIELD_GLYPHS_1 + slot); }
-
uint32 GetFreePrimaryProffesionPoints() const { return GetUInt32Value(PLAYER_CHARACTER_POINTS2); }
void SetFreePrimaryProffesions(uint16 profs) { SetUInt32Value(PLAYER_CHARACTER_POINTS2,profs); }
void InitPrimaryProffesions();
@@ -1508,6 +1431,8 @@ class TRINITY_DLL_SPEC Player : public Unit
PlayerSpellMap & GetSpellMap() { return m_spells; }
void AddSpellMod(SpellModifier* mod, bool apply);
+ int32 GetTotalFlatMods(uint32 spellId, SpellModOp op);
+ int32 GetTotalPctMods(uint32 spellId, SpellModOp op);
bool IsAffectedBySpellmod(SpellEntry const *spellInfo, SpellModifier *mod, Spell const* spell = NULL);
template <class T> T ApplySpellMod(uint32 spellId, SpellModOp op, T &basevalue, Spell const* spell = NULL);
void RemoveSpellMods(Spell const* spell);
@@ -1664,10 +1589,6 @@ class TRINITY_DLL_SPEC Player : public Unit
void UpdateAllCritPercentages();
void UpdateParryPercentage();
void UpdateDodgePercentage();
- void UpdateMeleeHitChances();
- void UpdateRangedHitChances();
- void UpdateSpellHitChances();
-
void UpdateAllSpellCritChances();
void UpdateSpellCritChance(uint32 school);
void UpdateExpertise(WeaponAttackType attType);
@@ -1838,8 +1759,6 @@ class TRINITY_DLL_SPEC Player : public Unit
void SetCanParry(bool value);
bool CanBlock() const { return m_canBlock; }
void SetCanBlock(bool value);
- bool CanTitanGrip() const { return m_canTitanGrip ; }
- void SetCanTitanGrip(bool value) { m_canTitanGrip = value; }
void SetRegularAttackTime();
void SetBaseModValue(BaseModGroup modGroup, BaseModType modType, float value) { m_auraBaseMod[modGroup][modType] = value; }
@@ -1873,7 +1792,7 @@ class TRINITY_DLL_SPEC Player : public Unit
void SendUpdateWorldState(uint32 Field, uint32 Value);
void SendDirectMessage(WorldPacket *data);
- void SendAurasForTarget(Unit *target);
+ void SendAuraDurationsForTarget(Unit* target);
PlayerMenu* PlayerTalkClass;
std::vector<ItemSetEffect *> ItemSetEff;
@@ -2034,7 +1953,6 @@ class TRINITY_DLL_SPEC Player : public Unit
MovementInfo m_movementInfo;
uint32 m_lastFallTime;
float m_lastFallZ;
- Unit *m_mover;
void SetFallInformation(uint32 time, float z)
{
m_lastFallTime = time;
@@ -2052,9 +1970,6 @@ class TRINITY_DLL_SPEC Player : public Unit
void SetClientControl(Unit* target, uint8 allowMove);
- void EnterVehicle(Vehicle *vehicle);
- void ExitVehicle(Vehicle *vehicle);
-
uint64 GetFarSight() const { return GetUInt64Value(PLAYER_FARSIGHT); }
void SetFarSight(uint64 guid) { SetUInt64Value(PLAYER_FARSIGHT, guid); }
@@ -2067,7 +1982,6 @@ class TRINITY_DLL_SPEC Player : public Unit
float GetTransOffsetZ() const { return m_movementInfo.t_z; }
float GetTransOffsetO() const { return m_movementInfo.t_o; }
uint32 GetTransTime() const { return m_movementInfo.t_time; }
- int8 GetTransSeat() const { return m_movementInfo.t_seat; }
uint32 GetSaveTimer() const { return m_nextSave; }
void SetSaveTimer(uint32 timer) { m_nextSave = timer; }
@@ -2166,18 +2080,6 @@ class TRINITY_DLL_SPEC Player : public Unit
WorldLocation& GetTeleportDest() { return m_teleport_dest; }
DeclinedName const* GetDeclinedNames() const { return m_declinedname; }
- uint8 GetRunesState() const { return m_runes->runeState; }
- uint8 GetBaseRune(uint8 index) const { return m_runes->runes[index].BaseRune; }
- uint8 GetCurrentRune(uint8 index) const { return m_runes->runes[index].CurrentRune; }
- uint8 GetRuneCooldown(uint8 index) const { return m_runes->runes[index].Cooldown; }
- void SetBaseRune(uint8 index, uint8 baseRune) { m_runes->runes[index].BaseRune = baseRune; }
- void SetCurrentRune(uint8 index, uint8 currentRune) { m_runes->runes[index].CurrentRune = currentRune; }
- void SetRuneCooldown(uint8 index, uint8 cooldown) { m_runes->runes[index].Cooldown = cooldown; m_runes->SetRuneState(index, (cooldown == 0) ? true : false); }
- void ConvertRune(uint8 index, uint8 newType);
- void ResyncRunes(uint8 count);
- void AddRunePower(uint8 index);
- void InitRunes();
- AchievementMgr& GetAchievementMgr() { return m_achievementMgr; }
bool HasTitle(uint32 bitIndex);
bool HasTitle(CharTitlesEntry const* title) { return HasTitle(title->bit_index); }
void SetTitle(CharTitlesEntry const* title);
@@ -2314,7 +2216,6 @@ class TRINITY_DLL_SPEC Player : public Unit
ActionButtonList m_actionButtons;
float m_auraBaseMod[BASEMOD_END][MOD_END];
- int16 m_baseRatingValue[MAX_COMBAT_RATING];
SpellModList m_spellMods[MAX_SPELLMOD];
int32 m_SpellModRemoveCount;
@@ -2348,6 +2249,7 @@ class TRINITY_DLL_SPEC Player : public Unit
bool m_DailyQuestChanged;
time_t m_lastDailyQuestTime;
+ uint32 m_regenTimer;
uint32 m_breathTimer;
uint32 m_drunkTimer;
uint16 m_drunk;
@@ -2366,10 +2268,8 @@ class TRINITY_DLL_SPEC Player : public Unit
uint32 m_ArmorProficiency;
bool m_canParry;
bool m_canBlock;
- bool m_canTitanGrip;
uint8 m_swingErrorMsg;
float m_ammoDPS;
-
////////////////////Rest System/////////////////////
int time_inn_enter;
uint32 inn_pos_mapid;
@@ -2416,8 +2316,6 @@ class TRINITY_DLL_SPEC Player : public Unit
bool m_farsightVision;
DeclinedName *m_declinedname;
- Runes *m_runes;
- AchievementMgr m_achievementMgr;
private:
// internal common parts for CanStore/StoreItem functions
uint8 _CanStoreItem_InSpecificSlot( uint8 bag, uint8 slot, ItemPosCountVec& dest, ItemPrototype const *pProto, uint32& count, bool swap, Item *pSrcItem ) const;
diff --git a/src/game/QueryHandler.cpp b/src/game/QueryHandler.cpp
index 5b5679a81d7..9f9eecc2234 100644
--- a/src/game/QueryHandler.cpp
+++ b/src/game/QueryHandler.cpp
@@ -33,7 +33,6 @@
#include "NPCHandler.h"
#include "ObjectAccessor.h"
#include "Pet.h"
-#include "MapManager.h"
void WorldSession::SendNameQueryOpcode(Player *p)
{
@@ -186,6 +185,7 @@ void WorldSession::HandleCreatureQueryOpcode( WorldPacket & recv_data )
data << (uint32)ci->type;
data << (uint32)ci->family; // family wdbFeild9
data << (uint32)ci->rank; // rank wdbFeild10
+ data << (uint32)0; // unknown wdbFeild11
data << (uint32)ci->PetSpellDataId; // Id from CreatureSpellData.dbc wdbField12
data << (uint32)ci->Modelid1; // Modelid1
data << (uint32)ci->Modelid2; // Modelid2
@@ -276,43 +276,20 @@ void WorldSession::HandleCorpseQueryOpcode(WorldPacket & /*recv_data*/)
Corpse *corpse = GetPlayer()->GetCorpse();
+ uint8 found = 1;
if(!corpse)
- {
- WorldPacket data(MSG_CORPSE_QUERY, 1);
- data << uint8(0); // corpse not found
- SendPacket(&data);
- return;
- }
+ found = 0;
- int32 mapid = corpse->GetMapId();
- float x = corpse->GetPositionX();
- float y = corpse->GetPositionY();
- float z = corpse->GetPositionZ();
- int32 corpsemapid = _player->GetMapId();
-
- if(Map *map = corpse->GetMap())
+ WorldPacket data(MSG_CORPSE_QUERY, (1+found*(5*4)));
+ data << uint8(found);
+ if(found)
{
- if(map->IsDungeon())
- {
- if(!map->GetEntrancePos(mapid, x, y))
- return;
-
- Map *entrance_map = MapManager::Instance().GetMap(mapid, _player);
- if(!entrance_map)
- return;
-
- z = entrance_map->GetHeight(x, y, MAX_HEIGHT);
- corpsemapid = corpse->GetMapId();
- }
+ data << corpse->GetMapId();
+ data << corpse->GetPositionX();
+ data << corpse->GetPositionY();
+ data << corpse->GetPositionZ();
+ data << _player->GetMapId();
}
-
- WorldPacket data(MSG_CORPSE_QUERY, 1+(5*4));
- data << uint8(1); // corpse found
- data << int32(mapid);
- data << float(x);
- data << float(y);
- data << float(z);
- data << int32(corpsemapid);
SendPacket(&data);
}
diff --git a/src/game/QuestDef.cpp b/src/game/QuestDef.cpp
index e56a3a4c982..4dd202bc344 100644
--- a/src/game/QuestDef.cpp
+++ b/src/game/QuestDef.cpp
@@ -44,90 +44,88 @@ Quest::Quest(Field * questRecord)
QuestFlags = questRecord[17].GetUInt16();
uint32 SpecialFlags = questRecord[18].GetUInt16();
CharTitleId = questRecord[19].GetUInt32();
- PlayersSlain = questRecord[20].GetUInt32();
- BonusTalents = questRecord[21].GetUInt32();
- PrevQuestId = questRecord[22].GetInt32();
- NextQuestId = questRecord[23].GetInt32();
- ExclusiveGroup = questRecord[24].GetInt32();
- NextQuestInChain = questRecord[25].GetUInt32();
- SrcItemId = questRecord[26].GetUInt32();
- SrcItemCount = questRecord[27].GetUInt32();
- SrcSpell = questRecord[28].GetUInt32();
- Title = questRecord[29].GetCppString();
- Details = questRecord[30].GetCppString();
- Objectives = questRecord[31].GetCppString();
- OfferRewardText = questRecord[32].GetCppString();
- RequestItemsText = questRecord[33].GetCppString();
- EndText = questRecord[34].GetCppString();
+ PrevQuestId = questRecord[20].GetInt32();
+ NextQuestId = questRecord[21].GetInt32();
+ ExclusiveGroup = questRecord[22].GetInt32();
+ NextQuestInChain = questRecord[23].GetUInt32();
+ SrcItemId = questRecord[24].GetUInt32();
+ SrcItemCount = questRecord[25].GetUInt32();
+ SrcSpell = questRecord[26].GetUInt32();
+ Title = questRecord[27].GetCppString();
+ Details = questRecord[28].GetCppString();
+ Objectives = questRecord[29].GetCppString();
+ OfferRewardText = questRecord[30].GetCppString();
+ RequestItemsText = questRecord[31].GetCppString();
+ EndText = questRecord[32].GetCppString();
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
- ObjectiveText[i] = questRecord[35+i].GetCppString();
+ ObjectiveText[i] = questRecord[33+i].GetCppString();
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
- ReqItemId[i] = questRecord[39+i].GetUInt32();
+ ReqItemId[i] = questRecord[37+i].GetUInt32();
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
- ReqItemCount[i] = questRecord[43+i].GetUInt32();
+ ReqItemCount[i] = questRecord[41+i].GetUInt32();
for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
- ReqSourceId[i] = questRecord[47+i].GetUInt32();
+ ReqSourceId[i] = questRecord[45+i].GetUInt32();
for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
- ReqSourceCount[i] = questRecord[51+i].GetUInt32();
+ ReqSourceCount[i] = questRecord[49+i].GetUInt32();
for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
- ReqSourceRef[i] = questRecord[55+i].GetUInt32();
+ ReqSourceRef[i] = questRecord[53+i].GetUInt32();
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
- ReqCreatureOrGOId[i] = questRecord[59+i].GetInt32();
+ ReqCreatureOrGOId[i] = questRecord[57+i].GetInt32();
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
- ReqCreatureOrGOCount[i] = questRecord[63+i].GetUInt32();
+ ReqCreatureOrGOCount[i] = questRecord[61+i].GetUInt32();
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
- ReqSpell[i] = questRecord[67+i].GetUInt32();
+ ReqSpell[i] = questRecord[65+i].GetUInt32();
for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
- RewChoiceItemId[i] = questRecord[71+i].GetUInt32();
+ RewChoiceItemId[i] = questRecord[69+i].GetUInt32();
for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
- RewChoiceItemCount[i] = questRecord[77+i].GetUInt32();
+ RewChoiceItemCount[i] = questRecord[75+i].GetUInt32();
for (int i = 0; i < QUEST_REWARDS_COUNT; ++i)
- RewItemId[i] = questRecord[83+i].GetUInt32();
+ RewItemId[i] = questRecord[81+i].GetUInt32();
for (int i = 0; i < QUEST_REWARDS_COUNT; ++i)
- RewItemCount[i] = questRecord[87+i].GetUInt32();
+ RewItemCount[i] = questRecord[85+i].GetUInt32();
for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
- RewRepFaction[i] = questRecord[91+i].GetUInt32();
+ RewRepFaction[i] = questRecord[89+i].GetUInt32();
for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
- RewRepValue[i] = questRecord[96+i].GetInt32();
-
- RewHonorableKills = questRecord[101].GetUInt32();
- RewOrReqMoney = questRecord[102].GetInt32();
- RewMoneyMaxLevel = questRecord[103].GetUInt32();
- RewSpell = questRecord[104].GetUInt32();
- RewSpellCast = questRecord[105].GetUInt32();
- RewMailTemplateId = questRecord[106].GetUInt32();
- RewMailDelaySecs = questRecord[107].GetUInt32();
- PointMapId = questRecord[108].GetUInt32();
- PointX = questRecord[109].GetFloat();
- PointY = questRecord[110].GetFloat();
- PointOpt = questRecord[111].GetUInt32();
+ RewRepValue[i] = questRecord[94+i].GetInt32();
+
+ RewHonorableKills = questRecord[99].GetUInt32();
+ RewOrReqMoney = questRecord[100].GetInt32();
+ RewMoneyMaxLevel = questRecord[101].GetUInt32();
+ RewSpell = questRecord[102].GetUInt32();
+ RewSpellCast = questRecord[103].GetUInt32();
+ RewMailTemplateId = questRecord[104].GetUInt32();
+ RewMailDelaySecs = questRecord[105].GetUInt32();
+ PointMapId = questRecord[106].GetUInt32();
+ PointX = questRecord[107].GetFloat();
+ PointY = questRecord[108].GetFloat();
+ PointOpt = questRecord[109].GetUInt32();
for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
- DetailsEmote[i] = questRecord[112+i].GetUInt32();
+ DetailsEmote[i] = questRecord[110+i].GetUInt32();
- IncompleteEmote = questRecord[116].GetUInt32();
- CompleteEmote = questRecord[117].GetUInt32();
+ IncompleteEmote = questRecord[114].GetUInt32();
+ CompleteEmote = questRecord[115].GetUInt32();
for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
- OfferRewardEmote[i] = questRecord[118+i].GetInt32();
+ OfferRewardEmote[i] = questRecord[116+i].GetInt32();
- QuestStartScript = questRecord[122].GetUInt32();
- QuestCompleteScript = questRecord[123].GetUInt32();
+ QuestStartScript = questRecord[120].GetUInt32();
+ QuestCompleteScript = questRecord[121].GetUInt32();
QuestFlags |= SpecialFlags << 16;
diff --git a/src/game/QuestDef.h b/src/game/QuestDef.h
index 1904cbe08a8..52f58c2c87e 100644
--- a/src/game/QuestDef.h
+++ b/src/game/QuestDef.h
@@ -44,33 +44,30 @@ class ObjectMgr;
enum QuestFailedReasons
{
INVALIDREASON_DONT_HAVE_REQ = 0,
- INVALIDREASON_QUEST_FAILED_LOW_LEVEL = 1, // You are not high enough level for that quest.
- INVALIDREASON_QUEST_FAILED_WRONG_RACE = 6, // That quest is not available to your race.
- INVALIDREASON_QUEST_ALREADY_DONE = 7, // You have completed that quest.
- INVALIDREASON_QUEST_ONLY_ONE_TIMED = 12, // You can only be on one timed quest at a time.
- INVALIDREASON_QUEST_ALREADY_ON = 13, // You are already on that quest.
- INVALIDREASON_QUEST_FAILED_EXPANSION = 16, // This quest requires an expansion enabled account.
- INVALIDREASON_QUEST_ALREADY_ON2 = 18, // You are already on that quest.
- INVALIDREASON_QUEST_FAILED_MISSING_ITEMS = 21, // You don't have the required items with you. Check storage.
- INVALIDREASON_QUEST_FAILED_NOT_ENOUGH_MONEY = 23, // You don't have enough money for that quest.
- INVALIDREASON_DAILY_QUESTS_REMAINING = 26, // You have already completed 25 daily quests today.
- INVALIDREASON_QUEST_FAILED_CAIS = 27, // You cannot complete quests once you have reached tired time.
- INVALIDREASON_DAILY_QUEST_COMPLETED_TODAY = 29 // You have completed that daily quest today.
+ INVALIDREASON_QUEST_FAILED_LOW_LEVEL = 1, //You are not high enough level for that quest.
+ INVALIDREASON_QUEST_FAILED_WRONG_RACE = 6, //That quest is not available to your race.
+ INVALIDREASON_QUEST_ALREADY_DONE = 7, //You have completed that quest.
+ INVALIDREASON_QUEST_ONLY_ONE_TIMED = 12, //You can only be on one timed quest at a time.
+ INVALIDREASON_QUEST_ALREADY_ON = 13, //You are already on that quest
+ INVALIDREASON_QUEST_FAILED_EXPANSION = 16, //This quest requires an expansion enabled account.
+ INVALIDREASON_QUEST_ALREADY_ON2 = 18, //You are already on that quest
+ INVALIDREASON_QUEST_FAILED_MISSING_ITEMS = 21, //You don't have the required items with you. Check storage.
+ INVALIDREASON_QUEST_FAILED_NOT_ENOUGH_MONEY = 23, //You don't have enough money for that quest.
+ INVALIDREASON_DAILY_QUESTS_REMAINING = 26, //You have already completed 10 daily quests today
+ INVALIDREASON_QUEST_FAILED_CAIS = 27, //You cannot complete quests once you have reached tired time
};
enum QuestShareMessages
{
- QUEST_PARTY_MSG_SHARING_QUEST = 0,
- QUEST_PARTY_MSG_CANT_TAKE_QUEST = 1,
- QUEST_PARTY_MSG_ACCEPT_QUEST = 2,
- QUEST_PARTY_MSG_DECLINE_QUEST = 3,
- QUEST_PARTY_MSG_BUSY = 4,
- QUEST_PARTY_MSG_LOG_FULL = 5,
- QUEST_PARTY_MSG_HAVE_QUEST = 6,
- QUEST_PARTY_MSG_FINISH_QUEST = 7,
- QUEST_PARTY_MSG_CANT_BE_SHARED_TODAY = 8,
- QUEST_PARTY_MSG_SHARING_TIMER_EXPIRED = 9,
- QUEST_PARTY_MSG_NOT_IN_PARTY = 10
+ QUEST_PARTY_MSG_SHARING_QUEST = 0,
+ QUEST_PARTY_MSG_CANT_TAKE_QUEST = 1,
+ QUEST_PARTY_MSG_ACCEPT_QUEST = 2,
+ QUEST_PARTY_MSG_REFUSE_QUEST = 3,
+ QUEST_PARTY_MSG_TOO_FAR = 4,
+ QUEST_PARTY_MSG_BUSY = 5,
+ QUEST_PARTY_MSG_LOG_FULL = 6,
+ QUEST_PARTY_MSG_HAVE_QUEST = 7,
+ QUEST_PARTY_MSG_FINISH_QUEST = 8,
};
enum __QuestTradeSkill
@@ -193,8 +190,6 @@ class Quest
int32 GetExclusiveGroup() const { return ExclusiveGroup; }
uint32 GetNextQuestInChain() const { return NextQuestInChain; }
uint32 GetCharTitleId() const { return CharTitleId; }
- uint32 GetPlayersSlain() const { return PlayersSlain; }
- uint32 GetBonusTalents() const { return BonusTalents; }
uint32 GetSrcItemId() const { return SrcItemId; }
uint32 GetSrcItemCount() const { return SrcItemCount; }
uint32 GetSrcSpell() const { return SrcSpell; }
@@ -282,8 +277,6 @@ class Quest
uint32 LimitTime;
uint32 QuestFlags;
uint32 CharTitleId;
- uint32 PlayersSlain;
- uint32 BonusTalents;
int32 PrevQuestId;
int32 NextQuestId;
int32 ExclusiveGroup;
diff --git a/src/game/QuestHandler.cpp b/src/game/QuestHandler.cpp
index 784a2affbc0..abb285e6dbb 100644
--- a/src/game/QuestHandler.cpp
+++ b/src/game/QuestHandler.cpp
@@ -451,6 +451,12 @@ void WorldSession::HandleQuestPushToParty(WorldPacket& recvPacket)
_player->SendPushToPartyResponse(pPlayer, QUEST_PARTY_MSG_SHARING_QUEST);
+ if( _player->GetDistance( pPlayer ) > 10 )
+ {
+ _player->SendPushToPartyResponse( pPlayer, QUEST_PARTY_MSG_TOO_FAR );
+ continue;
+ }
+
if( !pPlayer->SatisfyQuestStatus( pQuest, false ) )
{
_player->SendPushToPartyResponse( pPlayer, QUEST_PARTY_MSG_HAVE_QUEST );
diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h
index 7a79a54e419..bf23a724520 100644
--- a/src/game/SharedDefines.h
+++ b/src/game/SharedDefines.h
@@ -88,8 +88,7 @@ enum Classes
#define CLASSMASK_ALL_PLAYABLE \
((1<<(CLASS_WARRIOR-1))|(1<<(CLASS_PALADIN-1))|(1<<(CLASS_HUNTER-1))| \
(1<<(CLASS_ROGUE-1)) |(1<<(CLASS_PRIEST-1)) |(1<<(CLASS_SHAMAN-1))| \
- (1<<(CLASS_MAGE-1)) |(1<<(CLASS_WARLOCK-1))|(1<<(CLASS_DRUID-1)) | \
- (1<<(CLASS_DEATH_KNIGHT-1)) )
+ (1<<(CLASS_MAGE-1)) |(1<<(CLASS_WARLOCK-1))|(1<<(CLASS_DRUID-1)) )
#define CLASSMASK_WAND_USERS ((1<<(CLASS_PRIEST-1))|(1<<(CLASS_MAGE-1))|(1<<(CLASS_WARLOCK-1)))
@@ -135,12 +134,11 @@ enum Powers
POWER_FOCUS = 2,
POWER_ENERGY = 3,
POWER_HAPPINESS = 4,
- POWER_RUNE = 5,
- POWER_RUNIC_POWER = 6,
+ POWER_RUNES = 5,
POWER_HEALTH = 0xFFFFFFFE // (-2 as signed value)
};
-#define MAX_POWERS 7
+#define MAX_POWERS 5 // not count POWER_RUNES for now
enum SpellSchools
{
@@ -201,11 +199,10 @@ enum ItemQualities
ITEM_QUALITY_RARE = 3, //BLUE
ITEM_QUALITY_EPIC = 4, //PURPLE
ITEM_QUALITY_LEGENDARY = 5, //ORANGE
- ITEM_QUALITY_ARTIFACT = 6, //LIGHT YELLOW
- ITEM_QUALITY_HEIRLOOM = 7
+ ITEM_QUALITY_ARTIFACT = 6 //LIGHT YELLOW
};
-#define MAX_ITEM_QUALITY 8
+#define MAX_ITEM_QUALITY 7
enum SpellCategory
{
@@ -220,7 +217,7 @@ enum SpellCategory
#define SPELL_ATTR_UNK0 0x00000001 // 0
#define SPELL_ATTR_RANGED 0x00000002 // 1 All ranged abilities have this flag
#define SPELL_ATTR_ON_NEXT_SWING_1 0x00000004 // 2 on next swing
-#define SPELL_ATTR_UNK3 0x00000008 // 3 not set in 3.0.3
+#define SPELL_ATTR_UNK3 0x00000008 // 3 not set in 2.4.2
#define SPELL_ATTR_UNK4 0x00000010 // 4
#define SPELL_ATTR_UNK5 0x00000020 // 5 trade spells?
#define SPELL_ATTR_PASSIVE 0x00000040 // 6 Passive spell
@@ -275,7 +272,7 @@ enum SpellCategory
#define SPELL_ATTR_EX_REQ_COMBO_POINTS2 0x00400000 // 22 Req combo points on target
#define SPELL_ATTR_EX_UNK23 0x00800000 // 23
#define SPELL_ATTR_EX_UNK24 0x01000000 // 24 Req fishing pole??
-#define SPELL_ATTR_EX_UNK25 0x02000000 // 25
+#define SPELL_ATTR_EX_UNK25 0x02000000 // 25 not set in 2.4.2
#define SPELL_ATTR_EX_UNK26 0x04000000 // 26
#define SPELL_ATTR_EX_UNK27 0x08000000 // 27
#define SPELL_ATTR_EX_UNK28 0x10000000 // 28
@@ -291,14 +288,14 @@ enum SpellCategory
#define SPELL_ATTR_EX2_UNK5 0x00000020 // 5
#define SPELL_ATTR_EX2_UNK6 0x00000040 // 6
#define SPELL_ATTR_EX2_UNK7 0x00000080 // 7
-#define SPELL_ATTR_EX2_UNK8 0x00000100 // 8 not set in 3.0.3
+#define SPELL_ATTR_EX2_UNK8 0x00000100 // 8 not set in 2.4.2
#define SPELL_ATTR_EX2_UNK9 0x00000200 // 9
#define SPELL_ATTR_EX2_UNK10 0x00000400 // 10
#define SPELL_ATTR_EX2_HEALTH_FUNNEL 0x00000800 // 11
#define SPELL_ATTR_EX2_UNK12 0x00001000 // 12
#define SPELL_ATTR_EX2_UNK13 0x00002000 // 13
#define SPELL_ATTR_EX2_UNK14 0x00004000 // 14
-#define SPELL_ATTR_EX2_UNK15 0x00008000 // 15 not set in 3.0.3
+#define SPELL_ATTR_EX2_UNK15 0x00008000 // 15 not set in 2.4.2
#define SPELL_ATTR_EX2_TAME_BEAST 0x00010000 // 16
#define SPELL_ATTR_EX2_NOT_RESET_AUTOSHOT 0x00020000 // 17 Hunters Shot and Stings only have this flag
#define SPELL_ATTR_EX2_UNK18 0x00040000 // 18 Only Revive pet - possible req dead pet
@@ -416,37 +413,37 @@ enum SpellCategory
#define SPELL_ATTR_EX5_UNK31 0x80000000 // 31 Forces all nearby enemies to focus attacks caster
#define SPELL_ATTR_EX6_UNK0 0x00000001 // 0 Only Move spell have this flag
-#define SPELL_ATTR_EX6_UNK1 0x00000002 // 1 not set in 3.0.3
+#define SPELL_ATTR_EX6_UNK1 0x00000002 // 1 not set in 2.4.2
#define SPELL_ATTR_EX6_UNK2 0x00000004 // 2
#define SPELL_ATTR_EX6_UNK3 0x00000008 // 3
-#define SPELL_ATTR_EX6_UNK4 0x00000010 // 4
+#define SPELL_ATTR_EX6_UNK4 0x00000010 // 4 not set in 2.4.2
#define SPELL_ATTR_EX6_UNK5 0x00000020 // 5
#define SPELL_ATTR_EX6_UNK6 0x00000040 // 6
#define SPELL_ATTR_EX6_UNK7 0x00000080 // 7
#define SPELL_ATTR_EX6_UNK8 0x00000100 // 8
-#define SPELL_ATTR_EX6_UNK9 0x00000200 // 9
+#define SPELL_ATTR_EX6_UNK9 0x00000200 // 9 not set in 2.4.2
#define SPELL_ATTR_EX6_UNK10 0x00000400 // 10
#define SPELL_ATTR_EX6_UNK11 0x00000800 // 11
-#define SPELL_ATTR_EX6_UNK12 0x00001000 // 12
-#define SPELL_ATTR_EX6_UNK13 0x00002000 // 13
-#define SPELL_ATTR_EX6_UNK14 0x00004000 // 14
-#define SPELL_ATTR_EX6_UNK15 0x00008000 // 15 not set in 3.0.3
-#define SPELL_ATTR_EX6_UNK16 0x00010000 // 16
-#define SPELL_ATTR_EX6_UNK17 0x00020000 // 17
-#define SPELL_ATTR_EX6_UNK18 0x00040000 // 18
-#define SPELL_ATTR_EX6_UNK19 0x00080000 // 19
-#define SPELL_ATTR_EX6_UNK20 0x00100000 // 20
-#define SPELL_ATTR_EX6_UNK21 0x00200000 // 21
-#define SPELL_ATTR_EX6_UNK22 0x00400000 // 22
-#define SPELL_ATTR_EX6_UNK23 0x00800000 // 23 not set in 3.0.3
-#define SPELL_ATTR_EX6_UNK24 0x01000000 // 24 not set in 3.0.3
-#define SPELL_ATTR_EX6_UNK25 0x02000000 // 25 not set in 3.0.3
-#define SPELL_ATTR_EX6_UNK26 0x04000000 // 26 not set in 3.0.3
-#define SPELL_ATTR_EX6_UNK27 0x08000000 // 27 not set in 3.0.3
-#define SPELL_ATTR_EX6_UNK28 0x10000000 // 28 not set in 3.0.3
-#define SPELL_ATTR_EX6_UNK29 0x20000000 // 29 not set in 3.0.3
-#define SPELL_ATTR_EX6_UNK30 0x40000000 // 30 not set in 3.0.3
-#define SPELL_ATTR_EX6_UNK31 0x80000000 // 31 not set in 3.0.3
+#define SPELL_ATTR_EX6_UNK12 0x00001000 // 12 not set in 2.4.2
+#define SPELL_ATTR_EX6_UNK13 0x00002000 // 13 not set in 2.4.2
+#define SPELL_ATTR_EX6_UNK14 0x00004000 // 14 not set in 2.4.2
+#define SPELL_ATTR_EX6_UNK15 0x00008000 // 15 not set in 2.4.2
+#define SPELL_ATTR_EX6_UNK16 0x00010000 // 16 not set in 2.4.2
+#define SPELL_ATTR_EX6_UNK17 0x00020000 // 17 not set in 2.4.2
+#define SPELL_ATTR_EX6_UNK18 0x00040000 // 18 not set in 2.4.2
+#define SPELL_ATTR_EX6_UNK19 0x00080000 // 19 not set in 2.4.2
+#define SPELL_ATTR_EX6_UNK20 0x00100000 // 20 not set in 2.4.2
+#define SPELL_ATTR_EX6_UNK21 0x00200000 // 21 not set in 2.4.2
+#define SPELL_ATTR_EX6_UNK22 0x00400000 // 22 not set in 2.4.2
+#define SPELL_ATTR_EX6_UNK23 0x00800000 // 23 not set in 2.4.2
+#define SPELL_ATTR_EX6_UNK24 0x01000000 // 24 not set in 2.4.2
+#define SPELL_ATTR_EX6_UNK25 0x02000000 // 25 not set in 2.4.2
+#define SPELL_ATTR_EX6_UNK26 0x04000000 // 26 not set in 2.4.2
+#define SPELL_ATTR_EX6_UNK27 0x08000000 // 27 not set in 2.4.2
+#define SPELL_ATTR_EX6_UNK28 0x10000000 // 28 not set in 2.4.2
+#define SPELL_ATTR_EX6_UNK29 0x20000000 // 29 not set in 2.4.2
+#define SPELL_ATTR_EX6_UNK30 0x40000000 // 30 not set in 2.4.2
+#define SPELL_ATTR_EX6_UNK31 0x80000000 // 31 not set in 2.4.2
enum SheathTypes
{
@@ -569,7 +566,7 @@ enum SpellEffects
SPELL_EFFECT_SUMMON_GUARDIAN = 42,
SPELL_EFFECT_TELEPORT_UNITS_FACE_CASTER= 43,
SPELL_EFFECT_SKILL_STEP = 44,
- SPELL_EFFECT_ADD_HONOR = 45,
+ SPELL_EFFECT_UNDEFINED_45 = 45,
SPELL_EFFECT_SPAWN = 46,
SPELL_EFFECT_TRADE_SKILL = 47,
SPELL_EFFECT_STEALTH = 48,
@@ -589,16 +586,16 @@ enum SpellEffects
SPELL_EFFECT_POWER_BURN = 62,
SPELL_EFFECT_THREAT = 63,
SPELL_EFFECT_TRIGGER_SPELL = 64,
- SPELL_EFFECT_APPLY_AREA_AURA_RAID = 65,
- SPELL_EFFECT_CREATE_MANA_GEM = 66,
+ SPELL_EFFECT_HEALTH_FUNNEL = 65,
+ SPELL_EFFECT_POWER_FUNNEL = 66,
SPELL_EFFECT_HEAL_MAX_HEALTH = 67,
SPELL_EFFECT_INTERRUPT_CAST = 68,
SPELL_EFFECT_DISTRACT = 69,
SPELL_EFFECT_PULL = 70,
SPELL_EFFECT_PICKPOCKET = 71,
SPELL_EFFECT_ADD_FARSIGHT = 72,
- SPELL_EFFECT_UNTRAIN_TALENTS = 73,
- SPELL_EFFECT_APPLY_GLYPH = 74,
+ SPELL_EFFECT_SUMMON_POSSESSED = 73,
+ SPELL_EFFECT_SUMMON_TOTEM = 74,
SPELL_EFFECT_HEAL_MECHANICAL = 75,
SPELL_EFFECT_SUMMON_OBJECT_WILD = 76,
SPELL_EFFECT_SCRIPT_EFFECT = 77,
@@ -611,10 +608,10 @@ enum SpellEffects
SPELL_EFFECT_STUCK = 84,
SPELL_EFFECT_SUMMON_PLAYER = 85,
SPELL_EFFECT_ACTIVATE_OBJECT = 86,
- SPELL_EFFECT_WMO_DAMAGE = 87,
- SPELL_EFFECT_WMO_REPAIR = 88,
- SPELL_EFFECT_WMO_CHANGE = 89,
- SPELL_EFFECT_KILL_CREDIT = 90,
+ SPELL_EFFECT_SUMMON_TOTEM_SLOT1 = 87,
+ SPELL_EFFECT_SUMMON_TOTEM_SLOT2 = 88,
+ SPELL_EFFECT_SUMMON_TOTEM_SLOT3 = 89,
+ SPELL_EFFECT_SUMMON_TOTEM_SLOT4 = 90,
SPELL_EFFECT_THREAT_ALL = 91,
SPELL_EFFECT_ENCHANT_HELD_ITEM = 92,
SPELL_EFFECT_SUMMON_PHANTASM = 93, //unused
@@ -658,19 +655,19 @@ enum SpellEffects
SPELL_EFFECT_131 = 131,
SPELL_EFFECT_132 = 132,
SPELL_EFFECT_UNLEARN_SPECIALIZATION = 133,
- SPELL_EFFECT_KILL_CREDIT2 = 134,
+ SPELL_EFFECT_KILL_CREDIT = 134,
SPELL_EFFECT_135 = 135,
SPELL_EFFECT_HEAL_PCT = 136,
SPELL_EFFECT_ENERGIZE_PCT = 137,
SPELL_EFFECT_138 = 138,
- SPELL_EFFECT_CLEAR_QUEST = 139,
+ SPELL_EFFECT_139 = 139,
SPELL_EFFECT_FORCE_CAST = 140,
SPELL_EFFECT_141 = 141,
SPELL_EFFECT_TRIGGER_SPELL_WITH_VALUE = 142,
SPELL_EFFECT_APPLY_AREA_AURA_OWNER = 143,
SPELL_EFFECT_144 = 144,
SPELL_EFFECT_145 = 145,
- SPELL_EFFECT_ACTIVATE_RUNE = 146,
+ SPELL_EFFECT_146 = 146,
SPELL_EFFECT_QUEST_FAIL = 147,
SPELL_EFFECT_148 = 148,
SPELL_EFFECT_149 = 149,
@@ -678,13 +675,7 @@ enum SpellEffects
SPELL_EFFECT_TRIGGER_SPELL_2 = 151,
SPELL_EFFECT_152 = 152,
SPELL_EFFECT_153 = 153,
- SPELL_EFFECT_154 = 154,
- SPELL_EFFECT_TITAN_GRIP = 155,
- SPELL_EFFECT_ADD_SOCKET = 156,
- SPELL_EFFECT_157 = 157,
- SPELL_EFFECT_MILLING = 158,
- SPELL_EFFECT_ALLOW_RENAME_PET = 159,
- TOTAL_SPELL_EFFECTS = 160
+ TOTAL_SPELL_EFFECTS = 154
};
// Spell aura states
@@ -712,8 +703,7 @@ enum AuraState
AURA_STATE_DEADLY_POISON = 16, // T |
AURA_STATE_FORBEARANCE = 17, // c t|
AURA_STATE_WEAKENED_SOUL = 18, // t|
- AURA_STATE_HYPOTHERMIA = 19, // c |
- AURA_STATE_HEALTH_ABOVE_75_PERCENT = 23, // C | not implemented yet
+ AURA_STATE_HYPOTHERMIA = 19 // c |
};
// Spell mechanics
@@ -721,11 +711,11 @@ enum Mechanics
{
MECHANIC_NONE = 0,
MECHANIC_CHARM = 1,
- MECHANIC_DISORIENTED = 2,
+ MECHANIC_CONFUSED = 2,
MECHANIC_DISARM = 3,
MECHANIC_DISTRACT = 4,
MECHANIC_FEAR = 5,
- MECHANIC_GRIP = 6,
+ MECHANIC_FUMBLE = 6,
MECHANIC_ROOT = 7,
MECHANIC_PACIFY = 8, //0 spells use this mechanic
MECHANIC_SILENCE = 9,
@@ -741,7 +731,7 @@ enum Mechanics
MECHANIC_SHIELD = 19,
MECHANIC_SHACKLE = 20,
MECHANIC_MOUNT = 21,
- MECHANIC_INFECTED = 22,
+ MECHANIC_PERSUADE = 22, //0 spells use this mechanic
MECHANIC_TURN = 23,
MECHANIC_HORROR = 24,
MECHANIC_INVULNERABILITY = 25,
@@ -749,13 +739,12 @@ enum Mechanics
MECHANIC_DAZE = 27,
MECHANIC_DISCOVERY = 28,
MECHANIC_IMMUNE_SHIELD = 29, // Divine (Blessing) Shield/Protection and Ice Block
- MECHANIC_SAPPED = 30,
- MECHANIC_ENRAGED = 31
+ MECHANIC_SAPPED = 30
};
// Used for spell 42292 Immune Movement Impairment and Loss of Control (0x49967da6)
#define IMMUNE_TO_MOVEMENT_IMPAIRMENT_AND_LOSS_CONTROL_MASK ( \
- (1<<MECHANIC_CHARM )|(1<<MECHANIC_DISORIENTED )|(1<<MECHANIC_FEAR )| \
+ (1<<MECHANIC_CHARM )|(1<<MECHANIC_CONFUSED )|(1<<MECHANIC_FEAR )| \
(1<<MECHANIC_ROOT )|(1<<MECHANIC_PACIFY )|(1<<MECHANIC_SLEEP )| \
(1<<MECHANIC_SNARE )|(1<<MECHANIC_STUN )|(1<<MECHANIC_FREEZE)| \
(1<<MECHANIC_KNOCKOUT)|(1<<MECHANIC_POLYMORPH)|(1<<MECHANIC_BANISH)| \
@@ -775,8 +764,7 @@ enum DispelType
DISPEL_ALL = 7,
DISPEL_SPE_NPC_ONLY = 8,
DISPEL_ENRAGE = 9,
- DISPEL_ZG_TICKET = 10,
- DESPEL_OLD_UNUSED = 11
+ DISPEL_ZG_TICKET = 10
};
#define DISPEL_ALL_MASK ( (1<<DISPEL_MAGIC) | (1<<DISPEL_CURSE) | (1<<DISPEL_DISEASE) | (1<<DISPEL_POISON) )
@@ -990,10 +978,9 @@ enum GameobjectTypes
GAMEOBJECT_TYPE_BARBER_CHAIR = 32,
GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING = 33,
GAMEOBJECT_TYPE_GUILD_BANK = 34,
- GAMEOBJECT_TYPE_TRAPDOOR = 35
};
-#define MAX_GAMEOBJECT_TYPE 36 // sending to client this or greater value can crash client.
+#define MAX_GAMEOBJECT_TYPE 35 // sending to client this or greater value can crash client.
#define GAMEOBJECT_FISHINGNODE_ENTRY 35591 // Better to define it somewhere instead of hardcoding everywhere
@@ -1560,9 +1547,7 @@ enum LockType
LOCKTYPE_BLASTING = 16,
LOCKTYPE_SLOW_OPEN = 17,
LOCKTYPE_SLOW_CLOSE = 18,
- LOCKTYPE_FISHING = 19,
- LOCKTYPE_INSCRIPTION = 20,
- LOCKTYPE_OPEN_FROM_VEHICLE = 21
+ LOCKTYPE_FISHING = 19
};
enum TrainerType // this is important type for npcs!
@@ -1616,7 +1601,7 @@ enum CreatureFamily
CREATURE_FAMILY_IMP = 23,
CREATURE_FAMILY_BAT = 24,
CREATURE_FAMILY_HYENA = 25,
- CREATURE_FAMILY_BIRD_OF_PREY = 26,
+ CREATURE_FAMILY_OWL = 26,
CREATURE_FAMILY_WIND_SERPENT = 27,
CREATURE_FAMILY_REMOTE_CONTROL = 28,
CREATURE_FAMILY_FELGUARD = 29,
@@ -1626,16 +1611,7 @@ enum CreatureFamily
CREATURE_FAMILY_SPOREBAT = 33,
CREATURE_FAMILY_NETHER_RAY = 34,
CREATURE_FAMILY_SERPENT = 35,
- CREATURE_FAMILY_MOTH = 37,
- CREATURE_FAMILY_CHIMAERA = 38,
- CREATURE_FAMILY_DEVILSAUR = 39,
- CREATURE_FAMILY_GHOUL = 40,
- CREATURE_FAMILY_SILITHID = 41,
- CREATURE_FAMILY_WORM = 42,
- CREATURE_FAMILY_RHINO = 43,
- CREATURE_FAMILY_WASP = 44,
- CREATURE_FAMILY_CORE_HOUND = 45,
- CREATURE_FAMILY_SPIRIT_BEAST = 46
+ CREATURE_FAMILY_SEA_LION = 36
};
enum CreatureTypeFlags
@@ -1667,8 +1643,6 @@ enum QuestTypes
QUEST_TYPE_LEGENDARY = 83,
QUEST_TYPE_ESCORT = 84,
QUEST_TYPE_HEROIC = 85,
- QUEST_TYPE_RAID_10 = 88,
- QUEST_TYPE_RAID_25 = 89
};
// values based at QuestSort.dbc
@@ -1679,7 +1653,7 @@ enum QuestSort
QUEST_SORT_SEASONAL = 22,
QUEST_SORT_UNDERCITY_OLD = 23,
QUEST_SORT_HERBALISM = 24,
- QUEST_SORT_BATTLEGROUNDS = 25,
+ QUEST_SORT_SCARLET_MONASTERY_OLD= 25,
QUEST_SORT_ULDAMN_OLD = 41,
QUEST_SORT_WARLOCK = 61,
QUEST_SORT_WARRIOR = 81,
@@ -1708,26 +1682,22 @@ enum QuestSort
QUEST_SORT_REPUTATION = 367,
QUEST_SORT_INVASION = 368,
QUEST_SORT_MIDSUMMER = 369,
- QUEST_SORT_BREWFEST = 370,
- QUEST_SORT_INSCRIPTION = 371,
- QUEST_SORT_DEATH_KNIGHT = 372,
- QUEST_SORT_JEWELCRAFTING = 373
+ QUEST_SORT_BREWFEST = 370
};
inline uint8 ClassByQuestSort(int32 QuestSort)
{
switch(QuestSort)
{
- case QUEST_SORT_WARLOCK: return CLASS_WARLOCK;
- case QUEST_SORT_WARRIOR: return CLASS_WARRIOR;
- case QUEST_SORT_SHAMAN: return CLASS_SHAMAN;
- case QUEST_SORT_PALADIN: return CLASS_PALADIN;
- case QUEST_SORT_MAGE: return CLASS_MAGE;
- case QUEST_SORT_ROGUE: return CLASS_ROGUE;
- case QUEST_SORT_HUNTER: return CLASS_HUNTER;
- case QUEST_SORT_PRIEST: return CLASS_PRIEST;
- case QUEST_SORT_DRUID: return CLASS_DRUID;
- case QUEST_SORT_DEATH_KNIGHT: return CLASS_DEATH_KNIGHT;
+ case QUEST_SORT_WARLOCK: return CLASS_WARLOCK;
+ case QUEST_SORT_WARRIOR: return CLASS_WARRIOR;
+ case QUEST_SORT_SHAMAN: return CLASS_SHAMAN;
+ case QUEST_SORT_PALADIN: return CLASS_PALADIN;
+ case QUEST_SORT_MAGE: return CLASS_MAGE;
+ case QUEST_SORT_ROGUE: return CLASS_ROGUE;
+ case QUEST_SORT_HUNTER: return CLASS_HUNTER;
+ case QUEST_SORT_PRIEST: return CLASS_PRIEST;
+ case QUEST_SORT_DRUID: return CLASS_DRUID;
}
return 0;
}
@@ -1739,6 +1709,7 @@ enum SkillType
SKILL_ARMS = 26,
SKILL_COMBAT = 38,
SKILL_SUBTLETY = 39,
+ SKILL_POISONS = 40,
SKILL_SWORDS = 43,
SKILL_AXES = 44,
SKILL_BOWS = 45,
@@ -1746,8 +1717,8 @@ enum SkillType
SKILL_BEAST_MASTERY = 50,
SKILL_SURVIVAL = 51,
SKILL_MACES = 54,
- SKILL_2H_SWORDS = 55,
SKILL_HOLY = 56,
+ SKILL_2H_SWORDS = 55,
SKILL_SHADOW = 78,
SKILL_DEFENSE = 95,
SKILL_LANG_COMMON = 98,
@@ -1803,20 +1774,24 @@ enum SkillType
SKILL_PET_BOAR = 211,
SKILL_PET_CROCILISK = 212,
SKILL_PET_CARRION_BIRD = 213,
- SKILL_PET_CRAB = 214,
SKILL_PET_GORILLA = 215,
+ SKILL_PET_CRAB = 214,
SKILL_PET_RAPTOR = 217,
SKILL_PET_TALLSTRIDER = 218,
SKILL_RACIAL_UNDED = 220,
+ SKILL_WEAPON_TALENTS = 222,
SKILL_CROSSBOWS = 226,
+ SKILL_SPEARS = 227,
SKILL_WANDS = 228,
SKILL_POLEARMS = 229,
SKILL_PET_SCORPID = 236,
SKILL_ARCANE = 237,
+ SKILL_OPEN_LOCK = 242,
SKILL_PET_TURTLE = 251,
SKILL_ASSASSINATION = 253,
SKILL_FURY = 256,
SKILL_PROTECTION = 257,
+ SKILL_BEAST_TRAINING = 261,
SKILL_PROTECTION2 = 267,
SKILL_PET_TALENTS = 270,
SKILL_PLATE_MAIL = 293,
@@ -1846,7 +1821,7 @@ enum SkillType
SKILL_LOCKPICKING = 633,
SKILL_PET_BAT = 653,
SKILL_PET_HYENA = 654,
- SKILL_PET_BIRD_OF_PREY = 655,
+ SKILL_PET_OWL = 655,
SKILL_PET_WIND_SERPENT = 656,
SKILL_LANG_GUTTERSPEAK = 673,
SKILL_RIDING_KODO = 713,
@@ -1866,27 +1841,10 @@ enum SkillType
SKILL_PET_WARP_STALKER = 766,
SKILL_PET_RAVAGER = 767,
SKILL_PET_SERPENT = 768,
- SKILL_INTERNAL = 769,
- SKILL_DK_BLOOD = 770,
- SKILL_DK_FROST = 771,
- SKILL_DK_UNHOLY = 772,
- SKILL_INSCRIPTION = 773,
- SKILL_PET_MOTH = 775,
- SKILL_RUNEFORGING = 776,
- SKILL_MOUNTS = 777,
- SKILL_COMPANIONS = 778,
- SKILL_PET_EXOTIC_CHIMAERA = 780,
- SKILL_PET_EXOTIC_DEVILSAUR = 781,
- SKILL_PET_GHOUL = 782,
- SKILL_PET_EXOTIC_SILITHID = 783,
- SKILL_PET_EXOTIC_WORM = 784,
- SKILL_PET_WASP = 785,
- SKILL_PET_EXOTIC_RHINO = 786,
- SKILL_PET_EXOTIC_CORE_HOUND = 787,
- SKILL_PET_EXOTIC_SPIRIT_BEAST = 788
+ SKILL_INTERNAL = 769
};
-#define MAX_SKILL_TYPE 789
+#define MAX_SKILL_TYPE 770
inline uint32 SkillByQuestSort(int32 QuestSort)
{
@@ -1901,27 +1859,25 @@ inline uint32 SkillByQuestSort(int32 QuestSort)
case QUEST_SORT_TAILORING: return SKILL_TAILORING;
case QUEST_SORT_COOKING: return SKILL_COOKING;
case QUEST_SORT_FIRST_AID: return SKILL_FIRST_AID;
- case QUEST_SORT_JEWELCRAFTING: return SKILL_JEWELCRAFTING;
- case QUEST_SORT_INSCRIPTION: return SKILL_INSCRIPTION;
}
return 0;
}
enum SkillCategory
{
- SKILL_CATEGORY_ATTRIBUTES = 5,
- SKILL_CATEGORY_WEAPON = 6,
- SKILL_CATEGORY_CLASS = 7,
- SKILL_CATEGORY_ARMOR = 8,
- SKILL_CATEGORY_SECONDARY = 9, // secondary professions
+ SKILL_CATEGORY_ATTRIBUTES = 5,
+ SKILL_CATEGORY_WEAPON = 6,
+ SKILL_CATEGORY_CLASS = 7,
+ SKILL_CATEGORY_ARMOR = 8,
+ SKILL_CATEGORY_SECONDARY = 9, // secondary professions
SKILL_CATEGORY_LANGUAGES = 10,
SKILL_CATEGORY_PROFESSION = 11, // primary professions
- SKILL_CATEGORY_GENERIC = 12
+ SKILL_CATEGORY_NOT_DISPLAYED = 12
};
enum TotemCategory
{
- TC_SKINNING_SKIFE_OLD = 1,
+ TC_SKINNING_SKIFE = 1,
TC_EARTH_TOTEM = 2,
TC_AIR_TOTEM = 3,
TC_FIRE_TOTEM = 4,
@@ -1931,28 +1887,15 @@ enum TotemCategory
TC_GOLDEN_ROD = 8,
TC_TRUESILVER_ROD = 9,
TC_ARCANITE_ROD = 10,
- TC_MINING_PICK_OLD = 11,
+ TC_MINING_PICK = 11,
TC_PHILOSOPHERS_STONE = 12,
- TC_BLACKSMITH_HAMMER_OLD = 13,
+ TC_BLACKSMITH_HAMMER = 13,
TC_ARCLIGHT_SPANNER = 14,
TC_GYROMATIC_MA = 15,
TC_MASTER_TOTEM = 21,
TC_FEL_IRON_ROD = 41,
TC_ADAMANTITE_ROD = 62,
- TC_ETERNIUM_ROD = 63,
- TC_HOLLOW_QUILL = 81,
- TC_RUNED_AZURITE_ROD = 101,
- TC_VIRTUOSO_INKING_SET = 121,
- TC_DRUMS = 141,
- TC_GNOMISH_ARMY_KNIFE = 161,
- TC_BLACKSMITH_HAMMER = 162,
- TC_MINING_PICK = 165,
- TC_SKINNING_KNIFE = 166,
- TC_HAMMER_PICK = 167,
- TC_BLADED_PICKAXE = 168,
- TC_FLINT_AND_TINDER = 169,
- TC_RUNED_COBALT_ROD = 189,
- TC_RUNED_TITANIUM_ROD = 190
+ TC_ETERNIUM_ROD = 63
};
enum UnitDynFlags
@@ -1962,8 +1905,7 @@ enum UnitDynFlags
UNIT_DYNFLAG_OTHER_TAGGER = 0x0004,
UNIT_DYNFLAG_ROOTED = 0x0008,
UNIT_DYNFLAG_SPECIALINFO = 0x0010,
- UNIT_DYNFLAG_DEAD = 0x0020,
- UNIT_DYNFLAG_REFER_A_FRIEND = 0x0040
+ UNIT_DYNFLAG_DEAD = 0x0020
};
enum CorpseDynFlags
@@ -1973,7 +1915,6 @@ enum CorpseDynFlags
// Passive Spell codes explicit used in code
#define SPELL_ID_GENERIC_LEARN 483
-#define SPELL_ID_GENERIC_LEARN_PET 55884 // used for learning mounts and companions
#define SPELL_ID_PASSIVE_BATTLE_STANCE 2457
#define SPELL_ID_PASSIVE_RESURRECTION_SICKNESS 15007
#define SPELL_ID_WEAPON_SWITCH_COOLDOWN_1_5s 6119
@@ -2041,12 +1982,9 @@ enum ChatMsg
CHAT_MSG_BATTLEGROUND = 0x2C,
CHAT_MSG_BATTLEGROUND_LEADER = 0x2D,
CHAT_MSG_RESTRICTED = 0x2E,
- CHAT_MSG_BN = 0x2F,
- CHAT_MSG_ACHIEVEMENT = 0x30,
- CHAT_MSG_GUILD_ACHIEVEMENT = 0x31
};
-#define MAX_CHAT_MSG_TYPE 0x32
+#define MAX_CHAT_MSG_TYPE 0x2F
// Values from ItemPetFood (power of (value-1) used for compare with CreatureFamilyEntry.petDietMask
enum PetDiet
@@ -2215,45 +2153,42 @@ enum ResponseCodes
CHAR_CREATE_SERVER_QUEUE = 0x37,
CHAR_CREATE_ONLY_EXISTING = 0x38,
CHAR_CREATE_EXPANSION = 0x39,
- CHAR_CREATE_EXPANSION_CLASS = 0x3A,
- CHAR_CREATE_LEVEL_REQUIREMENT = 0x3B,
- CHAR_CREATE_UNIQUE_CLASS_LIMIT = 0x3C,
-
- CHAR_DELETE_IN_PROGRESS = 0x3D,
- CHAR_DELETE_SUCCESS = 0x3E,
- CHAR_DELETE_FAILED = 0x3F,
- CHAR_DELETE_FAILED_LOCKED_FOR_TRANSFER = 0x40,
- CHAR_DELETE_FAILED_GUILD_LEADER = 0x41,
- CHAR_DELETE_FAILED_ARENA_CAPTAIN = 0x42,
-
- CHAR_LOGIN_IN_PROGRESS = 0x43,
- CHAR_LOGIN_SUCCESS = 0x44,
- CHAR_LOGIN_NO_WORLD = 0x45,
- CHAR_LOGIN_DUPLICATE_CHARACTER = 0x46,
- CHAR_LOGIN_NO_INSTANCES = 0x47,
- CHAR_LOGIN_FAILED = 0x48,
- CHAR_LOGIN_DISABLED = 0x49,
- CHAR_LOGIN_NO_CHARACTER = 0x4A,
- CHAR_LOGIN_LOCKED_FOR_TRANSFER = 0x4B,
- CHAR_LOGIN_LOCKED_BY_BILLING = 0x4C,
-
- CHAR_NAME_SUCCESS = 0x4D,
- CHAR_NAME_FAILURE = 0x4E,
- CHAR_NAME_NO_NAME = 0x4F,
- CHAR_NAME_TOO_SHORT = 0x50,
- CHAR_NAME_TOO_LONG = 0x51,
- CHAR_NAME_INVALID_CHARACTER = 0x52,
- CHAR_NAME_MIXED_LANGUAGES = 0x53,
- CHAR_NAME_PROFANE = 0x54,
- CHAR_NAME_RESERVED = 0x55,
- CHAR_NAME_INVALID_APOSTROPHE = 0x56,
- CHAR_NAME_MULTIPLE_APOSTROPHES = 0x57,
- CHAR_NAME_THREE_CONSECUTIVE = 0x58,
- CHAR_NAME_INVALID_SPACE = 0x59,
- CHAR_NAME_CONSECUTIVE_SPACES = 0x5A,
- CHAR_NAME_RUSSIAN_CONSECUTIVE_SILENT_CHARACTERS = 0x5B,
- CHAR_NAME_RUSSIAN_SILENT_CHARACTER_AT_BEGINNING_OR_END = 0x5C,
- CHAR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME = 0x5D
+
+ CHAR_DELETE_IN_PROGRESS = 0x3A,
+ CHAR_DELETE_SUCCESS = 0x3B,
+ CHAR_DELETE_FAILED = 0x3C,
+ CHAR_DELETE_FAILED_LOCKED_FOR_TRANSFER = 0x3D,
+ CHAR_DELETE_FAILED_GUILD_LEADER = 0x3E,
+ CHAR_DELETE_FAILED_ARENA_CAPTAIN = 0x3F,
+
+ CHAR_LOGIN_IN_PROGRESS = 0x40,
+ CHAR_LOGIN_SUCCESS = 0x41,
+ CHAR_LOGIN_NO_WORLD = 0x42,
+ CHAR_LOGIN_DUPLICATE_CHARACTER = 0x43,
+ CHAR_LOGIN_NO_INSTANCES = 0x44,
+ CHAR_LOGIN_FAILED = 0x45,
+ CHAR_LOGIN_DISABLED = 0x46,
+ CHAR_LOGIN_NO_CHARACTER = 0x47,
+ CHAR_LOGIN_LOCKED_FOR_TRANSFER = 0x48,
+ CHAR_LOGIN_LOCKED_BY_BILLING = 0x49,
+
+ CHAR_NAME_SUCCESS = 0x4A,
+ CHAR_NAME_FAILURE = 0x4B,
+ CHAR_NAME_NO_NAME = 0x4C,
+ CHAR_NAME_TOO_SHORT = 0x4D,
+ CHAR_NAME_TOO_LONG = 0x4E,
+ CHAR_NAME_INVALID_CHARACTER = 0x4F,
+ CHAR_NAME_MIXED_LANGUAGES = 0x50,
+ CHAR_NAME_PROFANE = 0x51,
+ CHAR_NAME_RESERVED = 0x52,
+ CHAR_NAME_INVALID_APOSTROPHE = 0x53,
+ CHAR_NAME_MULTIPLE_APOSTROPHES = 0x54,
+ CHAR_NAME_THREE_CONSECUTIVE = 0x55,
+ CHAR_NAME_INVALID_SPACE = 0x56,
+ CHAR_NAME_CONSECUTIVE_SPACES = 0x57,
+ CHAR_NAME_RUSSIAN_CONSECUTIVE_SILENT_CHARACTERS = 0x58,
+ CHAR_NAME_RUSSIAN_SILENT_CHARACTER_AT_BEGINNING_OR_END = 0x59,
+ CHAR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME = 0x5A,
};
/// Ban function modes
diff --git a/src/game/SkillHandler.cpp b/src/game/SkillHandler.cpp
index 9f3915c30cb..56e48bf75c4 100644
--- a/src/game/SkillHandler.cpp
+++ b/src/game/SkillHandler.cpp
@@ -82,6 +82,10 @@ void WorldSession::HandleLearnTalentOpcode( WorldPacket & recv_data )
}
}
+ // Check if it requires spell
+ if( talentInfo->DependsOnSpell && !player->HasSpell(talentInfo->DependsOnSpell) )
+ return;
+
// Find out how many points we have in this field
uint32 spentPoints = 0;
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp
index 3061ad3f5fb..ffac28c7c58 100644
--- a/src/game/Spell.cpp
+++ b/src/game/Spell.cpp
@@ -237,7 +237,7 @@ void SpellCastTargets::write ( WorldPacket * data )
{
*data << uint32(m_targetMask);
- if( m_targetMask & ( TARGET_FLAG_UNIT | TARGET_FLAG_PVP_CORPSE | TARGET_FLAG_OBJECT | TARGET_FLAG_OBJECT_UNK | TARGET_FLAG_CORPSE | TARGET_FLAG_UNK2 ) )
+ if( m_targetMask & ( TARGET_FLAG_UNIT | TARGET_FLAG_PVP_CORPSE | TARGET_FLAG_OBJECT | TARGET_FLAG_CORPSE | TARGET_FLAG_UNK2 ) )
{
if(m_targetMask & TARGET_FLAG_UNIT)
{
@@ -357,7 +357,6 @@ Spell::Spell( Unit* Caster, SpellEntry const *info, bool triggered, uint64 origi
gameObjTarget = NULL;
focusObject = NULL;
m_cast_count = 0;
- m_glyphIndex = 0;
m_triggeredByAuraSpell = NULL;
//Auto Shot & Shoot
@@ -366,7 +365,6 @@ Spell::Spell( Unit* Caster, SpellEntry const *info, bool triggered, uint64 origi
else
m_autoRepeat = false;
- m_runesState = 0;
m_powerCost = 0; // setup to correct value in Spell::prepare, don't must be used before.
m_casttime = 0; // setup to correct value in Spell::prepare, don't must be used before.
m_timer = 0; // will set to castime in prepare
@@ -504,8 +502,6 @@ void Spell::FillTargetMap()
case SPELL_EFFECT_TRIGGER_SPELL:
//case SPELL_EFFECT_TRIGGER_MISSILE: ??
case SPELL_EFFECT_SKILL_STEP:
- case SPELL_EFFECT_PROFICIENCY:
- case SPELL_EFFECT_SUMMON_OBJECT_WILD:
case SPELL_EFFECT_SELF_RESURRECT:
case SPELL_EFFECT_REPUTATION:
if(m_targets.getUnitTarget())
@@ -537,7 +533,6 @@ void Spell::FillTargetMap()
break;
case SPELL_EFFECT_SUMMON_CHANGE_ITEM:
case SPELL_EFFECT_ADD_FARSIGHT:
- case SPELL_EFFECT_APPLY_GLYPH:
case SPELL_EFFECT_STUCK:
case SPELL_EFFECT_DESTROY_ALL_TOTEMS:
tmpUnitMap.push_back(m_caster);
@@ -551,7 +546,6 @@ void Spell::FillTargetMap()
case SPELL_EFFECT_DISENCHANT:
case SPELL_EFFECT_FEED_PET:
case SPELL_EFFECT_PROSPECTING:
- case SPELL_EFFECT_MILLING:
if(m_targets.getItemTarget())
AddItemTarget(m_targets.getItemTarget(), i);
break;
@@ -1116,17 +1110,6 @@ void Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask)
return;
}
- if (unit->GetTypeId() == TYPEID_PLAYER)
- {
- ((Player*)unit)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, m_spellInfo->Id);
- ((Player*)unit)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2, m_spellInfo->Id);
- }
-
- if(m_caster->GetTypeId() == TYPEID_PLAYER)
- {
- ((Player*)m_caster)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2, m_spellInfo->Id, 0, unit);
- }
-
if( m_caster != unit )
{
if( !m_caster->IsFriendlyTo(unit) )
@@ -1337,16 +1320,6 @@ void Spell::SearchChainTarget(std::list<Unit*> &TagUnitMap, Unit* pUnitTarget, f
if(!pUnitTarget)
return;
- // Get spell max affected targets
- /*uint32 unMaxTargets = m_spellInfo->MaxAffectedTargets;
- Unit::AuraList const& mod = m_caster->GetAurasByType(SPELL_AURA_MOD_MAX_AFFECTED_TARGETS);
- for(Unit::AuraList::const_iterator m = mod.begin(); m != mod.end(); ++m)
- {
- if (!(*m)->isAffectedOnSpell(m_spellInfo))
- continue;
- unMaxTargets+=(*m)->GetModifier()->m_amount;
- }*/
-
//FIXME: This very like horrible hack and wrong for most spells
if(m_spellInfo->DmgClass != SPELL_DAMAGE_CLASS_MELEE)
max_range += unMaxTargets * CHAIN_SPELL_JUMP_RADIUS;
@@ -2253,14 +2226,6 @@ void Spell::cast(bool skipCheck)
// set to real guid to be sent later to the client
m_targets.updateTradeSlotItem();
- if (m_caster->GetTypeId() == TYPEID_PLAYER)
- {
- if (m_CastItem)
- ((Player*)m_caster)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM, m_CastItem->GetEntry());
-
- ((Player*)m_caster)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL, m_spellInfo->Id);
- }
-
// CAST SPELL
SendSpellCooldown();
@@ -2703,7 +2668,7 @@ void Spell::finish(bool ok)
{
SpellEntry const *auraSpellInfo = (*i)->GetSpellProto();
uint32 auraSpellIdx = (*i)->GetEffIndex();
- if (IsAffectedByAura((*i)))
+ if (IsAffectedBy(auraSpellInfo, auraSpellIdx))
{
for(std::list<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin();ihit != m_UniqueTargetInfo.end();++ihit)
if( ihit->effectMask & (1<<auraSpellIdx) )
@@ -2759,9 +2724,9 @@ void Spell::SendCastResult(uint8 result)
if(result != 0)
{
WorldPacket data(SMSG_CAST_FAILED, (4+1+1));
- data << uint8(m_cast_count); // single cast or multi 2.3 (0/1)
data << uint32(m_spellInfo->Id);
data << uint8(result); // problem
+ data << uint8(m_cast_count); // single cast or multi 2.3 (0/1)
switch (result)
{
case SPELL_FAILED_REQUIRES_SPELL_FOCUS:
@@ -2802,11 +2767,18 @@ void Spell::SendCastResult(uint8 result)
case SPELL_FAILED_EQUIPPED_ITEM_CLASS:
data << uint32(m_spellInfo->EquippedItemClass);
data << uint32(m_spellInfo->EquippedItemSubClassMask);
- //data << uint32(m_spellInfo->EquippedItemInventoryTypeMask);
+ data << uint32(m_spellInfo->EquippedItemInventoryTypeMask);
break;
}
((Player*)m_caster)->GetSession()->SendPacket(&data);
}
+ else
+ {
+ WorldPacket data(SMSG_CLEAR_EXTRA_AURA_INFO, (8+4));
+ data.append(m_caster->GetPackGUID());
+ data << uint32(m_spellInfo->Id);
+ ((Player*)m_caster)->GetSession()->SendPacket(&data);
+ }
}
void Spell::SendSpellStart()
@@ -2820,9 +2792,6 @@ void Spell::SendSpellStart()
if(IsRangedSpell())
castFlags |= CAST_FLAG_AMMO;
- if(m_spellInfo->runeCostID)
- castFlags |= CAST_FLAG_UNKNOWN10;
-
Unit *target = m_targets.getUnitTarget() ? m_targets.getUnitTarget() : m_caster;
WorldPacket data(SMSG_SPELL_START, (8+8+4+4+2));
@@ -2832,32 +2801,14 @@ void Spell::SendSpellStart()
data.append(m_caster->GetPackGUID());
data.append(m_caster->GetPackGUID());
- data << uint8(m_cast_count); // pending spell cast?
- data << uint32(m_spellInfo->Id); // spellId
- data << uint32(castFlags); // cast flags
- data << uint32(m_timer); // delay?
+ data << uint32(m_spellInfo->Id);
+ data << uint8(m_cast_count); // single cast or multi 2.3 (0/1)
+ data << uint16(castFlags);
+ data << uint32(m_timer);
m_targets.write(&data);
- if ( castFlags & CAST_FLAG_UNKNOWN6 ) // predicted power?
- data << uint32(0);
-
- if ( castFlags & CAST_FLAG_UNKNOWN7 ) // rune cooldowns list
- {
- uint8 v1 = 0;//m_runesState;
- uint8 v2 = 0;//((Player*)m_caster)->GetRunesState();
- data << uint8(v1); // runes state before
- data << uint8(v2); // runes state after
- for(uint8 i = 0; i < MAX_RUNES; ++i)
- {
- uint8 m = (1 << i);
- if(m & v1) // usable before...
- if(!(m & v2)) // ...but on cooldown now...
- data << uint8(0); // some unknown byte (time?)
- }
- }
-
- if ( castFlags & CAST_FLAG_AMMO )
+ if( castFlags & CAST_FLAG_AMMO )
WriteAmmoToPacket(&data);
m_caster->SendMessageToSet(&data, true);
@@ -2877,13 +2828,6 @@ void Spell::SendSpellGo()
if(IsRangedSpell())
castFlags |= CAST_FLAG_AMMO; // arrows/bullets visual
- if((m_caster->GetTypeId() == TYPEID_PLAYER) && (m_caster->getClass() == CLASS_DEATH_KNIGHT) && m_spellInfo->runeCostID)
- {
- castFlags |= CAST_FLAG_UNKNOWN10; // same as in SMSG_SPELL_START
- castFlags |= CAST_FLAG_UNKNOWN6; // makes cooldowns visible
- castFlags |= CAST_FLAG_UNKNOWN7; // rune cooldowns list
- }
-
WorldPacket data(SMSG_SPELL_GO, 50); // guess size
if(m_CastItem)
data.append(m_CastItem->GetPackGUID());
@@ -2891,53 +2835,17 @@ void Spell::SendSpellGo()
data.append(m_caster->GetPackGUID());
data.append(m_caster->GetPackGUID());
- data << uint8(m_cast_count); // pending spell cast?
- data << uint32(m_spellInfo->Id); // spellId
- data << uint32(castFlags); // cast flags
+ data << uint32(m_spellInfo->Id);
+ data << uint16(castFlags);
data << uint32(getMSTime()); // timestamp
WriteSpellGoTargets(&data);
m_targets.write(&data);
- if ( castFlags & CAST_FLAG_UNKNOWN6 ) // unknown wotlk, predicted power?
- data << uint32(0);
-
- if ( castFlags & CAST_FLAG_UNKNOWN7 ) // rune cooldowns list
- {
- uint8 v1 = m_runesState;
- uint8 v2 = ((Player*)m_caster)->GetRunesState();
- data << uint8(v1); // runes state before
- data << uint8(v2); // runes state after
- for(uint8 i = 0; i < MAX_RUNES; ++i)
- {
- uint8 m = (1 << i);
- if(m & v1) // usable before...
- if(!(m & v2)) // ...but on cooldown now...
- data << uint8(0); // some unknown byte (time?)
- }
- }
-
- if ( castFlags & CAST_FLAG_UNKNOWN4 ) // unknown wotlk
- {
- data << float(0);
- data << uint32(0);
- }
-
- if ( castFlags & CAST_FLAG_AMMO )
+ if( castFlags & CAST_FLAG_AMMO )
WriteAmmoToPacket(&data);
- if ( castFlags & CAST_FLAG_UNKNOWN5 ) // unknown wotlk
- {
- data << uint32(0);
- data << uint32(0);
- }
-
- if ( m_targets.m_targetMask & TARGET_FLAG_DEST_LOCATION )
- {
- data << uint8(0);
- }
-
m_caster->SendMessageToSet(&data, true);
}
@@ -3065,19 +2973,30 @@ void Spell::SendLogExecute()
data << uint8(0);
break;
case SPELL_EFFECT_CREATE_ITEM:
- case SPELL_EFFECT_157:
data << uint32(m_spellInfo->EffectItemType[0]);
break;
case SPELL_EFFECT_SUMMON:
+ case SPELL_EFFECT_SUMMON_WILD:
+ case SPELL_EFFECT_SUMMON_GUARDIAN:
case SPELL_EFFECT_TRANS_DOOR:
case SPELL_EFFECT_SUMMON_PET:
+ case SPELL_EFFECT_SUMMON_POSSESSED:
+ case SPELL_EFFECT_SUMMON_TOTEM:
case SPELL_EFFECT_SUMMON_OBJECT_WILD:
case SPELL_EFFECT_CREATE_HOUSE:
case SPELL_EFFECT_DUEL:
+ case SPELL_EFFECT_SUMMON_TOTEM_SLOT1:
+ case SPELL_EFFECT_SUMMON_TOTEM_SLOT2:
+ case SPELL_EFFECT_SUMMON_TOTEM_SLOT3:
+ case SPELL_EFFECT_SUMMON_TOTEM_SLOT4:
+ case SPELL_EFFECT_SUMMON_PHANTASM:
+ case SPELL_EFFECT_SUMMON_CRITTER:
case SPELL_EFFECT_SUMMON_OBJECT_SLOT1:
case SPELL_EFFECT_SUMMON_OBJECT_SLOT2:
case SPELL_EFFECT_SUMMON_OBJECT_SLOT3:
case SPELL_EFFECT_SUMMON_OBJECT_SLOT4:
+ case SPELL_EFFECT_SUMMON_DEMON:
+ case SPELL_EFFECT_150:
if(Unit *unit = m_targets.getUnitTarget())
data.append(unit->GetPackGUID());
else if(m_targets.getItemTargetGUID())
@@ -3096,13 +3015,6 @@ void Spell::SendLogExecute()
else
data << uint8(0);
break;
- case SPELL_EFFECT_RESURRECT:
- case SPELL_EFFECT_RESURRECT_NEW:
- if(Unit *unit = m_targets.getUnitTarget())
- data.append(unit->GetPackGUID());
- else
- data << uint8(0);
- break;
default:
return;
}
@@ -3116,16 +3028,13 @@ void Spell::SendInterrupted(uint8 result)
{
WorldPacket data(SMSG_SPELL_FAILURE, (8+4+1));
data.append(m_caster->GetPackGUID());
- data << uint8(m_cast_count);
- data << uint32(m_spellInfo->Id);
- data << uint8(result);
+ data << m_spellInfo->Id;
+ data << result;
m_caster->SendMessageToSet(&data, true);
data.Initialize(SMSG_SPELL_FAILED_OTHER, (8+4));
data.append(m_caster->GetPackGUID());
- data << uint8(m_cast_count);
- data << uint32(m_spellInfo->Id);
- data << uint8(result);
+ data << m_spellInfo->Id;
m_caster->SendMessageToSet(&data, true);
}
@@ -3193,19 +3102,10 @@ void Spell::SendChannelStart(uint32 duration)
void Spell::SendResurrectRequest(Player* target)
{
- // Both players and NPCs can resurrect using spells - have a look at creature 28487 for example
- // However, the packet structure differs slightly
-
- const char* sentName = m_caster->GetTypeId()==TYPEID_PLAYER ?"":m_caster->GetNameForLocaleIdx(target->GetSession()->GetSessionDbLocaleIndex());
-
- WorldPacket data(SMSG_RESURRECT_REQUEST, (8+4+strlen(sentName)+1+1+1));
- data << uint64(m_caster->GetGUID());
- data << uint32(strlen(sentName)+1);
+ WorldPacket data(SMSG_RESURRECT_REQUEST, (8+4+2+4));
+ data << m_caster->GetGUID();
+ data << uint32(1) << uint16(0) << uint32(1);
- data << sentName;
- data << uint8(0);
-
- data << uint8(m_caster->GetTypeId()==TYPEID_PLAYER ?0:1);
target->GetSession()->SendPacket(&data);
}
@@ -3302,12 +3202,6 @@ void Spell::TakePower()
Powers powerType = Powers(m_spellInfo->powerType);
- if(powerType == POWER_RUNE)
- {
- TakeRunePower();
- return;
- }
-
m_caster->ModifyPower(powerType, -(int32)m_powerCost);
// Set the five second timer
@@ -3315,116 +3209,6 @@ void Spell::TakePower()
m_caster->SetLastManaUse(getMSTime());
}
-uint8 Spell::CheckRuneCost(uint32 runeCostID)
-{
- if(m_caster->GetTypeId() != TYPEID_PLAYER)
- return 0;
-
- Player *plr = (Player*)m_caster;
-
- if(plr->getClass() != CLASS_DEATH_KNIGHT)
- return 0;
-
- SpellRuneCostEntry const *src = sSpellRuneCostStore.LookupEntry(runeCostID);
-
- if(!src)
- return 0;
-
- if(src->NoRuneCost())
- return 0;
-
- int32 runeCost[NUM_RUNE_TYPES]; // blood, frost, unholy, death
-
- for(uint32 i = 0; i < RUNE_DEATH; ++i)
- {
- runeCost[i] = src->RuneCost[i];
- }
-
- runeCost[RUNE_DEATH] = 0; // calculated later
-
- for(uint32 i = 0; i < MAX_RUNES; ++i)
- {
- uint8 rune = plr->GetCurrentRune(i);
- if((plr->GetRuneCooldown(i) == 0) && (runeCost[rune] > 0))
- {
- runeCost[rune]--;
- }
- }
-
- for(uint32 i = 0; i < RUNE_DEATH; ++i)
- {
- if(runeCost[i] > 0)
- {
- runeCost[RUNE_DEATH] += runeCost[i];
- }
- }
-
- if(runeCost[RUNE_DEATH] > 0)
- return SPELL_FAILED_NO_POWER; // not sure if result code is correct
-
- return 0;
-}
-
-void Spell::TakeRunePower()
-{
- if(m_caster->GetTypeId() != TYPEID_PLAYER)
- return;
-
- Player *plr = (Player*)m_caster;
-
- if(plr->getClass() != CLASS_DEATH_KNIGHT)
- return;
-
- SpellRuneCostEntry const *src = sSpellRuneCostStore.LookupEntry(m_spellInfo->runeCostID);
-
- if(!src || (src->NoRuneCost() && src->NoRunicPowerGain()))
- return;
-
- m_runesState = plr->GetRunesState(); // store previous state
-
- int32 runeCost[NUM_RUNE_TYPES]; // blood, frost, unholy, death
-
- for(uint32 i = 0; i < RUNE_DEATH; ++i)
- {
- runeCost[i] = src->RuneCost[i];
- }
-
- runeCost[RUNE_DEATH] = 0; // calculated later
-
- for(uint32 i = 0; i < MAX_RUNES; ++i)
- {
- uint8 rune = plr->GetCurrentRune(i);
- if((plr->GetRuneCooldown(i) == 0) && (runeCost[rune] > 0))
- {
- plr->SetRuneCooldown(i, RUNE_COOLDOWN); // 5*2=10 sec
- runeCost[rune]--;
- }
- }
-
- runeCost[RUNE_DEATH] = runeCost[RUNE_BLOOD] + runeCost[RUNE_UNHOLY] + runeCost[RUNE_FROST];
-
- if(runeCost[RUNE_DEATH] > 0)
- {
- for(uint32 i = 0; i < MAX_RUNES; ++i)
- {
- uint8 rune = plr->GetCurrentRune(i);
- if((plr->GetRuneCooldown(i) == 0) && (rune == RUNE_DEATH))
- {
- plr->SetRuneCooldown(i, RUNE_COOLDOWN); // 5*2=10 sec
- runeCost[rune]--;
- plr->ConvertRune(i, plr->GetBaseRune(i));
- if(runeCost[RUNE_DEATH] == 0)
- break;
- }
- }
- }
-
- // you can gain some runic power when use runes
- float rp = src->runePowerGain;;
- rp *= sWorld.getRate(RATE_POWER_RUNICPOWER_INCOME);
- plr->ModifyPower(POWER_RUNIC_POWER, (int32)rp);
-}
-
void Spell::TakeReagents()
{
if(m_IsTriggeredSpell) // reagents used in triggered spell removed by original spell or don't must be removed.
@@ -3433,10 +3217,12 @@ void Spell::TakeReagents()
if (m_caster->GetTypeId() != TYPEID_PLAYER)
return;
- Player* p_caster = (Player*)m_caster;
- if (p_caster->CanNoReagentCast(m_spellInfo))
+ if (m_spellInfo->AttributesEx5 & SPELL_ATTR_EX5_NO_REAGENT_WHILE_PREP &&
+ m_caster->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PREPARATION))
return;
+ Player* p_caster = (Player*)m_caster;
+
for(uint32 x=0;x<8;x++)
{
if(m_spellInfo->Reagent[x] <= 0)
@@ -3558,25 +3344,12 @@ uint8 Spell::CanCast(bool strict)
// for now, ignore triggered spells
if( strict && !m_IsTriggeredSpell)
{
- bool checkForm = true;
- // Ignore form req aura
- Unit::AuraList const& ignore = m_caster->GetAurasByType(SPELL_AURA_MOD_IGNORE_SHAPESHIFT);
- for(Unit::AuraList::const_iterator i = ignore.begin(); i != ignore.end(); ++i)
- {
- if (!(*i)->isAffectedOnSpell(m_spellInfo))
- continue;
- checkForm = false;
- break;
- }
- if (checkForm)
- {
- // Cannot be used in this stance/form
- if(uint8 shapeError = GetErrorAtShapeshiftedCast(m_spellInfo, m_caster->m_form))
- return shapeError;
+ // Cannot be used in this stance/form
+ if(uint8 shapeError = GetErrorAtShapeshiftedCast(m_spellInfo, m_caster->m_form))
+ return shapeError;
- if ((m_spellInfo->Attributes & SPELL_ATTR_ONLY_STEALTHED) && !(m_caster->HasStealthAura()))
- return SPELL_FAILED_ONLY_STEALTHED;
- }
+ if ((m_spellInfo->Attributes & SPELL_ATTR_ONLY_STEALTHED) && !(m_caster->HasStealthAura()))
+ return SPELL_FAILED_ONLY_STEALTHED;
}
// caster state requirements
@@ -3913,7 +3686,7 @@ uint8 Spell::CanCast(bool strict)
case SPELL_EFFECT_SCHOOL_DAMAGE:
{
// Hammer of Wrath
- if(m_spellInfo->SpellVisual[0] == 7250)
+ if(m_spellInfo->SpellVisual == 7250)
{
if (!m_targets.getUnitTarget())
return SPELL_FAILED_BAD_IMPLICIT_TARGETS;
@@ -3938,9 +3711,15 @@ uint8 Spell::CanCast(bool strict)
if(!learn_spellproto)
return SPELL_FAILED_NOT_KNOWN;
+ if(!pet->CanTakeMoreActiveSpells(learn_spellproto->Id))
+ return SPELL_FAILED_TOO_MANY_SKILLS;
+
if(m_spellInfo->spellLevel > pet->getLevel())
return SPELL_FAILED_LOWLEVEL;
+ if(!pet->HasTPForSpell(learn_spellproto->Id))
+ return SPELL_FAILED_TRAINING_POINTS;
+
break;
}
case SPELL_EFFECT_LEARN_PET_SPELL:
@@ -3955,9 +3734,15 @@ uint8 Spell::CanCast(bool strict)
if(!learn_spellproto)
return SPELL_FAILED_NOT_KNOWN;
+ if(!pet->CanTakeMoreActiveSpells(learn_spellproto->Id))
+ return SPELL_FAILED_TOO_MANY_SKILLS;
+
if(m_spellInfo->spellLevel > pet->getLevel())
return SPELL_FAILED_LOWLEVEL;
+ if(!pet->HasTPForSpell(learn_spellproto->Id))
+ return SPELL_FAILED_TRAINING_POINTS;
+
break;
}
case SPELL_EFFECT_FEED_PET:
@@ -4060,27 +3845,27 @@ uint8 Spell::CanCast(bool strict)
{
// check for lock - key pair (checked by client also, just prevent cheating
bool ok_key = false;
- for(int it = 0; it < 8; ++it)
+ for(int it = 0; it < 5; ++it)
{
- switch(lockInfo->Type[it])
+ switch(lockInfo->keytype[it])
{
case LOCK_KEY_NONE:
break;
case LOCK_KEY_ITEM:
{
- if(lockInfo->Index[it])
+ if(lockInfo->key[it])
{
- if(m_CastItem && m_CastItem->GetEntry()==lockInfo->Index[it])
+ if(m_CastItem && m_CastItem->GetEntry()==lockInfo->key[it])
ok_key =true;
break;
}
}
case LOCK_KEY_SKILL:
{
- if(uint32(m_spellInfo->EffectMiscValue[i])!=lockInfo->Index[it])
+ if(uint32(m_spellInfo->EffectMiscValue[i])!=lockInfo->key[it])
break;
- switch(lockInfo->Index[it])
+ switch(lockInfo->key[it])
{
case LOCKTYPE_HERBALISM:
if(((Player*)m_caster)->HasSkill(SKILL_HERBALISM))
@@ -4137,9 +3922,9 @@ uint8 Spell::CanCast(bool strict)
{
// check for lock - key pair
bool ok = false;
- for(int it = 0; it < 8; ++it)
+ for(int it = 0; it < 5; ++it)
{
- if(lockInfo->Type[it]==LOCK_KEY_ITEM && lockInfo->Index[it] && m_CastItem && m_CastItem->GetEntry()==lockInfo->Index[it])
+ if(lockInfo->keytype[it]==LOCK_KEY_ITEM && lockInfo->key[it] && m_CastItem && m_CastItem->GetEntry()==lockInfo->key[it])
{
// if so, we're good to go
ok = true;
@@ -4150,9 +3935,9 @@ uint8 Spell::CanCast(bool strict)
break;
if (m_spellInfo->EffectMiscValue[i] == LOCKTYPE_PICKLOCK)
- ReqValue = lockInfo->Skill[1];
+ ReqValue = lockInfo->requiredlockskill;
else
- ReqValue = lockInfo->Skill[0];
+ ReqValue = lockInfo->requiredminingskill;
}
// skill doesn't meet the required value
@@ -4201,6 +3986,7 @@ uint8 Spell::CanCast(bool strict)
}
// Don't make this check for SPELL_EFFECT_SUMMON_CRITTER, SPELL_EFFECT_SUMMON_WILD or SPELL_EFFECT_SUMMON_GUARDIAN.
// These won't show up in m_caster->GetPetGUID()
+ case SPELL_EFFECT_SUMMON_POSSESSED:
case SPELL_EFFECT_SUMMON_PHANTASM:
case SPELL_EFFECT_SUMMON_DEMON:
{
@@ -4357,7 +4143,7 @@ uint8 Spell::CanCast(bool strict)
if( form == FORM_CAT || form == FORM_TREE || form == FORM_TRAVEL ||
form == FORM_AQUA || form == FORM_BEAR || form == FORM_DIREBEAR ||
form == FORM_CREATUREBEAR || form == FORM_GHOSTWOLF || form == FORM_FLIGHT ||
- form == FORM_FLIGHT_EPIC || form == FORM_MOONKIN || form == FORM_METAMORPHOSIS )
+ form == FORM_FLIGHT_EPIC || form == FORM_MOONKIN )
return SPELL_FAILED_NOT_SHAPESHIFT;
break;
@@ -4379,8 +4165,8 @@ uint8 Spell::CanCast(bool strict)
// not allow cast fly spells at old maps by players (all spells is self target)
if(m_caster->GetTypeId()==TYPEID_PLAYER)
{
- uint32 v_map = GetVirtualMapForMapAndZone(m_caster->GetMapId(), m_caster->GetZoneId());
- if( !((Player*)m_caster)->isGameMaster() && v_map != 530 && !(v_map == 571 && ((Player*)m_caster)->HasSpell(54197)))
+ if( !((Player*)m_caster)->isGameMaster() &&
+ GetVirtualMapForMapAndZone(m_caster->GetMapId(),m_caster->GetZoneId()) != 530)
return SPELL_FAILED_NOT_HERE;
}
@@ -4695,12 +4481,9 @@ int32 Spell::CalculatePowerCost()
case POWER_FOCUS:
case POWER_ENERGY:
case POWER_HAPPINESS:
+ // case POWER_RUNES:
powerCost += m_spellInfo->ManaCostPercentage * m_caster->GetMaxPower(Powers(m_spellInfo->powerType)) / 100;
break;
- case POWER_RUNE:
- case POWER_RUNIC_POWER:
- sLog.outDebug("Spell::CalculateManaCost: Not implemented yet!");
- break;
default:
sLog.outError("Spell::CalculateManaCost: Unknown power type '%d' in spell %d", m_spellInfo->powerType, m_spellInfo->Id);
return 0;
@@ -4745,11 +4528,6 @@ uint8 Spell::CheckPower()
sLog.outError("Spell::CheckMana: Unknown power type '%d'", m_spellInfo->powerType);
return SPELL_FAILED_UNKNOWN;
}
-
- uint8 failReason = CheckRuneCost(m_spellInfo->runeCostID);
- if(failReason)
- return failReason;
-
// Check power amount
Powers powerType = Powers(m_spellInfo->powerType);
if(m_caster->GetPower(powerType) < m_powerCost)
@@ -4877,7 +4655,8 @@ uint8 Spell::CheckItems()
focusObject = ok; // game object found in range
}
- if (!p_caster->CanNoReagentCast(m_spellInfo))
+ if (!(m_spellInfo->AttributesEx5 & SPELL_ATTR_EX5_NO_REAGENT_WHILE_PREP &&
+ m_caster->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PREPARATION)))
{
for(uint32 i=0;i<8;i++)
{
@@ -5045,36 +4824,13 @@ uint8 Spell::CheckItems()
return SPELL_FAILED_LOW_CASTLEVEL;
//make sure the player has the required ores in inventory
if(m_targets.getItemTarget()->GetCount() < 5)
- return SPELL_FAILED_NEED_MORE_ITEMS;
+ return SPELL_FAILED_PROSPECT_NEED_MORE;
if(!LootTemplates_Prospecting.HaveLootFor(m_targets.getItemTargetEntry()))
return SPELL_FAILED_CANT_BE_PROSPECTED;
break;
}
- case SPELL_EFFECT_MILLING:
- {
- if(!m_targets.getItemTarget())
- return SPELL_FAILED_CANT_BE_MILLED;
- //ensure item is a millable herb
- if(!(m_targets.getItemTarget()->GetProto()->BagFamily & BAG_FAMILY_MASK_HERBS) || m_targets.getItemTarget()->GetProto()->Class != ITEM_CLASS_TRADE_GOODS)
- return SPELL_FAILED_CANT_BE_MILLED;
- //prevent milling in trade slot
- if( m_targets.getItemTarget()->GetOwnerGUID() != m_caster->GetGUID() )
- return SPELL_FAILED_CANT_BE_MILLED;
- //Check for enough skill in inscription
- uint32 item_millingskilllevel = m_targets.getItemTarget()->GetProto()->RequiredSkillRank;
- if(item_millingskilllevel >p_caster->GetSkillValue(SKILL_INSCRIPTION))
- return SPELL_FAILED_LOW_CASTLEVEL;
- //make sure the player has the required herbs in inventory
- if(m_targets.getItemTarget()->GetCount() < 5)
- return SPELL_FAILED_NEED_MORE_ITEMS;
-
- if(!LootTemplates_Milling.HaveLootFor(m_targets.getItemTargetEntry()))
- return SPELL_FAILED_CANT_BE_MILLED;
-
- break;
- }
case SPELL_EFFECT_WEAPON_DAMAGE:
case SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL:
{
@@ -5247,9 +5003,9 @@ void Spell::UpdatePointers()
m_targets.Update(m_caster);
}
-bool Spell::IsAffectedByAura(Aura *aura)
+bool Spell::IsAffectedBy(SpellEntry const *spellInfo, uint32 effectId)
{
- return spellmgr.IsAffectedByMod(m_spellInfo, aura->getAuraSpellMod());
+ return spellmgr.IsAffectedBySpell(m_spellInfo,spellInfo->Id,effectId,spellInfo->EffectItemType[effectId]);
}
bool Spell::CheckTargetCreatureType(Unit* target) const
diff --git a/src/game/Spell.h b/src/game/Spell.h
index 093dde6be27..ba5e14b33f2 100644
--- a/src/game/Spell.h
+++ b/src/game/Spell.h
@@ -47,51 +47,26 @@ enum SpellCastTargetFlags
TARGET_FLAG_RESURRECTABLE = 0x8000*/
TARGET_FLAG_SELF = 0x00000000,
- TARGET_FLAG_UNUSED1 = 0x00000001, // not used in any spells as of 3.0.3 (can be set dynamically)
TARGET_FLAG_UNIT = 0x00000002, // pguid
- TARGET_FLAG_UNUSED2 = 0x00000004, // not used in any spells as of 3.0.3 (can be set dynamically)
- TARGET_FLAG_UNUSED3 = 0x00000008, // not used in any spells as of 3.0.3 (can be set dynamically)
TARGET_FLAG_ITEM = 0x00000010, // pguid
TARGET_FLAG_SOURCE_LOCATION = 0x00000020, // 3 float
TARGET_FLAG_DEST_LOCATION = 0x00000040, // 3 float
- TARGET_FLAG_OBJECT_UNK = 0x00000080, // used in 7 spells only
- TARGET_FLAG_UNIT_UNK = 0x00000100, // looks like self target (480 spells)
+ TARGET_FLAG_OBJECT_UNK = 0x00000080, // ?
TARGET_FLAG_PVP_CORPSE = 0x00000200, // pguid
- TARGET_FLAG_UNIT_CORPSE = 0x00000400, // 10 spells (gathering professions)
- TARGET_FLAG_OBJECT = 0x00000800, // pguid, 2 spells
- TARGET_FLAG_TRADE_ITEM = 0x00001000, // pguid, 0 spells
- TARGET_FLAG_STRING = 0x00002000, // string, 0 spells
- TARGET_FLAG_UNK1 = 0x00004000, // 199 spells, opening object/lock
- TARGET_FLAG_CORPSE = 0x00008000, // pguid, resurrection spells
- TARGET_FLAG_UNK2 = 0x00010000, // pguid, not used in any spells as of 3.0.3 (can be set dynamically)
- TARGET_FLAG_GLYPH = 0x00020000 // used in glyph spells
+ TARGET_FLAG_OBJECT = 0x00000800, // pguid
+ TARGET_FLAG_TRADE_ITEM = 0x00001000, // pguid
+ TARGET_FLAG_STRING = 0x00002000, // string
+ TARGET_FLAG_UNK1 = 0x00004000, // ?
+ TARGET_FLAG_CORPSE = 0x00008000, // pguid
+ TARGET_FLAG_UNK2 = 0x00010000 // pguid
};
enum SpellCastFlags
{
- CAST_FLAG_NONE = 0x00000000,
- CAST_FLAG_UNKNOWN0 = 0x00000001, // may be pending spell cast
CAST_FLAG_UNKNOWN1 = 0x00000002,
- CAST_FLAG_UNKNOWN11 = 0x00000004,
- CAST_FLAG_UNKNOWN12 = 0x00000008,
CAST_FLAG_UNKNOWN2 = 0x00000010,
- CAST_FLAG_AMMO = 0x00000020, // Projectiles visual
- CAST_FLAG_UNKNOWN8 = 0x00000040,
- CAST_FLAG_UNKNOWN9 = 0x00000080,
- CAST_FLAG_UNKNOWN3 = 0x00000100,
- CAST_FLAG_UNKNOWN13 = 0x00000200,
- CAST_FLAG_UNKNOWN14 = 0x00000400,
- CAST_FLAG_UNKNOWN6 = 0x00000800, // wotlk, trigger rune cooldown
- CAST_FLAG_UNKNOWN15 = 0x00001000,
- CAST_FLAG_UNKNOWN16 = 0x00002000,
- CAST_FLAG_UNKNOWN17 = 0x00004000,
- CAST_FLAG_UNKNOWN18 = 0x00008000,
- CAST_FLAG_UNKNOWN19 = 0x00010000,
- CAST_FLAG_UNKNOWN4 = 0x00020000, // wotlk
- CAST_FLAG_UNKNOWN10 = 0x00040000,
- CAST_FLAG_UNKNOWN5 = 0x00080000, // wotlk
- CAST_FLAG_UNKNOWN20 = 0x00100000,
- CAST_FLAG_UNKNOWN7 = 0x00200000 // wotlk, rune cooldown list
+ CAST_FLAG_AMMO = 0x00000020,
+ CAST_FLAG_UNKNOWN3 = 0x00000100
};
enum SpellRangeFlag
@@ -300,7 +275,6 @@ class Spell
void EffectStuck(uint32 i);
void EffectSummonPlayer(uint32 i);
void EffectActivateObject(uint32 i);
- void EffectApplyGlyph(uint32 i);
void EffectSummonTotem(uint32 i);
void EffectEnchantHeldItem(uint32 i);
void EffectSummonObject(uint32 i);
@@ -318,7 +292,6 @@ class Spell
void EffectSkinning(uint32 i);
void EffectCharge(uint32 i);
void EffectProspecting(uint32 i);
- void EffectMilling(uint32 i);
void EffectSendTaxi(uint32 i);
void EffectSummonCritter(uint32 i);
void EffectKnockBack(uint32 i);
@@ -345,8 +318,6 @@ class Spell
void EffectKillCredit(uint32 i);
void EffectQuestFail(uint32 i);
void EffectRedirectThreat(uint32 i);
- void EffectActivateRune(uint32 i);
- void EffectTitanGrip(uint32 i);
Spell( Unit* Caster, SpellEntry const *info, bool triggered, uint64 originalCasterGUID = 0, Spell** triggeringContainer = NULL );
~Spell();
@@ -357,8 +328,6 @@ class Spell
void cast(bool skipCheck = false);
void finish(bool ok = true);
void TakePower();
- uint8 CheckRuneCost(uint32 runeCostID);
- void TakeRunePower();
void TakeReagents();
void TakeCastItem();
void TriggerSpell();
@@ -417,7 +386,6 @@ class Spell
int32 m_currentBasePoints[3]; // cache SpellEntry::EffectBasePoints and use for set custom base points
Item* m_CastItem;
uint8 m_cast_count;
- uint32 m_glyphIndex;
SpellCastTargets m_targets;
int32 GetCastTime() const { return m_casttime; }
@@ -454,7 +422,7 @@ class Spell
void UpdatePointers(); // must be used at call Spell code after time delay (non triggered spell cast/update spell call/etc)
- bool IsAffectedByAura(Aura *aura);
+ bool IsAffectedBy(SpellEntry const *spellInfo, uint32 effectId);
bool CheckTargetCreatureType(Unit* target) const;
@@ -481,7 +449,6 @@ class Spell
int32 m_casttime; // Calculated spell cast time initialized only in Spell::prepare
bool m_canReflect; // can reflect this spell?
bool m_autoRepeat;
- uint8 m_runesState;
uint8 m_delayAtDamageCount;
int32 GetNextDelayAtDamageMsTime() { return m_delayAtDamageCount < 5 ? 1000 - (m_delayAtDamageCount++)* 200 : 200; }
diff --git a/src/game/SpellAuraDefines.h b/src/game/SpellAuraDefines.h
index 59bb8128e11..cf628515925 100644
--- a/src/game/SpellAuraDefines.h
+++ b/src/game/SpellAuraDefines.h
@@ -20,19 +20,14 @@
#ifndef TRINITY_SPELLAURADEFINES_H
#define TRINITY_SPELLAURADEFINES_H
-#define MAX_AURAS 64 // client support up to 255, but it will cause problems with group auras updating
+#define MAX_AURAS 56
+#define MAX_POSITIVE_AURAS 40
enum AURA_FLAGS
{
- AFLAG_NONE = 0x00,
- AFLAG_EFF_INDEX_0 = 0x01,
- AFLAG_EFF_INDEX_1 = 0x02,
- AFLAG_EFF_INDEX_2 = 0x04,
- AFLAG_NOT_CASTER = 0x08,
- AFLAG_POSITIVE = 0x10,
- AFLAG_DURATION = 0x20,
- AFLAG_UNK2 = 0x40,
- AFLAG_NEGATIVE = 0x80
+ AFLAG_NEGATIVE = 0x09,
+ AFLAG_POSITIVE = 0x1F,
+ AFLAG_MASK = 0xFF
};
//m_schoolAbsorb
@@ -238,7 +233,7 @@ enum AuraType
SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED = 191,
SPELL_AURA_HASTE_MELEE = 192,
SPELL_AURA_MELEE_SLOW = 193,
- SPELL_AURA_MOD_IGNORE_ABSORB_SCHOOL = 194,
+ SPELL_AURA_MOD_DEPRICATED_1 = 194, // not used now, old SPELL_AURA_MOD_SPELL_DAMAGE_OF_INTELLECT
SPELL_AURA_MOD_DEPRICATED_2 = 195, // not used now, old SPELL_AURA_MOD_SPELL_HEALING_OF_INTELLECT
SPELL_AURA_MOD_COOLDOWN = 196, // only 24818 Noxious Breath
SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE = 197,
@@ -280,7 +275,7 @@ enum AuraType
SPELL_AURA_233 = 233,
SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK = 234,
SPELL_AURA_MOD_DISPEL_RESIST = 235,
- SPELL_AURA_CONTROL_VEHICLE = 236,
+ SPELL_AURA_236 = 236,
SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER = 237,
SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER = 238,
SPELL_AURA_MOD_SCALE_2 = 239,
@@ -290,51 +285,28 @@ enum AuraType
SPELL_AURA_243 = 243,
SPELL_AURA_COMPREHEND_LANGUAGE = 244,
SPELL_AURA_MOD_DURATION_OF_MAGIC_EFFECTS = 245,
- SPELL_AURA_MOD_DURATION_OF_EFFECTS_BY_DISPEL = 246,
+ SPELL_AURA_246 = 246,
SPELL_AURA_247 = 247,
SPELL_AURA_MOD_COMBAT_RESULT_CHANCE = 248,
- SPELL_AURA_CONVERT_RUNE = 249,
+ SPELL_AURA_249 = 249,
SPELL_AURA_MOD_INCREASE_HEALTH_2 = 250,
SPELL_AURA_MOD_ENEMY_DODGE = 251,
SPELL_AURA_252 = 252,
- SPELL_AURA_MOD_BLOCK_CRIT_CHANCE = 253,
- SPELL_AURA_MOD_DISARM_SHIELD = 254,
- SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT = 255,
- SPELL_AURA_NO_REAGENT_USE = 256,
- SPELL_AURA_MOD_TARGET_RESIST_BY_SPELL_CLASS = 257,
+ SPELL_AURA_253 = 253,
+ SPELL_AURA_254 = 254,
+ SPELL_AURA_255 = 255,
+ SPELL_AURA_256 = 256,
+ SPELL_AURA_257 = 257,
SPELL_AURA_258 = 258,
SPELL_AURA_259 = 259,
SPELL_AURA_260 = 260,
SPELL_AURA_261 = 261,
- SPELL_AURA_262 = 262,
- SPELL_AURA_ALLOW_ONLY_ABILITY = 263,
- SPELL_AURA_264 = 264,
- SPELL_AURA_265 = 265,
- SPELL_AURA_266 = 266,
- SPELL_AURA_267 = 267,
- SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT = 268,
- SPELL_AURA_269 = 269,
- SPELL_AURA_270 = 270,
- SPELL_AURA_271 = 271,
- SPELL_AURA_272 = 272,
- SPELL_AURA_273 = 273,
- SPELL_AURA_274 = 274,
- SPELL_AURA_MOD_IGNORE_SHAPESHIFT = 275,
- SPELL_AURA_276 = 276, // Only "Test Mod Damage % Mechanic" spell, possible mod damage done
- SPELL_AURA_MOD_MAX_AFFECTED_TARGETS = 277,
- SPELL_AURA_MOD_DISARM_RANGED = 278,
- SPELL_AURA_279 = 279,
- SPELL_AURA_MOD_TARGET_ARMOR_PCT = 280,
- SPELL_AURA_MOD_HONOR_GAIN = 281,
- SPELL_AURA_MOD_BASE_HEALTH_PCT = 282,
- SPELL_AURA_MOD_HEALING_RECEIVED = 283, // Possibly only for some spell family class spells
- TOTAL_AURAS = 284
+ TOTAL_AURAS=262
};
enum AreaAuraType
{
AREA_AURA_PARTY,
- AREA_AURA_RAID,
AREA_AURA_FRIEND,
AREA_AURA_ENEMY,
AREA_AURA_PET,
diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp
index 75c78003857..36feb9b9375 100644
--- a/src/game/SpellAuras.cpp
+++ b/src/game/SpellAuras.cpp
@@ -163,7 +163,7 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
&Aura::HandleAuraHover, //106 SPELL_AURA_HOVER
&Aura::HandleAddModifier, //107 SPELL_AURA_ADD_FLAT_MODIFIER
&Aura::HandleAddModifier, //108 SPELL_AURA_ADD_PCT_MODIFIER
- &Aura::HandleAddTargetTrigger, //109 SPELL_AURA_ADD_TARGET_TRIGGER
+ &Aura::HandleNoImmediateEffect, //109 SPELL_AURA_ADD_TARGET_TRIGGER
&Aura::HandleModPowerRegenPCT, //110 SPELL_AURA_MOD_POWER_REGEN_PERCENT
&Aura::HandleNULL, //111 SPELL_AURA_ADD_CASTER_HIT_TRIGGER
&Aura::HandleNoImmediateEffect, //112 SPELL_AURA_OVERRIDE_CLASS_SCRIPTS
@@ -228,7 +228,7 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
&Aura::HandleAuraModIncreaseSpeed, //171 SPELL_AURA_MOD_SPEED_NOT_STACK
&Aura::HandleAuraModIncreaseMountedSpeed, //172 SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK
&Aura::HandleUnused, //173 SPELL_AURA_ALLOW_CHAMPION_SPELLS only for Proclaim Champion spell
- &Aura::HandleModSpellDamagePercentFromStat, //174 SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT implemented in Unit::SpellBaseDamageBonus
+ &Aura::HandleModSpellDamagePercentFromStat, //174 SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT implemented in Unit::SpellBaseDamageBonus (by default intellect, dependent from SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT)
&Aura::HandleModSpellHealingPercentFromStat, //175 SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT implemented in Unit::SpellBaseHealingBonus
&Aura::HandleSpiritOfRedemption, //176 SPELL_AURA_SPIRIT_OF_REDEMPTION only for Spirit of Redemption spell, die at aura end
&Aura::HandleNULL, //177 SPELL_AURA_AOE_CHARM
@@ -248,7 +248,7 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
&Aura::HandleAuraModUseNormalSpeed, //191 SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED
&Aura::HandleModMeleeRangedSpeedPct, //192 SPELL_AURA_HASTE_MELEE
&Aura::HandleModCombatSpeedPct, //193 SPELL_AURA_MELEE_SLOW (in fact combat (any type attack) speed pct)
- &Aura::HandleUnused, //194 SPELL_AURA_MOD_IGNORE_ABSORB_SCHOOL
+ &Aura::HandleUnused, //194 SPELL_AURA_MOD_DEPRICATED_1 not used now (old SPELL_AURA_MOD_SPELL_DAMAGE_OF_INTELLECT)
&Aura::HandleUnused, //195 SPELL_AURA_MOD_DEPRICATED_2 not used now (old SPELL_AURA_MOD_SPELL_HEALING_OF_INTELLECT)
&Aura::HandleNULL, //196 SPELL_AURA_MOD_COOLDOWN
&Aura::HandleNoImmediateEffect, //197 SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE implemented in Unit::SpellCriticalBonus Unit::GetUnitCriticalChance
@@ -274,7 +274,7 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
&Aura::HandleUnused, //217 unused
&Aura::HandleAuraModRangedHaste, //218 SPELL_AURA_HASTE_RANGED
&Aura::HandleModManaRegen, //219 SPELL_AURA_MOD_MANA_REGEN_FROM_STAT
- &Aura::HandleModRatingFromStat, //220 SPELL_AURA_MOD_RATING_FROM_STAT
+ &Aura::HandleNULL, //220 SPELL_AURA_MOD_RATING_FROM_STAT
&Aura::HandleNULL, //221 ignored
&Aura::HandleUnused, //222 unused
&Aura::HandleNULL, //223 Cold Stare
@@ -290,7 +290,7 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
&Aura::HandleNULL, //233 set model id to the one of the creature with id m_modifier.m_miscvalue
&Aura::HandleNoImmediateEffect, //234 SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK implement in Unit::CalculateSpellDuration
&Aura::HandleAuraModDispelResist, //235 SPELL_AURA_MOD_DISPEL_RESIST implement in Unit::MagicSpellHitResult
- &Aura::HandleAuraControlVehicle, //236 SPELL_AURA_CONTROL_VEHICLE
+ &Aura::HandleUnused, //236 unused
&Aura::HandleModSpellDamagePercentFromAttackPower, //237 SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER implemented in Unit::SpellBaseDamageBonus
&Aura::HandleModSpellHealingPercentFromAttackPower, //238 SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER implemented in Unit::SpellBaseHealingBonus
&Aura::HandleAuraModScale, //239 SPELL_AURA_MOD_SCALE_2 only in Noggenfogger Elixir (16595) before 2.3.0 aura 61
@@ -300,44 +300,22 @@ pAuraHandler AuraHandler[TOTAL_AURAS]=
&Aura::HandleUnused, //243 used by two test spells
&Aura::HandleComprehendLanguage, //244 Comprehend language
&Aura::HandleUnused, //245 SPELL_AURA_MOD_DURATION_OF_MAGIC_EFFECTS
- &Aura::HandleNoImmediateEffect, //246 SPELL_AURA_MOD_DURATION_OF_EFFECTS_BY_DISPEL
+ &Aura::HandleUnused, //246 unused
&Aura::HandleUnused, //247 unused
&Aura::HandleNoImmediateEffect, //248 SPELL_AURA_MOD_COMBAT_RESULT_CHANCE implemented in Unit::RollMeleeOutcomeAgainst
- &Aura::HandleAuraConvertRune, //249 SPELL_AURA_CONVERT_RUNE
+ &Aura::HandleNULL, //249
&Aura::HandleAuraModIncreaseHealth, //250 SPELL_AURA_MOD_INCREASE_HEALTH_2
&Aura::HandleNULL, //251 SPELL_AURA_MOD_ENEMY_DODGE
- &Aura::HandleNULL, //252 haste all?
- &Aura::HandleNULL, //253 SPELL_AURA_MOD_BLOCK_CRIT_CHANCE
- &Aura::HandleNULL, //254 SPELL_AURA_MOD_DISARM_SHIELD disarm Shield
- &Aura::HandleNULL, //255 SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT
- &Aura::HandleNoReagentUseAura, //256 SPELL_AURA_NO_REAGENT_USE Use SpellClassMask for spell select
- &Aura::HandleNULL, //257 SPELL_AURA_MOD_TARGET_RESIST_BY_SPELL_CLASS Use SpellClassMask for spell select
- &Aura::HandleNULL, //258 SPELL_AURA_MOD_SPELL_VISUAL
- &Aura::HandleNULL, //259 corrupt healing over time spell
- &Aura::HandleNULL, //260
- &Aura::HandleNULL, //261 out of phase?
- &Aura::HandleNULL, //262
- &Aura::HandleNULL, //263 SPELL_AURA_ALLOW_ONLY_ABILITY player can use only abilites set in SpellClassMask
- &Aura::HandleNULL, //264 unused
- &Aura::HandleNULL, //265 unused
- &Aura::HandleNULL, //266 unused
- &Aura::HandleNULL, //267 some immunity?
- &Aura::HandleAuraModAttackPowerOfStatPercent, //268 SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT
- &Aura::HandleNULL, //269 ignore DR effects?
- &Aura::HandleNULL, //270
- &Aura::HandleNULL, //271 increase damage done?
- &Aura::HandleNULL, //272 reduce spell cast time?
- &Aura::HandleNULL, //273
- &Aura::HandleNULL, //274 proc free shot?
- &Aura::HandleNoImmediateEffect, //275 SPELL_AURA_MOD_IGNORE_SHAPESHIFT Use SpellClassMask for spell select
- &Aura::HandleNULL, //276 mod damage % mechanic?
- &Aura::HandleNoImmediateEffect, //277 SPELL_AURA_MOD_MAX_AFFECTED_TARGETS Use SpellClassMask for spell select
- &Aura::HandleNULL, //278 SPELL_AURA_MOD_DISARM_RANGED disarm ranged weapon
- &Aura::HandleNULL, //279
- &Aura::HandleNULL, //280 SPELL_AURA_MOD_TARGET_ARMOR_PCT
- &Aura::HandleNULL, //281 SPELL_AURA_MOD_HONOR_GAIN
- &Aura::HandleAuraIncreaseBaseHealthPercent, //282 SPELL_AURA_INCREASE_BASE_HEALTH_PERCENT
- &Aura::HandleNULL //283 SPD/heal from AP?
+ &Aura::HandleUnused, //252 unused
+ &Aura::HandleUnused, //253 unused
+ &Aura::HandleUnused, //254 unused
+ &Aura::HandleUnused, //255 unused
+ &Aura::HandleUnused, //256 unused
+ &Aura::HandleUnused, //257 unused
+ &Aura::HandleUnused, //258 unused
+ &Aura::HandleUnused, //259 unused
+ &Aura::HandleUnused, //260 unused
+ &Aura::HandleNULL //261 SPELL_AURA_261 some phased state (44856 spell)
};
Aura::Aura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster, Item* castItem) :
@@ -456,11 +434,6 @@ Unit *caster, Item* castItem) : Aura(spellproto, eff, currentBasePoints, target,
if(target->GetTypeId() == TYPEID_UNIT && ((Creature*)target)->isTotem())
m_modifier.m_auraname = SPELL_AURA_NONE;
break;
- case SPELL_EFFECT_APPLY_AREA_AURA_RAID:
- m_areaAuraType = AREA_AURA_RAID;
- if(target->GetTypeId() == TYPEID_UNIT && ((Creature*)target)->isTotem())
- m_modifier.m_auraname = SPELL_AURA_NONE;
- break;
case SPELL_EFFECT_APPLY_AREA_AURA_FRIEND:
m_areaAuraType = AREA_AURA_FRIEND;
break;
@@ -627,8 +600,8 @@ void AreaAura::Update(uint32 diff)
switch(m_areaAuraType)
{
- case AREA_AURA_RAID:
- caster->GetRaidMember(targets, m_radius);
+ case AREA_AURA_PARTY:
+ caster->GetPartyMember(targets, m_radius);
break;
case AREA_AURA_FRIEND:
{
@@ -711,24 +684,6 @@ void AreaAura::Update(uint32 diff)
tmp_target->RemoveAura(tmp_spellId, tmp_effIndex);
}
}
- else if( m_areaAuraType == AREA_AURA_RAID) // TODO: fix me!
- {
- // not check group if target == owner or target == pet
- if (caster->GetCharmerOrOwnerGUID() != tmp_target->GetGUID() && caster->GetGUID() != tmp_target->GetCharmerOrOwnerGUID())
- {
- Player* check = caster->GetCharmerOrOwnerPlayerOrPlayerItself();
-
- Group *pGroup = check ? check->GetGroup() : NULL;
- if( pGroup )
- {
- Player* checkTarget = tmp_target->GetCharmerOrOwnerPlayerOrPlayerItself();
- if(!checkTarget)
- tmp_target->RemoveAura(tmp_spellId, tmp_effIndex);
- }
- else
- tmp_target->RemoveAura(tmp_spellId, tmp_effIndex);
- }
- }
else if( m_areaAuraType == AREA_AURA_PET || m_areaAuraType == AREA_AURA_OWNER )
{
if( tmp_target->GetGUID() != caster->GetCharmerOrOwnerGUID() )
@@ -779,6 +734,47 @@ void Aura::ApplyModifier(bool apply, bool Real)
m_in_use = false;
}
+void Aura::UpdateAuraDuration()
+{
+ if(m_auraSlot >= MAX_AURAS || m_isPassive)
+ return;
+
+ if( m_target->GetTypeId() == TYPEID_PLAYER)
+ {
+ WorldPacket data(SMSG_UPDATE_AURA_DURATION, 5);
+ data << (uint8)m_auraSlot << (uint32)m_duration;
+ ((Player*)m_target)->SendDirectMessage(&data);
+
+ data.Initialize(SMSG_SET_EXTRA_AURA_INFO, (8+1+4+4+4));
+ data.append(m_target->GetPackGUID());
+ data << uint8(m_auraSlot);
+ data << uint32(GetId());
+ data << uint32(GetAuraMaxDuration());
+ data << uint32(GetAuraDuration());
+ ((Player*)m_target)->SendDirectMessage(&data);
+ }
+
+ // not send in case player loading (will not work anyway until player not added to map), sent in visibility change code
+ if(m_target->GetTypeId() == TYPEID_PLAYER && ((Player*)m_target)->GetSession()->PlayerLoading())
+ return;
+
+ Unit* caster = GetCaster();
+
+ if(caster && caster->GetTypeId() == TYPEID_PLAYER && caster != m_target)
+ SendAuraDurationForCaster((Player*)caster);
+}
+
+void Aura::SendAuraDurationForCaster(Player* caster)
+{
+ WorldPacket data(SMSG_SET_EXTRA_AURA_INFO_NEED_UPDATE, (8+1+4+4+4));
+ data.append(m_target->GetPackGUID());
+ data << uint8(m_auraSlot);
+ data << uint32(GetId());
+ data << uint32(GetAuraMaxDuration()); // full
+ data << uint32(GetAuraDuration()); // remain
+ caster->GetSession()->SendPacket(&data);
+}
+
void Aura::_AddAura()
{
if (!GetId())
@@ -844,13 +840,22 @@ void Aura::_AddAura()
{
if(!secondaura) // new slot need
{
- if(m_target->GetVisibleAurasCount() < MAX_AURAS)
+ if (IsPositive()) // empty positive slot
{
- Unit::VisibleAuraMap const *visibleAuras = m_target->GetVisibleAuras();
- for(uint8 i = 0; i < MAX_AURAS; ++i)
+ for (uint8 i = 0; i < MAX_POSITIVE_AURAS; i++)
{
- Unit::VisibleAuraMap::const_iterator itr = visibleAuras->find(i);
- if(itr == visibleAuras->end())
+ if (m_target->GetUInt32Value((uint16)(UNIT_FIELD_AURA + i)) == 0)
+ {
+ slot = i;
+ break;
+ }
+ }
+ }
+ else // empty negative slot
+ {
+ for (uint8 i = MAX_POSITIVE_AURAS; i < MAX_AURAS; i++)
+ {
+ if (m_target->GetUInt32Value((uint16)(UNIT_FIELD_AURA + i)) == 0)
{
slot = i;
break;
@@ -863,12 +868,11 @@ void Aura::_AddAura()
// Not update fields for not first spell's aura, all data already in fields
if(slot < MAX_AURAS) // slot found
{
- SetAura(false);
- SetAuraFlags((1 << GetEffIndex()) | AFLAG_NOT_CASTER | ((GetAuraMaxDuration() > 0) ? AFLAG_DURATION : AFLAG_NONE) | (IsPositive() ? AFLAG_POSITIVE : AFLAG_NEGATIVE));
- SetAuraLevel(caster ? caster->getLevel() : sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL));
+ SetAura(slot, false);
+ SetAuraFlag(slot, true);
+ SetAuraLevel(slot,caster ? caster->getLevel() : sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL));
UpdateAuraCharges();
- SendAuraUpdate(false);
-
+
// update for out of range group members
m_target->UpdateAuraForGroup(slot);
}
@@ -926,7 +930,7 @@ void Aura::_RemoveAura()
if(slot >= MAX_AURAS) // slot not set
return;
- if(m_target->GetVisibleAura(slot) == 0)
+ if(m_target->GetUInt32Value((uint16)(UNIT_FIELD_AURA + slot)) == 0)
return;
bool samespell = false;
@@ -951,12 +955,11 @@ void Aura::_RemoveAura()
// only remove icon when the last aura of the spell is removed (current aura already removed from list)
if (!samespell)
{
- SetAura(true);
- SetAuraFlags(AFLAG_NONE);
- SetAuraLevel(0);
- SetAuraCharges(0);
- SendAuraUpdate(true);
+ SetAura(slot, true);
+ SetAuraFlag(slot, false);
+ SetAuraLevel(slot,caster ? caster->getLevel() : sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL));
+ SetAuraApplication(slot, 0);
// update for out of range group members
m_target->UpdateAuraForGroup(slot);
@@ -995,36 +998,40 @@ void Aura::_RemoveAura()
}
}
-void Aura::SendAuraUpdate(bool remove)
+void Aura::SetAuraFlag(uint32 slot, bool add)
{
- WorldPacket data(SMSG_AURA_UPDATE);
- data.append(m_target->GetPackGUID());
- data << uint8(GetAuraSlot());
- data << uint32(remove ? 0 : GetId());
-
- if(remove)
+ uint32 index = slot / 4;
+ uint32 byte = (slot % 4) * 8;
+ uint32 val = m_target->GetUInt32Value(UNIT_FIELD_AURAFLAGS + index);
+ val &= ~((uint32)AFLAG_MASK << byte);
+ if(add)
{
- m_target->SendMessageToSet(&data, true);
- return;
- }
-
- uint8 auraFlags = GetAuraFlags();
- data << uint8(auraFlags);
- data << uint8(GetAuraLevel());
- data << uint8(m_procCharges >= 0 ? m_procCharges : 0);
-
- if(!(auraFlags & AFLAG_NOT_CASTER))
- {
- data << uint8(0); // pguid
+ if (IsPositive())
+ val |= ((uint32)AFLAG_POSITIVE << byte);
+ else
+ val |= ((uint32)AFLAG_NEGATIVE << byte);
}
+ m_target->SetUInt32Value(UNIT_FIELD_AURAFLAGS + index, val);
+}
- if(auraFlags & AFLAG_DURATION)
- {
- data << uint32(GetAuraMaxDuration());
- data << uint32(GetAuraDuration());
- }
+void Aura::SetAuraLevel(uint32 slot,uint32 level)
+{
+ uint32 index = slot / 4;
+ uint32 byte = (slot % 4) * 8;
+ uint32 val = m_target->GetUInt32Value(UNIT_FIELD_AURALEVELS + index);
+ val &= ~(0xFF << byte);
+ val |= (level << byte);
+ m_target->SetUInt32Value(UNIT_FIELD_AURALEVELS + index, val);
+}
- m_target->SendMessageToSet(&data, true);
+void Aura::SetAuraApplication(uint32 slot, int8 count)
+{
+ uint32 index = slot / 4;
+ uint32 byte = (slot % 4) * 8;
+ uint32 val = m_target->GetUInt32Value(UNIT_FIELD_AURAAPPLICATIONS + index);
+ val &= ~(0xFF << byte);
+ val |= ((uint8(count)) << byte);
+ m_target->SetUInt32Value(UNIT_FIELD_AURAAPPLICATIONS + index, val);
}
void Aura::UpdateSlotCounterAndDuration()
@@ -1037,26 +1044,10 @@ void Aura::UpdateSlotCounterAndDuration()
// Charge = 0; Stack >= 0
// Charge = 1; Stack >= 0
// Charge > 1; Stack = 0
- //SetAuraDuration(GetAuraDuration());
if(m_procCharges < 2)
- {
- SetAuraCharges(m_stackAmount-1);
- SendAuraUpdate(false);
- }
-}
+ SetAuraApplication(slot, m_stackAmount-1);
-bool Aura::isAffectedOnSpell(SpellEntry const *spell) const
-{
- // Check family name
- if (spell->SpellFamilyName != m_spellProto->SpellFamilyName)
- return false;
- // Check EffectClassMask
- uint32 const *ptr = getAuraSpellClassMask();
- if (((uint64*)ptr)[0] & spell->SpellFamilyFlags)
- return true;
- if (ptr[2] & spell->SpellFamilyFlags2)
- return true;
- return false;
+ UpdateAuraDuration();
}
/*********************************************************/
@@ -1067,6 +1058,10 @@ void Aura::HandleAddModifier(bool apply, bool Real)
if(m_target->GetTypeId() != TYPEID_PLAYER || !Real)
return;
+ SpellEntry const *spellInfo = GetSpellProto();
+ if(!spellInfo)
+ return;
+
if(m_modifier.m_miscvalue >= MAX_SPELLMOD)
return;
@@ -1087,25 +1082,15 @@ void Aura::HandleAddModifier(bool apply, bool Real)
mod->value = GetModifierValue();
mod->type = SpellModType(m_modifier.m_auraname); // SpellModType value == spell aura types
mod->spellId = GetId();
+ mod->effectId = m_effIndex;
+ mod->lastAffected = NULL;
- uint32 const *ptr;
- SpellAffectEntry const *spellAffect = spellmgr.GetSpellAffect(GetId(), m_effIndex);
- if (spellAffect)
- ptr = &spellAffect->SpellClassMask[0];
- else
- {
- switch (m_effIndex)
- {
- case 0: ptr = &m_spellProto->EffectSpellClassMaskA[0]; break;
- case 1: ptr = &m_spellProto->EffectSpellClassMaskB[0]; break;
- case 2: ptr = &m_spellProto->EffectSpellClassMaskC[0]; break;
- default:
- return;
- }
- }
+ uint64 spellAffectMask = spellmgr.GetSpellAffectMask(GetId(), m_effIndex);
- mod->mask = (uint64)ptr[0] | (uint64)ptr[1]<<32;
- mod->mask2= (uint64)ptr[2];
+ if (spellAffectMask)
+ mod->mask = spellAffectMask;
+ else
+ mod->mask = spellInfo->EffectItemType[m_effIndex];
if (m_procCharges > 0)
mod->charges = m_procCharges;
@@ -1120,7 +1105,7 @@ void Aura::HandleAddModifier(bool apply, bool Real)
((Player*)m_target)->AddSpellMod(m_spellmod, apply);
// reapply some passive spells after add/remove related spellmods
- if(m_spellProto->SpellFamilyName==SPELLFAMILY_WARRIOR && (spellFamilyMask & 0x0000100000000000LL))
+ if(spellInfo->SpellFamilyName==SPELLFAMILY_WARRIOR && (spellFamilyMask & 0x0000100000000000LL))
{
m_target->RemoveAurasDueToSpell(45471);
@@ -1128,42 +1113,7 @@ void Aura::HandleAddModifier(bool apply, bool Real)
m_target->CastSpell(m_target,45471,true);
}
}
-void Aura::HandleAddTargetTrigger(bool apply, bool Real)
-{
- // Use SpellModifier structure for check
- // used only fields:
- // spellId, mask, mask2
- if (apply)
- {
- SpellModifier *mod = new SpellModifier;
- mod->spellId = GetId();
-
- uint32 const *ptr;
- SpellAffectEntry const *spellAffect = spellmgr.GetSpellAffect(GetId(), m_effIndex);
- if (spellAffect)
- ptr = &spellAffect->SpellClassMask[0];
- else
- {
- switch (m_effIndex)
- {
- case 0: ptr = &m_spellProto->EffectSpellClassMaskA[0]; break;
- case 1: ptr = &m_spellProto->EffectSpellClassMaskB[0]; break;
- case 2: ptr = &m_spellProto->EffectSpellClassMaskC[0]; break;
- default:
- return;
- }
- }
- mod->mask = (uint64)ptr[0] | (uint64)ptr[1]<<32;
- mod->mask2= (uint64)ptr[2];
- m_spellmod = mod;
- }
- else
- {
- delete m_spellmod;
- m_spellmod = NULL;
- }
-}
void Aura::TriggerSpell()
{
Unit* caster = GetCaster();
@@ -2139,8 +2089,10 @@ void Aura::HandleAuraDummy(bool apply, bool Real)
mod->value = m_modifier.m_amount/7;
mod->type = SPELLMOD_FLAT;
mod->spellId = GetId();
+ mod->effectId = m_effIndex;
+ mod->lastAffected = NULL;
mod->mask = 0x001000000000LL;
- mod->mask2= 0LL;
+ mod->charges = 0;
m_spellmod = mod;
}
@@ -2163,8 +2115,10 @@ void Aura::HandleAuraDummy(bool apply, bool Real)
mod->value = m_modifier.m_amount;
mod->type = SPELLMOD_FLAT;
mod->spellId = GetId();
+ mod->effectId = m_effIndex;
+ mod->lastAffected = NULL;
mod->mask = 0x4000000000000LL;
- mod->mask2= 0LL;
+ mod->charges = 0;
m_spellmod = mod;
}
@@ -2186,17 +2140,18 @@ void Aura::HandleAuraDummy(bool apply, bool Real)
mod->value = m_modifier.m_amount;
mod->type = SPELLMOD_PCT;
mod->spellId = GetId();
+ mod->effectId = m_effIndex;
+ mod->lastAffected = NULL;
switch (m_effIndex)
{
case 0:
mod->mask = 0x00200000000LL; // Windfury Totem
- mod->mask2= 0LL;
break;
case 1:
mod->mask = 0x00400000000LL; // Flametongue Totem
- mod->mask2= 0LL;
break;
}
+ mod->charges = 0;
m_spellmod = mod;
}
@@ -2243,8 +2198,6 @@ void Aura::HandleAuraPeriodicDummy(bool apply, bool Real)
if(!Real)
return;
- Unit* caster = GetCaster();
-
SpellEntry const*spell = GetSpellProto();
switch( spell->SpellFamilyName)
{
@@ -2268,16 +2221,6 @@ void Aura::HandleAuraPeriodicDummy(bool apply, bool Real)
((Player*)m_target)->UpdateManaRegen();
break;
}
- // Explosive Shot
- if (spell->SpellFamilyFlags & 0x8000000000000000LL)
- {
- if (apply && caster)
- {
- int32 damage = m_modifier.m_amount + caster->GetTotalAttackPowerValue(RANGED_ATTACK) * 8 / 100;
- caster->CastCustomSpell(m_target, 53352, &damage, 0, 0, true, 0, this);
- }
- break;
- }
break;
}
}
@@ -2920,36 +2863,6 @@ void Aura::HandleModPossess(bool apply, bool Real)
}
else
m_target->UnpossessSelf(true);
- /*{
- m_target->SetCharmerGUID(0);
-
- if(m_target->GetTypeId() == TYPEID_PLAYER)
- ((Player*)m_target)->setFactionForRace(m_target->getRace());
- else if(m_target->GetTypeId() == TYPEID_UNIT)
- {
- CreatureInfo const *cinfo = ((Creature*)m_target)->GetCreatureInfo();
- m_target->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE,cinfo->faction_A);
- }
-
- caster->SetCharm(0);
-
- if(caster->GetTypeId() == TYPEID_PLAYER)
- {
- WorldPacket data(SMSG_PET_SPELLS, 8);
- data << uint64(0);
- data << uint32(0);
- ((Player*)caster)->GetSession()->SendPacket(&data);
- }
- if(m_target->GetTypeId() == TYPEID_UNIT)
- {
- ((Creature*)m_target)->AIM_Initialize();
-
- if (((Creature*)m_target)->AI())
- ((Creature*)m_target)->AI()->AttackStart(caster);
- }
- }
- if(caster->GetTypeId() == TYPEID_PLAYER)
- ((Player*)caster)->SetFarSight(apply ? m_target->GetGUID() : NULL);*/
}
void Aura::HandleModPossessPet(bool apply, bool Real)
@@ -2960,33 +2873,16 @@ void Aura::HandleModPossessPet(bool apply, bool Real)
Unit* caster = GetCaster();
if(!caster || caster->GetTypeId() != TYPEID_PLAYER)
return;
-
- Pet *pet = caster->GetPet();
- if(!pet || pet != m_target)
+ if(caster->GetPet() != m_target)
return;
if(apply)
- pet->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNKNOWN5);
- else
- pet->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNKNOWN5);
-
- ((Player*)caster)->SetFarSight(apply ? pet->GetGUID() : NULL);
- ((Player*)caster)->SetCharm(apply ? pet : NULL);
- ((Player*)caster)->SetClientControl(pet, apply ? 1 : 0);
-
- if(apply)
{
((Player*)caster)->Possess(m_target);
}
else
{
((Player*)caster)->RemovePossess(false);
- /*pet->StopMoving();
- pet->GetMotionMaster()->Clear();
- pet->GetMotionMaster()->MoveIdle();*/
- pet->AttackStop();
- pet->GetMotionMaster()->MoveFollow(caster, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
- pet->SetUnitMovementFlags(MOVEMENTFLAG_NONE);
}
}
@@ -3093,7 +2989,6 @@ void Aura::HandleModCharm(bool apply, bool Real)
{
WorldPacket data(SMSG_PET_SPELLS, 8);
data << uint64(0);
- data << uint32(0);
((Player*)caster)->GetSession()->SendPacket(&data);
}
}
@@ -4042,7 +3937,7 @@ void Aura::HandlePeriodicDamage(bool apply, bool Real)
case SPELLFAMILY_ROGUE:
{
// Deadly poison aura state
- if((m_spellProto->SpellFamilyFlags & 0x10000) && m_spellProto->SpellVisual[0]==5100)
+ if((m_spellProto->SpellFamilyFlags & 0x10000) && m_spellProto->SpellVisual==5100)
{
if(apply)
m_target->ModifyAuraState(AURA_STATE_DEADLY_POISON,true);
@@ -4054,7 +3949,7 @@ void Aura::HandlePeriodicDamage(bool apply, bool Real)
for(Unit::AuraList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
{
SpellEntry const* itr_spell = (*itr)->GetSpellProto();
- if(itr_spell && itr_spell->SpellFamilyName==SPELLFAMILY_ROGUE && (itr_spell->SpellFamilyFlags & 0x10000) && itr_spell->SpellVisual[0]==5100)
+ if(itr_spell && itr_spell->SpellFamilyName==SPELLFAMILY_ROGUE && (itr_spell->SpellFamilyFlags & 0x10000) && itr_spell->SpellVisual==5100)
{
found = true;
break;
@@ -4627,11 +4522,6 @@ void Aura::HandleAuraModIncreaseHealthPercent(bool apply, bool /*Real*/)
m_target->HandleStatModifier(UNIT_MOD_HEALTH, TOTAL_PCT, float(GetModifierValue()), apply);
}
-void Aura::HandleAuraIncreaseBaseHealthPercent(bool apply, bool /*Real*/)
-{
- m_target->HandleStatModifier(UNIT_MOD_HEALTH, BASE_PCT, float(m_modifier.m_amount), apply);
-}
-
/********************************/
/*** FIGHT ***/
/********************************/
@@ -4705,28 +4595,13 @@ void Aura::HandleAuraModCritPercent(bool apply, bool Real)
void Aura::HandleModHitChance(bool apply, bool Real)
{
- if(m_target->GetTypeId() == TYPEID_PLAYER)
- {
- ((Player*)m_target)->UpdateMeleeHitChances();
- ((Player*)m_target)->UpdateRangedHitChances();
- }
- else
- {
- m_target->m_modMeleeHitChance += apply ? m_modifier.m_amount : (-m_modifier.m_amount);
- m_target->m_modRangedHitChance += apply ? m_modifier.m_amount : (-m_modifier.m_amount);
- }
+ m_target->m_modMeleeHitChance += apply ? GetModifierValue() : -GetModifierValue();
+ m_target->m_modRangedHitChance += apply ? GetModifierValue() : -GetModifierValue();
}
void Aura::HandleModSpellHitChance(bool apply, bool Real)
{
- if(m_target->GetTypeId() == TYPEID_PLAYER)
- {
- ((Player*)m_target)->UpdateSpellHitChances();
- }
- else
- {
- m_target->m_modSpellHitChance += apply ? m_modifier.m_amount: (-m_modifier.m_amount);
- }
+ m_target->m_modSpellHitChance += apply ? GetModifierValue(): -GetModifierValue();
}
void Aura::HandleModSpellCritChance(bool apply, bool Real)
@@ -4851,21 +4726,15 @@ void Aura::HandleAuraModRangedAttackPowerOfStatPercent(bool apply, bool Real)
if(m_target->GetTypeId() == TYPEID_PLAYER && (m_target->getClassMask() & CLASSMASK_WAND_USERS)!=0)
return;
- // Recalculate bonus
- ((Player*)m_target)->UpdateAttackPowerAndDamage(true);
-}
-
-void Aura::HandleAuraModAttackPowerOfStatPercent(bool apply, bool Real)
-{
- // spells required only Real aura add/remove
- if(!Real)
- return;
-
- if(m_target->GetTypeId() == TYPEID_PLAYER && (m_target->getClassMask() & CLASSMASK_WAND_USERS)!=0)
+ if(m_modifier.m_miscvalue != STAT_INTELLECT)
+ {
+ // support required adding UpdateAttackPowerAndDamage calls at stat update
+ sLog.outError("Aura SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT (212) need support non-intellect stats!");
return;
+ }
// Recalculate bonus
- ((Player*)m_target)->UpdateAttackPowerAndDamage(false);
+ ((Player*)m_target)->UpdateAttackPowerAndDamage(true);
}
/********************************/
@@ -5049,28 +4918,6 @@ void Aura::HandleModPowerCost(bool apply, bool Real)
m_target->ApplyModInt32Value(UNIT_FIELD_POWER_COST_MODIFIER+i,GetModifierValue(),apply);
}
-void Aura::HandleNoReagentUseAura(bool Apply, bool Real)
-{
- // spells required only Real aura add/remove
- if(!Real)
- return;
- if(m_target->GetTypeId() != TYPEID_PLAYER)
- return;
- uint32 mask[3] = {0, 0, 0};
- Unit::AuraList const& noReagent = m_target->GetAurasByType(SPELL_AURA_NO_REAGENT_USE);
- for(Unit::AuraList::const_iterator i = noReagent.begin(); i != noReagent.end(); ++i)
- {
- uint32 const *ptr = (*i)->getAuraSpellClassMask();
- mask[0]|=ptr[0];
- mask[1]|=ptr[1];
- mask[2]|=ptr[2];
- }
-
- m_target->SetUInt32Value(PLAYER_NO_REAGENT_COST_1 , mask[0]);
- m_target->SetUInt32Value(PLAYER_NO_REAGENT_COST_1+1, mask[1]);
- m_target->SetUInt32Value(PLAYER_NO_REAGENT_COST_1+2, mask[2]);
-}
-
/*********************************************************/
/*** OTHERS ***/
/*********************************************************/
@@ -5292,20 +5139,6 @@ void Aura::HandleModRating(bool apply, bool Real)
((Player*)m_target)->ApplyRatingMod(CombatRating(rating), GetModifierValue(), apply);
}
-void Aura::HandleModRatingFromStat(bool apply, bool Real)
-{
- // spells required only Real aura add/remove
- if(!Real)
- return;
-
- if(m_target->GetTypeId() != TYPEID_PLAYER)
- return;
- // Just recalculate ratings
- for (uint32 rating = 0; rating < MAX_COMBAT_RATING; ++rating)
- if (m_modifier.m_miscvalue & (1 << rating))
- ((Player*)m_target)->ApplyRatingMod(CombatRating(rating), 0, apply);
-}
-
void Aura::HandleForceMoveForward(bool apply, bool Real)
{
if(!Real || m_target->GetTypeId() != TYPEID_PLAYER)
@@ -5615,7 +5448,6 @@ void Aura::PeriodicTick()
data << (uint32)GetSpellSchoolMask(GetSpellProto()); // will be mask in 2.4.x
data << (uint32)absorb;
data << (uint32)resist;
- data << uint32(0); // wotlk
m_target->SendMessageToSet(&data,true);
Unit* target = m_target; // aura can be deleted in DealDamage
@@ -5779,7 +5611,7 @@ void Aura::PeriodicTick()
return;
// heal for caster damage (must be alive)
- if(m_target != pCaster && GetSpellProto()->SpellVisual[0]==163 && !pCaster->isAlive())
+ if(m_target != pCaster && GetSpellProto()->SpellVisual==163 && !pCaster->isAlive())
return;
// ignore non positive values (can be result apply spellmods to aura damage
@@ -5806,7 +5638,6 @@ void Aura::PeriodicTick()
data << uint32(1);
data << uint32(m_modifier.m_auraname);
data << (uint32)pdamage;
- data << uint32(0); // wotlk
m_target->SendMessageToSet(&data,true);
int32 gain = m_target->ModifyHealth(pdamage);
@@ -5826,7 +5657,7 @@ void Aura::PeriodicTick()
bool haveCastItem = GetCastItemGUID()!=0;
// heal for caster damage
- if(m_target!=pCaster && spellProto->SpellVisual[0]==163)
+ if(m_target!=pCaster && spellProto->SpellVisual==163)
{
uint32 dmg = spellProto->manaPerSecond;
if(pCaster->GetHealth() <= dmg && pCaster->GetTypeId()==TYPEID_PLAYER)
@@ -6047,136 +5878,114 @@ void Aura::PeriodicTick()
void Aura::PeriodicDummyTick()
{
- Unit *caster = GetCaster();
SpellEntry const* spell = GetSpellProto();
- switch (spell->SpellFamilyName)
- {
- case SPELLFAMILY_GENERIC:
- switch (spell->Id)
- {
- // Drink
- case 430:
- case 431:
- case 432:
- case 1133:
- case 1135:
- case 1137:
- case 10250:
- case 22734:
- case 27089:
- case 34291:
- case 43706:
- case 46755:
- case 49472: // Drink Coffee
- case 61830:
+ switch (spell->Id)
+ {
+ // Drink
+ case 430:
+ case 431:
+ case 432:
+ case 1133:
+ case 1135:
+ case 1137:
+ case 10250:
+ case 22734:
+ case 27089:
+ case 34291:
+ case 43706:
+ case 46755:
+ {
+ if (m_target->GetTypeId() != TYPEID_PLAYER)
+ return;
+ // Search SPELL_AURA_MOD_POWER_REGEN aura for this spell and add bonus
+ Unit::AuraList const& aura = m_target->GetAurasByType(SPELL_AURA_MOD_POWER_REGEN);
+ for(Unit::AuraList::const_iterator i = aura.begin(); i != aura.end(); ++i)
{
- if (m_target->GetTypeId() != TYPEID_PLAYER)
- return;
- // Search SPELL_AURA_MOD_POWER_REGEN aura for this spell and add bonus
- Unit::AuraList const& aura = m_target->GetAurasByType(SPELL_AURA_MOD_POWER_REGEN);
- for(Unit::AuraList::const_iterator i = aura.begin(); i != aura.end(); ++i)
+ if ((*i)->GetId() == GetId())
{
- if ((*i)->GetId() == GetId())
+ // Get tick number
+ int32 tick = (m_maxduration - m_duration) / m_modifier.periodictime;
+ // Default case (not on arenas)
+ if (tick == 0)
{
- // Get tick number
- int32 tick = (m_maxduration - m_duration) / m_modifier.periodictime;
- // Default case (not on arenas)
- if (tick == 0)
- {
- (*i)->GetModifier()->m_amount = m_modifier.m_amount;
- ((Player*)m_target)->UpdateManaRegen();
- // Disable continue
- m_isPeriodic = false;
- }
- return;
- //**********************************************
- // Code commended since arena patch not added
- // This feature uses only in arenas
- //**********************************************
- // Here need increase mana regen per tick (6 second rule)
- // on 0 tick - 0 (handled in 2 second)
- // on 1 tick - 166% (handled in 4 second)
- // on 2 tick - 133% (handled in 6 second)
- // Not need update after 3 tick
- /*
- if (tick > 3)
- return;
- // Apply bonus for 0 - 3 tick
- switch (tick)
- {
- case 0: // 0%
- (*i)->GetModifier()->m_amount = m_modifier.m_amount = 0;
- break;
- case 1: // 166%
- (*i)->GetModifier()->m_amount = m_modifier.m_amount * 5 / 3;
- break;
- case 2: // 133%
- (*i)->GetModifier()->m_amount = m_modifier.m_amount * 4 / 3;
- break;
- default: // 100% - normal regen
- (*i)->GetModifier()->m_amount = m_modifier.m_amount;
- break;
- }
+ (*i)->GetModifier()->m_amount = m_modifier.m_amount;
((Player*)m_target)->UpdateManaRegen();
- return;*/
+ // Disable continue
+ m_isPeriodic = false;
+ }
+ return;
+ //**********************************************
+ // Code commended since arena patch not added
+ // This feature uses only in arenas
+ //**********************************************
+ // Here need increase mana regen per tick (6 second rule)
+ // on 0 tick - 0 (handled in 2 second)
+ // on 1 tick - 166% (handled in 4 second)
+ // on 2 tick - 133% (handled in 6 second)
+ // Not need update after 3 tick
+ /*
+ if (tick > 3)
+ return;
+ // Apply bonus for 0 - 3 tick
+ switch (tick)
+ {
+ case 0: // 0%
+ (*i)->GetModifier()->m_amount = m_modifier.m_amount = 0;
+ break;
+ case 1: // 166%
+ (*i)->GetModifier()->m_amount = m_modifier.m_amount * 5 / 3;
+ break;
+ case 2: // 133%
+ (*i)->GetModifier()->m_amount = m_modifier.m_amount * 4 / 3;
+ break;
+ default: // 100% - normal regen
+ (*i)->GetModifier()->m_amount = m_modifier.m_amount;
+ break;
}
+ ((Player*)m_target)->UpdateManaRegen();
+ return;*/
}
- return;
- }
- // Forsaken Skills
- case 7054:
- {
- // Possibly need cast one of them (but
- // 7038 Forsaken Skill: Swords
- // 7039 Forsaken Skill: Axes
- // 7040 Forsaken Skill: Daggers
- // 7041 Forsaken Skill: Maces
- // 7042 Forsaken Skill: Staves
- // 7043 Forsaken Skill: Bows
- // 7044 Forsaken Skill: Guns
- // 7045 Forsaken Skill: 2H Axes
- // 7046 Forsaken Skill: 2H Maces
- // 7047 Forsaken Skill: 2H Swords
- // 7048 Forsaken Skill: Defense
- // 7049 Forsaken Skill: Fire
- // 7050 Forsaken Skill: Frost
- // 7051 Forsaken Skill: Holy
- // 7053 Forsaken Skill: Shadow
- return;
}
+ return;
+ }
// // Panda
// case 19230: break;
+// // Master of Subtlety
+// case 31666: break;
// // Gossip NPC Periodic - Talk
// case 33208: break;
// // Gossip NPC Periodic - Despawn
// case 33209: break;
-
- // TODO: now its not periodic dummy - need move out from here
- // Aspect of the Viper
- case 34074:
- {
- if (m_target->GetTypeId() != TYPEID_PLAYER)
- return;
- // Should be manauser
- if (m_target->getPowerType()!=POWER_MANA)
- return;
- if (!caster)
- return;
- // Regen amount is max (100% from spell) on 21% or less mana and min on 92.5% or greater mana (20% from spell)
- int mana = m_target->GetPower(POWER_MANA);
- int max_mana = m_target->GetMaxPower(POWER_MANA);
- int32 base_regen = caster->CalculateSpellDamage(m_spellProto, m_effIndex, m_currentBasePoints, m_target);
- float regen_pct = 1.20f - 1.1f * mana / max_mana;
- if (regen_pct > 1.0f) regen_pct = 1.0f;
- else if (regen_pct < 0.2f) regen_pct = 0.2f;
- m_modifier.m_amount = int32 (base_regen * regen_pct);
- ((Player*)m_target)->UpdateManaRegen();
+// // Force of Nature
+// case 33831: break;
+ // Aspect of the Viper
+ case 34074:
+ {
+ if (m_target->GetTypeId() != TYPEID_PLAYER)
return;
- }
+ // Should be manauser
+ if (m_target->getPowerType()!=POWER_MANA)
+ return;
+ Unit *caster = GetCaster();
+ if (!caster)
+ return;
+ // Regen amount is max (100% from spell) on 21% or less mana and min on 92.5% or greater mana (20% from spell)
+ int mana = m_target->GetPower(POWER_MANA);
+ int max_mana = m_target->GetMaxPower(POWER_MANA);
+ int32 base_regen = caster->CalculateSpellDamage(m_spellProto, m_effIndex, m_currentBasePoints, m_target);
+ float regen_pct = 1.20f - 1.1f * mana / max_mana;
+ if (regen_pct > 1.0f) regen_pct = 1.0f;
+ else if (regen_pct < 0.2f) regen_pct = 0.2f;
+ m_modifier.m_amount = int32 (base_regen * regen_pct);
+ ((Player*)m_target)->UpdateManaRegen();
+ return;
+ }
// // Steal Weapon
// case 36207: break;
// // Simon Game START timer, (DND)
// case 39993: break;
+// // Harpooner's Mark
+// case 40084: break;
// // Knockdown Fel Cannon: break; The Aggro Burst
// case 40119: break;
// // Old Mount Spell
@@ -6189,8 +5998,6 @@ void Aura::PeriodicDummyTick()
// case 40846: break;
// // Copy Weapon
// case 41054: break;
-// // Dementia
-// case 41404: break;
// // Ethereal Ring Visual, Lightning Aura
// case 41477: break;
// // Ethereal Ring Visual, Lightning Aura (Fork)
@@ -6239,8 +6046,6 @@ void Aura::PeriodicDummyTick()
// case 43310: break;
// // Headless Horseman - Maniacal Laugh, Maniacal, Delayed 17
// case 43884: break;
-// // Wretched!
-// case 43963: break;
// // Headless Horseman - Maniacal Laugh, Maniacal, other, Delayed 17
// case 44000: break;
// // Energy Feedback
@@ -6307,179 +6112,14 @@ void Aura::PeriodicDummyTick()
// case 47407: break;
// // Mole Machine Port Schedule
// case 47489: break;
-// case 47941: break; // Crystal Spike
-// case 48200: break; // Healer Aura
-// case 48630: break; // Summon Gauntlet Mobs Periodic
-// case 49313: break; // Proximity Mine Area Aura
// // Mole Machine Portal Schedule
// case 49466: break;
-// case 49555: break; // Corpse Explode
-// case 49592: break; // Temporal Rift
-// case 49957: break; // Cutting Laser
-// case 50085: break; // Slow Fall
+// // Drink Coffee
+// case 49472: break;
// // Listening to Music
// case 50493: break;
// // Love Rocket Barrage
// case 50530: break;
-// Exist more after, need add later
- default:
- break;
- }
- break;
- case SPELLFAMILY_MAGE:
- {
- // Mirror Image
-// if (spell->Id == 55342)
-// return;
- break;
- }
- case SPELLFAMILY_WARRIOR:
- {
- // Armored to the Teeth
- if (spell->SpellIconID == 3516)
- {
- // Increases your attack power by $s1 for every $s2 armor value you have.
- // Calculate AP bonus (from 1 efect of this spell)
- int32 apBonus = m_modifier.m_amount * m_target->GetArmor() / m_target->CalculateSpellDamage(spell, 1, spell->EffectBasePoints[1], m_target);
- m_target->CastCustomSpell(m_target, 61217, &apBonus, &apBonus, 0, true, 0, this);
- return;
- }
- break;
- }
- case SPELLFAMILY_DRUID:
- {
- switch (spell->Id)
- {
- // Frenzied Regeneration
- case 22842:
- {
- // Converts up to 10 rage per second into health for $d. Each point of rage is converted into ${$m2/10}.1% of max health.
- // Should be manauser
- if (m_target->getPowerType()!=POWER_RAGE)
- return;
- uint32 rage = m_target->GetPower(POWER_RAGE);
- // Nothing todo
- if (rage == 0)
- return;
- int32 mod = (rage < 100) ? rage : 100;
- int32 points = m_target->CalculateSpellDamage(spell, 1, spell->EffectBasePoints[1], m_target);
- int32 regen = m_target->GetMaxHealth() * (mod * points / 10) / 1000;
- m_target->CastCustomSpell(m_target, 22845, &regen, 0, 0, true, 0, this);
- m_target->SetPower(POWER_RAGE, rage-mod);
- return;
- }
- // Force of Nature
- case 33831:
- return;
- default:
- break;
- }
- break;
- }
- case SPELLFAMILY_ROGUE:
- {
-// switch (spell->Id)
-// {
- // Master of Subtlety
-// case 31666: break;
- // Killing Spree
-// case 51690: break;
- // Overkill
-// case 58428: break;
-// default:
-// break;
-// }
- break;
- }
- case SPELLFAMILY_HUNTER:
- {
- // Explosive Shot
- if (spell->SpellFamilyFlags & 0x8000000000000000LL)
- {
- if (!caster)
- return;
- // Skip 0 tick
- if (m_duration < m_modifier.periodictime)
- return;
- int32 damage = caster->CalculateSpellDamage(spell, GetEffIndex(), GetBasePoints(), m_target);
- damage+=caster->GetTotalAttackPowerValue(RANGED_ATTACK) * 8 / 100;
- damage/=4;
- caster->CastCustomSpell(m_target, 56298, &damage, 0, 0, true, 0, this);
- return;
- }
- switch (spell->Id)
- {
- // Harpooner's Mark
- // case 40084:
- // return;
- // Feeding Frenzy Rank 1
- case 53511:
- if ( m_target->GetHealth() * 100 < m_target->GetMaxHealth() * 35 )
- m_target->CastSpell(m_target, 60096, true, 0, this);
- return;
- // Feeding Frenzy Rank 2
- case 53512:
- if ( m_target->GetHealth() * 100 < m_target->GetMaxHealth() * 35 )
- m_target->CastSpell(m_target, 60097, true, 0, this);
- return;
- default:
- break;
- }
- break;
- }
- case SPELLFAMILY_SHAMAN:
- {
- // Astral Shift
-// if (spell->Id == 52179)
-// return;
- break;
- }
- case SPELLFAMILY_DEATHKNIGHT:
- {
- // Death and Decay
-// if (spell->SpellFamilyFlags & 0x0000000000000020LL)
-// return;
- // Raise Dead
-// if (spell->SpellFamilyFlags & 0x0000000000001000LL)
-// return;
- // Chains of Ice
- if (spell->SpellFamilyFlags & 0x0000400000000000LL)
- {
- // Get 0 effect aura
- Aura *slow = m_target->GetAura(GetId(), 0);
- if (slow)
- {
- slow->ApplyModifier(false, true);
- Modifier *mod = slow->GetModifier();
- mod->m_amount+= m_modifier.m_amount;
- if (mod->m_amount > 0) mod->m_amount = 0;
- slow->ApplyModifier(true, true);
- }
- return;
- }
- // Summon Gargoyle
-// if (spell->SpellFamilyFlags & 0x0000008000000000LL)
-// return;
- // Death Rune Mastery
-// if (spell->SpellFamilyFlags & 0x0000000000004000LL)
-// return;
- // Bladed Armor
- if (spell->SpellIconID == 2653)
- {
- // Increases your attack power by $s1 for every $s2 armor value you have.
- // Calculate AP bonus (from 1 efect of this spell)
- int32 apBonus = m_modifier.m_amount * m_target->GetArmor() / m_target->CalculateSpellDamage(spell, 1, spell->EffectBasePoints[1], m_target);
- m_target->CastCustomSpell(m_target, 61217, &apBonus, &apBonus, 0, true, 0, this);
- return;
- }
- // Reaping
-// if (spell->SpellIconID == 22)
-// return;
- // Blood of the North
-// if (spell->SpellIconID == 30412)
-// return;
- break;
- }
default:
break;
}
@@ -6545,61 +6185,14 @@ void Aura::HandleArenaPreparation(bool apply, bool Real)
m_target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PREPARATION);
}
-void Aura::HandleAuraControlVehicle(bool apply, bool Real)
-{
- if(!Real)
- return;
-
- if(m_target->GetTypeId() != TYPEID_PLAYER)
- return;
-
- if(Pet *pet = m_target->GetPet())
- pet->Remove(PET_SAVE_AS_CURRENT);
-
- WorldPacket data(SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, 0);
- ((Player*)m_target)->GetSession()->SendPacket(&data);
-}
-
-void Aura::HandleAuraConvertRune(bool apply, bool Real)
+void Aura::HandleModAttackerSpellHitChance(bool apply, bool Real)
{
if(!Real)
return;
- if(m_target->GetTypeId() != TYPEID_PLAYER)
- return;
-
- Player *plr = (Player*)m_target;
-
- if(plr->getClass() != CLASS_DEATH_KNIGHT)
- return;
-
- // how to determine what rune need to be converted?
- for(uint32 i = 0; i < MAX_RUNES; ++i)
- {
- if(apply)
- {
- if(!plr->GetRuneCooldown(i))
- {
- plr->ConvertRune(i, GetSpellProto()->EffectMiscValueB[m_effIndex]);
- break;
- }
- }
- else
- {
- if(plr->GetCurrentRune(i) == GetSpellProto()->EffectMiscValueB[m_effIndex])
- {
- plr->ConvertRune(i, plr->GetBaseRune(i));
- break;
- }
- }
- }
-}
-
-void Aura::HandleModAttackerSpellHitChance(bool apply, bool Real)
-{
if(GetId() != 31224)
return;
//cloak of shadows : flare
m_target->ApplySpellImmune(31224, IMMUNITY_ID, 1543, apply);
-}
+} \ No newline at end of file
diff --git a/src/game/SpellAuras.h b/src/game/SpellAuras.h
index 99c170d1139..1e9a8bd8c63 100644
--- a/src/game/SpellAuras.h
+++ b/src/game/SpellAuras.h
@@ -100,7 +100,6 @@ class TRINITY_DLL_SPEC Aura
void HandleAuraFeatherFall(bool Apply, bool Real);
void HandleAuraHover(bool Apply, bool Real);
void HandleAddModifier(bool Apply, bool Real);
- void HandleAddTargetTrigger(bool Apply, bool Real);
void HandleAuraModStun(bool Apply, bool Real);
void HandleModDamageDone(bool Apply, bool Real);
void HandleAuraUntrackable(bool Apply, bool Real);
@@ -185,12 +184,10 @@ class TRINITY_DLL_SPEC Aura
void HandleAuraGhost(bool Apply, bool Real);
void HandleAuraAllowFlight(bool Apply, bool Real);
void HandleModRating(bool apply, bool Real);
- void HandleModRatingFromStat(bool apply, bool Real);
void HandleModTargetResistance(bool apply, bool Real);
void HandleAuraModAttackPowerPercent(bool apply, bool Real);
void HandleAuraModRangedAttackPowerPercent(bool apply, bool Real);
void HandleAuraModRangedAttackPowerOfStatPercent(bool apply, bool Real);
- void HandleAuraModAttackPowerOfStatPercent(bool apply, bool Real);
void HandleSpiritOfRedemption(bool apply, bool Real);
void HandleModManaRegen(bool apply, bool Real);
void HandleComprehendLanguage(bool apply, bool Real);
@@ -200,7 +197,6 @@ class TRINITY_DLL_SPEC Aura
void HandleModSpellDamagePercentFromStat(bool apply, bool Real);
void HandleModSpellHealingPercentFromStat(bool apply, bool Real);
void HandleAuraModDispelResist(bool apply, bool Real);
- void HandleAuraControlVehicle(bool apply, bool Real);
void HandleModSpellDamagePercentFromAttackPower(bool apply, bool Real);
void HandleModSpellHealingPercentFromAttackPower(bool apply, bool Real);
void HandleAuraModPacifyAndSilence(bool Apply, bool Real);
@@ -213,9 +209,6 @@ class TRINITY_DLL_SPEC Aura
void HandlePreventFleeing(bool apply, bool Real);
void HandleManaShield(bool apply, bool Real);
void HandleArenaPreparation(bool apply, bool Real);
- void HandleAuraConvertRune(bool apply, bool Real);
- void HandleAuraIncreaseBaseHealthPercent(bool Apply, bool Real);
- void HandleNoReagentUseAura(bool Apply, bool Real);
void HandleModAttackerSpellHitChance(bool apply, bool Real);
virtual ~Aura();
@@ -238,8 +231,6 @@ class TRINITY_DLL_SPEC Aura
int32 GetAuraDuration() const { return m_duration; }
void SetAuraDuration(int32 duration) { m_duration = duration; }
time_t GetAuraApplyTime() { return m_applyTime; }
- SpellModifier *getAuraSpellMod() {return m_spellmod; }
-
void UpdateAuraDuration();
void SendAuraDurationForCaster(Player* caster);
void UpdateSlotCounterAndDuration();
@@ -259,19 +250,13 @@ class TRINITY_DLL_SPEC Aura
uint8 GetAuraSlot() const { return m_auraSlot; }
void SetAuraSlot(uint8 slot) { m_auraSlot = slot; }
- uint8 GetAuraFlags() const { return m_auraFlags; }
- void SetAuraFlags(uint8 flags) { m_auraFlags = flags; }
- uint8 GetAuraLevel() const { return m_auraLevel; }
- void SetAuraLevel(uint8 level) { m_auraLevel = level; }
- uint8 GetAuraCharges() const { return m_procCharges; }
- void SetAuraCharges(uint8 charges) { m_procCharges = charges; }
- void SetAura(bool remove) { m_target->SetVisibleAura(m_auraSlot, remove ? 0 : GetId()); }
- void SendAuraUpdate(bool remove);
void UpdateAuraCharges()
{
+ uint8 slot = GetAuraSlot();
+
// only aura in slot with charges and without stack limitation
- if (m_auraSlot < MAX_AURAS && m_procCharges >= 1 && GetSpellProto()->StackAmount==0)
- SendAuraUpdate(false);
+ if (slot < MAX_AURAS && m_procCharges >= 1 && GetSpellProto()->StackAmount==0)
+ SetAuraApplication(slot, m_procCharges - 1);
}
bool IsPositive() { return m_positive; }
@@ -315,9 +300,6 @@ class TRINITY_DLL_SPEC Aura
void PeriodicTick();
void PeriodicDummyTick();
- uint32 const *getAuraSpellClassMask() const { return m_spellProto->EffectSpellClassMaskA + m_effIndex * 3; }
- bool isAffectedOnSpell(SpellEntry const *spell) const;
-
int32 GetStackAmount() {return m_stackAmount;}
void SetStackAmount(int32 amount) {m_stackAmount=amount;}
protected:
@@ -339,8 +321,6 @@ class TRINITY_DLL_SPEC Aura
AuraRemoveMode m_removeMode;
uint8 m_auraSlot;
- uint8 m_auraFlags;
- uint8 m_auraLevel;
bool m_positive:1;
bool m_permanent:1;
@@ -361,6 +341,10 @@ class TRINITY_DLL_SPEC Aura
int32 m_stackAmount;
private:
void CleanupTriggeredSpells();
+ void SetAura(uint32 slot, bool remove) { m_target->SetUInt32Value(UNIT_FIELD_AURA + slot, remove ? 0 : GetId()); }
+ void SetAuraFlag(uint32 slot, bool add);
+ void SetAuraLevel(uint32 slot, uint32 level);
+ void SetAuraApplication(uint32 slot, int8 count);
};
class TRINITY_DLL_SPEC AreaAura : public Aura
diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp
index 59679dbd435..04a93bfb77c 100644
--- a/src/game/SpellEffects.cpp
+++ b/src/game/SpellEffects.cpp
@@ -128,16 +128,16 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]=
&Spell::EffectPowerBurn, // 62 SPELL_EFFECT_POWER_BURN
&Spell::EffectThreat, // 63 SPELL_EFFECT_THREAT
&Spell::EffectTriggerSpell, // 64 SPELL_EFFECT_TRIGGER_SPELL
- &Spell::EffectApplyAreaAura, // 65 SPELL_EFFECT_APPLY_AREA_AURA_RAID
- &Spell::EffectUnused, // 66 SPELL_EFFECT_CREATE_MANA_GEM (possibly recharge it, misc - is item ID)
+ &Spell::EffectUnused, // 65 SPELL_EFFECT_HEALTH_FUNNEL unused
+ &Spell::EffectUnused, // 66 SPELL_EFFECT_POWER_FUNNEL unused
&Spell::EffectHealMaxHealth, // 67 SPELL_EFFECT_HEAL_MAX_HEALTH
&Spell::EffectInterruptCast, // 68 SPELL_EFFECT_INTERRUPT_CAST
&Spell::EffectDistract, // 69 SPELL_EFFECT_DISTRACT
&Spell::EffectPull, // 70 SPELL_EFFECT_PULL one spell: Distract Move
&Spell::EffectPickPocket, // 71 SPELL_EFFECT_PICKPOCKET
&Spell::EffectAddFarsight, // 72 SPELL_EFFECT_ADD_FARSIGHT
- &Spell::EffectUnused, // 73 SPELL_EFFECT_UNTRAIN_TALENTS
- &Spell::EffectApplyGlyph, // 74 SPELL_EFFECT_APPLY_GLYPH
+ &Spell::EffectSummonPossessed, // 73 SPELL_EFFECT_SUMMON_POSSESSED
+ &Spell::EffectSummonTotem, // 74 SPELL_EFFECT_SUMMON_TOTEM
&Spell::EffectHealMechanical, // 75 SPELL_EFFECT_HEAL_MECHANICAL one spell: Mechanical Patch Kit
&Spell::EffectSummonObjectWild, // 76 SPELL_EFFECT_SUMMON_OBJECT_WILD
&Spell::EffectScriptEffect, // 77 SPELL_EFFECT_SCRIPT_EFFECT
@@ -150,10 +150,10 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]=
&Spell::EffectStuck, // 84 SPELL_EFFECT_STUCK
&Spell::EffectSummonPlayer, // 85 SPELL_EFFECT_SUMMON_PLAYER
&Spell::EffectActivateObject, // 86 SPELL_EFFECT_ACTIVATE_OBJECT
- &Spell::EffectUnused, // 87 SPELL_EFFECT_WMO_DAMAGE
- &Spell::EffectUnused, // 88 SPELL_EFFECT_WMO_REPAIR
- &Spell::EffectUnused, // 89 SPELL_EFFECT_WMO_CHANGE
- &Spell::EffectUnused, // 90 SPELL_EFFECT_KILL_CREDIT
+ &Spell::EffectSummonTotem, // 87 SPELL_EFFECT_SUMMON_TOTEM_SLOT1
+ &Spell::EffectSummonTotem, // 88 SPELL_EFFECT_SUMMON_TOTEM_SLOT2
+ &Spell::EffectSummonTotem, // 89 SPELL_EFFECT_SUMMON_TOTEM_SLOT3
+ &Spell::EffectSummonTotem, // 90 SPELL_EFFECT_SUMMON_TOTEM_SLOT4
&Spell::EffectUnused, // 91 SPELL_EFFECT_THREAT_ALL one spell: zzOLDBrainwash
&Spell::EffectEnchantHeldItem, // 92 SPELL_EFFECT_ENCHANT_HELD_ITEM
&Spell::EffectUnused, // 93 SPELL_EFFECT_SUMMON_PHANTASM
@@ -195,21 +195,21 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]=
&Spell::EffectApplyAreaAura, //129 SPELL_EFFECT_APPLY_AREA_AURA_ENEMY
&Spell::EffectRedirectThreat, //130 SPELL_EFFECT_REDIRECT_THREAT
&Spell::EffectUnused, //131 SPELL_EFFECT_131 used in some test spells
- &Spell::EffectNULL, //132 SPELL_EFFECT_PLAY_MUSIC sound id in misc value (SoundEntries.dbc)
+ &Spell::EffectNULL, //132 SPELL_EFFECT_PLAY_MUSIC sound id in misc value
&Spell::EffectUnlearnSpecialization, //133 SPELL_EFFECT_UNLEARN_SPECIALIZATION unlearn profession specialization
&Spell::EffectKillCredit, //134 SPELL_EFFECT_KILL_CREDIT misc value is creature entry
&Spell::EffectNULL, //135 SPELL_EFFECT_CALL_PET
&Spell::EffectHealPct, //136 SPELL_EFFECT_HEAL_PCT
&Spell::EffectEnergisePct, //137 SPELL_EFFECT_ENERGIZE_PCT
&Spell::EffectNULL, //138 SPELL_EFFECT_138 Leap
- &Spell::EffectUnused, //139 SPELL_EFFECT_CLEAR_QUEST (misc - is quest ID)
+ &Spell::EffectUnused, //139 SPELL_EFFECT_139 unused
&Spell::EffectForceCast, //140 SPELL_EFFECT_FORCE_CAST
&Spell::EffectNULL, //141 SPELL_EFFECT_141 damage and reduce speed?
&Spell::EffectTriggerSpellWithValue, //142 SPELL_EFFECT_TRIGGER_SPELL_WITH_VALUE
&Spell::EffectApplyAreaAura, //143 SPELL_EFFECT_APPLY_AREA_AURA_OWNER
&Spell::EffectNULL, //144 SPELL_EFFECT_144 Spectral Blast
&Spell::EffectNULL, //145 SPELL_EFFECT_145 Black Hole Effect
- &Spell::EffectActivateRune, //146 SPELL_EFFECT_ACTIVATE_RUNE
+ &Spell::EffectUnused, //146 SPELL_EFFECT_146 unused
&Spell::EffectQuestFail, //147 SPELL_EFFECT_QUEST_FAIL quest fail
&Spell::EffectUnused, //148 SPELL_EFFECT_148 unused
&Spell::EffectNULL, //149 SPELL_EFFECT_149 swoop
@@ -217,12 +217,6 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]=
&Spell::EffectTriggerRitualOfSummoning, //151 SPELL_EFFECT_TRIGGER_SPELL_2
&Spell::EffectNULL, //152 SPELL_EFFECT_152 summon Refer-a-Friend
&Spell::EffectNULL, //153 SPELL_EFFECT_CREATE_PET misc value is creature entry
- &Spell::EffectNULL, //154 unused
- &Spell::EffectTitanGrip, //155 SPELL_EFFECT_TITAN_GRIP Allows you to equip two-handed axes, maces and swords in one hand, but you attack $49152s1% slower than normal.
- &Spell::EffectNULL, //156 Add Socket
- &Spell::EffectNULL, //157 create/learn random item/spell for profession
- &Spell::EffectMilling, //158 milling
- &Spell::EffectNULL //159 allow rename pet once again
};
void Spell::EffectNULL(uint32 /*i*/)
@@ -341,13 +335,6 @@ void Spell::EffectSchoolDMG(uint32 effect_idx)
damage = 200;
break;
}
- // Intercept (warrior spell trigger)
- case 20253:
- case 61491:
- {
- damage+= uint32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.12f);
- break;
- }
// arcane charge. must only affect demons (also undead?)
case 45072:
{
@@ -397,12 +384,6 @@ void Spell::EffectSchoolDMG(uint32 effect_idx)
damage = uint32(damage * m_caster->GetTotalAttackPowerValue(BASE_ATTACK) / 100);
m_caster->ModifyAuraState(AURA_STATE_WARRIOR_VICTORY_RUSH, false);
}
- // Revenge ${$m1+$AP*0.207} to ${$M1+$AP*0.207}
- else if(m_spellInfo->SpellFamilyFlags & 0x0000000000000400LL)
- damage+= uint32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.207f);
- // Heroic Throw ${$m1+$AP*.50}
- else if(m_spellInfo->SpellFamilyFlags & 0x0000000100000000LL)
- damage+= uint32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK) * 0.5f);
break;
}
case SPELLFAMILY_WARLOCK:
@@ -412,20 +393,18 @@ void Spell::EffectSchoolDMG(uint32 effect_idx)
{
// Incinerate does more dmg (dmg*0.25) if the target is Immolated.
if(unitTarget->HasAuraState(AURA_STATE_IMMOLATE))
- damage += int32(damage*0.25f);
+ damage += int32(damage*0.25);
}
break;
}
case SPELLFAMILY_DRUID:
{
// Ferocious Bite
- if(m_caster->GetTypeId()==TYPEID_PLAYER && (m_spellInfo->SpellFamilyFlags & 0x000800000) && m_spellInfo->SpellVisual[0]==6587)
+ if((m_spellInfo->SpellFamilyFlags & 0x000800000) && m_spellInfo->SpellVisual==6587)
{
- // converts each extra point of energy into ($f1+$AP/410) additional damage
- float ap = m_caster->GetTotalAttackPowerValue(BASE_ATTACK);
- float multiple = ap / 410 + m_spellInfo->DmgMultiplier[effect_idx];
+ // converts each extra point of energy into ($f1+$AP/630) additional damage
+ float multiple = m_caster->GetTotalAttackPowerValue(BASE_ATTACK) / 630 + m_spellInfo->DmgMultiplier[effect_idx];
damage += int32(m_caster->GetPower(POWER_ENERGY) * multiple);
- damage += int32(((Player*)m_caster)->GetComboPoints() * ap * 7 / 100);
m_caster->SetPower(POWER_ENERGY,0);
}
// Rake
@@ -501,7 +480,7 @@ void Spell::EffectSchoolDMG(uint32 effect_idx)
{
// Deadly poison (only attacker applied)
if( (*itr)->GetSpellProto()->SpellFamilyName==SPELLFAMILY_ROGUE && ((*itr)->GetSpellProto()->SpellFamilyFlags & 0x10000) &&
- (*itr)->GetSpellProto()->SpellVisual[0]==5100 && (*itr)->GetCasterGUID()==m_caster->GetGUID() )
+ (*itr)->GetSpellProto()->SpellVisual==5100 && (*itr)->GetCasterGUID()==m_caster->GetGUID() )
{
--combo;
++doses;
@@ -527,47 +506,26 @@ void Spell::EffectSchoolDMG(uint32 effect_idx)
{
if(uint32 combo = ((Player*)m_caster)->GetComboPoints())
{
- float ap = m_caster->GetTotalAttackPowerValue(BASE_ATTACK);
- damage += irand(int32(ap * combo * 0.03f), int32(ap * combo * 0.07f));
+ damage += int32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK) * combo * 0.03f);
// Eviscerate and Envenom Bonus Damage (item set effect)
if(m_caster->GetDummyAura(37169))
damage += combo*40;
}
}
- // Gouge
- else if(m_spellInfo->SpellFamilyFlags & 0x0000000000000008LL)
- {
- damage += int32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK)*0.02f);
- }
- // Instant Poison
- else if(m_spellInfo->SpellFamilyFlags & 0x0000000000002000LL)
- {
- damage += int32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK)*0.10f);
- }
- // Wound Poison
- else if(m_spellInfo->SpellFamilyFlags & 0x0000000010000000LL)
- {
- damage += int32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK)*0.04f);
- }
break;
}
case SPELLFAMILY_HUNTER:
{
// Mongoose Bite
- if((m_spellInfo->SpellFamilyFlags & 0x000000002) && m_spellInfo->SpellVisual[0]==342)
- {
- damage += int32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK)*0.2f);
- }
- // Counterattack
- else if(m_spellInfo->SpellFamilyFlags & 0x0008000000000000LL)
+ if((m_spellInfo->SpellFamilyFlags & 0x000000002) && m_spellInfo->SpellVisual==342)
{
- damage += int32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK)*0.2f);
+ damage += int32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK)*0.2);
}
// Arcane Shot
else if((m_spellInfo->SpellFamilyFlags & 0x00000800) && m_spellInfo->maxLevel > 0)
{
- damage += int32(m_caster->GetTotalAttackPowerValue(RANGED_ATTACK)*0.15f);
+ damage += int32(m_caster->GetTotalAttackPowerValue(RANGED_ATTACK)*0.15);
}
// Steady Shot
else if(m_spellInfo->SpellFamilyFlags & 0x100000000LL)
@@ -575,16 +533,16 @@ void Spell::EffectSchoolDMG(uint32 effect_idx)
int32 base = irand((int32)m_caster->GetWeaponDamageRange(RANGED_ATTACK, MINDAMAGE),(int32)m_caster->GetWeaponDamageRange(RANGED_ATTACK, MAXDAMAGE));
damage += int32(float(base)/m_caster->GetAttackTime(RANGED_ATTACK)*2800 + m_caster->GetTotalAttackPowerValue(RANGED_ATTACK)*0.2f);
}
- // Explosive Trap Effect
+ //Explosive Trap Effect
else if(m_spellInfo->SpellFamilyFlags & 0x00000004)
{
- damage += int32(m_caster->GetTotalAttackPowerValue(RANGED_ATTACK)*0.1f);
+ damage += int32(m_caster->GetTotalAttackPowerValue(RANGED_ATTACK)*0.1);
}
break;
}
case SPELLFAMILY_PALADIN:
{
- // Judgement of Vengeance
+ //Judgement of Vengeance
if((m_spellInfo->SpellFamilyFlags & 0x800000000LL) && m_spellInfo->SpellIconID==2292)
{
uint32 stacks = 0;
@@ -598,38 +556,6 @@ void Spell::EffectSchoolDMG(uint32 effect_idx)
else
damage *= stacks;
}
- // Avenger's Shield ($m1+0.07*$SPH+0.07*$AP)
- else if(m_spellInfo->SpellFamilyFlags & 0x0000000000004000LL)
- {
- float ap = m_caster->GetTotalAttackPowerValue(BASE_ATTACK);
- int32 holy = m_caster->SpellBaseDamageBonus(GetSpellSchoolMask(m_spellInfo)) +
- m_caster->SpellBaseDamageBonusForVictim(GetSpellSchoolMask(m_spellInfo), unitTarget);
- damage += int32(ap * 0.07f) + int32(holy * 7 / 100);
- }
- // Exorcism ($m1+0.15*$SPH+0.15*$AP)
- else if(m_spellInfo->SpellFamilyFlags & 0x0000000200000000LL)
- {
- float ap = m_caster->GetTotalAttackPowerValue(BASE_ATTACK);
- int32 holy = m_caster->SpellBaseDamageBonus(GetSpellSchoolMask(m_spellInfo)) +
- m_caster->SpellBaseDamageBonusForVictim(GetSpellSchoolMask(m_spellInfo), unitTarget);
- damage += int32(ap * 0.15f) + int32(holy * 15 / 100);
- }
- // Hammer of Wrath ($m1+0.15*$SPH+0.15*$AP)
- else if(m_spellInfo->SpellFamilyFlags & 0x0000008000000000LL)
- {
- float ap = m_caster->GetTotalAttackPowerValue(BASE_ATTACK);
- int32 holy = m_caster->SpellBaseDamageBonus(GetSpellSchoolMask(m_spellInfo)) +
- m_caster->SpellBaseDamageBonusForVictim(GetSpellSchoolMask(m_spellInfo), unitTarget);
- damage += int32(ap * 0.15f) + int32(holy * 15 / 100);
- }
- // Holy Wrath ($m1+0.07*$SPH+0.07*$AP)
- else if(m_spellInfo->SpellFamilyFlags & 0x0020000000000000LL)
- {
- float ap = m_caster->GetTotalAttackPowerValue(BASE_ATTACK);
- int32 holy = m_caster->SpellBaseDamageBonus(GetSpellSchoolMask(m_spellInfo)) +
- m_caster->SpellBaseDamageBonusForVictim(GetSpellSchoolMask(m_spellInfo), unitTarget);
- damage += int32(ap * 0.15f) + int32(holy * 15 / 100);
- }
break;
}
}
@@ -1229,12 +1155,6 @@ void Spell::EffectDummy(uint32 i)
m_caster->CastSpell(m_caster, 30452, true, NULL);
return;
}
- case 53341:
- case 53343:
- {
- m_caster->CastSpell(m_caster,54586,true);
- return;
- }
}
//All IconID Check in there
@@ -1308,7 +1228,7 @@ void Spell::EffectDummy(uint32 i)
break;
case SPELLFAMILY_WARRIOR:
// Charge
- if(m_spellInfo->SpellFamilyFlags & 0x1 && m_spellInfo->SpellVisual[0] == 867)
+ if(m_spellInfo->SpellFamilyFlags & 0x1 && m_spellInfo->SpellVisual == 867)
{
int32 chargeBasePoints0 = damage;
m_caster->CastCustomSpell(m_caster,34846,&chargeBasePoints0,NULL,NULL,true);
@@ -1595,8 +1515,10 @@ void Spell::EffectDummy(uint32 i)
mod->value = -50;
mod->type = SPELLMOD_PCT;
mod->spellId = m_spellInfo->Id;
+ mod->effectId = i;
+ mod->lastAffected = NULL;
mod->mask = 0x0000020000000000LL;
- mod->mask2= 0LL;
+ mod->charges = 0;
((Player*)m_caster)->AddSpellMod(mod, true);
m_caster->CastSpell(unitTarget,spell_proto,true,NULL);
@@ -2955,10 +2877,10 @@ void Spell::EffectOpenLock(uint32 /*i*/)
}
// check key
- for(int i = 0; i < 8; ++i)
+ for(int i = 0; i < 5; ++i)
{
- // Type==1 This means lockInfo->Index[i] is an item
- if(lockInfo->Type[i]==LOCK_KEY_ITEM && lockInfo->Index[i] && m_CastItem && m_CastItem->GetEntry()==lockInfo->Index[i])
+ // type==1 This means lockInfo->key[i] is an item
+ if(lockInfo->keytype[i]==LOCK_KEY_ITEM && lockInfo->key[i] && m_CastItem && m_CastItem->GetEntry()==lockInfo->key[i])
{
SendLoot(guid, loottype);
return;
@@ -2976,9 +2898,9 @@ void Spell::EffectOpenLock(uint32 /*i*/)
// skill bonus provided by casting spell (mostly item spells)
uint32 spellSkillBonus = uint32(m_currentBasePoints[0]/*+1*/);
- uint32 reqSkillValue = lockInfo->Skill[0];
+ uint32 reqSkillValue = lockInfo->requiredminingskill;
- if(lockInfo->Skill[1]) // required pick lock skill applying
+ if(lockInfo->requiredlockskill) // required pick lock skill applying
{
if(SkillId != SKILL_LOCKPICKING) // wrong skill (cheating?)
{
@@ -2986,7 +2908,7 @@ void Spell::EffectOpenLock(uint32 /*i*/)
return;
}
- reqSkillValue = lockInfo->Skill[1];
+ reqSkillValue = lockInfo->requiredlockskill;
}
else if(SkillId == SKILL_LOCKPICKING) // apply picklock skill to wrong target
{
@@ -3313,7 +3235,7 @@ void Spell::EffectLearnSpell(uint32 i)
Player *player = (Player*)unitTarget;
- uint32 spellToLearn = ((m_spellInfo->Id==SPELL_ID_GENERIC_LEARN) || (m_spellInfo->Id==SPELL_ID_GENERIC_LEARN_PET)) ? damage : m_spellInfo->EffectTriggerSpell[i];
+ uint32 spellToLearn = (m_spellInfo->Id==SPELL_ID_GENERIC_LEARN) ? damage : m_spellInfo->EffectTriggerSpell[i];
player->learnSpell(spellToLearn);
sLog.outDebug( "Spell: Player %u have learned spell %u from NpcGUID=%u", player->GetGUIDLow(), spellToLearn, m_caster->GetGUIDLow() );
@@ -3955,13 +3877,13 @@ void Spell::EffectEnchantItemTmp(uint32 i)
else if(m_spellInfo->SpellFamilyName==SPELLFAMILY_SHAMAN)
duration = 1800; // 30 mins
// other cases with this SpellVisual already selected
- else if(m_spellInfo->SpellVisual[0]==215)
+ else if(m_spellInfo->SpellVisual==215)
duration = 1800; // 30 mins
// some fishing pole bonuses
- else if(m_spellInfo->SpellVisual[0]==563)
+ else if(m_spellInfo->SpellVisual==563)
duration = 600; // 10 mins
// shaman rockbiter enchantments
- else if(m_spellInfo->SpellVisual[0]==0)
+ else if(m_spellInfo->SpellVisual==0)
duration = 1800; // 30 mins
else if(m_spellInfo->Id==29702)
duration = 300; // 5 mins
@@ -4024,16 +3946,14 @@ void Spell::EffectTameCreature(uint32 /*i*/)
creatureTarget->RemoveCorpse();
creatureTarget->SetHealth(0); // just for nice GM-mode view
- uint32 level = (creatureTarget->getLevel() < (m_caster->getLevel() - 5)) ? (m_caster->getLevel() - 5) : creatureTarget->getLevel();
-
// prepare visual effect for levelup
- pet->SetUInt32Value(UNIT_FIELD_LEVEL, level - 1);
+ pet->SetUInt32Value(UNIT_FIELD_LEVEL,creatureTarget->getLevel()-1);
// add to world
pet->GetMap()->Add((Creature*)pet);
// visual effect for levelup
- pet->SetUInt32Value(UNIT_FIELD_LEVEL, level);
+ pet->SetUInt32Value(UNIT_FIELD_LEVEL,creatureTarget->getLevel());
// caster have pet now
m_caster->SetPet(pet);
@@ -4232,6 +4152,7 @@ void Spell::EffectLearnPetSpell(uint32 i)
if(!learn_spellproto)
return;
+ pet->SetTP(pet->m_TrainingPoints - pet->GetTPForSpell(learn_spellproto->Id));
pet->learnSpell(learn_spellproto->Id);
pet->SavePetToDB(PET_SAVE_AS_CURRENT);
@@ -4291,7 +4212,7 @@ void Spell::EffectWeaponDmg(uint32 i)
case SPELLFAMILY_WARRIOR:
{
// Devastate bonus and sunder armor refresh
- if(m_spellInfo->SpellVisual[0] == 671 && m_spellInfo->SpellIconID == 1508)
+ if(m_spellInfo->SpellVisual == 671 && m_spellInfo->SpellIconID == 1508)
{
uint32 stack = 0;
@@ -4304,7 +4225,7 @@ void Spell::EffectWeaponDmg(uint32 i)
{
int32 duration = GetSpellDuration(proto);
(*itr)->SetAuraDuration(duration);
- (*itr)->SendAuraUpdate(false);
+ (*itr)->UpdateAuraDuration();
stack = (*itr)->GetStackAmount();
break;
}
@@ -5015,69 +4936,9 @@ void Spell::EffectScriptEffect(uint32 effIndex)
((Player*)unitTarget)->ModifyMoney(50000000);
break;
}
- case 51770:
- {
- if(!unitTarget)
- return;
-
- unitTarget->CastSpell(unitTarget,51771,false);
- break;
- }
}
- if( m_spellInfo->SpellFamilyName == SPELLFAMILY_HUNTER )
- {
- switch(m_spellInfo->Id)
- {
- // Chimera Shot
- case 53209:
- {
- uint32 spellId = 0;
- int32 basePoint = 0;
- Unit::AuraMap& Auras = unitTarget->GetAuras();
- for(Unit::AuraMap::iterator i = Auras.begin(); i != Auras.end(); ++i)
- {
- Aura *aura = (*i).second;
- if (aura->GetCasterGUID() != m_caster->GetGUID())
- continue;
- // Search only Serpent Sting, Viper Sting, Scorpid Sting auras
- uint64 familyFlag = aura->GetSpellProto()->SpellFamilyFlags;
- if (!(familyFlag & 0x000000800000C000LL))
- continue;
- // Refresh aura duration
- aura->SetAuraDuration(aura->GetAuraMaxDuration());
- aura->SendAuraUpdate(false);
- // Serpent Sting - Instantly deals 40% of the damage done by your Serpent Sting.
- if (familyFlag & 0x0000000000004000LL && aura->GetEffIndex() == 0)
- {
- spellId = 53353; // 53353 Chimera Shot - Serpent
- basePoint = aura->GetModifier()->m_amount * 5 * 40 / 100;
- }
- // Viper Sting - Instantly restores mana to you equal to 60% of the total amount drained by your Viper Sting.
- if (familyFlag & 0x0000008000000000LL && aura->GetEffIndex() == 0)
- {
- spellId = 53358; // 53358 Chimera Shot - Viper
- basePoint = aura->GetModifier()->m_amount * 4 * 60 / 100;
- }
- // Scorpid Sting - Attempts to Disarm the target for 10 sec. This effect cannot occur more than once per 1 minute.
- if (familyFlag & 0x0000000000008000LL)
- spellId = 53359; // 53359 Chimera Shot - Scorpid
- // ?? nothing say in spell desc (possibly need addition check)
- //if (familyFlag & 0x0000010000000000LL || // dot
- // familyFlag & 0x0000100000000000LL) // stun
- //{
- // spellId = 53366; // 53366 Chimera Shot - Wyvern
- //}
- }
- if (spellId)
- m_caster->CastCustomSpell(unitTarget, spellId, &basePoint, 0, 0, false);
- return;
- }
- default:
- break;
- }
- }
- else if( m_spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN )
+ if( m_spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN )
{
switch(m_spellInfo->SpellFamilyFlags)
{
@@ -5199,8 +5060,7 @@ void Spell::EffectDuel(uint32 i)
// Players can only fight a duel with each other outside (=not inside dungeons and not in capital cities)
// Don't have to check the target's map since you cannot challenge someone across maps
- uint32 mapid = caster->GetMapId();
- if( mapid != 0 && mapid != 1 && mapid != 530 && mapid != 571 && mapid != 609)
+ if( caster->GetMapId() != 0 && caster->GetMapId() != 1 && caster->GetMapId() != 530)
{
SendCastResult(SPELL_FAILED_NO_DUELING); // Dueling isn't allowed here
return;
@@ -5339,45 +5199,6 @@ void Spell::EffectActivateObject(uint32 effect_idx)
sWorld.ScriptCommandStart(activateCommand, delay_secs, m_caster, gameObjTarget);
}
-void Spell::EffectApplyGlyph(uint32 i)
-{
- if(m_caster->GetTypeId() != TYPEID_PLAYER)
- return;
-
- Player *player = (Player*)m_caster;
-
- // remove old glyph
- if(uint32 oldglyph = player->GetGlyph(m_glyphIndex))
- {
- if(GlyphPropertiesEntry const *old_gp = sGlyphPropertiesStore.LookupEntry(oldglyph))
- {
- player->RemoveAurasDueToSpell(old_gp->SpellId);
- player->SetGlyph(m_glyphIndex, 0);
- }
- }
-
- // apply new one
- if(uint32 glyph = m_spellInfo->EffectMiscValue[i])
- {
- if(GlyphPropertiesEntry const *gp = sGlyphPropertiesStore.LookupEntry(glyph))
- {
- if(GlyphSlotEntry const *gs = sGlyphSlotStore.LookupEntry(player->GetGlyphSlot(m_glyphIndex)))
- {
- if(gp->TypeFlags != gs->TypeFlags)
- {
- SendCastResult(SPELL_FAILED_INVALID_GLYPH);
- return; // glyph slot missmatch
- }
- }
-
- player->CastSpell(m_caster, gp->SpellId, true);
- player->SetGlyph(m_glyphIndex, glyph);
- if(m_CastItem)
- player->DestroyItemCount(m_CastItem->GetEntry(), 1, true);
- }
- }
-}
-
void Spell::EffectSummonTotem(uint32 i)
{
uint8 slot = 0;
@@ -5701,14 +5522,18 @@ void Spell::EffectAddExtraAttacks(uint32 /*i*/)
void Spell::EffectParry(uint32 /*i*/)
{
- if (unitTarget && unitTarget->GetTypeId() == TYPEID_PLAYER)
+ if (unitTarget->GetTypeId() == TYPEID_PLAYER)
+ {
((Player*)unitTarget)->SetCanParry(true);
+ }
}
void Spell::EffectBlock(uint32 /*i*/)
{
- if (unitTarget && unitTarget->GetTypeId() == TYPEID_PLAYER)
- ((Player*)unitTarget)->SetCanBlock(true);
+ if (unitTarget->GetTypeId() != TYPEID_PLAYER)
+ return;
+
+ ((Player*)unitTarget)->SetCanBlock(true);
}
void Spell::EffectMomentMove(uint32 i)
@@ -6258,9 +6083,9 @@ void Spell::EffectTransmitted(uint32 effIndex)
{
m_caster->SetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT,pGameObj->GetGUID());
// Orientation3
- pGameObj->SetFloatValue(GAMEOBJECT_PARENTROTATION + 2, 0.88431775569915771 );
+ pGameObj->SetFloatValue(GAMEOBJECT_ROTATION + 2, 0.88431775569915771 );
// Orientation4
- pGameObj->SetFloatValue(GAMEOBJECT_PARENTROTATION + 3, -0.4668855369091033 );
+ pGameObj->SetFloatValue(GAMEOBJECT_ROTATION + 3, -0.4668855369091033 );
m_caster->AddGameObject(pGameObj); // will removed at spell cancel
// end time of range when possible catch fish (FISHING_BOBBER_READY_TIME..GetDuration(m_spellInfo))
@@ -6355,28 +6180,6 @@ void Spell::EffectProspecting(uint32 /*i*/)
((Player*)m_caster)->SendLoot(itemTarget->GetGUID(), LOOT_PROSPECTING);
}
-void Spell::EffectMilling(uint32 /*i*/)
-{
- if(m_caster->GetTypeId() != TYPEID_PLAYER)
- return;
-
- Player* p_caster = (Player*)m_caster;
- if(!itemTarget || !(itemTarget->GetProto()->BagFamily & BAG_FAMILY_MASK_HERBS))
- return;
-
- if(itemTarget->GetCount() < 5)
- return;
-
- if( sWorld.getConfig(CONFIG_SKILL_MILLING))
- {
- uint32 SkillValue = p_caster->GetPureSkillValue(SKILL_INSCRIPTION);
- uint32 reqSkillValue = itemTarget->GetProto()->RequiredSkillRank;
- p_caster->UpdateGatherSkill(SKILL_INSCRIPTION, SkillValue, reqSkillValue);
- }
-
- ((Player*)m_caster)->SendLoot(itemTarget->GetGUID(), LOOT_MILLING);
-}
-
void Spell::EffectSkill(uint32 /*i*/)
{
sLog.outDebug("WORLD: SkillEFFECT");
@@ -6524,31 +6327,6 @@ void Spell::EffectQuestFail(uint32 i)
((Player*)unitTarget)->FailQuest(m_spellInfo->EffectMiscValue[i]);
}
-void Spell::EffectActivateRune(uint32 i)
-{
- if(m_caster->GetTypeId() != TYPEID_PLAYER)
- return;
-
- Player *plr = (Player*)m_caster;
-
- if(plr->getClass() != CLASS_DEATH_KNIGHT)
- return;
-
- for(uint32 j = 0; j < MAX_RUNES; ++j)
- {
- if(plr->GetRuneCooldown(j) && plr->GetCurrentRune(j) == m_spellInfo->EffectMiscValue[i])
- {
- plr->SetRuneCooldown(j, 0);
- }
- }
-}
-
-void Spell::EffectTitanGrip(uint32 i)
-{
- if (unitTarget && unitTarget->GetTypeId() == TYPEID_PLAYER)
- ((Player*)unitTarget)->SetCanTitanGrip(true);
-}
-
void Spell::EffectRedirectThreat(uint32 /*i*/)
{
if(unitTarget)
diff --git a/src/game/SpellHandler.cpp b/src/game/SpellHandler.cpp
index d31c5610ee8..9b77e19b30b 100644
--- a/src/game/SpellHandler.cpp
+++ b/src/game/SpellHandler.cpp
@@ -38,17 +38,15 @@
void WorldSession::HandleUseItemOpcode(WorldPacket& recvPacket)
{
// TODO: add targets.read() check
- CHECK_PACKET_SIZE(recvPacket,1+1+1+4+8+4+1);
+ CHECK_PACKET_SIZE(recvPacket,1+1+1+1+8);
Player* pUser = _player;
uint8 bagIndex, slot;
- uint8 unk_flags; // flags (if 0x02 - some additional data are received)
+ uint8 spell_count; // number of spells at item, not used
uint8 cast_count; // next cast if exists (single or not)
uint64 item_guid;
- uint32 glyphIndex; // something to do with glyphs?
- uint32 spellid; // casted spell id
- recvPacket >> bagIndex >> slot >> cast_count >> spellid >> item_guid >> glyphIndex >> unk_flags;
+ recvPacket >> bagIndex >> slot >> spell_count >> cast_count >> item_guid;
Item *pItem = pUser->GetItemByPos(bagIndex, slot);
if(!pItem)
@@ -63,7 +61,7 @@ void WorldSession::HandleUseItemOpcode(WorldPacket& recvPacket)
return;
}
- sLog.outDetail("WORLD: CMSG_USE_ITEM packet, bagIndex: %u, slot: %u, cast_count: %u, spellid: %u, Item: %u, glyphIndex: %u, unk_flags: %u, data length = %i", bagIndex, slot, cast_count, spellid, pItem->GetEntry(), glyphIndex, unk_flags, recvPacket.size());
+ sLog.outDetail("WORLD: CMSG_USE_ITEM packet, bagIndex: %u, slot: %u, spell_count: %u , cast_count: %u, Item: %u, data length = %i", bagIndex, slot, spell_count, cast_count, pItem->GetEntry(), recvPacket.size());
ItemPrototype const *proto = pItem->GetProto();
if(!proto)
@@ -130,15 +128,14 @@ void WorldSession::HandleUseItemOpcode(WorldPacket& recvPacket)
// no script or script not process request by self
// special learning case
- if((pItem->GetProto()->Spells[0].SpellId==SPELL_ID_GENERIC_LEARN) || (pItem->GetProto()->Spells[0].SpellId==SPELL_ID_GENERIC_LEARN_PET))
+ if(pItem->GetProto()->Spells[0].SpellId==SPELL_ID_GENERIC_LEARN)
{
- uint32 learn_spell_id = pItem->GetProto()->Spells[0].SpellId;
uint32 learning_spell_id = pItem->GetProto()->Spells[1].SpellId;
- SpellEntry const *spellInfo = sSpellStore.LookupEntry(learn_spell_id);
+ SpellEntry const *spellInfo = sSpellStore.LookupEntry(SPELL_ID_GENERIC_LEARN);
if(!spellInfo)
{
- sLog.outError("Item (Entry: %u) in have wrong spell id %u, ignoring ",proto->ItemId, learn_spell_id);
+ sLog.outError("Item (Entry: %u) in have wrong spell id %u, ignoring ",proto->ItemId, SPELL_ID_GENERIC_LEARN);
pUser->SendEquipError(EQUIP_ERR_NONE,pItem,NULL);
return;
}
@@ -175,8 +172,7 @@ void WorldSession::HandleUseItemOpcode(WorldPacket& recvPacket)
Spell *spell = new Spell(pUser, spellInfo, (count > 0));
spell->m_CastItem = pItem;
- spell->m_cast_count = cast_count; // set count of casts
- spell->m_glyphIndex = glyphIndex; // glyph index
+ spell->m_cast_count = cast_count; //set count of casts
spell->prepare(&targets);
++count;
@@ -231,7 +227,7 @@ void WorldSession::HandleOpenItemOpcode(WorldPacket& recvPacket)
}
// required picklocking
- if(lockInfo->Skill[1] || lockInfo->Skill[0])
+ if(lockInfo->requiredlockskill || lockInfo->requiredminingskill)
{
pUser->SendEquipError(EQUIP_ERR_ITEM_LOCKED, pItem, NULL );
return;
@@ -287,16 +283,15 @@ void WorldSession::HandleGameObjectUseOpcode( WorldPacket & recv_data )
void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket)
{
- CHECK_PACKET_SIZE(recvPacket,1+4+1);
+ CHECK_PACKET_SIZE(recvPacket,4+1+2);
uint32 spellId;
- uint8 cast_count, unk_flags;
- recvPacket >> cast_count;
+ uint8 cast_count;
recvPacket >> spellId;
- recvPacket >> unk_flags; // flags (if 0x02 - some additional data are received)
+ recvPacket >> cast_count;
- sLog.outDebug("WORLD: got cast spell packet, spellId - %u, cast_count: %u, unk_flags %u, data length = %i",
- spellId, cast_count, unk_flags, recvPacket.size());
+ sLog.outDebug("WORLD: got cast spell packet, spellId - %u, cast_count: %u data length = %i",
+ spellId, cast_count, recvPacket.size());
SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellId );
@@ -339,12 +334,9 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket)
void WorldSession::HandleCancelCastOpcode(WorldPacket& recvPacket)
{
- CHECK_PACKET_SIZE(recvPacket,5);
+ CHECK_PACKET_SIZE(recvPacket,4);
- // increments with every CANCEL packet, don't use for now
- uint8 counter;
uint32 spellId;
- recvPacket >> counter;
recvPacket >> spellId;
//FIXME: hack, ignore unexpected client cancel Deadly Throw cast
diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp
index 7b18e595044..432682d618e 100644
--- a/src/game/SpellMgr.cpp
+++ b/src/game/SpellMgr.cpp
@@ -41,13 +41,13 @@ SpellMgr::SpellMgr()
case SPELL_EFFECT_TRANS_DOOR: //50 summon object
case SPELL_EFFECT_SUMMON_PET: //56
case SPELL_EFFECT_ADD_FARSIGHT: //72
- //case SPELL_EFFECT_SUMMON_POSSESSED: //73
- //case SPELL_EFFECT_SUMMON_TOTEM: //74
+ case SPELL_EFFECT_SUMMON_POSSESSED: //73
+ case SPELL_EFFECT_SUMMON_TOTEM: //74
case SPELL_EFFECT_SUMMON_OBJECT_WILD: //76
- //case SPELL_EFFECT_SUMMON_TOTEM_SLOT1: //87
- //case SPELL_EFFECT_SUMMON_TOTEM_SLOT2: //88
- //case SPELL_EFFECT_SUMMON_TOTEM_SLOT3: //89
- //case SPELL_EFFECT_SUMMON_TOTEM_SLOT4: //90
+ case SPELL_EFFECT_SUMMON_TOTEM_SLOT1: //87
+ case SPELL_EFFECT_SUMMON_TOTEM_SLOT2: //88
+ case SPELL_EFFECT_SUMMON_TOTEM_SLOT3: //89
+ case SPELL_EFFECT_SUMMON_TOTEM_SLOT4: //90
case SPELL_EFFECT_SUMMON_CRITTER: //97
case SPELL_EFFECT_SUMMON_OBJECT_SLOT1: //104
case SPELL_EFFECT_SUMMON_OBJECT_SLOT2: //105
@@ -318,10 +318,10 @@ SpellSpecific GetSpellSpecific(uint32 spellId)
if ((spellInfo->SpellFamilyFlags & 0x00000820180400LL) && (spellInfo->AttributesEx3 & 0x200))
return SPELL_JUDGEMENT;
- for (int i = 0; i < 3; i++) // TODO: fix it for WotLK!!!
+ for (int i = 0; i < 3; i++)
{
// only paladin auras have this
- if (spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AREA_AURA_RAID)
+ if (spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AREA_AURA_PARTY)
return SPELL_AURA;
}
break;
@@ -339,7 +339,7 @@ SpellSpecific GetSpellSpecific(uint32 spellId)
}
// only warlock armor/skin have this (in additional to family cases)
- if( spellInfo->SpellVisual[0] == 130 && spellInfo->SpellIconID == 89)
+ if( spellInfo->SpellVisual == 130 && spellInfo->SpellIconID == 89)
{
return SPELL_WARLOCK_ARMOR;
}
@@ -828,8 +828,8 @@ void SpellMgr::LoadSpellAffects()
uint32 count = 0;
- // 0 1 2 3 4
- QueryResult *result = WorldDatabase.Query("SELECT entry, effectId, SpellClassMask0, SpellClassMask1, SpellClassMask2 FROM spell_affect");
+ // 0 1 2
+ QueryResult *result = WorldDatabase.Query("SELECT entry, effectId, SpellFamilyMask FROM spell_affect");
if( !result )
{
@@ -876,29 +876,26 @@ void SpellMgr::LoadSpellAffects()
continue;
}
- SpellAffectEntry affect;
- affect.SpellClassMask[0] = fields[2].GetUInt32();
- affect.SpellClassMask[1] = fields[3].GetUInt32();
- affect.SpellClassMask[2] = fields[4].GetUInt32();
+ uint64 spellAffectMask = fields[2].GetUInt64();
- // Spell.dbc have own data
- uint32 const *ptr = 0;
- switch (effectId)
+ // Spell.dbc have own data for low part of SpellFamilyMask
+ if( spellInfo->EffectItemType[effectId])
{
- case 0: ptr = &spellInfo->EffectSpellClassMaskA[0]; break;
- case 1: ptr = &spellInfo->EffectSpellClassMaskB[0]; break;
- case 2: ptr = &spellInfo->EffectSpellClassMaskC[0]; break;
- default:
+ if(spellInfo->EffectItemType[effectId] == spellAffectMask)
+ {
+ sLog.outErrorDb("Spell %u listed in `spell_affect` have redundant (same with EffectItemType%d) data for effect index (%u) and not needed, skipped.", entry,effectId+1,effectId);
continue;
- }
- if(ptr[0] == affect.SpellClassMask[0] || ptr[1] == affect.SpellClassMask[1] || ptr[2] == affect.SpellClassMask[2])
- {
- char text[]="ABC";
- sLog.outErrorDb("Spell %u listed in `spell_affect` have redundant (same with EffectSpellClassMask%c) data for effect index (%u) and not needed, skipped.", entry, text[effectId], effectId);
- continue;
+ }
+
+ // 24429 have wrong data in EffectItemType and overwrites by DB, possible bug in client
+ if(spellInfo->Id!=24429 && spellInfo->EffectItemType[effectId] != spellAffectMask)
+ {
+ sLog.outErrorDb("Spell %u listed in `spell_affect` have different low part from EffectItemType%d for effect index (%u) and not needed, skipped.", entry,effectId+1,effectId);
+ continue;
+ }
}
- mSpellAffectMap[(entry<<8) + effectId] = affect;
+ mSpellAffectMap.insert(SpellAffectMap::value_type((entry<<8) + effectId,spellAffectMask));
++count;
} while( result->NextRow() );
@@ -906,7 +903,7 @@ void SpellMgr::LoadSpellAffects()
delete result;
sLog.outString();
- sLog.outString( ">> Loaded %u custom spell affect definitions", count );
+ sLog.outString( ">> Loaded %u spell affect definitions", count );
for (uint32 id = 0; id < sSpellStore.GetNumRows(); ++id)
{
@@ -922,16 +919,7 @@ void SpellMgr::LoadSpellAffects()
spellInfo->EffectApplyAuraName[effectId] != SPELL_AURA_ADD_TARGET_TRIGGER) )
continue;
- uint32 const *ptr = 0;
- switch (effectId)
- {
- case 0: ptr = &spellInfo->EffectSpellClassMaskA[0]; break;
- case 1: ptr = &spellInfo->EffectSpellClassMaskB[0]; break;
- case 2: ptr = &spellInfo->EffectSpellClassMaskC[0]; break;
- default:
- continue;
- }
- if(ptr[0] || ptr[1] || ptr[2])
+ if(spellInfo->EffectItemType[effectId] != 0)
continue;
if(mSpellAffectMap.find((id<<8) + effectId) != mSpellAffectMap.end())
@@ -942,20 +930,33 @@ void SpellMgr::LoadSpellAffects()
}
}
-bool SpellMgr::IsAffectedByMod(SpellEntry const *spellInfo, SpellModifier *mod) const
+bool SpellMgr::IsAffectedBySpell(SpellEntry const *spellInfo, uint32 spellId, uint8 effectId, uint64 familyFlags) const
{
// false for spellInfo == NULL
- if (!spellInfo || !mod)
+ if (!spellInfo)
+ return false;
+
+ SpellEntry const *affect_spell = sSpellStore.LookupEntry(spellId);
+ // false for affect_spell == NULL
+ if (!affect_spell)
return false;
- SpellEntry const *affect_spell = sSpellStore.LookupEntry(mod->spellId);
- // False if affect_spell == NULL or spellFamily not equal
- if (!affect_spell || affect_spell->SpellFamilyName != spellInfo->SpellFamilyName)
+ // False if spellFamily not equal
+ if (affect_spell->SpellFamilyName != spellInfo->SpellFamilyName)
return false;
+ // If familyFlags == 0
+ if (!familyFlags)
+ {
+ // Get it from spellAffect table
+ familyFlags = GetSpellAffectMask(spellId,effectId);
+ // false if familyFlags == 0
+ if (!familyFlags)
+ return false;
+ }
+
// true
- if (mod->mask & spellInfo->SpellFamilyFlags ||
- mod->mask2 & spellInfo->SpellFamilyFlags2)
+ if (familyFlags & spellInfo->SpellFamilyFlags)
return true;
return false;
@@ -1249,7 +1250,7 @@ bool SpellMgr::canStackSpellRanks(SpellEntry const *spellInfo)
{
// Paladin aura Spell
if(spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN
- && spellInfo->Effect[i]==SPELL_EFFECT_APPLY_AREA_AURA_RAID)
+ && spellInfo->Effect[i]==SPELL_EFFECT_APPLY_AREA_AURA_PARTY)
return false;
// Druid form Spell
if(spellInfo->SpellFamilyName == SPELLFAMILY_DRUID
@@ -1386,8 +1387,7 @@ SpellEntry const* SpellMgr::SelectAuraRankForPlayerLevel(SpellEntry const* spell
{
if( IsPositiveEffect(spellInfo->Id, i) && (
spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AURA ||
- spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AREA_AURA_PARTY ||
- spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AREA_AURA_RAID
+ spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AREA_AURA_PARTY
) )
{
needRankSelection = true;
@@ -1519,7 +1519,7 @@ void SpellMgr::LoadSpellChains()
entry.ProcFlags=SpellInfo->procFlags;
entry.SpellFamilyFlags=SpellInfo->SpellFamilyFlags;
entry.TargetAuraState=SpellInfo->TargetAuraState;
- entry.SpellVisual=SpellInfo->SpellVisual[0];
+ entry.SpellVisual=SpellInfo->SpellVisual;
entry.ManaCost=SpellInfo->manaCost;
value.Id=spell_id;
@@ -2042,7 +2042,7 @@ void SpellMgr::LoadSpellCustomAttr()
}
}
- if(spellInfo->SpellVisual[0] == 3879)
+ if(spellInfo->SpellVisual == 3879)
mSpellCustomAttr[i] |= SPELL_ATTR_CU_CONE_BACK;
switch(i)
@@ -2146,187 +2146,6 @@ void SpellMgr::LoadSpellLinked()
}
/// Some checks for spells, to prevent adding depricated/broken spells for trainers, spell book, etc
-void SpellMgr::LoadPetLevelupSpellMap()
-{
- CreatureFamilyEntry const *creatureFamily;
- SpellEntry const *spell;
- uint32 count = 0;
-
- for (uint32 i = 0; i < sCreatureFamilyStore.GetNumRows(); ++i)
- {
- creatureFamily = sCreatureFamilyStore.LookupEntry(i);
-
- if(!creatureFamily) // not exist
- continue;
-
- if(creatureFamily->petTalentType < 0) // not hunter pet family
- continue;
-
- for(uint32 j = 0; j < sSpellStore.GetNumRows(); ++j)
- {
- spell = sSpellStore.LookupEntry(j);
-
- // not exist
- if(!spell)
- continue;
-
- // not hunter spell
- if(spell->SpellFamilyName != SPELLFAMILY_HUNTER)
- continue;
-
- // not pet spell
- if(!(spell->SpellFamilyFlags & 0x1000000000000000LL))
- continue;
-
- // not Growl or Cower (generics)
- if(spell->SpellIconID != 201 && spell->SpellIconID != 958)
- {
- switch(creatureFamily->ID)
- {
- case CREATURE_FAMILY_BAT: // Bite and Sonic Blast
- if(spell->SpellIconID != 1680 && spell->SpellIconID != 1577)
- continue;
- break;
- case CREATURE_FAMILY_BEAR: // Claw and Swipe
- if(spell->SpellIconID != 262 && spell->SpellIconID != 1562)
- continue;
- break;
- case CREATURE_FAMILY_BIRD_OF_PREY: // Claw and Snatch
- if(spell->SpellIconID != 262 && spell->SpellIconID != 168)
- continue;
- break;
- case CREATURE_FAMILY_BOAR: // Bite and Gore
- if(spell->SpellIconID != 1680 && spell->SpellIconID != 1578)
- continue;
- break;
- case CREATURE_FAMILY_CARRION_BIRD: // Bite and Demoralizing Screech
- if(spell->SpellIconID != 1680 && spell->SpellIconID != 1579)
- continue;
- break;
- case CREATURE_FAMILY_CAT: // Claw and Prowl and Rake
- if(spell->SpellIconID != 262 && spell->SpellIconID != 495 && spell->SpellIconID != 494)
- continue;
- break;
- case CREATURE_FAMILY_CHIMAERA: // Bite and Froststorm Breath
- if(spell->SpellIconID != 1680 && spell->SpellIconID != 62)
- continue;
- break;
- case CREATURE_FAMILY_CORE_HOUND: // Bite and Lava Breath
- if(spell->SpellIconID != 1680 && spell->SpellIconID != 1197)
- continue;
- break;
- case CREATURE_FAMILY_CRAB: // Claw and Pin
- if(spell->SpellIconID != 262 && spell->SpellIconID != 2679)
- continue;
- break;
- case CREATURE_FAMILY_CROCOLISK: // Bite and Bad Attitude
- if(spell->SpellIconID != 1680 && spell->SpellIconID != 1581)
- continue;
- break;
- case CREATURE_FAMILY_DEVILSAUR: // Bite and Monstrous Bite
- if(spell->SpellIconID != 1680 && spell->SpellIconID != 599)
- continue;
- break;
- case CREATURE_FAMILY_DRAGONHAWK: // Bite and Fire Breath
- if(spell->SpellIconID != 1680 && spell->SpellIconID != 2128)
- continue;
- break;
- case CREATURE_FAMILY_GORILLA: // Smack and Thunderstomp
- if(spell->SpellIconID != 473 && spell->SpellIconID != 148)
- continue;
- break;
- case CREATURE_FAMILY_HYENA: // Bite and Tendon Rip
- if(spell->SpellIconID != 1680 && spell->SpellIconID != 138)
- continue;
- break;
- case CREATURE_FAMILY_MOTH: // Serenity Dust and Smack
- if(spell->SpellIconID != 1714 && spell->SpellIconID != 473)
- continue;
- break;
- case CREATURE_FAMILY_NETHER_RAY: // Bite and Nether Shock
- if(spell->SpellIconID != 1680 && spell->SpellIconID != 2027)
- continue;
- break;
- case CREATURE_FAMILY_RAPTOR: // Claw and Savage Rend
- if(spell->SpellIconID != 262 && spell->SpellIconID != 245)
- continue;
- break;
- case CREATURE_FAMILY_RAVAGER: // Bite and Ravage
- if(spell->SpellIconID != 1680 && spell->SpellIconID != 2253)
- continue;
- break;
- case CREATURE_FAMILY_RHINO: // Smack and Stampede
- if(spell->SpellIconID != 473 && spell->SpellIconID != 3066)
- continue;
- break;
- case CREATURE_FAMILY_SCORPID: // Claw and Scorpid Poison
- if(spell->SpellIconID != 262 && spell->SpellIconID != 163)
- continue;
- break;
- case CREATURE_FAMILY_SERPENT: // Bite and Poison Spit
- if(spell->SpellIconID != 1680 && spell->SpellIconID != 68)
- continue;
- break;
- case CREATURE_FAMILY_SILITHID: // Claw and Venom Web Spray
- if(spell->SpellIconID != 262 && (spell->SpellIconID != 272 && spell->SpellVisual[0] != 12013))
- continue;
- break;
- case CREATURE_FAMILY_SPIDER: // Bite and Web
- if(spell->SpellIconID != 1680 && (spell->SpellIconID != 272 && spell->SpellVisual[0] != 684))
- continue;
- break;
- case CREATURE_FAMILY_SPIRIT_BEAST: // Claw and Prowl and Spirit Strike
- if(spell->SpellIconID != 262 && spell->SpellIconID != 495 && spell->SpellIconID != 255)
- continue;
- break;
- case CREATURE_FAMILY_SPOREBAT: // Smack and Spore Cloud
- if(spell->SpellIconID != 473 && spell->SpellIconID != 2681)
- continue;
- break;
- case CREATURE_FAMILY_TALLSTRIDER: // Claw and Dust Cloud
- if(spell->SpellIconID != 262 && (spell->SpellIconID != 157 && !(spell->Attributes & 0x4000000)))
- continue;
- break;
- case CREATURE_FAMILY_TURTLE: // Bite and Shell Shield
- if(spell->SpellIconID != 1680 && spell->SpellIconID != 1588)
- continue;
- break;
- case CREATURE_FAMILY_WARP_STALKER: // Bite and Warp
- if(spell->SpellIconID != 1680 && spell->SpellIconID != 1952)
- continue;
- break;
- case CREATURE_FAMILY_WASP: // Smack and Sting
- if(spell->SpellIconID != 473 && spell->SpellIconID != 110)
- continue;
- break;
- case CREATURE_FAMILY_WIND_SERPENT: // Bite and Lightning Breath
- if(spell->SpellIconID != 1680 && spell->SpellIconID != 62)
- continue;
- break;
- case CREATURE_FAMILY_WOLF: // Bite and Furious Howl
- if(spell->SpellIconID != 1680 && spell->SpellIconID != 1573)
- continue;
- break;
- case CREATURE_FAMILY_WORM: // Acid Spit and Bite
- if(spell->SpellIconID != 636 && spell->SpellIconID != 1680)
- continue;
- break;
- default:
- sLog.outError("LoadPetLevelupSpellMap: Unhandled creature family %u", creatureFamily->ID);
- continue;
- }
- }
-
- mPetLevelupSpellMap[creatureFamily->ID][spell->spellLevel] = spell->Id;
- count++;
- }
- }
-
- sLog.outString();
- sLog.outString( ">> Loaded %u pet levelup spells", count );
-}
-
-/// Some checks for spells, to prevent adding deprecated/broken spells for trainers, spell book, etc
bool SpellMgr::IsSpellValid(SpellEntry const* spellInfo, Player* pl, bool msg)
{
// not exist
@@ -2404,7 +2223,7 @@ bool SpellMgr::IsSpellValid(SpellEntry const* spellInfo, Player* pl, bool msg)
bool IsSpellAllowedInLocation(SpellEntry const *spellInfo,uint32 map_id,uint32 zone_id,uint32 area_id)
{
// normal case
- if( spellInfo->AreaId > 0 && spellInfo->AreaId != zone_id && spellInfo->AreaId != area_id )
+ if( spellInfo->AreaId && spellInfo->AreaId != zone_id && spellInfo->AreaId != area_id )
return false;
// elixirs (all area dependent elixirs have family SPELLFAMILY_POTION, use this for speedup)
diff --git a/src/game/SpellMgr.h b/src/game/SpellMgr.h
index 239c728aa11..51e6fbd1d56 100644
--- a/src/game/SpellMgr.h
+++ b/src/game/SpellMgr.h
@@ -29,9 +29,6 @@
#include "Database/SQLStorage.h"
#include "Utilities/UnorderedMap.h"
-
-#include "Player.h"
-
#include <map>
class Player;
@@ -41,188 +38,175 @@ extern SQLStorage sSpellThreatStore;
enum SpellFailedReason
{
- SPELL_FAILED_AFFECTING_COMBAT = 0,
- SPELL_FAILED_ALREADY_AT_FULL_HEALTH = 1,
- SPELL_FAILED_ALREADY_AT_FULL_MANA = 2,
- SPELL_FAILED_ALREADY_AT_FULL_POWER = 3,
- SPELL_FAILED_ALREADY_BEING_TAMED = 4,
- SPELL_FAILED_ALREADY_HAVE_CHARM = 5,
- SPELL_FAILED_ALREADY_HAVE_SUMMON = 6,
- SPELL_FAILED_ALREADY_OPEN = 7,
- SPELL_FAILED_AURA_BOUNCED = 8,
- SPELL_FAILED_AUTOTRACK_INTERRUPTED = 9,
- SPELL_FAILED_BAD_IMPLICIT_TARGETS = 10,
- SPELL_FAILED_BAD_TARGETS = 11,
- SPELL_FAILED_CANT_BE_CHARMED = 12,
- SPELL_FAILED_CANT_BE_DISENCHANTED = 13,
- SPELL_FAILED_CANT_BE_DISENCHANTED_SKILL = 14,
- SPELL_FAILED_CANT_BE_MILLED = 15,
- SPELL_FAILED_CANT_BE_PROSPECTED = 16,
- SPELL_FAILED_CANT_CAST_ON_TAPPED = 17,
- SPELL_FAILED_CANT_DUEL_WHILE_INVISIBLE = 18,
- SPELL_FAILED_CANT_DUEL_WHILE_STEALTHED = 19,
- SPELL_FAILED_CANT_STEALTH = 20,
- SPELL_FAILED_CASTER_AURASTATE = 21,
- SPELL_FAILED_CASTER_DEAD = 22,
- SPELL_FAILED_CHARMED = 23,
- SPELL_FAILED_CHEST_IN_USE = 24,
- SPELL_FAILED_CONFUSED = 25,
- SPELL_FAILED_DONT_REPORT = 26,
- SPELL_FAILED_EQUIPPED_ITEM = 27,
- SPELL_FAILED_EQUIPPED_ITEM_CLASS = 28,
- SPELL_FAILED_EQUIPPED_ITEM_CLASS_MAINHAND = 29,
- SPELL_FAILED_EQUIPPED_ITEM_CLASS_OFFHAND = 30,
- SPELL_FAILED_ERROR = 31,
- SPELL_FAILED_FIZZLE = 32,
- SPELL_FAILED_FLEEING = 33,
- SPELL_FAILED_FOOD_LOWLEVEL = 34,
- SPELL_FAILED_HIGHLEVEL = 35,
- SPELL_FAILED_HUNGER_SATIATED = 36,
- SPELL_FAILED_IMMUNE = 37,
- SPELL_FAILED_INCORRECT_AREA = 38,
- SPELL_FAILED_INTERRUPTED = 39,
- SPELL_FAILED_INTERRUPTED_COMBAT = 40,
- SPELL_FAILED_ITEM_ALREADY_ENCHANTED = 41,
- SPELL_FAILED_ITEM_GONE = 42,
- SPELL_FAILED_ITEM_NOT_FOUND = 43,
- SPELL_FAILED_ITEM_NOT_READY = 44,
- SPELL_FAILED_LEVEL_REQUIREMENT = 45,
- SPELL_FAILED_LINE_OF_SIGHT = 46,
- SPELL_FAILED_LOWLEVEL = 47,
- SPELL_FAILED_LOW_CASTLEVEL = 48,
- SPELL_FAILED_MAINHAND_EMPTY = 49,
- SPELL_FAILED_MOVING = 50,
- SPELL_FAILED_NEED_AMMO = 51,
- SPELL_FAILED_NEED_AMMO_POUCH = 52,
- SPELL_FAILED_NEED_EXOTIC_AMMO = 53,
- SPELL_FAILED_NEED_MORE_ITEMS = 54,
- SPELL_FAILED_NOPATH = 55,
- SPELL_FAILED_NOT_BEHIND = 56,
- SPELL_FAILED_NOT_FISHABLE = 57,
- SPELL_FAILED_NOT_FLYING = 58,
- SPELL_FAILED_NOT_HERE = 59,
- SPELL_FAILED_NOT_INFRONT = 60,
- SPELL_FAILED_NOT_IN_CONTROL = 61,
- SPELL_FAILED_NOT_KNOWN = 62,
- SPELL_FAILED_NOT_MOUNTED = 63,
- SPELL_FAILED_NOT_ON_TAXI = 64,
- SPELL_FAILED_NOT_ON_TRANSPORT = 65,
- SPELL_FAILED_NOT_READY = 66,
- SPELL_FAILED_NOT_SHAPESHIFT = 67,
- SPELL_FAILED_NOT_STANDING = 68,
- SPELL_FAILED_NOT_TRADEABLE = 69,
- SPELL_FAILED_NOT_TRADING = 70,
- SPELL_FAILED_NOT_UNSHEATHED = 71,
- SPELL_FAILED_NOT_WHILE_GHOST = 72,
- SPELL_FAILED_NOT_WHILE_LOOTING = 73,
- SPELL_FAILED_NO_AMMO = 74,
- SPELL_FAILED_NO_CHARGES_REMAIN = 75,
- SPELL_FAILED_NO_CHAMPION = 76,
- SPELL_FAILED_NO_COMBO_POINTS = 77,
- SPELL_FAILED_NO_DUELING = 78,
- SPELL_FAILED_NO_ENDURANCE = 79,
- SPELL_FAILED_NO_FISH = 80,
- SPELL_FAILED_NO_ITEMS_WHILE_SHAPESHIFTED = 81,
- SPELL_FAILED_NO_MOUNTS_ALLOWED = 82,
- SPELL_FAILED_NO_PET = 83,
- SPELL_FAILED_NO_POWER = 84,
- SPELL_FAILED_NOTHING_TO_DISPEL = 85,
- SPELL_FAILED_NOTHING_TO_STEAL = 86,
- SPELL_FAILED_ONLY_ABOVEWATER = 87,
- SPELL_FAILED_ONLY_DAYTIME = 88,
- SPELL_FAILED_ONLY_INDOORS = 89,
- SPELL_FAILED_ONLY_MOUNTED = 90,
- SPELL_FAILED_ONLY_NIGHTTIME = 91,
- SPELL_FAILED_ONLY_OUTDOORS = 92,
- SPELL_FAILED_ONLY_SHAPESHIFT = 93,
- SPELL_FAILED_ONLY_STEALTHED = 94,
- SPELL_FAILED_ONLY_UNDERWATER = 95,
- SPELL_FAILED_OUT_OF_RANGE = 96,
- SPELL_FAILED_PACIFIED = 97,
- SPELL_FAILED_POSSESSED = 98,
- SPELL_FAILED_REAGENTS = 99,
- SPELL_FAILED_REQUIRES_AREA = 100,
- SPELL_FAILED_REQUIRES_SPELL_FOCUS = 101,
- SPELL_FAILED_ROOTED = 102,
- SPELL_FAILED_SILENCED = 103,
- SPELL_FAILED_SPELL_IN_PROGRESS = 104,
- SPELL_FAILED_SPELL_LEARNED = 105,
- SPELL_FAILED_SPELL_UNAVAILABLE = 106,
- SPELL_FAILED_STUNNED = 107,
- SPELL_FAILED_TARGETS_DEAD = 108,
- SPELL_FAILED_TARGET_AFFECTING_COMBAT = 109,
- SPELL_FAILED_TARGET_AURASTATE = 110,
- SPELL_FAILED_TARGET_DUELING = 111,
- SPELL_FAILED_TARGET_ENEMY = 112,
- SPELL_FAILED_TARGET_ENRAGED = 113,
- SPELL_FAILED_TARGET_FRIENDLY = 114,
- SPELL_FAILED_TARGET_IN_COMBAT = 115,
- SPELL_FAILED_TARGET_IS_PLAYER = 116,
- SPELL_FAILED_TARGET_IS_PLAYER_CONTROLLED = 117,
- SPELL_FAILED_TARGET_NOT_DEAD = 118,
- SPELL_FAILED_TARGET_NOT_IN_PARTY = 119,
- SPELL_FAILED_TARGET_NOT_LOOTED = 120,
- SPELL_FAILED_TARGET_NOT_PLAYER = 121,
- SPELL_FAILED_TARGET_NO_POCKETS = 122,
- SPELL_FAILED_TARGET_NO_WEAPONS = 123,
- SPELL_FAILED_TARGET_NO_RANGED_WEAPONS = 124,
- SPELL_FAILED_TARGET_UNSKINNABLE = 125,
- SPELL_FAILED_THIRST_SATIATED = 126,
- SPELL_FAILED_TOO_CLOSE = 127,
- SPELL_FAILED_TOO_MANY_OF_ITEM = 128,
- SPELL_FAILED_TOTEM_CATEGORY = 129,
- SPELL_FAILED_TOTEMS = 130,
- SPELL_FAILED_TRY_AGAIN = 131,
- SPELL_FAILED_UNIT_NOT_BEHIND = 132,
- SPELL_FAILED_UNIT_NOT_INFRONT = 133,
- SPELL_FAILED_WRONG_PET_FOOD = 134,
- SPELL_FAILED_NOT_WHILE_FATIGUED = 135,
- SPELL_FAILED_TARGET_NOT_IN_INSTANCE = 136,
- SPELL_FAILED_NOT_WHILE_TRADING = 137,
- SPELL_FAILED_TARGET_NOT_IN_RAID = 138,
- SPELL_FAILED_TARGET_FREEFORALL = 139,
- SPELL_FAILED_NO_EDIBLE_CORPSES = 140,
- SPELL_FAILED_ONLY_BATTLEGROUNDS = 141,
- SPELL_FAILED_TARGET_NOT_GHOST = 142,
- SPELL_FAILED_TRANSFORM_UNUSABLE = 143,
- SPELL_FAILED_WRONG_WEATHER = 144,
- SPELL_FAILED_DAMAGE_IMMUNE = 145,
- SPELL_FAILED_PREVENTED_BY_MECHANIC = 146,
- SPELL_FAILED_PLAY_TIME = 147,
- SPELL_FAILED_REPUTATION = 148,
- SPELL_FAILED_MIN_SKILL = 149,
- SPELL_FAILED_NOT_IN_ARENA = 150,
- SPELL_FAILED_NOT_ON_SHAPESHIFT = 151,
- SPELL_FAILED_NOT_ON_STEALTHED = 152,
- SPELL_FAILED_NOT_ON_DAMAGE_IMMUNE = 153,
- SPELL_FAILED_NOT_ON_MOUNTED = 154,
- SPELL_FAILED_TOO_SHALLOW = 155,
- SPELL_FAILED_TARGET_NOT_IN_SANCTUARY = 156,
- SPELL_FAILED_TARGET_IS_TRIVIAL = 157,
- SPELL_FAILED_BM_OR_INVISGOD = 158,
- SPELL_FAILED_EXPERT_RIDING_REQUIREMENT = 159,
- SPELL_FAILED_ARTISAN_RIDING_REQUIREMENT = 160,
- SPELL_FAILED_NOT_IDLE = 161,
- SPELL_FAILED_NOT_INACTIVE = 162,
- SPELL_FAILED_PARTIAL_PLAYTIME = 163,
- SPELL_FAILED_NO_PLAYTIME = 164,
- SPELL_FAILED_NOT_IN_BATTLEGROUND = 165,
- SPELL_FAILED_NOT_IN_RAID_INSTANCE = 166,
- SPELL_FAILED_ONLY_IN_ARENA = 167,
- SPELL_FAILED_TARGET_LOCKED_TO_RAID_INSTANCE = 168,
- SPELL_FAILED_ON_USE_ENCHANT = 169,
- SPELL_FAILED_NOT_ON_GROUND = 170,
- SPELL_FAILED_CUSTOM_ERROR = 171,
- SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW = 172,
- SPELL_FAILED_TOO_MANY_SOCKETS = 173,
- SPELL_FAILED_INVALID_GLYPH = 174,
- SPELL_FAILED_UNIQUE_GLYPH = 175,
- SPELL_FAILED_GLYPH_SOCKET_LOCKED = 176,
- SPELL_FAILED_NO_VALID_TARGETS = 177,
- SPELL_FAILED_ITEM_AT_MAX_CHARGES = 178,
- SPELL_FAILED_NOT_IN_BARBERSHOP = 179,
- SPELL_FAILED_FISHING_TOO_LOW = 180,
- SPELL_FAILED_UNKNOWN = 181
+ SPELL_FAILED_AFFECTING_COMBAT = 0x00,
+ SPELL_FAILED_ALREADY_AT_FULL_HEALTH = 0x01,
+ SPELL_FAILED_ALREADY_AT_FULL_MANA = 0x02,
+ SPELL_FAILED_ALREADY_AT_FULL_POWER = 0x03,
+ SPELL_FAILED_ALREADY_BEING_TAMED = 0x04,
+ SPELL_FAILED_ALREADY_HAVE_CHARM = 0x05,
+ SPELL_FAILED_ALREADY_HAVE_SUMMON = 0x06,
+ SPELL_FAILED_ALREADY_OPEN = 0x07,
+ SPELL_FAILED_AURA_BOUNCED = 0x08,
+ SPELL_FAILED_AUTOTRACK_INTERRUPTED = 0x09,
+ SPELL_FAILED_BAD_IMPLICIT_TARGETS = 0x0A,
+ SPELL_FAILED_BAD_TARGETS = 0x0B,
+ SPELL_FAILED_CANT_BE_CHARMED = 0x0C,
+ SPELL_FAILED_CANT_BE_DISENCHANTED = 0x0D,
+ SPELL_FAILED_CANT_BE_DISENCHANTED_SKILL = 0x0E,
+ SPELL_FAILED_CANT_BE_PROSPECTED = 0x0F,
+ SPELL_FAILED_CANT_CAST_ON_TAPPED = 0x10,
+ SPELL_FAILED_CANT_DUEL_WHILE_INVISIBLE = 0x11,
+ SPELL_FAILED_CANT_DUEL_WHILE_STEALTHED = 0x12,
+ SPELL_FAILED_CANT_STEALTH = 0x13,
+ SPELL_FAILED_CASTER_AURASTATE = 0x14,
+ SPELL_FAILED_CASTER_DEAD = 0x15,
+ SPELL_FAILED_CHARMED = 0x16,
+ SPELL_FAILED_CHEST_IN_USE = 0x17,
+ SPELL_FAILED_CONFUSED = 0x18,
+ SPELL_FAILED_DONT_REPORT = 0x19,
+ SPELL_FAILED_EQUIPPED_ITEM = 0x1A,
+ SPELL_FAILED_EQUIPPED_ITEM_CLASS = 0x1B,
+ SPELL_FAILED_EQUIPPED_ITEM_CLASS_MAINHAND = 0x1C,
+ SPELL_FAILED_EQUIPPED_ITEM_CLASS_OFFHAND = 0x1D,
+ SPELL_FAILED_ERROR = 0x1E,
+ SPELL_FAILED_FIZZLE = 0x1F,
+ SPELL_FAILED_FLEEING = 0x20,
+ SPELL_FAILED_FOOD_LOWLEVEL = 0x21,
+ SPELL_FAILED_HIGHLEVEL = 0x22,
+ SPELL_FAILED_HUNGER_SATIATED = 0x23,
+ SPELL_FAILED_IMMUNE = 0x24,
+ SPELL_FAILED_INTERRUPTED = 0x25,
+ SPELL_FAILED_INTERRUPTED_COMBAT = 0x26,
+ SPELL_FAILED_ITEM_ALREADY_ENCHANTED = 0x27,
+ SPELL_FAILED_ITEM_GONE = 0x28,
+ SPELL_FAILED_ITEM_NOT_FOUND = 0x29,
+ SPELL_FAILED_ITEM_NOT_READY = 0x2A,
+ SPELL_FAILED_LEVEL_REQUIREMENT = 0x2B,
+ SPELL_FAILED_LINE_OF_SIGHT = 0x2C,
+ SPELL_FAILED_LOWLEVEL = 0x2D,
+ SPELL_FAILED_LOW_CASTLEVEL = 0x2E,
+ SPELL_FAILED_MAINHAND_EMPTY = 0x2F,
+ SPELL_FAILED_MOVING = 0x30,
+ SPELL_FAILED_NEED_AMMO = 0x31,
+ SPELL_FAILED_NEED_AMMO_POUCH = 0x32,
+ SPELL_FAILED_NEED_EXOTIC_AMMO = 0x33,
+ SPELL_FAILED_NOPATH = 0x34,
+ SPELL_FAILED_NOT_BEHIND = 0x35,
+ SPELL_FAILED_NOT_FISHABLE = 0x36,
+ SPELL_FAILED_NOT_FLYING = 0x37,
+ SPELL_FAILED_NOT_HERE = 0x38,
+ SPELL_FAILED_NOT_INFRONT = 0x39,
+ SPELL_FAILED_NOT_IN_CONTROL = 0x3A,
+ SPELL_FAILED_NOT_KNOWN = 0x3B,
+ SPELL_FAILED_NOT_MOUNTED = 0x3C,
+ SPELL_FAILED_NOT_ON_TAXI = 0x3D,
+ SPELL_FAILED_NOT_ON_TRANSPORT = 0x3E,
+ SPELL_FAILED_NOT_READY = 0x3F,
+ SPELL_FAILED_NOT_SHAPESHIFT = 0x40,
+ SPELL_FAILED_NOT_STANDING = 0x41,
+ SPELL_FAILED_NOT_TRADEABLE = 0x42,
+ SPELL_FAILED_NOT_TRADING = 0x43,
+ SPELL_FAILED_NOT_UNSHEATHED = 0x44,
+ SPELL_FAILED_NOT_WHILE_GHOST = 0x45,
+ SPELL_FAILED_NO_AMMO = 0x46,
+ SPELL_FAILED_NO_CHARGES_REMAIN = 0x47,
+ SPELL_FAILED_NO_CHAMPION = 0x48,
+ SPELL_FAILED_NO_COMBO_POINTS = 0x49,
+ SPELL_FAILED_NO_DUELING = 0x4A,
+ SPELL_FAILED_NO_ENDURANCE = 0x4B,
+ SPELL_FAILED_NO_FISH = 0x4C,
+ SPELL_FAILED_NO_ITEMS_WHILE_SHAPESHIFTED = 0x4D,
+ SPELL_FAILED_NO_MOUNTS_ALLOWED = 0x4E,
+ SPELL_FAILED_NO_PET = 0x4F,
+ SPELL_FAILED_NO_POWER = 0x50,
+ SPELL_FAILED_NOTHING_TO_DISPEL = 0x51,
+ SPELL_FAILED_NOTHING_TO_STEAL = 0x52,
+ SPELL_FAILED_ONLY_ABOVEWATER = 0x53,
+ SPELL_FAILED_ONLY_DAYTIME = 0x54,
+ SPELL_FAILED_ONLY_INDOORS = 0x55,
+ SPELL_FAILED_ONLY_MOUNTED = 0x56,
+ SPELL_FAILED_ONLY_NIGHTTIME = 0x57,
+ SPELL_FAILED_ONLY_OUTDOORS = 0x58,
+ SPELL_FAILED_ONLY_SHAPESHIFT = 0x59,
+ SPELL_FAILED_ONLY_STEALTHED = 0x5A,
+ SPELL_FAILED_ONLY_UNDERWATER = 0x5B,
+ SPELL_FAILED_OUT_OF_RANGE = 0x5C,
+ SPELL_FAILED_PACIFIED = 0x5D,
+ SPELL_FAILED_POSSESSED = 0x5E,
+ SPELL_FAILED_REAGENTS = 0x5F,
+ SPELL_FAILED_REQUIRES_AREA = 0x60,
+ SPELL_FAILED_REQUIRES_SPELL_FOCUS = 0x61,
+ SPELL_FAILED_ROOTED = 0x62,
+ SPELL_FAILED_SILENCED = 0x63,
+ SPELL_FAILED_SPELL_IN_PROGRESS = 0x64,
+ SPELL_FAILED_SPELL_LEARNED = 0x65,
+ SPELL_FAILED_SPELL_UNAVAILABLE = 0x66,
+ SPELL_FAILED_STUNNED = 0x67,
+ SPELL_FAILED_TARGETS_DEAD = 0x68,
+ SPELL_FAILED_TARGET_AFFECTING_COMBAT = 0x69,
+ SPELL_FAILED_TARGET_AURASTATE = 0x6A,
+ SPELL_FAILED_TARGET_DUELING = 0x6B,
+ SPELL_FAILED_TARGET_ENEMY = 0x6C,
+ SPELL_FAILED_TARGET_ENRAGED = 0x6D,
+ SPELL_FAILED_TARGET_FRIENDLY = 0x6E,
+ SPELL_FAILED_TARGET_IN_COMBAT = 0x6F,
+ SPELL_FAILED_TARGET_IS_PLAYER = 0x70,
+ SPELL_FAILED_TARGET_IS_PLAYER_CONTROLLED = 0x71,
+ SPELL_FAILED_TARGET_NOT_DEAD = 0x72,
+ SPELL_FAILED_TARGET_NOT_IN_PARTY = 0x73,
+ SPELL_FAILED_TARGET_NOT_LOOTED = 0x74,
+ SPELL_FAILED_TARGET_NOT_PLAYER = 0x75,
+ SPELL_FAILED_TARGET_NO_POCKETS = 0x76,
+ SPELL_FAILED_TARGET_NO_WEAPONS = 0x77,
+ SPELL_FAILED_TARGET_UNSKINNABLE = 0x78,
+ SPELL_FAILED_THIRST_SATIATED = 0x79,
+ SPELL_FAILED_TOO_CLOSE = 0x7A,
+ SPELL_FAILED_TOO_MANY_OF_ITEM = 0x7B,
+ SPELL_FAILED_TOTEM_CATEGORY = 0x7C,
+ SPELL_FAILED_TOTEMS = 0x7D,
+ SPELL_FAILED_TRAINING_POINTS = 0x7E,
+ SPELL_FAILED_TRY_AGAIN = 0x7F,
+ SPELL_FAILED_UNIT_NOT_BEHIND = 0x80,
+ SPELL_FAILED_UNIT_NOT_INFRONT = 0x81,
+ SPELL_FAILED_WRONG_PET_FOOD = 0x82,
+ SPELL_FAILED_NOT_WHILE_FATIGUED = 0x83,
+ SPELL_FAILED_TARGET_NOT_IN_INSTANCE = 0x84,
+ SPELL_FAILED_NOT_WHILE_TRADING = 0x85,
+ SPELL_FAILED_TARGET_NOT_IN_RAID = 0x86,
+ SPELL_FAILED_DISENCHANT_WHILE_LOOTING = 0x87,
+ SPELL_FAILED_PROSPECT_WHILE_LOOTING = 0x88,
+ SPELL_FAILED_PROSPECT_NEED_MORE = 0x89,
+ SPELL_FAILED_TARGET_FREEFORALL = 0x8A,
+ SPELL_FAILED_NO_EDIBLE_CORPSES = 0x8B,
+ SPELL_FAILED_ONLY_BATTLEGROUNDS = 0x8C,
+ SPELL_FAILED_TARGET_NOT_GHOST = 0x8D,
+ SPELL_FAILED_TOO_MANY_SKILLS = 0x8E,
+ SPELL_FAILED_TRANSFORM_UNUSABLE = 0x8F,
+ SPELL_FAILED_WRONG_WEATHER = 0x90,
+ SPELL_FAILED_DAMAGE_IMMUNE = 0x91,
+ SPELL_FAILED_PREVENTED_BY_MECHANIC = 0x92,
+ SPELL_FAILED_PLAY_TIME = 0x93,
+ SPELL_FAILED_REPUTATION = 0x94,
+ SPELL_FAILED_MIN_SKILL = 0x95,
+ SPELL_FAILED_NOT_IN_ARENA = 0x96,
+ SPELL_FAILED_NOT_ON_SHAPESHIFT = 0x97,
+ SPELL_FAILED_NOT_ON_STEALTHED = 0x98,
+ SPELL_FAILED_NOT_ON_DAMAGE_IMMUNE = 0x99,
+ SPELL_FAILED_NOT_ON_MOUNTED = 0x9A,
+ SPELL_FAILED_TOO_SHALLOW = 0x9B,
+ SPELL_FAILED_TARGET_NOT_IN_SANCTUARY = 0x9C,
+ SPELL_FAILED_TARGET_IS_TRIVIAL = 0x9D,
+ SPELL_FAILED_BM_OR_INVISGOD = 0x9E,
+ SPELL_FAILED_EXPERT_RIDING_REQUIREMENT = 0x9F,
+ SPELL_FAILED_ARTISAN_RIDING_REQUIREMENT = 0xA0,
+ SPELL_FAILED_NOT_IDLE = 0xA1,
+ SPELL_FAILED_NOT_INACTIVE = 0xA2,
+ SPELL_FAILED_PARTIAL_PLAYTIME = 0xA3,
+ SPELL_FAILED_NO_PLAYTIME = 0xA4,
+ SPELL_FAILED_NOT_IN_BATTLEGROUND = 0xA5,
+ SPELL_FAILED_ONLY_IN_ARENA = 0xA6,
+ SPELL_FAILED_TARGET_LOCKED_TO_RAID_INSTANCE = 0xA7,
+ SPELL_FAILED_UNKNOWN = 0xA8,
};
enum SpellFamilyNames
@@ -239,12 +223,8 @@ enum SpellFamilyNames
SPELLFAMILY_HUNTER = 9,
SPELLFAMILY_PALADIN = 10,
SPELLFAMILY_SHAMAN = 11,
- SPELLFAMILY_UNK2 = 12, // 2 spells (silence resistance)
- SPELLFAMILY_POTION = 13,
- // 14 - unused
- SPELLFAMILY_DEATHKNIGHT = 15,
- // 16 - unused
- SPELLFAMILY_PET = 17
+ SPELLFAMILY_UNK2 = 12,
+ SPELLFAMILY_POTION = 13
};
enum SpellDisableTypes
@@ -417,7 +397,6 @@ inline bool IsAreaOfEffectSpell(SpellEntry const *spellInfo)
inline bool IsAreaAuraEffect(uint32 effect)
{
if( effect == SPELL_EFFECT_APPLY_AREA_AURA_PARTY ||
- effect == SPELL_EFFECT_APPLY_AREA_AURA_RAID ||
effect == SPELL_EFFECT_APPLY_AREA_AURA_FRIEND ||
effect == SPELL_EFFECT_APPLY_AREA_AURA_ENEMY ||
effect == SPELL_EFFECT_APPLY_AREA_AURA_PET ||
@@ -490,11 +469,7 @@ bool IsDiminishingReturnsGroupDurationLimited(DiminishingGroup group);
DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group);
// Spell affects related declarations (accessed using SpellMgr functions)
-struct SpellAffectEntry
-{
- uint32 SpellClassMask[3];
-};
-typedef UNORDERED_MAP<uint32, SpellAffectEntry> SpellAffectMap;
+typedef std::map<uint32, uint64> SpellAffectMap;
// Spell proc event related declarations (accessed using SpellMgr functions)
enum ProcFlags
@@ -712,9 +687,6 @@ typedef std::multimap<uint32, SpellLearnSpellNode> SpellLearnSpellMap;
typedef std::multimap<uint32, SkillLineAbilityEntry const*> SkillLineAbilityMap;
-typedef std::map<uint32, uint32> PetLevelupSpellSet;
-typedef std::map<uint32, PetLevelupSpellSet> PetLevelupSpellMap;
-
inline bool IsPrimaryProfessionSkill(uint32 skill)
{
SkillLineEntry const *pSkill = sSkillLineStore.LookupEntry(skill);
@@ -755,15 +727,15 @@ class SpellMgr
// Accessors (const or static functions)
public:
// Spell affects
- SpellAffectEntry const*GetSpellAffect(uint16 spellId, uint8 effectId) const
+ uint64 GetSpellAffectMask(uint16 spellId, uint8 effectId) const
{
SpellAffectMap::const_iterator itr = mSpellAffectMap.find((spellId<<8) + effectId);
if( itr != mSpellAffectMap.end( ) )
- return &itr->second;
+ return itr->second;
return 0;
}
- bool IsAffectedByMod(SpellEntry const *spellInfo, SpellModifier *mod) const;
+ bool IsAffectedBySpell(SpellEntry const *spellInfo, uint32 spellId, uint8 effectId, uint64 familyFlags) const;
SpellElixirMap const& GetSpellElixirMap() const { return mSpellElixirs; }
@@ -966,6 +938,11 @@ class SpellMgr
return 0;
else
return mSpellCustomAttr[spell_id];
+ /*SpellCustomAttrMap::const_iterator itr = mSpellCustomAttrMap.find(spell_id);
+ if(itr != mSpellCustomAttrMap.end())
+ return itr->second;
+ else
+ return 0;*/
}
const std::vector<int32> *GetSpellLinked(int32 spell_id) const
@@ -977,15 +954,6 @@ class SpellMgr
SpellEffectTargetTypes EffectTargetType[TOTAL_SPELL_EFFECTS];
SpellSelectTargetTypes SpellTargetType[TOTAL_SPELL_TARGETS];
- PetLevelupSpellSet const* GetPetLevelupSpellList(uint32 petFamily) const
- {
- PetLevelupSpellMap::const_iterator itr = mPetLevelupSpellMap.find(petFamily);
- if(itr != mPetLevelupSpellMap.end())
- return &itr->second;
- else
- return NULL;
- }
-
// Modifiers
public:
static SpellMgr& Instance();
@@ -1005,7 +973,6 @@ class SpellMgr
void LoadSpellPetAuras();
void LoadSpellCustomAttr();
void LoadSpellLinked();
- void LoadPetLevelupSpellMap();
private:
SpellScriptTarget mSpellScriptTarget;
@@ -1022,7 +989,6 @@ class SpellMgr
SpellPetAuraMap mSpellPetAuraMap;
SpellCustomAttribute mSpellCustomAttr;
SpellLinkedMap mSpellLinkedMap;
- PetLevelupSpellMap mPetLevelupSpellMap;
};
#define spellmgr SpellMgr::Instance()
diff --git a/src/game/StatSystem.cpp b/src/game/StatSystem.cpp
index df666d4c71e..3e9ddcf3bef 100644
--- a/src/game/StatSystem.cpp
+++ b/src/game/StatSystem.cpp
@@ -51,17 +51,24 @@ bool Player::UpdateStats(Stats stat)
switch(stat)
{
case STAT_STRENGTH:
+ UpdateAttackPowerAndDamage();
UpdateShieldBlockValue();
break;
case STAT_AGILITY:
UpdateArmor();
+ UpdateAttackPowerAndDamage(true);
+ if(getClass() == CLASS_ROGUE || getClass() == CLASS_HUNTER || getClass() == CLASS_DRUID && m_form==FORM_CAT)
+ UpdateAttackPowerAndDamage();
+
UpdateAllCritPercentages();
UpdateDodgePercentage();
break;
+
case STAT_STAMINA: UpdateMaxHealth(); break;
case STAT_INTELLECT:
UpdateMaxPower(POWER_MANA);
UpdateAllSpellCritChances();
+ UpdateAttackPowerAndDamage(true); //SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT, only intellect currently
UpdateArmor(); //SPELL_AURA_MOD_RESISTANCE_OF_INTELLECT_PERCENT, only armor currently
break;
@@ -71,25 +78,8 @@ bool Player::UpdateStats(Stats stat)
default:
break;
}
- // Need update (exist AP from stat auras)
- UpdateAttackPowerAndDamage();
- UpdateAttackPowerAndDamage(true);
-
UpdateSpellDamageAndHealingBonus();
UpdateManaRegen();
-
- // Update ratings in exist SPELL_AURA_MOD_RATING_FROM_STAT and only depends from stat
- uint32 mask = 0;
- AuraList const& modRatingFromStat = GetAurasByType(SPELL_AURA_MOD_RATING_FROM_STAT);
- for(AuraList::const_iterator i = modRatingFromStat.begin();i != modRatingFromStat.end(); ++i)
- if (Stats((*i)->GetMiscBValue()) == stat)
- mask |= (*i)->GetMiscValue();
- if (mask)
- {
- for (uint32 rating = 0; rating < MAX_COMBAT_RATING; ++rating)
- if (mask & (1 << rating))
- ApplyRatingMod(CombatRating(rating), 0, true);
- }
return true;
}
@@ -265,7 +255,6 @@ void Player::UpdateAttackPowerAndDamage(bool ranged )
{
case CLASS_WARRIOR: val2 = level*3.0f + GetStat(STAT_STRENGTH)*2.0f - 20.0f; break;
case CLASS_PALADIN: val2 = level*3.0f + GetStat(STAT_STRENGTH)*2.0f - 20.0f; break;
- case CLASS_DEATH_KNIGHT: val2 = level*3.0f + GetStat(STAT_STRENGTH)*2.0f - 20.0f; break;
case CLASS_ROGUE: val2 = level*2.0f + GetStat(STAT_STRENGTH) + GetStat(STAT_AGILITY) - 20.0f; break;
case CLASS_HUNTER: val2 = level*2.0f + GetStat(STAT_STRENGTH) + GetStat(STAT_AGILITY) - 20.0f; break;
case CLASS_SHAMAN: val2 = level*2.0f + GetStat(STAT_STRENGTH)*2.0f - 20.0f; break;
@@ -320,20 +309,11 @@ void Player::UpdateAttackPowerAndDamage(bool ranged )
float attPowerMod = GetModifierValue(unitMod, TOTAL_VALUE);
//add dynamic flat mods
- if ((getClassMask() & CLASSMASK_WAND_USERS)==0)
+ if( ranged && (getClassMask() & CLASSMASK_WAND_USERS)==0)
{
- if( ranged )
- {
- AuraList const& mRAPbyIntellect = GetAurasByType(SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT);
- for(AuraList::const_iterator i = mRAPbyIntellect.begin();i != mRAPbyIntellect.end(); ++i)
- attPowerMod += int32(GetStat(Stats((*i)->GetModifier()->m_miscvalue)) * (*i)->GetModifier()->m_amount / 100.0f);
- }
- else
- {
- AuraList const& mRAPbyIntellect = GetAurasByType(SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT);
- for(AuraList::const_iterator i = mRAPbyIntellect.begin();i != mRAPbyIntellect.end(); ++i)
- attPowerMod += int32(GetStat(Stats((*i)->GetModifier()->m_miscvalue)) * (*i)->GetModifier()->m_amount / 100.0f);
- }
+ AuraList const& mRAPbyIntellect = GetAurasByType(SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT);
+ for(AuraList::const_iterator i = mRAPbyIntellect.begin();i != mRAPbyIntellect.end(); ++i)
+ attPowerMod += int32(GetStat(Stats((*i)->GetModifier()->m_miscvalue)) * (*i)->GetModifierValue() / 100.0f);
}
float attPowerMultiplier = GetModifierValue(unitMod, TOTAL_PCT) - 1.0f;
@@ -574,24 +554,6 @@ void Player::UpdateSpellCritChance(uint32 school)
SetFloatValue(PLAYER_SPELL_CRIT_PERCENTAGE1 + school, crit);
}
-void Player::UpdateMeleeHitChances()
-{
- m_modMeleeHitChance = GetTotalAuraModifier(SPELL_AURA_MOD_HIT_CHANCE);
- m_modMeleeHitChance+= GetRatingBonusValue(CR_HIT_MELEE);
-}
-
-void Player::UpdateRangedHitChances()
-{
- m_modRangedHitChance = GetTotalAuraModifier(SPELL_AURA_MOD_HIT_CHANCE);
- m_modRangedHitChance+= GetRatingBonusValue(CR_HIT_RANGED);
-}
-
-void Player::UpdateSpellHitChances()
-{
- m_modSpellHitChance = GetTotalAuraModifier(SPELL_AURA_MOD_SPELL_HIT_CHANCE);
- m_modSpellHitChance+= GetRatingBonusValue(CR_HIT_SPELL);
-}
-
void Player::UpdateAllSpellCritChances()
{
for (int i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; i++)
@@ -662,9 +624,9 @@ void Player::UpdateManaRegen()
int32 modManaRegenInterrupt = GetTotalAuraModifier(SPELL_AURA_MOD_MANA_REGEN_INTERRUPT);
if (modManaRegenInterrupt > 100)
modManaRegenInterrupt = 100;
- SetStatFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER, power_regen_mp5 + power_regen * modManaRegenInterrupt / 100.0f);
+ SetStatFloatValue(PLAYER_FIELD_MOD_MANA_REGEN_INTERRUPT, power_regen_mp5 + power_regen * modManaRegenInterrupt / 100.0f);
- SetStatFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER, power_regen_mp5 + power_regen);
+ SetStatFloatValue(PLAYER_FIELD_MOD_MANA_REGEN, power_regen_mp5 + power_regen);
}
void Player::_ApplyAllStatBonuses()
@@ -961,7 +923,7 @@ void Pet::UpdateAttackPowerAndDamage(bool ranged)
if(getPetType() == HUNTER_PET) //hunter pets benefit from owner's attack power
{
bonusAP = owner->GetTotalAttackPowerValue(RANGED_ATTACK) * 0.22f;
- SetBonusDamage( int32(owner->GetTotalAttackPowerValue(RANGED_ATTACK) * 0.1287f));
+ SetBonusDamage( int32(owner->GetTotalAttackPowerValue(RANGED_ATTACK) * 0.125f));
}
//demons benefit from warlocks shadow or fire damage
else if(getPetType() == SUMMON_PET && owner->getClass() == CLASS_WARLOCK)
diff --git a/src/game/TaxiHandler.cpp b/src/game/TaxiHandler.cpp
index fa649e20f6e..640618eaebb 100644
--- a/src/game/TaxiHandler.cpp
+++ b/src/game/TaxiHandler.cpp
@@ -71,7 +71,7 @@ void WorldSession::SendTaxiStatus( uint64 guid )
sLog.outDebug( "WORLD: Sent SMSG_TAXINODE_STATUS" );
}
-void WorldSession::HandleTaxiQueryAvailableNodes( WorldPacket & recv_data )
+void WorldSession::HandleTaxiQueryAvailableNodesOpcode( WorldPacket & recv_data )
{
CHECK_PACKET_SIZE(recv_data,8);
diff --git a/src/game/Transports.cpp b/src/game/Transports.cpp
index be71fcc3f98..21d3d3b1f27 100644
--- a/src/game/Transports.cpp
+++ b/src/game/Transports.cpp
@@ -137,7 +137,7 @@ void MapManager::LoadTransports()
Transport::Transport() : GameObject()
{
// 2.3.2 - 0x5A
- m_updateFlag = (UPDATEFLAG_TRANSPORT | UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION);
+ m_updateFlag = (UPDATEFLAG_TRANSPORT | UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HASPOSITION);
}
bool Transport::Create(uint32 guidlow, uint32 mapid, float x, float y, float z, float ang, uint32 animprogress, uint32 dynflags)
@@ -168,10 +168,9 @@ bool Transport::Create(uint32 guidlow, uint32 mapid, float x, float y, float z,
SetFloatValue(OBJECT_FIELD_SCALE_X, goinfo->size);
SetUInt32Value(GAMEOBJECT_FACTION, goinfo->faction);
- //SetUInt32Value(GAMEOBJECT_FLAGS, goinfo->flags);
- SetUInt32Value(GAMEOBJECT_FLAGS, MAKE_PAIR32(0x28, 0x64));
- SetUInt32Value(GAMEOBJECT_LEVEL, m_period);
- SetEntry(goinfo->id);
+ SetUInt32Value(GAMEOBJECT_FLAGS, goinfo->flags);
+
+ SetUInt32Value(OBJECT_FIELD_ENTRY, goinfo->id);
SetUInt32Value(GAMEOBJECT_DISPLAYID, goinfo->displayId);
@@ -180,7 +179,7 @@ bool Transport::Create(uint32 guidlow, uint32 mapid, float x, float y, float z,
SetGoAnimProgress(animprogress);
if(dynflags)
- SetUInt32Value(GAMEOBJECT_DYNAMIC, MAKE_PAIR32(0, dynflags));
+ SetUInt32Value(GAMEOBJECT_DYN_FLAGS, dynflags);
return true;
}
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 34156ac661d..e00b2446010 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -60,7 +60,6 @@ float baseMoveSpeed[MAX_MOVE_TYPE] =
3.141594f, // MOVE_TURN_RATE
7.0f, // MOVE_FLIGHT
4.5f, // MOVE_FLIGHT_BACK
- 3.14f // MOVE_PITCH_RATE
};
void InitTriggerAuraData();
@@ -155,7 +154,7 @@ Unit::Unit()
m_objectType |= TYPEMASK_UNIT;
m_objectTypeId = TYPEID_UNIT;
// 2.3.2 - 0x70
- m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_LIVING | UPDATEFLAG_HAS_POSITION);
+ m_updateFlag = (UPDATEFLAG_HIGHGUID | UPDATEFLAG_LIVING | UPDATEFLAG_HASPOSITION);
m_attackTimer[BASE_ATTACK] = 0;
m_attackTimer[OFF_ATTACK] = 0;
@@ -1632,7 +1631,7 @@ void Unit::DealSpellDamage(SpellNonMeleeDamage *damageInfo, bool durabilityLoss)
if( spellInfo->AttributesEx3 & 0x40000 && spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN && ((*itr).second->GetCasterGUID() == GetGUID()))
{
(*itr).second->SetAuraDuration((*itr).second->GetAuraMaxDuration());
- (*itr).second->SendAuraUpdate(false);
+ (*itr).second->UpdateAuraDuration();
}
}
}
@@ -1948,7 +1947,7 @@ void Unit::DealMeleeDamage(CalcDamageInfo *damageInfo, bool durabilityLoss)
if( spellInfo->AttributesEx3 & 0x40000 && spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN && ((*itr).second->GetCasterGUID() == GetGUID()))
{
(*itr).second->SetAuraDuration((*itr).second->GetAuraMaxDuration());
- (*itr).second->SendAuraUpdate(false);
+ (*itr).second->UpdateAuraDuration();
}
}
}
@@ -2343,7 +2342,9 @@ void Unit::DoAttackDamage (Unit *pVictim, uint32 *damage, CleanDamage *cleanDama
case MELEE_HIT_BLOCK_CRIT:
case MELEE_HIT_CRIT:
{
- *hitInfo = HITINFO_CRITICALHIT | HITINFO_NORMALSWING2 | HITINFO_UNK2;
+ //*hitInfo = 0xEA;
+ // 0xEA
+ *hitInfo = HITINFO_CRITICALHIT | HITINFO_NORMALSWING2 | 0x8;
// Crit bonus calc
uint32 crit_bonus;
@@ -2580,62 +2581,10 @@ void Unit::DoAttackDamage (Unit *pVictim, uint32 *damage, CleanDamage *cleanDama
}
case MELEE_HIT_GLANCING:
{
-<<<<<<< HEAD:src/game/Unit.cpp
int32 leveldif = int32(pVictim->getLevel()) - int32(getLevel());
if (leveldif > 3) leveldif = 3;
*damage *= (1 - leveldif * 0.1f);
cleanDamage->damage = *damage;
-=======
- float reducePercent = 1.0f; //damage factor
-
- // calculate base values and mods
- float baseLowEnd = 1.3;
- float baseHighEnd = 1.2;
- switch(getClass()) // lowering base values for casters
- {
- case CLASS_SHAMAN:
- case CLASS_PRIEST:
- case CLASS_MAGE:
- case CLASS_WARLOCK:
- case CLASS_DRUID:
- baseLowEnd -= 0.7;
- baseHighEnd -= 0.3;
- break;
- }
-
- float maxLowEnd = 0.6;
- switch(getClass()) // upper for melee classes
- {
- case CLASS_WARRIOR:
- case CLASS_ROGUE:
- case CLASS_DEATH_KNIGHT:
- maxLowEnd = 0.91; //If the attacker is a melee class then instead the lower value of 0.91
- }
-
- // calculate values
- int32 diff = int32(pVictim->GetDefenseSkillValue(this)) - int32(GetWeaponSkillValue(attType,pVictim));
- float lowEnd = baseLowEnd - ( 0.05f * diff );
- float highEnd = baseHighEnd - ( 0.03f * diff );
-
- // apply max/min bounds
- if ( lowEnd < 0.01f ) //the low end must not go bellow 0.01f
- lowEnd = 0.01f;
- else if ( lowEnd > maxLowEnd ) //the smaller value of this and 0.6 is kept as the low end
- lowEnd = maxLowEnd;
-
- if ( highEnd < 0.2f ) //high end limits
- highEnd = 0.2f;
- if ( highEnd > 0.99f )
- highEnd = 0.99f;
-
- if(lowEnd > highEnd) // prevent negative range size
- lowEnd = highEnd;
-
- reducePercent = lowEnd + rand_norm() * ( highEnd - lowEnd );
-
- *damage = uint32(reducePercent * *damage);
- cleanDamage->damage += *damage;
->>>>>>> upstream/master:src/game/Unit.cpp
*hitInfo |= HITINFO_GLANCING;
break;
}
@@ -2684,7 +2633,7 @@ void Unit::DoAttackDamage (Unit *pVictim, uint32 *damage, CleanDamage *cleanDama
((*itr).second->GetCasterGUID() == GetGUID() && (!spellCasted || spellCasted->Id == 35395)) )
{
(*itr).second->SetAuraDuration((*itr).second->GetAuraMaxDuration());
- (*itr).second->SendAuraUpdate(false);
+ (*itr).second->UpdateAuraDuration();
}
}
}
@@ -2809,20 +2758,21 @@ MeleeHitOutcome Unit::RollPhysicalOutcomeAgainst (Unit const *pVictim, WeaponAtt
{
// Increase from SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL aura
crit_chance += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL, spellInfo->SchoolMask);
- // Ignore combat result aura
- AuraList const& ignore = GetAurasByType(SPELL_AURA_IGNORE_COMBAT_RESULT);
- for(AuraList::const_iterator i = ignore.begin(); i != ignore.end(); ++i)
+
+ if( dodge_chance != 0.0f ) // if dodge chance is already 0, ignore talents for speed
{
- if (!(*i)->isAffectedOnSpell(spellInfo))
- continue;
- switch((*i)->GetModifier()->m_miscvalue)
+ AuraList const& mCanNotBeDodge = GetAurasByType(SPELL_AURA_IGNORE_COMBAT_RESULT);
+ for(AuraList::const_iterator i = mCanNotBeDodge.begin(); i != mCanNotBeDodge.end(); ++i)
{
- case MELEE_HIT_DODGE: dodge_chance = 0.0f; break;
- case MELEE_HIT_BLOCK: block_chance = 0.0f; break;
- case MELEE_HIT_PARRY: parry_chance = 0.0f; break;
- default:
- DEBUG_LOG("Spell %u SPELL_AURA_IGNORE_COMBAT_RESULT have unhandled state %d", (*i)->GetId(), (*i)->GetModifier()->m_miscvalue);
- break;
+ // can't be dodged rogue finishing move
+ if((*i)->GetModifier()->m_miscvalue == VICTIMSTATE_DODGE)
+ {
+ if(spellInfo->SpellFamilyName==SPELLFAMILY_ROGUE && (spellInfo->SpellFamilyFlags & SPELLFAMILYFLAG_ROGUE__FINISHING_MOVE))
+ {
+ dodge_chance = 0.0f;
+ break;
+ }
+ }
}
}
}
@@ -4788,7 +4738,7 @@ void Unit::DelayAura(uint32 spellId, uint32 effindex, int32 delaytime)
iter->second->SetAuraDuration(0);
else
iter->second->SetAuraDuration(iter->second->GetAuraDuration() - delaytime);
- iter->second->SendAuraUpdate(false);
+ iter->second->UpdateAuraDuration();
sLog.outDebug("Aura %u partially interrupted on unit %u, new duration: %u ms",iter->second->GetModifier()->m_auraname, GetGUIDLow(), iter->second->GetAuraDuration());
}
}
@@ -4980,7 +4930,6 @@ void Unit::SendSpellNonMeleeDamageLog(Unit *target,uint32 SpellID,uint32 Damage,
data.append(GetPackGUID());
data << uint32(SpellID);
data << uint32(Damage-AbsorbedDamage-Resist-Blocked);
- data << uint32(0); // wotlk
data << uint8(damageSchoolMask); // spell school
data << uint32(AbsorbedDamage); // AbsorbedDamage
data << uint32(Resist); // resist
@@ -5045,66 +4994,31 @@ void Unit::SendAttackStateUpdate(uint32 HitInfo, Unit *target, uint8 SwingType,
sLog.outDebug("WORLD: Sending SMSG_ATTACKERSTATEUPDATE");
WorldPacket data(SMSG_ATTACKERSTATEUPDATE, (16+45)); // we guess size
- data << uint32(HitInfo); // flags
+ data << (uint32)HitInfo;
data.append(GetPackGUID());
data.append(target->GetPackGUID());
- data << uint32(Damage-AbsorbDamage-Resist-BlockedAmount);// damage
- data << uint32(0); // overkill value
+ data << (uint32)(Damage-AbsorbDamage-Resist-BlockedAmount);
data << (uint8)SwingType; // count?
// for(i = 0; i < SwingType; ++i)
data << (uint32)damageSchoolMask;
data << (float)(Damage-AbsorbDamage-Resist-BlockedAmount);
+ // still need to double check damage
data << (uint32)(Damage-AbsorbDamage-Resist-BlockedAmount);
+ data << (uint32)AbsorbDamage;
+ data << (uint32)Resist;
// end loop
- if(HitInfo & (HITINFO_ABSORB | HITINFO_ABSORB2))
- {
- // for(i = 0; i < SwingType; ++i)
- data << uint32(AbsorbDamage);
- // end loop
- }
+ data << (uint32)TargetState;
- if(HitInfo & (HITINFO_RESIST | HITINFO_RESIST2))
- {
- // for(i = 0; i < SwingType; ++i)
- data << uint32(Resist);
- // end loop
- }
+ if( AbsorbDamage == 0 ) //also 0x3E8 = 0x3E8, check when that happens
+ data << (uint32)0;
+ else
+ data << (uint32)-1;
- data << (uint8)TargetState;
data << (uint32)0;
- data << (uint32)0;
-
- if(HitInfo & HITINFO_BLOCK)
- {
- data << uint32(BlockedAmount);
- }
-
- if(HitInfo & HITINFO_UNK3)
- {
- data << uint32(0);
- }
-
- if(HitInfo & HITINFO_UNK1)
- {
- data << uint32(0);
- data << float(0);
- data << float(0);
- data << float(0);
- data << float(0);
- data << float(0);
- data << float(0);
- data << float(0);
- data << float(0);
- for(uint8 i = 0; i < 5; ++i)
- {
- data << float(0);
- data << float(0);
- }
- data << uint32(0);
- }
+ data << (uint32)BlockedAmount;
SendMessageToSet( &data, true );
}
@@ -5325,7 +5239,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
{
switch (dummySpell->Id)
{
- // Eye for an Eye
+ // Eye of Eye
case 9799:
case 25988:
{
@@ -5942,7 +5856,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
triggered_spell_id = 39373;
break;
}
- // Greater Heal (Vestments of Faith (Priest Tier 3) - 4 pieces bonus)
+ // Vestments of Faith (Priest Tier 3) - 4 pieces bonus
case 28809:
{
triggered_spell_id = 28810;
@@ -6079,7 +5993,6 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
}
case SPELLFAMILY_PALADIN:
{
- // TODO: spell list, formula change in 3.0.3
// Seal of Righteousness - melee proc dummy
if (dummySpell->SpellFamilyFlags&0x000000008000000LL && triggeredByAura->GetEffIndex()==0)
{
@@ -6176,8 +6089,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
}
break;
}
- // TODO: fix basepoint calculation (changed in 3.0.3)
- // Seal of Vengeance
+ //Seal of Vengeance
case 31801:
{
if(effIndex != 0) // effect 1,2 used by seal unleashing code
@@ -6186,7 +6098,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
triggered_spell_id = 31803;
break;
}
- // Spiritual Attunement
+ // Spiritual Att.
case 31785:
case 33776:
{
@@ -6370,7 +6282,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
}
// Earth Shield
- if(dummySpell->SpellFamilyFlags & 0x0000040000000000LL)
+ if(dummySpell->SpellFamilyFlags==0x40000000000LL)
{
if(GetTypeId() != TYPEID_PLAYER)
return false;
@@ -6408,8 +6320,6 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
case 15208: spellId = 45294; break; // Rank 10
case 25448: spellId = 45295; break; // Rank 11
case 25449: spellId = 45296; break; // Rank 12
- case 49237: spellId = 49239; break; // Rank 13
- case 49238: spellId = 49240; break; // Rank 14
// Chain Lightning
case 421: spellId = 45297; break; // Rank 1
case 930: spellId = 45298; break; // Rank 2
@@ -6417,8 +6327,6 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
case 10605: spellId = 45300; break; // Rank 4
case 25439: spellId = 45301; break; // Rank 5
case 25442: spellId = 45302; break; // Rank 6
- case 49268: spellId = 49270; break; // Rank 7
- case 49269: spellId = 49271; break; // Rank 8
default:
sLog.outError("Unit::HandleDummyAuraProc: non handled spell id: %u (LO)", procSpell->Id);
return false;
@@ -6429,14 +6337,21 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
mod->value = -100;
mod->type = SPELLMOD_PCT;
mod->spellId = dummySpell->Id;
+ mod->effectId = 0;
+ mod->lastAffected = NULL;
mod->mask = 0x0000000000000003LL;
- mod->mask2= 0LL;
+ mod->charges = 0;
((Player*)this)->AddSpellMod(mod, true);
// Remove cooldown (Chain Lightning - have Category Recovery time)
if (procSpell->SpellFamilyFlags & 0x0000000000000002LL)
((Player*)this)->RemoveSpellCooldown(spellId);
+ // Hmmm.. in most case spells already set half basepoints but...
+ // Lightning Bolt (2-10 rank) have full basepoint and half bonus from level
+ // As on wiki:
+ // BUG: Rank 2 to 10 (and maybe 11) of Lightning Bolt will proc another Bolt with FULL damage (not halved). This bug is known and will probably be fixed soon.
+ // So - no add changes :)
CastSpell(pVictim, spellId, true, castItem, triggeredByAura);
((Player*)this)->AddSpellMod(mod, false);
@@ -6709,7 +6624,7 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggeredB
break;
}
// Shadowguard
- if((auraSpellInfo->SpellFamilyFlags & 0x80000000LL) && auraSpellInfo->SpellVisual[0]==7958)
+ if((auraSpellInfo->SpellFamilyFlags & 0x80000000LL) && auraSpellInfo->SpellVisual==7958)
{
switch(triggeredByAura->GetSpellProto()->Id)
{
@@ -7064,14 +6979,14 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggeredB
}
// Water Shield (we can't set cooldown for main spell - it's player casted spell
- if((auraSpellInfo->SpellFamilyFlags & 0x0000002000000000LL) && auraSpellInfo->SpellVisual[0]==7358)
+ if((auraSpellInfo->SpellFamilyFlags & 0x0000002000000000LL) && auraSpellInfo->SpellVisual==7358)
{
target = this;
break;
}
// Lightning Shield
- if((auraSpellInfo->SpellFamilyFlags & 0x00000400) && auraSpellInfo->SpellVisual[0]==37)
+ if((auraSpellInfo->SpellFamilyFlags & 0x00000400) && auraSpellInfo->SpellVisual==37)
{
// overwrite non existing triggered spell call in spell.dbc
switch(triggeredByAura->GetSpellProto()->Id)
@@ -7398,7 +7313,7 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggeredB
if (auraSpellInfo->Id==37594)
trigger_spell_id = 37595;
// Shadowguard
- else if(auraSpellInfo->SpellFamilyFlags==0x100080000000LL && auraSpellInfo->SpellVisual[0]==7958)
+ else if(auraSpellInfo->SpellFamilyFlags==0x100080000000LL && auraSpellInfo->SpellVisual==7958)
{
switch(auraSpellInfo->Id)
{
@@ -7593,7 +7508,7 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggeredB
case SPELLFAMILY_SHAMAN:
{
//Lightning Shield (overwrite non existing triggered spell call in spell.dbc
- if(auraSpellInfo->SpellFamilyFlags==0x00000400 && auraSpellInfo->SpellVisual[0]==37)
+ if(auraSpellInfo->SpellFamilyFlags==0x00000400 && auraSpellInfo->SpellVisual==37)
{
switch(auraSpellInfo->Id)
{
@@ -7805,21 +7720,21 @@ bool Unit::HandleOverrideClassScriptAuraProc(Unit *pVictim, Aura *triggeredByAur
{
case 836: // Improved Blizzard (Rank 1)
{
- if (!procSpell || procSpell->SpellVisual[0]!=9487)
+ if (!procSpell || procSpell->SpellVisual!=9487)
return false;
triggered_spell_id = 12484;
break;
}
case 988: // Improved Blizzard (Rank 2)
{
- if (!procSpell || procSpell->SpellVisual[0]!=9487)
+ if (!procSpell || procSpell->SpellVisual!=9487)
return false;
triggered_spell_id = 12485;
break;
}
case 989: // Improved Blizzard (Rank 3)
{
- if (!procSpell || procSpell->SpellVisual[0]!=9487)
+ if (!procSpell || procSpell->SpellVisual!=9487)
return false;
triggered_spell_id = 12486;
break;
@@ -8475,9 +8390,6 @@ void Unit::SetPet(Pet* pet)
void Unit::SetCharm(Unit* pet)
{
SetUInt64Value(UNIT_FIELD_CHARM, pet ? pet->GetGUID() : 0);
-
- if(GetTypeId() == TYPEID_PLAYER)
- ((Player*)this)->m_mover = pet ? pet : this;
}
void Unit::AddPlayerToVision(Player* plr)
@@ -8556,7 +8468,6 @@ void Unit::SendHealSpellLog(Unit *pVictim, uint32 SpellID, uint32 Damage, bool c
data.append(GetPackGUID());
data << uint32(SpellID);
data << uint32(Damage);
- data << uint32(0); // over healing?
data << uint8(critical ? 1 : 0);
data << uint8(0); // unused in client?
SendMessageToSet(&data, true);
@@ -8737,7 +8648,7 @@ uint32 Unit::SpellDamageBonus(Unit *pVictim, SpellEntry const *spellProto, uint3
CastingTime = 0;
}
// Darkmoon Card: Vengeance - 0.1%
- else if (spellProto->SpellVisual[0] == 9850 && spellProto->SpellIconID == 2230)
+ else if (spellProto->SpellVisual == 9850 && spellProto->SpellIconID == 2230)
{
CastingTime = 3.5;
}
@@ -9005,8 +8916,14 @@ int32 Unit::SpellBaseDamageBonus(SpellSchoolMask schoolMask)
{
if((*i)->GetModifier()->m_miscvalue & schoolMask)
{
- // stat used stored in miscValueB for this aura
- Stats usedStat = Stats((*i)->GetMiscBValue());
+ SpellEntry const* iSpellProto = (*i)->GetSpellProto();
+ uint8 eff = (*i)->GetEffIndex();
+
+ // stat used dependent from next effect aura SPELL_AURA_MOD_SPELL_HEALING presence and misc value (stat index)
+ Stats usedStat = STAT_INTELLECT;
+ if(eff < 2 && iSpellProto->EffectApplyAuraName[eff+1]==SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT)
+ usedStat = Stats(iSpellProto->EffectMiscValue[eff+1]);
+
DoneAdvertisedBenefit += int32(GetStat(usedStat) * (*i)->GetModifierValue() / 100.0f);
}
}
@@ -9177,7 +9094,7 @@ uint32 Unit::SpellHealingBonus(SpellEntry const *spellProto, uint32 healamount,
AuraList const& mDummyAuras = pVictim->GetAurasByType(SPELL_AURA_DUMMY);
for(AuraList::const_iterator i = mDummyAuras.begin();i != mDummyAuras.end(); ++i)
{
- if((*i)->GetSpellProto()->SpellVisual[0] == 9180)
+ if((*i)->GetSpellProto()->SpellVisual == 9180)
{
// Flash of Light
if ((spellProto->SpellFamilyFlags & 0x0000000040000000LL) && (*i)->GetEffIndex() == 1)
@@ -10193,37 +10110,38 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced)
propagateSpeedChange();
+ // Send speed change packet only for player
+ if (GetTypeId()!=TYPEID_PLAYER)
+ return;
+
WorldPacket data;
if(!forced)
{
switch(mtype)
{
case MOVE_WALK:
- data.Initialize(MSG_MOVE_SET_WALK_SPEED, 8+4+2+4+4+4+4+4+4+4);
+ data.Initialize(MSG_MOVE_SET_WALK_SPEED, 8+4+1+4+4+4+4+4+4+4);
break;
case MOVE_RUN:
- data.Initialize(MSG_MOVE_SET_RUN_SPEED, 8+4+2+4+4+4+4+4+4+4);
+ data.Initialize(MSG_MOVE_SET_RUN_SPEED, 8+4+1+4+4+4+4+4+4+4);
break;
case MOVE_RUN_BACK:
- data.Initialize(MSG_MOVE_SET_RUN_BACK_SPEED, 8+4+2+4+4+4+4+4+4+4);
+ data.Initialize(MSG_MOVE_SET_RUN_BACK_SPEED, 8+4+1+4+4+4+4+4+4+4);
break;
case MOVE_SWIM:
- data.Initialize(MSG_MOVE_SET_SWIM_SPEED, 8+4+2+4+4+4+4+4+4+4);
+ data.Initialize(MSG_MOVE_SET_SWIM_SPEED, 8+4+1+4+4+4+4+4+4+4);
break;
case MOVE_SWIM_BACK:
- data.Initialize(MSG_MOVE_SET_SWIM_BACK_SPEED, 8+4+2+4+4+4+4+4+4+4);
+ data.Initialize(MSG_MOVE_SET_SWIM_BACK_SPEED, 8+4+1+4+4+4+4+4+4+4);
break;
case MOVE_TURN_RATE:
- data.Initialize(MSG_MOVE_SET_TURN_RATE, 8+4+2+4+4+4+4+4+4+4);
+ data.Initialize(MSG_MOVE_SET_TURN_RATE, 8+4+1+4+4+4+4+4+4+4);
break;
case MOVE_FLIGHT:
- data.Initialize(MSG_MOVE_SET_FLIGHT_SPEED, 8+4+2+4+4+4+4+4+4+4);
+ data.Initialize(MSG_MOVE_SET_FLIGHT_SPEED, 8+4+1+4+4+4+4+4+4+4);
break;
case MOVE_FLIGHT_BACK:
- data.Initialize(MSG_MOVE_SET_FLIGHT_BACK_SPEED, 8+4+2+4+4+4+4+4+4+4);
- break;
- case MOVE_PITCH_RATE:
- data.Initialize(MSG_MOVE_SET_PITCH_RATE, 8+4+2+4+4+4+4+4+4+4);
+ data.Initialize(MSG_MOVE_SET_FLIGHT_BACK_SPEED, 8+4+1+4+4+4+4+4+4+4);
break;
default:
sLog.outError("Unit::SetSpeed: Unsupported move type (%d), data not sent to client.",mtype);
@@ -10231,26 +10149,22 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced)
}
data.append(GetPackGUID());
- data << uint32(0); // movement flags
- data << uint16(0); // unk flags
+ data << uint32(0); //movement flags
+ data << uint8(0); //unk
data << uint32(getMSTime());
data << float(GetPositionX());
data << float(GetPositionY());
data << float(GetPositionZ());
data << float(GetOrientation());
- data << uint32(0); // fall time
+ data << uint32(0); //flag unk
data << float(GetSpeed(mtype));
SendMessageToSet( &data, true );
}
else
{
- if(GetTypeId() == TYPEID_PLAYER)
- {
- // register forced speed changes for WorldSession::HandleForceSpeedChangeAck
- // and do it only for real sent packets and use run for run/mounted as client expected
- ++((Player*)this)->m_forced_speed_changes[mtype];
- }
-
+ // register forced speed changes for WorldSession::HandleForceSpeedChangeAck
+ // and do it only for real sent packets and use run for run/mounted as client expected
+ ++((Player*)this)->m_forced_speed_changes[mtype];
switch(mtype)
{
case MOVE_WALK:
@@ -10277,9 +10191,6 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced)
case MOVE_FLIGHT_BACK:
data.Initialize(SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE, 16);
break;
- case MOVE_PITCH_RATE:
- data.Initialize(SMSG_FORCE_PITCH_RATE_CHANGE, 16);
- break;
default:
sLog.outError("Unit::SetSpeed: Unsupported move type (%d), data not sent to client.",mtype);
return;
@@ -10369,10 +10280,6 @@ bool Unit::CanHaveThreatList() const
if( ((Creature*)this)->isTotem() )
return false;
- // vehicles can not have threat list
- if( ((Creature*)this)->isVehicle() )
- return false;
-
// pets can not have a threat list, unless they are controlled by a creature
if( ((Creature*)this)->isPet() && IS_PLAYER_GUID(((Pet*)this)->GetOwnerGUID()) )
return false;
@@ -10621,8 +10528,6 @@ int32 Unit::CalculateSpellDuration(SpellEntry const* spellProto, uint8 effect_in
int32 mechanic = GetEffectMechanic(spellProto, effect_index);
// Find total mod value (negative bonus)
int32 durationMod_always = target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MECHANIC_DURATION_MOD, mechanic);
- // Modify from SPELL_AURA_MOD_DURATION_OF_EFFECTS_BY_DISPEL aura (stack always ?)
- durationMod_always+=target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_DURATION_OF_EFFECTS_BY_DISPEL, spellProto->Dispel);
// Find max mod (negative bonus)
int32 durationMod_not_stack = target->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK, mechanic);
@@ -10824,9 +10729,7 @@ bool Unit::HandleStatModifier(UnitMods unitMod, UnitModifierType modifierType, f
case UNIT_MOD_RAGE:
case UNIT_MOD_FOCUS:
case UNIT_MOD_ENERGY:
- case UNIT_MOD_HAPPINESS:
- case UNIT_MOD_RUNE:
- case UNIT_MOD_RUNIC_POWER: UpdateMaxPower(GetPowerTypeByAuraGroup(unitMod)); break;
+ case UNIT_MOD_HAPPINESS: UpdateMaxPower(GetPowerTypeByAuraGroup(unitMod)); break;
case UNIT_MOD_RESISTANCE_HOLY:
case UNIT_MOD_RESISTANCE_FIRE:
@@ -10939,18 +10842,21 @@ Stats Unit::GetStatByAuraGroup(UnitMods unitMod) const
Powers Unit::GetPowerTypeByAuraGroup(UnitMods unitMod) const
{
+ Powers power = POWER_MANA;
+
switch(unitMod)
{
- case UNIT_MOD_MANA: return POWER_MANA;
- case UNIT_MOD_RAGE: return POWER_RAGE;
- case UNIT_MOD_FOCUS: return POWER_FOCUS;
- case UNIT_MOD_ENERGY: return POWER_ENERGY;
- case UNIT_MOD_HAPPINESS: return POWER_HAPPINESS;
- case UNIT_MOD_RUNE: return POWER_RUNE;
- case UNIT_MOD_RUNIC_POWER:return POWER_RUNIC_POWER;
+ case UNIT_MOD_MANA: power = POWER_MANA; break;
+ case UNIT_MOD_RAGE: power = POWER_RAGE; break;
+ case UNIT_MOD_FOCUS: power = POWER_FOCUS; break;
+ case UNIT_MOD_ENERGY: power = POWER_ENERGY; break;
+ case UNIT_MOD_HAPPINESS: power = POWER_HAPPINESS; break;
+
+ default:
+ break;
}
- return POWER_MANA;
+ return power;
}
float Unit::GetTotalAttackPowerValue(WeaponAttackType attType) const
@@ -11049,12 +10955,6 @@ void Unit::SetPower(Powers power, uint32 val)
SetStatInt32Value(UNIT_FIELD_POWER1 + power, val);
- WorldPacket data(SMSG_POWER_UPDATE);
- data.append(GetPackGUID());
- data << uint8(power);
- data << uint32(val);
- SendMessageToSet(&data, GetTypeId() == TYPEID_PLAYER ? true : false);
-
// group update
if(GetTypeId() == TYPEID_PLAYER)
{
@@ -11168,7 +11068,6 @@ uint32 Unit::GetCreatePowers( Powers power ) const
case POWER_FOCUS: return (GetTypeId()==TYPEID_PLAYER || !((Creature const*)this)->isPet() || ((Pet const*)this)->getPetType()!=HUNTER_PET ? 0 : 100);
case POWER_ENERGY: return 100;
case POWER_HAPPINESS: return (GetTypeId()==TYPEID_PLAYER || !((Creature const*)this)->isPet() || ((Pet const*)this)->getPetType()!=HUNTER_PET ? 0 : 1050000);
- case POWER_RUNIC_POWER: return 1000;
}
return 0;
@@ -11256,7 +11155,7 @@ void CharmInfo::InitEmptyActionBar(bool withAttack)
for(uint32 x = 0; x < 10; ++x)
{
- PetActionBar[x].Type = ACT_PASSIVE;
+ PetActionBar[x].Type = ACT_CAST;
PetActionBar[x].SpellOrAction = 0;
}
if (withAttack)
@@ -11272,20 +11171,13 @@ void CharmInfo::InitPossessCreateSpells()
InitEmptyActionBar();
if(m_unit->GetTypeId() == TYPEID_UNIT)
{
- /*for(uint32 i = 0; i < CREATURE_MAX_SPELLS; ++i)
+ for(uint32 i = 0; i < CREATURE_MAX_SPELLS; ++i)
{
uint32 spellid = ((Creature*)m_unit)->m_spells[i];
if(IsPassiveSpell(spellid))
m_unit->CastSpell(m_unit, spellid, true);
else
AddSpellToAB(0, spellid, ACT_CAST);
- }*/
- for(uint32 x = 0; x < CREATURE_MAX_SPELLS; ++x)
- {
- if (IsPassiveSpell(((Creature*)m_unit)->m_spells[x]))
- m_unit->CastSpell(m_unit, ((Creature*)m_unit)->m_spells[x], true);
- else
- AddSpellToAB(0, ((Creature*)m_unit)->m_spells[x], ACT_PASSIVE);
}
}
}
@@ -11329,7 +11221,7 @@ void CharmInfo::InitCharmCreateSpells()
if(onlyselfcast || !IsPositiveSpell(spellId)) //only self cast and spells versus enemies are autocastable
newstate = ACT_DISABLED;
else
- newstate = ACT_PASSIVE;
+ newstate = ACT_CAST;
AddSpellToAB(0, spellId, newstate);
}
@@ -11340,7 +11232,7 @@ bool CharmInfo::AddSpellToAB(uint32 oldid, uint32 newid, ActiveStates newstate)
{
for(uint8 i = 0; i < 10; i++)
{
- if((PetActionBar[i].Type == ACT_DISABLED || PetActionBar[i].Type == ACT_ENABLED || PetActionBar[i].Type == ACT_PASSIVE) && PetActionBar[i].SpellOrAction == oldid)
+ if((PetActionBar[i].Type == ACT_DISABLED || PetActionBar[i].Type == ACT_ENABLED || PetActionBar[i].Type == ACT_CAST) && PetActionBar[i].SpellOrAction == oldid)
{
PetActionBar[i].SpellOrAction = newid;
if(!oldid)
@@ -11955,11 +11847,8 @@ void Unit::SendPetCastFail(uint32 spellid, uint8 msg)
return;
WorldPacket data(SMSG_PET_CAST_FAILED, (4+1));
- data << uint8(0); // cast count?
data << uint32(spellid);
data << uint8(msg);
- // uint32 for some reason
- // uint32 for some reason
((Player*)owner)->GetSession()->SendPacket(&data);
}
@@ -12513,10 +12402,7 @@ Pet* Unit::CreateTamedPetFrom(Creature* creatureTarget,uint32 spell_id)
pet->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, getFaction());
pet->SetUInt32Value(UNIT_CREATED_BY_SPELL, spell_id);
- uint32 level = (creatureTarget->getLevel() < (getLevel() - 5)) ? (getLevel() - 5) : creatureTarget->getLevel();
- pet->SetFreeTalentPoints(pet->GetMaxTalentPointsForLevel(level));
-
- if(!pet->InitStatsForLevel(level))
+ if(!pet->InitStatsForLevel(creatureTarget->getLevel()))
{
sLog.outError("ERROR: Pet::InitStatsForLevel() failed for creature (Entry: %u)!",creatureTarget->GetEntry());
delete pet;
@@ -12647,8 +12533,10 @@ bool Unit::HandleMeandingAuraProc( Aura* triggeredByAura )
mod->value = jumps-5; // negative
mod->type = SPELLMOD_FLAT;
mod->spellId = spellProto->Id;
- mod->mask = spellProto->SpellFamilyFlags;
- mod->mask2 = spellProto->SpellFamilyFlags2;
+ mod->effectId = effIdx;
+ mod->lastAffected = NULL;
+ mod->mask = spellProto->SpellFamilyFlags;
+ mod->charges = 0;
caster->AddSpellMod(mod, true);
CastCustomSpell(target,spellProto->Id,&heal,NULL,NULL,true,NULL,triggeredByAura,caster->GetGUID());
@@ -12836,15 +12724,6 @@ void Unit::Kill(Unit *pVictim, bool durabilityLoss)
bg->HandleKillUnit((Creature*)pVictim, player);
}
}
-
- // achievement stuff
- if ( pVictim->GetTypeId() == TYPEID_PLAYER)
- {
- if(GetTypeId() == TYPEID_UNIT)
- ((Player*)pVictim)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, GetEntry());
- else if(GetTypeId() == TYPEID_PLAYER)
- ((Player*)pVictim)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, 1);
- }
}
void Unit::SetControlled(bool apply, UnitState state)
@@ -12914,7 +12793,7 @@ void Unit::SetStunned(bool apply)
if(apply)
{
SetUInt64Value(UNIT_FIELD_TARGET, 0);
- SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
+ SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_ROTATE);
CastStop();
// Creature specific
@@ -12932,7 +12811,7 @@ void Unit::SetStunned(bool apply)
{
if(isAlive() && getVictim())
SetUInt64Value(UNIT_FIELD_TARGET, getVictim()->GetGUID());
- RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
+ RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_ROTATE);
if(!hasUnitState(UNIT_STAT_ROOT)) // prevent allow move if have also root effect
{
@@ -13130,4 +13009,4 @@ void Unit::AddAura(uint32 spellId, Unit* target)
}
}
}
-}
+} \ No newline at end of file
diff --git a/src/game/Unit.h b/src/game/Unit.h
index e2d1a25e7a2..c3f5be3adb1 100644
--- a/src/game/Unit.h
+++ b/src/game/Unit.h
@@ -149,7 +149,6 @@ enum ShapeshiftForm
FORM_BERSERKERSTANCE = 0x13,
FORM_TEST = 0x14,
FORM_ZOMBIE = 0x15,
- FORM_METAMORPHOSIS = 0x16,
FORM_FLIGHT_EPIC = 0x1B,
FORM_SHADOW = 0x1C,
FORM_FLIGHT = 0x1D,
@@ -169,14 +168,14 @@ enum SheathState
// byte (1 from 0..3) of UNIT_FIELD_BYTES_2
enum UnitBytes2_Flags
{
- UNIT_BYTE2_FLAG_PVP = 0x01,
- UNIT_BYTE2_FLAG_UNK1 = 0x02,
- UNIT_BYTE2_FLAG_FFA_PVP = 0x04,
- UNIT_BYTE2_FLAG_SANCTUARY = 0x08,
- UNIT_BYTE2_FLAG_UNK4 = 0x10,
- UNIT_BYTE2_FLAG_UNK5 = 0x20,
- UNIT_BYTE2_FLAG_UNK6 = 0x40,
- UNIT_BYTE2_FLAG_UNK7 = 0x80
+ UNIT_BYTE2_FLAG_UNK0 = 0x01,
+ UNIT_BYTE2_FLAG_UNK1 = 0x02,
+ UNIT_BYTE2_FLAG_UNK2 = 0x04,
+ UNIT_BYTE2_FLAG_UNK3 = 0x08,
+ UNIT_BYTE2_FLAG_AURAS = 0x10, // show possitive auras as positive, and allow its dispel
+ UNIT_BYTE2_FLAG_UNK5 = 0x20,
+ UNIT_BYTE2_FLAG_UNK6 = 0x40,
+ UNIT_BYTE2_FLAG_UNK7 = 0x80
};
// byte (2 from 0..3) of UNIT_FIELD_BYTES_2
@@ -214,27 +213,16 @@ enum HitInfo
HITINFO_UNK1 = 0x00000001, // req correct packet structure
HITINFO_NORMALSWING2 = 0x00000002,
HITINFO_LEFTSWING = 0x00000004,
- HITINFO_UNK2 = 0x00000008,
HITINFO_MISS = 0x00000010,
- HITINFO_ABSORB = 0x00000020, // absorbed damage
- HITINFO_ABSORB2 = 0x00000040, // absorbed damage
- HITINFO_RESIST = 0x00000080, // resisted atleast some damage
- HITINFO_RESIST2 = 0x00000100, // resisted atleast some damage
- HITINFO_CRITICALHIT = 0x00000200, // critical hit
- // 0x00000400
- // 0x00000800
- // 0x00001000
- HITINFO_BLOCK = 0x00002000, // blocked damage
- // 0x00004000
- // 0x00008000
- HITINFO_GLANCING = 0x00010000,
- HITINFO_CRUSHING = 0x00020000,
- HITINFO_NOACTION = 0x00040000, // guessed
- // 0x00080000
- // 0x00100000
- HITINFO_SWINGNOHITSOUND = 0x00200000, // guessed
- // 0x00400000
- HITINFO_UNK3 = 0x00800000
+ HITINFO_ABSORB = 0x00000020, // plays absorb sound
+ HITINFO_RESIST = 0x00000040, // resisted at least some damage
+ HITINFO_CRITICALHIT = 0x00000080,
+ HITINFO_UNK2 = 0x00000100, // wotlk?
+ HITINFO_UNK3 = 0x00002000, // wotlk?
+ HITINFO_GLANCING = 0x00004000,
+ HITINFO_CRUSHING = 0x00008000,
+ HITINFO_NOACTION = 0x00010000,
+ HITINFO_SWINGNOHITSOUND = 0x00080000
};
//i would like to remove this: (it is defined in item.h
@@ -306,13 +294,11 @@ enum UnitMods
UNIT_MOD_STAT_INTELLECT,
UNIT_MOD_STAT_SPIRIT,
UNIT_MOD_HEALTH,
- UNIT_MOD_MANA, // UNIT_MOD_MANA..UNIT_MOD_RUNIC_POWER must be in existed order, it's accessed by index values of Powers enum.
+ UNIT_MOD_MANA, // UNIT_MOD_MANA..UNIT_MOD_HAPPINESS must be in existed order, it's accessed by index values of Powers enum.
UNIT_MOD_RAGE,
UNIT_MOD_FOCUS,
UNIT_MOD_ENERGY,
UNIT_MOD_HAPPINESS,
- UNIT_MOD_RUNE,
- UNIT_MOD_RUNIC_POWER,
UNIT_MOD_ARMOR, // UNIT_MOD_ARMOR..UNIT_MOD_RESISTANCE_ARCANE must be in existed order, it's accessed by index values of SpellSchools enum.
UNIT_MOD_RESISTANCE_HOLY,
UNIT_MOD_RESISTANCE_FIRE,
@@ -332,7 +318,7 @@ enum UnitMods
UNIT_MOD_RESISTANCE_START = UNIT_MOD_ARMOR,
UNIT_MOD_RESISTANCE_END = UNIT_MOD_RESISTANCE_ARCANE + 1,
UNIT_MOD_POWER_START = UNIT_MOD_MANA,
- UNIT_MOD_POWER_END = UNIT_MOD_RUNIC_POWER + 1
+ UNIT_MOD_POWER_END = UNIT_MOD_HAPPINESS + 1
};
enum BaseModGroup
@@ -397,10 +383,9 @@ enum UnitMoveType
MOVE_TURN_RATE = 5,
MOVE_FLIGHT = 6,
MOVE_FLIGHT_BACK = 7,
- MOVE_PITCH_RATE = 8
};
-#define MAX_MOVE_TYPE 9
+#define MAX_MOVE_TYPE 8
extern float baseMoveSpeed[MAX_MOVE_TYPE];
@@ -438,11 +423,10 @@ enum CombatRating
CR_WEAPON_SKILL_MAINHAND = 20,
CR_WEAPON_SKILL_OFFHAND = 21,
CR_WEAPON_SKILL_RANGED = 22,
- CR_EXPERTISE = 23,
- CR_ARMOR_PENETRATION = 24
+ CR_EXPERTISE = 23
};
-#define MAX_COMBAT_RATING 25
+#define MAX_COMBAT_RATING 24
enum DamageEffectType
{
@@ -476,19 +460,19 @@ enum UnitFlags
UNIT_FLAG_UNKNOWN9 = 0x00000040,
UNIT_FLAG_NOT_ATTACKABLE_1 = 0x00000080, // ?? (UNIT_FLAG_PVP_ATTACKABLE | UNIT_FLAG_NOT_ATTACKABLE_1) is NON_PVP_ATTACKABLE
UNIT_FLAG_NOT_ATTACKABLE_2 = 0x00000100, // 2.0.8
- UNIT_FLAG_UNKNOWN11 = 0x00000200, // 3.0.3 - makes you unable to attack everything
+ UNIT_FLAG_UNKNOWN11 = 0x00000200,
UNIT_FLAG_LOOTING = 0x00000400, // loot animation
UNIT_FLAG_PET_IN_COMBAT = 0x00000800, // in combat?, 2.0.8
- UNIT_FLAG_PVP = 0x00001000, // changed in 3.0.3
+ UNIT_FLAG_PVP = 0x00001000,
UNIT_FLAG_SILENCED = 0x00002000, // silenced, 2.1.1
UNIT_FLAG_UNKNOWN4 = 0x00004000, // 2.0.8
UNIT_FLAG_UNKNOWN13 = 0x00008000,
UNIT_FLAG_UNKNOWN14 = 0x00010000,
- UNIT_FLAG_PACIFIED = 0x00020000, // 3.0.3 ok
- UNIT_FLAG_STUNNED = 0x00040000, // 3.0.3 ok
+ UNIT_FLAG_PACIFIED = 0x00020000,
+ UNIT_FLAG_DISABLE_ROTATE = 0x00040000, // stunned, 2.1.1
UNIT_FLAG_IN_COMBAT = 0x00080000,
UNIT_FLAG_TAXI_FLIGHT = 0x00100000, // disable casting at client side spell not allowed by taxi flight (mounted?), probably used with 0x4 flag
- UNIT_FLAG_DISARMED = 0x00200000, // 3.0.3, disable melee spells casting..., "Required melee weapon" added to melee spells tooltip.
+ UNIT_FLAG_DISARMED = 0x00200000, // disable melee spells casting..., "Required melee weapon" added to melee spells tooltip.
UNIT_FLAG_CONFUSED = 0x00400000,
UNIT_FLAG_FLEEING = 0x00800000,
UNIT_FLAG_UNKNOWN5 = 0x01000000, // used in spell Eyes of the Beast for pet...
@@ -503,10 +487,9 @@ enum UnitFlags
// Value masks for UNIT_FIELD_FLAGS_2
enum UnitFlags2
{
- UNIT_FLAG2_FEIGN_DEATH = 0x00000001,
- UNIT_FLAG2_COMPREHEND_LANG = 0x00000008,
- UNIT_FLAG2_FORCE_MOVE = 0x00000040,
- UNIT_FLAG2_REGENERATE_POWER = 0x00000800
+ UNIT_FLAG2_FEIGN_DEATH = 0x00000001,
+ UNIT_FLAG2_COMPREHEND_LANG= 0x00000008,
+ UNIT_FLAG2_FORCE_MOVE = 0x00000040
};
/// Non Player Character flags
@@ -652,18 +635,8 @@ uint32 createProcExtendMask(SpellNonMeleeDamage *damageInfo, SpellMissInfo missC
struct UnitActionBarEntry
{
- union
- {
- struct
- {
- uint16 SpellOrAction;
- uint16 Type;
- };
- struct
- {
- uint32 Raw;
- };
- };
+ uint32 Type;
+ uint32 SpellOrAction;
};
#define MAX_DECLINED_NAME_CASES 5
@@ -685,12 +658,13 @@ enum CurrentSpellTypes
enum ActiveStates
{
- ACT_PASSIVE = 0x0100, // 0x0100 - passive
- ACT_DISABLED = 0x8100, // 0x8000 - castable
- ACT_ENABLED = 0xC100, // 0x4000 | 0x8000 - auto cast + castable
- ACT_COMMAND = 0x0700, // 0x0100 | 0x0200 | 0x0400
- ACT_REACTION = 0x0600, // 0x0200 | 0x0400
- ACT_DECIDE = 0x0001 // what is it?
+ ACT_ENABLED = 0xC100,
+ ACT_DISABLED = 0x8100,
+ ACT_COMMAND = 0x0700,
+ ACT_REACTION = 0x0600,
+ ACT_CAST = 0x0100,
+ ACT_PASSIVE = 0x0000,
+ ACT_DECIDE = 0x0001
};
enum ReactStates
@@ -780,7 +754,6 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
typedef std::list<DiminishingReturn> Diminishing;
typedef std::set<AuraType> AuraTypeSet;
typedef std::set<uint32> ComboPointHolderSet;
- typedef std::map<uint8, uint32> VisibleAuraMap;
virtual ~Unit ( );
@@ -911,14 +884,8 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
return false;
}
- bool IsPvP() const { return HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP); }
- void SetPvP(bool state)
- {
- if(state)
- SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP);
- else
- RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP);
- }
+ bool IsPvP() const { return HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP); }
+ void SetPvP(bool state) { if(state) SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP); else RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP); }
uint32 GetCreatureType() const;
uint32 GetCreatureTypeMask() const
{
@@ -1288,30 +1255,6 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
void removeHatedBy(HostilReference* /*pHostilReference*/ ) { /* nothing to do yet */ }
HostilRefManager& getHostilRefManager() { return m_HostilRefManager; }
- uint32 GetVisibleAura(uint8 slot)
- {
- VisibleAuraMap::iterator itr = m_visibleAuras.find(slot);
- if(itr != m_visibleAuras.end())
- return itr->second;
- return 0;
- }
- void SetVisibleAura(uint8 slot, uint32 spellid)
- {
- if(spellid == 0)
- {
- VisibleAuraMap::iterator itr = m_visibleAuras.find(slot);
- if(itr != m_visibleAuras.end())
- {
- m_visibleAuras.erase(itr);
- return;
- }
- }
- else
- m_visibleAuras[slot] = spellid;
- }
- VisibleAuraMap const *GetVisibleAuras() { return &m_visibleAuras; }
- uint8 GetVisibleAurasCount() { return m_visibleAuras.size(); }
-
Aura* GetAura(uint32 spellId, uint32 effindex);
AuraMap & GetAuras() { return m_Auras; }
AuraMap const& GetAuras() const { return m_Auras; }
@@ -1503,7 +1446,6 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
float m_weaponDamage[MAX_ATTACK][2];
bool m_canModifyStats;
//std::list< spellEffectPair > AuraSpells[TOTAL_AURAS]; // TODO: use this if ok for mem
- VisibleAuraMap m_visibleAuras;
float m_speed_rate[MAX_MOVE_TYPE];
@@ -1517,7 +1459,6 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
uint32 m_unit_movement_flags;
uint32 m_reactiveTimer[MAX_REACTIVE];
- uint32 m_regenTimer;
private:
void SendAttackStop(Unit* victim); // only from AttackStop(Unit*)
diff --git a/src/game/UpdateData.cpp b/src/game/UpdateData.cpp
index ce50a326917..2b6282997e8 100644
--- a/src/game/UpdateData.cpp
+++ b/src/game/UpdateData.cpp
@@ -108,7 +108,7 @@ bool UpdateData::BuildPacket(WorldPacket *packet, bool hasTransport)
ByteBuffer buf(m_data.size() + 10 + m_outOfRangeGUIDs.size()*8);
buf << (uint32) (!m_outOfRangeGUIDs.empty() ? m_blockCount + 1 : m_blockCount);
- //buf << (uint8) (hasTransport ? 1 : 0);
+ buf << (uint8) (hasTransport ? 1 : 0);
if(!m_outOfRangeGUIDs.empty())
{
diff --git a/src/game/UpdateData.h b/src/game/UpdateData.h
index 48c7fc35efc..8fdcac4b400 100644
--- a/src/game/UpdateData.h
+++ b/src/game/UpdateData.h
@@ -38,12 +38,11 @@ enum OBJECT_UPDATE_FLAGS
UPDATEFLAG_NONE = 0x00,
UPDATEFLAG_SELF = 0x01,
UPDATEFLAG_TRANSPORT = 0x02,
- UPDATEFLAG_HAS_TARGET = 0x04,
+ UPDATEFLAG_FULLGUID = 0x04,
UPDATEFLAG_LOWGUID = 0x08,
UPDATEFLAG_HIGHGUID = 0x10,
UPDATEFLAG_LIVING = 0x20,
- UPDATEFLAG_HAS_POSITION = 0x40,
- UPDATEFLAG_VEHICLE = 0x80
+ UPDATEFLAG_HASPOSITION = 0x40
};
class UpdateData
diff --git a/src/game/UpdateFields.h b/src/game/UpdateFields.h
index 3810cb83429..db64e0bc1dd 100644
--- a/src/game/UpdateFields.h
+++ b/src/game/UpdateFields.h
@@ -21,7 +21,7 @@
#ifndef _UPDATEFIELDS_AUTO_H
#define _UPDATEFIELDS_AUTO_H
-// Auto generated for version 3, 0, 3, 9183
+// Auto generated for version 2, 4, 3, 8606
enum EObjectFields
{
@@ -43,37 +43,13 @@ enum EItemFields
ITEM_FIELD_DURATION = OBJECT_END + 0x0009, // Size: 1, Type: INT, Flags: OWNER_ONLY, UNK2
ITEM_FIELD_SPELL_CHARGES = OBJECT_END + 0x000A, // Size: 5, Type: INT, Flags: OWNER_ONLY, UNK2
ITEM_FIELD_FLAGS = OBJECT_END + 0x000F, // Size: 1, Type: INT, Flags: PUBLIC
- ITEM_FIELD_ENCHANTMENT_1_1 = OBJECT_END + 0x0010, // Size: 2, Type: INT, Flags: PUBLIC
- ITEM_FIELD_ENCHANTMENT_1_3 = OBJECT_END + 0x0012, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- ITEM_FIELD_ENCHANTMENT_2_1 = OBJECT_END + 0x0013, // Size: 2, Type: INT, Flags: PUBLIC
- ITEM_FIELD_ENCHANTMENT_2_3 = OBJECT_END + 0x0015, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- ITEM_FIELD_ENCHANTMENT_3_1 = OBJECT_END + 0x0016, // Size: 2, Type: INT, Flags: PUBLIC
- ITEM_FIELD_ENCHANTMENT_3_3 = OBJECT_END + 0x0018, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- ITEM_FIELD_ENCHANTMENT_4_1 = OBJECT_END + 0x0019, // Size: 2, Type: INT, Flags: PUBLIC
- ITEM_FIELD_ENCHANTMENT_4_3 = OBJECT_END + 0x001B, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- ITEM_FIELD_ENCHANTMENT_5_1 = OBJECT_END + 0x001C, // Size: 2, Type: INT, Flags: PUBLIC
- ITEM_FIELD_ENCHANTMENT_5_3 = OBJECT_END + 0x001E, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- ITEM_FIELD_ENCHANTMENT_6_1 = OBJECT_END + 0x001F, // Size: 2, Type: INT, Flags: PUBLIC
- ITEM_FIELD_ENCHANTMENT_6_3 = OBJECT_END + 0x0021, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- ITEM_FIELD_ENCHANTMENT_7_1 = OBJECT_END + 0x0022, // Size: 2, Type: INT, Flags: PUBLIC
- ITEM_FIELD_ENCHANTMENT_7_3 = OBJECT_END + 0x0024, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- ITEM_FIELD_ENCHANTMENT_8_1 = OBJECT_END + 0x0025, // Size: 2, Type: INT, Flags: PUBLIC
- ITEM_FIELD_ENCHANTMENT_8_3 = OBJECT_END + 0x0027, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- ITEM_FIELD_ENCHANTMENT_9_1 = OBJECT_END + 0x0028, // Size: 2, Type: INT, Flags: PUBLIC
- ITEM_FIELD_ENCHANTMENT_9_3 = OBJECT_END + 0x002A, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- ITEM_FIELD_ENCHANTMENT_10_1 = OBJECT_END + 0x002B, // Size: 2, Type: INT, Flags: PUBLIC
- ITEM_FIELD_ENCHANTMENT_10_3 = OBJECT_END + 0x002D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- ITEM_FIELD_ENCHANTMENT_11_1 = OBJECT_END + 0x002E, // Size: 2, Type: INT, Flags: PUBLIC
- ITEM_FIELD_ENCHANTMENT_11_3 = OBJECT_END + 0x0030, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- ITEM_FIELD_ENCHANTMENT_12_1 = OBJECT_END + 0x0031, // Size: 2, Type: INT, Flags: PUBLIC
- ITEM_FIELD_ENCHANTMENT_12_3 = OBJECT_END + 0x0033, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- ITEM_FIELD_PROPERTY_SEED = OBJECT_END + 0x0034, // Size: 1, Type: INT, Flags: PUBLIC
- ITEM_FIELD_RANDOM_PROPERTIES_ID = OBJECT_END + 0x0035, // Size: 1, Type: INT, Flags: PUBLIC
- ITEM_FIELD_ITEM_TEXT_ID = OBJECT_END + 0x0036, // Size: 1, Type: INT, Flags: OWNER_ONLY
- ITEM_FIELD_DURABILITY = OBJECT_END + 0x0037, // Size: 1, Type: INT, Flags: OWNER_ONLY, UNK2
- ITEM_FIELD_MAXDURABILITY = OBJECT_END + 0x0038, // Size: 1, Type: INT, Flags: OWNER_ONLY, UNK2
- ITEM_FIELD_PAD = OBJECT_END + 0x0039, // Size: 1, Type: INT, Flags: NONE
- ITEM_END = OBJECT_END + 0x003A,
+ ITEM_FIELD_ENCHANTMENT = OBJECT_END + 0x0010, // Size: 33, Type: INT, Flags: PUBLIC
+ ITEM_FIELD_PROPERTY_SEED = OBJECT_END + 0x0031, // Size: 1, Type: INT, Flags: PUBLIC
+ ITEM_FIELD_RANDOM_PROPERTIES_ID = OBJECT_END + 0x0032, // Size: 1, Type: INT, Flags: PUBLIC
+ ITEM_FIELD_ITEM_TEXT_ID = OBJECT_END + 0x0033, // Size: 1, Type: INT, Flags: OWNER_ONLY
+ ITEM_FIELD_DURABILITY = OBJECT_END + 0x0034, // Size: 1, Type: INT, Flags: OWNER_ONLY, UNK2
+ ITEM_FIELD_MAXDURABILITY = OBJECT_END + 0x0035, // Size: 1, Type: INT, Flags: OWNER_ONLY, UNK2
+ ITEM_END = OBJECT_END + 0x0036,
};
enum EContainerFields
@@ -88,94 +64,93 @@ enum EUnitFields
{
UNIT_FIELD_CHARM = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC
UNIT_FIELD_SUMMON = OBJECT_END + 0x0002, // Size: 2, Type: LONG, Flags: PUBLIC
- UNIT_FIELD_CRITTER = OBJECT_END + 0x0004, // Size: 2, Type: LONG, Flags: PRIVATE
- UNIT_FIELD_CHARMEDBY = OBJECT_END + 0x0006, // Size: 2, Type: LONG, Flags: PUBLIC
- UNIT_FIELD_SUMMONEDBY = OBJECT_END + 0x0008, // Size: 2, Type: LONG, Flags: PUBLIC
- UNIT_FIELD_CREATEDBY = OBJECT_END + 0x000A, // Size: 2, Type: LONG, Flags: PUBLIC
- UNIT_FIELD_TARGET = OBJECT_END + 0x000C, // Size: 2, Type: LONG, Flags: PUBLIC
+ UNIT_FIELD_CHARMEDBY = OBJECT_END + 0x0004, // Size: 2, Type: LONG, Flags: PUBLIC
+ UNIT_FIELD_SUMMONEDBY = OBJECT_END + 0x0006, // Size: 2, Type: LONG, Flags: PUBLIC
+ UNIT_FIELD_CREATEDBY = OBJECT_END + 0x0008, // Size: 2, Type: LONG, Flags: PUBLIC
+ UNIT_FIELD_TARGET = OBJECT_END + 0x000A, // Size: 2, Type: LONG, Flags: PUBLIC
+ UNIT_FIELD_PERSUADED = OBJECT_END + 0x000C, // Size: 2, Type: LONG, Flags: PUBLIC
UNIT_FIELD_CHANNEL_OBJECT = OBJECT_END + 0x000E, // Size: 2, Type: LONG, Flags: PUBLIC
- UNIT_FIELD_BYTES_0 = OBJECT_END + 0x0010, // Size: 1, Type: BYTES, Flags: PUBLIC
- UNIT_FIELD_HEALTH = OBJECT_END + 0x0011, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_POWER1 = OBJECT_END + 0x0012, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_POWER2 = OBJECT_END + 0x0013, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_POWER3 = OBJECT_END + 0x0014, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_POWER4 = OBJECT_END + 0x0015, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_POWER5 = OBJECT_END + 0x0016, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_POWER6 = OBJECT_END + 0x0017, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_POWER7 = OBJECT_END + 0x0018, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_MAXHEALTH = OBJECT_END + 0x0019, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_MAXPOWER1 = OBJECT_END + 0x001A, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_MAXPOWER2 = OBJECT_END + 0x001B, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_MAXPOWER3 = OBJECT_END + 0x001C, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_MAXPOWER4 = OBJECT_END + 0x001D, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_MAXPOWER5 = OBJECT_END + 0x001E, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_MAXPOWER6 = OBJECT_END + 0x001F, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_MAXPOWER7 = OBJECT_END + 0x0020, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER = OBJECT_END + 0x0021, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER = OBJECT_END + 0x0028, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_LEVEL = OBJECT_END + 0x002F, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_FACTIONTEMPLATE = OBJECT_END + 0x0030, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_VIRTUAL_ITEM_SLOT_ID = OBJECT_END + 0x0031, // Size: 3, Type: INT, Flags: PUBLIC
- UNIT_FIELD_FLAGS = OBJECT_END + 0x0034, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_FLAGS_2 = OBJECT_END + 0x0035, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_AURASTATE = OBJECT_END + 0x0036, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_BASEATTACKTIME = OBJECT_END + 0x0037, // Size: 2, Type: INT, Flags: PUBLIC
- UNIT_FIELD_RANGEDATTACKTIME = OBJECT_END + 0x0039, // Size: 1, Type: INT, Flags: PRIVATE
- UNIT_FIELD_BOUNDINGRADIUS = OBJECT_END + 0x003A, // Size: 1, Type: FLOAT, Flags: PUBLIC
- UNIT_FIELD_COMBATREACH = OBJECT_END + 0x003B, // Size: 1, Type: FLOAT, Flags: PUBLIC
- UNIT_FIELD_DISPLAYID = OBJECT_END + 0x003C, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_NATIVEDISPLAYID = OBJECT_END + 0x003D, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_MOUNTDISPLAYID = OBJECT_END + 0x003E, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_MINDAMAGE = OBJECT_END + 0x003F, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3
- UNIT_FIELD_MAXDAMAGE = OBJECT_END + 0x0040, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3
- UNIT_FIELD_MINOFFHANDDAMAGE = OBJECT_END + 0x0041, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3
- UNIT_FIELD_MAXOFFHANDDAMAGE = OBJECT_END + 0x0042, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3
- UNIT_FIELD_BYTES_1 = OBJECT_END + 0x0043, // Size: 1, Type: BYTES, Flags: PUBLIC
- UNIT_FIELD_PETNUMBER = OBJECT_END + 0x0044, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_PET_NAME_TIMESTAMP = OBJECT_END + 0x0045, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_PETEXPERIENCE = OBJECT_END + 0x0046, // Size: 1, Type: INT, Flags: OWNER_ONLY
- UNIT_FIELD_PETNEXTLEVELEXP = OBJECT_END + 0x0047, // Size: 1, Type: INT, Flags: OWNER_ONLY
- UNIT_DYNAMIC_FLAGS = OBJECT_END + 0x0048, // Size: 1, Type: INT, Flags: DYNAMIC
- UNIT_CHANNEL_SPELL = OBJECT_END + 0x0049, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_MOD_CAST_SPEED = OBJECT_END + 0x004A, // Size: 1, Type: FLOAT, Flags: PUBLIC
- UNIT_CREATED_BY_SPELL = OBJECT_END + 0x004B, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_NPC_FLAGS = OBJECT_END + 0x004C, // Size: 1, Type: INT, Flags: DYNAMIC
- UNIT_NPC_EMOTESTATE = OBJECT_END + 0x004D, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_STAT0 = OBJECT_END + 0x004E, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_STAT1 = OBJECT_END + 0x004F, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_STAT2 = OBJECT_END + 0x0050, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_STAT3 = OBJECT_END + 0x0051, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_STAT4 = OBJECT_END + 0x0052, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_POSSTAT0 = OBJECT_END + 0x0053, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_POSSTAT1 = OBJECT_END + 0x0054, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_POSSTAT2 = OBJECT_END + 0x0055, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_POSSTAT3 = OBJECT_END + 0x0056, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_POSSTAT4 = OBJECT_END + 0x0057, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_NEGSTAT0 = OBJECT_END + 0x0058, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_NEGSTAT1 = OBJECT_END + 0x0059, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_NEGSTAT2 = OBJECT_END + 0x005A, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_NEGSTAT3 = OBJECT_END + 0x005B, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_NEGSTAT4 = OBJECT_END + 0x005C, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_RESISTANCES = OBJECT_END + 0x005D, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY, UNK3
- UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE = OBJECT_END + 0x0064, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE = OBJECT_END + 0x006B, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_BASE_MANA = OBJECT_END + 0x0072, // Size: 1, Type: INT, Flags: PUBLIC
- UNIT_FIELD_BASE_HEALTH = OBJECT_END + 0x0073, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_BYTES_2 = OBJECT_END + 0x0074, // Size: 1, Type: BYTES, Flags: PUBLIC
- UNIT_FIELD_ATTACK_POWER = OBJECT_END + 0x0075, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_ATTACK_POWER_MODS = OBJECT_END + 0x0076, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x0077, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_RANGED_ATTACK_POWER = OBJECT_END + 0x0078, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_RANGED_ATTACK_POWER_MODS = OBJECT_END + 0x0079, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x007A, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_MINRANGEDDAMAGE = OBJECT_END + 0x007B, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_MAXRANGEDDAMAGE = OBJECT_END + 0x007C, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_POWER_COST_MODIFIER = OBJECT_END + 0x007D, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_POWER_COST_MULTIPLIER = OBJECT_END + 0x0084, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_MAXHEALTHMODIFIER = OBJECT_END + 0x008B, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
- UNIT_FIELD_HOVERHEIGHT = OBJECT_END + 0x008C, // Size: 1, Type: FLOAT, Flags: PUBLIC
- UNIT_FIELD_PADDING = OBJECT_END + 0x008D, // Size: 1, Type: INT, Flags: NONE
- UNIT_END = OBJECT_END + 0x008E,
+ UNIT_FIELD_HEALTH = OBJECT_END + 0x0010, // Size: 1, Type: INT, Flags: DYNAMIC
+ UNIT_FIELD_POWER1 = OBJECT_END + 0x0011, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_POWER2 = OBJECT_END + 0x0012, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_POWER3 = OBJECT_END + 0x0013, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_POWER4 = OBJECT_END + 0x0014, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_POWER5 = OBJECT_END + 0x0015, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_MAXHEALTH = OBJECT_END + 0x0016, // Size: 1, Type: INT, Flags: DYNAMIC
+ UNIT_FIELD_MAXPOWER1 = OBJECT_END + 0x0017, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_MAXPOWER2 = OBJECT_END + 0x0018, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_MAXPOWER3 = OBJECT_END + 0x0019, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_MAXPOWER4 = OBJECT_END + 0x001A, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_MAXPOWER5 = OBJECT_END + 0x001B, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_LEVEL = OBJECT_END + 0x001C, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_FACTIONTEMPLATE = OBJECT_END + 0x001D, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_BYTES_0 = OBJECT_END + 0x001E, // Size: 1, Type: BYTES, Flags: PUBLIC
+ UNIT_VIRTUAL_ITEM_SLOT_DISPLAY = OBJECT_END + 0x001F, // Size: 3, Type: INT, Flags: PUBLIC
+ UNIT_VIRTUAL_ITEM_INFO = OBJECT_END + 0x0022, // Size: 6, Type: BYTES, Flags: PUBLIC
+ UNIT_FIELD_FLAGS = OBJECT_END + 0x0028, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_FLAGS_2 = OBJECT_END + 0x0029, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_AURA = OBJECT_END + 0x002A, // Size: 56, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_AURAFLAGS = OBJECT_END + 0x0062, // Size: 14, Type: BYTES, Flags: PUBLIC
+ UNIT_FIELD_AURALEVELS = OBJECT_END + 0x0070, // Size: 14, Type: BYTES, Flags: PUBLIC
+ UNIT_FIELD_AURAAPPLICATIONS = OBJECT_END + 0x007E, // Size: 14, Type: BYTES, Flags: PUBLIC
+ UNIT_FIELD_AURASTATE = OBJECT_END + 0x008C, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_BASEATTACKTIME = OBJECT_END + 0x008D, // Size: 2, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_RANGEDATTACKTIME = OBJECT_END + 0x008F, // Size: 1, Type: INT, Flags: PRIVATE
+ UNIT_FIELD_BOUNDINGRADIUS = OBJECT_END + 0x0090, // Size: 1, Type: FLOAT, Flags: PUBLIC
+ UNIT_FIELD_COMBATREACH = OBJECT_END + 0x0091, // Size: 1, Type: FLOAT, Flags: PUBLIC
+ UNIT_FIELD_DISPLAYID = OBJECT_END + 0x0092, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_NATIVEDISPLAYID = OBJECT_END + 0x0093, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_MOUNTDISPLAYID = OBJECT_END + 0x0094, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_MINDAMAGE = OBJECT_END + 0x0095, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3
+ UNIT_FIELD_MAXDAMAGE = OBJECT_END + 0x0096, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3
+ UNIT_FIELD_MINOFFHANDDAMAGE = OBJECT_END + 0x0097, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3
+ UNIT_FIELD_MAXOFFHANDDAMAGE = OBJECT_END + 0x0098, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY, UNK3
+ UNIT_FIELD_BYTES_1 = OBJECT_END + 0x0099, // Size: 1, Type: BYTES, Flags: PUBLIC
+ UNIT_FIELD_PETNUMBER = OBJECT_END + 0x009A, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_PET_NAME_TIMESTAMP = OBJECT_END + 0x009B, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_PETEXPERIENCE = OBJECT_END + 0x009C, // Size: 1, Type: INT, Flags: OWNER_ONLY
+ UNIT_FIELD_PETNEXTLEVELEXP = OBJECT_END + 0x009D, // Size: 1, Type: INT, Flags: OWNER_ONLY
+ UNIT_DYNAMIC_FLAGS = OBJECT_END + 0x009E, // Size: 1, Type: INT, Flags: DYNAMIC
+ UNIT_CHANNEL_SPELL = OBJECT_END + 0x009F, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_MOD_CAST_SPEED = OBJECT_END + 0x00A0, // Size: 1, Type: FLOAT, Flags: PUBLIC
+ UNIT_CREATED_BY_SPELL = OBJECT_END + 0x00A1, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_NPC_FLAGS = OBJECT_END + 0x00A2, // Size: 1, Type: INT, Flags: DYNAMIC
+ UNIT_NPC_EMOTESTATE = OBJECT_END + 0x00A3, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_TRAINING_POINTS = OBJECT_END + 0x00A4, // Size: 1, Type: TWO_SHORT, Flags: OWNER_ONLY
+ UNIT_FIELD_STAT0 = OBJECT_END + 0x00A5, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_STAT1 = OBJECT_END + 0x00A6, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_STAT2 = OBJECT_END + 0x00A7, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_STAT3 = OBJECT_END + 0x00A8, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_STAT4 = OBJECT_END + 0x00A9, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_POSSTAT0 = OBJECT_END + 0x00AA, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_POSSTAT1 = OBJECT_END + 0x00AB, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_POSSTAT2 = OBJECT_END + 0x00AC, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_POSSTAT3 = OBJECT_END + 0x00AD, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_POSSTAT4 = OBJECT_END + 0x00AE, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_NEGSTAT0 = OBJECT_END + 0x00AF, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_NEGSTAT1 = OBJECT_END + 0x00B0, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_NEGSTAT2 = OBJECT_END + 0x00B1, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_NEGSTAT3 = OBJECT_END + 0x00B2, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_NEGSTAT4 = OBJECT_END + 0x00B3, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_RESISTANCES = OBJECT_END + 0x00B4, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY, UNK3
+ UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE = OBJECT_END + 0x00BB, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE = OBJECT_END + 0x00C2, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_BASE_MANA = OBJECT_END + 0x00C9, // Size: 1, Type: INT, Flags: PUBLIC
+ UNIT_FIELD_BASE_HEALTH = OBJECT_END + 0x00CA, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_BYTES_2 = OBJECT_END + 0x00CB, // Size: 1, Type: BYTES, Flags: PUBLIC
+ UNIT_FIELD_ATTACK_POWER = OBJECT_END + 0x00CC, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_ATTACK_POWER_MODS = OBJECT_END + 0x00CD, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x00CE, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_RANGED_ATTACK_POWER = OBJECT_END + 0x00CF, // Size: 1, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_RANGED_ATTACK_POWER_MODS = OBJECT_END + 0x00D0, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x00D1, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_MINRANGEDDAMAGE = OBJECT_END + 0x00D2, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_MAXRANGEDDAMAGE = OBJECT_END + 0x00D3, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_POWER_COST_MODIFIER = OBJECT_END + 0x00D4, // Size: 7, Type: INT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_POWER_COST_MULTIPLIER = OBJECT_END + 0x00DB, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_MAXHEALTHMODIFIER = OBJECT_END + 0x00E2, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER_ONLY
+ UNIT_FIELD_PADDING = OBJECT_END + 0x00E3, // Size: 1, Type: INT, Flags: NONE
+ UNIT_END = OBJECT_END + 0x00E4,
PLAYER_DUEL_ARBITER = UNIT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC
PLAYER_FLAGS = UNIT_END + 0x0002, // Size: 1, Type: INT, Flags: PUBLIC
@@ -287,184 +262,160 @@ enum EUnitFields
PLAYER_QUEST_LOG_25_3 = UNIT_END + 0x006C, // Size: 1, Type: BYTES, Flags: PRIVATE
PLAYER_QUEST_LOG_25_4 = UNIT_END + 0x006D, // Size: 1, Type: INT, Flags: PRIVATE
PLAYER_VISIBLE_ITEM_1_CREATOR = UNIT_END + 0x006E, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_1_0 = UNIT_END + 0x0070, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_1_PROPERTIES = UNIT_END + 0x007D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_1_SEED = UNIT_END + 0x007E, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_1_PAD = UNIT_END + 0x007F, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_2_CREATOR = UNIT_END + 0x0080, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_2_0 = UNIT_END + 0x0082, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_2_PROPERTIES = UNIT_END + 0x008F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_2_SEED = UNIT_END + 0x0090, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_2_PAD = UNIT_END + 0x0091, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_3_CREATOR = UNIT_END + 0x0092, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_3_0 = UNIT_END + 0x0094, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_3_PROPERTIES = UNIT_END + 0x00A1, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_3_SEED = UNIT_END + 0x00A2, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_3_PAD = UNIT_END + 0x00A3, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_4_CREATOR = UNIT_END + 0x00A4, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_4_0 = UNIT_END + 0x00A6, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_4_PROPERTIES = UNIT_END + 0x00B3, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_4_SEED = UNIT_END + 0x00B4, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_4_PAD = UNIT_END + 0x00B5, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_5_CREATOR = UNIT_END + 0x00B6, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_5_0 = UNIT_END + 0x00B8, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_5_PROPERTIES = UNIT_END + 0x00C5, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_5_SEED = UNIT_END + 0x00C6, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_5_PAD = UNIT_END + 0x00C7, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_6_CREATOR = UNIT_END + 0x00C8, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_6_0 = UNIT_END + 0x00CA, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_6_PROPERTIES = UNIT_END + 0x00D7, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_6_SEED = UNIT_END + 0x00D8, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_6_PAD = UNIT_END + 0x00D9, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_7_CREATOR = UNIT_END + 0x00DA, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_7_0 = UNIT_END + 0x00DC, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_7_PROPERTIES = UNIT_END + 0x00E9, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_7_SEED = UNIT_END + 0x00EA, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_7_PAD = UNIT_END + 0x00EB, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_8_CREATOR = UNIT_END + 0x00EC, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_8_0 = UNIT_END + 0x00EE, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_8_PROPERTIES = UNIT_END + 0x00FB, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_8_SEED = UNIT_END + 0x00FC, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_8_PAD = UNIT_END + 0x00FD, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_9_CREATOR = UNIT_END + 0x00FE, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_9_0 = UNIT_END + 0x0100, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_9_PROPERTIES = UNIT_END + 0x010D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_9_SEED = UNIT_END + 0x010E, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_9_PAD = UNIT_END + 0x010F, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_10_CREATOR = UNIT_END + 0x0110, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_10_0 = UNIT_END + 0x0112, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_10_PROPERTIES = UNIT_END + 0x011F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_10_SEED = UNIT_END + 0x0120, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_10_PAD = UNIT_END + 0x0121, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_11_CREATOR = UNIT_END + 0x0122, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_11_0 = UNIT_END + 0x0124, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_11_PROPERTIES = UNIT_END + 0x0131, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_11_SEED = UNIT_END + 0x0132, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_11_PAD = UNIT_END + 0x0133, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_12_CREATOR = UNIT_END + 0x0134, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_12_0 = UNIT_END + 0x0136, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_12_PROPERTIES = UNIT_END + 0x0143, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_12_SEED = UNIT_END + 0x0144, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_12_PAD = UNIT_END + 0x0145, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_13_CREATOR = UNIT_END + 0x0146, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_13_0 = UNIT_END + 0x0148, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_13_PROPERTIES = UNIT_END + 0x0155, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_13_SEED = UNIT_END + 0x0156, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_13_PAD = UNIT_END + 0x0157, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_14_CREATOR = UNIT_END + 0x0158, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_14_0 = UNIT_END + 0x015A, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_14_PROPERTIES = UNIT_END + 0x0167, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_14_SEED = UNIT_END + 0x0168, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_14_PAD = UNIT_END + 0x0169, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_15_CREATOR = UNIT_END + 0x016A, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_15_0 = UNIT_END + 0x016C, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_15_PROPERTIES = UNIT_END + 0x0179, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_15_SEED = UNIT_END + 0x017A, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_15_PAD = UNIT_END + 0x017B, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_16_CREATOR = UNIT_END + 0x017C, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_16_0 = UNIT_END + 0x017E, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_16_PROPERTIES = UNIT_END + 0x018B, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_16_SEED = UNIT_END + 0x018C, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_16_PAD = UNIT_END + 0x018D, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_17_CREATOR = UNIT_END + 0x018E, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_17_0 = UNIT_END + 0x0190, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_17_PROPERTIES = UNIT_END + 0x019D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_17_SEED = UNIT_END + 0x019E, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_17_PAD = UNIT_END + 0x019F, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_18_CREATOR = UNIT_END + 0x01A0, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_18_0 = UNIT_END + 0x01A2, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_18_PROPERTIES = UNIT_END + 0x01AF, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_18_SEED = UNIT_END + 0x01B0, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_18_PAD = UNIT_END + 0x01B1, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_19_CREATOR = UNIT_END + 0x01B2, // Size: 2, Type: LONG, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_19_0 = UNIT_END + 0x01B4, // Size: 13, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_19_PROPERTIES = UNIT_END + 0x01C1, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_19_SEED = UNIT_END + 0x01C2, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_VISIBLE_ITEM_19_PAD = UNIT_END + 0x01C3, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_CHOSEN_TITLE = UNIT_END + 0x01C4, // Size: 1, Type: INT, Flags: PUBLIC
- PLAYER_FIELD_PAD_0 = UNIT_END + 0x01C5, // Size: 1, Type: INT, Flags: NONE
- PLAYER_FIELD_INV_SLOT_HEAD = UNIT_END + 0x01C6, // Size: 46, Type: LONG, Flags: PRIVATE
- PLAYER_FIELD_PACK_SLOT_1 = UNIT_END + 0x01F4, // Size: 32, Type: LONG, Flags: PRIVATE
- PLAYER_FIELD_BANK_SLOT_1 = UNIT_END + 0x0214, // Size: 56, Type: LONG, Flags: PRIVATE
- PLAYER_FIELD_BANKBAG_SLOT_1 = UNIT_END + 0x024C, // Size: 14, Type: LONG, Flags: PRIVATE
- PLAYER_FIELD_VENDORBUYBACK_SLOT_1 = UNIT_END + 0x025A, // Size: 24, Type: LONG, Flags: PRIVATE
- PLAYER_FIELD_KEYRING_SLOT_1 = UNIT_END + 0x0272, // Size: 64, Type: LONG, Flags: PRIVATE
- PLAYER_FIELD_VANITYPET_SLOT_1 = UNIT_END + 0x02B2, // Size: 36, Type: LONG, Flags: PRIVATE
- PLAYER_FIELD_CURRENCYTOKEN_SLOT_1 = UNIT_END + 0x02D6, // Size: 64, Type: LONG, Flags: PRIVATE
- PLAYER_FIELD_QUESTBAG_SLOT_1 = UNIT_END + 0x0316, // Size: 64, Type: LONG, Flags: PRIVATE
- PLAYER_FARSIGHT = UNIT_END + 0x0356, // Size: 2, Type: LONG, Flags: PRIVATE
- PLAYER__FIELD_KNOWN_TITLES = UNIT_END + 0x0358, // Size: 2, Type: LONG, Flags: PRIVATE
- PLAYER__FIELD_KNOWN_TITLES1 = UNIT_END + 0x035A, // Size: 2, Type: LONG, Flags: PRIVATE
- PLAYER_FIELD_KNOWN_CURRENCIES = UNIT_END + 0x035C, // Size: 2, Type: LONG, Flags: PRIVATE
- PLAYER_XP = UNIT_END + 0x035E, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_NEXT_LEVEL_XP = UNIT_END + 0x035F, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_SKILL_INFO_1_1 = UNIT_END + 0x0360, // Size: 384, Type: TWO_SHORT, Flags: PRIVATE
- PLAYER_CHARACTER_POINTS1 = UNIT_END + 0x04E0, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_CHARACTER_POINTS2 = UNIT_END + 0x04E1, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_TRACK_CREATURES = UNIT_END + 0x04E2, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_TRACK_RESOURCES = UNIT_END + 0x04E3, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_BLOCK_PERCENTAGE = UNIT_END + 0x04E4, // Size: 1, Type: FLOAT, Flags: PRIVATE
- PLAYER_DODGE_PERCENTAGE = UNIT_END + 0x04E5, // Size: 1, Type: FLOAT, Flags: PRIVATE
- PLAYER_PARRY_PERCENTAGE = UNIT_END + 0x04E6, // Size: 1, Type: FLOAT, Flags: PRIVATE
- PLAYER_EXPERTISE = UNIT_END + 0x04E7, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_OFFHAND_EXPERTISE = UNIT_END + 0x04E8, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_CRIT_PERCENTAGE = UNIT_END + 0x04E9, // Size: 1, Type: FLOAT, Flags: PRIVATE
- PLAYER_RANGED_CRIT_PERCENTAGE = UNIT_END + 0x04EA, // Size: 1, Type: FLOAT, Flags: PRIVATE
- PLAYER_OFFHAND_CRIT_PERCENTAGE = UNIT_END + 0x04EB, // Size: 1, Type: FLOAT, Flags: PRIVATE
- PLAYER_SPELL_CRIT_PERCENTAGE1 = UNIT_END + 0x04EC, // Size: 7, Type: FLOAT, Flags: PRIVATE
- PLAYER_SHIELD_BLOCK = UNIT_END + 0x04F3, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_SHIELD_BLOCK_CRIT_PERCENTAGE = UNIT_END + 0x04F4, // Size: 1, Type: FLOAT, Flags: PRIVATE
- PLAYER_EXPLORED_ZONES_1 = UNIT_END + 0x04F5, // Size: 128, Type: BYTES, Flags: PRIVATE
- PLAYER_REST_STATE_EXPERIENCE = UNIT_END + 0x0575, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_COINAGE = UNIT_END + 0x0576, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_MOD_DAMAGE_DONE_POS = UNIT_END + 0x0577, // Size: 7, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_MOD_DAMAGE_DONE_NEG = UNIT_END + 0x057E, // Size: 7, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_MOD_DAMAGE_DONE_PCT = UNIT_END + 0x0585, // Size: 7, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_MOD_HEALING_DONE_POS = UNIT_END + 0x058C, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_MOD_TARGET_RESISTANCE = UNIT_END + 0x058D, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE = UNIT_END + 0x058E, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_BYTES = UNIT_END + 0x058F, // Size: 1, Type: BYTES, Flags: PRIVATE
- PLAYER_AMMO_ID = UNIT_END + 0x0590, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_SELF_RES_SPELL = UNIT_END + 0x0591, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_PVP_MEDALS = UNIT_END + 0x0592, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_BUYBACK_PRICE_1 = UNIT_END + 0x0593, // Size: 12, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_BUYBACK_TIMESTAMP_1 = UNIT_END + 0x059F, // Size: 12, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_KILLS = UNIT_END + 0x05AB, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE
- PLAYER_FIELD_TODAY_CONTRIBUTION = UNIT_END + 0x05AC, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_YESTERDAY_CONTRIBUTION = UNIT_END + 0x05AD, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_LIFETIME_HONORBALE_KILLS = UNIT_END + 0x05AE, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_BYTES2 = UNIT_END + 0x05AF, // Size: 1, Type: BYTES, Flags: PRIVATE
- PLAYER_FIELD_WATCHED_FACTION_INDEX = UNIT_END + 0x05B0, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_COMBAT_RATING_1 = UNIT_END + 0x05B1, // Size: 25, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x05CA, // Size: 18, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_HONOR_CURRENCY = UNIT_END + 0x05DC, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_ARENA_CURRENCY = UNIT_END + 0x05DD, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x05DE, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_DAILY_QUESTS_1 = UNIT_END + 0x05DF, // Size: 25, Type: INT, Flags: PRIVATE
- PLAYER_RUNE_REGEN_1 = UNIT_END + 0x05F8, // Size: 4, Type: FLOAT, Flags: PRIVATE
- PLAYER_NO_REAGENT_COST_1 = UNIT_END + 0x05FC, // Size: 3, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_GLYPH_SLOTS_1 = UNIT_END + 0x05FF, // Size: 8, Type: INT, Flags: PRIVATE
- PLAYER_FIELD_GLYPHS_1 = UNIT_END + 0x0607, // Size: 8, Type: INT, Flags: PRIVATE
- PLAYER_GLYPHS_ENABLED = UNIT_END + 0x060F, // Size: 1, Type: INT, Flags: PRIVATE
- PLAYER_END = UNIT_END + 0x0610,
+ PLAYER_VISIBLE_ITEM_1_0 = UNIT_END + 0x0070, // Size: 12, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_1_PROPERTIES = UNIT_END + 0x007C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_1_PAD = UNIT_END + 0x007D, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_2_CREATOR = UNIT_END + 0x007E, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_2_0 = UNIT_END + 0x0080, // Size: 12, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_2_PROPERTIES = UNIT_END + 0x008C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_2_PAD = UNIT_END + 0x008D, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_3_CREATOR = UNIT_END + 0x008E, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_3_0 = UNIT_END + 0x0090, // Size: 12, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_3_PROPERTIES = UNIT_END + 0x009C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_3_PAD = UNIT_END + 0x009D, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_4_CREATOR = UNIT_END + 0x009E, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_4_0 = UNIT_END + 0x00A0, // Size: 12, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_4_PROPERTIES = UNIT_END + 0x00AC, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_4_PAD = UNIT_END + 0x00AD, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_5_CREATOR = UNIT_END + 0x00AE, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_5_0 = UNIT_END + 0x00B0, // Size: 12, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_5_PROPERTIES = UNIT_END + 0x00BC, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_5_PAD = UNIT_END + 0x00BD, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_6_CREATOR = UNIT_END + 0x00BE, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_6_0 = UNIT_END + 0x00C0, // Size: 12, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_6_PROPERTIES = UNIT_END + 0x00CC, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_6_PAD = UNIT_END + 0x00CD, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_7_CREATOR = UNIT_END + 0x00CE, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_7_0 = UNIT_END + 0x00D0, // Size: 12, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_7_PROPERTIES = UNIT_END + 0x00DC, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_7_PAD = UNIT_END + 0x00DD, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_8_CREATOR = UNIT_END + 0x00DE, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_8_0 = UNIT_END + 0x00E0, // Size: 12, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_8_PROPERTIES = UNIT_END + 0x00EC, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_8_PAD = UNIT_END + 0x00ED, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_9_CREATOR = UNIT_END + 0x00EE, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_9_0 = UNIT_END + 0x00F0, // Size: 12, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_9_PROPERTIES = UNIT_END + 0x00FC, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_9_PAD = UNIT_END + 0x00FD, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_10_CREATOR = UNIT_END + 0x00FE, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_10_0 = UNIT_END + 0x0100, // Size: 12, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_10_PROPERTIES = UNIT_END + 0x010C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_10_PAD = UNIT_END + 0x010D, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_11_CREATOR = UNIT_END + 0x010E, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_11_0 = UNIT_END + 0x0110, // Size: 12, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_11_PROPERTIES = UNIT_END + 0x011C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_11_PAD = UNIT_END + 0x011D, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_12_CREATOR = UNIT_END + 0x011E, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_12_0 = UNIT_END + 0x0120, // Size: 12, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_12_PROPERTIES = UNIT_END + 0x012C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_12_PAD = UNIT_END + 0x012D, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_13_CREATOR = UNIT_END + 0x012E, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_13_0 = UNIT_END + 0x0130, // Size: 12, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_13_PROPERTIES = UNIT_END + 0x013C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_13_PAD = UNIT_END + 0x013D, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_14_CREATOR = UNIT_END + 0x013E, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_14_0 = UNIT_END + 0x0140, // Size: 12, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_14_PROPERTIES = UNIT_END + 0x014C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_14_PAD = UNIT_END + 0x014D, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_15_CREATOR = UNIT_END + 0x014E, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_15_0 = UNIT_END + 0x0150, // Size: 12, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_15_PROPERTIES = UNIT_END + 0x015C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_15_PAD = UNIT_END + 0x015D, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_16_CREATOR = UNIT_END + 0x015E, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_16_0 = UNIT_END + 0x0160, // Size: 12, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_16_PROPERTIES = UNIT_END + 0x016C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_16_PAD = UNIT_END + 0x016D, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_17_CREATOR = UNIT_END + 0x016E, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_17_0 = UNIT_END + 0x0170, // Size: 12, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_17_PROPERTIES = UNIT_END + 0x017C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_17_PAD = UNIT_END + 0x017D, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_18_CREATOR = UNIT_END + 0x017E, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_18_0 = UNIT_END + 0x0180, // Size: 12, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_18_PROPERTIES = UNIT_END + 0x018C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_18_PAD = UNIT_END + 0x018D, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_19_CREATOR = UNIT_END + 0x018E, // Size: 2, Type: LONG, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_19_0 = UNIT_END + 0x0190, // Size: 12, Type: INT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_19_PROPERTIES = UNIT_END + 0x019C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
+ PLAYER_VISIBLE_ITEM_19_PAD = UNIT_END + 0x019D, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_CHOSEN_TITLE = UNIT_END + 0x019E, // Size: 1, Type: INT, Flags: PUBLIC
+ PLAYER_FIELD_PAD_0 = UNIT_END + 0x019F, // Size: 1, Type: INT, Flags: NONE
+ PLAYER_FIELD_INV_SLOT_HEAD = UNIT_END + 0x01A0, // Size: 46, Type: LONG, Flags: PRIVATE
+ PLAYER_FIELD_PACK_SLOT_1 = UNIT_END + 0x01CE, // Size: 32, Type: LONG, Flags: PRIVATE
+ PLAYER_FIELD_BANK_SLOT_1 = UNIT_END + 0x01EE, // Size: 56, Type: LONG, Flags: PRIVATE
+ PLAYER_FIELD_BANKBAG_SLOT_1 = UNIT_END + 0x0226, // Size: 14, Type: LONG, Flags: PRIVATE
+ PLAYER_FIELD_VENDORBUYBACK_SLOT_1 = UNIT_END + 0x0234, // Size: 24, Type: LONG, Flags: PRIVATE
+ PLAYER_FIELD_KEYRING_SLOT_1 = UNIT_END + 0x024C, // Size: 64, Type: LONG, Flags: PRIVATE
+ PLAYER_FIELD_VANITYPET_SLOT_1 = UNIT_END + 0x028C, // Size: 36, Type: LONG, Flags: PRIVATE
+ PLAYER_FARSIGHT = UNIT_END + 0x02B0, // Size: 2, Type: LONG, Flags: PRIVATE
+ PLAYER__FIELD_KNOWN_TITLES = UNIT_END + 0x02B2, // Size: 2, Type: LONG, Flags: PRIVATE
+ PLAYER_XP = UNIT_END + 0x02B4, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_NEXT_LEVEL_XP = UNIT_END + 0x02B5, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_SKILL_INFO_1_1 = UNIT_END + 0x02B6, // Size: 384, Type: TWO_SHORT, Flags: PRIVATE
+ PLAYER_CHARACTER_POINTS1 = UNIT_END + 0x0436, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_CHARACTER_POINTS2 = UNIT_END + 0x0437, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_TRACK_CREATURES = UNIT_END + 0x0438, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_TRACK_RESOURCES = UNIT_END + 0x0439, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_BLOCK_PERCENTAGE = UNIT_END + 0x043A, // Size: 1, Type: FLOAT, Flags: PRIVATE
+ PLAYER_DODGE_PERCENTAGE = UNIT_END + 0x043B, // Size: 1, Type: FLOAT, Flags: PRIVATE
+ PLAYER_PARRY_PERCENTAGE = UNIT_END + 0x043C, // Size: 1, Type: FLOAT, Flags: PRIVATE
+ PLAYER_EXPERTISE = UNIT_END + 0x043D, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_OFFHAND_EXPERTISE = UNIT_END + 0x043E, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_CRIT_PERCENTAGE = UNIT_END + 0x043F, // Size: 1, Type: FLOAT, Flags: PRIVATE
+ PLAYER_RANGED_CRIT_PERCENTAGE = UNIT_END + 0x0440, // Size: 1, Type: FLOAT, Flags: PRIVATE
+ PLAYER_OFFHAND_CRIT_PERCENTAGE = UNIT_END + 0x0441, // Size: 1, Type: FLOAT, Flags: PRIVATE
+ PLAYER_SPELL_CRIT_PERCENTAGE1 = UNIT_END + 0x0442, // Size: 7, Type: FLOAT, Flags: PRIVATE
+ PLAYER_SHIELD_BLOCK = UNIT_END + 0x0449, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_EXPLORED_ZONES_1 = UNIT_END + 0x044A, // Size: 128, Type: BYTES, Flags: PRIVATE
+ PLAYER_REST_STATE_EXPERIENCE = UNIT_END + 0x04CA, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_COINAGE = UNIT_END + 0x04CB, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_MOD_DAMAGE_DONE_POS = UNIT_END + 0x04CC, // Size: 7, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_MOD_DAMAGE_DONE_NEG = UNIT_END + 0x04D3, // Size: 7, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_MOD_DAMAGE_DONE_PCT = UNIT_END + 0x04DA, // Size: 7, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_MOD_HEALING_DONE_POS = UNIT_END + 0x04E1, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_MOD_TARGET_RESISTANCE = UNIT_END + 0x04E2, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE = UNIT_END + 0x04E3, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_BYTES = UNIT_END + 0x04E4, // Size: 1, Type: BYTES, Flags: PRIVATE
+ PLAYER_AMMO_ID = UNIT_END + 0x04E5, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_SELF_RES_SPELL = UNIT_END + 0x04E6, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_PVP_MEDALS = UNIT_END + 0x04E7, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_BUYBACK_PRICE_1 = UNIT_END + 0x04E8, // Size: 12, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_BUYBACK_TIMESTAMP_1 = UNIT_END + 0x04F4, // Size: 12, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_KILLS = UNIT_END + 0x0500, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE
+ PLAYER_FIELD_TODAY_CONTRIBUTION = UNIT_END + 0x0501, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_YESTERDAY_CONTRIBUTION = UNIT_END + 0x0502, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_LIFETIME_HONORBALE_KILLS = UNIT_END + 0x0503, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_BYTES2 = UNIT_END + 0x0504, // Size: 1, Type: BYTES, Flags: PRIVATE
+ PLAYER_FIELD_WATCHED_FACTION_INDEX = UNIT_END + 0x0505, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_COMBAT_RATING_1 = UNIT_END + 0x0506, // Size: 24, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x051E, // Size: 18, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_HONOR_CURRENCY = UNIT_END + 0x0530, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_ARENA_CURRENCY = UNIT_END + 0x0531, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_MOD_MANA_REGEN = UNIT_END + 0x0532, // Size: 1, Type: FLOAT, Flags: PRIVATE
+ PLAYER_FIELD_MOD_MANA_REGEN_INTERRUPT = UNIT_END + 0x0533, // Size: 1, Type: FLOAT, Flags: PRIVATE
+ PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x0534, // Size: 1, Type: INT, Flags: PRIVATE
+ PLAYER_FIELD_DAILY_QUESTS_1 = UNIT_END + 0x0535, // Size: 25, Type: INT, Flags: PRIVATE
+ PLAYER_END = UNIT_END + 0x054E,
};
enum EGameObjectFields
{
OBJECT_FIELD_CREATED_BY = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC
GAMEOBJECT_DISPLAYID = OBJECT_END + 0x0002, // Size: 1, Type: INT, Flags: PUBLIC
- GAMEOBJECT_FLAGS = OBJECT_END + 0x0003, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC
- GAMEOBJECT_ROTATION = OBJECT_END + 0x0004, // Size: 2, Type: LONG, Flags: PUBLIC
- GAMEOBJECT_PARENTROTATION = OBJECT_END + 0x0006, // Size: 4, Type: FLOAT, Flags: PUBLIC
- GAMEOBJECT_POS_X = OBJECT_END + 0x000A, // Size: 1, Type: FLOAT, Flags: PUBLIC
- GAMEOBJECT_POS_Y = OBJECT_END + 0x000B, // Size: 1, Type: FLOAT, Flags: PUBLIC
- GAMEOBJECT_POS_Z = OBJECT_END + 0x000C, // Size: 1, Type: FLOAT, Flags: PUBLIC
- GAMEOBJECT_FACING = OBJECT_END + 0x000D, // Size: 1, Type: FLOAT, Flags: PUBLIC
- GAMEOBJECT_DYNAMIC = OBJECT_END + 0x000E, // Size: 1, Type: TWO_SHORT, Flags: DYNAMIC
- GAMEOBJECT_FACTION = OBJECT_END + 0x000F, // Size: 1, Type: INT, Flags: PUBLIC
+ GAMEOBJECT_FLAGS = OBJECT_END + 0x0003, // Size: 1, Type: INT, Flags: PUBLIC
+ GAMEOBJECT_ROTATION = OBJECT_END + 0x0004, // Size: 4, Type: FLOAT, Flags: PUBLIC
+ GAMEOBJECT_STATE = OBJECT_END + 0x0008, // Size: 1, Type: INT, Flags: PUBLIC
+ GAMEOBJECT_POS_X = OBJECT_END + 0x0009, // Size: 1, Type: FLOAT, Flags: PUBLIC
+ GAMEOBJECT_POS_Y = OBJECT_END + 0x000A, // Size: 1, Type: FLOAT, Flags: PUBLIC
+ GAMEOBJECT_POS_Z = OBJECT_END + 0x000B, // Size: 1, Type: FLOAT, Flags: PUBLIC
+ GAMEOBJECT_FACING = OBJECT_END + 0x000C, // Size: 1, Type: FLOAT, Flags: PUBLIC
+ GAMEOBJECT_DYN_FLAGS = OBJECT_END + 0x000D, // Size: 1, Type: INT, Flags: DYNAMIC
+ GAMEOBJECT_FACTION = OBJECT_END + 0x000E, // Size: 1, Type: INT, Flags: PUBLIC
+ GAMEOBJECT_TYPE_ID = OBJECT_END + 0x000F, // Size: 1, Type: INT, Flags: PUBLIC
GAMEOBJECT_LEVEL = OBJECT_END + 0x0010, // Size: 1, Type: INT, Flags: PUBLIC
- GAMEOBJECT_BYTES_1 = OBJECT_END + 0x0011, // Size: 1, Type: BYTES, Flags: PUBLIC
- GAMEOBJECT_END = OBJECT_END + 0x0012,
+ GAMEOBJECT_ARTKIT = OBJECT_END + 0x0011, // Size: 1, Type: INT, Flags: PUBLIC
+ GAMEOBJECT_ANIMPROGRESS = OBJECT_END + 0x0012, // Size: 1, Type: INT, Flags: DYNAMIC
+ GAMEOBJECT_PADDING = OBJECT_END + 0x0013, // Size: 1, Type: INT, Flags: NONE
+ GAMEOBJECT_END = OBJECT_END + 0x0014,
};
enum EDynamicObjectFields
diff --git a/src/game/Vehicle.cpp b/src/game/Vehicle.cpp
deleted file mode 100644
index 4e1153a166b..00000000000
--- a/src/game/Vehicle.cpp
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2005-2008 MaNGOS <http://getmangos.com/>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include "Common.h"
-#include "Log.h"
-#include "WorldSession.h"
-#include "WorldPacket.h"
-#include "ObjectMgr.h"
-#include "SpellMgr.h"
-#include "Vehicle.h"
-#include "MapManager.h"
-#include "SpellAuras.h"
-#include "Unit.h"
-#include "Util.h"
-
-Vehicle::Vehicle() : Creature(), m_vehicleId(0)
-{
- m_isVehicle = true;
- m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_LIVING | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_VEHICLE);
-}
-
-Vehicle::~Vehicle()
-{
- if(m_uint32Values) // only for fully created Object
- ObjectAccessor::Instance().RemoveObject(this);
-}
-
-void Vehicle::AddToWorld()
-{
- ///- Register the vehicle for guid lookup
- if(!IsInWorld()) ObjectAccessor::Instance().AddObject(this);
- Unit::AddToWorld();
-}
-
-void Vehicle::RemoveFromWorld()
-{
- ///- Remove the vehicle from the accessor
- if(IsInWorld()) ObjectAccessor::Instance().RemoveObject(this);
- ///- Don't call the function for Creature, normal mobs + totems go in a different storage
- Unit::RemoveFromWorld();
-}
-
-void Vehicle::setDeathState(DeathState s) // overwrite virtual Creature::setDeathState and Unit::setDeathState
-{
- Creature::setDeathState(s);
-}
-
-void Vehicle::Update(uint32 diff)
-{
- Creature::Update(diff);
-}
-
-bool Vehicle::Create(uint32 guidlow, Map *map, uint32 Entry, uint32 vehicleId, uint32 team)
-{
- SetMapId(map->GetId());
- SetInstanceId(map->GetInstanceId());
-
- Object::_Create(guidlow, Entry, HIGHGUID_VEHICLE);
-
- if(!InitEntry(Entry, team))
- return false;
-
- m_defaultMovementType = IDLE_MOTION_TYPE;
-
- AIM_Initialize();
-
- SetVehicleId(vehicleId);
-
- SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
- SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 1.0f);
-
- CreatureInfo const *ci = GetCreatureInfo();
- setFaction(team == ALLIANCE ? ci->faction_A : ci->faction_H);
- SetMaxHealth(ci->maxhealth);
- SelectLevel(ci);
- SetHealth(GetMaxHealth());
-
- return true;
-}
-
-void Vehicle::Dismiss()
-{
- SendObjectDeSpawnAnim(GetGUID());
- CombatStop();
- CleanupsBeforeDelete();
- AddObjectToRemoveList();
-}
diff --git a/src/game/Vehicle.h b/src/game/Vehicle.h
deleted file mode 100644
index 7fd8b60c40a..00000000000
--- a/src/game/Vehicle.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2005-2008 MaNGOS <http://getmangos.com/>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef MANGOSSERVER_VEHICLE_H
-#define MANGOSSERVER_VEHICLE_H
-
-#include "ObjectDefines.h"
-#include "Creature.h"
-#include "Unit.h"
-
-class Vehicle : public Creature
-{
- public:
- explicit Vehicle();
- virtual ~Vehicle();
-
- void AddToWorld();
- void RemoveFromWorld();
-
- bool Create (uint32 guidlow, Map *map, uint32 Entry, uint32 vehicleId, uint32 team);
-
- void setDeathState(DeathState s); // overwrite virtual Creature::setDeathState and Unit::setDeathState
- void Update(uint32 diff); // overwrite virtual Creature::Update and Unit::Update
-
- uint32 GetVehicleId() { return m_vehicleId; }
- void SetVehicleId(uint32 vehicleid) { m_vehicleId = vehicleid; }
-
- void Dismiss();
-
- protected:
- uint32 m_vehicleId;
-
- private:
- void SaveToDB(uint32, uint8) // overwrited of Creature::SaveToDB - don't must be called
- {
- assert(false);
- }
- void DeleteFromDB() // overwrited of Creature::DeleteFromDB - don't must be called
- {
- assert(false);
- }
-};
-#endif
diff --git a/src/game/World.cpp b/src/game/World.cpp
index a6821c0eaeb..5b36e3d4d9c 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -232,7 +232,7 @@ World::AddSession_ (WorldSession* s)
uint32 Sessions = GetActiveAndQueuedSessionCount ();
uint32 pLimit = GetPlayerAmountLimit ();
- uint32 QueueSize = GetQueueSize (); //number of players in the queue
+ uint32 QueueSize = GetQueueSize (); //number of players in the queue
//so we don't count the user trying to
//login as a session and queue the socket that we are using
@@ -249,10 +249,10 @@ World::AddSession_ (WorldSession* s)
WorldPacket packet(SMSG_AUTH_RESPONSE, 1 + 4 + 1 + 4 + 1);
packet << uint8 (AUTH_OK);
- packet << uint32 (0); // BillingTimeRemaining
- packet << uint8 (0); // BillingPlanFlags
- packet << uint32 (0); // BillingTimeRested
- packet << uint8 (s->Expansion()); // 0 - normal, 1 - TBC, must be set in database manually for each account
+ packet << uint32 (0); // unknown random value...
+ packet << uint8 (0);
+ packet << uint32 (0);
+ packet << uint8 (s->Expansion()); // 0 - normal, 1 - TBC, must be set in database manually for each account
s->SendPacket (&packet);
UpdateMaxSessionCounters ();
@@ -260,7 +260,7 @@ World::AddSession_ (WorldSession* s)
// Updates the population
if (pLimit > 0)
{
- float popu = GetActiveSessionCount (); //updated number of users on the server
+ float popu = GetActiveSessionCount (); //updated number of users on the server
popu /= pLimit;
popu *= 2;
loginDatabase.PExecute ("UPDATE realmlist SET population = '%f' WHERE id = '%d'", popu, realmID);
@@ -287,10 +287,10 @@ void World::AddQueuedPlayer(WorldSession* sess)
// The 1st SMSG_AUTH_RESPONSE needs to contain other info too.
WorldPacket packet (SMSG_AUTH_RESPONSE, 1 + 4 + 1 + 4 + 1);
packet << uint8 (AUTH_WAIT_QUEUE);
- packet << uint32 (0); // BillingTimeRemaining
- packet << uint8 (0); // BillingPlanFlags
- packet << uint32 (0); // BillingTimeRested
- packet << uint8 (sess->Expansion () ? 1 : 0); // 0 - normal, 1 - TBC, must be set in database manually for each account
+ packet << uint32 (0); // unknown random value...
+ packet << uint8 (0);
+ packet << uint32 (0);
+ packet << uint8 (sess->Expansion () ? 1 : 0); // 0 - normal, 1 - TBC, must be set in database manually for each account
packet << uint32(GetQueuePos (sess));
sess->SendPacket (&packet);
@@ -408,30 +408,24 @@ void World::LoadConfigSettings(bool reload)
rate_values[RATE_HEALTH] = sConfig.GetFloatDefault("Rate.Health", 1);
if(rate_values[RATE_HEALTH] < 0)
{
- sLog.outError("Rate.Health (%f) must be > 0. Using 1 instead.",rate_values[RATE_HEALTH]);
+ sLog.outError("Rate.Health (%f) mustbe > 0. Using 1 instead.",rate_values[RATE_HEALTH]);
rate_values[RATE_HEALTH] = 1;
}
rate_values[RATE_POWER_MANA] = sConfig.GetFloatDefault("Rate.Mana", 1);
if(rate_values[RATE_POWER_MANA] < 0)
{
- sLog.outError("Rate.Mana (%f) must be > 0. Using 1 instead.",rate_values[RATE_POWER_MANA]);
+ sLog.outError("Rate.Mana (%f) mustbe > 0. Using 1 instead.",rate_values[RATE_POWER_MANA]);
rate_values[RATE_POWER_MANA] = 1;
}
rate_values[RATE_POWER_RAGE_INCOME] = sConfig.GetFloatDefault("Rate.Rage.Income", 1);
rate_values[RATE_POWER_RAGE_LOSS] = sConfig.GetFloatDefault("Rate.Rage.Loss", 1);
if(rate_values[RATE_POWER_RAGE_LOSS] < 0)
{
- sLog.outError("Rate.Rage.Loss (%f) must be > 0. Using 1 instead.",rate_values[RATE_POWER_RAGE_LOSS]);
+ sLog.outError("Rate.Rage.Loss (%f) mustbe > 0. Using 1 instead.",rate_values[RATE_POWER_RAGE_LOSS]);
rate_values[RATE_POWER_RAGE_LOSS] = 1;
}
- rate_values[RATE_POWER_RUNICPOWER_INCOME] = sConfig.GetFloatDefault("Rate.RunicPower.Income", 1);
- rate_values[RATE_POWER_RUNICPOWER_LOSS] = sConfig.GetFloatDefault("Rate.RunicPower.Loss", 1);
- if(rate_values[RATE_POWER_RUNICPOWER_LOSS] < 0)
- {
- sLog.outError("Rate.RunicPower.Loss (%f) must be > 0. Using 1 instead.",rate_values[RATE_POWER_RUNICPOWER_LOSS]);
- rate_values[RATE_POWER_RUNICPOWER_LOSS] = 1;
- }
rate_values[RATE_POWER_FOCUS] = sConfig.GetFloatDefault("Rate.Focus", 1.0f);
+ rate_values[RATE_LOYALTY] = sConfig.GetFloatDefault("Rate.Loyalty", 1.0f);
rate_values[RATE_SKILL_DISCOVERY] = sConfig.GetFloatDefault("Rate.Skill.Discovery", 1.0f);
rate_values[RATE_DROP_ITEM_POOR] = sConfig.GetFloatDefault("Rate.Drop.Item.Poor", 1.0f);
rate_values[RATE_DROP_ITEM_NORMAL] = sConfig.GetFloatDefault("Rate.Drop.Item.Normal", 1.0f);
@@ -623,15 +617,6 @@ void World::LoadConfigSettings(bool reload)
m_configs[CONFIG_CHARACTERS_PER_ACCOUNT] = m_configs[CONFIG_CHARACTERS_PER_REALM];
}
- m_configs[CONFIG_HEROIC_CHARACTERS_PER_REALM] = sConfig.GetIntDefault("HeroicCharactersPerRealm", 1);
- if(m_configs[CONFIG_HEROIC_CHARACTERS_PER_REALM] < 0 || m_configs[CONFIG_HEROIC_CHARACTERS_PER_REALM] > 10)
- {
- sLog.outError("HeroicCharactersPerRealm (%i) must be in range 0..10. Set to 1.",m_configs[CONFIG_HEROIC_CHARACTERS_PER_REALM]);
- m_configs[CONFIG_HEROIC_CHARACTERS_PER_REALM] = 1;
- }
-
- m_configs[CONFIG_MIN_LEVEL_FOR_HEROIC_CHARACTER_CREATING] = sConfig.GetIntDefault("MinLevelForHeroicCharacterCreating", 55);
-
m_configs[CONFIG_SKIP_CINEMATICS] = sConfig.GetIntDefault("SkipCinematics", 0);
if(m_configs[CONFIG_SKIP_CINEMATICS] < 0 || m_configs[CONFIG_SKIP_CINEMATICS] > 2)
{
@@ -666,20 +651,6 @@ void World::LoadConfigSettings(bool reload)
m_configs[CONFIG_START_PLAYER_LEVEL] = m_configs[CONFIG_MAX_PLAYER_LEVEL];
}
- m_configs[CONFIG_START_HEROIC_PLAYER_LEVEL] = sConfig.GetIntDefault("StartHeroicPlayerLevel", 55);
- if(m_configs[CONFIG_START_HEROIC_PLAYER_LEVEL] < 1)
- {
- sLog.outError("StartHeroicPlayerLevel (%i) must be in range 1..MaxPlayerLevel(%u). Set to 55.",
- m_configs[CONFIG_START_HEROIC_PLAYER_LEVEL],m_configs[CONFIG_MAX_PLAYER_LEVEL]);
- m_configs[CONFIG_START_HEROIC_PLAYER_LEVEL] = 55;
- }
- else if(m_configs[CONFIG_START_HEROIC_PLAYER_LEVEL] > m_configs[CONFIG_MAX_PLAYER_LEVEL])
- {
- sLog.outError("StartHeroicPlayerLevel (%i) must be in range 1..MaxPlayerLevel(%u). Set to %u.",
- m_configs[CONFIG_START_HEROIC_PLAYER_LEVEL],m_configs[CONFIG_MAX_PLAYER_LEVEL],m_configs[CONFIG_MAX_PLAYER_LEVEL]);
- m_configs[CONFIG_START_HEROIC_PLAYER_LEVEL] = m_configs[CONFIG_MAX_PLAYER_LEVEL];
- }
-
m_configs[CONFIG_START_PLAYER_MONEY] = sConfig.GetIntDefault("StartPlayerMoney", 0);
if(m_configs[CONFIG_START_PLAYER_MONEY] < 0)
{
@@ -752,17 +723,17 @@ void World::LoadConfigSettings(bool reload)
m_configs[CONFIG_MIN_PETITION_SIGNS] = sConfig.GetIntDefault("MinPetitionSigns", 9);
if(m_configs[CONFIG_MIN_PETITION_SIGNS] > 9)
{
- sLog.outError("MinPetitionSigns (%i) must be in range 0..9. Set to 9.", m_configs[CONFIG_MIN_PETITION_SIGNS]);
+ sLog.outError("MinPetitionSigns (%i) must be in range 0..9. Set to 9.",m_configs[CONFIG_MIN_PETITION_SIGNS]);
m_configs[CONFIG_MIN_PETITION_SIGNS] = 9;
}
- m_configs[CONFIG_GM_LOGIN_STATE] = sConfig.GetIntDefault("GM.LoginState", 2);
- m_configs[CONFIG_GM_ACCEPT_TICKETS] = sConfig.GetIntDefault("GM.AcceptTickets", 2);
- m_configs[CONFIG_GM_CHAT] = sConfig.GetIntDefault("GM.Chat", 2);
- m_configs[CONFIG_GM_WISPERING_TO] = sConfig.GetIntDefault("GM.WhisperingTo", 2);
+ m_configs[CONFIG_GM_LOGIN_STATE] = sConfig.GetIntDefault("GM.LoginState",2);
+ m_configs[CONFIG_GM_ACCEPT_TICKETS] = sConfig.GetIntDefault("GM.AcceptTickets",2);
+ m_configs[CONFIG_GM_CHAT] = sConfig.GetIntDefault("GM.Chat",2);
+ m_configs[CONFIG_GM_WISPERING_TO] = sConfig.GetIntDefault("GM.WhisperingTo",2);
- m_configs[CONFIG_GM_IN_GM_LIST] = sConfig.GetBoolDefault("GM.InGMList", false);
- m_configs[CONFIG_GM_IN_WHO_LIST] = sConfig.GetBoolDefault("GM.InWhoList", false);
+ m_configs[CONFIG_GM_IN_GM_LIST] = sConfig.GetBoolDefault("GM.InGMList",false);
+ m_configs[CONFIG_GM_IN_WHO_LIST] = sConfig.GetBoolDefault("GM.InWhoList",false);
m_configs[CONFIG_GM_LOG_TRADE] = sConfig.GetBoolDefault("GM.LogTrade", false);
m_configs[CONFIG_START_GM_LEVEL] = sConfig.GetIntDefault("GM.StartLevel", 1);
@@ -803,7 +774,6 @@ void World::LoadConfigSettings(bool reload)
m_configs[CONFIG_SKILL_CHANCE_SKINNING_STEPS] = sConfig.GetIntDefault("SkillChance.SkinningSteps",75);
m_configs[CONFIG_SKILL_PROSPECTING] = sConfig.GetBoolDefault("SkillChance.Prospecting",false);
- m_configs[CONFIG_SKILL_MILLING] = sConfig.GetBoolDefault("SkillChance.Milling",false);
m_configs[CONFIG_SKILL_GAIN_CRAFTING] = sConfig.GetIntDefault("SkillGain.Crafting", 1);
if(m_configs[CONFIG_SKILL_GAIN_CRAFTING] < 0)
@@ -1089,18 +1059,12 @@ void World::SetInitialWorldSettings()
sLog.outString( "Loading InstanceTemplate" );
objmgr.LoadInstanceTemplate();
- sLog.outString( "Loading AchievementCriteriaList..." );
- objmgr.LoadAchievementCriteriaList();
-
- sLog.outString( "Loading completed achievements..." );
- objmgr.LoadCompletedAchievements();
-
sLog.outString( "Loading SkillLineAbilityMultiMap Data..." );
spellmgr.LoadSkillLineAbilityMap();
///- Clean up and pack instances
sLog.outString( "Cleaning up instances..." );
- sInstanceSaveManager.CleanupInstances(); // must be called before `creature_respawn`/`gameobject_respawn` tables
+ sInstanceSaveManager.CleanupInstances(); // must be called before `creature_respawn`/`gameobject_respawn` tables
sLog.outString( "Packing instances..." );
sInstanceSaveManager.PackInstances();
@@ -1226,9 +1190,6 @@ void World::SetInitialWorldSettings()
sLog.outString( "Loading spell pet auras..." );
spellmgr.LoadSpellPetAuras();
- sLog.outString( "Loading pet levelup spells..." );
- spellmgr.LoadPetLevelupSpellMap();
-
sLog.outString( "Loading spell extra attributes...(TODO)" );
spellmgr.LoadSpellCustomAttr();
@@ -1708,9 +1669,6 @@ void World::ScriptsProcess()
case HIGHGUID_PET:
source = HashMapHolder<Pet>::Find(step.sourceGUID);
break;
- case HIGHGUID_VEHICLE:
- source = HashMapHolder<Vehicle>::Find(step.sourceGUID);
- break;
case HIGHGUID_PLAYER:
source = HashMapHolder<Player>::Find(step.sourceGUID);
break;
@@ -1740,9 +1698,6 @@ void World::ScriptsProcess()
case HIGHGUID_PET:
target = HashMapHolder<Pet>::Find(step.targetGUID);
break;
- case HIGHGUID_VEHICLE:
- target = HashMapHolder<Vehicle>::Find(step.targetGUID);
- break;
case HIGHGUID_PLAYER: // empty GUID case also
target = HashMapHolder<Player>::Find(step.targetGUID);
break;
diff --git a/src/game/World.h b/src/game/World.h
index 26118c0c347..edf5e22850b 100644
--- a/src/game/World.h
+++ b/src/game/World.h
@@ -102,12 +102,9 @@ enum WorldConfigs
CONFIG_CHARACTERS_CREATING_DISABLED,
CONFIG_CHARACTERS_PER_ACCOUNT,
CONFIG_CHARACTERS_PER_REALM,
- CONFIG_HEROIC_CHARACTERS_PER_REALM,
- CONFIG_MIN_LEVEL_FOR_HEROIC_CHARACTER_CREATING,
CONFIG_SKIP_CINEMATICS,
CONFIG_MAX_PLAYER_LEVEL,
CONFIG_START_PLAYER_LEVEL,
- CONFIG_START_HEROIC_PLAYER_LEVEL,
CONFIG_START_PLAYER_MONEY,
CONFIG_MAX_HONOR_POINTS,
CONFIG_START_HONOR_POINTS,
@@ -186,7 +183,6 @@ enum WorldConfigs
CONFIG_ARENA_AUTO_DISTRIBUTE_POINTS,
CONFIG_ARENA_AUTO_DISTRIBUTE_INTERVAL_DAYS,
CONFIG_BATTLEGROUND_PREMATURE_FINISH_TIMER,
- CONFIG_SKILL_MILLING,
CONFIG_MAX_WHO,
CONFIG_BG_START_MUSIC,
@@ -211,8 +207,6 @@ enum Rates
RATE_POWER_MANA,
RATE_POWER_RAGE_INCOME,
RATE_POWER_RAGE_LOSS,
- RATE_POWER_RUNICPOWER_INCOME,
- RATE_POWER_RUNICPOWER_LOSS,
RATE_POWER_FOCUS,
RATE_SKILL_DISCOVERY,
RATE_DROP_ITEM_POOR,
@@ -256,6 +250,7 @@ enum Rates
RATE_MINING_AMOUNT,
RATE_MINING_NEXT,
RATE_TALENT,
+ RATE_LOYALTY,
RATE_CORPSE_DECAY_LOOTED,
RATE_INSTANCE_RESET_TIME,
RATE_TARGET_POS_RECALCULATION_RANGE,
diff --git a/src/game/WorldSession.cpp b/src/game/WorldSession.cpp
index d49fe1cda83..47e1334198e 100644
--- a/src/game/WorldSession.cpp
+++ b/src/game/WorldSession.cpp
@@ -525,90 +525,3 @@ void WorldSession::SendAuthWaitQue(uint32 position)
SendPacket(&packet);
}
}
-
-void WorldSession::LoadAccountData()
-{
- for (uint32 i = 0; i < NUM_ACCOUNT_DATA_TYPES; ++i)
- {
- AccountData data;
- m_accountData[i] = data;
- }
-
- QueryResult *result = CharacterDatabase.PQuery("SELECT type, time, data FROM account_data WHERE account='%u'", GetAccountId());
-
- if(!result)
- return;
-
- do
- {
- Field *fields = result->Fetch();
-
- uint32 type = fields[0].GetUInt32();
- if(type < NUM_ACCOUNT_DATA_TYPES)
- {
- m_accountData[type].Time = fields[1].GetUInt32();
- m_accountData[type].Data = fields[2].GetCppString();
- }
- } while (result->NextRow());
-
- delete result;
-}
-
-void WorldSession::SetAccountData(uint32 type, time_t time_, std::string data)
-{
- m_accountData[type].Time = time_;
- m_accountData[type].Data = data;
-
- uint32 acc = GetAccountId();
- CharacterDatabase.PExecute("DELETE FROM account_data WHERE account='%u' AND type='%u'", acc, type);
- CharacterDatabase.escape_string(data);
- CharacterDatabase.PExecute("INSERT INTO account_data VALUES ('%u','%u','%u','%s')", acc, type, (uint32)time_, data.c_str());
-}
-
-void WorldSession::ReadMovementInfo(WorldPacket &data, MovementInfo *mi)
-{
- CHECK_PACKET_SIZE(data, data.rpos()+4+2+4+4+4+4+4);
- data >> mi->flags;
- data >> mi->unk1;
- data >> mi->time;
- data >> mi->x;
- data >> mi->y;
- data >> mi->z;
- data >> mi->o;
-
- if(mi->flags & MOVEMENTFLAG_ONTRANSPORT)
- {
- CHECK_PACKET_SIZE(data, data.rpos()+8+4+4+4+4+4+1);
- data >> mi->t_guid;
- data >> mi->t_x;
- data >> mi->t_y;
- data >> mi->t_z;
- data >> mi->t_o;
- data >> mi->t_time;
- data >> mi->t_seat;
- }
-
- if((mi->flags & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING2)) || (mi->unk1 & 0x20))
- {
- CHECK_PACKET_SIZE(data, data.rpos()+4);
- data >> mi->s_pitch;
- }
-
- CHECK_PACKET_SIZE(data, data.rpos()+4);
- data >> mi->fallTime;
-
- if(mi->flags & MOVEMENTFLAG_JUMPING)
- {
- CHECK_PACKET_SIZE(data, data.rpos()+4+4+4+4);
- data >> mi->j_unk;
- data >> mi->j_sinAngle;
- data >> mi->j_cosAngle;
- data >> mi->j_xyspeed;
- }
-
- if(mi->flags & MOVEMENTFLAG_SPLINE)
- {
- CHECK_PACKET_SIZE(data, data.rpos()+4);
- data >> mi->u_unk1;
- }
-}
diff --git a/src/game/WorldSession.h b/src/game/WorldSession.h
index 385d37046e2..0ccb8dd9fbb 100644
--- a/src/game/WorldSession.h
+++ b/src/game/WorldSession.h
@@ -47,16 +47,6 @@ class CharacterHandler;
#define CHECK_PACKET_SIZE(P,S) if((P).size() < (S)) return SizeError((P),(S));
-#define NUM_ACCOUNT_DATA_TYPES 8
-
-struct AccountData
-{
- AccountData() : Time(NULL), Data("") {}
-
- time_t Time;
- std::string Data;
-};
-
enum PartyOperation
{
PARTY_OP_INVITE = 0,
@@ -91,8 +81,6 @@ class TRINITY_DLL_SPEC WorldSession
void SizeError(WorldPacket const& packet, uint32 size) const;
- void ReadMovementInfo(WorldPacket &data, MovementInfo *mi);
-
void SendPacket(WorldPacket const* packet);
void SendNotification(const char *format,...) ATTR_PRINTF(2,3);
void SendNotification(int32 string_id,...);
@@ -165,11 +153,6 @@ class TRINITY_DLL_SPEC WorldSession
//pet
void SendPetNameQuery(uint64 guid, uint32 petnumber);
- // Account Data
- AccountData *GetAccountData(uint32 type) { return &m_accountData[type]; }
- void SetAccountData(uint32 type, time_t time_, std::string data);
- void LoadAccountData();
-
//mail
//used with item_page table
bool SendItemInfo( uint32 itemid, WorldPacket data );
@@ -341,8 +324,7 @@ class TRINITY_DLL_SPEC WorldSession
void HandleMovementOpcodes(WorldPacket& recvPacket);
void HandlePossessedMovement(WorldPacket& recv_data, MovementInfo& movementInfo, uint32& MovementFlags);
void HandleSetActiveMoverOpcode(WorldPacket &recv_data);
- void HandleMoveNotActiveMover(WorldPacket &recv_data);
- void HandleDismissControlledVehicle(WorldPacket &recv_data);
+ void HandleNotActiveMoverOpcode(WorldPacket &recv_data);
void HandleMoveTimeSkippedOpcode(WorldPacket &recv_data);
void HandleRequestRaidInfoOpcode( WorldPacket & recv_data );
@@ -403,7 +385,7 @@ class TRINITY_DLL_SPEC WorldSession
void HandleGuildSaveEmblemOpcode(WorldPacket& recvPacket);
void HandleTaxiNodeStatusQueryOpcode(WorldPacket& recvPacket);
- void HandleTaxiQueryAvailableNodes(WorldPacket& recvPacket);
+ void HandleTaxiQueryAvailableNodesOpcode(WorldPacket& recvPacket);
void HandleActivateTaxiOpcode(WorldPacket& recvPacket);
void HandleActivateTaxiFarOpcode(WorldPacket& recvPacket);
void HandleTaxiNextDestinationOpcode(WorldPacket& recvPacket);
@@ -447,7 +429,6 @@ class TRINITY_DLL_SPEC WorldSession
void HandleAuctionRemoveItem( WorldPacket & recv_data );
void HandleAuctionListOwnerItems( WorldPacket & recv_data );
void HandleAuctionPlaceBid( WorldPacket & recv_data );
- void HandleAuctionListPendingSales( WorldPacket & recv_data );
void HandleGetMail( WorldPacket & recv_data );
void HandleSendMail( WorldPacket & recv_data );
@@ -562,7 +543,6 @@ class TRINITY_DLL_SPEC WorldSession
void HandlePetUnlearnOpcode( WorldPacket& recvPacket );
void HandlePetSpellAutocastOpcode( WorldPacket& recvPacket );
void HandlePetCastSpellOpcode( WorldPacket& recvPacket );
- void HandlePetLearnTalent( WorldPacket& recvPacket );
void HandleSetActionBar(WorldPacket& recv_data);
@@ -599,9 +579,10 @@ class TRINITY_DLL_SPEC WorldSession
void HandleLfmSetNoneOpcode(WorldPacket& recv_data);
void HandleLfmSetOpcode(WorldPacket& recv_data);
void HandleLfgSetCommentOpcode(WorldPacket& recv_data);
+ void HandleNewUnknownOpcode(WorldPacket& recv_data);
void HandleChooseTitleOpcode(WorldPacket& recv_data);
void HandleRealmStateRequestOpcode(WorldPacket& recv_data);
- void HandleTimeSyncResp(WorldPacket& recv_data);
+ void HandleAllowMoveAckOpcode(WorldPacket& recv_data);
void HandleWhoisOpcode(WorldPacket& recv_data);
void HandleResetInstancesOpcode(WorldPacket& recv_data);
@@ -647,29 +628,6 @@ class TRINITY_DLL_SPEC WorldSession
void HandleGuildBankBuyTab(WorldPacket& recv_data);
void HandleGuildBankTabText(WorldPacket& recv_data);
void HandleGuildBankSetTabText(WorldPacket& recv_data);
-
- // Calendar
- void HandleCalendarGetCalendar(WorldPacket& recv_data);
- void HandleCalendarGetEvent(WorldPacket& recv_data);
- void HandleCalendarGuildFilter(WorldPacket& recv_data);
- void HandleCalendarArenaTeam(WorldPacket& recv_data);
- void HandleCalendarAddEvent(WorldPacket& recv_data);
- void HandleCalendarUpdateEvent(WorldPacket& recv_data);
- void HandleCalendarRemoveEvent(WorldPacket& recv_data);
- void HandleCalendarCopyEvent(WorldPacket& recv_data);
- void HandleCalendarEventInvite(WorldPacket& recv_data);
- void HandleCalendarEventRsvp(WorldPacket& recv_data);
- void HandleCalendarEventRemoveInvite(WorldPacket& recv_data);
- void HandleCalendarEventStatus(WorldPacket& recv_data);
- void HandleCalendarEventModeratorStatus(WorldPacket& recv_data);
- void HandleCalendarComplain(WorldPacket& recv_data);
- void HandleCalendarGetNumPending(WorldPacket& recv_data);
-
- void HandleSpellClick(WorldPacket& recv_data);
- void HandleAlterAppearance(WorldPacket& recv_data);
- void HandleRemoveGlyph(WorldPacket& recv_data);
- void HandleCharCustomize(WorldPacket& recv_data);
- void HandleInspectAchievements(WorldPacket& recv_data);
private:
// private trade methods
void moveItems(Item* myItems[], Item* hisItems[]);
@@ -692,7 +650,6 @@ class TRINITY_DLL_SPEC WorldSession
LocaleConstant m_sessionDbcLocale;
int m_sessionDbLocaleIndex;
uint32 m_latency;
- AccountData m_accountData[NUM_ACCOUNT_DATA_TYPES];
ZThread::LockedQueue<WorldPacket*,ZThread::FastMutex> _recvQueue;
};
diff --git a/src/game/WorldSocket.cpp b/src/game/WorldSocket.cpp
index 2ae97819116..01d5a0e5490 100644
--- a/src/game/WorldSocket.cpp
+++ b/src/game/WorldSocket.cpp
@@ -54,48 +54,8 @@
struct ServerPktHeader
{
- /**
- * size is the length of the payload _plus_ the length of the opcode
- */
- ServerPktHeader(uint32 size, uint16 cmd) : size(size)
- {
- uint8 headerIndex=0;
- if(isLargePacket())
- {
- sLog.outDebug("initializing large server to client packet. Size: %u, cmd: %u", size, cmd);
- header= new uint8[5];
- header[headerIndex++] = 0x80|(0xFF &(size>>16));
- }
- else
- {
- header= new uint8[4];
- }
-
- header[headerIndex++] = 0xFF &(size>>8);
- header[headerIndex++] = 0xFF &size;
-
- header[headerIndex++] = 0xFF & cmd;
- header[headerIndex++] = 0xFF & (cmd>>8);
- }
-
- ~ServerPktHeader()
- {
- delete[] header;
- }
-
- uint8 getHeaderLength()
- {
- // cmd = 2 bytes, size= 2||3bytes
- return 2+(isLargePacket()?3:2);
- }
-
- bool isLargePacket()
- {
- return size > 0x7FFF;
- }
-
- const uint32 size;
- uint8 *header;
+ uint16 size;
+ uint16 cmd;
};
struct ClientPktHeader
@@ -679,7 +639,7 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
// NOTE: ATM the socket is singlethread, have this in mind ...
uint8 digest[20];
uint32 clientSeed;
- uint32 unk2, unk3;
+ uint32 unk2;
uint32 BuiltNumberClient;
uint32 id, security;
//uint8 expansion = 0;
@@ -701,7 +661,6 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
recvPacket >> BuiltNumberClient; // for now no use
recvPacket >> unk2;
recvPacket >> account;
- recvPacket >> unk3;
if (recvPacket.size () < (4 + 4 + (account.size () + 1) + 4 + 20))
{
@@ -921,8 +880,6 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
m_Crypt.SetKey (&K);
m_Crypt.Init ();
- m_Session->LoadAccountData();
-
// In case needed sometime the second arg is in microseconds 1 000 000 = 1 sec
ACE_OS::sleep (ACE_Time_Value (0, 10000));
@@ -1006,17 +963,23 @@ int WorldSocket::HandlePing (WorldPacket& recvPacket)
int WorldSocket::iSendPacket (const WorldPacket& pct)
{
- ServerPktHeader header(pct.size()+2, pct.GetOpcode());
- if (m_OutBuffer->space () < pct.size () + header.getHeaderLength())
+ if (m_OutBuffer->space () < pct.size () + sizeof (ServerPktHeader))
{
errno = ENOBUFS;
return -1;
}
+ ServerPktHeader header;
+
+ header.cmd = pct.GetOpcode ();
+ EndianConvert(header.cmd);
+
+ header.size = (uint16) pct.size () + 2;
+ EndianConvertReverse(header.size);
- m_Crypt.EncryptSend ( header.header, header.getHeaderLength());
+ m_Crypt.EncryptSend ((uint8*) & header, sizeof (header));
- if (m_OutBuffer->copy ((char*) header.header, header.getHeaderLength()) == -1)
+ if (m_OutBuffer->copy ((char*) & header, sizeof (header)) == -1)
ACE_ASSERT (false);
if (!pct.empty ())
diff --git a/src/game/debugcmds.cpp b/src/game/debugcmds.cpp
index 8ec580f0c9f..878c4f5a711 100644
--- a/src/game/debugcmds.cpp
+++ b/src/game/debugcmds.cpp
@@ -63,7 +63,6 @@ bool ChatHandler::HandleDebugSpellFailCommand(const char* args)
uint8 failnum = (uint8)atoi(px);
WorldPacket data(SMSG_CAST_FAILED, 5);
- data << uint8(0);
data << uint32(133);
data << uint8(failnum);
m_session->SendPacket(&data);
@@ -570,54 +569,4 @@ bool ChatHandler::HandleDebugHostilRefList(const char * /*args*/)
}
SendSysMessage("End of hostil reference list.");
return true;
-}
-
-bool ChatHandler::HandleSpawnVehicle(const char* args)
-{
- if(!args)
- return false;
-
- char* e = strtok((char*)args, " ");
- char* i = strtok(NULL, " ");
-
- if (!e || !i)
- return false;
-
- uint32 entry = (uint32)atoi(e);
- uint32 id = (uint32)atoi(i);
-
- CreatureInfo const *ci = objmgr.GetCreatureTemplate(entry);
-
- if(!ci)
- return false;
-
- VehicleEntry const *ve = sVehicleStore.LookupEntry(id);
-
- if(!ve)
- return false;
-
- Vehicle *v = new Vehicle;
- Map *map = m_session->GetPlayer()->GetMap();
- if(!v->Create(objmgr.GenerateLowGuid(HIGHGUID_VEHICLE), map, entry, id, m_session->GetPlayer()->GetTeam()))
- {
- delete v;
- return false;
- }
-
- float px, py, pz;
- m_session->GetPlayer()->GetClosePoint(px, py, pz, m_session->GetPlayer()->GetObjectSize());
-
- v->Relocate(px, py, pz, m_session->GetPlayer()->GetOrientation());
-
- if(!v->IsPositionValid())
- {
- sLog.outError("ERROR: Vehicle (guidlow %d, entry %d) not created. Suggested coordinates isn't valid (X: %f Y: %f)",
- v->GetGUIDLow(), v->GetEntry(), v->GetPositionX(), v->GetPositionY());
- delete v;
- return false;
- }
-
- map->Add((Creature*)v);
-
- return true;
} \ No newline at end of file
diff --git a/src/shared/Auth/AuthCrypt.cpp b/src/shared/Auth/AuthCrypt.cpp
index 199e7192537..7941b33ed8c 100644
--- a/src/shared/Auth/AuthCrypt.cpp
+++ b/src/shared/Auth/AuthCrypt.cpp
@@ -50,8 +50,9 @@ void AuthCrypt::DecryptRecv(uint8 *data, size_t len)
void AuthCrypt::EncryptSend(uint8 *data, size_t len)
{
if (!_initialized) return;
+ if (len < CRYPTED_SEND_LEN) return;
- for (size_t t = 0; t < len; t++)
+ for (size_t t = 0; t < CRYPTED_SEND_LEN; t++)
{
_send_i %= _key.size();
uint8 x = (data[t] ^ _key[_send_i]) + _send_j;
diff --git a/src/shared/Auth/AuthCrypt.h b/src/shared/Auth/AuthCrypt.h
index 366cce5635f..f3a0cac40fa 100644
--- a/src/shared/Auth/AuthCrypt.h
+++ b/src/shared/Auth/AuthCrypt.h
@@ -32,6 +32,7 @@ class AuthCrypt
AuthCrypt();
~AuthCrypt();
+ const static size_t CRYPTED_SEND_LEN = 4;
const static size_t CRYPTED_RECV_LEN = 6;
void Init();
diff --git a/src/shared/Database/DBCEnums.h b/src/shared/Database/DBCEnums.h
index 4f406c9cc63..1d54616a2b5 100644
--- a/src/shared/Database/DBCEnums.h
+++ b/src/shared/Database/DBCEnums.h
@@ -34,190 +34,28 @@ enum AreaTeams
AREATEAM_HORDE = 4
};
-enum AchievementFactionFlags
-{
- ACHIEVEMENT_FACTION_FLAG_HORDE = 0x00000000,
- ACHIEVEMENT_FACTION_FLAG_ALLIANCE = 0x00000001,
-};
-
-enum AchievementFlags
-{
- ACHIEVEMENT_FLAG_COUNTER = 0x00000001,
- ACHIEVEMENT_FLAG_REACH_LEVEL = 0x00000004,
- ACHIEVEMENT_FLAG_RERERED_MAX = 0x00000010, // displays the maximum criteria of a refered achievement
- ACHIEVEMENT_FLAG_AVERAGE = 0x00000040,
- ACHIEVEMENT_FLAG_REALM_FIRST_REACH= 0x00000100,
- ACHIEVEMENT_FLAG_REALM_FIRST_KILL = 0x00000200,
-};
-
-enum AchievementCriteriaCondition
-{
- ACHIEVEMENT_CRITERIA_CONDITION_NONE = 0,
- ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH = 1,
- ACHIEVEMENT_CRITERIA_CONDITION_UNK1 = 2, // only used in "Complete a daily quest every day for five consecutive days"
- ACHIEVEMENT_CRITERIA_CONDITION_MAP = 3, // requires you to be on specific map
- ACHIEVEMENT_CRITERIA_CONDITION_NO_LOOSE = 4, // only used in "Win 10 arenas without losing"
- ACHIEVEMENT_CRITERIA_CONDITION_UNK2 = 9, // unk
- ACHIEVEMENT_CRITERIA_CONDITION_UNK3 = 13, // unk
-};
-
-enum AchievementCriteriaCompletionFlags
-{
- // some Achievements (like 698) have several criteria but only one has to be fulfilled. These are identified by this flag.
- ACHIEVEMENT_CRITERIA_COMPLETE_FLAG_ALL = 2,
-};
-
-enum AchievementCriteriaGroupFlags
-{
- // you mustn't be in a group while fulfilling this achievement
- ACHIEVEMENT_CRITERIA_GROUP_NOT_IN_GROUP = 2,
-};
-
-enum AchievementCriteriaTypes
-{
- ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE = 0,
- ACHIEVEMENT_CRITERIA_TYPE_WIN_BG = 1,
- ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL = 5,
- ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL = 7,
- ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT = 8,
- ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT = 9,
- // you have to complete a daily quest x times in a row
- ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY = 10,
- ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE = 11,
- ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE = 13,
- ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST = 14,
- ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND= 15,
- ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP= 16,
- // TODO: this can be both arena and total deaths. Where is this difference in the dbc?
- ACHIEVEMENT_CRITERIA_TYPE_DEATH= 17,
- ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON = 18,
- ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID = 19,
- ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE = 20,
- ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER = 23,
- ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING = 24,
- ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM = 26,
- ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST = 27,
- ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET = 28,
- ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL= 29,
- ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE = 30,
- ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA = 31,
- ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA = 32,
- ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA = 33,
- ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL = 34,
- // TODO: this criteria has additional conditions which can not be found in the dbcs
- ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL = 35,
- ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM = 36,
- // TODO: the archievements 1162 and 1163 requires a special rating which can't be found in the dbc
- ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA = 37,
- ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING = 38,
- ACHIEVEMENT_CRITERIA_TYPE_REACH_TEAM_RATING = 39,
- ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL = 40,
- ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM = 41,
- ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM= 42,
- ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA = 43,
- ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK= 44,
- ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT= 45,
- ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION= 46,
- ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION= 47,
- // noted: rewarded as soon as the player payed, not at taking place at the seat
- ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP= 48,
- ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM = 49,
- // TODO: itemlevel is mentioned in text but not present in dbc
- ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT = 50,
- ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT= 51,
- ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS = 52,
- ACHIEVEMENT_CRITERIA_TYPE_HK_RACE = 53,
- ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE = 54,
- ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE = 55,
- // TODO: in some cases map not present, and in some cases need do without die
- ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS = 56,
- ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM = 57,
- ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_VENDORS = 59,
- ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS = 60,
- ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS = 61,
- ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD = 62,
- ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING = 63,
- ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER = 65,
- ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL = 66,
- ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY = 67,
- ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT = 68,
- ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2= 69,
- ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL= 70,
- ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT = 72,
- // TODO: title id is not mentioned in dbc
- ACHIEVEMENT_CRITERIA_TYPE_EARNED_PVP_TITLE = 74,
- ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS= 75,
- ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL = 76,
- ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL = 77,
- // TODO: creature type (demon, undead etc.) is not stored in dbc
- ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE = 78,
- ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS= 80,
- ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION= 82,
- ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID= 83,
- ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS= 84,
- ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD = 85,
- ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED = 86,
- ACHIEVEMENT_CRITERIA_TYPE_GAIN_REVERED_REPUTATION = 87,
- ACHIEVEMENT_CRITERIA_TYPE_GAIN_HONORED_REPUTATION = 88,
- ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS = 89,
- ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM = 90,
- ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM = 91,
- ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED = 93,
- ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED = 94,
- ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALTH = 95,
- ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_POWER = 96,
- ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_STAT = 97,
- ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER = 98,
- ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_ARMOR = 99,
- ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_RATING = 100,
- ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT = 101,
- ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED = 102,
- ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED = 103,
- ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED = 104,
- ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED = 105,
- ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED = 106,
- ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED = 107,
- ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN = 108,
- ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE = 109,
- // TODO: target entry is missing
- ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2 = 110,
- ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE= 112,
- ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL = 113,
- ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS = 114,
- // 0..114 => 115 criteria types total
- ACHIEVEMENT_CRITERIA_TYPE_TOTAL = 115,
-};
-
enum AreaFlags
{
AREA_FLAG_SNOW = 0x00000001, // snow (only Dun Morogh, Naxxramas, Razorfen Downs and Winterspring)
- AREA_FLAG_UNK1 = 0x00000002, // may be necropolis?
- AREA_FLAG_UNK2 = 0x00000004, // Only used for areas on map 571 (development before)
- AREA_FLAG_SLAVE_CAPITAL = 0x00000008, // city and city subsones
- AREA_FLAG_UNK3 = 0x00000010, // can't find common meaning
+ AREA_FLAG_UNK1 = 0x00000002, // unknown, (only Naxxramas and Razorfen Downs)
+ AREA_FLAG_UNK2 = 0x00000004, // Only used on development map
+ AREA_FLAG_SLAVE_CAPITAL = 0x00000008, // slave capital city flag?
+ AREA_FLAG_UNK3 = 0x00000010, // unknown
AREA_FLAG_SLAVE_CAPITAL2 = 0x00000020, // slave capital city flag?
AREA_FLAG_UNK4 = 0x00000040, // many zones have this flag
AREA_FLAG_ARENA = 0x00000080, // arena, both instanced and world arenas
AREA_FLAG_CAPITAL = 0x00000100, // main capital city flag
AREA_FLAG_CITY = 0x00000200, // only for one zone named "City" (where it located?)
- AREA_FLAG_OUTLAND = 0x00000400, // expansion zones? (only Eye of the Storm not have this flag, but have 0x00004000 flag)
+ AREA_FLAG_OUTLAND = 0x00000400, // outland zones? (only Eye of the Storm not have this flag, but have 0x00004000 flag)
AREA_FLAG_SANCTUARY = 0x00000800, // sanctuary area (PvP disabled)
AREA_FLAG_NEED_FLY = 0x00001000, // only Netherwing Ledge, Socrethar's Seat, Tempest Keep, The Arcatraz, The Botanica, The Mechanar, Sorrow Wing Point, Dragonspine Ridge, Netherwing Mines, Dragonmaw Base Camp, Dragonmaw Skyway
- AREA_FLAG_UNUSED1 = 0x00002000, // not used now (no area/zones with this flag set in 3.0.3)
- AREA_FLAG_OUTLAND2 = 0x00004000, // expansion zones? (only Circle of Blood Arena not have this flag, but have 0x00000400 flag)
+ AREA_FLAG_UNUSED1 = 0x00002000, // not used now (no area/zones with this flag set in 2.4.2)
+ AREA_FLAG_OUTLAND2 = 0x00004000, // outland zones? (only Circle of Blood Arena not have this flag, but have 0x00000400 flag)
AREA_FLAG_PVP = 0x00008000, // pvp objective area? (Death's Door also has this flag although it's no pvp object area)
AREA_FLAG_ARENA_INSTANCE = 0x00010000, // used by instanced arenas only
- AREA_FLAG_UNUSED2 = 0x00020000, // not used now (no area/zones with this flag set in 3.0.3)
- AREA_FLAG_UNK5 = 0x00040000, // only used for Amani Pass, Hatchet Hills
- AREA_FLAG_UNK6 = 0x00080000, // Valgarde and Acherus: The Ebon Hold
- AREA_FLAG_LOWLEVEL = 0x00100000, // used for some starting areas with area_level <=15
- AREA_FLAG_TOWN = 0x00200000, // small towns with Inn
- AREA_FLAG_UNK7 = 0x00400000, // Warsong Hold, Acherus: The Ebon Hold, New Agamand Inn, Vengeance Landing Inn
- AREA_FLAG_UNK8 = 0x00800000, // Westguard Inn, Acherus: The Ebon Hold, Valgarde
- AREA_FLAG_OUTDOOR_PVP = 0x01000000, // Wintergrasp and it's subzones
- AREA_FLAG_UNK9 = 0x02000000, // unknown
- AREA_FLAG_UNK10 = 0x04000000, // unknown
- AREA_FLAG_OUTDOOR_PVP2 = 0x08000000 // Wintergrasp and it's subzones
+ AREA_FLAG_UNUSED2 = 0x00020000, // not used now (no area/zones with this flag set in 2.4.2)
+ AREA_FLAG_UNK5 = 0x00040000, // just used for Amani Pass, Hatchet Hills
+ AREA_FLAG_LOWLEVEL = 0x00100000 // used for some starting areas with area_level <=15
};
enum FactionTemplateFlags
@@ -271,51 +109,4 @@ enum TotemCategoryType
TOTEM_CATEGORY_TYPE_SPANNER = 24
};
-// SummonProperties.dbc, col 1
-/*enum SummonGroup
-{
- SUMMON_GROUP_UNKNOWN1 = 0, // 1160 spells in 3.0.3
- SUMMON_GROUP_UNKNOWN2 = 1, // 861 spells in 3.0.3
- SUMMON_GROUP_PETS = 2, // 52 spells in 3.0.3, pets mostly
- SUMMON_GROUP_CONTROLLABLE = 3, // 13 spells in 3.0.3, mostly controllable
- SUMMON_GROUP_UNKNOWN3 = 4 // 86 spells in 3.0.3, taxi/mounts
-};
-
-// SummonProperties.dbc, col 3
-enum SummonType
-{
- SUMMON_TYPE_UNKNOWN = 0, // different summons, 1330 spells in 3.0.3
- SUMMON_TYPE_SUMMON = 1, // generic summons, 49 spells in 3.0.3
- SUMMON_TYPE_GUARDIAN = 2, // summon guardian, 393 spells in 3.0.3
- SUMMON_TYPE_ARMY = 3, // summon army, 5 spells in 3.0.3
- SUMMON_TYPE_TOTEM = 4, // summon totem, 169 spells in 3.0.3
- SUMMON_TYPE_CRITTER = 5, // critter/minipet, 195 spells in 3.0.3
- SUMMON_TYPE_DK = 6, // summon DRW/Ghoul, 2 spells in 3.0.3
- SUMMON_TYPE_BOMB = 7, // summon bot/bomb, 4 spells in 3.0.3
- SUMMON_TYPE_PHASING = 8, // something todo with DK prequest line, 2 spells in 3.0.3
- SUMMON_TYPE_SIEGE_VEH = 9, // summon different vehicles, 14 spells in 3.0.3
- SUMMON_TYPE_DRAKE_VEH = 10, // summon drake (vehicle), 3 spells
- SUMMON_TYPE_LIGHTWELL = 11 // summon lightwell, 6 spells in 3.0.3
-};
-
-// SummonProperties.dbc, col 5
-enum SummonFlags
-{
- SUMMON_FLAG_NONE = 0x0000, // 1342 spells in 3.0.3
- SUMMON_FLAG_UNK1 = 0x0001, // 75 spells in 3.0.3, something unfriendly
- SUMMON_FLAG_UNK2 = 0x0002, // 616 spells in 3.0.3, something friendly
- SUMMON_FLAG_UNK3 = 0x0004, // 22 spells in 3.0.3, no idea...
- SUMMON_FLAG_UNK4 = 0x0008, // 49 spells in 3.0.3, some mounts
- SUMMON_FLAG_UNK5 = 0x0010, // 25 spells in 3.0.3, quest related?
- SUMMON_FLAG_UNK6 = 0x0020, // 0 spells in 3.0.3, unused
- SUMMON_FLAG_UNK7 = 0x0040, // 12 spells in 3.0.3, no idea
- SUMMON_FLAG_UNK8 = 0x0080, // 4 spells in 3.0.3, no idea
- SUMMON_FLAG_UNK9 = 0x0100, // 51 spells in 3.0.3, no idea, many quest related
- SUMMON_FLAG_UNK10 = 0x0200, // 51 spells in 3.0.3, something defensive
- SUMMON_FLAG_UNK11 = 0x0400, // 3 spells, requires something near?
- SUMMON_FLAG_UNK12 = 0x0800, // 30 spells in 3.0.3, no idea
- SUMMON_FLAG_UNK13 = 0x1000, // 8 spells in 3.0.3, siege vehicle
- SUMMON_FLAG_UNK14 = 0x2000, // 2 spells in 3.0.3, escort?
-};
-*/
#endif
diff --git a/src/shared/Database/DBCStores.cpp b/src/shared/Database/DBCStores.cpp
index c183f8356b4..fb132c75768 100644
--- a/src/shared/Database/DBCStores.cpp
+++ b/src/shared/Database/DBCStores.cpp
@@ -35,12 +35,9 @@ DBCStorage <AreaTableEntry> sAreaStore(AreaTableEntryfmt);
static AreaFlagByAreaID sAreaFlagByAreaID;
static AreaFlagByMapID sAreaFlagByMapID; // for instances without generated *.map files
-DBCStorage <AchievementEntry> sAchievementStore(Achievementfmt);
-DBCStorage <AchievementCriteriaEntry> sAchievementCriteriaStore(AchievementCriteriafmt);
DBCStorage <AreaTriggerEntry> sAreaTriggerStore(AreaTriggerEntryfmt);
DBCStorage <BankBagSlotPricesEntry> sBankBagSlotPricesStore(BankBagSlotPricesEntryfmt);
DBCStorage <BattlemasterListEntry> sBattlemasterListStore(BattlemasterListEntryfmt);
-DBCStorage <BarberShopStyleEntry> sBarberShopStyleStore(BarberShopStyleEntryfmt);
DBCStorage <CharStartOutfitEntry> sCharStartOutfitStore(CharStartOutfitEntryfmt);
DBCStorage <CharTitlesEntry> sCharTitlesStore(CharTitlesEntryfmt);
DBCStorage <ChatChannelsEntry> sChatChannelsStore(ChatChannelsEntryfmt);
@@ -61,10 +58,7 @@ DBCStorage <FactionEntry> sFactionStore(FactionEntryfmt);
DBCStorage <FactionTemplateEntry> sFactionTemplateStore(FactionTemplateEntryfmt);
DBCStorage <GemPropertiesEntry> sGemPropertiesStore(GemPropertiesEntryfmt);
-DBCStorage <GlyphPropertiesEntry> sGlyphPropertiesStore(GlyphPropertiesfmt);
-DBCStorage <GlyphSlotEntry> sGlyphSlotStore(GlyphSlotfmt);
-DBCStorage <GtBarberShopCostBaseEntry> sGtBarberShopCostBaseStore(GtBarberShopCostBasefmt);
DBCStorage <GtCombatRatingsEntry> sGtCombatRatingsStore(GtCombatRatingsfmt);
DBCStorage <GtChanceToMeleeCritBaseEntry> sGtChanceToMeleeCritBaseStore(GtChanceToMeleeCritBasefmt);
DBCStorage <GtChanceToMeleeCritEntry> sGtChanceToMeleeCritStore(GtChanceToMeleeCritfmt);
@@ -90,8 +84,6 @@ DBCStorage <MapEntry> sMapStore(MapEntryfmt);
DBCStorage <QuestSortEntry> sQuestSortStore(QuestSortEntryfmt);
DBCStorage <RandomPropertiesPointsEntry> sRandomPropertiesPointsStore(RandomPropertiesPointsfmt);
-DBCStorage <ScalingStatDistributionEntry> sScalingStatDistributionStore(ScalingStatDistributionfmt);
-DBCStorage <ScalingStatValuesEntry> sScalingStatValuesStore(ScalingStatValuesfmt);
DBCStorage <SkillLineEntry> sSkillLineStore(SkillLinefmt);
DBCStorage <SkillLineAbilityEntry> sSkillLineAbilityStore(SkillLineAbilityfmt);
@@ -109,10 +101,8 @@ DBCStorage <SpellDurationEntry> sSpellDurationStore(SpellDurationfmt);
DBCStorage <SpellFocusObjectEntry> sSpellFocusObjectStore(SpellFocusObjectfmt);
DBCStorage <SpellRadiusEntry> sSpellRadiusStore(SpellRadiusfmt);
DBCStorage <SpellRangeEntry> sSpellRangeStore(SpellRangefmt);
-DBCStorage <SpellRuneCostEntry> sSpellRuneCostStore(SpellRuneCostfmt);
DBCStorage <SpellShapeshiftEntry> sSpellShapeshiftStore(SpellShapeshiftfmt);
DBCStorage <StableSlotPricesEntry> sStableSlotPricesStore(StableSlotPricesfmt);
-//DBCStorage <SummonPropertiesEntry> sSummonPropertiesStore(SummonPropertiesfmt);
DBCStorage <TalentEntry> sTalentStore(TalentEntryfmt);
TalentSpellPosMap sTalentSpellPosMap;
DBCStorage <TalentTabEntry> sTalentTabStore(TalentTabEntryfmt);
@@ -135,11 +125,8 @@ TaxiPathNodesByPath sTaxiPathNodesByPath;
static DBCStorage <TaxiPathNodeEntry> sTaxiPathNodeStore(TaxiPathNodeEntryfmt);
DBCStorage <TotemCategoryEntry> sTotemCategoryStore(TotemCategoryEntryfmt);
-DBCStorage <VehicleEntry> sVehicleStore(VehicleEntryfmt);
-DBCStorage <VehicleSeatEntry> sVehicleSeatStore(VehicleSeatEntryfmt);
DBCStorage <WorldMapAreaEntry> sWorldMapAreaStore(WorldMapAreaEntryfmt);
DBCStorage <WorldSafeLocsEntry> sWorldSafeLocsStore(WorldSafeLocsEntryfmt);
-DBCStorage <WorldMapOverlayEntry> sWorldMapOverlayStore(WorldMapOverlayEntryfmt);
typedef std::list<std::string> StoreProblemList;
@@ -191,7 +178,7 @@ void LoadDBCStores(const std::string& dataPath)
{
std::string dbcPath = dataPath+"dbc/";
- const uint32 DBCFilesCount = 66;
+ const uint32 DBCFilesCount = 56;
barGoLink bar( DBCFilesCount );
@@ -209,19 +196,16 @@ void LoadDBCStores(const std::string& dataPath)
sAreaFlagByAreaID.insert(AreaFlagByAreaID::value_type(uint16(area->ID),area->exploreFlag));
// fill MapId->DBC records ( skip sub zones and continents )
- if(area->zone==0 && area->mapid != 0 && area->mapid != 1 && area->mapid != 530 && area->mapid != 571 )
+ if(area->zone==0 && area->mapid != 0 && area->mapid != 1 && area->mapid != 530 )
sAreaFlagByMapID.insert(AreaFlagByMapID::value_type(area->mapid,area->exploreFlag));
}
}
- LoadDBC(availableDbcLocales,bar,bad_dbc_files,sAchievementStore, dbcPath,"Achievement.dbc");
- LoadDBC(availableDbcLocales,bar,bad_dbc_files,sAchievementCriteriaStore, dbcPath,"Achievement_Criteria.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sAreaTriggerStore, dbcPath,"AreaTrigger.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sBankBagSlotPricesStore, dbcPath,"BankBagSlotPrices.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sBattlemasterListStore, dbcPath,"BattlemasterList.dbc");
- LoadDBC(availableDbcLocales,bar,bad_dbc_files,sBarberShopStyleStore, dbcPath,"BarberShopStyle.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sCharStartOutfitStore, dbcPath,"CharStartOutfit.dbc");
-
+
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sCharTitlesStore, dbcPath,"CharTitles.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sChatChannelsStore, dbcPath,"ChatChannels.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sChrClassesStore, dbcPath,"ChrClasses.dbc");
@@ -245,10 +229,7 @@ void LoadDBCStores(const std::string& dataPath)
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sFactionTemplateStore, dbcPath,"FactionTemplate.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sGemPropertiesStore, dbcPath,"GemProperties.dbc");
- LoadDBC(availableDbcLocales,bar,bad_dbc_files,sGlyphPropertiesStore, dbcPath,"GlyphProperties.dbc");
- LoadDBC(availableDbcLocales,bar,bad_dbc_files,sGlyphSlotStore, dbcPath,"GlyphSlot.dbc");
- LoadDBC(availableDbcLocales,bar,bad_dbc_files,sGtBarberShopCostBaseStore,dbcPath,"gtBarberShopCostBase.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sGtCombatRatingsStore, dbcPath,"gtCombatRatings.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sGtChanceToMeleeCritBaseStore, dbcPath,"gtChanceToMeleeCritBase.dbc");
@@ -273,8 +254,6 @@ void LoadDBCStores(const std::string& dataPath)
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sMapStore, dbcPath,"Map.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sQuestSortStore, dbcPath,"QuestSort.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sRandomPropertiesPointsStore, dbcPath,"RandPropPoints.dbc");
- LoadDBC(availableDbcLocales,bar,bad_dbc_files,sScalingStatDistributionStore, dbcPath,"ScalingStatDistribution.dbc");
- LoadDBC(availableDbcLocales,bar,bad_dbc_files,sScalingStatValuesStore, dbcPath,"ScalingStatValues.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sSkillLineStore, dbcPath,"SkillLine.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sSkillLineAbilityStore, dbcPath,"SkillLineAbility.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sSoundEntriesStore, dbcPath,"SoundEntries.dbc");
@@ -324,10 +303,8 @@ void LoadDBCStores(const std::string& dataPath)
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sSpellItemEnchantmentConditionStore,dbcPath,"SpellItemEnchantmentCondition.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sSpellRadiusStore, dbcPath,"SpellRadius.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sSpellRangeStore, dbcPath,"SpellRange.dbc");
- LoadDBC(availableDbcLocales,bar,bad_dbc_files,sSpellRuneCostStore, dbcPath,"SpellRuneCost.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sSpellShapeshiftStore, dbcPath,"SpellShapeshiftForm.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sStableSlotPricesStore, dbcPath,"StableSlotPrices.dbc");
- //LoadDBC(availableDbcLocales,bar,bad_dbc_files,sSummonPropertiesStore, dbcPath,"SummonProperties.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sTalentStore, dbcPath,"Talent.dbc");
// create talent spells set
@@ -430,10 +407,7 @@ void LoadDBCStores(const std::string& dataPath)
pathLength.resize(pathCount); // 0 and some other indexes not used
for(uint32 i = 1; i < sTaxiPathNodeStore.GetNumRows(); ++i)
if(TaxiPathNodeEntry const* entry = sTaxiPathNodeStore.LookupEntry(i))
- {
- if (pathLength[entry->path] < entry->index + 1)
- pathLength[entry->path] = entry->index + 1;
- }
+ ++pathLength[entry->path];
// Set path length
sTaxiPathNodesByPath.resize(pathCount); // 0 and some other indexes not used
for(uint32 i = 1; i < sTaxiPathNodesByPath.size(); ++i)
@@ -445,11 +419,8 @@ void LoadDBCStores(const std::string& dataPath)
sTaxiPathNodeStore.Clear();
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sTotemCategoryStore, dbcPath,"TotemCategory.dbc");
- LoadDBC(availableDbcLocales,bar,bad_dbc_files,sVehicleStore, dbcPath,"Vehicle.dbc");
- LoadDBC(availableDbcLocales,bar,bad_dbc_files,sVehicleSeatStore, dbcPath,"VehicleSeat.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sWorldMapAreaStore, dbcPath,"WorldMapArea.dbc");
LoadDBC(availableDbcLocales,bar,bad_dbc_files,sWorldSafeLocsStore, dbcPath,"WorldSafeLocs.dbc");
- LoadDBC(availableDbcLocales,bar,bad_dbc_files,sWorldMapOverlayStore, dbcPath,"WorldMapOverlay.dbc");
// error checks
if(bad_dbc_files.size() >= DBCFilesCount )
@@ -467,20 +438,20 @@ void LoadDBCStores(const std::string& dataPath)
exit(1);
}
- // check at up-to-date DBC files (54909 is last added spell in 3.0.1)
- // check at up-to-date DBC files (19162 is last added spell in abilities in 3.0.1)
- // check at up-to-date DBC files (619 is last map added in 3.0.1)
- // check at up-to-date DBC files (1361 is last gem property added in 3.0.1)
- // check at up-to-date DBC files (2425 is last item extended cost added in 3.0.1)
- // check at up-to-date DBC files (76 is last char title added in 3.0.1)
- // check at up-to-date DBC files (2311 is last area added in 3.0.1)
- if( !sSpellStore.LookupEntry(54909) ||
- !sSkillLineAbilityStore.LookupEntry(19162) ||
- !sMapStore.LookupEntry(619) ||
- !sGemPropertiesStore.LookupEntry(1361) ||
- !sItemExtendedCostStore.LookupEntry(2425) ||
- !sCharTitlesStore.LookupEntry(76) ||
- !sAreaStore.LookupEntry(2311) )
+ // check at up-to-date DBC files (53085 is last added spell in 2.4.3)
+ // check at up-to-date DBC files (17514 is last ID in SkillLineAbilities in 2.4.3)
+ // check at up-to-date DBC files (598 is last map added in 2.4.3)
+ // check at up-to-date DBC files (1127 is last gem property added in 2.4.3)
+ // check at up-to-date DBC files (2425 is last item extended cost added in 2.4.3)
+ // check at up-to-date DBC files (71 is last char title added in 2.4.3)
+ // check at up-to-date DBC files (1768 is last area added in 2.4.3)
+ if( !sSpellStore.LookupEntry(53085) ||
+ !sSkillLineAbilityStore.LookupEntry(17514) ||
+ !sMapStore.LookupEntry(598) ||
+ !sGemPropertiesStore.LookupEntry(1127) ||
+ !sItemExtendedCostStore.LookupEntry(2425) ||
+ !sCharTitlesStore.LookupEntry(71) ||
+ !sAreaStore.LookupEntry(1768) )
{
sLog.outError("\nYou have _outdated_ DBC files. Please extract correct versions from current using client.");
exit(1);
@@ -566,7 +537,7 @@ uint32 GetAreaFlagByMapId(uint32 mapid)
uint32 GetVirtualMapForMapAndZone(uint32 mapid, uint32 zoneId)
{
- if(mapid != 530 || mapid != 571) // speed for most cases
+ if(mapid != 530) // speed for most cases
return mapid;
if(WorldMapAreaEntry const* wma = sWorldMapAreaStore.LookupEntry(zoneId))
diff --git a/src/shared/Database/DBCStores.h b/src/shared/Database/DBCStores.h
index 8f53fef84ef..98a54fbeccf 100644
--- a/src/shared/Database/DBCStores.h
+++ b/src/shared/Database/DBCStores.h
@@ -132,12 +132,9 @@ class DBCStorage
StringPoolList m_stringPoolList;
};
-extern DBCStorage <AchievementEntry> sAchievementStore;
-extern DBCStorage <AchievementCriteriaEntry> sAchievementCriteriaStore;
extern DBCStorage <AreaTableEntry> sAreaStore;// recommend access using functions
extern DBCStorage <AreaTriggerEntry> sAreaTriggerStore;
extern DBCStorage <BankBagSlotPricesEntry> sBankBagSlotPricesStore;
-extern DBCStorage <BarberShopStyleEntry> sBarberShopStyleStore;
extern DBCStorage <BattlemasterListEntry> sBattlemasterListStore;
//extern DBCStorage <ChatChannelsEntry> sChatChannelsStore; -- accessed using function, no usable index
extern DBCStorage <CharStartOutfitEntry> sCharStartOutfitStore;
@@ -153,10 +150,7 @@ extern DBCStorage <EmotesTextEntry> sEmotesTextStore;
extern DBCStorage <FactionEntry> sFactionStore;
extern DBCStorage <FactionTemplateEntry> sFactionTemplateStore;
extern DBCStorage <GemPropertiesEntry> sGemPropertiesStore;
-extern DBCStorage <GlyphPropertiesEntry> sGlyphPropertiesStore;
-extern DBCStorage <GlyphSlotEntry> sGlyphSlotStore;
-extern DBCStorage <GtBarberShopCostBaseEntry> sGtBarberShopCostBaseStore;
extern DBCStorage <GtCombatRatingsEntry> sGtCombatRatingsStore;
extern DBCStorage <GtChanceToMeleeCritBaseEntry> sGtChanceToMeleeCritBaseStore;
extern DBCStorage <GtChanceToMeleeCritEntry> sGtChanceToMeleeCritStore;
@@ -177,8 +171,6 @@ extern DBCStorage <MailTemplateEntry> sMailTemplateStore;
extern DBCStorage <MapEntry> sMapStore;
extern DBCStorage <QuestSortEntry> sQuestSortStore;
extern DBCStorage <RandomPropertiesPointsEntry> sRandomPropertiesPointsStore;
-extern DBCStorage <ScalingStatDistributionEntry> sScalingStatDistributionStore;
-extern DBCStorage <ScalingStatValuesEntry> sScalingStatValuesStore;
extern DBCStorage <SkillLineEntry> sSkillLineStore;
extern DBCStorage <SkillLineAbilityEntry> sSkillLineAbilityStore;
extern DBCStorage <SoundEntriesEntry> sSoundEntriesStore;
@@ -191,11 +183,9 @@ extern SpellCategoryStore sSpellCategoryStore;
extern PetFamilySpellsStore sPetFamilySpellsStore;
extern DBCStorage <SpellRadiusEntry> sSpellRadiusStore;
extern DBCStorage <SpellRangeEntry> sSpellRangeStore;
-extern DBCStorage <SpellRuneCostEntry> sSpellRuneCostStore;
extern DBCStorage <SpellShapeshiftEntry> sSpellShapeshiftStore;
extern DBCStorage <SpellEntry> sSpellStore;
extern DBCStorage <StableSlotPricesEntry> sStableSlotPricesStore;
-//extern DBCStorage <SummonPropertiesEntry> sSummonPropertiesStore;
extern DBCStorage <TalentEntry> sTalentStore;
extern DBCStorage <TalentTabEntry> sTalentTabStore;
extern DBCStorage <TaxiNodesEntry> sTaxiNodesStore;
@@ -204,11 +194,8 @@ extern TaxiMask sTaxiNodesMask;
extern TaxiPathSetBySource sTaxiPathSetBySource;
extern TaxiPathNodesByPath sTaxiPathNodesByPath;
extern DBCStorage <TotemCategoryEntry> sTotemCategoryStore;
-extern DBCStorage <VehicleEntry> sVehicleStore;
-extern DBCStorage <VehicleSeatEntry> sVehicleSeatStore;
//extern DBCStorage <WorldMapAreaEntry> sWorldMapAreaStore; -- use Zone2MapCoordinates and Map2ZoneCoordinates
extern DBCStorage <WorldSafeLocsEntry> sWorldSafeLocsStore;
-extern DBCStorage <WorldMapOverlayEntry> sWorldMapOverlayStore;
void LoadDBCStores(const std::string& dataPath);
diff --git a/src/shared/Database/DBCStructure.h b/src/shared/Database/DBCStructure.h
index 1b406718f47..99d789f133f 100644
--- a/src/shared/Database/DBCStructure.h
+++ b/src/shared/Database/DBCStructure.h
@@ -37,507 +37,57 @@
#pragma pack(push,1)
#endif
-struct AchievementEntry
-{
- uint32 ID; // 0
- uint32 factionFlag; // 1 -1=all, 0=horde, 1=alliance
- uint32 mapID; // 2 -1=none
- //uint32 parentAchievement; // 3 its Achievement parent (can`t start while parent uncomplete, use its Criteria if don`t have own, use its progress on begin)
- //char *name[16]; // 4-19
- //uint32 name_flags; // 20
- //char *description[16]; // 21-36
- //uint32 desc_flags; // 37
- uint32 categoryId; // 38
- uint32 points; // 39 reward points
- //uint32 OrderInCategory; // 40
- uint32 flags; // 41
- //uint32 icon; // 42 icon (from SpellIcon.dbc)
- //char *titleReward[16]; // 43-58
- //uint32 titleReward_flags; // 59
- //uint32 count; // 60 - need this count Criteria for complete
- uint32 refAchievement; // 61 - related achievement?
-};
-
-struct AchievementCategoryEntry
-{
- uint32 ID; // 0
- uint32 parentCategory; // 1 -1 for main category
- //char *name[16]; // 2-17
- //uint32 name_flags; // 18
- //uint32 sortOrder; // 19
-};
-
-struct AchievementCriteriaEntry
-{
- uint32 ID; // 0
- uint32 referredAchievement; // 1
- uint32 requiredType; // 2
- union
- {
- // ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE = 0
- // TODO: also used for player deaths..
- struct
- {
- uint32 creatureID; // 3
- uint32 creatureCount; // 4
- } kill_creature;
-
- // ACHIEVEMENT_CRITERIA_TYPE_WIN_BG = 1
- // TODO: there are further criterias instead just winning
- struct
- {
- uint32 bgMapID; // 3
- uint32 winCount; // 4
- } win_bg;
-
- // ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL = 5
- struct
- {
- uint32 unused; // 3
- uint32 level; // 4
- } reach_level;
-
- // ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL = 7
- struct
- {
- uint32 skillID; // 3
- uint32 skillLevel; // 4
- } reach_skill_level;
-
- // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT = 8
- struct
- {
- uint32 linkedAchievement; // 3
- } complete_achievement;
-
- // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT = 9
- struct
- {
- uint32 unused; // 3
- uint32 totalQuestCount; // 4
- } complete_quest_count;
-
- // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY = 10
- struct
- {
- uint32 unused; // 3
- uint32 numberOfDays; // 4
- } complete_daily_quest_daily;
-
- // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE = 11
- struct
- {
- uint32 zoneID; // 3
- uint32 questCount; // 4
- } complete_quests_in_zone;
-
- // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST = 14
- struct
- {
- uint32 unused; // 3
- uint32 questCount; // 4
- } complete_daily_quest;
-
- // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND= 15
- struct
- {
- uint32 mapID; // 3
- } complete_battleground;
-
- // ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP= 16
- struct
- {
- uint32 mapID; // 3
- } death_at_map;
-
- // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID = 19
- struct
- {
- uint32 groupSize; // 3 can be 5, 10 or 25
- } complete_raid;
-
- // ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE = 20
- struct
- {
- uint32 creatureEntry; // 3
- } killed_by_creature;
-
- // ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING = 24
- struct
- {
- uint32 unused; // 3
- uint32 fallHeight; // 4
- } fall_without_dying;
-
- // ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM = 26
- struct
- {
- uint32 type; // 0 - fatigue, 1 - drowning, 2 - falling, 3 - ??, 5 - fire and lava
- } deaths;
-
- // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST = 27
- struct
- {
- uint32 questID; // 3
- uint32 questCount; // 4
- } complete_quest;
-
- // ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET = 28
- // ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2= 69
- struct
- {
- uint32 spellID; // 3
- uint32 spellCount; // 4
- } be_spell_target;
-
- // ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL= 29
- // ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2 = 110
- struct
- {
- uint32 spellID; // 3
- uint32 castCount; // 4
- } cast_spell;
-
- // ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA = 31
- struct
- {
- uint32 areaID; // 3 Reference to AreaTable.dbc
- uint32 killCount; // 4
- } honorable_kill_at_area;
-
- // ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA = 32
- struct
- {
- uint32 mapID; // 3 Reference to Map.dbc
- } win_arena;
-
- // ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA = 33
- struct
- {
- uint32 mapID; // 3 Reference to Map.dbc
- } play_arena;
-
- // ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL = 34
- struct
- {
- uint32 spellID; // 3 Reference to Map.dbc
- } learn_spell;
-
- // ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM = 36
- struct
- {
- uint32 itemID; // 3
- uint32 itemCount; // 4
- } own_item;
-
- // ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA = 37
- struct
- {
- uint32 unused; // 3
- uint32 count; // 4
- uint32 flag; // 5 4=in a row
- } win_rated_arena;
-
- // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING = 38
- struct
- {
- uint32 teamtype; // 3 {2,3,5}
- } highest_team_rating;
-
- // ACHIEVEMENT_CRITERIA_TYPE_REACH_TEAM_RATING = 39
- struct
- {
- uint32 teamtype; // 3 {2,3,5}
- uint32 teamrating; // 4
- } reach_team_rating;
-
- // ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL = 40
- struct
- {
- uint32 skillID; // 3
- uint32 skillLevel; // 4 apprentice=1, journeyman=2, expert=3, artisan=4, master=5, grand master=6
- } learn_skill_level;
-
- // ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM = 41
- struct
- {
- uint32 itemID; // 3
- uint32 itemCount; // 4
- } use_item;
-
- // ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM = 42
- struct
- {
- uint32 itemID; // 3
- uint32 itemCount; // 4
- } loot_item;
-
- // ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA = 43
- struct
- {
- // TODO: This rank is _NOT_ the index from AreaTable.dbc
- uint32 areaReference; // 3
- } explore_area;
-
- // ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK= 44
- struct
- {
- // TODO: This rank is _NOT_ the index from CharTitles.dbc
- uint32 rank; // 3
- } own_rank;
-
- // ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT= 45
- struct
- {
- uint32 unused; // 3
- uint32 numberOfSlots; // 4
- } buy_bank_slot;
-
- // ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION= 46
- struct
- {
- uint32 factionID; // 3
- uint32 reputationAmount; // 4 Total reputation amount, so 42000 = exalted
- } gain_reputation;
-
- // ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION= 47
- struct
- {
- uint32 unused; // 3
- uint32 numberOfExaltedFactions; // 4
- } gain_exalted_reputation;
-
- // ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP = 48
- struct
- {
- uint32 unused; // 3
- uint32 numberOfVisits; // 4
- } visit_barber;
-
- // ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM = 49
- // TODO: where is the required itemlevel stored?
- struct
- {
- uint32 itemSlot; // 3
- } equip_epic_item;
-
- // ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT= 50
- struct
- {
- uint32 rollValue; // 3
- uint32 count; // 4
- } roll_need_on_loot;
-
- // ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS = 52
- struct
- {
- uint32 classID; // 3
- uint32 count; // 4
- } hk_class;
-
- // ACHIEVEMENT_CRITERIA_TYPE_HK_RACE = 53
- struct
- {
- uint32 raceID; // 3
- uint32 count; // 4
- } hk_race;
-
- // ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE = 54
- // TODO: where is the information about the target stored?
- struct
- {
- uint32 emoteID; // 3
- } do_emote;
- // ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE = 13
- // ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE = 55
- // ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS = 56
- struct
- {
- uint32 unused; // 3
- uint32 count; // 4
- uint32 flag; // 5 =3 for battleground healing
- uint32 mapid; // 6
- } healing_done;
-
- // ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM = 57
- struct
- {
- uint32 itemID; // 3
- } equip_item;
-
-
- // ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY = 67
- struct
- {
- uint32 unused; // 3
- uint32 goldInCopper; // 4
- } loot_money;
-
- // ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT = 68
- struct
- {
- uint32 goEntry; // 3
- uint32 useCount; // 4
- } use_gameobject;
-
- // ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL= 70
- // TODO: are those special criteria stored in the dbc or do we have to add another sql table?
- struct
- {
- uint32 unused; // 3
- uint32 killCount; // 4
- } special_pvp_kill;
-
- // ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT = 72
- struct
- {
- uint32 goEntry; // 3
- uint32 lootCount; // 4
- } fish_in_gameobject;
-
- // ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS= 75
- struct
- {
- uint32 skillLine; // 3
- uint32 spellCount; // 4
- } learn_skilline_spell;
-
- // ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL = 76
- struct
- {
- uint32 unused; // 3
- uint32 duelCount; // 4
- } win_duel;
-
- // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_POWER = 96
- struct
- {
- uint32 powerType; // 3 mana=0, 1=rage, 3=energy, 6=runic power
- } highest_power;
-
- // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_STAT = 97
- struct
- {
- uint32 statType; // 3 4=spirit, 3=int, 2=stamina, 1=agi, 0=strength
- } highest_stat;
-
- // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER = 98
- struct
- {
- uint32 spellSchool; // 3
- } highest_spellpower;
-
- // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_RATING = 100
- struct
- {
- uint32 ratingType; // 3
- } highest_rating;
-
- // ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE = 109
- struct
- {
- uint32 lootType; // 3 3=fishing, 2=pickpocket, 4=disentchant
- uint32 lootTypeCount; // 4
- } loot_type;
-
- // ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE= 112
- struct
- {
- uint32 skillLine; // 3
- uint32 spellCount; // 4
- } learn_skill_line;
-
- // ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL = 113
- struct
- {
- uint32 unused; // 3
- uint32 killCount; // 4
- } honorable_kill;
-
- struct
- {
- uint32 field3; // 3 main requirement
- uint32 field4; // 4 main requirement count
- uint32 additionalRequirement1_type; // 5 additional requirement 1 type
- uint32 additionalRequirement1_value; // 6 additional requirement 1 value
- uint32 additionalRequirement2_type; // 7 additional requirement 2 type
- uint32 additionalRequirement2_value; // 8 additional requirement 1 value
- } raw;
- };
- //char* name[16]; // 9-24
- //uint32 name_flags; // 25
- uint32 completionFlag; // 26
- uint32 groupFlag; // 27
- //uint32 unk1; // 28
- uint32 timeLimit; // 29 time limit in seconds
- //uint32 showOrder; // 30 show order
-};
-
struct AreaTableEntry
{
- uint32 ID; // 0
- uint32 mapid; // 1
- uint32 zone; // 2 if 0 then it's zone, else it's zone id of this area
- uint32 exploreFlag; // 3, main index
- uint32 flags; // 4, unknown value but 312 for all cities
+ uint32 ID; // 0
+ uint32 mapid; // 1
+ uint32 zone; // 2 if 0 then it's zone, else it's zone id of this area
+ uint32 exploreFlag; // 3, main index
+ uint32 flags; // 4, unknown value but 312 for all cities
// 5-9 unused
- int32 area_level; // 10
- char* area_name[16]; // 11-26
+ int32 area_level; // 10
+ char* area_name[16]; // 11-26
// 27, string flags, unused
- uint32 team; // 28
+ uint32 team; // 28
};
struct AreaTriggerEntry
{
- uint32 id; // 0 m_ID
- uint32 mapid; // 1 m_ContinentID
- float x; // 2 m_x
- float y; // 3 m_y
- float z; // 4 m_z
- float radius; // 5 m_radius
- float box_x; // 6 m_box_length
- float box_y; // 7 m_box_width
- float box_z; // 8 m_box_heigh
- float box_orientation; // 9 m_box_yaw
+ uint32 id; // 0
+ uint32 mapid; // 1
+ float x; // 2
+ float y; // 3
+ float z; // 4
+ float radius; // 5
+ float box_x; // 6 extent x edge
+ float box_y; // 7 extent y edge
+ float box_z; // 8 extent z edge
+ float box_orientation; // 9 extent rotation by about z axis
};
struct BankBagSlotPricesEntry
{
- uint32 ID;
- uint32 price;
-};
-
-struct BarberShopStyleEntry
-{
- uint32 Id; // 0
- uint32 type; // 1 value 0 -> hair, value 2 -> facialhair
- //char* name[16]; // 2-17 name of hair style
- //uint32 name_flags; // 18
- //uint32 unk_name[16]; // 19-34, all empty
- //uint32 unk_flags; // 35
- //float CostMultiplier; // 36 values 1 and 0.75
- uint32 race; // 37 race
- uint32 gender; // 38 0 -> male, 1 -> female
- uint32 hair_id; // 39 real ID to hair/facial hair
+ uint32 ID;
+ uint32 price;
};
struct BattlemasterListEntry
{
- uint32 id; // 0
- int32 mapid[8]; // 1-8 mapid
- uint32 type; // 9 (3 - BG, 4 - arena)
- uint32 minlvl; // 10
- uint32 maxlvl; // 11
- uint32 maxplayersperteam; // 12
- // 13 minplayers
- // 14 0 or 9
- // 15
- char* name[16]; // 16-31
- // 32 string flag, unused
- // 33 unused
+ uint32 id; // 0
+ uint32 mapid[3]; // 1-3 mapid
+ // 4-8 unused
+ uint32 type; // 9 (3 - BG, 4 - arena)
+ uint32 minlvl; // 10
+ uint32 maxlvl; // 11
+ uint32 maxplayersperteam; // 12
+ // 13-14 unused
+ char* name[16]; // 15-30
+ // 31 string flag, unused
+ // 32 unused
};
-#define MAX_OUTFIT_ITEMS 24
+#define MAX_OUTFIT_ITEMS 12
+// #define MAX_OUTFIT_ITEMS 24 // 12->24 in 3.0.x
struct CharStartOutfitEntry
{
@@ -553,20 +103,20 @@ struct CharStartOutfitEntry
struct CharTitlesEntry
{
- uint32 ID; // 0, title ids, for example in Quest::GetCharTitleId()
+ uint32 ID; // 0, title ids, for example in Quest::GetCharTitleId()
//uint32 unk1; // 1 flags?
//char* name[16]; // 2-17, unused
// 18 string flag, unused
//char* name2[16]; // 19-34, unused
// 35 string flag, unused
- uint32 bit_index; // 36 used in PLAYER_CHOSEN_TITLE and 1<<index in PLAYER__FIELD_KNOWN_TITLES
+ uint32 bit_index; // 36 used in PLAYER_CHOSEN_TITLE and 1<<index in PLAYER__FIELD_KNOWN_TITLES
};
struct ChatChannelsEntry
{
- uint32 ChannelID; // 0
- uint32 flags; // 1
- char* pattern[16]; // 3-18
+ uint32 ChannelID; // 0
+ uint32 flags; // 1
+ char* pattern[16]; // 3-18
// 19 string flags, unused
//char* name[16]; // 20-35 unused
// 36 string flag, unused
@@ -574,10 +124,10 @@ struct ChatChannelsEntry
struct ChrClassesEntry
{
- uint32 ClassID; // 0
- // 1, unused
- uint32 powerType; // 2
- // 3-4, unused
+ uint32 ClassID; // 0
+ // 1-2, unused
+ uint32 powerType; // 3
+ // 4, unused
//char* name[16]; // 5-20 unused
char* name[16]; // 5-20 unused
// 21 string flag, unused
@@ -586,10 +136,8 @@ struct ChrClassesEntry
//char* nameNeutralGender[16]; // 38-53 unused, if different from base (male) case
// 54 string flag, unused
// 55, unused
- uint32 spellfamily; // 56
+ uint32 spellfamily; // 56
// 57, unused
- uint32 CinematicSequence; // 58 id from CinematicSequences.dbc
- uint32 addon; // 59 (0 - original race, 1 - tbc addon, ...)
};
struct ChrRacesEntry
@@ -603,7 +151,7 @@ struct ChrRacesEntry
// 6-7 unused
uint32 TeamID; // 8 (7-Alliance 1-Horde)
// 9-12 unused
- uint32 CinematicSequence; // 13 id from CinematicSequences.dbc
+ uint32 startmovie; // 13 id from CinematicCamera.dbc
char* name[16]; // 14-29 used for DBC language detection/selection
// 30 string flags, unused
//char* nameFemale[16]; // 31-46, if different from base (male) case
@@ -616,43 +164,30 @@ struct ChrRacesEntry
struct CreatureDisplayInfoEntry
{
- uint32 Displayid; // 0 m_ID
- // 1 m_modelID
- // 2 m_soundID
- // 3 m_extendedDisplayInfoID
- float scale; // 4 m_creatureModelScale
- // 5 m_creatureModelAlpha
- // 6-8 m_textureVariation[3]
- // 9 m_portraitTextureName
- // 10 m_sizeClass
- // 11 m_bloodID
- // 12 m_NPCSoundID
- // 13 m_particleColorID
- // 14 m_creatureGeosetData
- // 15 m_objectEffectPackageID
+ uint32 Displayid; // 0
+ // 1-3,unused
+ float scale; // 4
+ // 5-13,unused
};
struct CreatureFamilyEntry
{
- uint32 ID; // 0 m_ID
- float minScale; // 1 m_minScale
- uint32 minScaleLevel; // 2 m_minScaleLevel
- float maxScale; // 3 m_maxScale
- uint32 maxScaleLevel; // 4 m_maxScaleLevel
- uint32 skillLine[2]; // 5-6 m_skillLine
- uint32 petFoodMask; // 7 m_petFoodMask
- int32 petTalentType; // 8 m_petTalentType
- // 9 m_categoryEnumID
- char* Name[16]; // 10-25 m_name_lang
- // 26 string flags
- // 27 m_iconFile
+ uint32 ID; // 0
+ float minScale; // 1
+ uint32 minScaleLevel; // 2 0/1
+ float maxScale; // 3
+ uint32 maxScaleLevel; // 4 0/60
+ uint32 skillLine[2]; // 5-6
+ uint32 petFoodMask; // 7
+ char* Name[16]; // 8-23
+ // 24 string flags, unused
+ // 25 icon, unused
};
struct CreatureSpellDataEntry
{
- uint32 ID; // 0 m_ID
- //uint32 spellId[4]; // 1-4 m_spells[4]
- //uint32 availability[4]; // 4-7 m_availability[4]
+ uint32 ID; // 0
+ //uint32 spellId[4]; // 1-4 hunter pet learned spell (for later use)
};
struct DurabilityCostsEntry
@@ -669,35 +204,41 @@ struct DurabilityQualityEntry
struct EmotesTextEntry
{
- uint32 Id;
- uint32 textid;
+ uint32 Id;
+ uint32 textid;
};
struct FactionEntry
{
- uint32 ID; // 0 m_ID
- int32 reputationListID; // 1 m_reputationIndex
- uint32 BaseRepRaceMask[4]; // 2-5 m_reputationRaceMask
- uint32 BaseRepClassMask[4]; // 6-9 m_reputationClassMask
- int32 BaseRepValue[4]; // 10-13 m_reputationBase
- uint32 ReputationFlags[4]; // 14-17 m_reputationFlags
- uint32 team; // 18 m_parentFactionID
- char* name[16]; // 19-34 m_name_lang
- // 35 string flags
- //char* description[16]; // 36-51 m_description_lang
- // 52 string flags
+ uint32 ID; // 0
+ int32 reputationListID; // 1
+ uint32 BaseRepRaceMask[4]; // 2-5 Base reputation race masks (see enum Races)
+ uint32 BaseRepClassMask[4]; // 6-9 Base reputation class masks (see enum Classes)
+ int32 BaseRepValue[4]; // 10-13 Base reputation values
+ uint32 ReputationFlags[4]; // 14-17 Default flags to apply
+ uint32 team; // 18 enum Team
+ char* name[16]; // 19-34
+ // 35 string flags, unused
+ //char* description[16]; // 36-51 unused
+ // 52 string flags, unused
};
struct FactionTemplateEntry
{
- uint32 ID; // 0 m_ID
- uint32 faction; // 1 m_faction
- uint32 factionFlags; // 2 m_flags
- uint32 ourMask; // 3 m_factionGroup
- uint32 friendlyMask; // 4 m_friendGroup
- uint32 hostileMask; // 5 m_enemyGroup
- uint32 enemyFaction[4]; // 6 m_enemies[4]
- uint32 friendFaction[4]; // 10 m_friend[4]
+ uint32 ID; // 0
+ uint32 faction; // 1
+ uint32 factionFlags; // 2 specific flags for that faction
+ uint32 ourMask; // 3 if mask set (see FactionMasks) then faction included in masked team
+ uint32 friendlyMask; // 4 if mask set (see FactionMasks) then faction friendly to masked team
+ uint32 hostileMask; // 5 if mask set (see FactionMasks) then faction hostile to masked team
+ uint32 enemyFaction1; // 6
+ uint32 enemyFaction2; // 7
+ uint32 enemyFaction3; // 8
+ uint32 enemyFaction4; // 9
+ uint32 friendFaction1; // 10
+ uint32 friendFaction2; // 11
+ uint32 friendFaction3; // 12
+ uint32 friendFaction4; // 13
//------------------------------------------------------- end structure
// helpers
@@ -705,9 +246,9 @@ struct FactionTemplateEntry
{
if(ID == entry.ID)
return true;
- if(enemyFaction[0] == entry.faction || enemyFaction[1] == entry.faction || enemyFaction[2] == entry.faction || enemyFaction[3] == entry.faction )
+ if(enemyFaction1 == entry.faction || enemyFaction2 == entry.faction || enemyFaction3 == entry.faction || enemyFaction4 == entry.faction )
return false;
- if(friendFaction[0] == entry.faction || friendFaction[1] == entry.faction || friendFaction[2] == entry.faction || friendFaction[3] == entry.faction )
+ if(friendFaction1 == entry.faction || friendFaction2 == entry.faction || friendFaction3 == entry.faction || friendFaction4 == entry.faction )
return true;
return (friendlyMask & entry.ourMask) || (ourMask & entry.friendlyMask);
}
@@ -715,14 +256,14 @@ struct FactionTemplateEntry
{
if(ID == entry.ID)
return false;
- if(enemyFaction[0] == entry.faction || enemyFaction[1] == entry.faction || enemyFaction[2] == entry.faction || enemyFaction[3] == entry.faction )
+ if(enemyFaction1 == entry.faction || enemyFaction2 == entry.faction || enemyFaction3 == entry.faction || enemyFaction4 == entry.faction )
return true;
- if(friendFaction[0] == entry.faction || friendFaction[1] == entry.faction || friendFaction[2] == entry.faction || friendFaction[3] == entry.faction )
+ if(friendFaction1 == entry.faction || friendFaction2 == entry.faction || friendFaction3 == entry.faction || friendFaction4 == entry.faction )
return false;
return (hostileMask & entry.ourMask) != 0;
}
bool IsHostileToPlayers() const { return (hostileMask & FACTION_MASK_PLAYER) !=0; }
- bool IsNeutralToAll() const { return hostileMask == 0 && friendlyMask == 0 && enemyFaction[0]==0 && enemyFaction[1]==0 && enemyFaction[2]==0 && enemyFaction[3]==0; }
+ bool IsNeutralToAll() const { return hostileMask == 0 && friendlyMask == 0 && enemyFaction1==0 && enemyFaction2==0 && enemyFaction3==0 && enemyFaction4==0; }
bool IsContestedGuardFaction() const { return (factionFlags & FACTION_TEMPLATE_FLAG_CONTESTED_GUARD)!=0; }
};
@@ -733,29 +274,9 @@ struct GemPropertiesEntry
uint32 color;
};
-struct GlyphPropertiesEntry
-{
- uint32 Id;
- uint32 SpellId;
- uint32 TypeFlags;
- uint32 Unk1; // GlyphIconId (SpellIcon.dbc)
-};
-
-struct GlyphSlotEntry
-{
- uint32 Id;
- uint32 TypeFlags;
- uint32 Order;
-};
-
// All Gt* DBC store data for 100 levels, some by 100 per class/race
#define GT_MAX_LEVEL 100
-struct GtBarberShopCostBaseEntry
-{
- float cost;
-};
-
struct GtCombatRatingsEntry
{
float ratio;
@@ -803,38 +324,24 @@ struct GtRegenMPPerSptEntry
struct ItemEntry
{
- uint32 ID;
- //uint32 Class;
- //uint32 SubClass;
- //uint32 Unk0;
- //uint32 Material;
- uint32 DisplayId;
- uint32 InventoryType;
- uint32 Sheath;
+ uint32 ID;
+ uint32 DisplayId;
+ uint32 InventoryType;
+ uint32 Sheath;
};
struct ItemDisplayInfoEntry
{
- uint32 ID; // 0 m_ID
- // 1 m_modelName[2]
- // 2 m_modelTexture[2]
- // 3 m_inventoryIcon
- // 4 m_geosetGroup[3]
- // 5 m_flags
- // 6 m_spellVisualID
- // 7 m_groupSoundIndex
- // 8 m_helmetGeosetVis[2]
- // 9 m_texture[2]
- // 10 m_itemVisual[8]
- // 11 m_particleColorID
+ uint32 ID;
+ uint32 randomPropertyChance;
};
//struct ItemCondExtCostsEntry
//{
// uint32 ID;
-// uint32 condExtendedCost; // ItemPrototype::CondExtendedCost
-// uint32 itemextendedcostentry; // ItemPrototype::ExtendedCost
-// uint32 arenaseason; // arena season number(1-4)
+// uint32 condExtendedCost; // ItemPrototype::CondExtendedCost
+// uint32 itemextendedcostentry; // ItemPrototype::ExtendedCost
+// uint32 arenaseason; // arena season number(1-4)
//};
struct ItemExtendedCostEntry
@@ -849,42 +356,47 @@ struct ItemExtendedCostEntry
struct ItemRandomPropertiesEntry
{
- uint32 ID; // 0 m_ID
- //char* internalName // 1 m_Name
- uint32 enchant_id[5]; // 2-6 m_Enchantment
- //char* nameSuffix[16] // 7-22 m_name_lang
- // 23 name flags
+ uint32 ID; // 0
+ //char* internalName // 1 unused
+ uint32 enchant_id[3]; // 2-4
+ // 5-6 unused, 0 only values, reserved for additional enchantments?
+ //char* nameSuffix[16] // 7-22, unused
+ // 23 nameSufix flags, unused
};
struct ItemRandomSuffixEntry
{
- uint32 ID; // 0 m_ID
- //char* name[16] // 1-16 m_name_lang
- // 17, name flags
- // 18 m_internalName
- uint32 enchant_id[5]; // 19-21 m_enchantment
- uint32 prefix[5]; // 22-24 m_allocationPct
+ uint32 ID; // 0
+ //char* name[16] // 1-16 unused
+ // 17, name flags, unused
+ // 18 unused
+ uint32 enchant_id[3]; // 19-21
+ uint32 prefix[3]; // 22-24
};
struct ItemSetEntry
{
- //uint32 id // 0 m_ID
- char* name[16]; // 1-16 m_name_lang
+ //uint32 id // 0 item set ID
+ char* name[16]; // 1-16
// 17 string flags, unused
- //uint32 itemId[17]; // 18-34 m_itemID
- uint32 spells[8]; // 35-42 m_setSpellID
- uint32 items_to_triggerspell[8]; // 43-50 m_setThreshold
- uint32 required_skill_id; // 51 m_requiredSkill
- uint32 required_skill_value; // 52 m_requiredSkillRank
+ // 18-28 items from set, but not have all items listed, use ItemPrototype::ItemSet instead
+ // 29-34 unused
+ uint32 spells[8]; // 35-42
+ uint32 items_to_triggerspell[8]; // 43-50
+ uint32 required_skill_id; // 51
+ uint32 required_skill_value; // 52
};
struct LockEntry
{
- uint32 ID; // 0 m_ID
- uint32 Type[8]; // 1-8 m_Type
- uint32 Index[8]; // 9-16 m_Index
- uint32 Skill[8]; // 17-24 m_Skill
- //uint32 Action[8]; // 25-32 m_Action
+ uint32 ID; // 0
+ uint32 keytype[5]; // 1-5
+ // 6-8, not used
+ uint32 key[5]; // 9-13
+ // 14-16, not used
+ uint32 requiredminingskill; // 17
+ uint32 requiredlockskill; // 18
+ // 19-32, not used
};
struct MailTemplateEntry
@@ -897,34 +409,35 @@ struct MailTemplateEntry
struct MapEntry
{
- uint32 MapID; // 0
+ uint32 MapID; // 0
//char* internalname; // 1 unused
- uint32 map_type; // 2
- // 3 0 or 1 for battlegrounds (not arenas)
- char* name[16]; // 4-19
+ uint32 map_type; // 2
+ // 3 unused
+ char* name[16]; // 4-19
// 20 name flags, unused
- uint32 linked_zone; // 21 common zone for instance and continent map
- //char* hordeIntro[16]; // 23-37 text for PvP Zones
- // 38 intro text flags
- //char* allianceIntro[16]; // 39-54 text for PvP Zones
- // 55 intro text flags
- uint32 multimap_id; // 56
- // 57
- //chat* unknownText1[16]; // 58-73 unknown empty text fields, possible normal Intro text.
- // 74 text flags
- //chat* heroicIntroText[16]; // 75-90 heroic mode requirement text
- // 91 text flags
- //chat* unknownText2[16]; // 92-107 unknown empty text fields
- // 108 text flags
- int32 entrance_map; // 109 map_id of entrance map
- float entrance_x; // 110 entrance x coordinate (if exist single entry)
- float entrance_y; // 111 entrance y coordinate (if exist single entry)
- uint32 resetTimeRaid; // 112
- uint32 resetTimeHeroic; // 113
- // 114 all 0
- // 115 -1, 0 and 720
- uint32 addon; // 116 (0-original maps,1-tbc addon)
- // 117 some kind of time?
+ // 21-23 unused (something PvPZone related - levels?)
+ // 24-26
+ uint32 linked_zone; // 27 common zone for instance and continent map
+ //char* hordeIntro // 28-43 text for PvP Zones
+ // 44 intro text flags
+ //char* allianceIntro // 45-60 text for PvP Zones
+ // 46 intro text flags
+ // 47-61 not used
+ uint32 multimap_id; // 62
+ // 63-65 not used
+ //chat* unknownText1 // 66-81 unknown empty text fields, possible normal Intro text.
+ // 82 text flags
+ //chat* heroicIntroText // 83-98 heroic mode requirement text
+ // 99 text flags
+ //chat* unknownText2 // 100-115 unknown empty text fields
+ // 116 text flags
+ int32 entrance_map; // 117 map_id of entrance map
+ float entrance_x; // 118 entrance x coordinate (if exist single entry)
+ float entrance_y; // 119 entrance y coordinate (if exist single entry)
+ uint32 resetTimeRaid; // 120
+ uint32 resetTimeHeroic; // 121
+ // 122-123
+ uint32 addon; // 124 (0-original maps,1-tbc addon)
// Helpers
uint32 Expansion() const { return addon; }
@@ -945,18 +458,13 @@ struct MapEntry
MapID==568 || MapID==309 || MapID==209 || MapID==534 ||
MapID==560 || MapID==509 || MapID==269;
}
-
- bool IsContinent() const
- {
- return MapID == 0 || MapID == 1 || MapID == 530 || MapID == 571;
- }
};
struct QuestSortEntry
{
- uint32 id; // 0 m_ID
- //char* name[16]; // 1-16 m_SortName_lang
- // 17 name flags
+ uint32 id; // 0, sort id
+ //char* name[16]; // 1-16, unused
+ // 17 name flags, unused
};
struct RandomPropertiesPointsEntry
@@ -968,201 +476,172 @@ struct RandomPropertiesPointsEntry
uint32 UncommonPropertiesPoints[5]; // 12-16
};
-struct ScalingStatDistributionEntry
-{
- uint32 Id;
- uint32 StatMod[10];
- uint32 Modifier[10];
- uint32 MaxLevel;
-};
-
-struct ScalingStatValuesEntry
-{
- uint32 Id;
- uint32 Level;
- uint32 Multiplier[17];
-};
-
//struct SkillLineCategoryEntry{
-// uint32 id; // 0 m_ID
-// char* name[16]; // 1-17 m_name_lang
-// // 18 string flag
-// uint32 displayOrder; // 19 m_sortIndex
+// uint32 id; // 0 hidden key
+// char* name[16]; // 1 - 17 Category name
+// // 18 string flag
+// uint32 displayOrder; // Display order in character tab
//};
//struct SkillRaceClassInfoEntry{
-// uint32 id; // 0 m_ID
-// uint32 skillId; // 1 m_skillID
-// uint32 raceMask; // 2 m_raceMask
-// uint32 classMask; // 3 m_classMask
-// uint32 flags; // 4 m_flags
-// uint32 reqLevel; // 5 m_minLevel
-// uint32 skillTierId; // 6 m_skillTierID
-// uint32 skillCostID; // 7 m_skillCostIndex
+// uint32 id; // 0
+// uint32 skillId; // 1 present some refrences to unknown skill
+// uint32 raceMask; // 2
+// uint32 classMask; // 3
+// uint32 flags; // 4 mask for some thing
+// uint32 reqLevel; // 5
+// uint32 skillTierId; // 6
+// uint32 skillCostID; // 7
//};
//struct SkillTiersEntry{
-// uint32 id; // 0 m_ID
-// uint32 skillValue[16]; // 1-17 m_cost
-// uint32 maxSkillValue[16]; // 18-32 m_valueMax
+// uint32 id; // 0
+// uint32 skillValue[16]; // 1-17 unknown possibly add value on learn?
+// uint32 maxSkillValue[16]; // Max value for rank
//};
struct SkillLineEntry
{
- uint32 id; // 0 m_ID
- int32 categoryId; // 1 m_categoryID
- //uint32 skillCostID; // 2 m_skillCostsID
- char* name[16]; // 3-18 m_displayName_lang
- // 19 string flags
- //char* description[16]; // 20-35 m_description_lang
- // 36 string flags
- uint32 spellIcon; // 37 m_spellIconID
- //char* alternateVerb[16]; // 38-53 m_alternateVerb_lang
- // 54 string flags
- // 55 m_canLink
+ uint32 id; // 0
+ uint32 categoryId; // 1 (index from SkillLineCategory.dbc)
+ //uint32 skillCostID; // 2 not used
+ char* name[16]; // 3-18
+ // 19 string flags, not used
+ //char* description[16]; // 20-35, not used
+ // 36 string flags, not used
+ uint32 spellIcon; // 37
};
struct SkillLineAbilityEntry
{
- uint32 id; // 0 m_ID
- uint32 skillId; // 1 m_skillLine
- uint32 spellId; // 2 m_spell
- uint32 racemask; // 3 m_raceMask
- uint32 classmask; // 4 m_classMask
- //uint32 racemaskNot; // 5 m_excludeRace
- //uint32 classmaskNot; // 6 m_excludeClass
- uint32 req_skill_value; // 7 m_minSkillLineRank
- uint32 forward_spellid; // 8 m_supercededBySpell
- uint32 learnOnGetSkill; // 9 m_acquireMethod
- uint32 max_value; // 10 m_trivialSkillLineRankHigh
- uint32 min_value; // 11 m_trivialSkillLineRankLow
- //uint32 characterPoints[2]; // 12-13 m_characterPoints[2]
+ uint32 id; // 0, INDEX
+ uint32 skillId; // 1
+ uint32 spellId; // 2
+ uint32 racemask; // 3
+ uint32 classmask; // 4
+ //uint32 racemaskNot; // 5 always 0 in 2.4.2
+ //uint32 classmaskNot; // 6 always 0 in 2.4.2
+ uint32 req_skill_value; // 7 for trade skill.not for training.
+ uint32 forward_spellid; // 8
+ uint32 learnOnGetSkill; // 9 can be 1 or 2 for spells learned on get skill
+ uint32 max_value; // 10
+ uint32 min_value; // 11
+ // 12-13, unknown, always 0
+ uint32 reqtrainpoints; // 14
};
struct SoundEntriesEntry
{
- uint32 Id; // 0 m_ID
- //uint32 Type; // 1 m_soundType
- //char* InternalName; // 2 m_name
- //char* FileName[10]; // 3-12 m_File[10]
- //uint32 Unk13[10]; // 13-22 m_Freq[10]
- //char* Path; // 23 m_DirectoryBase
- // 24 m_volumeFloat
- // 25 m_flags
- // 26 m_minDistance
- // 27 m_distanceCutoff
- // 28 m_EAXDef
+ uint32 Id; // 0, sound id
+ //uint32 Type; // 1, sound type (10 generally for creature, etc)
+ //char* InternalName; // 2, internal name, for use in lookup command for example
+ //char* FileName[10]; // 3-12, file names
+ //uint32 Unk13[10]; // 13-22, linked with file names?
+ //char* Path; // 23
+ // 24-28, unknown
};
struct SpellEntry
{
- uint32 Id; // 0 m_ID
- uint32 Category; // 1 m_category
- uint32 Dispel; // 2 m_dispelType
- uint32 Mechanic; // 3 m_mechanic
- uint32 Attributes; // 4 m_attribute
- uint32 AttributesEx; // 5 m_attributesEx
- uint32 AttributesEx2; // 6 m_attributesExB
- uint32 AttributesEx3; // 7 m_attributesExC
- uint32 AttributesEx4; // 8 m_attributesExD
- uint32 AttributesEx5; // 9 m_attributesExE
- //uint32 AttributesEx6; // 10 m_attributesExF not used
- uint32 Stances; // 11 m_shapeshiftMask
- uint32 StancesNot; // 12 m_shapeshiftExclude
- uint32 Targets; // 13 m_targets
- uint32 TargetCreatureType; // 14 m_targetCreatureType
- uint32 RequiresSpellFocus; // 15 m_requiresSpellFocus
- uint32 FacingCasterFlags; // 16 m_facingCasterFlags
- uint32 CasterAuraState; // 17 m_casterAuraState
- uint32 TargetAuraState; // 18 m_targetAuraState
- uint32 CasterAuraStateNot; // 19 m_excludeCasterAuraState
- uint32 TargetAuraStateNot; // 20 m_excludeTargetAuraState
- //uint32 casterAuraSpell; // 21 m_casterAuraSpell not used
- //uint32 targetAuraSpell; // 22 m_targetAuraSpell not used
- //uint32 excludeCasterAuraSpell; // 23 m_excludeCasterAuraSpell not used
- //uint32 excludeTargetAuraSpell; // 24 m_excludeTargetAuraSpell not used
- uint32 CastingTimeIndex; // 25 m_castingTimeIndex
- uint32 RecoveryTime; // 26 m_recoveryTime
- uint32 CategoryRecoveryTime; // 27 m_categoryRecoveryTime
- uint32 InterruptFlags; // 28 m_interruptFlags
- uint32 AuraInterruptFlags; // 29 m_auraInterruptFlags
- uint32 ChannelInterruptFlags; // 30 m_channelInterruptFlags
- uint32 procFlags; // 31 m_procTypeMask
- uint32 procChance; // 32 m_procChance
- uint32 procCharges; // 33 m_procCharges
- uint32 maxLevel; // 34 m_maxLevel
- uint32 baseLevel; // 35 m_baseLevel
- uint32 spellLevel; // 36 m_spellLevel
- uint32 DurationIndex; // 37 m_durationIndex
- uint32 powerType; // 38 m_powerType
- uint32 manaCost; // 39 m_manaCost
- uint32 manaCostPerlevel; // 40 m_manaCostPerLevel
- uint32 manaPerSecond; // 41 m_manaPerSecond
- uint32 manaPerSecondPerLevel; // 42 m_manaPerSecondPerLeve
- uint32 rangeIndex; // 43 m_rangeIndex
- float speed; // 44 m_speed
- //uint32 modalNextSpell; // 45 m_modalNextSpell not used
- uint32 StackAmount; // 46 m_cumulativeAura
- uint32 Totem[2]; // 47-48 m_totem
- int32 Reagent[8]; // 49-56 m_reagent
- uint32 ReagentCount[8]; // 57-64 m_reagentCount
- int32 EquippedItemClass; // 65 m_equippedItemClass (value)
- int32 EquippedItemSubClassMask; // 66 m_equippedItemSubclass (mask)
- int32 EquippedItemInventoryTypeMask; // 67 m_equippedItemInvTypes (mask)
- uint32 Effect[3]; // 68-70 m_effect
- int32 EffectDieSides[3]; // 71-73 m_effectDieSides
- uint32 EffectBaseDice[3]; // 74-76 m_effectBaseDice
- float EffectDicePerLevel[3]; // 77-79 m_effectDicePerLevel
- float EffectRealPointsPerLevel[3]; // 80-82 m_effectRealPointsPerLevel
- int32 EffectBasePoints[3]; // 83-85 m_effectBasePoints (don't must be used in spell/auras explicitly, must be used cached Spell::m_currentBasePoints)
- uint32 EffectMechanic[3]; // 86-88 m_effectMechanic
- uint32 EffectImplicitTargetA[3]; // 89-91 m_implicitTargetA
- uint32 EffectImplicitTargetB[3]; // 92-94 m_implicitTargetB
- uint32 EffectRadiusIndex[3]; // 95-97 m_effectRadiusIndex - spellradius.dbc
- uint32 EffectApplyAuraName[3]; // 98-100 m_effectAura
- uint32 EffectAmplitude[3]; // 101-103 m_effectAuraPeriod
- float EffectMultipleValue[3]; // 104-106 m_effectAmplitude
- uint32 EffectChainTarget[3]; // 107-109 m_effectChainTargets
- uint32 EffectItemType[3]; // 110-112 m_effectItemType
- int32 EffectMiscValue[3]; // 113-115 m_effectMiscValue
- int32 EffectMiscValueB[3]; // 116-118 m_effectMiscValueB
- uint32 EffectTriggerSpell[3]; // 119-121 m_effectTriggerSpell
- float EffectPointsPerComboPoint[3]; // 122-124 m_effectPointsPerCombo
- uint32 EffectSpellClassMaskA[3]; // 125-127 m_effectSpellClassMaskA
- uint32 EffectSpellClassMaskB[3]; // 128-130 m_effectSpellClassMaskB
- uint32 EffectSpellClassMaskC[3]; // 131-133 m_effectSpellClassMaskC
- uint32 SpellVisual[2]; // 134-135 m_spellVisualID
- uint32 SpellIconID; // 136 m_spellIconID
- uint32 activeIconID; // 137 m_activeIconID
- //uint32 spellPriority; // 138 m_spellPriority not used
- char* SpellName[16]; // 139-154 m_name_lang
- //uint32 SpellNameFlag; // 155 not used
- char* Rank[16]; // 156-171 m_nameSubtext_lang
- //uint32 RankFlags; // 172 not used
- //char* Description[16]; // 173-188 m_description_lang not used
- //uint32 DescriptionFlags; // 189 not used
- //char* ToolTip[16]; // 190-205 m_auraDescription_lang not used
- //uint32 ToolTipFlags; // 206 not used
- uint32 ManaCostPercentage; // 207 m_manaCostPct
- uint32 StartRecoveryCategory; // 208 m_startRecoveryCategory
- uint32 StartRecoveryTime; // 209 m_startRecoveryTime
- uint32 MaxTargetLevel; // 210 m_maxTargetLevel
- uint32 SpellFamilyName; // 211 m_spellClassSet
- uint64 SpellFamilyFlags; // 212-213 m_spellClassMask NOTE: size is 12 bytes!!!
- uint32 SpellFamilyFlags2; // 214 addition to m_spellClassMask
- uint32 MaxAffectedTargets; // 215 m_maxTargets
- uint32 DmgClass; // 216 m_defenseType
- uint32 PreventionType; // 217 m_preventionType
- //uint32 StanceBarOrder; // 218 m_stanceBarOrder not used
- float DmgMultiplier[3]; // 219-221 m_effectChainAmplitude
- //uint32 MinFactionId; // 222 m_minFactionID not used
- //uint32 MinReputation; // 223 m_minReputation not used
- //uint32 RequiredAuraVision; // 224 m_requiredAuraVision not used
- uint32 TotemCategory[2]; // 225-226 m_requiredTotemCategoryID
- int32 AreaId; // 227 m_requiredAreasID
- uint32 SchoolMask; // 228 m_schoolMask
- uint32 runeCostID; // 229 m_runeCostID
- //uint32 spellMissileID; // 230 m_spellMissileID not used
+ uint32 Id; // 0 normally counted from 0 field (but some tools start counting from 1, check this before tool use for data view!)
+ uint32 Category; // 1
+ //uint32 castUI // 2 not used
+ uint32 Dispel; // 3
+ uint32 Mechanic; // 4
+ uint32 Attributes; // 5
+ uint32 AttributesEx; // 6
+ uint32 AttributesEx2; // 7
+ uint32 AttributesEx3; // 8
+ uint32 AttributesEx4; // 9
+ uint32 AttributesEx5; // 10
+ //uint32 AttributesEx6; // 11 not used
+ uint32 Stances; // 12
+ uint32 StancesNot; // 13
+ uint32 Targets; // 14
+ uint32 TargetCreatureType; // 15
+ uint32 RequiresSpellFocus; // 16
+ uint32 FacingCasterFlags; // 17
+ uint32 CasterAuraState; // 18
+ uint32 TargetAuraState; // 19
+ uint32 CasterAuraStateNot; // 20
+ uint32 TargetAuraStateNot; // 21
+ uint32 CastingTimeIndex; // 22
+ uint32 RecoveryTime; // 23
+ uint32 CategoryRecoveryTime; // 24
+ uint32 InterruptFlags; // 25
+ uint32 AuraInterruptFlags; // 26
+ uint32 ChannelInterruptFlags; // 27
+ uint32 procFlags; // 28
+ uint32 procChance; // 29
+ uint32 procCharges; // 30
+ uint32 maxLevel; // 31
+ uint32 baseLevel; // 32
+ uint32 spellLevel; // 33
+ uint32 DurationIndex; // 34
+ uint32 powerType; // 35
+ uint32 manaCost; // 36
+ uint32 manaCostPerlevel; // 37
+ uint32 manaPerSecond; // 38
+ uint32 manaPerSecondPerLevel; // 39
+ uint32 rangeIndex; // 40
+ float speed; // 41
+ //uint32 modalNextSpell; // 42
+ uint32 StackAmount; // 43
+ uint32 Totem[2]; // 44-45
+ int32 Reagent[8]; // 46-53
+ uint32 ReagentCount[8]; // 54-61
+ int32 EquippedItemClass; // 62 (value)
+ int32 EquippedItemSubClassMask; // 63 (mask)
+ int32 EquippedItemInventoryTypeMask; // 64 (mask)
+ uint32 Effect[3]; // 65-67
+ int32 EffectDieSides[3]; // 68-70
+ uint32 EffectBaseDice[3]; // 71-73
+ float EffectDicePerLevel[3]; // 74-76
+ float EffectRealPointsPerLevel[3]; // 77-79
+ int32 EffectBasePoints[3]; // 80-82 (don't must be used in spell/auras explicitly, must be used cached Spell::m_currentBasePoints)
+ uint32 EffectMechanic[3]; // 83-85
+ uint32 EffectImplicitTargetA[3]; // 86-88
+ uint32 EffectImplicitTargetB[3]; // 89-91
+ uint32 EffectRadiusIndex[3]; // 92-94 - spellradius.dbc
+ uint32 EffectApplyAuraName[3]; // 95-97
+ uint32 EffectAmplitude[3]; // 98-100
+ float EffectMultipleValue[3]; // 101-103
+ uint32 EffectChainTarget[3]; // 104-106
+ uint32 EffectItemType[3]; // 107-109
+ int32 EffectMiscValue[3]; // 110-112
+ int32 EffectMiscValueB[3]; // 113-115
+ uint32 EffectTriggerSpell[3]; // 116-118
+ float EffectPointsPerComboPoint[3]; // 119-121
+ uint32 SpellVisual; // 122
+ // 123 not used
+ uint32 SpellIconID; // 124
+ uint32 activeIconID; // 125
+ //uint32 spellPriority; // 126
+ char* SpellName[16]; // 127-142
+ //uint32 SpellNameFlag; // 143
+ char* Rank[16]; // 144-159
+ //uint32 RankFlags; // 160
+ //char* Description[16]; // 161-176 not used
+ //uint32 DescriptionFlags; // 177 not used
+ //char* ToolTip[16]; // 178-193 not used
+ //uint32 ToolTipFlags; // 194 not used
+ uint32 ManaCostPercentage; // 195
+ uint32 StartRecoveryCategory; // 196
+ uint32 StartRecoveryTime; // 197
+ uint32 MaxTargetLevel; // 198
+ uint32 SpellFamilyName; // 199
+ uint64 SpellFamilyFlags; // 200+201
+ uint32 MaxAffectedTargets; // 202
+ uint32 DmgClass; // 203 defenseType
+ uint32 PreventionType; // 204
+ //uint32 StanceBarOrder; // 205 not used
+ float DmgMultiplier[3]; // 206-208
+ //uint32 MinFactionId; // 209 not used, and 0 in 2.4.2
+ //uint32 MinReputation; // 210 not used, and 0 in 2.4.2
+ //uint32 RequiredAuraVision; // 211 not used
+ uint32 TotemCategory[2]; // 212-213
+ uint32 AreaId; // 214
+ uint32 SchoolMask; // 215 school mask
private:
// prevent creating custom entries (copy data from original in fact)
@@ -1211,16 +690,6 @@ struct SpellRangeEntry
uint32 type;
};
-struct SpellRuneCostEntry
-{
- uint32 ID; // 0
- uint32 RuneCost[3]; // 1-3 (0=blood, 1=frost, 2=unholy)
- uint32 runePowerGain; // 4
-
- bool NoRuneCost() const { return RuneCost[0] == 0 && RuneCost[1] == 0 && RuneCost[2] == 0; }
- bool NoRunicPowerGain() const { return runePowerGain == 0; }
-};
-
struct SpellShapeshiftEntry
{
uint32 ID; // 0
@@ -1253,31 +722,26 @@ struct SpellDurationEntry
struct SpellItemEnchantmentEntry
{
- uint32 ID; // 0 m_ID
- //uint32 charges; // 1 m_charges
- uint32 type[3]; // 2-4 m_effect[3]
- uint32 amount[3]; // 5-7 m_effectPointsMin[3]
- //uint32 amount2[3] // 8-10 m_effectPointsMax[3]
- uint32 spellid[3]; // 11-13 m_effectArg[3]
- char* description[16]; // 14-30 m_name_lang[16]
- //uint32 descriptionFlags; // 31 name flags
- uint32 aura_id; // 32 m_itemVisual
- uint32 slot; // 33 m_flags
- uint32 GemID; // 34 m_src_itemID
- uint32 EnchantmentCondition; // 35 m_condition_id
- //uint32 requiredSkill; // 36 m_requiredSkillID
- //uint32 requiredSkillValue; // 37 m_requiredSkillRank
+ uint32 ID; // 0
+ uint32 type[3]; // 1-3
+ uint32 amount[3]; // 4-6
+ //uint32 amount2[3] // 7-9 always same as similar `amount` value
+ uint32 spellid[3]; // 10-12
+ char* description[16]; // 13-29
+ // 30 description flags
+ uint32 aura_id; // 31
+ uint32 slot; // 32
+ uint32 GemID; // 33
+ uint32 EnchantmentCondition; // 34
};
struct SpellItemEnchantmentConditionEntry
{
- uint32 ID; // 0 m_ID
- uint8 Color[5]; // 1-5 m_lt_operandType[5]
- //uint32 LT_Operand[5]; // 6-10 m_lt_operand[5]
- uint8 Comparator[5]; // 11-15 m_operator[5]
- uint8 CompareColor[5]; // 15-20 m_rt_operandType[5]
- uint32 Value[5]; // 21-25 m_rt_operand[5]
- //uint8 Logic[5] // 25-30 m_logic[5]
+ uint32 ID;
+ uint8 Color[5];
+ uint8 Comparator[5];
+ uint8 CompareColor[5];
+ uint32 Value[5];
};
struct StableSlotPricesEntry
@@ -1286,16 +750,6 @@ struct StableSlotPricesEntry
uint32 Price;
};
-/*struct SummonPropertiesEntry
-{
- uint32 Id; // 0
- uint32 Group; // 1, 0 - can't be controlled?, 1 - something guardian?, 2 - pet?, 3 - something controllable?, 4 - taxi/mount?
- uint32 Unk2; // 2, 14 rows > 0
- uint32 Type; // 3, see enum
- uint32 Slot; // 4, 0-6
- uint32 Flags; // 5
-};*/
-
struct TalentEntry
{
uint32 TalentID; // 0
@@ -1307,59 +761,53 @@ struct TalentEntry
uint32 DependsOn; // 13 index in Talent.dbc (TalentEntry)
// 14-15 not used
uint32 DependsOnRank; // 16
- // 17-18 not used
- //uint32 unk1; // 19, 0 or 1
- //uint32 unk2; // 20, all 0
- //uint32 unkFlags1; // 21, related to hunter pet talents
- //uint32 unkFlags2; // 22, related to hunter pet talents
+ // 17-19 not used
+ uint32 DependsOnSpell; // 20 req.spell
};
struct TalentTabEntry
{
- uint32 TalentTabID; // 0
- //char* name[16]; // 1-16, unused
+ uint32 TalentTabID; // 0
+ //char* name[16]; // 1-16, unused
//uint32 nameFlags; // 17, unused
//unit32 spellicon; // 18
// 19 not used
- uint32 ClassMask; // 20
- uint32 petTalentMask; // 21
- uint32 tabpage; // 22
- //char* internalname; // 23
+ uint32 ClassMask; // 20
+ uint32 tabpage; // 21
+ //char* internalname; // 22
};
struct TaxiNodesEntry
{
- uint32 ID; // 0 m_ID
- uint32 map_id; // 1 m_ContinentID
- float x; // 2 m_x
- float y; // 3 m_y
- float z; // 4 m_z
- //char* name[16]; // 5-21 m_Name_lang
- // 22 string flags
- uint32 MountCreatureID[2]; // 23-24 m_MountCreatureID[2]
+ uint32 ID; // 0
+ uint32 map_id; // 1
+ float x; // 2
+ float y; // 3
+ float z; // 4
+ //char* name[16]; // 5-21
+ // 22 string flags, unused
+ uint32 horde_mount_type; // 23
+ uint32 alliance_mount_type; // 24
};
struct TaxiPathEntry
{
- uint32 ID; // 0 m_ID
- uint32 from; // 1 m_FromTaxiNode
- uint32 to; // 2 m_ToTaxiNode
- uint32 price; // 3 m_Cost
+ uint32 ID;
+ uint32 from;
+ uint32 to;
+ uint32 price;
};
struct TaxiPathNodeEntry
{
- // 0 m_ID
- uint32 path; // 1 m_PathID
- uint32 index; // 2 m_NodeIndex
- uint32 mapid; // 3 m_ContinentID
- float x; // 4 m_LocX
- float y; // 5 m_LocY
- float z; // 6 m_LocZ
- uint32 actionFlag; // 7 m_flags
- uint32 delay; // 8 m_delay
- // 9 m_arrivalEventID
- // 10 m_departureEventID
+ uint32 path;
+ uint32 index;
+ uint32 mapid;
+ float x;
+ float y;
+ float z;
+ uint32 actionFlag;
+ uint32 delay;
};
struct TotemCategoryEntry
@@ -1371,100 +819,16 @@ struct TotemCategoryEntry
uint32 categoryMask; // 19 (compatibility mask for same type: different for totems, compatible from high to low for rods)
};
-struct VehicleEntry
-{
- uint32 m_ID; // 0
- uint32 m_flags; // 1
- float m_turnSpeed; // 2
- float m_pitchSpeed; // 3
- float m_pitchMin; // 4
- float m_pitchMax; // 5
- uint32 m_seatID[8]; // 6-13
- float m_mouseLookOffsetPitch; // 14
- float m_cameraFadeDistScalarMin; // 15
- float m_cameraFadeDistScalarMax; // 16
- float m_cameraPitchOffset; // 17
- int m_powerType[3]; // 18-20
- int m_powerToken[3]; // 21-23
- float m_facingLimitRight; // 24
- float m_facingLimitLeft; // 25
- float m_msslTrgtTurnLingering; // 26
- float m_msslTrgtPitchLingering; // 27
- float m_msslTrgtMouseLingering; // 28
- float m_msslTrgtEndOpacity; // 29
- float m_msslTrgtArcSpeed; // 30
- float m_msslTrgtArcRepeat; // 31
- float m_msslTrgtArcWidth; // 32
- float m_msslTrgtImpactRadius[2]; // 33-34
- char* m_msslTrgtArcTexture; // 35
- char* m_msslTrgtImpactTexture; // 36
- char* m_msslTrgtImpactModel[2]; // 37-38
- float m_cameraYawOffset; // 39
- uint32 m_uiLocomotionType; // 40
- float m_msslTrgtImpactTexRadius; // 41
- uint32 m_uiSeatIndicatorType; // 42
-};
-
-struct VehicleSeatEntry
-{
- uint32 m_ID; // 0
- uint32 m_flags; // 1
- int32 m_attachmentID; // 2
- float m_attachmentOffsetX; // 3
- float m_attachmentOffsetY; // 4
- float m_attachmentOffsetZ; // 5
- float m_enterPreDelay; // 6
- float m_enterSpeed; // 7
- float m_enterGravity; // 8
- float m_enterMinDuration; // 9
- float m_enterMaxDuration; // 10
- float m_enterMinArcHeight; // 11
- float m_enterMaxArcHeight; // 12
- int32 m_enterAnimStart; // 13
- int32 m_enterAnimLoop; // 14
- int32 m_rideAnimStart; // 15
- int32 m_rideAnimLoop; // 16
- int32 m_rideUpperAnimStart; // 17
- int32 m_rideUpperAnimLoop; // 18
- float m_exitPreDelay; // 19
- float m_exitSpeed; // 20
- float m_exitGravity; // 21
- float m_exitMinDuration; // 22
- float m_exitMaxDuration; // 23
- float m_exitMinArcHeight; // 24
- float m_exitMaxArcHeight; // 25
- int32 m_exitAnimStart; // 26
- int32 m_exitAnimLoop; // 27
- int32 m_exitAnimEnd; // 28
- float m_passengerYaw; // 29
- float m_passengerPitch; // 30
- float m_passengerRoll; // 31
- int32 m_passengerAttachmentID; // 32
- int32 m_vehicleEnterAnim; // 33
- int32 m_vehicleExitAnim; // 34
- int32 m_vehicleRideAnimLoop; // 35
- int32 m_vehicleEnterAnimBone; // 36
- int32 m_vehicleExitAnimBone; // 37
- int32 m_vehicleRideAnimLoopBone; // 38
- float m_vehicleEnterAnimDelay; // 39
- float m_vehicleExitAnimDelay; // 40
- uint32 m_vehicleAbilityDisplay; // 41
- uint32 m_enterUISoundID; // 42
- uint32 m_exitUISoundID; // 43
- int32 m_uiSkin; // 44
- uint32 m_flagsB; // 45
-};
-
struct WorldMapAreaEntry
{
- //uint32 ID; // 0
- uint32 map_id; // 1
- uint32 area_id; // 2 index (continent 0 areas ignored)
- //char* internal_name // 3
- float y1; // 4
- float y2; // 5
- float x1; // 6
- float x2; // 7
+ //uint32 ID; // 0
+ uint32 map_id; // 1
+ uint32 area_id; // 2 index (continent 0 areas ignored)
+ //char* internal_name // 3
+ float y1; // 4
+ float y2; // 5
+ float x1; // 6
+ float x2; // 7
int32 virtual_map_id; // 8 -1 (map_id have correct map) other: virtual map where zone show (map_id - where zone in fact internally)
};
@@ -1479,12 +843,6 @@ struct WorldSafeLocsEntry
// 21 name flags, unused
};
-struct WorldMapOverlayEntry
-{
- uint32 ID; // 0
- uint32 areatableID; // 2
-};
-
// GCC have alternative #pragma pack() syntax and old gcc version not support pack(pop), also any gcc version not support it at some platform
#if defined( __GNUC__ )
#pragma pack()
@@ -1530,6 +888,6 @@ struct TaxiPathNode
typedef std::vector<TaxiPathNode> TaxiPathNodeList;
typedef std::vector<TaxiPathNodeList> TaxiPathNodesByPath;
-#define TaxiMaskSize 12
+#define TaxiMaskSize 16
typedef uint32 TaxiMask[TaxiMaskSize];
#endif
diff --git a/src/shared/Database/DBCfmt.cpp b/src/shared/Database/DBCfmt.cpp
index b6dc08a0e91..57a81921d62 100644
--- a/src/shared/Database/DBCfmt.cpp
+++ b/src/shared/Database/DBCfmt.cpp
@@ -18,22 +18,21 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-const char Achievementfmt[]="niixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiixixxxxxxxxxxxxxxxxxxxi";
-const char AchievementCriteriafmt[]="niiiiiiiixxxxxxxxxxxxxxxxxiixix";
-const char AreaTableEntryfmt[]="iiinixxxxxissssssssssssssssxixxxxxxx";
+const char AreaTableEntryfmt[]="iiinixxxxxissssssssssssssssxixxxxxx";
const char AreaTriggerEntryfmt[]="niffffffff";
const char BankBagSlotPricesEntryfmt[]="ni";
-const char BarberShopStyleEntryfmt[]="nixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiii";
-const char BattlemasterListEntryfmt[]="niiiiiiiiiiiixxxssssssssssssssssxx";
-const char CharStartOutfitEntryfmt[]="diiiiiiiiiiiiiiiiiiiiiiiiixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
+const char BattlemasterListEntryfmt[]="niiixxxxxiiiixxssssssssssssssssxx";
+const char CharStartOutfitEntryfmt[]="diiiiiiiiiiiiixxxxxxxxxxxxxxxxxxxxxxxxxxx";
+// 3*12 new item fields in 3.0.x
+//const char CharStartOutfitEntryfmt[]="diiiiiiiiiiiiiiiiiiiiiiiiixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const char CharTitlesEntryfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxi";
const char ChatChannelsEntryfmt[]="iixssssssssssssssssxxxxxxxxxxxxxxxxxx";
// ChatChannelsEntryfmt, index not used (more compact store)
-//const char ChrClassesEntryfmt[]="nxixssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxix";
-const char ChrClassesEntryfmt[]="nxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxixii";
+//const char ChrClassesEntryfmt[]="nxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxix";
+const char ChrClassesEntryfmt[]="nxixssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxix";
const char ChrRacesEntryfmt[]="nxixiixxixxxxissssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxi";
-const char CreatureDisplayInfofmt[]="nxxxfxxxxxxxxxxx";
-const char CreatureFamilyfmt[]="nfifiiiiixssssssssssssssssxx";
+const char CreatureDisplayInfofmt[]="nxxxfxxxxxxxxx";
+const char CreatureFamilyfmt[]="nfifiiiissssssssssssssssxx";
const char CreatureSpellDatafmt[]="nxxxxxxxx";
const char DurabilityCostsfmt[]="niiiiiiiiiiiiiiiiiiiiiiiiiiiii";
const char DurabilityQualityfmt[]="nf";
@@ -41,9 +40,6 @@ const char EmoteEntryfmt[]="nxixxxxxxxxxxxxxxxx";
const char FactionEntryfmt[]="niiiiiiiiiiiiiiiiiissssssssssssssssxxxxxxxxxxxxxxxxxx";
const char FactionTemplateEntryfmt[]="niiiiiiiiiiiii";
const char GemPropertiesEntryfmt[]="nixxi";
-const char GlyphPropertiesfmt[]="niii";
-const char GlyphSlotfmt[]="nii";
-const char GtBarberShopCostBasefmt[]="f";
const char GtCombatRatingsfmt[]="f";
const char GtChanceToMeleeCritBasefmt[]="f";
const char GtChanceToMeleeCritfmt[]="f";
@@ -53,44 +49,36 @@ const char GtOCTRegenHPfmt[]="f";
//const char GtOCTRegenMPfmt[]="f";
const char GtRegenHPPerSptfmt[]="f";
const char GtRegenMPPerSptfmt[]="f";
-const char Itemfmt[]="nxxxxiii";
+const char Itemfmt[]="niii";
//const char ItemDisplayTemplateEntryfmt[]="nxxxxxxxxxxixxxxxxxxxxx";
//const char ItemCondExtCostsEntryfmt[]="xiii";
-const char ItemExtendedCostEntryfmt[]="niiiiiiiiiiiiix";
-const char ItemRandomPropertiesfmt[]="nxiiiiixxxxxxxxxxxxxxxxx";
-const char ItemRandomSuffixfmt[]="nxxxxxxxxxxxxxxxxxxiiiiiiiiii";
+const char ItemExtendedCostEntryfmt[]="niiiiiiiiiiiii";
+const char ItemRandomPropertiesfmt[]="nxiiixxxxxxxxxxxxxxxxxxx";
+const char ItemRandomSuffixfmt[]="nxxxxxxxxxxxxxxxxxxiiiiii";
const char ItemSetEntryfmt[]="dssssssssssssssssxxxxxxxxxxxxxxxxxxiiiiiiiiiiiiiiiiii";
-const char LockEntryfmt[]="niiiiiiiiiiiiiiiiiiiiiiiixxxxxxxx";
+const char LockEntryfmt[]="niiiiixxxiiiiixxxiixxxxxxxxxxxxxx";
const char MailTemplateEntryfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
-const char MapEntryfmt[]="nxixssssssssssssssssxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiffiixxix";
+const char MapEntryfmt[]="nxixssssssssssssssssxxxxxxxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiffiixxi";
const char QuestSortEntryfmt[]="nxxxxxxxxxxxxxxxxx";
const char RandomPropertiesPointsfmt[]="niiiiiiiiiiiiiii";
-const char ScalingStatDistributionfmt[]="niiiiiiiiiiiiiiiiiiiii";
-const char ScalingStatValuesfmt[]="iniiiiiiiiiiiiiiiii";
-const char SkillLinefmt[]="nixssssssssssssssssxxxxxxxxxxxxxxxxxxixxxxxxxxxxxxxxxxxx";
-const char SkillLineAbilityfmt[]="niiiixxiiiiixx";
+const char SkillLinefmt[]="nixssssssssssssssssxxxxxxxxxxxxxxxxxxi";
+const char SkillLineAbilityfmt[]="niiiixxiiiiixxi";
const char SoundEntriesfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const char SpellCastTimefmt[]="nixx";
const char SpellDurationfmt[]="niii";
-const char SpellEntryfmt[]="niiiiiiiiixiiiiiiiiiixxxxiiiiiiiiiiiiiiiiiiifxiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffffffiiiiiiiiiiiiiiiiiiiiifffiiiiiiiiiiiiiiifffiiiiiiiiiiiiixssssssssssssssssxssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiiiiiiiiiiixfffxxxiiiiix";
+const char SpellEntryfmt[]="nixiiiiiiiixiiiiiiiiiiiiiiiiiiiiiiiiiiiiifxiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffffffiiiiiiiiiiiiiiiiiiiiifffiiiiiiiiiiiiiiifffixiixssssssssssssssssxssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiiiiiiiiiixfffxxxiiii";
const char SpellFocusObjectfmt[]="nxxxxxxxxxxxxxxxxx";
-const char SpellItemEnchantmentfmt[]="nxiiiiiixxxiiissssssssssssssssxiiiixx";
+const char SpellItemEnchantmentfmt[]="niiiiiixxxiiissssssssssssssssxiiii";
const char SpellItemEnchantmentConditionfmt[]="nbbbbbxxxxxbbbbbbbbbbiiiiiXXXXX";
const char SpellRadiusfmt[]="nfxf";
-const char SpellRangefmt[]="nfxfxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
-const char SpellRuneCostfmt[]="niiii";
+const char SpellRangefmt[]="nffixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const char SpellShapeshiftfmt[]="nxxxxxxxxxxxxxxxxxxiixixxxxxxxxxxxx";
const char StableSlotPricesfmt[] = "ni";
-//const char SummonPropertiesfmt[] = "niiiii";
-const char TalentEntryfmt[]="niiiiiiiixxxxixxixxxxxx";
-const char TalentTabEntryfmt[]="nxxxxxxxxxxxxxxxxxxxiiix";
+const char TalentEntryfmt[]="niiiiiiiixxxxixxixxxi";
+const char TalentTabEntryfmt[]="nxxxxxxxxxxxxxxxxxxxiix";
const char TaxiNodesEntryfmt[]="nifffxxxxxxxxxxxxxxxxxii";
const char TaxiPathEntryfmt[]="niii";
const char TaxiPathNodeEntryfmt[]="diiifffiixx";
const char TotemCategoryEntryfmt[]="nxxxxxxxxxxxxxxxxxii";
-const char VehicleEntryfmt[]="niffffiiiiiiiiffffiiiiiifffffffffffssssfifi";
-const char VehicleSeatEntryfmt[]="niiffffffffffiiiiiifffffffiiifffiiiiiiiffiiiii";
-const char WorldMapAreaEntryfmt[]="xinxffffix";
+const char WorldMapAreaEntryfmt[]="xinxffffi";
const char WorldSafeLocsEntryfmt[]="nifffxxxxxxxxxxxxxxxxx";
-const char WorldMapOverlayEntryfmt[]="nxixxxxxxxxxxxxxx";
-
diff --git a/src/shared/Database/Database.h b/src/shared/Database/Database.h
index dd6d02d36dd..30d7193801e 100644
--- a/src/shared/Database/Database.h
+++ b/src/shared/Database/Database.h
@@ -33,7 +33,7 @@ class SqlQueryHolder;
typedef UNORDERED_MAP<ZThread::ThreadImpl*, SqlTransaction*> TransactionQueues;
typedef UNORDERED_MAP<ZThread::ThreadImpl*, SqlResultQueue*> QueryQueues;
-#define MAX_QUERY_LEN 32*1024
+#define MAX_QUERY_LEN 1024
class TRINITY_DLL_SPEC Database
{
diff --git a/src/shared/Database/SQLStorage.cpp b/src/shared/Database/SQLStorage.cpp
index b5abd8fddd0..4845841b6d6 100644
--- a/src/shared/Database/SQLStorage.cpp
+++ b/src/shared/Database/SQLStorage.cpp
@@ -31,12 +31,12 @@ const char CreatureInfosrcfmt[]="iiiiiisssiiiiiiiiiiffiffiiiiiiiiiiiffiiiiiiiiii
const char CreatureInfodstfmt[]="iiiiiisssiiiiiiiiiiffiffiiiiiiiiiiiffiiiiiiiiiiiiiiiiiiisiilliiii";
const char CreatureDataAddonInfofmt[]="iiiiiiiis";
const char CreatureModelfmt[]="iffbi";
-const char CreatureInfoAddonInfofmt[]="iiiiiiis";
-const char EquipmentInfofmt[]="iiii";
+const char CreatureInfoAddonInfofmt[]="iiiiiiiis";
+const char EquipmentInfofmt[]="iiiiiiiiii";
const char GameObjectInfosrcfmt[]="iiissiifiiiiiiiiiiiiiiiiiiiiiiiis";
const char GameObjectInfodstfmt[]="iiissiifiiiiiiiiiiiiiiiiiiiiiiiii";
-const char ItemPrototypesrcfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiffiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiisiiii";
-const char ItemPrototypedstfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiffiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiiiiii";
+const char ItemPrototypesrcfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiffiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifsiiiii";
+const char ItemPrototypedstfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiffiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiiiii";
const char PageTextfmt[]="isi";
const char SpellThreatfmt[]="ii";
const char InstanceTemplatesrcfmt[]="iiiiiiffffs";
diff --git a/src/shared/MemoryLeaks.h b/src/shared/MemoryLeaks.h
deleted file mode 100644
index fceb9d6f444..00000000000
--- a/src/shared/MemoryLeaks.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2005-2008 MaNGOS <http://getmangos.com/>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef MANGOSSERVER_MEMORY_H
-#define MANGOSSERVER_MEMORY_H
-
-#include "Platform/CompilerDefs.h"
-
-#if COMPILER == COMPILER_MICROSOFT
-
-#ifndef _WIN64
-// Visual Leak Detector support enabled
-//#include <vld/vld.h>
-// standard Visual Studio leak check disabled,
-//# define _CRTDBG_MAP_ALLOC
-//# include <stdlib.h>
-//# include <crtdbg.h>
-#else
-# define _CRTDBG_MAP_ALLOC
-# include <stdlib.h>
-# include <crtdbg.h>
-#endif
-
-#endif
-
-
-#include "Policies/Singleton.h"
-
-struct MemoryManager : public MaNGOS::Singleton < MemoryManager >
-{
- MemoryManager();
-};
-#endif
diff --git a/src/shared/SystemConfig.h.in b/src/shared/SystemConfig.h.in
index 571ff23519e..262aa9e6355 100644
--- a/src/shared/SystemConfig.h.in
+++ b/src/shared/SystemConfig.h.in
@@ -26,54 +26,8 @@
#include "Platform/Define.h"
-<<<<<<< HEAD:src/shared/SystemConfig.h.in
// THIS IS TEMP :)
#define _FULLVERSION "Trinity"
-=======
-#ifndef _VERSION
-#if PLATFORM == PLATFORM_WINDOWS
-# define _VERSION(REVD,REVT,REVN,REVH) "0.13.0-DEV" " (" REVD " " REVT " Revision " REVN " - " REVH ")"
-#else
-# define _VERSION(REVD,REVT,REVN,REVH) "@VERSION@" " (" REVD " " REVT " Revision " REVN " - " REVH ")"
-#endif
-#endif
-
-// Format is YYYYMMDDRR where RR is the change in the conf file
-// for that day.
-#ifndef _MANGOSDCONFVERSION
-# define _MANGOSDCONFVERSION 2008022901
-#endif
-#ifndef _REALMDCONFVERSION
-# define _REALMDCONFVERSION 2007062001
-#endif
-
-#if MANGOS_ENDIAN == MANGOS_BIGENDIAN
-# define _ENDIAN_STRING "big-endian"
-#else
-# define _ENDIAN_STRING "little-endian"
-#endif
-
-// The path to config files
-#ifndef SYSCONFDIR
-# define SYSCONFDIR ""
-#endif
-
-#if PLATFORM == PLATFORM_WINDOWS
-# ifdef _WIN64
-# define _ENDIAN_PLATFORM "Win64 (" _ENDIAN_STRING ")"
-# else
-# define _ENDIAN_PLATFORM "Win32 (" _ENDIAN_STRING ")"
-# endif
-# define _MANGOSD_CONFIG SYSCONFDIR"mangosd.conf"
-# define _REALMD_CONFIG SYSCONFDIR"realmd.conf"
-#else
-# define _ENDIAN_PLATFORM "Unix (" _ENDIAN_STRING ")"
-# define _MANGOSD_CONFIG SYSCONFDIR"mangosd.conf"
-# define _REALMD_CONFIG SYSCONFDIR"realmd.conf"
-#endif
-
-#define _FULLVERSION(REVD,REVT,REVN,REVH) _PACKAGENAME "/" _VERSION(REVD,REVT,REVN,REVH) " for " _ENDIAN_PLATFORM
->>>>>>> upstream/master:src/shared/SystemConfig.h.in
#define DEFAULT_PLAYER_LIMIT 100
#define DEFAULT_WORLDSERVER_PORT 8085 //8129
diff --git a/src/shared/Util.h b/src/shared/Util.h
index 95bc8ec1028..b99cdb13bde 100644
--- a/src/shared/Util.h
+++ b/src/shared/Util.h
@@ -287,20 +287,20 @@ bool consoleToUtf8(const std::string& conStr,std::string& utf8str);
bool Utf8FitTo(const std::string& str, std::wstring search);
#if PLATFORM == PLATFORM_WINDOWS
-#define UTF8PRINTF(OUT,FRM,RESERR) \
-{ \
- char temp_buf[32*1024]; \
- va_list ap; \
- va_start(ap, FRM); \
- size_t temp_len = vsnprintf(temp_buf,32*1024,FRM,ap); \
- va_end(ap); \
- \
- wchar_t wtemp_buf[32*1024]; \
- size_t wtemp_len = 32*1024-1; \
+#define UTF8PRINTF(OUT,FRM,RESERR) \
+{ \
+ char temp_buf[6000]; \
+ va_list ap; \
+ va_start(ap, FRM); \
+ size_t temp_len = vsnprintf(temp_buf,6000,FRM,ap); \
+ va_end(ap); \
+ \
+ wchar_t wtemp_buf[6000]; \
+ size_t wtemp_len = 6000-1; \
if(!Utf8toWStr(temp_buf,temp_len,wtemp_buf,wtemp_len)) \
- return RESERR; \
+ return RESERR; \
CharToOemBuffW(&wtemp_buf[0],&temp_buf[0],wtemp_len+1);\
- fprintf(OUT,temp_buf); \
+ fprintf(OUT,temp_buf); \
}
#else
#define UTF8PRINTF(OUT,FRM,RESERR) \
diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h
deleted file mode 100644
index 946507dcf2f..00000000000
--- a/src/shared/revision_nr.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#ifndef __REVISION_NR_H__
-#define __REVISION_NR_H__
- #define REVISION_NR "6938"
-#endif // __REVISION_NR_H__
diff --git a/src/shared/vmap/TileAssembler.cpp b/src/shared/vmap/TileAssembler.cpp
index c8f0b10e76d..198806601fa 100644
--- a/src/shared/vmap/TileAssembler.cpp
+++ b/src/shared/vmap/TileAssembler.cpp
@@ -75,12 +75,12 @@ namespace VMAP
addWorldAreaMapId(0); //Azeroth
addWorldAreaMapId(1); //Kalimdor
addWorldAreaMapId(530); //Expansion01
- addWorldAreaMapId(571); //Expansion02
}
//=================================================================
std::string getModNameFromModPosName(const std::string& pModPosName)
{
+
size_t spos = pModPosName.find_first_of('#');
std::string modelFileName = pModPosName.substr(0,spos);
return(modelFileName);
@@ -142,6 +142,7 @@ namespace VMAP
//=================================================================
bool TileAssembler::convertWorld()
{
+
#ifdef _ASSEMBLER_DEBUG
# ifdef _DEBUG
::g_df = fopen("../TileAssembler_debug.txt", "wb");
diff --git a/src/mangosd/CliRunnable.cpp b/src/trinitycore/CliRunnable.cpp
index 7fe2ab784a6..7fe2ab784a6 100644
--- a/src/mangosd/CliRunnable.cpp
+++ b/src/trinitycore/CliRunnable.cpp
diff --git a/src/mangosd/CliRunnable.h b/src/trinitycore/CliRunnable.h
index c3c1792b6e8..c3c1792b6e8 100644
--- a/src/mangosd/CliRunnable.h
+++ b/src/trinitycore/CliRunnable.h
diff --git a/src/mangosd/Main.cpp b/src/trinitycore/Main.cpp
index 5d497a0e0c2..3767e73b844 100644
--- a/src/mangosd/Main.cpp
+++ b/src/trinitycore/Main.cpp
@@ -29,7 +29,7 @@
#include "Master.h"
#ifndef _TRINITY_CORE_CONFIG
-# define _TRINITY_CORE_CONFIG "TrinityCore.conf"
+# define _TRINITY_CORE_CONFIG "trinitycore.conf"
#endif //_TRINITY_CORE_CONFIG
// Format is YYYYMMDDRR where RR is the change in the conf file
diff --git a/src/mangosd/Makefile.am b/src/trinitycore/Makefile.am
index ad1b78d9033..ad1b78d9033 100644
--- a/src/mangosd/Makefile.am
+++ b/src/trinitycore/Makefile.am
diff --git a/src/mangosd/Master.cpp b/src/trinitycore/Master.cpp
index eea1606256c..eea1606256c 100644
--- a/src/mangosd/Master.cpp
+++ b/src/trinitycore/Master.cpp
diff --git a/src/mangosd/Master.h b/src/trinitycore/Master.h
index 2485dd456b1..2485dd456b1 100644
--- a/src/mangosd/Master.h
+++ b/src/trinitycore/Master.h
diff --git a/src/mangosd/RASocket.cpp b/src/trinitycore/RASocket.cpp
index f953dc3f592..f953dc3f592 100644
--- a/src/mangosd/RASocket.cpp
+++ b/src/trinitycore/RASocket.cpp
diff --git a/src/mangosd/RASocket.h b/src/trinitycore/RASocket.h
index a164c9d3aa2..a164c9d3aa2 100644
--- a/src/mangosd/RASocket.h
+++ b/src/trinitycore/RASocket.h
diff --git a/src/mangosd/TrinityCore.ico b/src/trinitycore/TrinityCore.ico
index 6f0a5721957..6f0a5721957 100644
--- a/src/mangosd/TrinityCore.ico
+++ b/src/trinitycore/TrinityCore.ico
Binary files differ
diff --git a/src/mangosd/mangosd.rc b/src/trinitycore/TrinityCore.rc
index 4e6510c0407..4e6510c0407 100644
--- a/src/mangosd/mangosd.rc
+++ b/src/trinitycore/TrinityCore.rc
diff --git a/src/mangosd/WorldRunnable.cpp b/src/trinitycore/WorldRunnable.cpp
index b57dbc6bce2..b57dbc6bce2 100644
--- a/src/mangosd/WorldRunnable.cpp
+++ b/src/trinitycore/WorldRunnable.cpp
diff --git a/src/mangosd/WorldRunnable.h b/src/trinitycore/WorldRunnable.h
index 8891186dec4..8891186dec4 100644
--- a/src/mangosd/WorldRunnable.h
+++ b/src/trinitycore/WorldRunnable.h
diff --git a/src/mangosd/monitor-mangosd b/src/trinitycore/monitor-mangosd
index a740ae5e8fa..a740ae5e8fa 100644
--- a/src/mangosd/monitor-mangosd
+++ b/src/trinitycore/monitor-mangosd
diff --git a/src/mangosd/resource.h b/src/trinitycore/resource.h
index 7e7d8e4b76f..7e7d8e4b76f 100644
--- a/src/mangosd/resource.h
+++ b/src/trinitycore/resource.h
diff --git a/src/mangosd/run-mangosd b/src/trinitycore/run-mangosd
index f307bd9e1ad..f307bd9e1ad 100644
--- a/src/mangosd/run-mangosd
+++ b/src/trinitycore/run-mangosd
diff --git a/src/mangosd/mangosd.conf.dist.in b/src/trinitycore/trinitycore.conf.dist
index e7ef2ac7672..ba5f2de372f 100644
--- a/src/mangosd/mangosd.conf.dist.in
+++ b/src/trinitycore/trinitycore.conf.dist
@@ -428,18 +428,6 @@ LogColors = ""
# Default: 10 (client limitation)
# The number must be between 1 and 10
#
-# HeroicCharactersPerRealm
-# Limit numbers of heroic class characters for account at realm
-# Default: 1
-# The number must be between 0 (not allowed) and 10
-#
-# MinLevelForHeroicCharacterCreating
-# Limit creating heroic characters only for account with another character of specific level (ignored for GM accounts)
-# 0 - not require any existed chaarcter
-# 1 - require at least any character existed
-# Default: 55 - default requirement
-#
-#
# SkipCinematics
# Disable in-game script movie at first character's login(allows to prevent buggy intro in case of custom start location coordinates)
# Default: 0 - show intro for each new characrer
@@ -447,18 +435,14 @@ LogColors = ""
# 2 - disable intro show in all cases
#
# MaxPlayerLevel
-# Max level that can be reached by player for experience (in range from 1 to 100).
+# Max level that can be reached by player for experience (in range from 1 to 255).
# Change not recommended
-# Default: 80
+# Default: 70
#
# StartPlayerLevel
# Staring level that have character at creating (in range 1 to MaxPlayerLevel)
# Default: 1
#
-# StartHeroicPlayerLevel
-# Staring level that have character of heroic class at creating (in range 1 to MaxPlayerLevel)
-# Default: 55
-#
# StartPlayerMoney
# Amount of money that new players will start with.
# If you want to start with silver, use for example 100 (100 copper = 1 silver)
@@ -572,12 +556,7 @@ LogColors = ""
# Default: 3600 sec (1 hour)
#
# SkillChance.Prospecting
-# For prospecting skillup impossible by default, but can be allowed as custom setting
-# Default: 0 - no skilups
-# 1 - skilups possible
-#
-# SkillChance.Milling
-# For milling skillup impossible by default, but can be allowed as custom setting
+# For prospecting skillup not possible by default, but can be allowed as custom setting
# Default: 0 - no skilups
# 1 - skilups possible
#
@@ -597,7 +576,7 @@ LogColors = ""
GameType = 1
RealmZone = 1
-Expansion = 2
+Expansion = 1
DBC.Locale = 255
DeclinedNames = 0
StrictPlayerNames = 0
@@ -607,12 +586,9 @@ MaxWhoListReturns = 49
CharactersCreatingDisabled = 0
CharactersPerAccount = 50
CharactersPerRealm = 10
-HeroicCharactersPerRealm = 1
-MinLevelForHeroicCharacterCreating = 55
SkipCinematics = 0
-MaxPlayerLevel = 80
+MaxPlayerLevel = 70
StartPlayerLevel = 1
-StartHeroicPlayerLevel = 55
StartPlayerMoney = 0
MaxHonorPoints = 75000
StartHonorPoints = 0
@@ -638,7 +614,6 @@ MinPetitionSigns = 9
MaxGroupXPDistance = 74
MailDeliveryDelay = 3600
SkillChance.Prospecting = 0
-SkillChance.Milling = 0
Event.Announce = 0
BeepAtStart = 1
Motd = "Welcome to a Trinity Core server."
@@ -883,7 +858,7 @@ Channel.SilentlyGMJoin = 0
# 0 (not include)
#
# GM.StartLevel
-# GM starting level (1-100)
+# GM starting level (1-255)
# Default: 1
#
###################################################################################################################
@@ -951,9 +926,8 @@ Visibility.Distance.Grey.Object = 10
# Rate.Mana
# Rate.Rage.Income
# Rate.Rage.Loss
-# Rate.RunicPower.Income
-# Rate.RunicPower.Loss
# Rate.Focus
+# Rate.Loyalty
# Health and power regeneration and rage income from damage.
# Default: 1
#
@@ -1074,9 +1048,8 @@ Rate.Health = 1
Rate.Mana = 1
Rate.Rage.Income = 1
Rate.Rage.Loss = 1
-Rate.RunicPower.Income = 1
-Rate.RunicPower.Loss = 1
Rate.Focus = 1
+Rate.Loyalty = 1
Rate.Skill.Discovery = 1
Rate.Drop.Item.Poor = 1
Rate.Drop.Item.Normal = 1
diff --git a/src/realmd/AuthCodes.h b/src/trinityrealm/AuthCodes.h
index f322d7fea17..768f51efb59 100644
--- a/src/realmd/AuthCodes.h
+++ b/src/trinityrealm/AuthCodes.h
@@ -68,8 +68,8 @@ enum LoginResult
// we need to stick to 1 version or half of the stuff will work for someone
// others will not and opposite
-// will only support WoW, WoW:TBC and WoW:WotLK 3.0.3 client build 9183...
+// will only support WoW and WoW:TBC 2.4.3 client build 8606...
-#define EXPECTED_TRINITY_CLIENT_BUILD {9183, 0}
+#define EXPECTED_TRINITY_CLIENT_BUILD {8606, 0}
#endif
diff --git a/src/realmd/AuthSocket.cpp b/src/trinityrealm/AuthSocket.cpp
index 7168bcf700b..7168bcf700b 100644
--- a/src/realmd/AuthSocket.cpp
+++ b/src/trinityrealm/AuthSocket.cpp
diff --git a/src/realmd/AuthSocket.h b/src/trinityrealm/AuthSocket.h
index f704283c215..f704283c215 100644
--- a/src/realmd/AuthSocket.h
+++ b/src/trinityrealm/AuthSocket.h
diff --git a/src/realmd/Main.cpp b/src/trinityrealm/Main.cpp
index 1476efbd4ec..0e2f68f76c6 100644
--- a/src/realmd/Main.cpp
+++ b/src/trinityrealm/Main.cpp
@@ -40,7 +40,7 @@
#endif
#ifndef _TRINITY_REALM_CONFIG
-# define _TRINITY_REALM_CONFIG "realmd.conf"
+# define _TRINITY_REALM_CONFIG "trinityrealm.conf"
#endif //_TRINITY_REALM_CONFIG
#ifdef WIN32
diff --git a/src/realmd/Makefile.am b/src/trinityrealm/Makefile.am
index 9baeed6c2b1..9baeed6c2b1 100644
--- a/src/realmd/Makefile.am
+++ b/src/trinityrealm/Makefile.am
diff --git a/src/realmd/RealmList.cpp b/src/trinityrealm/RealmList.cpp
index 97fdfbdd91f..97fdfbdd91f 100644
--- a/src/realmd/RealmList.cpp
+++ b/src/trinityrealm/RealmList.cpp
diff --git a/src/realmd/RealmList.h b/src/trinityrealm/RealmList.h
index 9cb5380bd25..9cb5380bd25 100644
--- a/src/realmd/RealmList.h
+++ b/src/trinityrealm/RealmList.h
diff --git a/src/realmd/TrinityRealm.ico b/src/trinityrealm/TrinityRealm.ico
index da318f48a8c..da318f48a8c 100644
--- a/src/realmd/TrinityRealm.ico
+++ b/src/trinityrealm/TrinityRealm.ico
Binary files differ
diff --git a/src/realmd/Realmd.rc b/src/trinityrealm/TrinityRealm.rc
index 33c7eef719a..33c7eef719a 100644
--- a/src/realmd/Realmd.rc
+++ b/src/trinityrealm/TrinityRealm.rc
diff --git a/src/realmd/resource.h b/src/trinityrealm/resource.h
index 7e7d8e4b76f..7e7d8e4b76f 100644
--- a/src/realmd/resource.h
+++ b/src/trinityrealm/resource.h
diff --git a/src/realmd/realmd.conf.dist.in b/src/trinityrealm/trinityrealm.conf.dist
index 72ef1c9012e..72ef1c9012e 100644
--- a/src/realmd/realmd.conf.dist.in
+++ b/src/trinityrealm/trinityrealm.conf.dist
diff --git a/win/TrinityCore&Script VC90.sln b/win/TrinityCore&Script VC90.sln
index b38ef17d80e..f320ab3f99f 100644
--- a/win/TrinityCore&Script VC90.sln
+++ b/win/TrinityCore&Script VC90.sln
@@ -24,7 +24,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "g3dlite", "VC90\g3dlite.vcp
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sockets", "VC90\sockets.vcproj", "{04BAF755-0D67-46F8-B1C6-77AE5368F3CB}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityCore", "VC90\mangosd.vcproj", "{A3A04E47-43A2-4C08-90B3-029CEF558594}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityCore", "VC90\TrinityCore.vcproj", "{A3A04E47-43A2-4C08-90B3-029CEF558594}"
ProjectSection(ProjectDependencies) = postProject
{563E9905-3657-460C-AE63-0AC39D162E23} = {563E9905-3657-460C-AE63-0AC39D162E23}
{90297C34-F231-4DF4-848E-A74BCC0E40ED} = {90297C34-F231-4DF4-848E-A74BCC0E40ED}
@@ -32,7 +32,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityCore", "VC90\mangosd
{1DC6C4DA-A028-41F3-877D-D5400C594F88} = {1DC6C4DA-A028-41F3-877D-D5400C594F88}
EndProjectSection
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityRealm", "VC90\realmd.vcproj", "{563E9905-3657-460C-AE63-0AC39D162E23}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityRealm", "VC90\TrinityRealm.vcproj", "{563E9905-3657-460C-AE63-0AC39D162E23}"
ProjectSection(ProjectDependencies) = postProject
{90297C34-F231-4DF4-848E-A74BCC0E40ED} = {90297C34-F231-4DF4-848E-A74BCC0E40ED}
{04BAF755-0D67-46F8-B1C6-77AE5368F3CB} = {04BAF755-0D67-46F8-B1C6-77AE5368F3CB}
diff --git a/win/VC71/mangosd.vcproj b/win/VC71/TrinityCore.vcproj
index a008f365030..03ef53ab66c 100644
--- a/win/VC71/mangosd.vcproj
+++ b/win/VC71/TrinityCore.vcproj
@@ -23,13 +23,8 @@
<Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
-<<<<<<< HEAD:win/VC71/mangosd.vcproj
AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\trinitycore;..\..\dep\ACE_wrappers"
PreprocessorDefinitions="VERSION=&quot;0.12.0-SVN&quot;;WIN32;NDEBUG;_CONSOLE;ENABLE_CLI"
-=======
- AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\mangosd;..\..\dep\ACE_wrappers"
- PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;;WIN32;NDEBUG;_CONSOLE;ENABLE_CLI"
->>>>>>> upstream/master:win/VC71/mangosd.vcproj
StringPooling="TRUE"
RuntimeLibrary="2"
EnableFunctionLevelLinking="TRUE"
@@ -99,13 +94,8 @@ copy ..\..\src\trinitycore\trinitycore.conf.dist ..\..\bin\$(PlatformName)_$(Con
<Tool
Name="VCCLCompilerTool"
Optimization="0"
-<<<<<<< HEAD:win/VC71/mangosd.vcproj
AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\trinitycore;..\..\dep\ACE_wrappers"
PreprocessorDefinitions="VERSION=&quot;0.12.0-SVN&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE;ENABLE_CLI"
-=======
- AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\mangosd;..\..\dep\ACE_wrappers"
- PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE;ENABLE_CLI"
->>>>>>> upstream/master:win/VC71/mangosd.vcproj
IgnoreStandardIncludePath="FALSE"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
diff --git a/win/VC71/realmd.vcproj b/win/VC71/TrinityRealm.vcproj
index f8ae9d10542..02f8993705d 100644
--- a/win/VC71/realmd.vcproj
+++ b/win/VC71/TrinityRealm.vcproj
@@ -24,11 +24,7 @@
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\realmd;..\..\dep\ACE_wrappers"
-<<<<<<< HEAD:win/VC71/realmd.vcproj
PreprocessorDefinitions="VERSION=&quot;0.12.0-SVN&quot;,WIN32,NDEBUG,_CONSOLE"
-=======
- PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;,WIN32,NDEBUG,_CONSOLE"
->>>>>>> upstream/master:win/VC71/realmd.vcproj
StringPooling="TRUE"
RuntimeLibrary="2"
EnableFunctionLevelLinking="TRUE"
@@ -96,11 +92,7 @@
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\realmd;..\..\dep\ACE_wrappers"
-<<<<<<< HEAD:win/VC71/realmd.vcproj
PreprocessorDefinitions="VERSION=&quot;0.12.0-SVN&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE"
-=======
- PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE"
->>>>>>> upstream/master:win/VC71/realmd.vcproj
IgnoreStandardIncludePath="FALSE"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
diff --git a/win/VC71/game.vcproj b/win/VC71/game.vcproj
index 010e2d8bc0b..923845a7612 100644
--- a/win/VC71/game.vcproj
+++ b/win/VC71/game.vcproj
@@ -136,14 +136,6 @@
RelativePath="..\..\src\game\AccountMgr.h">
</File>
<File
- RelativePath="..\..\src\game\AchievementMgr.cpp">
-
- </File>
- <File
- RelativePath="..\..\src\game\AchievementMgr.h">
-
- </File>
- <File
RelativePath="..\..\src\game\AddonHandler.cpp">
</File>
<File
@@ -219,9 +211,6 @@
RelativePath="..\..\src\game\BattleGroundWS.h">
</File>
<File
- RelativePath="..\..\src\game\CalendarHandler.cpp">
- </File>
- <File
RelativePath="..\..\src\game\Cell.h">
</File>
<File
@@ -565,12 +554,6 @@
RelativePath="..\..\src\game\Bag.h">
</File>
<File
- RelativePath="..\..\src\game\Calendar.cpp">
- </File>
- <File
- RelativePath="..\..\src\game\Calendar.h">
- </File>
- <File
RelativePath="..\..\src\game\ConfusedMovementGenerator.cpp">
</File>
<File
@@ -845,12 +828,6 @@
RelativePath="..\..\src\game\UpdateMask.h">
</File>
<File
- RelativePath="..\..\src\game\Vehicle.cpp">
- </File>
- <File
- RelativePath="..\..\src\game\Vehicle.h">
- </File>
- <File
RelativePath="..\..\src\game\WaypointMovementGenerator.cpp">
</File>
<File
diff --git a/win/VC80/mangosd.vcproj b/win/VC80/TrinityCore.vcproj
index 1bcb8a99d7a..6209bd3f9aa 100644
--- a/win/VC80/mangosd.vcproj
+++ b/win/VC80/TrinityCore.vcproj
@@ -47,13 +47,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/MP"
InlineFunctionExpansion="1"
-<<<<<<< HEAD:win/VC80/mangosd.vcproj
AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\trinitycore;..\..\dep\ACE_wrappers"
PreprocessorDefinitions="VERSION=&quot;0.12.0-SVN&quot;;WIN32;NDEBUG;_CONSOLE;ENABLE_CLI"
-=======
- AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\mangosd;..\..\dep\ACE_wrappers"
- PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;;WIN32;NDEBUG;_CONSOLE;ENABLE_CLI"
->>>>>>> upstream/master:win/VC80/mangosd.vcproj
StringPooling="true"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
@@ -154,13 +149,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/MP"
InlineFunctionExpansion="1"
-<<<<<<< HEAD:win/VC80/mangosd.vcproj
AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\trinitycore;..\..\dep\ACE_wrappers"
PreprocessorDefinitions="VERSION=&quot;0.12.0-SVN&quot;;WIN32;NDEBUG;_CONSOLE;ENABLE_CLI"
-=======
- AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\mangosd;..\..\dep\ACE_wrappers"
- PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;;WIN32;NDEBUG;_CONSOLE;ENABLE_CLI"
->>>>>>> upstream/master:win/VC80/mangosd.vcproj
StringPooling="true"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
@@ -259,13 +249,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/MP"
Optimization="0"
-<<<<<<< HEAD:win/VC80/mangosd.vcproj
AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\trinitycore;..\..\dep\ACE_wrappers"
PreprocessorDefinitions="VERSION=&quot;0.12.0-SVN&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE;ENABLE_CLI"
-=======
- AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\mangosd;..\..\dep\ACE_wrappers"
- PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE;ENABLE_CLI"
->>>>>>> upstream/master:win/VC80/mangosd.vcproj
IgnoreStandardIncludePath="false"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
@@ -366,13 +351,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/MP"
Optimization="0"
-<<<<<<< HEAD:win/VC80/mangosd.vcproj
AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\trinitycore;..\..\dep\ACE_wrappers"
PreprocessorDefinitions="VERSION=&quot;0.12.0-SVN&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE;ENABLE_CLI"
-=======
- AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\mangosd;..\..\dep\ACE_wrappers"
- PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE;ENABLE_CLI"
->>>>>>> upstream/master:win/VC80/mangosd.vcproj
IgnoreStandardIncludePath="false"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
diff --git a/win/VC80/realmd.vcproj b/win/VC80/TrinityRealm.vcproj
index 9ba69e8240b..b6c91e47eb8 100644
--- a/win/VC80/realmd.vcproj
+++ b/win/VC80/TrinityRealm.vcproj
@@ -48,11 +48,7 @@
AdditionalOptions="/MP"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\realmd;..\..\dep\ACE_wrappers"
-<<<<<<< HEAD:win/VC80/realmd.vcproj
PreprocessorDefinitions="VERSION=&quot;0.12.0-SVN&quot;,WIN32,NDEBUG,_CONSOLE"
-=======
- PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;,WIN32,NDEBUG,_CONSOLE"
->>>>>>> upstream/master:win/VC80/realmd.vcproj
StringPooling="true"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
@@ -152,11 +148,7 @@
AdditionalOptions="/MP"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\realmd;..\..\dep\ACE_wrappers"
-<<<<<<< HEAD:win/VC80/realmd.vcproj
PreprocessorDefinitions="VERSION=&quot;0.12.0-SVN&quot;,WIN32,NDEBUG,_CONSOLE"
-=======
- PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;,WIN32,NDEBUG,_CONSOLE"
->>>>>>> upstream/master:win/VC80/realmd.vcproj
StringPooling="true"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
@@ -254,11 +246,7 @@
AdditionalOptions="/MP"
Optimization="0"
AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\realmd;..\..\dep\ACE_wrappers"
-<<<<<<< HEAD:win/VC80/realmd.vcproj
PreprocessorDefinitions="VERSION=&quot;0.12.0-SVN&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE"
-=======
- PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE"
->>>>>>> upstream/master:win/VC80/realmd.vcproj
IgnoreStandardIncludePath="false"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
@@ -358,11 +346,7 @@
AdditionalOptions="/MP"
Optimization="0"
AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\realmd;..\..\dep\ACE_wrappers"
-<<<<<<< HEAD:win/VC80/realmd.vcproj
PreprocessorDefinitions="VERSION=&quot;0.12.0-SVN&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE"
-=======
- PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE"
->>>>>>> upstream/master:win/VC80/realmd.vcproj
IgnoreStandardIncludePath="false"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
diff --git a/win/VC80/game.vcproj b/win/VC80/game.vcproj
index 81a851d7d5f..e456ebbf235 100644
--- a/win/VC80/game.vcproj
+++ b/win/VC80/game.vcproj
@@ -359,14 +359,6 @@
>
</File>
<File
- RelativePath="..\..\src\game\AchievementMgr.cpp"
- >
- </File>
- <File
- RelativePath="..\..\src\game\AchievementMgr.h"
- >
- </File>
- <File
RelativePath="..\..\src\game\AddonHandler.cpp"
>
</File>
@@ -467,10 +459,6 @@
>
</File>
<File
- RelativePath="..\..\src\game\CalendarHandler.cpp"
- >
- </File>
- <File
RelativePath="..\..\src\game\Cell.h"
>
</File>
@@ -907,14 +895,6 @@
>
</File>
<File
- RelativePath="..\..\src\game\Calendar.cpp"
- >
- </File>
- <File
- RelativePath="..\..\src\game\Calendar.h"
- >
- </File>
- <File
RelativePath="..\..\src\game\ConfusedMovementGenerator.cpp"
>
</File>
@@ -1275,14 +1255,6 @@
>
</File>
<File
- RelativePath="..\..\src\game\Vehicle.cpp"
- >
- </File>
- <File
- RelativePath="..\..\src\game\Vehicle.h"
- >
- </File>
- <File
RelativePath="..\..\src\game\WaypointMovementGenerator.cpp"
>
</File>
diff --git a/win/VC90/mangosd.vcproj b/win/VC90/TrinityCore.vcproj
index fd1065673e0..39d09f277be 100644
--- a/win/VC90/mangosd.vcproj
+++ b/win/VC90/TrinityCore.vcproj
@@ -5,8 +5,7 @@
Name="TrinityCore"
ProjectGUID="{A3A04E47-43A2-4C08-90B3-029CEF558594}"
RootNamespace="mangosd"
- Keyword="Win32Proj"
- TargetFrameworkVersion="0"
+ TargetFrameworkVersion="131072"
>
<Platforms>
<Platform
@@ -24,6 +23,7 @@
OutputDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
IntermediateDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
@@ -48,8 +48,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/MP"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\mangosd;..\..\dep\ACE_wrappers"
- PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;;WIN32;NDEBUG;_CONSOLE;ENABLE_CLI"
+ AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\trinitycore;..\..\dep\ACE_wrappers"
+ PreprocessorDefinitions="VERSION=&quot;0.12.0-SVN&quot;;WIN32;NDEBUG;_CONSOLE;ENABLE_CLI"
StringPooling="true"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
@@ -63,7 +63,6 @@
SuppressStartupBanner="true"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
- CallingConvention="0"
CompileAs="0"
/>
<Tool
@@ -116,7 +115,7 @@
/>
<Tool
Name="VCPostBuildEventTool"
- CommandLine="copy ..\..\dep\lib\$(PlatformName)_$(ConfigurationName)\*.dll ..\..\bin\$(PlatformName)_$(ConfigurationName)"
+ CommandLine="copy ..\..\dep\lib\$(PlatformName)_$(ConfigurationName)\*.dll ..\..\bin\$(PlatformName)_$(ConfigurationName)&#x0D;&#x0A;copy ..\..\src\trinitycore\trinitycore.conf.dist ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.conf.dist&#x0D;&#x0A;"
/>
</Configuration>
<Configuration
@@ -124,6 +123,7 @@
OutputDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
IntermediateDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
@@ -149,8 +149,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/MP"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\mangosd;..\..\dep\ACE_wrappers"
- PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;;WIN32;NDEBUG;_CONSOLE;ENABLE_CLI"
+ AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\trinitycore;..\..\dep\ACE_wrappers"
+ PreprocessorDefinitions="VERSION=&quot;0.12.0-SVN&quot;;WIN32;NDEBUG;_CONSOLE;ENABLE_CLI"
StringPooling="true"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
@@ -164,7 +164,6 @@
SuppressStartupBanner="true"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
- CallingConvention="0"
CompileAs="0"
/>
<Tool
@@ -191,8 +190,6 @@
MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.map"
SubSystem="1"
LinkTimeCodeGeneration="0"
- RandomizedBaseAddress="1"
- DataExecutionPrevention="0"
ImportLibrary="$(OutDir)\TrinityCore.lib"
TargetMachine="17"
/>
@@ -224,6 +221,7 @@
OutputDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
IntermediateDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
@@ -248,12 +246,11 @@
Name="VCCLCompilerTool"
AdditionalOptions="/MP"
Optimization="0"
- AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\mangosd;..\..\dep\ACE_wrappers"
- PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE;ENABLE_CLI"
+ AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\trinitycore;..\..\dep\ACE_wrappers"
+ PreprocessorDefinitions="VERSION=&quot;0.12.0-SVN&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE;ENABLE_CLI"
IgnoreStandardIncludePath="false"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
RuntimeTypeInfo="true"
PrecompiledHeaderFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\trinitycore.pch"
AssemblerListingLocation=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
@@ -263,7 +260,6 @@
SuppressStartupBanner="true"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
- CallingConvention="0"
CompileAs="0"
/>
<Tool
@@ -317,7 +313,7 @@
/>
<Tool
Name="VCPostBuildEventTool"
- CommandLine="copy ..\..\dep\lib\$(PlatformName)_$(ConfigurationName)\*.dll ..\..\bin\$(PlatformName)_$(ConfigurationName)"
+ CommandLine="copy ..\..\dep\lib\$(PlatformName)_$(ConfigurationName)\*.dll ..\..\bin\$(PlatformName)_$(ConfigurationName)&#x0D;&#x0A;copy ..\..\src\trinitycore\trinitycore.conf.dist ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.conf.dist&#x0D;&#x0A;"
/>
</Configuration>
<Configuration
@@ -325,6 +321,7 @@
OutputDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
IntermediateDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
@@ -350,12 +347,11 @@
Name="VCCLCompilerTool"
AdditionalOptions="/MP"
Optimization="0"
- AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\mangosd;..\..\dep\ACE_wrappers"
- PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE;ENABLE_CLI"
+ AdditionalIncludeDirectories="..\..\dep\include,..\..\src\framework,..\..\src\shared,..\..\src\game,..\..\src\trinitycore;..\..\dep\ACE_wrappers"
+ PreprocessorDefinitions="VERSION=&quot;0.12.0-SVN&quot;;WIN32;_DEBUG;MANGOS_DEBUG;_CONSOLE;ENABLE_CLI"
IgnoreStandardIncludePath="false"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
RuntimeTypeInfo="true"
PrecompiledHeaderFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\trinitycore.pch"
AssemblerListingLocation=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
@@ -365,7 +361,6 @@
SuppressStartupBanner="true"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
- CallingConvention="0"
CompileAs="0"
/>
<Tool
@@ -392,9 +387,7 @@
GenerateMapFile="true"
MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.map"
SubSystem="1"
- RandomizedBaseAddress="1"
FixedBaseAddress="1"
- DataExecutionPrevention="0"
ImportLibrary="$(OutDir)\TrinityCore.lib"
TargetMachine="17"
/>
@@ -458,35 +451,39 @@
</File>
</Filter>
<File
- RelativePath="..\..\src\mangosd\CliRunnable.cpp"
+ RelativePath="..\..\src\trinitycore\CliRunnable.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\trinitycore\CliRunnable.h"
>
</File>
<File
- RelativePath="..\..\src\mangosd\CliRunnable.h"
+ RelativePath="..\..\src\trinitycore\Main.cpp"
>
</File>
<File
- RelativePath="..\..\src\mangosd\Main.cpp"
+ RelativePath="..\..\src\trinitycore\Master.cpp"
>
</File>
<File
- RelativePath="..\..\src\mangosd\mangosd.rc"
+ RelativePath="..\..\src\trinitycore\Master.h"
>
</File>
<File
- RelativePath="..\..\src\mangosd\Master.cpp"
+ RelativePath="..\..\src\trinitycore\RASocket.cpp"
>
</File>
<File
- RelativePath="..\..\src\mangosd\Master.h"
+ RelativePath="..\..\src\trinitycore\RASocket.h"
>
</File>
<File
- RelativePath="..\..\src\mangosd\RASocket.cpp"
+ RelativePath="..\..\src\trinitycore\resource.h"
>
</File>
<File
- RelativePath="..\..\src\mangosd\RASocket.h"
+ RelativePath="..\..\src\trinitycore\TrinityCore.rc"
>
</File>
<File
@@ -498,11 +495,11 @@
>
</File>
<File
- RelativePath="..\..\src\mangosd\WorldRunnable.cpp"
+ RelativePath="..\..\src\trinitycore\WorldRunnable.cpp"
>
</File>
<File
- RelativePath="..\..\src\mangosd\WorldRunnable.h"
+ RelativePath="..\..\src\trinitycore\WorldRunnable.h"
>
</File>
</Files>
diff --git a/win/VC90/realmd.vcproj b/win/VC90/TrinityRealm.vcproj
index b5097d89837..80ba6157e8b 100644
--- a/win/VC90/realmd.vcproj
+++ b/win/VC90/TrinityRealm.vcproj
@@ -5,8 +5,7 @@
Name="TrinityRealm"
ProjectGUID="{563E9905-3657-460C-AE63-0AC39D162E23}"
RootNamespace="realmd"
- Keyword="Win32Proj"
- TargetFrameworkVersion="0"
+ TargetFrameworkVersion="131072"
>
<Platforms>
<Platform
@@ -24,6 +23,7 @@
OutputDirectory=".\trinityrealm__$(PlatformName)_$(ConfigurationName)"
IntermediateDirectory=".\trinityrealm__$(PlatformName)_$(ConfigurationName)"
ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
@@ -49,7 +49,7 @@
AdditionalOptions="/MP"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\realmd;..\..\dep\ACE_wrappers"
- PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;,WIN32,NDEBUG,_CONSOLE"
+ PreprocessorDefinitions="VERSION=&quot;0.12.0-SVN&quot;,WIN32,NDEBUG,_CONSOLE"
StringPooling="true"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
@@ -63,7 +63,6 @@
SuppressStartupBanner="true"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
- CallingConvention="0"
CompileAs="0"
/>
<Tool
@@ -114,7 +113,7 @@
/>
<Tool
Name="VCPostBuildEventTool"
- CommandLine="copy ..\..\src\realmd\realmd.conf.dist ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf.dist"
+ CommandLine="copy ..\..\src\trinityrealm\trinityrealm.conf.dist ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf.dist"
/>
</Configuration>
<Configuration
@@ -122,6 +121,7 @@
OutputDirectory=".\trinityrealm__$(PlatformName)_$(ConfigurationName)"
IntermediateDirectory=".\trinityrealm__$(PlatformName)_$(ConfigurationName)"
ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
@@ -148,7 +148,7 @@
AdditionalOptions="/MP"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\realmd;..\..\dep\ACE_wrappers"
- PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;,WIN32,NDEBUG,_CONSOLE"
+ PreprocessorDefinitions="VERSION=&quot;0.12.0-SVN&quot;,WIN32,NDEBUG,_CONSOLE"
StringPooling="true"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
@@ -162,7 +162,6 @@
SuppressStartupBanner="true"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
- CallingConvention="0"
CompileAs="0"
/>
<Tool
@@ -188,8 +187,6 @@
GenerateMapFile="true"
MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.map"
SubSystem="1"
- RandomizedBaseAddress="1"
- DataExecutionPrevention="0"
TargetMachine="17"
/>
<Tool
@@ -212,7 +209,7 @@
/>
<Tool
Name="VCPostBuildEventTool"
- CommandLine="copy ..\..\src\realmd\realmd.conf.dist ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf.dist"
+ CommandLine="copy ..\..\src\trinityrealm\trinityrealm.conf.dist ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf.dist"
/>
</Configuration>
<Configuration
@@ -220,6 +217,7 @@
OutputDirectory=".\trinityrealm__$(PlatformName)_$(ConfigurationName)"
IntermediateDirectory=".\trinityrealm__$(PlatformName)_$(ConfigurationName)"
ConfigurationType="1"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
@@ -249,7 +247,6 @@
IgnoreStandardIncludePath="false"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
RuntimeTypeInfo="true"
PrecompiledHeaderFile=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\realmd.pch"
AssemblerListingLocation=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
@@ -259,7 +256,6 @@
SuppressStartupBanner="true"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
- CallingConvention="0"
CompileAs="0"
/>
<Tool
@@ -311,7 +307,7 @@
/>
<Tool
Name="VCPostBuildEventTool"
- CommandLine="copy ..\..\src\realmd\realmd.conf.dist ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf.dist"
+ CommandLine="copy ..\..\src\trinityrealm\trinityrealm.conf.dist ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf.dist"
/>
</Configuration>
<Configuration
@@ -350,7 +346,6 @@
IgnoreStandardIncludePath="false"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
- EnableFunctionLevelLinking="true"
RuntimeTypeInfo="true"
PrecompiledHeaderFile=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\realmd.pch"
AssemblerListingLocation=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
@@ -360,7 +355,6 @@
SuppressStartupBanner="true"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
- CallingConvention="0"
CompileAs="0"
/>
<Tool
@@ -386,9 +380,7 @@
GenerateMapFile="true"
MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.map"
SubSystem="1"
- RandomizedBaseAddress="1"
FixedBaseAddress="1"
- DataExecutionPrevention="0"
TargetMachine="17"
/>
<Tool
@@ -411,7 +403,7 @@
/>
<Tool
Name="VCPostBuildEventTool"
- CommandLine="copy ..\..\src\realmd\realmd.conf.dist ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf.dist"
+ CommandLine="copy ..\..\src\trinityrealm\trinityrealm.conf.dist ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf.dist"
/>
</Configuration>
</Configurations>
@@ -419,31 +411,31 @@
</References>
<Files>
<File
- RelativePath="..\..\src\realmd\AuthCodes.h"
+ RelativePath="..\..\src\trinityrealm\AuthCodes.h"
>
</File>
<File
- RelativePath="..\..\src\realmd\AuthSocket.cpp"
+ RelativePath="..\..\src\trinityrealm\AuthSocket.cpp"
>
</File>
<File
- RelativePath="..\..\src\realmd\AuthSocket.h"
+ RelativePath="..\..\src\trinityrealm\AuthSocket.h"
>
</File>
<File
- RelativePath="..\..\src\realmd\Main.cpp"
+ RelativePath="..\..\src\trinityrealm\Main.cpp"
>
</File>
<File
- RelativePath="..\..\src\realmd\realmd.rc"
+ RelativePath="..\..\src\trinityrealm\RealmList.cpp"
>
</File>
<File
- RelativePath="..\..\src\realmd\RealmList.cpp"
+ RelativePath="..\..\src\trinityrealm\RealmList.h"
>
</File>
<File
- RelativePath="..\..\src\realmd\RealmList.h"
+ RelativePath="..\..\src\trinityrealm\TrinityRealm.rc"
>
</File>
<File
diff --git a/win/VC90/game.vcproj b/win/VC90/game.vcproj
index 60a01de9f4b..a6497190443 100644
--- a/win/VC90/game.vcproj
+++ b/win/VC90/game.vcproj
@@ -5,8 +5,7 @@
Name="game"
ProjectGUID="{1DC6C4DA-A028-41F3-877D-D5400C594F88}"
RootNamespace="game"
- Keyword="Win32Proj"
- TargetFrameworkVersion="0"
+ TargetFrameworkVersion="131072"
>
<Platforms>
<Platform
@@ -24,6 +23,7 @@
OutputDirectory=".\game__$(PlatformName)_$(ConfigurationName)"
IntermediateDirectory=".\game__$(PlatformName)_$(ConfigurationName)"
ConfigurationType="4"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
@@ -80,6 +80,7 @@
/>
<Tool
Name="VCLibrarianTool"
+ AdditionalDependencies=".\shared__$(PlatformName)_$(ConfigurationName)\shared.lib"
OutputFile=".\game__$(PlatformName)_$(ConfigurationName)\game.lib"
SuppressStartupBanner="true"
/>
@@ -104,6 +105,7 @@
OutputDirectory=".\game__$(PlatformName)_$(ConfigurationName)"
IntermediateDirectory=".\game__$(PlatformName)_$(ConfigurationName)"
ConfigurationType="4"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
@@ -126,7 +128,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalOptions="/MP /bigobj"
+ AdditionalOptions="/MP"
Optimization="0"
AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\shared\vmap;..\..\dep\ACE_wrappers"
PreprocessorDefinitions="WIN32;_DEBUG;MANGOS_DEBUG;_LIB;"
@@ -186,6 +188,7 @@
OutputDirectory=".\game__$(PlatformName)_$(ConfigurationName)"
IntermediateDirectory=".\game__$(PlatformName)_$(ConfigurationName)"
ConfigurationType="4"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
@@ -215,6 +218,7 @@
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
EnableEnhancedInstructionSet="1"
+ FloatingPointModel="2"
RuntimeTypeInfo="true"
UsePrecompiledHeader="0"
PrecompiledHeaderFile=".\game__$(PlatformName)_$(ConfigurationName)\game.pch"
@@ -241,6 +245,7 @@
/>
<Tool
Name="VCLibrarianTool"
+ AdditionalDependencies=".\shared__$(PlatformName)_$(ConfigurationName)\shared.lib"
OutputFile=".\game__$(PlatformName)_$(ConfigurationName)\game.lib"
SuppressStartupBanner="true"
/>
@@ -265,6 +270,7 @@
OutputDirectory=".\game__$(PlatformName)_$(ConfigurationName)"
IntermediateDirectory=".\game__$(PlatformName)_$(ConfigurationName)"
ConfigurationType="4"
+ InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
@@ -287,7 +293,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalOptions="/MP /bigobj"
+ AdditionalOptions="/MP"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\shared\vmap;..\..\dep\ACE_wrappers"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;"
@@ -295,6 +301,7 @@
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
EnableEnhancedInstructionSet="0"
+ FloatingPointModel="2"
RuntimeTypeInfo="true"
UsePrecompiledHeader="0"
PrecompiledHeaderFile=".\game__$(PlatformName)_$(ConfigurationName)\game.pch"
@@ -357,14 +364,6 @@
>
</File>
<File
- RelativePath="..\..\src\game\AchievementMgr.cpp"
- >
- </File>
- <File
- RelativePath="..\..\src\game\AchievementMgr.h"
- >
- </File>
- <File
RelativePath="..\..\src\game\AddonHandler.cpp"
>
</File>
@@ -465,10 +464,6 @@
>
</File>
<File
- RelativePath="..\..\src\game\CalendarHandler.cpp"
- >
- </File>
- <File
RelativePath="..\..\src\game\Cell.h"
>
</File>
@@ -637,6 +632,14 @@
>
</File>
<File
+ RelativePath="..\..\src\game\MapReference.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\MapRefManager.h"
+ >
+ </File>
+ <File
RelativePath="..\..\src\game\MiscHandler.cpp"
>
</File>
@@ -897,14 +900,6 @@
>
</File>
<File
- RelativePath="..\..\src\game\Calendar.cpp"
- >
- </File>
- <File
- RelativePath="..\..\src\game\Calendar.h"
- >
- </File>
- <File
RelativePath="..\..\src\game\ConfusedMovementGenerator.cpp"
>
</File>
@@ -1265,14 +1260,6 @@
>
</File>
<File
- RelativePath="..\..\src\game\Vehicle.cpp"
- >
- </File>
- <File
- RelativePath="..\..\src\game\Vehicle.h"
- >
- </File>
- <File
RelativePath="..\..\src\game\WaypointMovementGenerator.cpp"
>
</File>
@@ -1421,14 +1408,6 @@
>
</File>
<File
- RelativePath="..\..\src\game\MapReference.h"
- >
- </File>
- <File
- RelativePath="..\..\src\game\MapRefManager.h"
- >
- </File>
- <File
RelativePath="..\..\src\game\ThreatManager.cpp"
>
</File>