aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am41
-rw-r--r--THANKS3
-rw-r--r--configure.ac20
-rw-r--r--contrib/Makefile.am8
-rw-r--r--contrib/extractor/Makefile471
-rw-r--r--contrib/extractor/README.linux16
-rw-r--r--contrib/extractor/System.cpp133
-rw-r--r--contrib/extractor/ad.exebin167936 -> 160768 bytes
-rw-r--r--contrib/extractor/adt.cpp556
-rw-r--r--contrib/extractor/adt.h142
-rw-r--r--contrib/extractor/libmpq/Makefile17
-rw-r--r--contrib/extractor/libmpq/mpq.cpp2
-rw-r--r--contrib/vmap_debugger/ModelContainerView.cpp4
-rw-r--r--contrib/vmap_debugger/ModelContainerView.h2
-rw-r--r--contrib/vmap_extract_assembler_bin/vmap_assembler.exebin184320 -> 293888 bytes
-rw-r--r--contrib/vmap_extract_assembler_bin/vmapextract_v2.exebin233472 -> 217088 bytes
-rw-r--r--contrib/vmap_extractor_v2/doc/MoPaQ_0.9.txt318
-rw-r--r--contrib/vmap_extractor_v2/doc/MoPaQ_1.0.txt421
-rw-r--r--contrib/vmap_extractor_v2/stormlib/Makefile58
-rw-r--r--contrib/vmap_extractor_v2/stormlib/bzip2/Makefile205
-rw-r--r--contrib/vmap_extractor_v2/stormlib/zlib/Makefile175
-rw-r--r--contrib/vmap_extractor_v2/stormlib/zlib/Makefile.in175
-rw-r--r--contrib/vmap_extractor_v2/stormlib/zlib/configure212
-rw-r--r--contrib/vmap_extractor_v2/stormlib/zlib/contrib/minizip/Makefile25
-rw-r--r--contrib/vmap_extractor_v2/stormlib/zlib/contrib/untgz/Makefile14
-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--dep/include/Makefile.am56
-rw-r--r--dep/lib/Makefile.am10
-rw-r--r--sql/characters.sql415
-rw-r--r--sql/realmd.sql27
-rw-r--r--sql/updates/06750_mangos_command.sql3
-rw-r--r--sql/updates/2008_12_22_01_mangos_creature_equip_template.sql14
-rw-r--r--sql/updates/2008_12_22_02_characters_character_pet.sql7
-rw-r--r--sql/updates/2008_12_22_03_mangos_item_template.sql7
-rw-r--r--sql/updates/2008_12_22_04_mangos_item_template.sql4
-rw-r--r--sql/updates/2008_12_22_05_characters_account_data.sql9
-rw-r--r--sql/updates/2008_12_22_06_characters_character_achievement.sql18
-rw-r--r--sql/updates/2008_12_22_07_mangos_quest_template.sql5
-rw-r--r--sql/updates/2008_12_22_08_mangos_milling_loot_template.sql15
-rw-r--r--sql/updates/2008_12_22_09_mangos_spell_affect.sql14
-rw-r--r--sql/updates/2008_12_22_10_mangos_string.sql5
-rw-r--r--sql/updates/2008_12_22_11_mangos_player_classlevelstats.sql183
-rw-r--r--sql/updates/2008_12_22_12_mangos_player_levelstats.sql5025
-rw-r--r--sql/updates/2008_12_22_13_mangos_item_template.sql4
-rw-r--r--sql/updates/2008_12_22_14_mangos_playercreateinfo.sql14
-rw-r--r--sql/updates/2008_12_22_15_mangos_playercreateinfo_action.sql80
-rw-r--r--sql/updates/2008_12_22_16_mangos_playercreateinfo_spell.sql686
-rw-r--r--sql/updates/2008_12_22_17_mangos_item_template.sql18
-rw-r--r--sql/updates/2008_12_22_18_characters_characters.sql68
-rw-r--r--sql/updates/2008_12_22_19_characters_item_instance.sql15
-rw-r--r--sql/updates/6936_01_mangos_spell_chain.sql2857
-rw-r--r--sql/updates/6939_01_mangos_quest_template.sql4
-rw-r--r--sql/updates/6940_01_mangos_spell_learn_spell.sql3
-rw-r--r--sql/updates/6941_01_mangos_spell_learn_spell.sql6
-rw-r--r--sql/updates/6944_01_mangos_mangos_string.sql30
-rw-r--r--sql/updates/TBC-WLK_characters.sql114
-rw-r--r--sql/updates/TBC-WLK_world.sql6096
-rw-r--r--sql/world.sql10634
-rw-r--r--src/Makefile.am6
-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/ArenaTeamHandler.cpp2
-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/BattleGroundHandler.cpp6
-rw-r--r--src/game/BattleGroundMgr.cpp130
-rw-r--r--src/game/BattleGroundMgr.h5
-rw-r--r--src/game/Calendar.cpp17
-rw-r--r--src/game/Calendar.h (renamed from src/game/Tools.h)20
-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.cpp37
-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.h32
-rw-r--r--src/game/Level1.cpp24
-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.am527
-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.cpp149
-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.cpp398
-rw-r--r--src/game/Pet.h43
-rw-r--r--src/game/PetHandler.cpp153
-rw-r--r--src/game/PetitionsHandler.cpp8
-rw-r--r--src/game/Player.cpp1428
-rw-r--r--src/game/Player.h159
-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.cpp421
-rw-r--r--src/game/Spell.h53
-rw-r--r--src/game/SpellAuraDefines.h58
-rw-r--r--src/game/SpellAuras.cpp901
-rw-r--r--src/game/SpellAuras.h32
-rw-r--r--src/game/SpellEffects.cpp350
-rw-r--r--src/game/SpellHandler.cpp48
-rw-r--r--src/game/SpellMgr.cpp297
-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.cpp355
-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.cpp92
-rw-r--r--src/game/World.h8
-rw-r--r--src/game/WorldSession.cpp87
-rw-r--r--src/game/WorldSession.h52
-rw-r--r--src/game/WorldSocket.cpp63
-rw-r--r--src/game/debugcmds.cpp51
-rw-r--r--src/game/tools.cpp116
-rw-r--r--src/mangosd/CliRunnable.cpp (renamed from src/trinitycore/CliRunnable.cpp)0
-rw-r--r--src/mangosd/CliRunnable.h (renamed from src/trinitycore/CliRunnable.h)0
-rw-r--r--src/mangosd/Main.cpp (renamed from src/trinitycore/Main.cpp)4
-rw-r--r--src/mangosd/Makefile.am (renamed from src/trinitycore/Makefile.am)0
-rw-r--r--src/mangosd/Master.cpp (renamed from src/trinitycore/Master.cpp)0
-rw-r--r--src/mangosd/Master.h (renamed from src/trinitycore/Master.h)0
-rw-r--r--src/mangosd/RASocket.cpp (renamed from src/trinitycore/RASocket.cpp)0
-rw-r--r--src/mangosd/RASocket.h (renamed from src/trinitycore/RASocket.h)0
-rw-r--r--src/mangosd/TrinityCore.ico (renamed from src/trinitycore/TrinityCore.ico)bin136606 -> 136606 bytes
-rw-r--r--src/mangosd/WorldRunnable.cpp (renamed from src/trinitycore/WorldRunnable.cpp)0
-rw-r--r--src/mangosd/WorldRunnable.h (renamed from src/trinitycore/WorldRunnable.h)0
-rw-r--r--src/mangosd/mangosd.conf.dist.in1299
-rw-r--r--src/mangosd/mangosd.rc (renamed from src/trinitycore/TrinityCore.rc)0
-rw-r--r--src/mangosd/monitor-mangosd (renamed from src/trinitycore/monitor-mangosd)0
-rw-r--r--src/mangosd/resource.h (renamed from src/trinitycore/resource.h)0
-rw-r--r--src/mangosd/run-mangosd (renamed from src/trinitycore/run-mangosd)0
-rw-r--r--src/realmd/AuthCodes.h (renamed from src/trinityrealm/AuthCodes.h)4
-rw-r--r--src/realmd/AuthSocket.cpp (renamed from src/trinityrealm/AuthSocket.cpp)0
-rw-r--r--src/realmd/AuthSocket.h (renamed from src/trinityrealm/AuthSocket.h)0
-rw-r--r--src/realmd/Main.cpp (renamed from src/trinityrealm/Main.cpp)4
-rw-r--r--src/realmd/Makefile.am (renamed from src/trinityrealm/Makefile.am)0
-rw-r--r--src/realmd/RealmList.cpp (renamed from src/trinityrealm/RealmList.cpp)0
-rw-r--r--src/realmd/RealmList.h (renamed from src/trinityrealm/RealmList.h)0
-rw-r--r--src/realmd/Realmd.rc (renamed from src/trinityrealm/TrinityRealm.rc)0
-rw-r--r--src/realmd/TrinityRealm.ico (renamed from src/trinityrealm/TrinityRealm.ico)bin136606 -> 136606 bytes
-rw-r--r--src/realmd/realmd.conf.dist.in (renamed from src/trinityrealm/trinityrealm.conf.dist)0
-rw-r--r--src/realmd/resource.h (renamed from src/trinityrealm/resource.h)0
-rw-r--r--src/shared/Auth/AuthCrypt.cpp3
-rw-r--r--src/shared/Auth/AuthCrypt.h1
-rw-r--r--src/shared/ByteBuffer.h26
-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.h1355
-rw-r--r--src/shared/Database/DBCfmt.cpp61
-rw-r--r--src/shared/Database/Database.h2
-rw-r--r--src/shared/Database/SQLStorage.cpp6
-rw-r--r--src/shared/Makefile.am116
-rw-r--r--src/shared/MemoryLeaks.h48
-rw-r--r--src/shared/SystemConfig.h.in55
-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/tools/Makefile.am23
-rw-r--r--src/tools/genrevision/Makefile.am35
-rw-r--r--src/tools/genrevision/genrevision.cpp308
-rw-r--r--win/TrinityCore&Script VC80.sln4
-rw-r--r--win/TrinityCore&Script VC90.sln4
-rw-r--r--win/VC71/game.vcproj29
-rw-r--r--win/VC71/mangosd.vcproj (renamed from win/VC71/TrinityCore.vcproj)10
-rw-r--r--win/VC71/realmd.vcproj (renamed from win/VC71/TrinityRealm.vcproj)8
-rw-r--r--win/VC80/game.vcproj60
-rw-r--r--win/VC80/mangosd.vcproj (renamed from win/VC90/TrinityCore.vcproj)91
-rw-r--r--win/VC80/realmd.vcproj (renamed from win/VC80/TrinityRealm.vcproj)34
-rw-r--r--win/VC90/game.vcproj67
-rw-r--r--win/VC90/mangosd.vcproj523
-rw-r--r--win/VC90/realmd.vcproj (renamed from win/VC90/TrinityRealm.vcproj)42
231 files changed, 39795 insertions, 8190 deletions
diff --git a/Makefile.am b/Makefile.am
index 2650fd4659e..802982ea875 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -22,10 +22,39 @@
SUBDIRS = dep doc src
## Additional files to include when running 'make dist'
-EXTRA_DIST = win
-
-
-
-
-
+# Win32 project workspace for Visual Studio .NET 2003
+EXTRA_DIST = \
+ win/mangosdVC71.sln \
+ win/VC71/framework.vcproj \
+ win/VC71/game.vcproj \
+ win/VC71/mangosd.vcproj \
+ win/VC71/realmd.vcproj \
+ win/VC71/shared.vcproj \
+ win/VC71/zlib.vcproj \
+ win/VC71/g3dlite.vcproj \
+ win/VC71/zthread.vcproj
+
+# Win32 project workspace for Visual Studio .NET 2005
+EXTRA_DIST += \
+ win/mangosdVC80.sln \
+ win/VC80/framework.vcproj \
+ win/VC80/game.vcproj \
+ win/VC80/mangosd.vcproj \
+ win/VC80/realmd.vcproj \
+ win/VC80/shared.vcproj \
+ win/VC80/zlib.vcproj \
+ win/VC80/g3dlite.vcproj \
+ win/VC80/zthread.vcproj
+
+# Win32 project workspace for Visual Studio .NET 2008
+EXTRA_DIST += \
+ win/mangosdVC90.sln \
+ win/VC90/framework.vcproj \
+ win/VC90/game.vcproj \
+ win/VC90/mangosd.vcproj \
+ win/VC90/realmd.vcproj \
+ win/VC90/shared.vcproj \
+ win/VC90/zlib.vcproj \
+ win/VC90/g3dlite.vcproj \
+ win/VC90/zthread.vcproj
diff --git a/THANKS b/THANKS
index 396ebbceb7f..c48df55dd1f 100644
--- a/THANKS
+++ b/THANKS
@@ -20,6 +20,9 @@ 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/configure.ac b/configure.ac
index 4a830706ddb..fd14e0ca3a4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -290,13 +290,6 @@ TRINI_INCLUDES="$POSTGRE_INCLUDES $MYSQL_INCLUDES $TRINI_INCLUDES"
TRINI_LIBS="$POSTGRE_LIBS $MYSQL_LIBS $ZLIB $COMPATLIB $SSLLIB $TRINI_LIBS"
## Export defined variables
-AC_SUBST(ZLIB)
-AC_SUBST(COMPATLIB)
-AC_SUBST(SSLLIB)
-AC_SUBST(MYSQL_INCLUDES)
-AC_SUBST(MYSQL_LIBS)
-AC_SUBST(POSTGRE_INCLUDES)
-AC_SUBST(POSTGRE_LIBS)
AC_SUBST(DOXYGEN)
AC_SUBST(TRINITYD_DEBUG_INFO)
AC_SUBST(TRINITYD_ENABLE_CLI)
@@ -321,6 +314,8 @@ AC_CONFIG_FILES([
doc/Makefile
Makefile
src/Makefile
+ src/tools/Makefile
+ src/tools/genrevision/Makefile
src/framework/Makefile
src/shared/Makefile
src/shared/Auth/Makefile
@@ -329,8 +324,10 @@ AC_CONFIG_FILES([
src/shared/vmap/Makefile
src/shared/SystemConfig.h
src/game/Makefile
- src/trinityrealm/Makefile
- src/trinitycore/Makefile
+ src/realmd/Makefile
+ src/realmd/realmd.conf.dist
+ src/mangosd/Makefile
+ src/mangosd/mangosd.conf.dist
src/bindings/Makefile
src/bindings/interface/Makefile
])
@@ -340,11 +337,6 @@ if test X$tri_need_to_build_ace = Xyes; then
AC_CONFIG_SUBDIRS([dep/ACE_wrappers])
fi
-## Configure ACE
-if test X$tri_build_scripts = Xyes; then
-AC_CONFIG_FILES([src/bindings/scripts/Makefile])
-fi
-
AC_CONFIG_COMMANDS([default],[
echo ""
echo "Configuration of TrinityCore $PACKAGE_VERSION is now complete."
diff --git a/contrib/Makefile.am b/contrib/Makefile.am
index 47ba379c089..653e691a1f0 100644
--- a/contrib/Makefile.am
+++ b/contrib/Makefile.am
@@ -1,6 +1,4 @@
-# Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
-#
-# Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+# 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
@@ -9,12 +7,12 @@
#
# 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
+# 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
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
## Process this file with automake to produce Makefile.in
diff --git a/contrib/extractor/Makefile b/contrib/extractor/Makefile
deleted file mode 100644
index 55eb35f336a..00000000000
--- a/contrib/extractor/Makefile
+++ /dev/null
@@ -1,471 +0,0 @@
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005 Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-
-# Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
-#
-# Thanks to the original authors: 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
-
-SOURCES = $(ad_SOURCES)
-
-srcdir = .
-top_srcdir = .
-
-pkgdatadir = $(datadir)/mangos
-pkglibdir = $(libdir)/mangos
-pkgincludedir = $(includedir)/mangos
-top_builddir = ../..
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = /usr/bin/ginstall -c
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = i686-pc-linux-gnu
-host_triplet = i686-pc-linux-gnu
-bin_PROGRAMS = ad$(EXEEXT)
-subdir = contrib/extractor
-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
- $(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-am__installdirs = "$(DESTDIR)$(bindir)"
-binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
-PROGRAMS = $(bin_PROGRAMS)
-am_ad_OBJECTS = System.$(OBJEXT) adt.$(OBJEXT) dbcfile.$(OBJEXT) \
- mpq_libmpq.$(OBJEXT)
-ad_OBJECTS = $(am_ad_OBJECTS)
-ad_DEPENDENCIES =
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
- $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
- $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
- $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
- $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
- $(AM_LDFLAGS) $(LDFLAGS) -o $@
-SOURCES = $(ad_SOURCES)
-DIST_SOURCES = $(ad_SOURCES)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL =
-ALLOCA =
-AMDEP_FALSE = #
-AMDEP_TRUE =
-AMTAR = ${SHELL} /home/wow/MaNGOS/trunk/missing --run tar
-AR = ar
-AUTOCONF = ${SHELL} /home/wow/MaNGOS/trunk/missing --run autoconf
-AUTOHEADER = ${SHELL} /home/wow/MaNGOS/trunk/missing --run autoheader
-AUTOMAKE = ${SHELL} /home/wow/MaNGOS/trunk/missing --run automake-1.9
-AWK = gawk
-CC = gcc
-CCDEPMODE = depmode=gcc3
-CFLAGS = -g -O3
-COMPILER_OPTIONS = -g -O3
-CPP = gcc -E
-CPPFLAGS =
-CXX = g++
-CXXCPP = g++ -E
-CXXDEPMODE = depmode=gcc3
-CXXFLAGS = -g -O3
-CYGPATH_W = echo
-DEFS = -DHAVE_CONFIG_H
-DEPDIR = .deps
-ECHO = echo
-ECHO_C =
-ECHO_N = -n
-ECHO_T =
-EGREP = grep -E
-EXEEXT =
-EXTRA_COMPILER_OPTIONS =
-EXTRA_LINKER_OPTIONS =
-F77 =
-FFLAGS =
-INCLUDES = -I$(srcdir)
-INSTALL_DATA = ${INSTALL} -m 644
-INSTALL_PROGRAM = ${INSTALL}
-INSTALL_SCRIPT = ${INSTALL}
-INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s
-LDFLAGS =
-LIBOBJS =
-LIBS = -lz -lpthread
-LIBTOOL = $(SHELL) $(top_builddir)/libtool
-LINKER_OPTIONS = -static
-LN_S = ln -s
-LTLIBOBJS =
-LT_AGE = 2
-LT_CURRENT = 2
-LT_RELEASE = 2.3.2
-LT_REVISION = 3
-MAINT = #
-MAINTAINER_MODE_FALSE =
-MAINTAINER_MODE_TRUE = #
-MAKEINFO =
-MANGOSD_CONFIG = /home/wow/server/etc/mangosd.conf
-MANGOSD_CONFIGDIR = /home/wow/server/etc
-MANGOSD_DATA = /home/wow/server/share/mangos
-OBJEXT = o
-PACKAGE = mangos
-PACKAGE_BUGREPORT = http://www.mangosproject.org/
-PACKAGE_NAME = MaNGOS
-PACKAGE_STRING = MaNGOS 0.2-SVN
-PACKAGE_TARNAME = mangos
-PACKAGE_VERSION = 0.2-SVN
-PATH_SEPARATOR = :
-RANLIB = ranlib
-SET_MAKE =
-SHELL = /bin/sh
-STRIP = strip
-VERSION = 0.2-SVN
-ac_ct_AR = ar
-ac_ct_CC = gcc
-ac_ct_CXX = g++
-ac_ct_F77 =
-ac_ct_RANLIB = ranlib
-ac_ct_STRIP = strip
-am__fastdepCC_FALSE = #
-am__fastdepCC_TRUE =
-am__fastdepCXX_FALSE = #
-am__fastdepCXX_TRUE =
-am__include = include
-am__leading_dot = .
-am__quote =
-am__tar = ${AMTAR} chof - "$$tardir"
-am__untar = ${AMTAR} xf -
-bindir = ${exec_prefix}/bin
-build = i686-pc-linux-gnu
-build_alias =
-build_cpu = i686
-build_os = linux-gnu
-build_vendor = pc
-datadir = ${prefix}/share
-exec_prefix = ${prefix}
-host = i686-pc-linux-gnu
-host_alias =
-host_cpu = i686
-host_os = linux-gnu
-host_vendor = pc
-includedir = ${prefix}/include
-infodir = ${prefix}/info
-install_sh = /home/wow/MaNGOS/trunk/install-sh
-libdir = ${exec_prefix}/lib
-libexecdir = ${exec_prefix}/libexec
-localstatedir = ${prefix}/var
-mandir = ${prefix}/man
-mkdir_p = mkdir -p --
-oldincludedir = /usr/include
-prefix = /home/wow/server
-program_transform_name = s,x,x,
-sbindir = ${exec_prefix}/sbin
-sharedstatedir = ${prefix}/com
-
-# use our configured sysconfdir
-sysconfdir = /home/wow/server/etc
-target_alias =
-ad_SOURCES = \
- System.cpp \
- adt.h \
- adt.cpp \
- dbcfile.cpp \
- dbcfile.h \
- mpq_libmpq.cpp \
- mpq_libmpq.h
-
-ad_LDADD = libmpq/libmpq.a
-add_LDFLAGS = -L$(srcdir) -L$(srcdir)/libmpq
-
-all: create-dir all-am
-
-.SUFFIXES:
-.SUFFIXES: .cpp .lo .o .obj
-
-.PRECIOUS: Makefile
-
-install-binPROGRAMS: $(bin_PROGRAMS)
- @$(NORMAL_INSTALL)
- test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
- @list='$(bin_PROGRAMS)'; for p in $$list; do \
- p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
- if test -f $$p \
- || test -f $$p1 \
- ; then \
- f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
- echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
- $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
- else :; fi; \
- done
-
-uninstall-binPROGRAMS:
- @$(NORMAL_UNINSTALL)
- @list='$(bin_PROGRAMS)'; for p in $$list; do \
- f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
- echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
- rm -f "$(DESTDIR)$(bindir)/$$f"; \
- done
-
-clean-binPROGRAMS:
- @list='$(bin_PROGRAMS)'; for p in $$list; do \
- f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
- echo " rm -f $$p $$f"; \
- rm -f $$p $$f ; \
- done
-ad$(EXEEXT): $(ad_OBJECTS) $(ad_DEPENDENCIES)
- @rm -f ad$(EXEEXT)
- $(CXXLINK) $(ad_LDFLAGS) $(ad_OBJECTS) $(ad_LDADD) $(LIBS)
-
-mostlyclean-compile:
- -rm -f *.$(OBJEXT)
-
-distclean-compile:
- -rm -f *.tab.c
-
-.cpp.o:
- if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
-# source='$<' object='$@' libtool=no \
-# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \
-# $(CXXCOMPILE) -c -o $@ $<
-
-.cpp.obj:
- if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
- then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
-# source='$<' object='$@' libtool=no \
-# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \
-# $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.cpp.lo:
- if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
- then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
-# source='$<' object='$@' libtool=yes \
-# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \
-# $(LTCXXCOMPILE) -c -o $@ $<
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
- -rm .deps/*
-
-distclean-libtool:
- -rm -f libtool
-uninstall-info-am:
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- tags=; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
- test -n "$$unique" || unique=$$empty_fix; \
- $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$tags $$unique; \
- fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- tags=; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- test -z "$(CTAGS_ARGS)$$tags$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$tags $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && cd $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
- list='$(DISTFILES)'; for file in $$list; do \
- case $$file in \
- $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
- $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
- esac; \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test "$$dir" != "$$file" && test "$$dir" != "."; then \
- dir="/$$dir"; \
- $(mkdir_p) "$(distdir)$$dir"; \
- else \
- dir=''; \
- fi; \
- if test -d $$d/$$file; then \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
- fi; \
- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
- else \
- test -f $(distdir)/$$file \
- || cp -p $$d/$$file $(distdir)/$$file \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile $(PROGRAMS);
-installdirs:
- for dir in "$(DESTDIR)$(bindir)"; do \
- test -z "$$dir" || $(mkdir_p) "$$dir"; \
- done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- `test -z '$(STRIP)' || \
- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
- -rm -rf ./$(DEPDIR)
-distclean-am: clean-am distclean-compile distclean-generic \
- distclean-libtool distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-exec-am: install-binPROGRAMS
-
-install-info: install-info-am
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
- -rm -rf ./$(DEPDIR)
- -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
- mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-binPROGRAMS uninstall-info-am
-
-create-dir:
- mkdir -p ".deps"
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
- clean-generic clean-libtool ctags distclean distclean-compile \
- distclean-generic distclean-libtool distclean-tags distdir dvi \
- dvi-am html html-am info info-am install install-am \
- install-binPROGRAMS install-data install-data-am install-exec \
- install-exec-am install-info install-info-am install-man \
- install-strip installcheck installcheck-am installdirs \
- maintainer-clean maintainer-clean-generic mostlyclean \
- mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
- pdf pdf-am ps ps-am tags uninstall uninstall-am \
- uninstall-binPROGRAMS uninstall-info-am
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/contrib/extractor/README.linux b/contrib/extractor/README.linux
index 52b907391b8..e1ebdb8bb2e 100644
--- a/contrib/extractor/README.linux
+++ b/contrib/extractor/README.linux
@@ -1,7 +1,13 @@
-= Trinity Core -- Linux instructions for extractor =
+Linux instructions
+------------------
-Copyright (C) Trinity Core (http://www.trinitycore.org)
+1. Configure and build MaNGOS.
+2. cd contrib/map_extractor/libmpq/
+3. make
+4. cd ..
+5. make
+6. run ad
-1: Configure and build MaNGOS.
-2: cd contrib/extractor/libmpq && make && cd .. && make
-3: run ad \ No newline at end of file
+if there are any problems create folder named .deps in contrib/map_extractor/
+it is old bug from first extractor and i am too lasy to fix it :)
+
diff --git a/contrib/extractor/System.cpp b/contrib/extractor/System.cpp
index 197c4d35416..85d06369f24 100644
--- a/contrib/extractor/System.cpp
+++ b/contrib/extractor/System.cpp
@@ -16,21 +16,24 @@
extern unsigned int iRes;
extern ArchiveSet gOpenArchives;
-bool ConvertADT(char*,char*);
+bool ConvertADT(char*, char*);
-typedef struct{
+typedef struct
+{
char name[64];
- unsigned int id;
-}map_id;
+ uint32 id;
+} map_id;
typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned int uint32;
-map_id * map_ids;
-uint16 * areas;
-char output_path[128]=".";
-char input_path[128]=".";
+map_id *map_ids;
+uint16 *areas;
+uint16 *LiqType;
+char output_path[128] = ".";
+char input_path[128] = ".";
+uint32 maxAreaId = 0;
enum Extract
{
@@ -66,46 +69,45 @@ 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]);
}
@@ -122,12 +124,12 @@ uint32 ReadMapDBC()
DBCFile dbc("DBFilesClient\\Map.dbc");
dbc.open();
- uint32 map_count=dbc.getRecordCount();
- map_ids=new map_id[map_count];
- for(unsigned int x=0;x<map_count;x++)
+ size_t map_count = dbc.getRecordCount();
+ map_ids = new map_id[map_count];
+ for(uint32 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;
@@ -135,20 +137,39 @@ uint32 ReadMapDBC()
void ReadAreaTableDBC()
{
- printf("Read AreaTable.dbc file... ");
+ printf("Read AreaTable.dbc file...");
DBCFile dbc("DBFilesClient\\AreaTable.dbc");
dbc.open();
- 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)
+ 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)
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];
@@ -159,27 +180,28 @@ 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(unsigned int x = 0; x < ADT_RES; ++x)
+ for(uint32 x = 0; x < ADT_RES; ++x)
{
- for(unsigned int y = 0; y < ADT_RES; ++y)
+ for(uint32 y = 0; y < ADT_RES; ++y)
{
- for(unsigned int z = 0; z < map_count; ++z)
+ for(uint32 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 progess bar
- printf("Processing........................%d%%\r",(100*done)/total);
+ // draw progress bar
+ printf("Processing........................%d%%\r", (100 * done) / total);
}
}
@@ -222,7 +244,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());
@@ -256,22 +278,25 @@ void LoadLocaleMPQFiles(int const locale)
new MPQArchive(filename);
}
}
-
+
void LoadCommonMPQFiles()
{
char filename[512];
- sprintf(filename,"%s/Data/common.MPQ", input_path);
+ sprintf(filename,"%s/Data/common-2.MPQ", input_path);
+ new MPQArchive(filename);
+ sprintf(filename,"%s/Data/lichking.MPQ", input_path);
new MPQArchive(filename);
sprintf(filename,"%s/Data/expansion.MPQ", input_path);
new MPQArchive(filename);
+
for(int i = 1; i < 5; ++i)
{
char ext[3] = "";
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);
}
@@ -291,7 +316,7 @@ int main(int argc, char * arg[])
HandleArgs(argc, arg);
int FirstLocale = -1;
-
+
for (int i = 0; i < LANG_COUNT; i++)
{
char tmp1[512];
@@ -299,10 +324,10 @@ int main(int argc, char * arg[])
if (FileExists(tmp1))
{
printf("Detected locale: %s\n", langs[i]);
-
+
//Open MPQs
LoadLocaleMPQFiles(i);
-
+
if((extract & EXTRACT_DBC) == 0)
{
FirstLocale = i;
@@ -328,15 +353,15 @@ int main(int argc, char * arg[])
printf("No locales detected\n");
return 0;
}
-
+
if (extract & EXTRACT_MAP)
{
printf("Using locale: %s\n", langs[FirstLocale]);
-
+
// Open MPQs
LoadLocaleMPQFiles(FirstLocale);
LoadCommonMPQFiles();
-
+
// Extract maps
ExtractMapsFromMpq();
diff --git a/contrib/extractor/ad.exe b/contrib/extractor/ad.exe
index 2dc24c0872e..f483f3892f9 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 26adaa28537..dde87e5fc28 100644
--- a/contrib/extractor/adt.cpp
+++ b/contrib/extractor/adt.cpp
@@ -15,16 +15,15 @@
#include "adt.h"
#include "mpq_libmpq.h"
-//#include <windows.h>
-unsigned int iRes=256;
-extern uint16*areas;
+uint32 iRes = 256;
+extern uint16 *areas;
+extern uint16 *LiqType;
+extern uint32 maxAreaId;
vec wmoc;
-Cell * cell;
-uint32 wmo_count;
+Cell *cell;
mcell *mcells;
-
int holetab_h[4] = {0x1111, 0x2222, 0x4444, 0x8888};
int holetab_v[4] = {0x000F, 0x00F0, 0x0F00, 0xF000};
@@ -35,168 +34,154 @@ bool LoadADT(char* filename)
if(mf.isEof())
{
- //printf("No such file.\n");
+ //printf("No such file %s\n", filename);
return false;
}
- mcells=new mcell;
- wmoc.x =65*TILESIZE;
- wmoc.z =65*TILESIZE;
+ 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;
size_t mcnk_offsets[256], mcnk_sizes[256];
- wmo_count=0;
- bool found=false;
- //uint32 fs=mf.getSize()-3;
- //while (mf.getPos()<fs)
+ chunk_num = 0;
+ k = 0;
+ m = 0;
while (!mf.isEof())
{
uint32 fourcc;
- mf.read(&fourcc,4);
+ mf.read(&fourcc, 4);
mf.read(&size, 4);
size_t nextpos = mf.getPos() + size;
- switch(fourcc)
+
+ //if(fourcc==0x4d484452) // MHDR header
+ //if(fourcc==0x4d564552) // MVER
+ if(fourcc == 0x4d43494e) // MCIN
{
- case 0x4d43494e: // MCIN
+ for (uint32 i = 0; i < 256; ++i)
{
- //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;
+ mf.read(&mcnk_offsets[i], 4);
+ mf.read(&mcnk_sizes[i], 4);
+ mf.seekRelative(8);
}
- case 0x4d4f4446: // MODF
+ }
+ //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)
{
- /*
- if(size)
+ mf.read(LiqOffsData, 0x0C);
+ header_pos = mf.getPos();
+ if(LiqOffsData->offsData1 != 0) // åñëè äàííûå â Data1 î âîäå åñòü, òî èõ íàäî êîíâåðòèðîâàòü
{
- //printf("\nwmo count %d\n",size/64);
- wmo_count =size/64;
- for (int i=0; i<wmo_count; i++)
+ // ïåðåõîäèì ïî ñìåùåíèþ èç 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)
+ {
+ ChunkLiqHeight[j] = -999999; // no liquid/water
+ }
+ // òåïåðü âû÷èñëÿåì òå ÷òî ñ âîäîé è ïåðåçàïèñûâàåì èõ â êóñêå
+ for(int b = 0; b <= LiqChunkData1->height; ++b)
{
- int id;
- mf.read(&id, 4);
- WMO *wmo = (WMO*)wmomanager.items[wmomanager.get(wmos[id])];
- WMOInstance inst(wmo, mf);
- wmois.push_back(inst);
+ 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
+ }
- }*/
- break;
- }
- case 0x4d574d4f: // MWMO
- {
- /*
- if (size)
+ 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 íå çàíîñèì òê îíè äóáëèðóåòñÿ ñëåä êóñêîì
{
- char *buf = new char[size];
- mf.read(buf, size);
- char *p=buf;
- while (p<buf+size)
+ for(int s = 0; s < 8; ++s) // 9 çíà÷åíèå â ñòðîêå íå çàíîñèì òê îíî äóáëèðóåòñÿ ñëåä êóñêîì, à â ïðàâûõ-áîêîâûõ îáðåçàåòñÿ äëÿ 128õ128
{
- std::string path(p);
- p+=strlen(p)+1;
- fixname(path);
-
- wmomanager.add(path);
- wmos.push_back(path);
+ MapLiqHeight[k] = ChunkLiqHeight[p + s];
+ ++k;
}
- delete[] buf;
- }*/
- break;
- }
- case 0x4d564552: // MVER
- case 0x4d484452: // MHDR header
- case 0x4d434e4b: // MCNK
- case 0x4d544558: // MTEX textures (strings)
- case 0x4d4d4458: // MMDX m2 models (strings)
- case 0x4d4d4944: // MMID offsets for strings in MMDX
- case 0x4d574944: // MWID offsets for strings in MWMO
- case 0x4d444446: // MDDF
- case 0x4d46424f: // MFBO new in BC
- case 0x4d48324f: // MH2O new in WotLK
- break;
- default:
- {
- // mf.seekRelative(-3);
- printf("Unhandled map chunk: %u\n",fourcc);
- break;
+ k = k + 120;
+ }
}
+ 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
- for (int j=0; j<16; j++)
- for (int i=0; i<16; i++)
+ chunk_num = 0;
+ k = 0;
+ m = 0;
+ 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]));
+ mf.seek((int)mcnk_offsets[j * 16 + i]);
+ LoadMapChunk(mf, &(mcells->ch[i][j]));
+ ++chunk_num;
}
-
- /*
- 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;
@@ -207,295 +192,262 @@ void LoadMapChunk(MPQFile & mf, chunk*_chunk)
mf.read(&size, 4);
size_t lastpos = mf.getPos() + size;
- mf.read(&header, 0x80);
- _chunk->area_id =header.areaid ;
- _chunk->flag =0;
+ mf.read(&header, 0x80); // what if header size got changed?
+ _chunk->area_id = header.areaid;
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;
- float zmin=999999999.0f;
- float zmax=-999999999.0f;
- //must be there, bl!zz uses some crazy format
- int nTextures;
+ //printf("LMC: flags %X\n", chunkflags);
+ float zmin = 999999999.0f;
+ float zmax = -999999999.0f;
+ // must be there, bl!zz uses some crazy format
while (mf.getPos() < lastpos)
{
- mf.read(&fourcc,4);
+ mf.read(&fourcc, 4);
mf.read(&size, 4);
- //if(size!=580)
- // printf("\n sz=%d",size);
- size_t nextpos = mf.getPos() + size;
- if(fourcc==0x4d435654) // MCVT
+ 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) // MCLQ
+ else if(fourcc == 0x4d434c51) // íå áóäåì ó÷èòûâàòü åñëè óæå áûëè äàííûå â MH2O, ïåðåñòðàõîâêà :) // MCLQ
{
// liquid / water level
- //bool haswater;
char fcc1[5];
- mf.read(fcc1,4);
+ mf.read(fcc1, 4);
flipcc(fcc1);
- fcc1[4]=0;
+ fcc1[4] = 0;
+ float *ChunkLiqHeight = new float[81];
- if (!strcmp(fcc1,"MCSE"))
+ if (!strcmp(fcc1, "MCSE"))
{
- for(int i=0;i<9;i++)
- for(int j=0;j<9;j++)
- _chunk->waterlevel[i][j]=-999999; // no liquid/water
+ for(int j = 0; j < 81; ++j)
+ {
+ ChunkLiqHeight[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);
- 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(liq.height > maxheight)
+ ChunkLiqHeight[j] = -999999;
+ else
+ ChunkLiqHeight[j] = h;
+ }
if(chunkflags & 4 || chunkflags & 8)
- _chunk->flag |=1;
+ MapLiqFlag[chunk_num] |= 1; // water
if(chunkflags & 16)
- _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;
}
+ 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;
+ v[1].x = UNITSIZE;
+ v[1].y = cell->v9[xc + 1][zc];
+ v[1].z = 0.0f;
}
else
{
- v[1].x=0.0;
- v[1].y =cell->v9[xc][zc+1];
- v[1].z=UNITSIZE;
+ v[1].x = 0.0f;
+ 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;
- v[2].y=cell->v9[xc][zc];
- v[2].z=0;
+ v[2].x = 0.0f;
+ v[2].y = cell->v9[xc][zc];
+ v[2].z = 0.0f;
}
- return -solve(v,&p);
+ return -solve(v, &p);
}
}
-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()
+inline void TransformData()
{
- cell= new Cell;
+ cell = new Cell;
- for(int x=0;x<128;x++)
+ for(uint32 x = 0; x < 128; ++x)
{
- for(int y=0;y<128;y++)
+ for(uint32 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.00";
+const char MAP_MAGIC[] = "MAP_2.01";
-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);
+ printf("Can't create the output file '%s'\n", filename2);
+ delete [] MapLiqHeight;
+ delete [] MapLiqFlag;
return false;
}
// write magic header
- fwrite(MAP_MAGIC,1,8,output);
+ fwrite(MAP_MAGIC, 1, 8, output);
- for(unsigned int x=0;x<16;x++)
+ for(uint32 x = 0; x < 16; ++x)
{
- for(unsigned int y=0;y<16;y++)
+ for(uint32 y = 0; y < 16; ++y)
{
- if(mcells->ch[y][x].area_id && mcells->ch[y][x].area_id < 0x102D)
+ if(mcells->ch[y][x].area_id && mcells->ch[y][x].area_id <= maxAreaId)
{
- 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);
}
}
}
- 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);
-
- TransformWaterData();
+ fwrite(MapLiqFlag, 1, 256, output);
+ delete [] MapLiqFlag;
- 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);
+ fwrite(MapLiqHeight, sizeof(float), 16384, output);
+ delete [] MapLiqHeight;
- delete cell;
TransformData();
- for(unsigned int x=0;x<iRes;x++)
- for(unsigned int y=0;y<iRes;y++)
+ for(uint32 x = 0; x < iRes; ++x)
{
- float z=(float)GetZ(
- (((double)(y))*TILESIZE)/((double)(iRes-1)),
- (((double)(x))*TILESIZE)/((double)(iRes-1)));
+ for(uint32 y = 0; y < iRes; ++y)
+ {
+ 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 6e079461a66..52196c4e7e6 100644
--- a/contrib/extractor/adt.h
+++ b/contrib/extractor/adt.h
@@ -9,46 +9,120 @@ 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;
+} triangle;
-typedef struct{
-float v9[16*8+1][16*8+1];
-float v8[16*8][16*8];
-}Cell;
+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;
-//Liquid *lq;
-float waterlevel[9][9];
-uint8 flag;
-}chunk;
+typedef struct
+{
+ double v9[9][9];
+ double v8[8][8];
+ uint16 area_id;
+} chunk;
-class WMO;
-class WMOManager;
-void fixname(std::string &name);
+typedef struct
+{
+ chunk ch[16][16];
+} mcell;
+
+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
{
-chunk ch[16][16];
-}mcell;
+ uint32 offsData1;
+ uint32 used;
+ uint32 offsData2;
+} MH2O_offsData;
+
+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
+};
+
class MPQFile;
-void LoadMapChunk(MPQFile &,chunk*);
-bool LoadWMO(char* filename);
-#endif
+float *MapLiqHeight;
+uint8 *MapLiqFlag;
+uint32 k, m, chunk_num;
+void LoadMapChunk(MPQFile &, chunk*);
+#endif
diff --git a/contrib/extractor/libmpq/Makefile b/contrib/extractor/libmpq/Makefile
deleted file mode 100644
index eb1965e29f1..00000000000
--- a/contrib/extractor/libmpq/Makefile
+++ /dev/null
@@ -1,17 +0,0 @@
-CC = g++
-AR = ar
-objects = common.o explode.o extract.o huffman.o wave.o mpq.o parser.o
-zlib_objects = ../../../dep/src/zlib/*.o #adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o zutil.o inflate.o inftrees.o inffast.o
-
-all: libmpq.a libmpq.so
-
-clean:
- rm -f libmpq.a libmpq.so *.o
-
-libmpq.a: $(objects) $(zlib_objects)
- $(AR) cru $@ $+
-libmpq.so: $(objects) $(zlib_objects)
- $(CC) -fPIC -o $@ $+
-
-%.o:%.cpp
- $(CC) -I../ -c $+
diff --git a/contrib/extractor/libmpq/mpq.cpp b/contrib/extractor/libmpq/mpq.cpp
index 9d1cd883386..c6a5d7d7bdb 100644
--- a/contrib/extractor/libmpq/mpq.cpp
+++ b/contrib/extractor/libmpq/mpq.cpp
@@ -199,7 +199,7 @@ int libmpq_archive_info(mpq_archive *mpq_a, unsigned int infotype) {
/*
* This function returns some useful file information.
*/
-int libmpq_file_info(mpq_archive *mpq_a, unsigned int infotype, const int unsigned number) {
+int libmpq_file_info(mpq_archive *mpq_a, unsigned int infotype, const unsigned int number) {
int blockindex = number; //-1;
int i = 0;
mpq_block *mpq_b = NULL;
diff --git a/contrib/vmap_debugger/ModelContainerView.cpp b/contrib/vmap_debugger/ModelContainerView.cpp
index fa6b2b40b29..c29666c0bca 100644
--- a/contrib/vmap_debugger/ModelContainerView.cpp
+++ b/contrib/vmap_debugger/ModelContainerView.cpp
@@ -451,7 +451,7 @@ namespace VMAP
//====================================================================
- Vector3 ModelContainerView::convertPositionToTrinityRep(float x, float y, float z) const {
+ Vector3 ModelContainerView::convertPositionToMangosRep(float x, float y, float z) const {
float pos[3];
pos[0] = z;
pos[1] = x;
@@ -490,7 +490,7 @@ namespace VMAP
#if 0
i_App->defaultController.getPosition();
Vector3 pos = i_App->defaultController.getPosition();
- Vector3 pos2 = convertPositionToTrinityRep(pos.x, pos.y, pos.z);
+ Vector3 pos2 = convertPositionToMangosRep(pos.x, pos.y, pos.z);
//Vector3 pos3 = iVMapManager->convertPositionToInternalRep(pos2.x, pos2.y, pos2.z);
//pos3 = iVMapManager->convertPositionToInternalRep(pos2.x, pos2.y, pos2.z);
diff --git a/contrib/vmap_debugger/ModelContainerView.h b/contrib/vmap_debugger/ModelContainerView.h
index ff41f7d1784..28d992a0c16 100644
--- a/contrib/vmap_debugger/ModelContainerView.h
+++ b/contrib/vmap_debugger/ModelContainerView.h
@@ -51,7 +51,7 @@ namespace VMAP
bool iPosSent;
Array<Command> iPrevLoadCommands;
private:
- Vector3 convertPositionToTrinityRep(float x, float y, float z) const;
+ Vector3 convertPositionToMangosRep(float x, float y, float z) const;
public:
ModelContainerView(const G3D::GApp::Settings& settings);
diff --git a/contrib/vmap_extract_assembler_bin/vmap_assembler.exe b/contrib/vmap_extract_assembler_bin/vmap_assembler.exe
index 5cb08f770aa..a6ef74dc086 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 c38b6e64f64..03c76907658 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/doc/MoPaQ_0.9.txt b/contrib/vmap_extractor_v2/doc/MoPaQ_0.9.txt
deleted file mode 100644
index ce8d8f70166..00000000000
--- a/contrib/vmap_extractor_v2/doc/MoPaQ_0.9.txt
+++ /dev/null
@@ -1,318 +0,0 @@
-THE MOPAQ ARCHIVE FORMAT
-v0.9 (Thursday, June 30, 2005)
-by Justin Olbrantz(Quantam)
-
-Distribution and reproduction of this specification are allowed without limitation, as long as it is not altered. Quoting
-in other works is freely allowed, as long as the source and author of the quote is stated.
-
-TABLE OF CONTENTS
-1. Introduction to the MoPaQ Format
-2. The MoPaQ Format
- 2.1 General Archive Layout
- 2.2 Archive Header
- 2.3 Block Table
- 2.4 Hash Table
- 2.5 File Data
- 2.6 Listfile
- 2.7 Extended Attributes
- 2.8 Weak (Old) Digital Signature
- 2.9 Strong (New) Digital Signature
-3. Algorithm Source Code
- 3.1 Encryption/Decryption
- 3.2 Hashing
- 3.3 Conversion of FILETIME and time_t
-
-1. INTRODUCTION TO THE MOPAQ FORMAT
-The MoPaQ (or MPQ) format is an archive file format designed by Mike O'Brien (hence the name Mike O'brien PaCK) at Blizzard
-Entertainment. The format has been used in all Blizzard games since (and including) Diablo. It is heavily optimized to be
-a read-only game archive format, and excels at this role.
-
-The Blizzard MoPaQ-reading functions are contained in the Storm module, which my be either statically or dynamically linked.
-The Blizzard MoPaQ-writing functions are contained in the MPQAPI module, which is always statically linked.
-
-2. THE MOPAQ FORMAT
-All numbers in the MoPaQ format are in little endian. Data types are listed either as int (integer, the number of bits specified),
-byte (8 bits), and char (bytes which contain ASCII characters). All sizes and offsets are in bytes, unless specified otherwise.
-Structure members are listed in the following general form:
-offset from the beginning of the structure: data type(array size) member name : member description
-
-2.1 GENERAL ARCHIVE LAYOUT
-- Archive Header
-- File Data
-- File Data - Special Files
-- Hash Table
-- Block Table
-- Strong Digital signature
-
-This is the usual archive format, and is not absolutely essential. Some archives have been observed placing the hash table
-and file table after the archive header, and before the file data.
-
-2.2 ARCHIVE HEADER
-00h: char(4) Magic : Indicates that the file is a MoPaQ archive. Must be ASCII "MPQ" 1Ah.
-04h: int32 HeaderSize : Size of the archive header. Should be 32.
-08h: int32 ArchiveSize : Size of the whole archive, including the header. Does not include the strong digital signature, if present.
-This size is used, among other things, for determining the region to hash in computing the digital signature.
-0Ch: int16 Unknown : Unknown
-0Eh: int8 SectorSizeShift : Power of two exponent specifying the number of 512-byte disk sectors in each logical sector
-in the archive. The size of each logical sector the archive is 512 * 2^SectorSizeShift. Bugs in the Storm library dictate
-that this should always be 3 (4096 byte sectors).
-10h: int32 HashTableOffset : Offset to the beginning of the hash table, relative to the beginning of the archive.
-14h: int32 BlockTableOffset : Offset to the beginning of the block table, relative to the beginning of the archive.
-18h: int32 HashTableEntries : Number of entries in the hash table. Must be a power of two, and must be less than 2^16.
-1Ch: int32 BlockTableEntries : Number of entries in the block table.
-
-The archive header is the first structure in the archive, at archive offset 0, but the archive does not need to be at offset
-0 of the containing file. The offset of the archive in the file is referred to here as ArchiveOffset. If the archive is not
-at the beginning of the file, it must begin at a disk sector boundary (512 bytes). Early versions of Storm require that the
-archive be at the end of the containing file (ArchiveOffset + ArchiveSize = file size), but this is not required in newer
-versions (due to the strong digital signature not being considered a part of the archive).
-
-2.3 BLOCK TABLE
-The block table contains entries for each region in the archive. Regions may be either files or empty space, which may be
-overwritten by new files (typically this space is from deleted file data). The block table is encrypted, using the hash
-of "(block table)" as the key. Each entry is structured as follows:
-
-00h: int32 BlockOffset : Offset of the beginning of the block, relative to the beginning of the archive. Meaningless if the block size is 0.
-04h: int32 BlockSize : Size of the block in the archive.
-08h: int32 FileSize : Size of the file data stored in the block. Only valid if the block is a file, otherwise meaningless, and should be 0. If the file is compressed, this is the size of the uncompressed file data.
-0Ch: int32 Flags : Bit mask of the flags for the block. The following values are conclusively identified:
- 80000000h: Block is a file, and follows the file data format; otherwise, block is free space, and may be overwritten. If the block is not a file, all other flags should be cleared.
- 01000000h: File is stored as a single unit, rather than split into sectors.
- 00020000h: The file's encryption key is adjusted by the block offset and file size (explained in detail in the File Data section). File must be encrypted.
- 00010000h: File is encrypted.
- 00000200h: File is compressed. Mutually exclusive to file imploded.
- 00000100h: File is imploded. Mutually exclusive to file compressed.
-
-2.4 HASH TABLE
-Instead of storing file names, for quick access MoPaQs use a fixed, power of two-size hash table of files in the archive. A file is uniquely identified by its file path, its language, and its platform. The home entry for a file in the hash table is computed as a hash of the file path. In the event of a collision (the home entry is occupied by another file), progressive overflow is used, and the file is placed in the next available hash table entry. Searches for a desired file in the hash table proceed from the home entry for the file until either the file is found, the entire hash table is searched, or an empty hash table entry (FileBlockIndex of FFFFFFFFh) is encountered. The hash table is encrypted using the hash of "(hash table)" as the key. Each entry is structured as follows:
-
-00h: int32 FilePathHashA : The hash of the file path, using method A.
-04h: int32 FilePathHashB : The hash of the file path, using method B.
-08h: int16 Language : The language of the file. This is a Windows LANGID data type, and uses the same values. 0 indicates the default language (American English), or that the file is language-neutral.
-0Ah: int8 Platform : The platform the file is used for. 0 indicates the default platform. No other values have been observed.
-0Ch: int32 FileBlockIndex : If the hash table entry is valid, this is the index into the block table of the file. Otherwise, one of the following two values:
- FFFFFFFFh: Hash table entry is empty, and has always been empty. Terminates searches for a given file.
- FFFFFFFEh: Hash table entry is empty, but was valid at some point (in other words, the file was deleted). Does not terminate searches for a given file.
-
-2.5 FILE DATA
-00h: int32(SectorsInFile + 1) SectorOffsetTable : Offsets to the start of each sector's data, relative to the beginning of the file data. Not present if this information is calculatable (see details below).
-immediately following SectorOffsetTable: SectorData : Data of each sector in the file, packed end to end (see details below).
-
-Normally, file data is split up into sectors, for simple streaming. All sectors, save for the last, will contain as many bytes of file data as specified in the archive header's SectorSizeShift; the last sector may be smaller than this, depending on the size of the file data. This sector size is the size of the raw file data; if the file is compressed, the compressed sector will be smaller or the same size as the uncompressed sector size. Individual sectors in a compressed file may be stored uncompressed; this occurs if and only if the sector could not be compressed by the algorithm used (if the compressed sector size was greater than or equal to the size of the raw data), and is indicated by the sector's compressed size in SectorOffsetTable being equal to the uncompressed size of the sector (which may be calculated from the FileSize).
-
-If the sector is compressed (but not imploded), a bit mask byte of the compression algorithm(s) used to compress the sector is appended to the beginning of the compressed sector data. This additional byte counts towards the total size of the sector; if the size of the sector (including this byte) exceeds or matches the uncompressed size of the sector data, the sector will be stored uncompressed, and this byte omitted. Multiple compression algorithms may be used on the same sector; in this case, successive compression occurs in the order the algorithms are listed below, and decompression occurs in the opposite order. For implimentations of all of these algorithms, see StormLib.
- 40h: IMA ADPCM mono
- 80h: IMA ADPCM stereo
- 01h: Huffman encoded
- 02h: Deflated (see ZLib)
- 08h: Imploded (see PKWare Data Compression Library)
- 10h: BZip2 compressed (see BZip2)
-
-If the file is stored as a single unit (indicated in the file's Flags), there is effectively only a single sector, which
-contains the entire file.
-
-If the file is encrypted, each sector (after compression and appendage of the compression type byte, if applicable)
-is encrypted with the file's key. The base key for a file is determined by a hash of the file name stripped of the
-directory (i.e. the key for a file named "directory\file" would be computed as the hash of "file"). If this key is
-adjusted, as indicated in the file's Flags, the final key is calculated as ((base key + BlockOffset - ArchiveOffset)
-XOR FileSize) (StormLib - an open-source implementation of the MoPaQ reading and writing functions,
-by Ladislav Zezula - incorrectly uses an AND in place of the XOR). Each sector is encrypted using the key + the
-0-based index of the sector in the file. The SectorOffsetTable, if present, is encrypted using the key - 1.
-
-The SectorOffsetTable is omitted when the sizes and offsets of all sectors in the file are calculatable from the FileSize.
-This can happen in several circumstances. If the file is not compressed/imploded, then the size and offset of all sectors
-is known, based on the archive's SectorSizeShift. If the file is stored as a single unit compressed/imploded, then the
-SectorOffsetTable is omitted, as the single file "sector" corresponds to BlockSize and FileSize, as mentioned previously.
-Note that the SectorOffsetTable will always be present if the file is compressed/imploded and the file is not stored as
-a single unit, even if there is only a single sector in the file (the size of the file is less than or equal to the
-archive's sector size).
-
-2.6 LISTFILE
-The listfile is a very simple extension to the MoPaQ format that contains the file paths of (most) files in the archive.
-The languages and platforms of the files are not stored in the listfile. The listfile is contained in the file "(listfile)",
-and is simply a non-Unix-style text file with one file path on each line, lines terminated with the bytes 0Dh 0Ah. The file
-"(listfile)" may not be listed in the listfile.
-
-2.7 EXTENDED ATTRIBUTES
-The extended attributes are optional file attributes for files in the block table. These attributes were added at times after
-the MoPaQ format was already finalized, and it is not necessary for every archive to have all (or any) of the extended attributes.
-If an archive contains a given attribute, there will be an instance of that attribute for every block in the block table, although
-the attribute will be meaningless if the block is not a file. The order of the attributes for blocks correspond to the order of the
-blocks in the block table, and are of the same number. The attributes are stored in parallel arrays in the "(attributes)" file,
-in the archive. The attributes corresponding to this file need not be valid (and logically cannot be). Unlike all the other
-structures in the MoPaQ format, entries in the extended attributes are NOT guaranteed to be aligned. Also note that in some
-archives, malicious zeroing of the attributes has been observed, perhaps with the intent of breaking archive viewers. This
-file is structured as follows:
-
-00h: int32 Version : Specifies the extended attributes format version. For now, must be 100.
-04h: int32 AttributesPresent : Bit mask of the extended attributes present in the archive:
- 00000001h: File CRC32s.
- 00000002h: File timestamps.
- 00000004h: File MD5s.
-08h: int32(BlockTableEntries) CRC32s : CRC32s of the (uncompressed) file data for each block in the archive. Omitted if the
-archive does not have CRC32s. immediately after CRC32s: FILETIME(BlockTableEntries) Timestamps : Timestamps for each block
-in the archive. The format is that of the Windows FILETIME structure. Omitted if the archive does not have timestamps.
-immediately after Timestamps: MD5(BlockTableEntries) MD5s : MD5s of the (uncompressed) file data for each block in the archive.
-Omitted if the archive does not have MD5s.
-
-2.8 WEAK DIGITAL SIGNATURE
-The weak digital signature is a digital signature using Microsoft CryptoAPI. It is an implimentation of the RSASSA-PKCS1-v1_5
-digital signature protocol, using the MD5 hashing algorithm and a 512-bit (weak) RSA key (for more information about this
-protocol, see the RSA Labs PKCS1 specification). The public key and exponent are stored in a resource in Storm. The signature
-is stored uncompressed, unencrypted in the file "(signature)" in the archive. The archive is hashed from the beginning of the
-archive (ArchiveOffset in the containing file) to the end of the archive (the length indicated by ArchiveSize); the signature
-file is added to the archive before signing, and the space occupied by the file is considered to be all binary 0s during
-signing/verification. This file is structured as follows:
-
-00h: int32 Unknown : Must be 0.
-04h: int32 Unknown : must be 0.
-08h: int512 Signature : The digital signature. Like all other numbers in the MoPaQ format, this is stored in little-endian order.
-
-2.9 STRONG DIGITAL SIGNATURE
-The strong digital signature uses a simple proprietary implementation of RSA signing, using the SHA-1 hashing algorithm and
-a 2048-bit (strong) RSA key. The default public key and exponent are stored in Storm, but other keys may be used as well.
-The strong digital signature is stored immediately after the archive, in the containing file; the entire archive (ArchiveSize
-bytes, starting at ArchiveOffset in the containing file) is hashed as a single block. The signature has the following format:
-
-00h: char(4) Magic : Indicates the presence of a digital signature. Must be "NGIS" ("SIGN" backwards).
-04h: int2048 Signature : The digital signature, stored in little-endian format.
-
-When the Signature field is decrypted with the public key and exponent, and the result stored in little-endian order, it is structured as follows:
-
-00h: byte Padding : Must be 0Bh.
-01h: byte(235) Padding : Must be BBh.
-ECh: byte(20) SHA-1 : SHA-1 hash of the archive, in standard SHA-1 format.
-
-3. ALGORITHM SOURCE CODE
-3.1 ENCRYPTION/DECRYPTION
-I believe this was derived at some point from code in StormLib. Assumes the long type to be 32 bits, and the machine to be little endian order.
-
-unsigned long dwCryptTable[0x500];
-
-void InitializeCryptTable()
-{
- unsigned long seed = 0x00100001;
- unsigned long index1 = 0;
- unsigned long index2 = 0;
- int i;
-
- for (index1 = 0; index1 < 0x100; index1++)
- {
- for (index2 = index1, i = 0; i < 5; i++, index2 += 0x100)
- {
- unsigned long temp1, temp2;
-
- seed = (seed * 125 + 3) % 0x2AAAAB;
- temp1 = (seed & 0xFFFF) << 0x10;
-
- seed = (seed * 125 + 3) % 0x2AAAAB;
- temp2 = (seed & 0xFFFF);
-
- dwCryptTable[index2] = (temp1 | temp2);
- }
- }
-}
-
-void EncryptData(void *lpbyBuffer, unsigned long dwLength, unsigned long dwKey)
-{
- unsigned long *lpdwBuffer = (unsigned long *)lpbyBuffer;
- unsigned long seed = 0xEEEEEEEE;
- unsigned long ch;
-
- assert(lpbyBuffer);
-
- dwLength /= sizeof(unsigned long);
-
- while(dwLength-- > 0)
- {
- seed += dwCryptTable[0x400 + (dwKey & 0xFF)];
- ch = *lpdwBuffer ^ (dwKey + seed);
-
- dwKey = ((~dwKey << 0x15) + 0x11111111) | (dwKey >> 0x0B);
- seed = *lpdwBuffer + seed + (seed << 5) + 3;
-
- *lpdwBuffer++ = ch;
- }
-}
-
-void DecryptData(void *lpbyBuffer, unsigned long dwLength, unsigned long dwKey)
-{
- unsigned long *lpdwBuffer = (unsigned long *)lpbyBuffer;
- unsigned long seed = 0xEEEEEEEE;
- unsigned long ch;
-
- assert(lpbyBuffer);
-
- dwLength /= sizeof(unsigned long);
-
- while(dwLength-- > 0)
- {
- seed += dwCryptTable[0x400 + (dwKey & 0xFF)];
- ch = *lpdwBuffer ^ (dwKey + seed);
-
- dwKey = ((~dwKey << 0x15) + 0x11111111) | (dwKey >> 0x0B);
- seed = ch + seed + (seed << 5) + 3;
-
- *lpdwBuffer++ = ch;
- }
-}
-
-3.2 HASHING
-Based on code from StormLib.
-
-// Different types of hashes to make with HashString
-#define MPQ_HASH_TABLE_OFFSET 0
-#define MPQ_HASH_NAME_A 1
-#define MPQ_HASH_NAME_B 2
-#define MPQ_HASH_FILE_KEY 3
-
-unsigned long HashString(const char *lpszString, unsigned long dwHashType)
-{
- unsigned long seed1 = 0x7FED7FED;
- unsigned long seed2 = 0xEEEEEEEE;
- int ch;
-
- while (*lpszString != 0)
- {
- ch = toupper(*lpszString++);
-
- seed1 = dwCryptTable[(dwHashType * 0xFF) + ch] ^ (seed1 + seed2);
- seed2 = ch + seed1 + seed2 + (seed2 << 5) + 3;
- }
- return seed1;
-}
-
-3.3 CONVERSION OF FILETIME AND time_t
-
-#define EPOCH_OFFSET 116444736000000000ULL // Number of 100 ns units between 01/01/1601 and 01/01/1970
-
-bool GetTimeFromFileTime(FILETIME &fileTime, time_t &time)
-{
- // The FILETIME represents a 64-bit integer: the number of 100 ns units since January 1, 1601
- unsigned long long nTime = ((unsigned long long)fileTime.dwHighDateTime << 32) + fileTime.dwLowDateTime;
-
- if (nTime < EPOCH_OFFSET)
- return false;
-
- nTime -= EPOCH_OFFSET; // Convert the time base from 01/01/1601 to 01/01/1970
- nTime /= 10000000ULL; // Convert 100 ns to sec
-
- time = (time_t)nTime;
-
- // Test for overflow (FILETIME is 64 bits, time_t is 32 bits)
- if ((nTime - (unsigned long long)time) > 0)
- return false;
-
- return true;
-}
-
-void GetFileTimeFromTime(time_t &time, FILETIME &fileTime)
-{
- unsigned long long nTime = (unsigned long long)time;
-
- nTime *= 10000000ULL;
- nTime += EPOCH_OFFSET;
-
- fileTime.dwLowDateTime = (DWORD)nTime;
- fileTime.dwHighDateTime = (DWORD)(nTime >> 32);
-}
diff --git a/contrib/vmap_extractor_v2/doc/MoPaQ_1.0.txt b/contrib/vmap_extractor_v2/doc/MoPaQ_1.0.txt
deleted file mode 100644
index 6a21eca5472..00000000000
--- a/contrib/vmap_extractor_v2/doc/MoPaQ_1.0.txt
+++ /dev/null
@@ -1,421 +0,0 @@
-THE MOPAQ ARCHIVE FORMAT
-v1.0 (Friday, September 1, 2006)
-by Justin Olbrantz(Quantam)
-
-Distribution and reproduction of this specification are allowed without limitation, as long as it is not altered. Quotation in other works is freely allowed, as long as the source and author of the quote are stated.
-
-TABLE OF CONTENTS
-1. Introduction to the MoPaQ Format
-2. The MoPaQ Format
- 2.1 General Archive Layout
- 2.2 Archive Header
- 2.3 Block Table
- 2.4 Extended Block Table
- 2.5 Hash Table
- 2.6 File Data
- 2.7 Listfile
- 2.8 Extended Attributes
- 2.9 Weak (Old) Digital Signature
- 2.10 Strong (New) Digital Signature
-3. Algorithm Source Code
- 3.1 Encryption/Decryption
- 3.2 Hashing and File Key Computation
- 3.3 Finding Files
- 3.4 Deleting Files
- 3.5 Conversion of FILETIME and time_t
- 3.6 Forming a 64-bit Large Archive Offset from 32-bit and 16-bit Components
-4. Revision History
-
-1. INTRODUCTION TO THE MOPAQ FORMAT
-The MoPaQ (or MPQ) format is an archive file format designed by Mike O'Brien (hence the name Mike O'brien PaCK) at Blizzard Entertainment. The format has been used in all Blizzard games since (and including) Diablo. It is heavily optimized to be a read-only game archive format, and excels at this role.
-
-The Blizzard MoPaQ-reading functions are contained in the Storm module, which my be either statically or dynamically linked. The Blizzard MoPaQ-writing functions are contained in the MPQAPI module, which is always statically linked.
-
-StormLib - mentioned several times in this specification - is an open-source MoPaQ reading and writing library written by Ladislav Zezula (no affiliation with Blizzard Entertainment). While it's a bit dated, and does not support all of the newer MoPaQ features, it contains source code to the more exotic compression methods used by MoPaQ, such as the PKWare implode algorithm, MoPaQ's huffman compression algorithm, and the IMA ADPCM compression used by MoPaQ.
-
-2. THE MOPAQ FORMAT
-All numbers in the MoPaQ format are in little endian byte order; signed numbers use the two's complement system. Data types are listed either as int (integer, the number of bits specified), byte (8 bits), or char (bytes which contain ASCII characters). All sizes and offsets are in bytes, unless specified otherwise. Structure members are listed in the following general form:
-offset from the beginning of the structure: data type(array size) member name : member description
-
-2.1 GENERAL ARCHIVE LAYOUT
-- Archive Header
-- File Data
-- File Data - Special Files
-- Hash Table
-- Block Table
-- Extended Block Table
-- Strong Digital signature
-
-This is the usual archive format, but it is not mandatory. Some archives have been observed placing the hash table and file table after the archive header, and before the file data.
-
-2.2 ARCHIVE HEADER
-00h: char(4) Magic : Indicates that the file is a MoPaQ archive. Must be ASCII "MPQ" 1Ah.
-04h: int32 HeaderSize : Size of the archive header.
-08h: int32 ArchiveSize : Size of the whole archive, including the header. Does not include the strong digital signature, if present. This size is used, among other things, for determining the region to hash in computing the digital signature. This field is deprecated in the Burning Crusade MoPaQ format, and the size of the archive is calculated as the size from the beginning of the archive to the end of the hash table, block table, or extended block table (whichever is largest).
-0Ch: int16 FormatVersion : MoPaQ format version. MPQAPI will not open archives where this is negative. Known versions:
- 0000h: Original format. HeaderSize should be 20h, and large archives are not supported.
- 0001h: Burning Crusade format. Header size should be 2Ch, and large archives are supported.
-0Eh: int8 SectorSizeShift : Power of two exponent specifying the number of 512-byte disk sectors in each logical sector in the archive. The size of each logical sector in the archive is 512 * 2^SectorSizeShift. Bugs in the Storm library dictate that this should always be 3 (4096 byte sectors).
-10h: int32 HashTableOffset : Offset to the beginning of the hash table, relative to the beginning of the archive.
-14h: int32 BlockTableOffset : Offset to the beginning of the block table, relative to the beginning of the archive.
-18h: int32 HashTableEntries : Number of entries in the hash table. Must be a power of two, and must be less than 2^16 for the original MoPaQ format, or less than 2^20 for the Burning Crusade format.
-1Ch: int32 BlockTableEntries : Number of entries in the block table.
-Fields only present in the Burning Crusade format and later:
-20h: int64 ExtendedBlockTableOffset : Offset to the beginning of the extended block table, relative to the beginning of the archive.
-28h: int16 HashTableOffsetHigh : High 16 bits of the hash table offset for large archives.
-2Ah: int16 BlockTableOffsetHigh : High 16 bits of the block table offset for large archives.
-
-The archive header is the first structure in the archive, at archive offset 0; however, the archive does not need to be at offset 0 of the containing file. The offset of the archive in the file is referred to here as ArchiveOffset. If the archive is not at the beginning of the file, it must begin at a disk sector boundary (512 bytes). Early versions of Storm require that the archive be at the end of the containing file (ArchiveOffset + ArchiveSize = file size), but this is not required in newer versions (due to the strong digital signature not being considered a part of the archive).
-
-2.3 BLOCK TABLE
-The block table contains entries for each region in the archive. Regions may be either files, empty space, which may be overwritten by new files (typically this space is from deleted file data), or unused block table entries. Empty space entries should have BlockOffset and BlockSize nonzero, and FileSize and Flags zero; unused block table entries should have BlockSize, FileSize, and Flags zero. The block table is encrypted, using the hash of "(block table)" as the key. Each entry is structured as follows:
-
-00h: int32 BlockOffset : Offset of the beginning of the block, relative to the beginning of the archive.
-04h: int32 BlockSize : Size of the block in the archive.
-08h: int32 FileSize : Size of the file data stored in the block. Only valid if the block is a file; otherwise meaningless, and should be 0. If the file is compressed, this is the size of the uncompressed file data.
-0Ch: int32 Flags : Bit mask of the flags for the block. The following values are conclusively identified:
- 80000000h: Block is a file, and follows the file data format; otherwise, block is free space or unused. If the block is not a file, all other flags should be cleared, and FileSize should be 0.
- 01000000h: File is stored as a single unit, rather than split into sectors.
- 00020000h: The file's encryption key is adjusted by the block offset and file size (explained in detail in the File Data section). File must be encrypted.
- 00010000h: File is encrypted.
- 00000200h: File is compressed. File cannot be imploded.
- 00000100h: File is imploded. File cannot be compressed.
-
-2.4 EXTENDED BLOCK TABLE
-The extended block table was added to support archives larger than 4 gigabytes (2^32 bytes). The table contains the upper bits of the archive offsets for each block in the block table. It is simply an array of int16s, which become bits 32-47 of the archive offsets for each block, with bits 48-63 being zero. Individual blocks in the archive are still limited to 4 gigabytes in size. This table is only present in Burning Crusade format archives that exceed 4 gigabytes size.
-
-As of the Burning Crusade Friends and Family beta, this table is not encrypted.
-
-2.5 HASH TABLE
-Instead of storing file names, for quick access MoPaQs use a fixed, power of two-size hash table of files in the archive. A file is uniquely identified by its file path, its language, and its platform. The home entry for a file in the hash table is computed as a hash of the file path. In the event of a collision (the home entry is occupied by another file), progressive overflow is used, and the file is placed in the next available hash table entry. Searches for a desired file in the hash table proceed from the home entry for the file until either the file is found, the entire hash table is searched, or an empty hash table entry (FileBlockIndex of FFFFFFFFh) is encountered. The hash table is encrypted using the hash of "(hash table)" as the key. Each entry is structured as follows:
-
-00h: int32 FilePathHashA : The hash of the file path, using method A.
-04h: int32 FilePathHashB : The hash of the file path, using method B.
-08h: int16 Language : The language of the file. This is a Windows LANGID data type, and uses the same values. 0 indicates the default language (American English), or that the file is language-neutral.
-0Ah: int8 Platform : The platform the file is used for. 0 indicates the default platform. No other values have been observed.
-0Ch: int32 FileBlockIndex : If the hash table entry is valid, this is the index into the block table of the file. Otherwise, one of the following two values:
- FFFFFFFFh: Hash table entry is empty, and has always been empty. Terminates searches for a given file.
- FFFFFFFEh: Hash table entry is empty, but was valid at some point (in other words, the file was deleted). Does not terminate searches for a given file.
-
-2.6 FILE DATA
-The data for each file is composed of the following structure:
-00h: int32(SectorsInFile + 1) SectorOffsetTable : Offsets to the start of each sector, relative to the beginning of the file data. The last entry contains the file size, making it possible to easily calculate the size of any given sector. This table is not present if this information can be calculated (see details below).
-immediately following SectorOffsetTable: SECTOR Sectors(SectorsInFile) : Data of each sector in the file, packed end to end (see details below).
-
-Normally, file data is split up into sectors, for simple streaming. All sectors, save for the last, will contain as many bytes of file data as specified in the archive header's SectorSizeShift; the last sector may contain less than this, depending on the size of the entire file's data. If the file is compressed or imploded, the sector will be smaller or the same size as the file data it contains. Individual sectors in a compressed or imploded file may be stored uncompressed; this occurs if and only if the file data the sector contains could not be compressed by the algorithm(s) used (if the compressed sector size was greater than or equal to the size of the file data), and is indicated by the sector's size in SectorOffsetTable being equal to the size of the file data in the sector (which may be calculated from the FileSize).
-
-The format of each sector depends on the kind of sector it is. Uncompressed sectors are simply the the raw file data contained in the sector. Imploded sectors are the raw compressed data following compression with the implode algorithm (these sectors can only be in imploded files). Compressed sectors (only found in compressed - not imploded - files) are compressed with one or more compression algorithms, and have the following structure:
-00h: byte CompressionMask : Mask of the compression types applied to this sector. If multiple compression types are used, they are applied in the order listed below, and decompression is performed in the opposite order. This byte counts towards the total sector size, meaning that the sector will be stored uncompressed if the data cannot be compressed by at least two bytes; as well, this byte is encrypted with the sector data, if applicable. The following compression types are defined (for implementations of these algorithms, see StormLib):
- 40h: IMA ADPCM mono
- 80h: IMA ADPCM stereo
- 01h: Huffman encoded
- 02h: Deflated (see ZLib)
- 08h: Imploded (see PKWare Data Compression Library)
- 10h: BZip2 compressed (see BZip2)
-01h: byte(SectorSize - 1) SectorData : The compressed data for the sector.
-
-If the file is stored as a single unit (indicated in the file's Flags), there is effectively only a single sector, which contains the entire file data.
-
-If the file is encrypted, each sector (after compression/implosion, if applicable) is encrypted with the file's key. The base key for a file is determined by a hash of the file name stripped of the directory (i.e. the key for a file named "directory\file" would be computed as the hash of "file"). If this key is adjusted, as indicated in the file's Flags, the final key is calculated as ((base key + BlockOffset - ArchiveOffset) XOR FileSize) (StormLib incorrectly uses an AND in place of the XOR). Each sector is encrypted using the key + the 0-based index of the sector in the file. The SectorOffsetTable, if present, is encrypted using the key - 1.
-
-The SectorOffsetTable is omitted when the sizes and offsets of all sectors in the file are calculatable from the FileSize. This can happen in several circumstances. If the file is not compressed/imploded, then the size and offset of all sectors is known, based on the archive's SectorSizeShift. If the file is stored as a single unit compressed/imploded, then the SectorOffsetTable is omitted, as the single file "sector" corresponds to BlockSize and FileSize, as mentioned previously. However, the SectorOffsetTable will be present if the file is compressed/imploded and the file is not stored as a single unit, even if there is only a single sector in the file (the size of the file is less than or equal to the archive's sector size).
-
-2.7 LISTFILE
-The listfile is a very simple extension to the MoPaQ format that contains the file paths of (most) files in the archive. The languages and platforms of the files are not stored in the listfile. The listfile is contained in the file "(listfile)" (default language and platform), and is simply a text file with file paths separated by ';', 0Dh, 0Ah, or some combination of these. The file "(listfile)" may not be listed in the listfile.
-
-2.8 EXTENDED ATTRIBUTES
-The extended attributes are optional file attributes for files in the block table. These attributes were added at times after the MoPaQ format was already finalized, and it is not necessary for every archive to have all (or any) of the extended attributes. If an archive contains a given attribute, there will be an instance of that attribute for every block in the block table, although the attribute will be meaningless if the block is not a file. The order of the attributes for blocks correspond to the order of the blocks in the block table, and are of the same number. The attributes are stored in parallel arrays in the "(attributes)" file (default language and platform), in the archive. The attributes corresponding to this file need not be valid (and logically cannot be). Unlike all the other structures in the MoPaQ format, entries in the extended attributes are NOT guaranteed to be aligned. Also note that in some archives, malicious zeroing of the attributes has been observed, perhaps with the intent of breaking archive viewers. This file is structured as follows:
-
-00h: int32 Version : Specifies the extended attributes format version. For now, must be 100.
-04h: int32 AttributesPresent : Bit mask of the extended attributes present in the archive:
- 00000001h: File CRC32s.
- 00000002h: File timestamps.
- 00000004h: File MD5s.
-08h: int32(BlockTableEntries) CRC32s : CRC32s of the (uncompressed) file data for each block in the archive. Omitted if the archive does not have CRC32s.
-immediately after CRC32s: FILETIME(BlockTableEntries) Timestamps : Timestamps for each block in the archive. The format is that of the Windows FILETIME structure. Omitted if the archive does not have timestamps.
-immediately after Timestamps: MD5(BlockTableEntries) MD5s : MD5s of the (uncompressed) file data for each block in the archive. Omitted if the archive does not have MD5s.
-
-2.9 WEAK DIGITAL SIGNATURE
-The weak digital signature is a digital signature using Microsoft CryptoAPI. It is an implimentation of the RSASSA-PKCS1-v1_5 digital signature protocol, using the MD5 hashing algorithm and a 512-bit (weak) RSA key (for more information about this protocol, see the RSA Labs PKCS1 specification). The public key and exponent are stored in a resource in Storm, the private key is stored in a separate file, whose filename is passed to MPQAPI (the private key is not stored in MPQAPI). The signature is stored uncompressed, unencrypted in the file "(signature)" (default language and platform) in the archive. The archive is hashed from the beginning of the archive (ArchiveOffset in the containing file) to the end of the archive (the length indicated by ArchiveSize, or calculated in the Burning Crusade MoPaQ format); the signature file is added to the archive before signing, and the space occupied by the file is considered to be all binary 0s during signing/verification. This file is structured as follows:
-
-00h: int32 Unknown : Must be 0.
-04h: int32 Unknown : Must be 0.
-08h: int512 Signature : The digital signature. Like all other numbers in the MoPaQ format, this is stored in little-endian order. The structure of this, when decrypted, follows the RSASSA-PKCS1-v1_5 specification; this format is rather icky to work with (I wrote a program to verify this signature using nothing but an MD5 function and huge integer functions; it wasn't pleasant), and best left to an encryption library such as Cryto++.
-
-2.10 STRONG DIGITAL SIGNATURE
-The strong digital signature uses a simple proprietary implementation of RSA signing, using the SHA-1 hashing algorithm and a 2048-bit (strong) RSA key. The default public key and exponent are stored in Storm, but other keys may be used as well. The strong digital signature is stored immediately after the archive, in the containing file; the entire archive (ArchiveSize bytes, starting at ArchiveOffset in the containing file) is hashed as a single block. The signature has the following format:
-
-00h: char(4) Magic : Indicates the presence of a digital signature. Must be "NGIS" ("SIGN" backwards).
-04h: int2048 Signature : The digital signature, stored in little-endian format.
-
-When the Signature field is decrypted with the public key and exponent, and the resulting large integer is stored in little-endian order, it is structured as follows:
-
-00h: byte Padding : Must be 0Bh.
-01h: byte(235) Padding : Must be BBh.
-ECh: byte(20) SHA-1 : SHA-1 hash of the archive, in standard SHA-1 byte order.
-
-3. ALGORITHM SOURCE CODE
-All of the sample code here assumes little endian machine byte order, that the short type is 16 bits, that the long type is 32 bits, and that the long long type is 64 bits. Adjustments must be made if these assumptions are not correct on a given platform. All code not credited otherwise was written by myself in the writing of this specification.
-
-3.1 ENCRYPTION/DECRYPTION
-Based on code from StormLib.
-
-unsigned long dwCryptTable[0x500];
-
-// The encryption and hashing functions use a number table in their procedures. This table must be initialized before the functions are called the first time.
-void InitializeCryptTable()
-{
- unsigned long seed = 0x00100001;
- unsigned long index1 = 0;
- unsigned long index2 = 0;
- int i;
-
- for (index1 = 0; index1 < 0x100; index1++)
- {
- for (index2 = index1, i = 0; i < 5; i++, index2 += 0x100)
- {
- unsigned long temp1, temp2;
-
- seed = (seed * 125 + 3) % 0x2AAAAB;
- temp1 = (seed & 0xFFFF) << 0x10;
-
- seed = (seed * 125 + 3) % 0x2AAAAB;
- temp2 = (seed & 0xFFFF);
-
- dwCryptTable[index2] = (temp1 | temp2);
- }
- }
-}
-
-void EncryptData(void *lpbyBuffer, unsigned long dwLength, unsigned long dwKey)
-{
- assert(lpbyBuffer);
-
- unsigned long *lpdwBuffer = (unsigned long *)lpbyBuffer;
- unsigned long seed = 0xEEEEEEEE;
- unsigned long ch;
-
- dwLength /= sizeof(unsigned long);
-
- while(dwLength-- > 0)
- {
- seed += dwCryptTable[0x400 + (dwKey & 0xFF)];
- ch = *lpdwBuffer ^ (dwKey + seed);
-
- dwKey = ((~dwKey << 0x15) + 0x11111111) | (dwKey >> 0x0B);
- seed = *lpdwBuffer + seed + (seed << 5) + 3;
-
- *lpdwBuffer++ = ch;
- }
-}
-
-void DecryptData(void *lpbyBuffer, unsigned long dwLength, unsigned long dwKey)
-{
- assert(lpbyBuffer);
-
- unsigned long *lpdwBuffer = (unsigned long *)lpbyBuffer;
- unsigned long seed = 0xEEEEEEEEL;
- unsigned long ch;
-
- dwLength /= sizeof(unsigned long);
-
- while(dwLength-- > 0)
- {
- seed += dwCryptTable[0x400 + (dwKey & 0xFF)];
- ch = *lpdwBuffer ^ (dwKey + seed);
-
- dwKey = ((~dwKey << 0x15) + 0x11111111L) | (dwKey >> 0x0B);
- seed = ch + seed + (seed << 5) + 3;
-
- *lpdwBuffer++ = ch;
- }
-}
-
-3.2 HASHING AND FILE KEY COMPUTATION
-These functions may have been derived from StormLib code at some point in the very distant past. It was so long ago that I don't remember for certain.
-
-// Different types of hashes to make with HashString
-#define MPQ_HASH_TABLE_OFFSET 0
-#define MPQ_HASH_NAME_A 1
-#define MPQ_HASH_NAME_B 2
-#define MPQ_HASH_FILE_KEY 3
-
-// Based on code from StormLib.
-unsigned long HashString(const char *lpszString, unsigned long dwHashType)
-{
- assert(lpszString);
- assert(dwHashType <= MPQ_HASH_FILE_KEY);
-
- unsigned long seed1 = 0x7FED7FEDL;
- unsigned long seed2 = 0xEEEEEEEEL;
- int ch;
-
- while (*lpszString != 0)
- {
- ch = toupper(*lpszString++);
-
- seed1 = dwCryptTable[(dwHashType * 0x100) + ch] ^ (seed1 + seed2);
- seed2 = ch + seed1 + seed2 + (seed2 << 5) + 3;
- }
- return seed1;
-}
-
-#define BLOCK_OFFSET_ADJUSTED_KEY 0x00020000L
-
-unsigned long ComputeFileKey(const char *lpszFilePath, const BlockTableEntry &blockEntry, unsigned long nArchiveOffset)
-{
- assert(lpszFilePath);
-
- // Find the file name part of the path
- const char *lpszFileName = strrchr(lpszFilePath, '\\');
- if (lpszFileName)
- lpszFileName++; // Skip the \
- else
- lpszFileName = lpszFilePath;
-
- // Hash the name to get the base key
- unsigned long nFileKey = HashString(lpszFileName, MPQ_HASH_FILE_KEY);
-
- // Offset-adjust the key if necessary
- if (blockEntry.Flags & BLOCK_OFFSET_ADJUSTED_KEY)
- nFileKey = (nFileKey + blockEntry.BlockOffset) ^ blockEntry.FileSize;
-
- return nFileKey;
-}
-
-3.3 FINDING FILES
-
-#define MPQ_HASH_ENTRY_EMPTY 0xFFFFFFFFL
-#define MPQ_HASH_ENTRY_DELETED 0xFFFFFFFEL
-
-bool FindFileInHashTable(const HashTableEntry *lpHashTable, unsigned long nHashTableSize, const char *lpszFilePath, unsigned short nLang, unsigned char nPlatform, unsigned long &iFileHashEntry)
-{
- assert(lpHashTable);
- assert(nHashTableSize);
- assert(lpszFilePath);
-
- // Find the home entry in the hash table for the file
- unsigned long iInitEntry = HashString(lpszFilePath, MPQ_HASH_TABLE_OFFSET) & (nHashTableSize - 1);
-
- // Is there anything there at all?
- if (lpHashTable[iInitEntry].FileBlockIndex == MPQ_HASH_ENTRY_EMPTY)
- return false;
-
- // Compute the hashes to compare the hash table entry against
- unsigned long nNameHashA = HashString(lpszFilePath, MPQ_HASH_NAME_A),
- nNameHashB = HashString(lpszFilePath, MPQ_HASH_NAME_B),
- iCurEntry = iInitEntry;
-
- // Check each entry in the hash table till a termination point is reached
- do
- {
- if (lpHashTable[iCurEntry].FileBlockIndex != MPQ_HASH_ENTRY_DELETED)
- {
- if (lpHashTable[iCurEntry].FilePathHashA == nNameHashA
- && lpHashTable[iCurEntry].FilePathHashB == nNameHashB
- && lpHashTable[iCurEntry].Language == nLang
- && lpHashTable[iCurEntry].Platform == nPlatform)
- {
- iFileHashEntry = iCurEntry;
-
- return true;
- }
- }
-
- iCurEntry = (iCurEntry + 1) & (nHashTableSize - 1);
- } while (iCurEntry != iInitEntry && lpHashTable[iCurEntry].FileBlockIndex != MPQ_HASH_ENTRY_EMPTY);
-
- return false;
-}
-
-3.4 DELETING FILES
-
-bool DeleteFile(HashTableEntry *lpHashTable, unsigned long nHashTableSize, BlockTableEntry *lpBlockTable, const char *lpszFilePath, unsigned short nLang, unsigned char nPlatform)
-{
- assert(lpHashTable);
- assert(nHashTableSize);
- assert(lpBlockTable);
-
- // Find the file in the hash table
- unsigned long iFileHashEntry;
-
- if (!FindFileInHashTable(lpHashTable, nHashTableSize, lpszFilePath, nLang, nPlatform, iFileHashEntry))
- return false;
-
- // Get the block table index before we nuke the hash table entry
- unsigned long iFileBlockEntry = lpHashTable[iFileHashEntry].FileBlockIndex;
-
- // Delete the file's entry in the hash table
- memset(&lpHashTable[iFileHashEntry], 0xFF, sizeof(HashTableEntry));
-
- // If the next entry is empty, mark this one as empty; otherwise, mark this as deleted.
- if (lpHashTable[(iFileHashEntry + 1) & (nHashTableSize - 1)].FileBlockIndex == MPQ_HASH_ENTRY_EMPTY)
- lpHashTable[iFileHashEntry].FileBlockIndex = MPQ_HASH_ENTRY_EMPTY;
- else
- lpHashTable[iFileHashEntry].FileBlockIndex = MPQ_HASH_ENTRY_DELETED;
-
- // If the block occupies space, mark the block as free space; otherwise, clear the block table entry.
- if (lpBlockTable[iFileBlockEntry].BlockSize > 0)
- {
- lpBlockTable[iFileBlockEntry].FileSize = 0;
- lpBlockTable[iFileBlockEntry].Flags = 0;
- }
- else
- memset(&lpBlockTable[iFileBlockEntry], 0, sizeof(BlockTableEntry);
-
- return true;
-}
-
-3.5 CONVERSION OF FILETIME AND time_t
-This code assumes that the base ("zero") date for time_t is 01/01/1970. This is true on Windows, Unix System V systems, and Mac OS X. It is unknown whether this is true on all other platforms. You'll need to research this yourself, if you plan on porting it somewhere else.
-
-#define EPOCH_OFFSET 116444736000000000ULL // Number of 100 ns units between 01/01/1601 and 01/01/1970
-
-bool GetTimeFromFileTime(const FILETIME &fileTime, time_t &time)
-{
- // The FILETIME represents a 64-bit integer: the number of 100 ns units since January 1, 1601
- unsigned long long nTime = ((unsigned long long)fileTime.dwHighDateTime << 32) + fileTime.dwLowDateTime;
-
- if (nTime < EPOCH_OFFSET)
- return false;
-
- nTime -= EPOCH_OFFSET; // Convert the time base from 01/01/1601 to 01/01/1970
- nTime /= 10000000ULL; // Convert 100 ns to sec
-
- time = (time_t)nTime;
-
- // Test for overflow (FILETIME is 64 bits, time_t is 32 bits)
- if ((nTime - (unsigned long long)time) > 0)
- return false;
-
- return true;
-}
-
-void GetFileTimeFromTime(const time_t &time, FILETIME &fileTime)
-{
- unsigned long long nTime = (unsigned long long)time;
-
- nTime *= 10000000ULL;
- nTime += EPOCH_OFFSET;
-
- fileTime.dwLowDateTime = (DWORD)nTime;
- fileTime.dwHighDateTime = (DWORD)(nTime >> 32);
-}
-
-3.6 FORMING A 64-BIT LARGE ARCHIVE OFFSET FROM 32-BIT AND 16-BIT COMPONENTS
-unsigned long long MakeLargeArchiveOffset(unsigned long nOffsetLow, unsigned short nOffsetHigh)
-{
- return ((unsigned long long)nOffsetHigh << 32) + (unsigned long long)nOffsetLow;
-}
-
-4. REVISION HISTORY
-1.0
- - Updated to include most of the changes found in the Burning Crusade Friends and Family beta
-
-0.91.
- - Updated several structure member descriptions
- - Listed the full set of characters that can separate list file entries
- - Noted that (attributes), (listfile), and (signature) use the default language and platform codes
- - Redid part of the file data specs to clarify the format of sectors
- - Enhanced descriptions of the different kinds of block table entries
- - Added ComputeFileKey, FindFileInHashTable, and DeleteFile source \ No newline at end of file
diff --git a/contrib/vmap_extractor_v2/stormlib/Makefile b/contrib/vmap_extractor_v2/stormlib/Makefile
deleted file mode 100644
index e3b19e36d6f..00000000000
--- a/contrib/vmap_extractor_v2/stormlib/Makefile
+++ /dev/null
@@ -1,58 +0,0 @@
-########################################################################
-#
-# Makefile for compiling StormLib under linux
-#
-# Author: Marko Friedemann <marko.friedemann@bmx-chemnitz.de>
-# Created at: Mon Jan 29 18:26:01 CEST 2001
-# Computer: whiplash.flachland-chemnitz.de
-# System: Linux 2.4.0 on i686
-#
-# Copyright (c) 2001 BMX-Chemnitz.DE All rights reserved.
-#
-########################################################################
-
-FILES.cpp = SCommon.cpp SCompression.cpp SFileCompactArchive.cpp \
- SFileCreateArchiveEx.cpp SFileExtractFile.cpp SFileFindFile.cpp \
- SListFile.cpp SFileOpenArchive.cpp SFileOpenFileEx.cpp SFileReadFile.cpp \
- StormPortLinux.cpp wave/wave.cpp huffman/huff.cpp \
- pklib/crc32.cpp pklib/explode.cpp pklib/implode.cpp
-FILES.o = $(FILES.cpp:.cpp=.o)
-
-LIB = libStorm.so
-
-CXX = g++
-CFLAGS = -Wall -s -D__SYS_ZLIB
-I_FLAGS =
-LDFLAGS = -lz -lbz2
-
-all: $(LIB)
-
-$(LIB): $(FILES.o)
- $(LD) -shared $(LDFLAGS) -o $(LIB) $(FILES.o)
-
-%.o: %.cpp
- $(CXX) $(CFLAGS) -c $< -o $@
-
-clean:
- $(RM) $(FILES.o) $(LIB)
-
-new: clean all
-
-mrproper: clean
- $(RM) Makefile.deps
-
-mrnew: mrproper new
-
-install: $(LIB)
- install $(I_FLAGS) $(LIB) /usr/local/lib
- mkdir -p /usr/local/include/StormLib
- cp Storm.h /usr/local/include/StormLib
- cp StormPort.h /usr/local/include/StormLib
- ldconfig
-
-deps:
- $(CXX) -MM $(CFLAGS) $(FILES.cpp) > Makefile.deps
-
--include Makefile.deps
-
-.PHONY: all clean new mrpoper mrnew install deps
diff --git a/contrib/vmap_extractor_v2/stormlib/bzip2/Makefile b/contrib/vmap_extractor_v2/stormlib/bzip2/Makefile
deleted file mode 100644
index eea329a626e..00000000000
--- a/contrib/vmap_extractor_v2/stormlib/bzip2/Makefile
+++ /dev/null
@@ -1,205 +0,0 @@
-
-SHELL=/bin/sh
-
-# To assist in cross-compiling
-CC=gcc
-AR=ar
-RANLIB=ranlib
-LDFLAGS=
-
-BIGFILES=-D_FILE_OFFSET_BITS=64
-CFLAGS=-Wall -Winline -O -g $(BIGFILES)
-
-# Where you want it installed when you do 'make install'
-PREFIX=/usr
-
-
-OBJS= blocksort.o \
- huffman.o \
- crctable.o \
- randtable.o \
- compress.o \
- decompress.o \
- bzlib.o
-
-all: libbz2.a bzip2 bzip2recover test
-
-bzip2: libbz2.a bzip2.o
- $(CC) $(CFLAGS) $(LDFLAGS) -o bzip2 bzip2.o -L. -lbz2
-
-bzip2recover: bzip2recover.o
- $(CC) $(CFLAGS) $(LDFLAGS) -o bzip2recover bzip2recover.o
-
-libbz2.a: $(OBJS)
- rm -f libbz2.a
- $(AR) cq libbz2.a $(OBJS)
- @if ( test -f $(RANLIB) -o -f /usr/bin/ranlib -o \
- -f /bin/ranlib -o -f /usr/ccs/bin/ranlib ) ; then \
- echo $(RANLIB) libbz2.a ; \
- $(RANLIB) libbz2.a ; \
- fi
-
-check: test
-test: bzip2
- @cat words1
- ./bzip2 -1 < sample1.ref > sample1.rb2
- ./bzip2 -2 < sample2.ref > sample2.rb2
- ./bzip2 -3 < sample3.ref > sample3.rb2
- ./bzip2 -d < sample1.bz2 > sample1.tst
- ./bzip2 -d < sample2.bz2 > sample2.tst
- ./bzip2 -ds < sample3.bz2 > sample3.tst
- cmp sample1.bz2 sample1.rb2
- cmp sample2.bz2 sample2.rb2
- cmp sample3.bz2 sample3.rb2
- cmp sample1.tst sample1.ref
- cmp sample2.tst sample2.ref
- cmp sample3.tst sample3.ref
- @cat words3
-
-install: bzip2 bzip2recover
- if ( test ! -d $(PREFIX)/bin ) ; then mkdir -p $(PREFIX)/bin ; fi
- if ( test ! -d $(PREFIX)/lib ) ; then mkdir -p $(PREFIX)/lib ; fi
- if ( test ! -d $(PREFIX)/man ) ; then mkdir -p $(PREFIX)/man ; fi
- if ( test ! -d $(PREFIX)/man/man1 ) ; then mkdir -p $(PREFIX)/man/man1 ; fi
- if ( test ! -d $(PREFIX)/include ) ; then mkdir -p $(PREFIX)/include ; fi
- cp -f bzip2 $(PREFIX)/bin/bzip2
- cp -f bzip2 $(PREFIX)/bin/bunzip2
- cp -f bzip2 $(PREFIX)/bin/bzcat
- cp -f bzip2recover $(PREFIX)/bin/bzip2recover
- chmod a+x $(PREFIX)/bin/bzip2
- chmod a+x $(PREFIX)/bin/bunzip2
- chmod a+x $(PREFIX)/bin/bzcat
- chmod a+x $(PREFIX)/bin/bzip2recover
- cp -f bzip2.1 $(PREFIX)/man/man1
- chmod a+r $(PREFIX)/man/man1/bzip2.1
- cp -f bzlib.h $(PREFIX)/include
- chmod a+r $(PREFIX)/include/bzlib.h
- cp -f libbz2.a $(PREFIX)/lib
- chmod a+r $(PREFIX)/lib/libbz2.a
- cp -f bzgrep $(PREFIX)/bin/bzgrep
- ln $(PREFIX)/bin/bzgrep $(PREFIX)/bin/bzegrep
- ln $(PREFIX)/bin/bzgrep $(PREFIX)/bin/bzfgrep
- chmod a+x $(PREFIX)/bin/bzgrep
- cp -f bzmore $(PREFIX)/bin/bzmore
- ln $(PREFIX)/bin/bzmore $(PREFIX)/bin/bzless
- chmod a+x $(PREFIX)/bin/bzmore
- cp -f bzdiff $(PREFIX)/bin/bzdiff
- ln $(PREFIX)/bin/bzdiff $(PREFIX)/bin/bzcmp
- chmod a+x $(PREFIX)/bin/bzdiff
- cp -f bzgrep.1 bzmore.1 bzdiff.1 $(PREFIX)/man/man1
- chmod a+r $(PREFIX)/man/man1/bzgrep.1
- chmod a+r $(PREFIX)/man/man1/bzmore.1
- chmod a+r $(PREFIX)/man/man1/bzdiff.1
- echo ".so man1/bzgrep.1" > $(PREFIX)/man/man1/bzegrep.1
- echo ".so man1/bzgrep.1" > $(PREFIX)/man/man1/bzfgrep.1
- echo ".so man1/bzmore.1" > $(PREFIX)/man/man1/bzless.1
- echo ".so man1/bzdiff.1" > $(PREFIX)/man/man1/bzcmp.1
-
-clean:
- rm -f *.o libbz2.a bzip2 bzip2recover \
- sample1.rb2 sample2.rb2 sample3.rb2 \
- sample1.tst sample2.tst sample3.tst
-
-blocksort.o: blocksort.c
- @cat words0
- $(CC) $(CFLAGS) -c blocksort.c
-huffman.o: huffman.c
- $(CC) $(CFLAGS) -c huffman.c
-crctable.o: crctable.c
- $(CC) $(CFLAGS) -c crctable.c
-randtable.o: randtable.c
- $(CC) $(CFLAGS) -c randtable.c
-compress.o: compress.c
- $(CC) $(CFLAGS) -c compress.c
-decompress.o: decompress.c
- $(CC) $(CFLAGS) -c decompress.c
-bzlib.o: bzlib.c
- $(CC) $(CFLAGS) -c bzlib.c
-bzip2.o: bzip2.c
- $(CC) $(CFLAGS) -c bzip2.c
-bzip2recover.o: bzip2recover.c
- $(CC) $(CFLAGS) -c bzip2recover.c
-
-
-distclean: clean
- rm -f manual.ps manual.html manual.pdf
-
-DISTNAME=bzip2-1.0.3
-dist: check manual
- rm -f $(DISTNAME)
- ln -sf . $(DISTNAME)
- tar cvf $(DISTNAME).tar \
- $(DISTNAME)/blocksort.c \
- $(DISTNAME)/huffman.c \
- $(DISTNAME)/crctable.c \
- $(DISTNAME)/randtable.c \
- $(DISTNAME)/compress.c \
- $(DISTNAME)/decompress.c \
- $(DISTNAME)/bzlib.c \
- $(DISTNAME)/bzip2.c \
- $(DISTNAME)/bzip2recover.c \
- $(DISTNAME)/bzlib.h \
- $(DISTNAME)/bzlib_private.h \
- $(DISTNAME)/Makefile \
- $(DISTNAME)/LICENSE \
- $(DISTNAME)/bzip2.1 \
- $(DISTNAME)/bzip2.1.preformatted \
- $(DISTNAME)/bzip2.txt \
- $(DISTNAME)/words0 \
- $(DISTNAME)/words1 \
- $(DISTNAME)/words2 \
- $(DISTNAME)/words3 \
- $(DISTNAME)/sample1.ref \
- $(DISTNAME)/sample2.ref \
- $(DISTNAME)/sample3.ref \
- $(DISTNAME)/sample1.bz2 \
- $(DISTNAME)/sample2.bz2 \
- $(DISTNAME)/sample3.bz2 \
- $(DISTNAME)/dlltest.c \
- $(DISTNAME)/manual.html \
- $(DISTNAME)/manual.pdf \
- $(DISTNAME)/manual.ps \
- $(DISTNAME)/README \
- $(DISTNAME)/README.COMPILATION.PROBLEMS \
- $(DISTNAME)/README.XML.STUFF \
- $(DISTNAME)/CHANGES \
- $(DISTNAME)/libbz2.def \
- $(DISTNAME)/libbz2.dsp \
- $(DISTNAME)/dlltest.dsp \
- $(DISTNAME)/makefile.msc \
- $(DISTNAME)/Y2K_INFO \
- $(DISTNAME)/unzcrash.c \
- $(DISTNAME)/spewG.c \
- $(DISTNAME)/mk251.c \
- $(DISTNAME)/bzdiff \
- $(DISTNAME)/bzdiff.1 \
- $(DISTNAME)/bzmore \
- $(DISTNAME)/bzmore.1 \
- $(DISTNAME)/bzgrep \
- $(DISTNAME)/bzgrep.1 \
- $(DISTNAME)/Makefile-libbz2_so \
- $(DISTNAME)/bz-common.xsl \
- $(DISTNAME)/bz-fo.xsl \
- $(DISTNAME)/bz-html.xsl \
- $(DISTNAME)/bzip.css \
- $(DISTNAME)/entities.xml \
- $(DISTNAME)/manual.xml \
- $(DISTNAME)/format.pl \
- $(DISTNAME)/xmlproc.sh
- gzip -v $(DISTNAME).tar
-
-# For rebuilding the manual from sources on my SuSE 9.1 box
-
-MANUAL_SRCS= bz-common.xsl bz-fo.xsl bz-html.xsl bzip.css \
- entities.xml manual.xml
-
-manual: manual.html manual.ps manual.pdf
-
-manual.ps: $(MANUAL_SRCS)
- ./xmlproc.sh -ps manual.xml
-
-manual.pdf: $(MANUAL_SRCS)
- ./xmlproc.sh -pdf manual.xml
-
-manual.html: $(MANUAL_SRCS)
- ./xmlproc.sh -html manual.xml
diff --git a/contrib/vmap_extractor_v2/stormlib/zlib/Makefile b/contrib/vmap_extractor_v2/stormlib/zlib/Makefile
deleted file mode 100644
index 531562b2ef1..00000000000
--- a/contrib/vmap_extractor_v2/stormlib/zlib/Makefile
+++ /dev/null
@@ -1,175 +0,0 @@
-# Makefile for zlib
-# Copyright (C) 1995-2002 Jean-loup Gailly.
-# For conditions of distribution and use, see copyright notice in zlib.h
-
-# To compile and test, type:
-# ./configure; make test
-# The call of configure is optional if you don't have special requirements
-# If you wish to build zlib as a shared library, use: ./configure -s
-
-# To install /usr/local/lib/libz.* and /usr/local/include/zlib.h, type:
-# make install
-# To install in $HOME instead of /usr/local, use:
-# make install prefix=$HOME
-
-CC=cc
-
-CFLAGS=-O
-#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
-#CFLAGS=-g -DDEBUG
-#CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
-# -Wstrict-prototypes -Wmissing-prototypes
-
-LDFLAGS=-L. -lz
-LDSHARED=$(CC)
-CPP=$(CC) -E
-
-VER=1.1.4
-LIBS=libz.a
-SHAREDLIB=libz.so
-
-AR=ar rc
-RANLIB=ranlib
-TAR=tar
-SHELL=/bin/sh
-
-prefix = /usr/local
-exec_prefix = ${prefix}
-libdir = ${exec_prefix}/lib
-includedir = ${prefix}/include
-
-OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
- zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
-
-OBJA =
-# to use the asm code: make OBJA=match.o
-
-TEST_OBJS = example.o minigzip.o
-
-DISTFILES = README FAQ INDEX ChangeLog configure Make*[a-z0-9] *.[ch] *.mms \
- algorithm.txt zlib.3 zlib.html \
- msdos/Make*[a-z0-9] msdos/zlib.def msdos/zlib.rc \
- nt/Make*[a-z0-9] nt/zlib.dnt amiga/Make*.??? os2/M*.os2 os2/zlib.def \
- contrib/RE*.contrib contrib/*.txt contrib/asm386/*.asm contrib/asm386/*.c \
- contrib/asm386/*.bat contrib/asm386/zlibvc.d?? contrib/asm[56]86/*.?86 \
- contrib/asm[56]86/*.S contrib/iostream/*.cpp \
- contrib/iostream/*.h contrib/iostream2/*.h contrib/iostream2/*.cpp \
- contrib/untgz/Makefile contrib/untgz/*.c contrib/untgz/*.w32 \
- contrib/minizip/[CM]*[pe] contrib/minizip/*.[ch] contrib/minizip/*.[td]?? \
- contrib/delphi*/*.???
-
-all: example minigzip
-
-test: all
- @LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \
- echo hello world | ./minigzip | ./minigzip -d || \
- echo ' *** minigzip test FAILED ***' ; \
- if ./example; then \
- echo ' *** zlib test OK ***'; \
- else \
- echo ' *** zlib test FAILED ***'; \
- fi
-
-libz.a: $(OBJS) $(OBJA)
- $(AR) $@ $(OBJS) $(OBJA)
- -@ ($(RANLIB) $@ || true) >/dev/null 2>&1
-
-match.o: match.S
- $(CPP) match.S > _match.s
- $(CC) -c _match.s
- mv _match.o match.o
- rm -f _match.s
-
-$(SHAREDLIB).$(VER): $(OBJS)
- $(LDSHARED) -o $@ $(OBJS)
- rm -f $(SHAREDLIB) $(SHAREDLIB).1
- ln -s $@ $(SHAREDLIB)
- ln -s $@ $(SHAREDLIB).1
-
-example: example.o $(LIBS)
- $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS)
-
-minigzip: minigzip.o $(LIBS)
- $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS)
-
-install: $(LIBS)
- -@if [ ! -d $(includedir) ]; then mkdir $(includedir); fi
- -@if [ ! -d $(libdir) ]; then mkdir $(libdir); fi
- cp zlib.h zconf.h $(includedir)
- chmod 644 $(includedir)/zlib.h $(includedir)/zconf.h
- cp $(LIBS) $(libdir)
- cd $(libdir); chmod 755 $(LIBS)
- -@(cd $(libdir); $(RANLIB) libz.a || true) >/dev/null 2>&1
- cd $(libdir); if test -f $(SHAREDLIB).$(VER); then \
- rm -f $(SHAREDLIB) $(SHAREDLIB).1; \
- ln -s $(SHAREDLIB).$(VER) $(SHAREDLIB); \
- ln -s $(SHAREDLIB).$(VER) $(SHAREDLIB).1; \
- (ldconfig || true) >/dev/null 2>&1; \
- fi
-# The ranlib in install is needed on NeXTSTEP which checks file times
-# ldconfig is for Linux
-
-uninstall:
- cd $(includedir); \
- v=$(VER); \
- if test -f zlib.h; then \
- v=`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`; \
- rm -f zlib.h zconf.h; \
- fi; \
- cd $(libdir); rm -f libz.a; \
- if test -f $(SHAREDLIB).$$v; then \
- rm -f $(SHAREDLIB).$$v $(SHAREDLIB) $(SHAREDLIB).1; \
- fi
-
-clean:
- rm -f *.o *~ example minigzip libz.a libz.so* foo.gz so_locations \
- _match.s maketree
-
-distclean: clean
-
-zip:
- mv Makefile Makefile~; cp -p Makefile.in Makefile
- rm -f test.c ztest*.c contrib/minizip/test.zip
- v=`sed -n -e 's/\.//g' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
- zip -ul9 zlib$$v $(DISTFILES)
- mv Makefile~ Makefile
-
-dist:
- mv Makefile Makefile~; cp -p Makefile.in Makefile
- rm -f test.c ztest*.c contrib/minizip/test.zip
- d=zlib-`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
- rm -f $$d.tar.gz; \
- if test ! -d ../$$d; then rm -f ../$$d; ln -s `pwd` ../$$d; fi; \
- files=""; \
- for f in $(DISTFILES); do files="$$files $$d/$$f"; done; \
- cd ..; \
- GZIP=-9 $(TAR) chofz $$d/$$d.tar.gz $$files; \
- if test ! -d $$d; then rm -f $$d; fi
- mv Makefile~ Makefile
-
-tags:
- etags *.[ch]
-
-depend:
- makedepend -- $(CFLAGS) -- *.[ch]
-
-# DO NOT DELETE THIS LINE -- make depend depends on it.
-
-adler32.o: zlib.h zconf.h
-compress.o: zlib.h zconf.h
-crc32.o: zlib.h zconf.h
-deflate.o: deflate.h zutil.h zlib.h zconf.h
-example.o: zlib.h zconf.h
-gzio.o: zutil.h zlib.h zconf.h
-infblock.o: infblock.h inftrees.h infcodes.h infutil.h zutil.h zlib.h zconf.h
-infcodes.o: zutil.h zlib.h zconf.h
-infcodes.o: inftrees.h infblock.h infcodes.h infutil.h inffast.h
-inffast.o: zutil.h zlib.h zconf.h inftrees.h
-inffast.o: infblock.h infcodes.h infutil.h inffast.h
-inflate.o: zutil.h zlib.h zconf.h infblock.h
-inftrees.o: zutil.h zlib.h zconf.h inftrees.h
-infutil.o: zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h
-minigzip.o: zlib.h zconf.h
-trees.o: deflate.h zutil.h zlib.h zconf.h trees.h
-uncompr.o: zlib.h zconf.h
-zutil.o: zutil.h zlib.h zconf.h
diff --git a/contrib/vmap_extractor_v2/stormlib/zlib/Makefile.in b/contrib/vmap_extractor_v2/stormlib/zlib/Makefile.in
deleted file mode 100644
index 531562b2ef1..00000000000
--- a/contrib/vmap_extractor_v2/stormlib/zlib/Makefile.in
+++ /dev/null
@@ -1,175 +0,0 @@
-# Makefile for zlib
-# Copyright (C) 1995-2002 Jean-loup Gailly.
-# For conditions of distribution and use, see copyright notice in zlib.h
-
-# To compile and test, type:
-# ./configure; make test
-# The call of configure is optional if you don't have special requirements
-# If you wish to build zlib as a shared library, use: ./configure -s
-
-# To install /usr/local/lib/libz.* and /usr/local/include/zlib.h, type:
-# make install
-# To install in $HOME instead of /usr/local, use:
-# make install prefix=$HOME
-
-CC=cc
-
-CFLAGS=-O
-#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
-#CFLAGS=-g -DDEBUG
-#CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
-# -Wstrict-prototypes -Wmissing-prototypes
-
-LDFLAGS=-L. -lz
-LDSHARED=$(CC)
-CPP=$(CC) -E
-
-VER=1.1.4
-LIBS=libz.a
-SHAREDLIB=libz.so
-
-AR=ar rc
-RANLIB=ranlib
-TAR=tar
-SHELL=/bin/sh
-
-prefix = /usr/local
-exec_prefix = ${prefix}
-libdir = ${exec_prefix}/lib
-includedir = ${prefix}/include
-
-OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
- zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
-
-OBJA =
-# to use the asm code: make OBJA=match.o
-
-TEST_OBJS = example.o minigzip.o
-
-DISTFILES = README FAQ INDEX ChangeLog configure Make*[a-z0-9] *.[ch] *.mms \
- algorithm.txt zlib.3 zlib.html \
- msdos/Make*[a-z0-9] msdos/zlib.def msdos/zlib.rc \
- nt/Make*[a-z0-9] nt/zlib.dnt amiga/Make*.??? os2/M*.os2 os2/zlib.def \
- contrib/RE*.contrib contrib/*.txt contrib/asm386/*.asm contrib/asm386/*.c \
- contrib/asm386/*.bat contrib/asm386/zlibvc.d?? contrib/asm[56]86/*.?86 \
- contrib/asm[56]86/*.S contrib/iostream/*.cpp \
- contrib/iostream/*.h contrib/iostream2/*.h contrib/iostream2/*.cpp \
- contrib/untgz/Makefile contrib/untgz/*.c contrib/untgz/*.w32 \
- contrib/minizip/[CM]*[pe] contrib/minizip/*.[ch] contrib/minizip/*.[td]?? \
- contrib/delphi*/*.???
-
-all: example minigzip
-
-test: all
- @LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \
- echo hello world | ./minigzip | ./minigzip -d || \
- echo ' *** minigzip test FAILED ***' ; \
- if ./example; then \
- echo ' *** zlib test OK ***'; \
- else \
- echo ' *** zlib test FAILED ***'; \
- fi
-
-libz.a: $(OBJS) $(OBJA)
- $(AR) $@ $(OBJS) $(OBJA)
- -@ ($(RANLIB) $@ || true) >/dev/null 2>&1
-
-match.o: match.S
- $(CPP) match.S > _match.s
- $(CC) -c _match.s
- mv _match.o match.o
- rm -f _match.s
-
-$(SHAREDLIB).$(VER): $(OBJS)
- $(LDSHARED) -o $@ $(OBJS)
- rm -f $(SHAREDLIB) $(SHAREDLIB).1
- ln -s $@ $(SHAREDLIB)
- ln -s $@ $(SHAREDLIB).1
-
-example: example.o $(LIBS)
- $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS)
-
-minigzip: minigzip.o $(LIBS)
- $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS)
-
-install: $(LIBS)
- -@if [ ! -d $(includedir) ]; then mkdir $(includedir); fi
- -@if [ ! -d $(libdir) ]; then mkdir $(libdir); fi
- cp zlib.h zconf.h $(includedir)
- chmod 644 $(includedir)/zlib.h $(includedir)/zconf.h
- cp $(LIBS) $(libdir)
- cd $(libdir); chmod 755 $(LIBS)
- -@(cd $(libdir); $(RANLIB) libz.a || true) >/dev/null 2>&1
- cd $(libdir); if test -f $(SHAREDLIB).$(VER); then \
- rm -f $(SHAREDLIB) $(SHAREDLIB).1; \
- ln -s $(SHAREDLIB).$(VER) $(SHAREDLIB); \
- ln -s $(SHAREDLIB).$(VER) $(SHAREDLIB).1; \
- (ldconfig || true) >/dev/null 2>&1; \
- fi
-# The ranlib in install is needed on NeXTSTEP which checks file times
-# ldconfig is for Linux
-
-uninstall:
- cd $(includedir); \
- v=$(VER); \
- if test -f zlib.h; then \
- v=`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`; \
- rm -f zlib.h zconf.h; \
- fi; \
- cd $(libdir); rm -f libz.a; \
- if test -f $(SHAREDLIB).$$v; then \
- rm -f $(SHAREDLIB).$$v $(SHAREDLIB) $(SHAREDLIB).1; \
- fi
-
-clean:
- rm -f *.o *~ example minigzip libz.a libz.so* foo.gz so_locations \
- _match.s maketree
-
-distclean: clean
-
-zip:
- mv Makefile Makefile~; cp -p Makefile.in Makefile
- rm -f test.c ztest*.c contrib/minizip/test.zip
- v=`sed -n -e 's/\.//g' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
- zip -ul9 zlib$$v $(DISTFILES)
- mv Makefile~ Makefile
-
-dist:
- mv Makefile Makefile~; cp -p Makefile.in Makefile
- rm -f test.c ztest*.c contrib/minizip/test.zip
- d=zlib-`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
- rm -f $$d.tar.gz; \
- if test ! -d ../$$d; then rm -f ../$$d; ln -s `pwd` ../$$d; fi; \
- files=""; \
- for f in $(DISTFILES); do files="$$files $$d/$$f"; done; \
- cd ..; \
- GZIP=-9 $(TAR) chofz $$d/$$d.tar.gz $$files; \
- if test ! -d $$d; then rm -f $$d; fi
- mv Makefile~ Makefile
-
-tags:
- etags *.[ch]
-
-depend:
- makedepend -- $(CFLAGS) -- *.[ch]
-
-# DO NOT DELETE THIS LINE -- make depend depends on it.
-
-adler32.o: zlib.h zconf.h
-compress.o: zlib.h zconf.h
-crc32.o: zlib.h zconf.h
-deflate.o: deflate.h zutil.h zlib.h zconf.h
-example.o: zlib.h zconf.h
-gzio.o: zutil.h zlib.h zconf.h
-infblock.o: infblock.h inftrees.h infcodes.h infutil.h zutil.h zlib.h zconf.h
-infcodes.o: zutil.h zlib.h zconf.h
-infcodes.o: inftrees.h infblock.h infcodes.h infutil.h inffast.h
-inffast.o: zutil.h zlib.h zconf.h inftrees.h
-inffast.o: infblock.h infcodes.h infutil.h inffast.h
-inflate.o: zutil.h zlib.h zconf.h infblock.h
-inftrees.o: zutil.h zlib.h zconf.h inftrees.h
-infutil.o: zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h
-minigzip.o: zlib.h zconf.h
-trees.o: deflate.h zutil.h zlib.h zconf.h trees.h
-uncompr.o: zlib.h zconf.h
-zutil.o: zutil.h zlib.h zconf.h
diff --git a/contrib/vmap_extractor_v2/stormlib/zlib/configure b/contrib/vmap_extractor_v2/stormlib/zlib/configure
deleted file mode 100644
index e8942359bc1..00000000000
--- a/contrib/vmap_extractor_v2/stormlib/zlib/configure
+++ /dev/null
@@ -1,212 +0,0 @@
-#!/bin/sh
-# configure script for zlib. This script is needed only if
-# you wish to build a shared library and your system supports them,
-# of if you need special compiler, flags or install directory.
-# Otherwise, you can just use directly "make test; make install"
-#
-# To create a shared library, use "configure --shared"; by default a static
-# library is created. If the primitive shared library support provided here
-# does not work, use ftp://prep.ai.mit.edu/pub/gnu/libtool-*.tar.gz
-#
-# To impose specific compiler or flags or install directory, use for example:
-# prefix=$HOME CC=cc CFLAGS="-O4" ./configure
-# or for csh/tcsh users:
-# (setenv prefix $HOME; setenv CC cc; setenv CFLAGS "-O4"; ./configure)
-# LDSHARED is the command to be used to create a shared library
-
-# Incorrect settings of CC or CFLAGS may prevent creating a shared library.
-# If you have problems, try without defining CC and CFLAGS before reporting
-# an error.
-
-LIBS=libz.a
-SHAREDLIB=libz.so
-VER=`sed -n -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`
-AR=${AR-"ar rc"}
-RANLIB=${RANLIB-"ranlib"}
-prefix=${prefix-/usr/local}
-exec_prefix=${exec_prefix-'${prefix}'}
-libdir=${libdir-'${exec_prefix}/lib'}
-includedir=${includedir-'${prefix}/include'}
-shared_ext='.so'
-shared=0
-gcc=0
-old_cc="$CC"
-old_cflags="$CFLAGS"
-
-while test $# -ge 1
-do
-case "$1" in
- -h* | --h*)
- echo 'usage:'
- echo ' configure [--shared] [--prefix=PREFIX] [--exec_prefix=EXPREFIX]'
- echo ' [--libdir=LIBDIR] [--includedir=INCLUDEDIR]'
- exit 0;;
- -p*=* | --p*=*) prefix=`echo $1 | sed 's/[-a-z_]*=//'`; shift;;
- -e*=* | --e*=*) exec_prefix=`echo $1 | sed 's/[-a-z_]*=//'`; shift;;
- -l*=* | --libdir=*) libdir=`echo $1 | sed 's/[-a-z_]*=//'`; shift;;
- -i*=* | --includedir=*) includedir=`echo $1 | sed 's/[-a-z_]*=//'`;shift;;
- -p* | --p*) prefix="$2"; shift; shift;;
- -e* | --e*) exec_prefix="$2"; shift; shift;;
- -l* | --l*) libdir="$2"; shift; shift;;
- -i* | --i*) includedir="$2"; shift; shift;;
- -s* | --s*) shared=1; shift;;
- esac
-done
-
-test=ztest$$
-cat > $test.c <<EOF
-extern int getchar();
-int hello() {return getchar();}
-EOF
-
-test -z "$CC" && echo Checking for gcc...
-cc=${CC-gcc}
-cflags=${CFLAGS-"-O3"}
-# to force the asm version use: CFLAGS="-O3 -DASMV" ./configure
-case "$cc" in
- *gcc*) gcc=1;;
-esac
-
-if test "$gcc" -eq 1 && ($cc -c $cflags $test.c) 2>/dev/null; then
- CC="$cc"
- SFLAGS=${CFLAGS-"-fPIC -O3"}
- CFLAGS="$cflags"
- case `(uname -s || echo unknown) 2>/dev/null` in
- Linux | linux) LDSHARED=${LDSHARED-"gcc -shared -Wl,-soname,libz.so.1"};;
- *) LDSHARED=${LDSHARED-"gcc -shared"};;
- esac
-else
- # find system name and corresponding cc options
- CC=${CC-cc}
- case `(uname -sr || echo unknown) 2>/dev/null` in
- HP-UX*) SFLAGS=${CFLAGS-"-O +z"}
- CFLAGS=${CFLAGS-"-O"}
-# LDSHARED=${LDSHARED-"ld -b +vnocompatwarnings"}
- LDSHARED=${LDSHARED-"ld -b"}
- shared_ext='.sl'
- SHAREDLIB='libz.sl';;
- IRIX*) SFLAGS=${CFLAGS-"-ansi -O2 -rpath ."}
- CFLAGS=${CFLAGS-"-ansi -O2"}
- LDSHARED=${LDSHARED-"cc -shared"};;
- OSF1\ V4*) SFLAGS=${CFLAGS-"-O -std1"}
- CFLAGS=${CFLAGS-"-O -std1"}
- LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,$SHAREDLIB -Wl,-msym -Wl,-rpath,$(libdir) -Wl,-set_version,${VER}:1.0"};;
- OSF1*) SFLAGS=${CFLAGS-"-O -std1"}
- CFLAGS=${CFLAGS-"-O -std1"}
- LDSHARED=${LDSHARED-"cc -shared"};;
- QNX*) SFLAGS=${CFLAGS-"-4 -O"}
- CFLAGS=${CFLAGS-"-4 -O"}
- LDSHARED=${LDSHARED-"cc"}
- RANLIB=${RANLIB-"true"}
- AR="cc -A";;
- SCO_SV\ 3.2*) SFLAGS=${CFLAGS-"-O3 -dy -KPIC "}
- CFLAGS=${CFLAGS-"-O3"}
- LDSHARED=${LDSHARED-"cc -dy -KPIC -G"};;
- SunOS\ 5*) SFLAGS=${CFLAGS-"-fast -xcg89 -KPIC -R."}
- CFLAGS=${CFLAGS-"-fast -xcg89"}
- LDSHARED=${LDSHARED-"cc -G"};;
- SunOS\ 4*) SFLAGS=${CFLAGS-"-O2 -PIC"}
- CFLAGS=${CFLAGS-"-O2"}
- LDSHARED=${LDSHARED-"ld"};;
- UNIX_System_V\ 4.2.0)
- SFLAGS=${CFLAGS-"-KPIC -O"}
- CFLAGS=${CFLAGS-"-O"}
- LDSHARED=${LDSHARED-"cc -G"};;
- UNIX_SV\ 4.2MP)
- SFLAGS=${CFLAGS-"-Kconform_pic -O"}
- CFLAGS=${CFLAGS-"-O"}
- LDSHARED=${LDSHARED-"cc -G"};;
- # send working options for other systems to support@gzip.org
- *) SFLAGS=${CFLAGS-"-O"}
- CFLAGS=${CFLAGS-"-O"}
- LDSHARED=${LDSHARED-"cc -shared"};;
- esac
-fi
-
-if test $shared -eq 1; then
- echo Checking for shared library support...
- # we must test in two steps (cc then ld), required at least on SunOS 4.x
- if test "`($CC -c $SFLAGS $test.c) 2>&1`" = "" &&
- test "`($LDSHARED -o $test$shared_ext $test.o) 2>&1`" = ""; then
- CFLAGS="$SFLAGS"
- LIBS="$SHAREDLIB.$VER"
- echo Building shared library $SHAREDLIB.$VER with $CC.
- elif test -z "$old_cc" -a -z "$old_cflags"; then
- echo No shared library suppport.
- shared=0;
- else
- echo 'No shared library suppport; try without defining CC and CFLAGS'
- shared=0;
- fi
-fi
-if test $shared -eq 0; then
- LDSHARED="$CC"
- echo Building static library $LIBS version $VER with $CC.
-fi
-
-cat > $test.c <<EOF
-#include <unistd.h>
-int main() { return 0; }
-EOF
-if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then
- CFLAGS="$CFLAGS -DHAVE_UNISTD_H"
- echo "Checking for unistd.h... Yes."
-else
- echo "Checking for unistd.h... No."
-fi
-
-cat > $test.c <<EOF
-#include <errno.h>
-int main() { return 0; }
-EOF
-if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then
- echo "Checking for errno.h... Yes."
-else
- echo "Checking for errno.h... No."
- CFLAGS="$CFLAGS -DNO_ERRNO_H"
-fi
-
-cat > $test.c <<EOF
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-caddr_t hello() {
- return mmap((caddr_t)0, (off_t)0, PROT_READ, MAP_SHARED, 0, (off_t)0);
-}
-EOF
-if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then
- CFLAGS="$CFLAGS -DUSE_MMAP"
- echo Checking for mmap support... Yes.
-else
- echo Checking for mmap support... No.
-fi
-
-CPP=${CPP-"$CC -E"}
-case $CFLAGS in
- *ASMV*)
- if test "`nm $test.o | grep _hello`" = ""; then
- CPP="$CPP -DNO_UNDERLINE"
- echo Checking for underline in external names... No.
- else
- echo Checking for underline in external names... Yes.
- fi;;
-esac
-
-rm -f $test.[co] $test$shared_ext
-
-# udpate Makefile
-sed < Makefile.in "
-/^CC *=/s%=.*%=$CC%
-/^CFLAGS *=/s%=.*%=$CFLAGS%
-/^CPP *=/s%=.*%=$CPP%
-/^LDSHARED *=/s%=.*%=$LDSHARED%
-/^LIBS *=/s%=.*%=$LIBS%
-/^SHAREDLIB *=/s%=.*%=$SHAREDLIB%
-/^AR *=/s%=.*%=$AR%
-/^RANLIB *=/s%=.*%=$RANLIB%
-/^VER *=/s%=.*%=$VER%
-/^prefix *=/s%=.*%=$prefix%
-/^exec_prefix *=/s%=.*%=$exec_prefix%
-/^libdir *=/s%=.*%=$libdir%
-/^includedir *=/s%=.*%=$includedir%
-" > Makefile
diff --git a/contrib/vmap_extractor_v2/stormlib/zlib/contrib/minizip/Makefile b/contrib/vmap_extractor_v2/stormlib/zlib/contrib/minizip/Makefile
deleted file mode 100644
index a1dfc161437..00000000000
--- a/contrib/vmap_extractor_v2/stormlib/zlib/contrib/minizip/Makefile
+++ /dev/null
@@ -1,25 +0,0 @@
-CC=cc
-CFLAGS=-O -I../..
-
-UNZ_OBJS = miniunz.o unzip.o ../../libz.a
-ZIP_OBJS = minizip.o zip.o ../../libz.a
-
-.c.o:
- $(CC) -c $(CFLAGS) $*.c
-
-all: miniunz minizip
-
-miniunz: $(UNZ_OBJS)
- $(CC) $(CFLAGS) -o $@ $(UNZ_OBJS)
-
-minizip: $(ZIP_OBJS)
- $(CC) $(CFLAGS) -o $@ $(ZIP_OBJS)
-
-test: miniunz minizip
- ./minizip test readme.txt
- ./miniunz -l test.zip
- mv readme.txt readme.old
- ./miniunz test.zip
-
-clean:
- /bin/rm -f *.o *~ minizip miniunz
diff --git a/contrib/vmap_extractor_v2/stormlib/zlib/contrib/untgz/Makefile b/contrib/vmap_extractor_v2/stormlib/zlib/contrib/untgz/Makefile
deleted file mode 100644
index 409b4bdeaae..00000000000
--- a/contrib/vmap_extractor_v2/stormlib/zlib/contrib/untgz/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-CC=cc
-CFLAGS=-g
-
-untgz: untgz.o ../../libz.a
- $(CC) $(CFLAGS) -o untgz untgz.o -L../.. -lz
-
-untgz.o: untgz.c ../../zlib.h
- $(CC) $(CFLAGS) -c -I../.. untgz.c
-
-../../libz.a:
- cd ../..; make
-
-clean:
- rm -f untgz untgz.o *~
diff --git a/contrib/vmap_extractor_v2/vmapextract/model.cpp b/contrib/vmap_extractor_v2/vmapextract/model.cpp
index 7dca7841d74..1d0c17d52e6 100644
--- a/contrib/vmap_extractor_v2/vmapextract/model.cpp
+++ b/contrib/vmap_extractor_v2/vmapextract/model.cpp
@@ -1,11 +1,7 @@
-//#include "common.h"
#include "model.h"
-//#include "world.h"
#include <cassert>
#include <algorithm>
-//int globalTime = 0;
-
Model::Model(std::string &filename) : filename(filename)
{
}
@@ -24,121 +20,31 @@ bool Model::open()
}
memcpy(&header, f.getBuffer(), sizeof(ModelHeader));
- if(header.nBoundingTriangles > 0) {
-
-#if 0
- animated = isAnimated(f);
- if(animated)
- {
- 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++)
+ 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++)
{
- indices[i] = indexLookup[triangles[i]];
+ vertices[i] = fixCoordSystem(vertices[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)
{
@@ -151,7 +57,8 @@ bool Model::ConvertToVMAPModel(char * outfilename)
return false;
}
fwrite("VMAP002",8,1,output);
- int nVertices = header.nVertices;
+ uint32 nVertices = 0;
+ nVertices = header.nBoundingVertices;
fwrite(&nVertices, sizeof(int), 1, output);
uint32 nofgroups = 1;
fwrite(&nofgroups,sizeof(uint32), 1, output);
@@ -162,15 +69,16 @@ bool Model::ConvertToVMAPModel(char * outfilename)
wsize = sizeof(branches) + sizeof(uint32) * branches;
fwrite(&wsize, sizeof(int), 1, output);
fwrite(&branches,sizeof(branches), 1, output);
- uint32 nIdexes = (uint32) nIndices;
- fwrite(&nIndices,sizeof(uint32), 1, output);
+ uint32 nIndexes = 0;
+ nIndexes = header.nBoundingTriangles;
+ fwrite(&nIndexes,sizeof(uint32), 1, output);
fwrite("INDX",4, 1, output);
- wsize = sizeof(uint32) + sizeof(unsigned short) * nIdexes;
+ wsize = sizeof(uint32) + sizeof(unsigned short) * nIndexes;
fwrite(&wsize, sizeof(int), 1, output);
- fwrite(&nIdexes, sizeof(uint32), 1, output);
- if(nIdexes >0)
+ fwrite(&nIndexes, sizeof(uint32), 1, output);
+ if(nIndexes >0)
{
- fwrite(indices, sizeof(unsigned short), nIdexes, output);
+ fwrite(indices, sizeof(unsigned short), nIndexes, output);
}
fwrite("VERT",4, 1, output);
wsize = sizeof(int) + sizeof(float) * 3 * nVertices;
@@ -178,7 +86,7 @@ bool Model::ConvertToVMAPModel(char * outfilename)
fwrite(&nVertices, sizeof(int), 1, output);
if(nVertices >0)
{
- for(int vpos=0; vpos <nVertices; ++vpos)
+ for(uint32 vpos=0; vpos <nVertices; ++vpos)
{
float sy = vertices[vpos].y;
vertices[vpos].y = vertices[vpos].z;
@@ -189,7 +97,6 @@ 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 0af492f922c..a2bdee9465b 100644
--- a/contrib/vmap_extractor_v2/vmapextract/model.h
+++ b/contrib/vmap_extractor_v2/vmapextract/model.h
@@ -4,7 +4,6 @@
#include "vec3d.h"
#include "mpq.h"
#include "modelheaders.h"
-//#include "quaternion.h"
#include <vector>
class Model;
@@ -18,18 +17,14 @@ Vec3D fixCoordSystem(Vec3D v);
class Model
{
public:
+
ModelHeader header;
- ModelAnimation *anims;
- int *globalSequences;
public:
- bool animGeometry,animTextures,animBones;
- bool animated;
- bool isAnimated(MPQFile &f);
- ModelVertex *origVertices;
- Vec3D *vertices, *normals;
- uint16 *indices;
+ uint32 offsBB_vertices, offsBB_indices;
+ Vec3D *BB_vertices, *vertices;
+ uint16 *BB_indices, *indices;
size_t nIndices;
bool open();
@@ -38,12 +33,6 @@ public:
public:
bool ok;
- bool ind;
-
- float rad;
- float trans;
- bool animcalc;
- int anim, animtime;
Model(std::string &filename);
~Model();
@@ -59,15 +48,9 @@ public:
Model *model;
int id;
-
Vec3D pos, rot;
unsigned int d1, scale;
-
- float frot,w,sc;
-
- int light;
- Vec3D ldir;
- Vec3D lcol;
+ float w,sc;
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 7d5e800e796..c35b983c19b 100644
--- a/contrib/vmap_extractor_v2/vmapextract/modelheaders.h
+++ b/contrib/vmap_extractor_v2/vmapextract/modelheaders.h
@@ -15,289 +15,67 @@ struct ModelHeader {
uint8 version[4];
uint32 nameLength;
uint32 nameOfs;
- uint32 type;
-
+ uint32 type;
uint32 nGlobalSequences;
uint32 ofsGlobalSequences;
uint32 nAnimations;
uint32 ofsAnimations;
- uint32 nC;
- uint32 ofsC;
- uint32 nD;
- uint32 ofsD;
- uint32 nBones;
- uint32 ofsBones;
- uint32 nF;
- uint32 ofsF;
-
+ uint32 nAnimationLookup;
+ uint32 ofsAnimationLookup;
+ uint32 nBones;
+ uint32 ofsBones;
+ uint32 nKeyBoneLookup;
+ uint32 ofsKeyBoneLookup;
uint32 nVertices;
uint32 ofsVertices;
uint32 nViews;
- uint32 ofsViews;
-
uint32 nColors;
uint32 ofsColors;
-
uint32 nTextures;
uint32 ofsTextures;
-
- uint32 nTransparency; // H
+ uint32 nTransparency;
uint32 ofsTransparency;
- 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;
+ 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;
};
-
-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 dfc7cddcfdd..0d2b39f8d06 100644
--- a/contrib/vmap_extractor_v2/vmapextract/vmapexport.cpp
+++ b/contrib/vmap_extractor_v2/vmapextract/vmapexport.cpp
@@ -421,6 +421,10 @@ 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);
@@ -432,6 +436,8 @@ 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/dep/include/Makefile.am b/dep/include/Makefile.am
index f9cda557ecb..116b6e901a2 100644
--- a/dep/include/Makefile.am
+++ b/dep/include/Makefile.am
@@ -9,12 +9,12 @@
#
# 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
+# 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
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
## Process this file with automake to produce Makefile.in
@@ -62,6 +62,7 @@ EXTRA_DIST += \
mysql/config-os2.h \
mysql/config-win.h \
mysql/errmsg.h \
+ mysql/libmysqld.def \
mysql/Libmysql.def \
mysql/m_ctype.h \
mysql/m_string.h \
@@ -167,32 +168,31 @@ EXTRA_DIST += \
# Sockets header files for Win32 builds
EXTRA_DIST += \
- sockets/Base64.h \
- sockets/Exception.h \
- sockets/File.h \
- sockets/IFile.h \
- sockets/Ipv4Address.h \
- sockets/Ipv6Address.h \
- sockets/ISocketHandler.h \
- sockets/ListenSocket.h \
- sockets/Lock.h \
- sockets/Mutex.h \
- sockets/Parse.h \
- sockets/ResolvServer.h \
- sockets/ResolvSocket.h \
- sockets/SctpSocket.h \
- sockets/SocketAddress.h \
- sockets/Socket.h \
- sockets/SocketHandler.h \
- sockets/socket_include.h \
- sockets/sockets-config.h \
- sockets/StdLog.h \
- sockets/StdoutLog.h \
- sockets/StreamSocket.h \
- sockets/TcpSocket.h \
- sockets/Thread.h \
- sockets/UdpSocket.h \
- sockets/Utility.h
+ sockets\Base64.h \
+ sockets\CircularBuffer.h \
+ sockets\IFile.h \
+ sockets\Ipv4Address.h \
+ sockets\Ipv6Address.h \
+ sockets\ISocketHandler.h \
+ sockets\ListenSocket.h \
+ sockets\Mutex.h \
+ sockets\Parse.h \
+ sockets\RandomNumber.h \
+ sockets\ResolvServer.h \
+ sockets\ResolvSocket.h \
+ sockets\SctpSocket.h \
+ sockets\Socket.h \
+ sockets\socket_include.h \
+ sockets\SocketAddress.h \
+ sockets\SocketHandler.h \
+ sockets\sockets-config.h \
+ sockets\StdLog.h \
+ sockets\StdoutLog.h \
+ sockets\TcpSocket.h \
+ sockets\Thread.h \
+ sockets\UdpSocket.h \
+ sockets\Uid.h \
+ sockets\Utility.h
# VLD header files for Win32 builds
EXTRA_DIST += \
diff --git a/dep/lib/Makefile.am b/dep/lib/Makefile.am
index f66fd207239..011e88dc34d 100644
--- a/dep/lib/Makefile.am
+++ b/dep/lib/Makefile.am
@@ -9,12 +9,12 @@
#
# 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
+# 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
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
## Process this file with automake to produce Makefile.in
@@ -42,13 +42,11 @@ EXTRA_DIST += \
x64_Debug/libeay32.dll \
x64_Debug/libeay32.lib \
x64_Debug/libmySQL.dll \
- x64_Debug/libmysql.lib
+ x64_Debug/libmySQL.lib
# Release libraries for Win64 builds.
EXTRA_DIST += \
x64_release/libeay32.dll \
x64_release/libeay32.lib \
x64_release/libmySQL.dll \
- x64_release/libmysql.lib
-
-
+ x64_release/libmySQL.lib
diff --git a/sql/characters.sql b/sql/characters.sql
index 2e5eedcf6a7..3e740d7876c 100644
--- a/sql/characters.sql
+++ b/sql/characters.sql
@@ -1,8 +1,8 @@
-- MySQL dump 10.11
--
--- Host: localhost Database: char_temp
+-- Host: localhost Database: characters
-- ------------------------------------------------------
--- Server version 5.0.34-log
+-- Server version 5.0.45-Debian_1ubuntu3.1-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
@@ -16,6 +16,48 @@
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
+-- 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
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Last applied sql update to DB';
+
+--
+-- Dumping data for table `character_db_version`
+--
+
+LOCK TABLES `character_db_version` WRITE;
+/*!40000 ALTER TABLE `character_db_version` DISABLE KEYS */;
+INSERT INTO `character_db_version` VALUES
+(NULL);
+/*!40000 ALTER TABLE `character_db_version` ENABLE KEYS */;
+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`
--
@@ -54,7 +96,7 @@ CREATE TABLE `arena_team_member` (
`wons_week` int(10) unsigned NOT NULL default '0',
`played_season` int(10) unsigned NOT NULL default '0',
`wons_season` int(10) unsigned NOT NULL default '0',
- `points_to_add` int(10) unsigned NOT NULL default '0'
+ `personal_rating` int(10) UNSIGNED NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
@@ -144,6 +186,105 @@ LOCK TABLES `bugreport` WRITE;
UNLOCK TABLES;
--
+-- Table structure for table `characters`
+--
+
+DROP TABLE IF EXISTS `characters`;
+CREATE TABLE `characters` (
+ `guid` int(11) unsigned NOT NULL default '0' COMMENT 'Global Unique Identifier',
+ `account` int(11) unsigned NOT NULL default '0' COMMENT 'Account Identifier',
+ `data` longtext,
+ `name` varchar(12) NOT NULL default '',
+ `race` tinyint(3) unsigned NOT NULL default '0',
+ `class` tinyint(3) unsigned NOT NULL default '0',
+ `position_x` float NOT NULL default '0',
+ `position_y` float NOT NULL default '0',
+ `position_z` float NOT NULL default '0',
+ `map` int(11) unsigned NOT NULL default '0' COMMENT 'Map Identifier',
+ `dungeon_difficulty` tinyint(1) unsigned NOT NULL DEFAULT '0',
+ `orientation` float NOT NULL default '0',
+ `taximask` longtext,
+ `online` tinyint(3) unsigned NOT NULL default '0',
+ `cinematic` tinyint(3) unsigned NOT NULL default '0',
+ `totaltime` int(11) unsigned NOT NULL default '0',
+ `leveltime` int(11) unsigned NOT NULL default '0',
+ `logout_time` bigint(20) unsigned NOT NULL default '0',
+ `is_logout_resting` tinyint(3) unsigned NOT NULL default '0',
+ `rest_bonus` float NOT NULL default '0',
+ `resettalents_cost` int(11) unsigned NOT NULL default '0',
+ `resettalents_time` bigint(20) unsigned NOT NULL default '0',
+ `trans_x` float NOT NULL default '0',
+ `trans_y` float NOT NULL default '0',
+ `trans_z` float NOT NULL default '0',
+ `trans_o` float NOT NULL default '0',
+ `transguid` bigint(20) unsigned NOT NULL default '0',
+ `extra_flags` int(11) unsigned NOT NULL default '0',
+ `stable_slots` tinyint(1) unsigned NOT NULL default '0',
+ `at_login` int(11) unsigned NOT NULL default '0',
+ `zone` int(11) unsigned NOT NULL default '0',
+ `death_expire_time` bigint(20) unsigned NOT NULL default '0',
+ `taxi_path` text,
+ `arena_pending_points` int(10) UNSIGNED NOT NULL default '0',
+ `latency` int(11) unsigned NOT NULL default '0',
+ PRIMARY KEY (`guid`),
+ KEY `idx_account` (`account`),
+ KEY `idx_online` (`online`),
+ KEY `idx_name` (`name`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Player System';
+
+--
+-- Dumping data for table `characters`
+--
+
+LOCK TABLES `characters` WRITE;
+/*!40000 ALTER TABLE `characters` DISABLE KEYS */;
+/*!40000 ALTER TABLE `characters` ENABLE KEYS */;
+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`
--
@@ -176,6 +317,7 @@ CREATE TABLE `character_aura` (
`caster_guid` bigint(20) unsigned NOT NULL default '0' COMMENT 'Full Global Unique Identifier',
`spell` int(11) unsigned NOT NULL default '0',
`effect_index` int(11) unsigned NOT NULL default '0',
+ `stackcount` int(11) NOT NULL default '1',
`amount` int(11) NOT NULL default '0',
`maxduration` int(11) NOT NULL default '0',
`remaintime` int(11) NOT NULL default '0',
@@ -324,9 +466,7 @@ 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',
- `loyaltypoints` int(11) NOT NULL default '0',
- `loyalty` int(11) unsigned NOT NULL default '0',
- `trainpoint` int(11) NOT NULL default '0',
+ `talentpoints` int(11) unsigned 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',
@@ -365,7 +505,7 @@ CREATE TABLE `character_pet_declinedname` (
`instrumental` varchar(12) NOT NULL default '',
`prepositional` varchar(12) NOT NULL default '',
PRIMARY KEY (`id`),
- KEY `owner_key` (`owner`)
+ KEY owner_key (`owner`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
--
@@ -462,7 +602,7 @@ CREATE TABLE `character_social` (
`guid` int(11) unsigned NOT NULL default '0' COMMENT 'Character Global Unique Identifier',
`friend` int(11) unsigned NOT NULL default '0' COMMENT 'Friend Global Unique Identifier',
`flags` tinyint(1) unsigned NOT NULL default '0' COMMENT 'Friend Flags',
- `note` varchar(48) NOT NULL default '' COMMENT 'Friend Note',
+ `note` varchar(48) NOT NULL DEFAULT '' COMMENT 'Friend Note',
PRIMARY KEY (`guid`,`friend`,`flags`),
KEY `guid` (`guid`),
KEY `friend` (`friend`),
@@ -533,7 +673,7 @@ CREATE TABLE `character_ticket` (
`ticket_id` int(11) unsigned NOT NULL auto_increment,
`guid` int(11) unsigned NOT NULL default '0',
`ticket_text` text,
- `ticket_lastchange` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
+ `ticket_lastchange` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`ticket_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Player System';
@@ -563,7 +703,7 @@ CREATE TABLE `character_tutorial` (
`tut6` int(11) unsigned NOT NULL default '0',
`tut7` int(11) unsigned NOT NULL default '0',
PRIMARY KEY (`account`,`realmid`),
- KEY `acc_key` (`account`)
+ KEY acc_key (`account`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Player System';
--
@@ -576,61 +716,6 @@ LOCK TABLES `character_tutorial` WRITE;
UNLOCK TABLES;
--
--- Table structure for table `characters`
---
-
-DROP TABLE IF EXISTS `characters`;
-CREATE TABLE `characters` (
- `guid` int(11) unsigned NOT NULL default '0' COMMENT 'Global Unique Identifier',
- `account` int(11) unsigned NOT NULL default '0' COMMENT 'Account Identifier',
- `data` longtext,
- `name` varchar(12) NOT NULL default '',
- `race` tinyint(3) unsigned NOT NULL default '0',
- `class` tinyint(3) unsigned NOT NULL default '0',
- `position_x` float NOT NULL default '0',
- `position_y` float NOT NULL default '0',
- `position_z` float NOT NULL default '0',
- `map` int(11) unsigned NOT NULL default '0' COMMENT 'Map Identifier',
- `dungeon_difficulty` tinyint(1) unsigned NOT NULL default '0',
- `orientation` float NOT NULL default '0',
- `taximask` longtext,
- `online` tinyint(3) unsigned NOT NULL default '0',
- `cinematic` tinyint(3) unsigned NOT NULL default '0',
- `totaltime` int(11) unsigned NOT NULL default '0',
- `leveltime` int(11) unsigned NOT NULL default '0',
- `logout_time` bigint(20) unsigned NOT NULL default '0',
- `is_logout_resting` tinyint(3) unsigned NOT NULL default '0',
- `rest_bonus` float NOT NULL default '0',
- `resettalents_cost` int(11) unsigned NOT NULL default '0',
- `resettalents_time` bigint(20) unsigned NOT NULL default '0',
- `trans_x` float NOT NULL default '0',
- `trans_y` float NOT NULL default '0',
- `trans_z` float NOT NULL default '0',
- `trans_o` float NOT NULL default '0',
- `transguid` bigint(20) unsigned NOT NULL default '0',
- `extra_flags` tinyint(3) unsigned NOT NULL default '0',
- `stable_slots` tinyint(1) unsigned NOT NULL default '0',
- `at_login` int(11) unsigned NOT NULL default '0',
- `zone` int(11) unsigned NOT NULL default '0',
- `death_expire_time` bigint(20) unsigned NOT NULL default '0',
- `taxi_path` text,
- `latency` int(11) unsigned NOT NULL default '0',
- PRIMARY KEY (`guid`),
- KEY `idx_account` (`account`),
- KEY `idx_online` (`online`),
- KEY `idx_name` (`name`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Player System';
-
---
--- Dumping data for table `characters`
---
-
-LOCK TABLES `characters` WRITE;
-/*!40000 ALTER TABLE `characters` DISABLE KEYS */;
-/*!40000 ALTER TABLE `characters` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
-- Table structure for table `corpse`
--
@@ -663,51 +748,42 @@ LOCK TABLES `corpse` WRITE;
UNLOCK TABLES;
--
--- Table structure for table `game_event_condition_save`
---
-
-DROP TABLE IF EXISTS `game_event_condition_save`;
-CREATE TABLE `game_event_condition_save` (
- `event_id` mediumint(8) unsigned NOT NULL,
- `condition_id` mediumint(8) unsigned NOT NULL default '0',
- `done` float default '0',
- PRIMARY KEY (`event_id`,`condition_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
---
--- Dumping data for table `game_event_condition_save`
---
-
-LOCK TABLES `game_event_condition_save` WRITE;
-/*!40000 ALTER TABLE `game_event_condition_save` DISABLE KEYS */;
-/*!40000 ALTER TABLE `game_event_condition_save` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `game_event_save`
+-- Table structure for table `groups`
--
-DROP TABLE IF EXISTS `game_event_save`;
-CREATE TABLE `game_event_save` (
- `event_id` mediumint(8) unsigned NOT NULL,
- `state` tinyint(3) unsigned NOT NULL default '1',
- `next_start` timestamp NOT NULL default '0000-00-00 00:00:00',
- PRIMARY KEY (`event_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+DROP TABLE IF EXISTS `groups`;
+CREATE TABLE `groups` (
+ `leaderGuid` int(11) unsigned NOT NULL,
+ `mainTank` int(11) unsigned NOT NULL,
+ `mainAssistant` int(11) unsigned NOT NULL,
+ `lootMethod` tinyint(4) unsigned NOT NULL,
+ `looterGuid` int(11) unsigned NOT NULL,
+ `lootThreshold` tinyint(4) unsigned NOT NULL,
+ `icon1` int(11) unsigned NOT NULL,
+ `icon2` int(11) unsigned NOT NULL,
+ `icon3` int(11) unsigned NOT NULL,
+ `icon4` int(11) unsigned NOT NULL,
+ `icon5` int(11) unsigned NOT NULL,
+ `icon6` int(11) unsigned NOT NULL,
+ `icon7` int(11) unsigned NOT NULL,
+ `icon8` int(11) unsigned NOT NULL,
+ `isRaid` tinyint(1) unsigned NOT NULL,
+ `difficulty` tinyint(3) unsigned NOT NULL default '0',
+ PRIMARY KEY (`leaderGuid`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Groups';
--
--- Dumping data for table `game_event_save`
+-- Dumping data for table `groups`
--
-LOCK TABLES `game_event_save` WRITE;
-/*!40000 ALTER TABLE `game_event_save` DISABLE KEYS */;
-/*!40000 ALTER TABLE `game_event_save` ENABLE KEYS */;
+LOCK TABLES `groups` WRITE;
+/*!40000 ALTER TABLE `groups` DISABLE KEYS */;
+/*!40000 ALTER TABLE `groups` ENABLE KEYS */;
UNLOCK TABLES;
---
--- Table structure for table `group_instance`
---
-
+-- ----------------------------
+-- Table structure for group_instance
+-- ----------------------------
DROP TABLE IF EXISTS `group_instance`;
CREATE TABLE `group_instance` (
`leaderGuid` int(11) unsigned NOT NULL default '0',
@@ -749,40 +825,6 @@ LOCK TABLES `group_member` WRITE;
UNLOCK TABLES;
--
--- Table structure for table `groups`
---
-
-DROP TABLE IF EXISTS `groups`;
-CREATE TABLE `groups` (
- `leaderGuid` int(11) unsigned NOT NULL,
- `mainTank` int(11) unsigned NOT NULL,
- `mainAssistant` int(11) unsigned NOT NULL,
- `lootMethod` tinyint(4) unsigned NOT NULL,
- `looterGuid` int(11) unsigned NOT NULL,
- `lootThreshold` tinyint(4) unsigned NOT NULL,
- `icon1` int(11) unsigned NOT NULL,
- `icon2` int(11) unsigned NOT NULL,
- `icon3` int(11) unsigned NOT NULL,
- `icon4` int(11) unsigned NOT NULL,
- `icon5` int(11) unsigned NOT NULL,
- `icon6` int(11) unsigned NOT NULL,
- `icon7` int(11) unsigned NOT NULL,
- `icon8` int(11) unsigned NOT NULL,
- `isRaid` tinyint(1) unsigned NOT NULL,
- `difficulty` tinyint(3) unsigned NOT NULL default '0',
- PRIMARY KEY (`leaderGuid`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Groups';
-
---
--- Dumping data for table `groups`
---
-
-LOCK TABLES `groups` WRITE;
-/*!40000 ALTER TABLE `groups` DISABLE KEYS */;
-/*!40000 ALTER TABLE `groups` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
-- Table structure for table `guild`
--
@@ -851,7 +893,7 @@ CREATE TABLE `guild_bank_item` (
`SlotId` tinyint(3) unsigned NOT NULL default '0',
`item_guid` int(11) unsigned NOT NULL default '0',
`item_entry` int(11) unsigned NOT NULL default '0',
- PRIMARY KEY (`guildid`,`TabId`,`SlotId`),
+ PRIMARY KEY (`guildid`,`tabid`,`slotid`),
KEY `guildid_key` (`guildid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
@@ -898,7 +940,7 @@ CREATE TABLE `guild_bank_tab` (
`TabId` tinyint(1) unsigned NOT NULL default '0',
`TabName` varchar(100) NOT NULL default '',
`TabIcon` varchar(100) NOT NULL default '',
- `TabText` varchar(500) NOT NULL default '',
+ `TabText` text,
PRIMARY KEY (`guildid`,`TabId`),
KEY `guildid_key` (`guildid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
@@ -925,7 +967,7 @@ CREATE TABLE `guild_eventlog` (
`PlayerGuid2` int(11) NOT NULL COMMENT 'Player 2',
`NewRank` tinyint(2) NOT NULL COMMENT 'New rank(in case promotion/demotion)',
`TimeStamp` bigint(20) NOT NULL COMMENT 'Event UNIX time'
-) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Guild Eventlog';
+) ENGINE = InnoDB DEFAULT CHARSET = latin1 COMMENT 'Guild Eventlog';
--
-- Dumping data for table `guild_eventlog`
@@ -963,7 +1005,7 @@ CREATE TABLE `guild_member` (
`BankRemSlotsTab5` int(11) unsigned NOT NULL default '0',
KEY `guildid_key` (`guildid`),
KEY `guildid_rank_key` (`guildid`,`rank`),
- KEY `guid_key` (`guid`)
+ UNIQUE KEY `guid_key` (`guid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Guild System';
--
@@ -999,25 +1041,6 @@ LOCK TABLES `guild_rank` WRITE;
UNLOCK TABLES;
--
--- Table structure for table `has_logged_in_before`
---
-
-DROP TABLE IF EXISTS `has_logged_in_before`;
-CREATE TABLE `has_logged_in_before` (
- `guid` int(11) unsigned NOT NULL default '0',
- PRIMARY KEY (`guid`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='ImpConfig check';
-
---
--- Dumping data for table `has_logged_in_before`
---
-
-LOCK TABLES `has_logged_in_before` WRITE;
-/*!40000 ALTER TABLE `has_logged_in_before` DISABLE KEYS */;
-/*!40000 ALTER TABLE `has_logged_in_before` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
-- Table structure for table `instance`
--
@@ -1042,10 +1065,9 @@ LOCK TABLES `instance` WRITE;
/*!40000 ALTER TABLE `instance` ENABLE KEYS */;
UNLOCK TABLES;
---
--- Table structure for table `instance_reset`
---
-
+-- ----------------------------
+-- Table structure for instance_reset
+-- ----------------------------
DROP TABLE IF EXISTS `instance_reset`;
CREATE TABLE `instance_reset` (
`mapid` int(11) unsigned NOT NULL default '0',
@@ -1170,6 +1192,7 @@ CREATE TABLE `pet_aura` (
`caster_guid` bigint(20) unsigned NOT NULL default '0' COMMENT 'Full Global Unique Identifier',
`spell` int(11) unsigned NOT NULL default '0',
`effect_index` int(11) unsigned NOT NULL default '0',
+ `stackcount` int(11) NOT NULL default '1',
`amount` int(11) NOT NULL default '0',
`maxduration` int(11) NOT NULL default '0',
`remaintime` int(11) NOT NULL default '0',
@@ -1274,6 +1297,7 @@ LOCK TABLES `petition_sign` WRITE;
/*!40000 ALTER TABLE `petition_sign` DISABLE KEYS */;
/*!40000 ALTER TABLE `petition_sign` ENABLE KEYS */;
UNLOCK TABLES;
+/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
--
-- Table structure for table `saved_variables`
@@ -1281,7 +1305,7 @@ UNLOCK TABLES;
DROP TABLE IF EXISTS `saved_variables`;
CREATE TABLE `saved_variables` (
- `NextArenaPointDistributionTime` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP
+ `NextArenaPointDistributionTime` bigint(40) UNSIGNED NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Variable Saves';
--
@@ -1294,6 +1318,67 @@ LOCK TABLES `saved_variables` WRITE;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
+--
+-- Table structure for table `game_event_condition_save`
+--
+
+DROP TABLE IF EXISTS `game_event_condition_save`;
+CREATE TABLE `game_event_condition_save` (
+ `event_id` mediumint(8) unsigned NOT NULL,
+ `condition_id` mediumint(8) unsigned NOT NULL default '0',
+ `done` float default '0',
+ PRIMARY KEY (`event_id`,`condition_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `game_event_condition_save`
+--
+
+LOCK TABLES `game_event_condition_save` WRITE;
+/*!40000 ALTER TABLE `game_event_condition_save` DISABLE KEYS */;
+/*!40000 ALTER TABLE `game_event_condition_save` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `game_event_save`
+--
+
+DROP TABLE IF EXISTS `game_event_save`;
+CREATE TABLE `game_event_save` (
+ `event_id` mediumint(8) unsigned NOT NULL,
+ `state` tinyint(3) unsigned NOT NULL default '1',
+ `next_start` timestamp NOT NULL default '0000-00-00 00:00:00',
+ PRIMARY KEY (`event_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `game_event_save`
+--
+
+LOCK TABLES `game_event_save` WRITE;
+/*!40000 ALTER TABLE `game_event_save` DISABLE KEYS */;
+/*!40000 ALTER TABLE `game_event_save` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `has_logged_in_before`
+--
+
+DROP TABLE IF EXISTS `has_logged_in_before`;
+CREATE TABLE `has_logged_in_before` (
+ `guid` int(11) unsigned NOT NULL default '0',
+ PRIMARY KEY (`guid`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='ImpConfig check';
+
+--
+-- Dumping data for table `has_logged_in_before`
+--
+
+LOCK TABLES `has_logged_in_before` WRITE;
+/*!40000 ALTER TABLE `has_logged_in_before` DISABLE KEYS */;
+/*!40000 ALTER TABLE `has_logged_in_before` ENABLE KEYS */;
+UNLOCK TABLES;
+
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
@@ -1302,4 +1387,4 @@ UNLOCK TABLES;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
--- Dump completed on 2008-11-18 11:24:11
+-- Dump completed on 2008-01-10 11:37:06
diff --git a/sql/realmd.sql b/sql/realmd.sql
index d60d88c434e..2f4ea16d172 100644
--- a/sql/realmd.sql
+++ b/sql/realmd.sql
@@ -2,7 +2,7 @@
--
-- Host: localhost Database: realmd
-- ------------------------------------------------------
--- Server version 5.0.34-log
+-- Server version 5.0.45-Debian_1ubuntu3.1-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
@@ -22,13 +22,13 @@
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (
`id` bigint(20) unsigned NOT NULL auto_increment COMMENT 'Identifier',
- `username` varchar(32) NOT NULL,
+ `username` varchar(32) NOT NULL default '',
`sha_pass_hash` varchar(40) NOT NULL default '',
`gmlevel` tinyint(3) unsigned NOT NULL default '0',
`sessionkey` longtext,
`v` longtext,
`s` longtext,
- `email` varchar(320) NOT NULL default '',
+ `email` text,
`joindate` timestamp NOT NULL default CURRENT_TIMESTAMP,
`last_ip` varchar(30) NOT NULL default '127.0.0.1',
`failed_logins` int(11) unsigned NOT NULL default '0',
@@ -41,7 +41,7 @@ CREATE TABLE `account` (
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`),
KEY `idx_gmlevel` (`gmlevel`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Account System';
+) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='Account System';
--
-- Dumping data for table `account`
@@ -49,6 +49,11 @@ CREATE TABLE `account` (
LOCK TABLES `account` WRITE;
/*!40000 ALTER TABLE `account` DISABLE KEYS */;
+/*INSERT INTO `account` VALUES
+(1,'ADMINISTRATOR','a34b29541b87b7e4823683ce6c7bf6ae68beaaac',3,'','0','0','','2006-04-25 10:18:56','127.0.0.1',0,0,'0000-00-00 00:00:00',0,0,0,0),
+(2,'GAMEMASTER','7841e21831d7c6bc0b57fbe7151eb82bd65ea1f9',2,'','0','0','','2006-04-25 10:18:56','127.0.0.1',0,0,'0000-00-00 00:00:00',0,0,0,0),
+(3,'MODERATOR','a7f5fbff0b4eec2d6b6e78e38e8312e64d700008',1,'','0','0','','2006-04-25 10:19:35','127.0.0.1',0,0,'0000-00-00 00:00:00',0,0,0,0),
+(4,'PLAYER','3ce8a96d17c5ae88a30681024e86279f1a38c041',0,'','0','0','','2006-04-25 10:19:35','127.0.0.1',0,0,'0000-00-00 00:00:00',0,0,0,0);*/
/*!40000 ALTER TABLE `account` ENABLE KEYS */;
UNLOCK TABLES;
@@ -83,11 +88,11 @@ UNLOCK TABLES;
DROP TABLE IF EXISTS `ip_banned`;
CREATE TABLE `ip_banned` (
`ip` varchar(32) NOT NULL default '127.0.0.1',
- `bandate` int(11) NOT NULL,
- `unbandate` int(11) NOT NULL,
+ `bandate` bigint(40) NOT NULL,
+ `unbandate` bigint(40) NOT NULL,
`bannedby` varchar(50) NOT NULL default '[Console]',
- `banreason` varchar(50) NOT NULL default 'no reason',
- PRIMARY KEY (`ip`)
+ `banreason` varchar(255) NOT NULL default 'no reason',
+ PRIMARY KEY (`ip`,`bandate`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Banned IPs';
--
@@ -137,7 +142,7 @@ CREATE TABLE `realmlist` (
`population` float unsigned NOT NULL default '0',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_name` (`name`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Realm System';
+) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Realm System';
--
-- Dumping data for table `realmlist`
@@ -145,6 +150,8 @@ CREATE TABLE `realmlist` (
LOCK TABLES `realmlist` WRITE;
/*!40000 ALTER TABLE `realmlist` DISABLE KEYS */;
+INSERT INTO `realmlist` VALUES
+(1,'Trinity','127.0.0.1',8085,1,0,1,0,0);
/*!40000 ALTER TABLE `realmlist` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -157,4 +164,4 @@ UNLOCK TABLES;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
--- Dump completed on 2008-10-14 13:28:11
+-- Dump completed on 2008-01-10 11:37:06
diff --git a/sql/updates/06750_mangos_command.sql b/sql/updates/06750_mangos_command.sql
new file mode 100644
index 00000000000..100185c0acd
--- /dev/null
+++ b/sql/updates/06750_mangos_command.sql
@@ -0,0 +1,3 @@
+DELETE FROM command WHERE name = 'reload all_locales';
+INSERT INTO `command` VALUES
+('reload all_locales',3,'Syntax: .reload all_locales\r\n\r\nReload all `locales_*` tables with reload support added and that can be _safe_ reloaded.');
diff --git a/sql/updates/2008_12_22_01_mangos_creature_equip_template.sql b/sql/updates/2008_12_22_01_mangos_creature_equip_template.sql
new file mode 100644
index 00000000000..6efaae7ae3d
--- /dev/null
+++ b/sql/updates/2008_12_22_01_mangos_creature_equip_template.sql
@@ -0,0 +1,14 @@
+ALTER TABLE db_version CHANGE COLUMN required_2008_12_15_01_mangos_arenas required_2008_12_22_01_mangos_creature_equip_template bit;
+
+TRUNCATE creature_equip_template;
+
+alter table `creature_equip_template`
+ drop column `equipinfo1`,
+ drop column `equipinfo2`,
+ drop column `equipinfo3`,
+ drop column `equipslot1`,
+ drop column `equipslot2`,
+ drop column `equipslot3`,
+ change `equipmodel1` `equipentry1` mediumint(8) UNSIGNED default '0' NOT NULL,
+ change `equipmodel2` `equipentry2` mediumint(8) UNSIGNED default '0' NOT NULL,
+ change `equipmodel3` `equipentry3` mediumint(8) UNSIGNED default '0' NOT NULL;
diff --git a/sql/updates/2008_12_22_02_characters_character_pet.sql b/sql/updates/2008_12_22_02_characters_character_pet.sql
new file mode 100644
index 00000000000..b083232ae4e
--- /dev/null
+++ b/sql/updates/2008_12_22_02_characters_character_pet.sql
@@ -0,0 +1,7 @@
+ALTER TABLE character_db_version CHANGE COLUMN required_2008_12_15_01_character_arenas required_2008_12_22_02_characters_character_pet bit;
+
+alter table `character_pet`
+ drop column `trainpoint`,
+ drop column `loyaltypoints`,
+ drop column `loyalty`,
+ add `talentpoints` int(11) UNSIGNED default '0' NOT NULL after `Reactstate`;
diff --git a/sql/updates/2008_12_22_03_mangos_item_template.sql b/sql/updates/2008_12_22_03_mangos_item_template.sql
new file mode 100644
index 00000000000..3d27b3f3d60
--- /dev/null
+++ b/sql/updates/2008_12_22_03_mangos_item_template.sql
@@ -0,0 +1,7 @@
+ALTER TABLE db_version CHANGE COLUMN required_2008_12_22_01_mangos_creature_equip_template required_2008_12_22_03_mangos_item_template bit;
+
+alter table `item_template`
+ add column `ScalingStatDistribution` smallint(6) DEFAULT '0' NOT NULL after `stat_value10`,
+ add column `ScalingStatValue` smallint(6) DEFAULT '0' NOT NULL after `ScalingStatDistribution`,
+ add column `ItemLimitCategory` smallint(6) DEFAULT '0' NOT NULL after `ArmorDamageModifier`,
+ change `Duration` `Duration` int(11) NOT NULL default '0' COMMENT 'Duration in seconds. Negative value means realtime, postive value ingame time' after ArmorDamageModifier;
diff --git a/sql/updates/2008_12_22_04_mangos_item_template.sql b/sql/updates/2008_12_22_04_mangos_item_template.sql
new file mode 100644
index 00000000000..685c44a4e9a
--- /dev/null
+++ b/sql/updates/2008_12_22_04_mangos_item_template.sql
@@ -0,0 +1,4 @@
+ALTER TABLE db_version CHANGE COLUMN required_2008_12_22_03_mangos_item_template required_2008_12_22_04_mangos_item_template bit;
+
+alter table `item_template`
+ add column `StatsCount` tinyint(3) UNSIGNED DEFAULT '0' NOT NULL after `ContainerSlots`;
diff --git a/sql/updates/2008_12_22_05_characters_account_data.sql b/sql/updates/2008_12_22_05_characters_account_data.sql
new file mode 100644
index 00000000000..5923bfe9639
--- /dev/null
+++ b/sql/updates/2008_12_22_05_characters_account_data.sql
@@ -0,0 +1,9 @@
+ALTER TABLE character_db_version CHANGE COLUMN required_2008_12_22_02_characters_character_pet required_2008_12_22_05_characters_account_data bit;
+
+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;
diff --git a/sql/updates/2008_12_22_06_characters_character_achievement.sql b/sql/updates/2008_12_22_06_characters_character_achievement.sql
new file mode 100644
index 00000000000..ca5c240b6d5
--- /dev/null
+++ b/sql/updates/2008_12_22_06_characters_character_achievement.sql
@@ -0,0 +1,18 @@
+ALTER TABLE character_db_version CHANGE COLUMN required_2008_12_22_05_characters_account_data required_2008_12_22_06_characters_character_achievement bit;
+
+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;
+
+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;
diff --git a/sql/updates/2008_12_22_07_mangos_quest_template.sql b/sql/updates/2008_12_22_07_mangos_quest_template.sql
new file mode 100644
index 00000000000..a3795504bba
--- /dev/null
+++ b/sql/updates/2008_12_22_07_mangos_quest_template.sql
@@ -0,0 +1,5 @@
+ALTER TABLE db_version CHANGE COLUMN required_2008_12_22_04_mangos_item_template required_2008_12_22_07_mangos_quest_template bit;
+
+alter table `quest_template`
+ add column `PlayersSlain` tinyint(3) UNSIGNED DEFAULT '0' NOT NULL after `CharTitleId`,
+ add column `BonusTalents` tinyint(3) UNSIGNED DEFAULT '0' NOT NULL after `PlayersSlain`;
diff --git a/sql/updates/2008_12_22_08_mangos_milling_loot_template.sql b/sql/updates/2008_12_22_08_mangos_milling_loot_template.sql
new file mode 100644
index 00000000000..18500508c1c
--- /dev/null
+++ b/sql/updates/2008_12_22_08_mangos_milling_loot_template.sql
@@ -0,0 +1,15 @@
+ALTER TABLE db_version CHANGE COLUMN required_2008_12_22_07_mangos_quest_template required_2008_12_22_08_mangos_milling_loot_template bit;
+
+DROP TABLE IF EXISTS `milling_loot_template`;
+CREATE TABLE `milling_loot_template` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `item` mediumint(8) unsigned NOT NULL default '0',
+ `ChanceOrQuestChance` float NOT NULL default '100',
+ `groupid` tinyint(3) unsigned NOT NULL default '0',
+ `mincountOrRef` mediumint(9) NOT NULL default '1',
+ `maxcount` tinyint(3) unsigned NOT NULL default '1',
+ `lootcondition` tinyint(3) unsigned NOT NULL default '0',
+ `condition_value1` mediumint(8) unsigned NOT NULL default '0',
+ `condition_value2` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`,`item`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System';
diff --git a/sql/updates/2008_12_22_09_mangos_spell_affect.sql b/sql/updates/2008_12_22_09_mangos_spell_affect.sql
new file mode 100644
index 00000000000..6d5635ecece
--- /dev/null
+++ b/sql/updates/2008_12_22_09_mangos_spell_affect.sql
@@ -0,0 +1,14 @@
+ALTER TABLE db_version CHANGE COLUMN required_2008_12_22_08_mangos_milling_loot_template required_2008_12_22_09_mangos_spell_affect bit;
+
+--
+-- Table structure for table `spell_affect`
+--
+DROP TABLE IF EXISTS `spell_affect`;
+CREATE TABLE `spell_affect` (
+ `entry` smallint(5) unsigned NOT NULL default '0',
+ `effectId` tinyint(3) unsigned NOT NULL default '0',
+ `SpellClassMask0` int(5) unsigned NOT NULL default '0',
+ `SpellClassMask1` int(5) unsigned NOT NULL default '0',
+ `SpellClassMask2` int(5) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`,`effectId`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8; \ No newline at end of file
diff --git a/sql/updates/2008_12_22_10_mangos_string.sql b/sql/updates/2008_12_22_10_mangos_string.sql
new file mode 100644
index 00000000000..16c9f0dda3c
--- /dev/null
+++ b/sql/updates/2008_12_22_10_mangos_string.sql
@@ -0,0 +1,5 @@
+ALTER TABLE db_version CHANGE COLUMN required_2008_12_22_09_mangos_spell_affect required_2008_12_22_10_mangos_string bit;
+
+INSERT INTO `mangos_string` VALUES
+(345,'Forced customize for player %s will be requested at next login.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(346,'Forced customize for player %s (GUID #%u) will be requested at next login.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
diff --git a/sql/updates/2008_12_22_11_mangos_player_classlevelstats.sql b/sql/updates/2008_12_22_11_mangos_player_classlevelstats.sql
new file mode 100644
index 00000000000..70c947f9754
--- /dev/null
+++ b/sql/updates/2008_12_22_11_mangos_player_classlevelstats.sql
@@ -0,0 +1,183 @@
+ALTER TABLE db_version CHANGE COLUMN required_2008_12_22_10_mangos_string required_2008_12_22_11_mangos_player_classlevelstats bit;
+
+DELETE FROM `player_classlevelstats` WHERE class = 6 OR level > 70;
+INSERT INTO `player_classlevelstats` VALUES
+(1,71,4720,0),
+(1,72,5013,0),
+(1,73,5325,0),
+(1,74,5656,0),
+(1,75,6008,0),
+(1,76,6381,0),
+(1,77,6778,0),
+(1,78,7198,0),
+(1,79,7646,0),
+(1,80,8121,0),
+
+(2,71,3629,3097),
+(2,72,3900,3241),
+(2,73,4191,3385),
+(2,74,4503,3529),
+(2,75,4839,3673),
+(2,76,5200,3817),
+(2,77,5588,3962),
+(2,78,6005,4106),
+(2,79,6453,4250),
+(2,80,6934,4394),
+
+(3,71,3834,3549),
+(3,72,4120,3716),
+(3,73,4427,3882),
+(3,74,4757,4048),
+(3,75,5112,4215),
+(3,76,5493,4381),
+(3,77,5903,4547),
+(3,78,6343,4713),
+(3,79,6816,4880),
+(3,80,7324,5046),
+
+(4,71,3980,0),
+(4,72,4277,0),
+(4,73,4596,0),
+(4,74,4939,0),
+(4,75,5307,0),
+(4,76,5703,0),
+(4,77,6128,0),
+(4,78,6585,0),
+(4,79,7076,0),
+(4,80,7604,0),
+
+(5,71,3644,2744),
+(5,72,3916,2868),
+(5,73,4208,2993),
+(5,74,4522,3117),
+(5,75,4859,3242),
+(5,76,5221,3366),
+(5,77,5610,3490),
+(5,78,6028,3615),
+(5,79,6477,3739),
+(5,80,6960,3863),
+
+(6,1,22,0),
+(6,2,27,0),
+(6,3,32,0),
+(6,4,37,0),
+(6,5,42,0),
+(6,6,47,0),
+(6,7,52,0),
+(6,8,58,0),
+(6,9,64,0),
+(6,10,70,0),
+(6,11,77,0),
+(6,12,84,0),
+(6,13,92,0),
+(6,14,100,0),
+(6,15,117,0),
+(6,16,127,0),
+(6,17,138,0),
+(6,18,150,0),
+(6,19,163,0),
+(6,20,177,0),
+(6,21,192,0),
+(6,22,208,0),
+(6,23,225,0),
+(6,24,239,0),
+(6,25,258,0),
+(6,26,278,0),
+(6,27,299,0),
+(6,28,321,0),
+(6,29,344,0),
+(6,30,368,0),
+(6,31,393,0),
+(6,32,419,0),
+(6,33,446,0),
+(6,34,474,0),
+(6,35,503,0),
+(6,36,533,0),
+(6,37,564,0),
+(6,38,596,0),
+(6,39,629,0),
+(6,40,698,0),
+(6,41,698,0),
+(6,42,734,0),
+(6,43,771,0),
+(6,44,809,0),
+(6,45,849,0),
+(6,46,891,0),
+(6,47,935,0),
+(6,48,981,0),
+(6,49,1029,0),
+(6,50,1079,0),
+(6,51,1131,0),
+(6,52,1185,0),
+(6,53,1241,0),
+(6,54,1299,0),
+(6,55,1359,0),
+(6,56,1421,0),
+(6,57,1485,0),
+(6,58,1551,0),
+(6,59,1619,0),
+(6,60,1689,0),
+(6,61,1902,0),
+(6,62,2129,0),
+(6,63,2357,0),
+(6,64,2612,0),
+(6,65,2883,0),
+(6,66,3169,0),
+(6,67,3455,0),
+(6,68,3774,0),
+(6,69,4109,0),
+(6,70,4444,0),
+(6,71,4720,0),
+(6,72,5013,0),
+(6,73,5325,0),
+(6,74,5656,0),
+(6,75,6008,0),
+(6,76,6381,0),
+(6,77,6778,0),
+(6,78,7199,0),
+(6,79,7646,0),
+(6,80,8121,0),
+
+(7,71,3395,3102),
+(7,72,3648,3246),
+(7,73,3920,3389),
+(7,74,4212,3533),
+(7,75,4526,3677),
+(7,76,4863,3821),
+(7,77,5226,3965),
+(7,78,5616,4108),
+(7,79,6035,4252),
+(7,80,6485,4396),
+
+(8,71,3646,2343),
+(8,72,3918,2446),
+(8,73,4210,2549),
+(8,74,4524,2652),
+(8,75,4861,2754),
+(8,76,5223,2857),
+(8,77,5612,2960),
+(8,78,6030,3063),
+(8,79,6480,3165),
+(8,80,6963,3268),
+
+(9,71,3750,2739),
+(9,72,4025,2863),
+(9,73,4330,2987),
+(9,74,4646,3111),
+(9,75,4997,3235),
+(9,76,5373,3360),
+(9,77,5774,3483),
+(9,78,6207,3608),
+(9,79,6667,3732),
+(9,80,7136,3856),
+
+(11,71,3883,2482),
+(11,72,4172,2595),
+(11,73,4483,2708),
+(11,74,4817,2820),
+(11,75,5176,2933),
+(11,76,5562,3045),
+(11,77,5977,3158),
+(11,78,6423,3270),
+(11,79,6902,3383),
+(11,80,7417,3496);
diff --git a/sql/updates/2008_12_22_12_mangos_player_levelstats.sql b/sql/updates/2008_12_22_12_mangos_player_levelstats.sql
new file mode 100644
index 00000000000..f7473340725
--- /dev/null
+++ b/sql/updates/2008_12_22_12_mangos_player_levelstats.sql
@@ -0,0 +1,5025 @@
+ALTER TABLE db_version CHANGE COLUMN required_2008_12_22_11_mangos_player_classlevelstats required_2008_12_22_12_mangos_player_levelstats bit;
+
+DELETE FROM `player_levelstats`;
+INSERT INTO `player_levelstats` VALUES
+(1,1,1,23,20,22,20,20),
+(1,1,2,24,21,23,20,20),
+(1,1,3,26,22,24,20,21),
+(1,1,4,27,22,26,20,21),
+(1,1,5,28,23,27,20,21),
+(1,1,6,30,24,28,20,21),
+(1,1,7,31,25,29,21,22),
+(1,1,8,32,26,30,21,22),
+(1,1,9,34,26,32,21,22),
+(1,1,10,35,27,33,21,23),
+(1,1,11,36,28,34,21,23),
+(1,1,12,38,29,35,21,23),
+(1,1,13,39,30,37,21,24),
+(1,1,14,41,31,38,21,24),
+(1,1,15,42,32,39,21,24),
+(1,1,16,44,33,41,21,25),
+(1,1,17,45,34,42,22,25),
+(1,1,18,47,34,43,22,25),
+(1,1,19,48,35,45,22,26),
+(1,1,20,50,36,46,22,26),
+(1,1,21,51,37,48,22,26),
+(1,1,22,53,38,49,22,27),
+(1,1,23,54,39,51,22,27),
+(1,1,24,56,40,52,23,28),
+(1,1,25,58,41,53,23,28),
+(1,1,26,59,42,55,23,28),
+(1,1,27,61,43,56,23,29),
+(1,1,28,63,44,58,23,29),
+(1,1,29,64,45,59,23,30),
+(1,1,30,66,46,61,24,30),
+(1,1,31,68,47,62,24,30),
+(1,1,32,69,48,64,24,31),
+(1,1,33,71,50,66,24,31),
+(1,1,34,73,51,67,24,32),
+(1,1,35,74,52,69,24,32),
+(1,1,36,76,53,70,25,33),
+(1,1,37,78,54,72,25,33),
+(1,1,38,80,55,74,25,34),
+(1,1,39,82,56,75,25,34),
+(1,1,40,83,57,77,25,35),
+(1,1,41,85,58,79,26,35),
+(1,1,42,87,60,80,26,35),
+(1,1,43,89,61,82,26,36),
+(1,1,44,91,62,84,26,36),
+(1,1,45,93,63,85,26,37),
+(1,1,46,95,64,87,27,37),
+(1,1,47,97,66,89,27,38),
+(1,1,48,99,67,91,27,38),
+(1,1,49,101,68,93,27,39),
+(1,1,50,103,69,94,28,40),
+(1,1,51,105,71,96,28,40),
+(1,1,52,107,72,98,28,41),
+(1,1,53,109,73,100,28,41),
+(1,1,54,111,74,102,29,42),
+(1,1,55,113,76,103,29,42),
+(1,1,56,115,77,105,29,43),
+(1,1,57,117,78,107,29,43),
+(1,1,58,119,79,109,30,44),
+(1,1,59,121,81,111,30,44),
+(1,1,60,123,82,113,30,45),
+(1,1,61,125,83,115,30,46),
+(1,1,62,127,85,117,31,46),
+(1,1,63,129,86,119,31,47),
+(1,1,64,132,88,121,31,47),
+(1,1,65,134,89,123,32,48),
+(1,1,66,136,90,125,32,49),
+(1,1,67,138,92,127,32,49),
+(1,1,68,140,93,129,32,50),
+(1,1,69,143,95,131,33,50),
+(1,1,70,145,96,133,33,51),
+(1,1,71,148,97,140,33,53),
+(1,1,72,156,99,143,33,54),
+(1,1,73,162,101,148,33,55),
+(1,1,74,162,102,148,34,55),
+(1,1,75,165,104,150,34,56),
+(1,1,76,171,106,156,34,57),
+(1,1,77,171,108,157,35,58),
+(1,1,78,174,109,159,35,58),
+(1,1,79,181,111,165,35,59),
+(1,1,80,184,113,168,36,60),
+
+(1,2,1,22,20,22,20,21),
+(1,2,2,23,21,23,21,22),
+(1,2,3,24,21,24,21,22),
+(1,2,4,25,22,25,22,23),
+(1,2,5,26,22,26,23,24),
+(1,2,6,28,23,27,23,25),
+(1,2,7,29,24,28,24,25),
+(1,2,8,30,24,29,25,26),
+(1,2,9,31,25,30,25,27),
+(1,2,10,32,25,32,26,27),
+(1,2,11,33,26,33,27,28),
+(1,2,12,35,27,34,27,29),
+(1,2,13,36,27,35,28,30),
+(1,2,14,37,28,36,29,31),
+(1,2,15,38,29,37,30,31),
+(1,2,16,40,29,38,30,32),
+(1,2,17,41,30,40,31,33),
+(1,2,18,42,31,41,32,34),
+(1,2,19,43,31,42,33,35),
+(1,2,20,45,32,43,33,35),
+(1,2,21,46,33,45,34,36),
+(1,2,22,47,33,46,35,37),
+(1,2,23,49,34,47,36,38),
+(1,2,24,50,35,48,37,39),
+(1,2,25,51,36,50,37,40),
+(1,2,26,53,36,51,38,41),
+(1,2,27,54,37,52,39,42),
+(1,2,28,56,38,54,40,43),
+(1,2,29,57,39,55,41,43),
+(1,2,30,58,39,56,42,44),
+(1,2,31,60,40,58,43,45),
+(1,2,32,61,41,59,43,46),
+(1,2,33,63,42,60,44,47),
+(1,2,34,64,43,62,45,48),
+(1,2,35,66,44,63,46,49),
+(1,2,36,67,44,65,47,50),
+(1,2,37,69,45,66,48,51),
+(1,2,38,70,46,67,49,52),
+(1,2,39,72,47,69,50,53),
+(1,2,40,73,48,70,51,54),
+(1,2,41,75,49,72,52,55),
+(1,2,42,77,49,73,53,56),
+(1,2,43,78,50,75,54,57),
+(1,2,44,80,51,76,55,58),
+(1,2,45,81,52,78,56,59),
+(1,2,46,83,53,79,57,61),
+(1,2,47,85,54,81,58,62),
+(1,2,48,86,55,83,59,63),
+(1,2,49,88,56,84,60,64),
+(1,2,50,90,57,86,61,65),
+(1,2,51,91,58,87,62,66),
+(1,2,52,93,59,89,63,67),
+(1,2,53,95,60,91,64,68),
+(1,2,54,97,61,92,65,69),
+(1,2,55,98,61,94,66,71),
+(1,2,56,100,62,95,67,72),
+(1,2,57,102,63,97,68,73),
+(1,2,58,104,64,99,69,74),
+(1,2,59,105,65,101,70,75),
+(1,2,60,107,66,102,71,77),
+(1,2,61,109,67,104,73,78),
+(1,2,62,111,69,106,74,79),
+(1,2,63,113,70,107,75,80),
+(1,2,64,115,71,109,76,81),
+(1,2,65,116,72,111,77,83),
+(1,2,66,118,73,113,78,84),
+(1,2,67,120,74,115,79,85),
+(1,2,68,122,75,116,81,86),
+(1,2,69,124,76,118,82,88),
+(1,2,70,126,77,120,83,89),
+(1,2,71,148,78,122,84,92),
+(1,2,72,150,79,125,86,94),
+(1,2,73,152,80,127,87,96),
+(1,2,74,156,82,129,89,97),
+(1,2,75,158,83,131,90,99),
+(1,2,76,162,84,134,92,100),
+(1,2,77,164,86,136,93,103),
+(1,2,78,167,87,138,95,105),
+(1,2,79,170,88,153,96,106),
+(1,2,80,173,90,160,98,108),
+
+(1,4,1,21,23,21,20,20),
+(1,4,2,22,24,22,20,20),
+(1,4,3,23,26,22,20,21),
+(1,4,4,23,27,23,20,21),
+(1,4,5,24,29,24,21,21),
+(1,4,6,25,30,25,21,22),
+(1,4,7,26,32,25,21,22),
+(1,4,8,26,33,26,21,23),
+(1,4,9,27,35,27,21,23),
+(1,4,10,28,36,27,21,23),
+(1,4,11,29,38,28,22,24),
+(1,4,12,30,39,29,22,24),
+(1,4,13,31,41,30,22,25),
+(1,4,14,31,43,31,22,25),
+(1,4,15,32,44,31,22,25),
+(1,4,16,33,46,32,23,26),
+(1,4,17,34,48,33,23,26),
+(1,4,18,35,49,34,23,27),
+(1,4,19,36,51,35,23,27),
+(1,4,20,37,53,35,23,28),
+(1,4,21,38,54,36,24,28),
+(1,4,22,39,56,37,24,29),
+(1,4,23,40,58,38,24,29),
+(1,4,24,41,60,39,24,30),
+(1,4,25,42,61,40,25,30),
+(1,4,26,43,63,41,25,31),
+(1,4,27,44,65,42,25,31),
+(1,4,28,45,67,43,25,32),
+(1,4,29,46,69,43,25,32),
+(1,4,30,47,71,44,26,33),
+(1,4,31,48,72,45,26,33),
+(1,4,32,49,74,46,26,34),
+(1,4,33,50,76,47,27,34),
+(1,4,34,51,78,48,27,35),
+(1,4,35,52,80,49,27,35),
+(1,4,36,53,82,50,27,36),
+(1,4,37,54,84,51,28,36),
+(1,4,38,55,86,52,28,37),
+(1,4,39,56,88,53,28,38),
+(1,4,40,57,90,54,28,38),
+(1,4,41,58,92,55,29,39),
+(1,4,42,60,94,56,29,39),
+(1,4,43,61,96,57,29,40),
+(1,4,44,62,98,58,30,40),
+(1,4,45,63,100,59,30,41),
+(1,4,46,64,103,61,30,42),
+(1,4,47,65,105,62,31,42),
+(1,4,48,66,107,63,31,43),
+(1,4,49,68,109,64,31,44),
+(1,4,50,69,111,65,32,44),
+(1,4,51,70,113,66,32,45),
+(1,4,52,71,116,67,32,45),
+(1,4,53,73,118,68,33,46),
+(1,4,54,74,120,69,33,47),
+(1,4,55,75,122,71,33,47),
+(1,4,56,76,125,72,34,48),
+(1,4,57,78,127,73,34,49),
+(1,4,58,79,129,74,34,49),
+(1,4,59,80,131,75,35,50),
+(1,4,60,81,134,77,35,51),
+(1,4,61,83,136,78,35,51),
+(1,4,62,84,138,79,36,52),
+(1,4,63,85,141,80,36,53),
+(1,4,64,87,143,81,37,54),
+(1,4,65,88,146,83,37,54),
+(1,4,66,89,148,84,37,55),
+(1,4,67,91,151,85,38,56),
+(1,4,68,92,153,86,38,57),
+(1,4,69,94,156,88,39,57),
+(1,4,70,95,158,89,39,58),
+(1,4,71,97,161,90,39,60),
+(1,4,72,99,164,92,40,60),
+(1,4,73,100,167,94,40,61),
+(1,4,74,102,170,95,41,62),
+(1,4,75,104,173,97,41,63),
+(1,4,76,105,176,98,41,64),
+(1,4,77,107,179,100,42,65),
+(1,4,78,109,183,106,42,66),
+(1,4,79,111,186,107,43,67),
+(1,4,80,113,189,109,43,69),
+
+(1,5,1,20,20,20,22,23),
+(1,5,2,20,20,20,23,24),
+(1,5,3,20,20,21,25,26),
+(1,5,4,20,21,21,26,27),
+(1,5,5,21,21,21,27,28),
+(1,5,6,21,21,22,29,30),
+(1,5,7,21,21,22,30,31),
+(1,5,8,21,22,23,31,33),
+(1,5,9,21,22,23,33,34),
+(1,5,10,21,22,23,34,36),
+(1,5,11,22,22,24,36,37),
+(1,5,12,22,23,24,37,39),
+(1,5,13,22,23,25,38,40),
+(1,5,14,22,23,25,40,42),
+(1,5,15,22,23,25,41,43),
+(1,5,16,23,24,26,43,45),
+(1,5,17,23,24,26,44,46),
+(1,5,18,23,24,27,46,48),
+(1,5,19,23,24,27,47,49),
+(1,5,20,23,25,28,49,51),
+(1,5,21,24,25,28,51,53),
+(1,5,22,24,25,29,52,54),
+(1,5,23,24,26,29,54,56),
+(1,5,24,24,26,30,55,58),
+(1,5,25,25,26,30,57,59),
+(1,5,26,25,27,31,59,61),
+(1,5,27,25,27,31,60,63),
+(1,5,28,25,27,32,62,65),
+(1,5,29,25,28,32,64,66),
+(1,5,30,26,28,33,65,68),
+(1,5,31,26,28,33,67,70),
+(1,5,32,26,29,34,69,72),
+(1,5,33,27,29,34,70,73),
+(1,5,34,27,29,35,72,75),
+(1,5,35,27,30,35,74,77),
+(1,5,36,27,30,36,76,79),
+(1,5,37,28,30,36,78,81),
+(1,5,38,28,31,37,79,83),
+(1,5,39,28,31,38,81,85),
+(1,5,40,28,31,38,83,87),
+(1,5,41,29,32,39,85,88),
+(1,5,42,29,32,39,87,90),
+(1,5,43,29,33,40,89,92),
+(1,5,44,30,33,40,91,94),
+(1,5,45,30,33,41,92,96),
+(1,5,46,30,34,42,94,98),
+(1,5,47,31,34,42,96,100),
+(1,5,48,31,35,43,98,102),
+(1,5,49,31,35,44,100,104),
+(1,5,50,32,36,44,102,106),
+(1,5,51,32,36,45,104,109),
+(1,5,52,32,36,45,106,111),
+(1,5,53,33,37,46,108,113),
+(1,5,54,33,37,47,110,115),
+(1,5,55,33,38,47,112,117),
+(1,5,56,34,38,48,114,119),
+(1,5,57,34,39,49,117,121),
+(1,5,58,34,39,49,119,124),
+(1,5,59,35,40,50,121,126),
+(1,5,60,35,40,51,123,128),
+(1,5,61,35,41,51,125,130),
+(1,5,62,36,41,52,127,132),
+(1,5,63,36,41,53,129,135),
+(1,5,64,37,42,54,132,137),
+(1,5,65,37,42,54,134,139),
+(1,5,66,37,43,55,136,142),
+(1,5,67,38,43,56,138,144),
+(1,5,68,38,44,57,140,146),
+(1,5,69,39,44,57,143,149),
+(1,5,70,39,45,58,145,151),
+(1,5,71,39,46,59,148,158),
+(1,5,72,40,46,59,151,161),
+(1,5,73,40,47,60,154,164),
+(1,5,74,41,47,61,156,167),
+(1,5,75,41,48,62,159,170),
+(1,5,76,41,49,63,162,174),
+(1,5,77,42,49,64,165,177),
+(1,5,78,42,50,65,168,180),
+(1,5,79,43,50,66,171,183),
+(1,5,80,43,51,67,174,186),
+
+(1,6,1,23,20,22,20,20),
+(1,6,2,24,21,23,20,20),
+(1,6,3,26,22,24,20,21),
+(1,6,4,27,22,26,20,21),
+(1,6,5,28,23,27,20,21),
+(1,6,6,30,24,28,20,21),
+(1,6,7,31,25,29,21,22),
+(1,6,8,32,26,30,21,22),
+(1,6,9,34,26,32,21,22),
+(1,6,10,35,27,33,21,23),
+(1,6,11,36,28,34,21,23),
+(1,6,12,38,29,35,21,23),
+(1,6,13,39,30,37,21,24),
+(1,6,14,41,31,38,21,24),
+(1,6,15,42,32,39,21,24),
+(1,6,16,44,33,41,21,25),
+(1,6,17,45,34,42,22,25),
+(1,6,18,47,34,43,22,25),
+(1,6,19,48,35,45,22,26),
+(1,6,20,50,36,46,22,26),
+(1,6,21,51,37,48,22,26),
+(1,6,22,53,38,49,22,27),
+(1,6,23,54,39,51,22,27),
+(1,6,24,56,40,52,23,28),
+(1,6,25,58,41,53,23,28),
+(1,6,26,59,42,55,23,28),
+(1,6,27,61,43,56,23,29),
+(1,6,28,63,44,58,23,29),
+(1,6,29,64,45,59,23,30),
+(1,6,30,66,46,61,24,30),
+(1,6,31,68,47,62,24,30),
+(1,6,32,69,48,64,24,31),
+(1,6,33,71,50,66,24,31),
+(1,6,34,73,51,67,24,32),
+(1,6,35,74,52,69,24,32),
+(1,6,36,76,53,70,25,33),
+(1,6,37,78,54,72,25,33),
+(1,6,38,80,55,74,25,34),
+(1,6,39,82,56,75,25,34),
+(1,6,40,83,57,77,25,35),
+(1,6,41,85,58,79,26,35),
+(1,6,42,87,60,80,26,35),
+(1,6,43,89,61,82,26,36),
+(1,6,44,91,62,84,26,36),
+(1,6,45,93,63,85,26,37),
+(1,6,46,95,64,87,27,37),
+(1,6,47,97,66,89,27,38),
+(1,6,48,99,67,91,27,38),
+(1,6,49,101,68,93,27,39),
+(1,6,50,103,69,94,28,40),
+(1,6,51,105,71,96,28,40),
+(1,6,52,106,72,97,28,41),
+(1,6,53,107,72,98,28,41),
+(1,6,54,107,73,98,29,42),
+(1,6,55,108,73,99,29,43),
+(1,6,56,111,75,102,29,44),
+(1,6,57,113,76,104,29,44),
+(1,6,58,118,77,106,30,45),
+(1,6,59,118,79,108,30,45),
+(1,6,60,123,80,110,30,46),
+(1,6,61,125,81,112,30,47),
+(1,6,62,128,83,114,30,47),
+(1,6,63,130,84,117,31,48),
+(1,6,64,130,86,119,31,48),
+(1,6,65,140,87,128,31,49),
+(1,6,66,143,89,131,31,50),
+(1,6,67,146,90,133,32,50),
+(1,6,68,148,92,135,32,51),
+(1,6,69,151,93,138,32,52),
+(1,6,70,154,95,140,32,52),
+(1,6,71,162,97,144,33,53),
+(1,6,72,164,98,146,33,54),
+(1,6,73,165,100,148,33,55),
+(1,6,74,166,102,151,33,55),
+(1,6,75,169,103,154,34,56),
+(1,6,76,172,105,157,34,57),
+(1,6,77,175,107,157,34,58),
+(1,6,78,176,108,157,34,58),
+(1,6,79,177,110,157,35,59),
+(1,6,80,180,112,160,35,60),
+
+(1,8,1,20,20,20,23,22),
+(1,8,2,20,20,20,24,23),
+(1,8,3,20,20,21,26,25),
+(1,8,4,20,20,21,27,26),
+(1,8,5,20,21,21,28,27),
+(1,8,6,20,21,21,30,29),
+(1,8,7,21,21,22,31,30),
+(1,8,8,21,21,22,33,31),
+(1,8,9,21,21,22,34,33),
+(1,8,10,21,21,23,36,34),
+(1,8,11,21,22,23,37,36),
+(1,8,12,21,22,23,39,37),
+(1,8,13,21,22,24,40,38),
+(1,8,14,21,22,24,42,40),
+(1,8,15,21,22,24,43,41),
+(1,8,16,21,23,25,45,43),
+(1,8,17,22,23,25,46,44),
+(1,8,18,22,23,25,48,46),
+(1,8,19,22,23,26,49,47),
+(1,8,20,22,23,26,51,49),
+(1,8,21,22,24,26,53,51),
+(1,8,22,22,24,27,54,52),
+(1,8,23,22,24,27,56,54),
+(1,8,24,23,24,28,58,55),
+(1,8,25,23,25,28,59,57),
+(1,8,26,23,25,28,61,59),
+(1,8,27,23,25,29,63,60),
+(1,8,28,23,25,29,65,62),
+(1,8,29,23,25,30,66,64),
+(1,8,30,24,26,30,68,65),
+(1,8,31,24,26,30,70,67),
+(1,8,32,24,26,31,72,69),
+(1,8,33,24,27,31,73,70),
+(1,8,34,24,27,32,75,72),
+(1,8,35,24,27,32,77,74),
+(1,8,36,25,27,33,79,76),
+(1,8,37,25,28,33,81,78),
+(1,8,38,25,28,34,83,79),
+(1,8,39,25,28,34,85,81),
+(1,8,40,25,28,35,87,83),
+(1,8,41,26,29,35,88,85),
+(1,8,42,26,29,35,90,87),
+(1,8,43,26,29,36,92,89),
+(1,8,44,26,30,36,94,91),
+(1,8,45,26,30,37,96,92),
+(1,8,46,27,30,37,98,94),
+(1,8,47,27,31,38,100,96),
+(1,8,48,27,31,38,102,98),
+(1,8,49,27,31,39,104,100),
+(1,8,50,28,32,40,106,102),
+(1,8,51,28,32,40,109,104),
+(1,8,52,28,32,41,111,106),
+(1,8,53,28,33,41,113,108),
+(1,8,54,29,33,42,115,110),
+(1,8,55,29,33,42,117,112),
+(1,8,56,29,34,43,119,114),
+(1,8,57,29,34,43,121,117),
+(1,8,58,30,34,44,124,119),
+(1,8,59,30,35,44,126,121),
+(1,8,60,30,35,45,128,123),
+(1,8,61,30,35,46,130,125),
+(1,8,62,31,36,46,132,127),
+(1,8,63,31,36,47,135,129),
+(1,8,64,31,37,47,137,132),
+(1,8,65,32,37,48,139,134),
+(1,8,66,32,37,49,142,136),
+(1,8,67,32,38,49,144,138),
+(1,8,68,32,38,50,146,140),
+(1,8,69,33,39,50,149,143),
+(1,8,70,33,39,51,151,145),
+(1,8,71,33,39,52,154,152),
+(1,8,72,33,40,53,160,155),
+(1,8,73,33,40,54,160,158),
+(1,8,74,34,41,54,163,160),
+(1,8,75,34,41,55,166,163),
+(1,8,76,34,41,56,169,166),
+(1,8,77,35,42,57,172,169),
+(1,8,78,35,42,57,175,173),
+(1,8,79,35,43,58,178,176),
+(1,8,80,36,43,59,181,179),
+
+(1,9,1,20,20,21,22,22),
+(1,9,2,20,20,22,23,23),
+(1,9,3,21,21,22,24,24),
+(1,9,4,21,21,23,26,25),
+(1,9,5,21,21,23,27,27),
+(1,9,6,21,22,24,28,28),
+(1,9,7,22,22,24,29,29),
+(1,9,8,22,23,25,30,30),
+(1,9,9,22,23,26,32,31),
+(1,9,10,23,23,26,33,33),
+(1,9,11,23,24,27,34,34),
+(1,9,12,23,24,27,35,35),
+(1,9,13,24,25,28,37,36),
+(1,9,14,24,25,29,38,38),
+(1,9,15,24,25,29,39,39),
+(1,9,16,25,26,30,41,40),
+(1,9,17,25,26,31,42,42),
+(1,9,18,25,27,31,43,43),
+(1,9,19,26,27,32,45,44),
+(1,9,20,26,28,33,46,46),
+(1,9,21,26,28,33,48,47),
+(1,9,22,27,29,34,49,49),
+(1,9,23,27,29,35,51,50),
+(1,9,24,28,30,35,52,51),
+(1,9,25,28,30,36,53,53),
+(1,9,26,28,31,37,55,54),
+(1,9,27,29,31,37,56,56),
+(1,9,28,29,32,38,58,57),
+(1,9,29,30,32,39,59,59),
+(1,9,30,30,33,40,61,60),
+(1,9,31,30,33,40,62,62),
+(1,9,32,31,34,41,64,63),
+(1,9,33,31,34,42,66,65),
+(1,9,34,32,35,43,67,66),
+(1,9,35,32,35,44,69,68),
+(1,9,36,33,36,44,70,69),
+(1,9,37,33,36,45,72,71),
+(1,9,38,34,37,46,74,73),
+(1,9,39,34,38,47,75,74),
+(1,9,40,35,38,48,77,76),
+(1,9,41,35,39,48,79,78),
+(1,9,42,35,39,49,80,79),
+(1,9,43,36,40,50,82,81),
+(1,9,44,36,40,51,84,83),
+(1,9,45,37,41,52,85,84),
+(1,9,46,37,42,53,87,86),
+(1,9,47,38,42,54,89,88),
+(1,9,48,38,43,55,91,89),
+(1,9,49,39,44,55,93,91),
+(1,9,50,40,44,56,94,93),
+(1,9,51,40,45,57,96,95),
+(1,9,52,41,45,58,98,97),
+(1,9,53,41,46,59,100,98),
+(1,9,54,42,47,60,102,100),
+(1,9,55,42,47,61,103,102),
+(1,9,56,43,48,62,105,104),
+(1,9,57,43,49,63,107,106),
+(1,9,58,44,49,64,109,108),
+(1,9,59,44,50,65,111,109),
+(1,9,60,45,51,66,113,111),
+(1,9,61,46,51,67,115,113),
+(1,9,62,46,52,68,117,115),
+(1,9,63,47,53,69,119,117),
+(1,9,64,47,54,70,121,119),
+(1,9,65,48,54,71,123,121),
+(1,9,66,49,55,72,125,123),
+(1,9,67,49,56,73,127,125),
+(1,9,68,50,57,74,129,127),
+(1,9,69,50,57,75,131,129),
+(1,9,70,51,58,76,133,131),
+(1,9,71,52,59,78,135,146),
+(1,9,72,53,59,79,138,148),
+(1,9,73,54,60,80,140,151),
+(1,9,74,54,61,89,143,154),
+(1,9,75,55,62,91,145,156),
+(1,9,76,56,63,92,148,159),
+(1,9,77,57,64,93,151,162),
+(1,9,78,57,65,95,153,165),
+(1,9,79,58,66,96,156,168),
+(1,9,80,59,67,97,159,170),
+
+(2,1,1,26,17,24,17,23),
+(2,1,2,27,18,25,17,23),
+(2,1,3,29,19,26,17,24),
+(2,1,4,30,19,27,17,24),
+(2,1,5,31,20,29,17,24),
+(2,1,6,32,21,30,17,24),
+(2,1,7,34,22,31,18,25),
+(2,1,8,35,23,32,18,25),
+(2,1,9,37,24,34,18,25),
+(2,1,10,38,24,35,18,26),
+(2,1,11,39,25,36,18,26),
+(2,1,12,41,26,37,18,26),
+(2,1,13,42,27,39,18,27),
+(2,1,14,44,28,40,18,27),
+(2,1,15,45,29,41,18,27),
+(2,1,16,47,30,43,19,28),
+(2,1,17,48,31,44,19,28),
+(2,1,18,50,32,45,19,28),
+(2,1,19,51,33,47,19,29),
+(2,1,20,53,34,48,19,29),
+(2,1,21,54,34,50,19,29),
+(2,1,22,56,35,51,19,30),
+(2,1,23,57,36,52,20,30),
+(2,1,24,59,37,54,20,30),
+(2,1,25,60,38,55,20,31),
+(2,1,26,62,39,57,20,31),
+(2,1,27,64,40,58,20,32),
+(2,1,28,65,41,60,20,32),
+(2,1,29,67,43,61,21,32),
+(2,1,30,69,44,63,21,33),
+(2,1,31,70,45,64,21,33),
+(2,1,32,72,46,66,21,34),
+(2,1,33,74,47,67,21,34),
+(2,1,34,76,48,69,21,35),
+(2,1,35,77,49,71,22,35),
+(2,1,36,79,50,72,22,36),
+(2,1,37,81,51,74,22,36),
+(2,1,38,83,52,76,22,36),
+(2,1,39,84,53,77,22,37),
+(2,1,40,86,55,79,23,37),
+(2,1,41,88,56,81,23,38),
+(2,1,42,90,57,82,23,38),
+(2,1,43,92,58,84,23,39),
+(2,1,44,94,59,86,23,39),
+(2,1,45,96,60,87,24,40),
+(2,1,46,98,62,89,24,40),
+(2,1,47,100,63,91,24,41),
+(2,1,48,101,64,93,24,41),
+(2,1,49,103,65,94,25,42),
+(2,1,50,105,66,96,25,42),
+(2,1,51,107,68,98,25,43),
+(2,1,52,109,69,100,25,43),
+(2,1,53,111,70,102,25,44),
+(2,1,54,113,71,104,26,45),
+(2,1,55,115,73,105,26,45),
+(2,1,56,118,74,107,26,46),
+(2,1,57,120,75,109,26,46),
+(2,1,58,122,77,111,27,47),
+(2,1,59,124,78,113,27,47),
+(2,1,60,126,79,115,27,48),
+(2,1,61,128,81,117,27,48),
+(2,1,62,130,82,119,28,49),
+(2,1,63,132,83,121,28,50),
+(2,1,64,135,85,123,28,50),
+(2,1,65,137,86,125,29,51),
+(2,1,66,139,87,127,29,52),
+(2,1,67,141,89,129,29,52),
+(2,1,68,143,90,131,29,53),
+(2,1,69,146,92,133,30,53),
+(2,1,70,148,93,135,30,54),
+(2,1,71,157,94,142,30,55),
+(2,1,72,162,96,148,30,56),
+(2,1,73,165,98,150,30,57),
+(2,1,74,168,99,153,31,57),
+(2,1,75,170,101,154,31,58),
+(2,1,76,172,103,156,31,59),
+(2,1,77,174,105,159,32,60),
+(2,1,78,179,106,162,32,60),
+(2,1,79,184,108,167,32,61),
+(2,1,80,187,110,170,33,62),
+
+(2,3,1,23,20,23,17,24),
+(2,3,2,23,21,24,18,25),
+(2,3,3,24,23,25,18,25),
+(2,3,4,24,24,26,19,26),
+(2,3,5,25,25,27,19,26),
+(2,3,6,25,27,28,20,27),
+(2,3,7,26,28,28,21,28),
+(2,3,8,26,30,29,21,28),
+(2,3,9,26,31,30,22,29),
+(2,3,10,27,33,31,22,30),
+(2,3,11,27,34,32,23,30),
+(2,3,12,28,36,33,24,31),
+(2,3,13,28,37,34,24,32),
+(2,3,14,29,39,35,25,33),
+(2,3,15,29,40,36,26,33),
+(2,3,16,30,42,37,26,34),
+(2,3,17,30,43,39,27,35),
+(2,3,18,31,45,40,28,35),
+(2,3,19,31,47,41,28,36),
+(2,3,20,32,48,42,29,37),
+(2,3,21,32,50,43,30,38),
+(2,3,22,33,51,44,31,39),
+(2,3,23,34,53,45,31,39),
+(2,3,24,34,55,46,32,40),
+(2,3,25,35,57,47,33,41),
+(2,3,26,35,58,48,34,42),
+(2,3,27,36,60,50,34,43),
+(2,3,28,36,62,51,35,43),
+(2,3,29,37,63,52,36,44),
+(2,3,30,38,65,53,37,45),
+(2,3,31,38,67,54,37,46),
+(2,3,32,39,69,56,38,47),
+(2,3,33,39,71,57,39,48),
+(2,3,34,40,72,58,40,49),
+(2,3,35,41,74,59,41,49),
+(2,3,36,41,76,61,42,50),
+(2,3,37,42,78,62,42,51),
+(2,3,38,43,80,63,43,52),
+(2,3,39,43,82,64,44,53),
+(2,3,40,44,84,66,45,54),
+(2,3,41,45,86,67,46,55),
+(2,3,42,45,88,68,47,56),
+(2,3,43,46,90,70,47,57),
+(2,3,44,47,91,71,48,58),
+(2,3,45,47,93,72,49,59),
+(2,3,46,48,95,74,50,60),
+(2,3,47,49,98,75,51,61),
+(2,3,48,50,100,77,52,62),
+(2,3,49,50,102,78,53,63),
+(2,3,50,51,104,79,54,64),
+(2,3,51,52,106,81,55,65),
+(2,3,52,52,108,82,56,66),
+(2,3,53,53,110,84,57,67),
+(2,3,54,54,112,85,58,68),
+(2,3,55,55,114,87,59,69),
+(2,3,56,55,116,88,60,70),
+(2,3,57,56,118,90,61,71),
+(2,3,58,57,121,91,62,72),
+(2,3,59,58,123,93,63,73),
+(2,3,60,59,125,94,64,74),
+(2,3,61,59,127,96,65,76),
+(2,3,62,60,130,97,66,77),
+(2,3,63,61,132,99,67,78),
+(2,3,64,62,134,100,68,79),
+(2,3,65,63,136,102,69,80),
+(2,3,66,64,139,104,70,81),
+(2,3,67,64,141,105,71,82),
+(2,3,68,65,143,107,72,84),
+(2,3,69,66,146,108,73,85),
+(2,3,70,67,148,110,74,86),
+(2,3,71,68,151,112,75,87),
+(2,3,72,69,154,114,76,88),
+(2,3,73,70,157,116,77,90),
+(2,3,74,71,160,118,79,91),
+(2,3,75,72,163,120,80,93),
+(2,3,76,73,166,122,81,94),
+(2,3,77,74,169,124,83,96),
+(2,3,78,75,172,126,84,97),
+(2,3,79,76,175,128,85,99),
+(2,3,80,77,178,130,87,100),
+
+(2,4,1,24,20,23,17,23),
+(2,4,2,25,21,24,17,23),
+(2,4,3,25,23,24,17,24),
+(2,4,4,26,24,25,17,24),
+(2,4,5,27,26,26,18,24),
+(2,4,6,28,27,26,18,25),
+(2,4,7,29,29,27,18,25),
+(2,4,8,29,30,28,18,26),
+(2,4,9,30,32,29,18,26),
+(2,4,10,31,33,29,19,26),
+(2,4,11,32,35,30,19,27),
+(2,4,12,33,37,31,19,27),
+(2,4,13,34,38,32,19,28),
+(2,4,14,34,40,32,19,28),
+(2,4,15,35,41,33,19,28),
+(2,4,16,36,43,34,20,29),
+(2,4,17,37,45,35,20,29),
+(2,4,18,38,46,36,20,30),
+(2,4,19,39,48,37,20,30),
+(2,4,20,40,50,37,21,31),
+(2,4,21,41,52,38,21,31),
+(2,4,22,42,53,39,21,31),
+(2,4,23,43,55,40,21,32),
+(2,4,24,43,57,41,21,32),
+(2,4,25,44,59,42,22,33),
+(2,4,26,45,60,43,22,33),
+(2,4,27,46,62,44,22,34),
+(2,4,28,47,64,44,22,34),
+(2,4,29,48,66,45,23,35),
+(2,4,30,49,68,46,23,35),
+(2,4,31,50,70,47,23,36),
+(2,4,32,51,72,48,23,36),
+(2,4,33,53,73,49,24,37),
+(2,4,34,54,75,50,24,38),
+(2,4,35,55,77,51,24,38),
+(2,4,36,56,79,52,24,39),
+(2,4,37,57,81,53,25,39),
+(2,4,38,58,83,54,25,40),
+(2,4,39,59,85,55,25,40),
+(2,4,40,60,87,56,26,41),
+(2,4,41,61,89,57,26,41),
+(2,4,42,62,91,58,26,42),
+(2,4,43,63,93,59,27,43),
+(2,4,44,65,95,60,27,43),
+(2,4,45,66,98,61,27,44),
+(2,4,46,67,100,62,27,44),
+(2,4,47,68,102,64,28,45),
+(2,4,48,69,104,65,28,46),
+(2,4,49,71,106,66,28,46),
+(2,4,50,72,108,67,29,47),
+(2,4,51,73,110,68,29,48),
+(2,4,52,74,113,69,29,48),
+(2,4,53,75,115,70,30,49),
+(2,4,54,77,117,71,30,50),
+(2,4,55,78,119,73,30,50),
+(2,4,56,79,122,74,31,51),
+(2,4,57,80,124,75,31,52),
+(2,4,58,82,126,76,31,52),
+(2,4,59,83,129,77,32,53),
+(2,4,60,84,131,78,32,54),
+(2,4,61,86,133,80,33,54),
+(2,4,62,87,136,81,33,55),
+(2,4,63,88,138,82,33,56),
+(2,4,64,90,140,83,34,57),
+(2,4,65,91,143,85,34,57),
+(2,4,66,92,145,86,34,58),
+(2,4,67,94,148,87,35,59),
+(2,4,68,95,150,88,35,59),
+(2,4,69,97,153,90,36,60),
+(2,4,70,98,155,91,36,61),
+(2,4,71,100,158,92,36,62),
+(2,4,72,102,161,94,37,62),
+(2,4,73,103,164,99,37,63),
+(2,4,74,105,167,100,38,64),
+(2,4,75,107,170,102,38,65),
+(2,4,76,108,173,102,38,66),
+(2,4,77,110,176,102,39,67),
+(2,4,78,112,180,103,39,68),
+(2,4,79,114,183,105,40,69),
+(2,4,80,116,186,107,40,70),
+
+(2,6,1,26,17,24,17,23),
+(2,6,2,27,18,25,17,23),
+(2,6,3,29,19,26,17,24),
+(2,6,4,30,19,27,17,24),
+(2,6,5,31,20,29,17,24),
+(2,6,6,32,21,30,17,24),
+(2,6,7,34,22,31,18,25),
+(2,6,8,35,23,32,18,25),
+(2,6,9,37,24,34,18,25),
+(2,6,10,38,24,35,18,26),
+(2,6,11,39,25,36,18,26),
+(2,6,12,41,26,37,18,26),
+(2,6,13,42,27,39,18,27),
+(2,6,14,44,28,40,18,27),
+(2,6,15,45,29,41,18,27),
+(2,6,16,47,30,43,19,28),
+(2,6,17,48,31,44,19,28),
+(2,6,18,50,32,45,19,28),
+(2,6,19,51,33,47,19,29),
+(2,6,20,53,34,48,19,29),
+(2,6,21,54,34,50,19,29),
+(2,6,22,56,35,51,19,30),
+(2,6,23,57,36,52,20,30),
+(2,6,24,59,37,54,20,30),
+(2,6,25,60,38,55,20,31),
+(2,6,26,62,39,57,20,31),
+(2,6,27,64,40,58,20,32),
+(2,6,28,65,41,60,20,32),
+(2,6,29,67,43,61,21,32),
+(2,6,30,69,44,63,21,33),
+(2,6,31,70,45,64,21,33),
+(2,6,32,72,46,66,21,34),
+(2,6,33,74,47,67,21,34),
+(2,6,34,76,48,69,21,35),
+(2,6,35,77,49,71,22,35),
+(2,6,36,79,50,72,22,36),
+(2,6,37,81,51,74,22,36),
+(2,6,38,83,52,76,22,36),
+(2,6,39,84,53,77,22,37),
+(2,6,40,86,55,79,23,37),
+(2,6,41,88,56,81,23,38),
+(2,6,42,90,57,82,23,38),
+(2,6,43,92,58,84,23,39),
+(2,6,44,94,59,86,23,39),
+(2,6,45,96,60,87,24,40),
+(2,6,46,98,62,89,24,40),
+(2,6,47,100,63,91,24,41),
+(2,6,48,101,64,93,24,41),
+(2,6,49,103,65,94,25,42),
+(2,6,50,105,66,96,25,42),
+(2,6,51,107,68,98,25,43),
+(2,6,52,109,69,100,25,43),
+(2,6,53,110,69,100,25,44),
+(2,6,54,111,70,101,26,45),
+(2,6,55,111,70,101,26,45),
+(2,6,56,114,72,104,26,46),
+(2,6,57,116,73,106,26,46),
+(2,6,58,118,74,108,27,47),
+(2,6,59,124,76,110,27,47),
+(2,6,60,126,77,112,27,48),
+(2,6,61,128,78,114,27,49),
+(2,6,62,131,80,116,27,49),
+(2,6,63,133,81,119,28,50),
+(2,6,64,136,83,121,28,50),
+(2,6,65,136,84,123,28,51),
+(2,6,66,142,86,126,28,52),
+(2,6,67,145,87,128,29,52),
+(2,6,68,147,89,130,29,53),
+(2,6,69,150,90,133,29,54),
+(2,6,70,157,92,135,29,54),
+(2,6,71,160,94,138,30,55),
+(2,6,72,163,95,140,30,56),
+(2,6,73,166,97,151,30,57),
+(2,6,74,169,99,154,30,57),
+(2,6,75,172,100,156,31,58),
+(2,6,76,175,102,160,31,59),
+(2,6,77,179,104,162,31,60),
+(2,6,78,182,105,165,31,60),
+(2,6,79,191,107,168,32,61),
+(2,6,80,194,109,171,32,62),
+
+(2,7,1,24,17,23,18,25),
+(2,7,2,25,17,24,19,26),
+(2,7,3,26,18,25,20,27),
+(2,7,4,26,18,26,21,28),
+(2,7,5,27,19,27,22,29),
+(2,7,6,28,19,28,23,30),
+(2,7,7,29,20,29,24,31),
+(2,7,8,30,20,30,25,32),
+(2,7,9,31,21,31,26,33),
+(2,7,10,32,21,32,27,34),
+(2,7,11,33,22,33,28,36),
+(2,7,12,34,22,34,29,37),
+(2,7,13,34,23,35,30,38),
+(2,7,14,35,23,36,31,39),
+(2,7,15,36,24,37,32,40),
+(2,7,16,37,24,39,33,41),
+(2,7,17,38,25,40,34,43),
+(2,7,18,39,25,41,35,44),
+(2,7,19,40,26,42,36,45),
+(2,7,20,41,26,43,37,46),
+(2,7,21,42,27,44,38,47),
+(2,7,22,43,27,45,39,49),
+(2,7,23,44,28,47,40,50),
+(2,7,24,45,28,48,41,51),
+(2,7,25,47,29,49,43,52),
+(2,7,26,48,30,50,44,54),
+(2,7,27,49,30,52,45,55),
+(2,7,28,50,31,53,46,56),
+(2,7,29,51,31,54,47,58),
+(2,7,30,52,32,55,48,59),
+(2,7,31,53,33,57,50,60),
+(2,7,32,54,33,58,51,62),
+(2,7,33,55,34,59,52,63),
+(2,7,34,57,34,61,53,65),
+(2,7,35,58,35,62,55,66),
+(2,7,36,59,36,63,56,67),
+(2,7,37,60,36,65,57,69),
+(2,7,38,61,37,66,58,70),
+(2,7,39,62,38,67,60,72),
+(2,7,40,64,38,69,61,73),
+(2,7,41,65,39,70,62,75),
+(2,7,42,66,40,72,64,76),
+(2,7,43,67,40,73,65,78),
+(2,7,44,69,41,74,66,79),
+(2,7,45,70,42,76,68,81),
+(2,7,46,71,42,77,69,82),
+(2,7,47,72,43,79,70,84),
+(2,7,48,74,44,80,72,85),
+(2,7,49,75,45,82,73,87),
+(2,7,50,76,45,83,75,89),
+(2,7,51,78,46,85,76,90),
+(2,7,52,79,47,86,77,92),
+(2,7,53,80,47,88,79,93),
+(2,7,54,82,48,90,80,95),
+(2,7,55,83,49,91,82,97),
+(2,7,56,85,50,93,83,98),
+(2,7,57,86,50,94,85,100),
+(2,7,58,87,51,96,86,102),
+(2,7,59,89,52,97,88,103),
+(2,7,60,90,53,99,89,105),
+(2,7,61,92,54,101,91,107),
+(2,7,62,93,54,102,92,109),
+(2,7,63,95,55,104,94,110),
+(2,7,64,96,56,106,95,112),
+(2,7,65,97,57,107,97,114),
+(2,7,66,99,58,109,99,116),
+(2,7,67,100,58,111,100,118),
+(2,7,68,102,59,113,102,119),
+(2,7,69,103,60,114,103,121),
+(2,7,70,105,61,116,105,123),
+(2,7,71,106,62,118,117,125),
+(2,7,72,108,63,120,119,128),
+(2,7,73,110,64,122,122,130),
+(2,7,74,112,65,125,124,132),
+(2,7,75,114,66,127,126,134),
+(2,7,76,116,67,129,128,137),
+(2,7,77,117,68,131,128,139),
+(2,7,78,119,69,133,133,141),
+(2,7,79,121,70,136,135,144),
+(2,7,80,123,71,138,137,146),
+
+(2,9,1,23,17,23,19,25),
+(2,9,2,23,17,24,20,26),
+(2,9,3,24,18,24,21,27),
+(2,9,4,24,18,25,23,28),
+(2,9,5,24,18,25,24,30),
+(2,9,6,24,19,26,25,31),
+(2,9,7,25,19,26,26,32),
+(2,9,8,25,20,27,27,33),
+(2,9,9,25,20,27,29,34),
+(2,9,10,26,20,28,30,36),
+(2,9,11,26,21,29,31,37),
+(2,9,12,26,21,29,33,38),
+(2,9,13,27,22,30,34,39),
+(2,9,14,27,22,31,35,41),
+(2,9,15,27,23,31,37,42),
+(2,9,16,28,23,32,38,43),
+(2,9,17,28,23,32,39,45),
+(2,9,18,28,24,33,41,46),
+(2,9,19,29,24,34,42,47),
+(2,9,20,29,25,34,43,49),
+(2,9,21,29,25,35,45,50),
+(2,9,22,30,26,36,46,51),
+(2,9,23,30,26,37,48,53),
+(2,9,24,30,27,37,49,54),
+(2,9,25,31,27,38,51,56),
+(2,9,26,31,28,39,52,57),
+(2,9,27,32,28,39,54,59),
+(2,9,28,32,29,40,55,60),
+(2,9,29,32,29,41,57,62),
+(2,9,30,33,30,42,58,63),
+(2,9,31,33,30,42,60,65),
+(2,9,32,34,31,43,61,66),
+(2,9,33,34,31,44,63,68),
+(2,9,34,35,32,45,64,69),
+(2,9,35,35,32,45,66,71),
+(2,9,36,36,33,46,68,72),
+(2,9,37,36,34,47,69,74),
+(2,9,38,36,34,48,71,76),
+(2,9,39,37,35,49,72,77),
+(2,9,40,37,35,50,74,79),
+(2,9,41,38,36,50,76,80),
+(2,9,42,38,36,51,77,82),
+(2,9,43,39,37,52,79,84),
+(2,9,44,39,38,53,81,85),
+(2,9,45,40,38,54,83,87),
+(2,9,46,40,39,55,84,89),
+(2,9,47,41,39,56,86,91),
+(2,9,48,41,40,56,88,92),
+(2,9,49,42,41,57,90,94),
+(2,9,50,42,41,58,91,96),
+(2,9,51,43,42,59,93,98),
+(2,9,52,43,43,60,95,99),
+(2,9,53,44,43,61,97,101),
+(2,9,54,45,44,62,99,103),
+(2,9,55,45,45,63,101,105),
+(2,9,56,46,45,64,102,107),
+(2,9,57,46,46,65,104,109),
+(2,9,58,47,47,66,106,110),
+(2,9,59,47,47,67,108,112),
+(2,9,60,48,48,68,110,114),
+(2,9,61,48,49,69,112,116),
+(2,9,62,49,49,70,114,118),
+(2,9,63,50,50,71,116,120),
+(2,9,64,50,51,72,118,122),
+(2,9,65,51,51,73,120,124),
+(2,9,66,52,52,74,122,126),
+(2,9,67,52,53,75,124,128),
+(2,9,68,53,54,76,126,130),
+(2,9,69,53,54,77,128,132),
+(2,9,70,54,55,78,130,134),
+(2,9,71,55,56,88,134,145),
+(2,9,72,56,56,89,135,147),
+(2,9,73,57,57,90,137,150),
+(2,9,74,57,58,91,142,153),
+(2,9,75,58,59,93,142,155),
+(2,9,76,59,60,94,145,158),
+(2,9,77,60,61,95,148,161),
+(2,9,78,60,62,97,150,164),
+(2,9,79,61,63,98,153,167),
+(2,9,80,62,64,99,156,169),
+
+(3,1,1,25,16,25,19,19),
+(3,1,2,26,17,26,19,19),
+(3,1,3,28,18,27,19,20),
+(3,1,4,29,18,28,19,20),
+(3,1,5,30,19,30,19,20),
+(3,1,6,31,20,31,19,20),
+(3,1,7,33,21,32,20,21),
+(3,1,8,34,22,33,20,21),
+(3,1,9,36,23,35,20,21),
+(3,1,10,37,23,36,20,22),
+(3,1,11,38,24,37,20,22),
+(3,1,12,40,25,38,20,22),
+(3,1,13,41,26,40,20,23),
+(3,1,14,43,27,41,20,23),
+(3,1,15,44,28,42,20,23),
+(3,1,16,46,29,44,21,24),
+(3,1,17,47,30,45,21,24),
+(3,1,18,49,31,46,21,24),
+(3,1,19,50,32,48,21,25),
+(3,1,20,52,33,49,21,25),
+(3,1,21,53,34,51,21,26),
+(3,1,22,55,34,52,21,26),
+(3,1,23,56,35,53,21,26),
+(3,1,24,58,36,55,22,27),
+(3,1,25,59,37,56,22,27),
+(3,1,26,61,38,58,22,27),
+(3,1,27,63,39,59,22,28),
+(3,1,28,64,41,61,22,28),
+(3,1,29,66,42,62,22,29),
+(3,1,30,68,43,64,23,29),
+(3,1,31,69,44,65,23,30),
+(3,1,32,71,45,67,23,30),
+(3,1,33,73,46,68,23,30),
+(3,1,34,75,47,70,23,31),
+(3,1,35,76,48,72,24,31),
+(3,1,36,78,49,73,24,32),
+(3,1,37,80,50,75,24,32),
+(3,1,38,82,51,76,24,33),
+(3,1,39,84,52,78,24,33),
+(3,1,40,85,54,80,24,34),
+(3,1,41,87,55,81,25,34),
+(3,1,42,89,56,83,25,35),
+(3,1,43,91,57,85,25,35),
+(3,1,44,93,58,87,25,36),
+(3,1,45,95,59,88,26,36),
+(3,1,46,97,61,90,26,37),
+(3,1,47,99,62,92,26,37),
+(3,1,48,101,63,94,26,38),
+(3,1,49,102,64,95,26,38),
+(3,1,50,104,65,97,27,39),
+(3,1,51,106,67,99,27,39),
+(3,1,52,108,68,101,27,40),
+(3,1,53,110,69,103,27,40),
+(3,1,54,112,70,104,28,41),
+(3,1,55,115,72,106,28,41),
+(3,1,56,117,73,108,28,42),
+(3,1,57,119,74,110,28,42),
+(3,1,58,121,76,112,29,43),
+(3,1,59,123,77,114,29,43),
+(3,1,60,125,78,116,29,44),
+(3,1,61,127,80,118,29,45),
+(3,1,62,129,81,120,30,45),
+(3,1,63,131,82,122,30,46),
+(3,1,64,134,84,124,30,46),
+(3,1,65,136,85,126,31,47),
+(3,1,66,138,86,128,31,48),
+(3,1,67,140,88,130,31,48),
+(3,1,68,142,89,132,31,49),
+(3,1,69,145,91,134,32,49),
+(3,1,70,147,92,136,32,50),
+(3,1,71,150,93,138,32,51),
+(3,1,72,152,95,141,32,52),
+(3,1,73,164,97,151,32,53),
+(3,1,74,164,98,151,33,53),
+(3,1,75,170,100,156,33,54),
+(3,1,76,173,102,160,33,55),
+(3,1,77,173,104,160,34,56),
+(3,1,78,176,105,162,34,56),
+(3,1,79,183,107,168,34,57),
+(3,1,80,186,109,171,35,58),
+
+(3,2,1,24,16,25,19,20),
+(3,2,2,25,17,26,20,21),
+(3,2,3,26,17,27,20,21),
+(3,2,4,27,18,28,21,22),
+(3,2,5,28,18,29,22,23),
+(3,2,6,29,19,30,22,24),
+(3,2,7,31,20,31,23,24),
+(3,2,8,32,20,32,24,25),
+(3,2,9,33,21,33,24,26),
+(3,2,10,34,21,34,25,26),
+(3,2,11,35,22,36,26,27),
+(3,2,12,36,23,37,26,28),
+(3,2,13,38,23,38,27,29),
+(3,2,14,39,24,39,28,30),
+(3,2,15,40,25,40,29,30),
+(3,2,16,41,25,41,29,31),
+(3,2,17,43,26,43,30,32),
+(3,2,18,44,27,44,31,33),
+(3,2,19,45,28,45,32,34),
+(3,2,20,47,28,46,32,35),
+(3,2,21,48,29,47,33,35),
+(3,2,22,49,30,49,34,36),
+(3,2,23,51,30,50,35,37),
+(3,2,24,52,31,51,36,38),
+(3,2,25,53,32,52,36,39),
+(3,2,26,55,33,54,37,40),
+(3,2,27,56,33,55,38,41),
+(3,2,28,57,34,56,39,42),
+(3,2,29,59,35,58,40,43),
+(3,2,30,60,36,59,41,43),
+(3,2,31,62,37,60,42,44),
+(3,2,32,63,37,62,42,45),
+(3,2,33,65,38,63,43,46),
+(3,2,34,66,39,65,44,47),
+(3,2,35,68,40,66,45,48),
+(3,2,36,69,41,67,46,49),
+(3,2,37,71,41,69,47,50),
+(3,2,38,72,42,70,48,51),
+(3,2,39,74,43,72,49,52),
+(3,2,40,75,44,73,50,53),
+(3,2,41,77,45,75,51,54),
+(3,2,42,78,46,76,52,55),
+(3,2,43,80,47,78,53,56),
+(3,2,44,82,47,79,54,57),
+(3,2,45,83,48,81,55,59),
+(3,2,46,85,49,82,56,60),
+(3,2,47,87,50,84,57,61),
+(3,2,48,88,51,85,58,62),
+(3,2,49,90,52,87,59,63),
+(3,2,50,92,53,89,60,64),
+(3,2,51,93,54,90,61,65),
+(3,2,52,95,55,92,62,66),
+(3,2,53,97,56,93,63,67),
+(3,2,54,98,57,95,64,69),
+(3,2,55,100,58,97,65,70),
+(3,2,56,102,59,98,66,71),
+(3,2,57,104,60,100,67,72),
+(3,2,58,106,61,102,68,73),
+(3,2,59,107,62,103,69,74),
+(3,2,60,109,63,105,70,76),
+(3,2,61,111,64,107,72,77),
+(3,2,62,113,65,109,73,78),
+(3,2,63,115,66,110,74,79),
+(3,2,64,117,67,112,75,80),
+(3,2,65,118,68,114,76,82),
+(3,2,66,120,69,116,77,83),
+(3,2,67,122,70,118,78,84),
+(3,2,68,124,71,119,80,85),
+(3,2,69,126,72,121,81,87),
+(3,2,70,128,73,123,82,88),
+(3,2,71,150,74,125,83,89),
+(3,2,72,152,75,128,85,91),
+(3,2,73,156,76,130,86,93),
+(3,2,74,158,78,132,88,94),
+(3,2,75,161,79,134,89,96),
+(3,2,76,164,80,137,91,97),
+(3,2,77,166,82,139,92,99),
+(3,2,78,170,83,141,94,101),
+(3,2,79,172,84,144,95,102),
+(3,2,80,175,86,146,97,104),
+
+(3,3,1,22,19,24,19,20),
+(3,3,2,22,20,25,20,21),
+(3,3,3,23,22,26,20,21),
+(3,3,4,23,23,27,21,22),
+(3,3,5,24,25,28,21,23),
+(3,3,6,24,26,29,22,23),
+(3,3,7,25,27,29,23,24),
+(3,3,8,25,29,30,23,25),
+(3,3,9,25,30,31,24,25),
+(3,3,10,26,32,32,24,26),
+(3,3,11,26,33,33,25,27),
+(3,3,12,27,35,34,26,27),
+(3,3,13,27,36,35,26,28),
+(3,3,14,28,38,36,27,29),
+(3,3,15,28,39,37,28,29),
+(3,3,16,29,41,38,28,30),
+(3,3,17,29,42,39,29,31),
+(3,3,18,30,44,41,30,32),
+(3,3,19,30,46,42,30,32),
+(3,3,20,31,47,43,31,33),
+(3,3,21,32,49,44,32,34),
+(3,3,22,32,51,45,33,35),
+(3,3,23,33,52,46,33,36),
+(3,3,24,33,54,47,34,36),
+(3,3,25,34,56,48,35,37),
+(3,3,26,34,57,49,35,38),
+(3,3,27,35,59,51,36,39),
+(3,3,28,35,61,52,37,40),
+(3,3,29,36,63,53,38,40),
+(3,3,30,37,64,54,39,41),
+(3,3,31,37,66,55,39,42),
+(3,3,32,38,68,57,40,43),
+(3,3,33,38,70,58,41,44),
+(3,3,34,39,71,59,42,45),
+(3,3,35,40,73,60,43,46),
+(3,3,36,40,75,62,43,47),
+(3,3,37,41,77,63,44,47),
+(3,3,38,42,79,64,45,48),
+(3,3,39,42,81,65,46,49),
+(3,3,40,43,83,67,47,50),
+(3,3,41,44,85,68,48,51),
+(3,3,42,44,87,69,49,52),
+(3,3,43,45,89,71,49,53),
+(3,3,44,46,91,72,50,54),
+(3,3,45,46,93,73,51,55),
+(3,3,46,47,95,75,52,56),
+(3,3,47,48,97,76,53,57),
+(3,3,48,49,99,78,54,58),
+(3,3,49,49,101,79,55,59),
+(3,3,50,50,103,80,56,60),
+(3,3,51,51,105,82,57,61),
+(3,3,52,51,107,83,58,62),
+(3,3,53,52,109,85,59,63),
+(3,3,54,53,111,86,60,64),
+(3,3,55,54,113,88,61,65),
+(3,3,56,55,115,89,62,66),
+(3,3,57,55,118,91,62,67),
+(3,3,58,56,120,92,63,68),
+(3,3,59,57,122,94,64,70),
+(3,3,60,58,124,95,65,71),
+(3,3,61,58,126,97,67,72),
+(3,3,62,59,129,98,68,73),
+(3,3,63,60,131,100,69,74),
+(3,3,64,61,133,101,70,75),
+(3,3,65,62,135,103,71,76),
+(3,3,66,63,138,105,72,77),
+(3,3,67,63,140,106,73,78),
+(3,3,68,64,142,108,74,80),
+(3,3,69,65,145,109,75,81),
+(3,3,70,66,147,111,76,82),
+(3,3,71,67,150,113,77,83),
+(3,3,72,68,153,115,78,84),
+(3,3,73,69,156,117,79,86),
+(3,3,74,70,159,119,81,87),
+(3,3,75,71,162,121,82,89),
+(3,3,76,72,165,123,83,90),
+(3,3,77,73,168,125,85,92),
+(3,3,78,74,171,127,86,93),
+(3,3,79,75,174,129,87,95),
+(3,3,80,76,177,131,89,96),
+
+(3,4,1,23,19,24,19,19),
+(3,4,2,24,20,25,19,19),
+(3,4,3,24,22,25,19,20),
+(3,4,4,25,23,26,19,20),
+(3,4,5,26,25,27,20,20),
+(3,4,6,27,26,27,20,21),
+(3,4,7,28,28,28,20,21),
+(3,4,8,28,29,29,20,22),
+(3,4,9,29,31,30,20,22),
+(3,4,10,30,32,30,20,22),
+(3,4,11,31,34,31,21,23),
+(3,4,12,32,36,32,21,23),
+(3,4,13,33,37,33,21,24),
+(3,4,14,33,39,33,21,24),
+(3,4,15,34,40,34,21,25),
+(3,4,16,35,42,35,22,25),
+(3,4,17,36,44,36,22,25),
+(3,4,18,37,45,37,22,26),
+(3,4,19,38,47,38,22,26),
+(3,4,20,39,49,38,22,27),
+(3,4,21,40,51,39,23,27),
+(3,4,22,41,52,40,23,28),
+(3,4,23,42,54,41,23,28),
+(3,4,24,43,56,42,23,29),
+(3,4,25,44,58,43,24,29),
+(3,4,26,44,59,44,24,30),
+(3,4,27,45,61,44,24,30),
+(3,4,28,46,63,45,24,31),
+(3,4,29,47,65,46,25,31),
+(3,4,30,48,67,47,25,32),
+(3,4,31,49,69,48,25,32),
+(3,4,32,51,71,49,25,33),
+(3,4,33,52,72,50,26,33),
+(3,4,34,53,74,51,26,34),
+(3,4,35,54,76,52,26,34),
+(3,4,36,55,78,53,26,35),
+(3,4,37,56,80,54,27,35),
+(3,4,38,57,82,55,27,36),
+(3,4,39,58,84,56,27,37),
+(3,4,40,59,86,57,28,37),
+(3,4,41,60,88,58,28,38),
+(3,4,42,61,90,59,28,38),
+(3,4,43,63,92,60,28,39),
+(3,4,44,64,95,61,29,39),
+(3,4,45,65,97,62,29,40),
+(3,4,46,66,99,63,29,41),
+(3,4,47,67,101,64,30,41),
+(3,4,48,68,103,66,30,42),
+(3,4,49,70,105,67,30,43),
+(3,4,50,71,107,68,31,43),
+(3,4,51,72,110,69,31,44),
+(3,4,52,73,112,70,31,44),
+(3,4,53,74,114,71,32,45),
+(3,4,54,76,116,72,32,46),
+(3,4,55,77,118,73,32,46),
+(3,4,56,78,121,75,33,47),
+(3,4,57,80,123,76,33,48),
+(3,4,58,81,125,77,33,48),
+(3,4,59,82,128,78,34,49),
+(3,4,60,83,130,79,34,50),
+(3,4,61,85,132,81,34,51),
+(3,4,62,86,135,82,35,51),
+(3,4,63,87,137,83,35,52),
+(3,4,64,89,139,84,36,53),
+(3,4,65,90,142,86,36,53),
+(3,4,66,91,144,87,36,54),
+(3,4,67,93,147,88,37,55),
+(3,4,68,94,149,89,37,56),
+(3,4,69,96,152,91,38,56),
+(3,4,70,97,154,92,38,57),
+(3,4,71,99,157,93,38,58),
+(3,4,72,101,160,96,39,58),
+(3,4,73,102,163,97,39,59),
+(3,4,74,104,166,98,40,60),
+(3,4,75,106,169,100,40,61),
+(3,4,76,107,172,101,40,62),
+(3,4,77,109,175,103,41,63),
+(3,4,78,111,179,105,41,64),
+(3,4,79,113,182,106,42,65),
+(3,4,80,115,185,108,42,66),
+
+(3,5,1,22,16,23,21,22),
+(3,5,2,22,16,23,22,23),
+(3,5,3,22,16,24,24,25),
+(3,5,4,22,17,24,25,26),
+(3,5,5,23,17,24,26,27),
+(3,5,6,23,17,25,28,29),
+(3,5,7,23,17,25,29,30),
+(3,5,8,23,18,26,30,32),
+(3,5,9,23,18,26,32,33),
+(3,5,10,23,18,26,33,35),
+(3,5,11,24,18,27,35,36),
+(3,5,12,24,19,27,36,38),
+(3,5,13,24,19,28,37,39),
+(3,5,14,24,19,28,39,41),
+(3,5,15,24,19,28,40,42),
+(3,5,16,24,20,29,42,44),
+(3,5,17,25,20,29,43,45),
+(3,5,18,25,20,30,45,47),
+(3,5,19,25,21,30,46,49),
+(3,5,20,25,21,31,48,50),
+(3,5,21,25,21,31,50,52),
+(3,5,22,26,22,31,51,53),
+(3,5,23,26,22,32,53,55),
+(3,5,24,26,22,32,54,57),
+(3,5,25,26,22,33,56,58),
+(3,5,26,27,23,33,58,60),
+(3,5,27,27,23,34,59,62),
+(3,5,28,27,23,34,61,64),
+(3,5,29,27,24,35,63,65),
+(3,5,30,28,24,35,64,67),
+(3,5,31,28,24,36,66,69),
+(3,5,32,28,25,36,68,71),
+(3,5,33,28,25,37,70,72),
+(3,5,34,29,26,38,71,74),
+(3,5,35,29,26,38,73,76),
+(3,5,36,29,26,39,75,78),
+(3,5,37,29,27,39,77,80),
+(3,5,38,30,27,40,78,82),
+(3,5,39,30,27,40,80,84),
+(3,5,40,30,28,41,82,86),
+(3,5,41,31,28,41,84,88),
+(3,5,42,31,29,42,86,89),
+(3,5,43,31,29,43,88,91),
+(3,5,44,32,29,43,90,93),
+(3,5,45,32,30,44,92,95),
+(3,5,46,32,30,44,93,97),
+(3,5,47,32,30,45,95,99),
+(3,5,48,33,31,46,97,101),
+(3,5,49,33,31,46,99,103),
+(3,5,50,33,32,47,101,106),
+(3,5,51,34,32,48,103,108),
+(3,5,52,34,33,48,105,110),
+(3,5,53,35,33,49,107,112),
+(3,5,54,35,33,50,109,114),
+(3,5,55,35,34,50,111,116),
+(3,5,56,36,34,51,113,118),
+(3,5,57,36,35,52,116,120),
+(3,5,58,36,35,52,118,123),
+(3,5,59,37,36,53,120,125),
+(3,5,60,37,36,54,122,127),
+(3,5,61,37,37,54,124,129),
+(3,5,62,38,37,55,126,131),
+(3,5,63,38,38,56,128,134),
+(3,5,64,39,38,57,131,136),
+(3,5,65,39,39,57,133,138),
+(3,5,66,39,39,58,135,141),
+(3,5,67,40,40,59,137,143),
+(3,5,68,40,40,59,139,145),
+(3,5,69,41,40,60,142,148),
+(3,5,70,41,41,61,144,150),
+(3,5,71,41,42,62,147,153),
+(3,5,72,42,42,62,150,163),
+(3,5,73,42,43,63,153,166),
+(3,5,74,43,43,64,155,170),
+(3,5,75,43,44,65,158,173),
+(3,5,76,43,45,66,161,176),
+(3,5,77,44,45,67,164,179),
+(3,5,78,44,46,68,167,182),
+(3,5,79,45,46,69,170,184),
+(3,5,80,45,47,70,173,189),
+
+(3,6,1,25,16,25,19,19),
+(3,6,2,26,17,26,19,19),
+(3,6,3,28,18,27,19,20),
+(3,6,4,29,18,28,19,20),
+(3,6,5,30,19,30,19,20),
+(3,6,6,31,20,31,19,20),
+(3,6,7,33,21,32,20,21),
+(3,6,8,34,22,33,20,21),
+(3,6,9,36,23,35,20,21),
+(3,6,10,37,23,36,20,22),
+(3,6,11,38,24,37,20,22),
+(3,6,12,40,25,38,20,22),
+(3,6,13,41,26,40,20,23),
+(3,6,14,43,27,41,20,23),
+(3,6,15,44,28,42,20,23),
+(3,6,16,46,29,44,21,24),
+(3,6,17,47,30,45,21,24),
+(3,6,18,49,31,46,21,24),
+(3,6,19,50,32,48,21,25),
+(3,6,20,52,33,49,21,25),
+(3,6,21,53,34,51,21,26),
+(3,6,22,55,34,52,21,26),
+(3,6,23,56,35,53,21,26),
+(3,6,24,58,36,55,22,27),
+(3,6,25,59,37,56,22,27),
+(3,6,26,61,38,58,22,27),
+(3,6,27,63,39,59,22,28),
+(3,6,28,64,41,61,22,28),
+(3,6,29,66,42,62,22,29),
+(3,6,30,68,43,64,23,29),
+(3,6,31,69,44,65,23,30),
+(3,6,32,71,45,67,23,30),
+(3,6,33,73,46,68,23,30),
+(3,6,34,75,47,70,23,31),
+(3,6,35,76,48,72,24,31),
+(3,6,36,78,49,73,24,32),
+(3,6,37,80,50,75,24,32),
+(3,6,38,82,51,76,24,33),
+(3,6,39,84,52,78,24,33),
+(3,6,40,85,54,80,24,34),
+(3,6,41,87,55,81,25,34),
+(3,6,42,89,56,83,25,35),
+(3,6,43,91,57,85,25,35),
+(3,6,44,93,58,87,25,36),
+(3,6,45,95,59,88,26,36),
+(3,6,46,97,61,90,26,37),
+(3,6,47,99,62,92,26,37),
+(3,6,48,101,63,94,26,38),
+(3,6,49,102,64,95,26,38),
+(3,6,50,104,65,97,27,39),
+(3,6,51,106,67,99,27,39),
+(3,6,52,108,68,99,27,40),
+(3,6,53,109,68,101,27,40),
+(3,6,54,110,69,101,28,41),
+(3,6,55,110,69,102,28,41),
+(3,6,56,113,71,105,28,42),
+(3,6,57,118,72,107,28,42),
+(3,6,58,120,73,109,29,43),
+(3,6,59,123,75,111,29,43),
+(3,6,60,125,76,113,29,44),
+(3,6,61,126,77,115,29,45),
+(3,6,62,127,79,117,29,45),
+(3,6,63,129,80,120,30,46),
+(3,6,64,132,82,122,30,46),
+(3,6,65,135,83,124,30,47),
+(3,6,66,137,85,127,30,48),
+(3,6,67,144,86,129,31,48),
+(3,6,68,146,88,131,31,49),
+(3,6,69,149,89,133,31,50),
+(3,6,70,152,91,136,31,50),
+(3,6,71,154,93,139,32,51),
+(3,6,72,157,94,141,32,52),
+(3,6,73,160,96,144,32,53),
+(3,6,74,163,98,146,32,53),
+(3,6,75,166,99,150,33,54),
+(3,6,76,169,101,152,33,55),
+(3,6,77,172,103,155,33,56),
+(3,6,78,176,104,157,33,56),
+(3,6,79,179,106,160,34,57),
+(3,6,80,182,108,163,34,58),
+
+(4,1,1,20,25,21,20,20),
+(4,1,2,21,26,22,20,20),
+(4,1,3,23,27,23,20,21),
+(4,1,4,24,27,25,20,21),
+(4,1,5,25,28,26,20,21),
+(4,1,6,27,29,27,20,21),
+(4,1,7,28,30,28,21,22),
+(4,1,8,29,31,29,21,22),
+(4,1,9,31,31,31,21,22),
+(4,1,10,32,32,32,21,23),
+(4,1,11,33,33,33,21,23),
+(4,1,12,35,34,34,21,23),
+(4,1,13,36,35,36,21,24),
+(4,1,14,38,36,37,21,24),
+(4,1,15,39,37,38,21,24),
+(4,1,16,41,37,40,21,25),
+(4,1,17,42,38,41,22,25),
+(4,1,18,44,39,43,22,25),
+(4,1,19,45,40,44,22,26),
+(4,1,20,47,41,45,22,26),
+(4,1,21,48,42,47,22,26),
+(4,1,22,50,43,48,22,27),
+(4,1,23,52,44,50,22,27),
+(4,1,24,53,45,51,23,28),
+(4,1,25,55,46,52,23,28),
+(4,1,26,56,47,54,23,28),
+(4,1,27,58,48,55,23,29),
+(4,1,28,60,49,57,23,29),
+(4,1,29,61,50,58,23,30),
+(4,1,30,63,51,60,24,30),
+(4,1,31,65,52,62,24,30),
+(4,1,32,66,53,63,24,31),
+(4,1,33,68,54,65,24,31),
+(4,1,34,70,55,66,24,32),
+(4,1,35,72,56,68,24,32),
+(4,1,36,73,58,69,25,33),
+(4,1,37,75,59,71,25,33),
+(4,1,38,77,60,73,25,34),
+(4,1,39,79,61,74,25,34),
+(4,1,40,81,62,76,25,35),
+(4,1,41,82,63,78,26,35),
+(4,1,42,84,64,79,26,35),
+(4,1,43,86,66,81,26,36),
+(4,1,44,88,67,83,26,36),
+(4,1,45,90,68,85,26,37),
+(4,1,46,92,69,86,27,37),
+(4,1,47,94,70,88,27,38),
+(4,1,48,96,72,90,27,38),
+(4,1,49,98,73,92,27,39),
+(4,1,50,100,74,93,28,40),
+(4,1,51,102,75,95,28,40),
+(4,1,52,104,77,97,28,41),
+(4,1,53,106,78,99,28,41),
+(4,1,54,108,79,101,29,42),
+(4,1,55,110,80,103,29,42),
+(4,1,56,112,82,104,29,43),
+(4,1,57,114,83,106,29,43),
+(4,1,58,116,84,108,30,44),
+(4,1,59,118,86,110,30,44),
+(4,1,60,120,87,112,30,45),
+(4,1,61,122,88,114,30,46),
+(4,1,62,124,90,116,31,46),
+(4,1,63,127,91,118,31,47),
+(4,1,64,129,92,120,31,47),
+(4,1,65,131,94,122,32,48),
+(4,1,66,133,95,124,32,49),
+(4,1,67,135,97,126,32,49),
+(4,1,68,138,98,128,32,50),
+(4,1,69,140,100,130,33,50),
+(4,1,70,142,101,132,33,51),
+(4,1,71,145,102,134,33,52),
+(4,1,72,147,104,137,33,53),
+(4,1,73,150,106,139,33,54),
+(4,1,74,153,107,142,34,54),
+(4,1,75,156,109,144,34,55),
+(4,1,76,159,111,148,34,56),
+(4,1,77,162,113,150,35,57),
+(4,1,78,165,114,152,35,57),
+(4,1,79,178,116,164,35,58),
+(4,1,80,181,118,167,36,59),
+
+(4,3,1,17,28,20,20,21),
+(4,3,2,17,29,21,21,22),
+(4,3,3,18,31,22,21,22),
+(4,3,4,18,32,23,22,23),
+(4,3,5,19,33,24,22,24),
+(4,3,6,19,35,25,23,24),
+(4,3,7,20,36,26,24,25),
+(4,3,8,20,38,27,24,25),
+(4,3,9,21,39,27,25,26),
+(4,3,10,21,40,28,25,27),
+(4,3,11,22,42,29,26,28),
+(4,3,12,22,43,30,27,28),
+(4,3,13,23,45,31,27,29),
+(4,3,14,23,46,32,28,30),
+(4,3,15,24,48,34,29,30),
+(4,3,16,24,50,35,29,31),
+(4,3,17,25,51,36,30,32),
+(4,3,18,25,53,37,31,33),
+(4,3,19,26,54,38,31,33),
+(4,3,20,26,56,39,32,34),
+(4,3,21,27,57,40,33,35),
+(4,3,22,27,59,41,33,36),
+(4,3,23,28,61,42,34,36),
+(4,3,24,28,62,43,35,37),
+(4,3,25,29,64,44,36,38),
+(4,3,26,30,66,46,36,39),
+(4,3,27,30,68,47,37,40),
+(4,3,28,31,69,48,38,41),
+(4,3,29,31,71,49,39,41),
+(4,3,30,32,73,50,39,42),
+(4,3,31,33,75,52,40,43),
+(4,3,32,33,76,53,41,44),
+(4,3,33,34,78,54,42,45),
+(4,3,34,34,80,55,43,46),
+(4,3,35,35,82,57,44,47),
+(4,3,36,36,84,58,44,48),
+(4,3,37,36,86,59,45,48),
+(4,3,38,37,87,60,46,49),
+(4,3,39,38,89,62,47,50),
+(4,3,40,38,91,63,48,51),
+(4,3,41,39,93,64,49,52),
+(4,3,42,40,95,66,49,53),
+(4,3,43,40,97,67,50,54),
+(4,3,44,41,99,68,51,55),
+(4,3,45,42,101,70,52,56),
+(4,3,46,42,103,71,53,57),
+(4,3,47,43,105,72,54,58),
+(4,3,48,44,107,74,55,59),
+(4,3,49,45,109,75,56,60),
+(4,3,50,45,111,77,57,61),
+(4,3,51,46,113,78,58,62),
+(4,3,52,47,115,79,59,63),
+(4,3,53,47,118,81,60,64),
+(4,3,54,48,120,82,61,65),
+(4,3,55,49,122,84,61,66),
+(4,3,56,50,124,85,62,67),
+(4,3,57,50,126,87,63,68),
+(4,3,58,51,128,88,64,69),
+(4,3,59,52,131,90,65,70),
+(4,3,60,53,133,91,66,72),
+(4,3,61,54,135,93,67,73),
+(4,3,62,54,137,94,69,74),
+(4,3,63,55,140,96,70,75),
+(4,3,64,56,142,97,71,76),
+(4,3,65,57,144,99,72,77),
+(4,3,66,58,147,101,73,78),
+(4,3,67,58,149,102,74,79),
+(4,3,68,59,151,104,75,81),
+(4,3,69,60,154,105,76,82),
+(4,3,70,61,156,107,77,83),
+(4,3,71,62,159,109,78,84),
+(4,3,72,63,162,111,79,85),
+(4,3,73,64,165,113,80,87),
+(4,3,74,65,168,115,82,88),
+(4,3,75,66,171,117,83,90),
+(4,3,76,67,174,119,84,91),
+(4,3,77,68,177,121,86,93),
+(4,3,78,69,180,123,87,94),
+(4,3,79,70,190,125,91,96),
+(4,3,80,71,193,127,93,97),
+
+(4,4,1,18,28,20,20,20),
+(4,4,2,19,29,21,20,20),
+(4,4,3,20,31,21,20,21),
+(4,4,4,20,32,22,20,21),
+(4,4,5,21,34,23,21,21),
+(4,4,6,22,35,24,21,22),
+(4,4,7,23,37,24,21,22),
+(4,4,8,24,38,25,21,23),
+(4,4,9,24,40,26,21,23),
+(4,4,10,25,41,26,21,23),
+(4,4,11,26,43,27,22,24),
+(4,4,12,27,44,28,22,24),
+(4,4,13,28,46,29,22,25),
+(4,4,14,29,48,30,22,25),
+(4,4,15,29,49,30,22,25),
+(4,4,16,30,51,31,23,26),
+(4,4,17,31,52,32,23,26),
+(4,4,18,32,54,33,23,27),
+(4,4,19,33,56,34,23,27),
+(4,4,20,34,57,35,23,28),
+(4,4,21,35,59,35,24,28),
+(4,4,22,36,61,36,24,29),
+(4,4,23,37,63,37,24,29),
+(4,4,24,38,64,38,24,30),
+(4,4,25,39,66,39,25,30),
+(4,4,26,40,68,40,25,31),
+(4,4,27,41,70,41,25,31),
+(4,4,28,42,72,42,25,32),
+(4,4,29,43,73,43,25,32),
+(4,4,30,44,75,43,26,33),
+(4,4,31,45,77,44,26,33),
+(4,4,32,46,79,45,26,34),
+(4,4,33,47,81,46,27,34),
+(4,4,34,48,83,47,27,35),
+(4,4,35,49,85,48,27,35),
+(4,4,36,50,87,49,27,36),
+(4,4,37,51,89,50,28,36),
+(4,4,38,52,91,51,28,37),
+(4,4,39,53,93,52,28,38),
+(4,4,40,54,95,53,28,38),
+(4,4,41,56,97,54,29,39),
+(4,4,42,57,99,55,29,39),
+(4,4,43,58,101,56,29,40),
+(4,4,44,59,103,57,30,40),
+(4,4,45,60,105,59,30,41),
+(4,4,46,61,107,60,30,42),
+(4,4,47,62,109,61,31,42),
+(4,4,48,64,112,62,31,43),
+(4,4,49,65,114,63,31,44),
+(4,4,50,66,116,64,32,44),
+(4,4,51,67,118,65,32,45),
+(4,4,52,68,120,66,32,45),
+(4,4,53,70,123,67,33,46),
+(4,4,54,71,125,69,33,47),
+(4,4,55,72,127,70,33,47),
+(4,4,56,73,129,71,34,48),
+(4,4,57,75,132,72,34,49),
+(4,4,58,76,134,73,34,49),
+(4,4,59,77,136,74,35,50),
+(4,4,60,79,139,76,35,51),
+(4,4,61,80,141,77,35,51),
+(4,4,62,81,143,78,36,52),
+(4,4,63,82,146,79,36,53),
+(4,4,64,84,148,80,37,54),
+(4,4,65,85,151,82,37,54),
+(4,4,66,87,153,83,37,55),
+(4,4,67,88,156,84,38,56),
+(4,4,68,89,158,85,38,57),
+(4,4,69,91,160,87,39,57),
+(4,4,70,92,163,88,39,58),
+(4,4,71,94,166,90,39,59),
+(4,4,72,96,169,91,40,59),
+(4,4,73,97,172,93,40,60),
+(4,4,74,99,175,94,41,61),
+(4,4,75,101,178,96,41,62),
+(4,4,76,102,181,97,41,63),
+(4,4,77,104,184,99,42,64),
+(4,4,78,106,188,101,42,65),
+(4,4,79,108,191,102,43,66),
+(4,4,80,110,194,104,43,67),
+
+(4,5,1,17,25,19,22,23),
+(4,5,2,17,25,19,23,24),
+(4,5,3,17,25,20,25,26),
+(4,5,4,17,26,20,26,27),
+(4,5,5,18,26,20,27,28),
+(4,5,6,18,26,21,29,30),
+(4,5,7,18,26,21,30,31),
+(4,5,8,18,26,22,31,33),
+(4,5,9,18,27,22,33,34),
+(4,5,10,19,27,22,34,36),
+(4,5,11,19,27,23,36,37),
+(4,5,12,19,27,23,37,39),
+(4,5,13,19,28,24,38,40),
+(4,5,14,19,28,24,40,42),
+(4,5,15,19,28,25,41,43),
+(4,5,16,20,28,25,43,45),
+(4,5,17,20,29,25,44,46),
+(4,5,18,20,29,26,46,48),
+(4,5,19,20,29,26,47,49),
+(4,5,20,21,30,27,49,51),
+(4,5,21,21,30,27,51,53),
+(4,5,22,21,30,28,52,54),
+(4,5,23,21,30,28,54,56),
+(4,5,24,21,31,29,55,58),
+(4,5,25,22,31,29,57,59),
+(4,5,26,22,31,30,59,61),
+(4,5,27,22,32,30,60,63),
+(4,5,28,22,32,31,62,65),
+(4,5,29,23,32,31,64,66),
+(4,5,30,23,33,32,65,68),
+(4,5,31,23,33,32,67,70),
+(4,5,32,23,33,33,69,72),
+(4,5,33,24,34,33,70,73),
+(4,5,34,24,34,34,72,75),
+(4,5,35,24,34,34,74,77),
+(4,5,36,24,35,35,76,79),
+(4,5,37,25,35,35,78,81),
+(4,5,38,25,35,36,79,83),
+(4,5,39,25,36,37,81,85),
+(4,5,40,26,36,37,83,87),
+(4,5,41,26,37,38,85,88),
+(4,5,42,26,37,38,87,90),
+(4,5,43,27,37,39,89,92),
+(4,5,44,27,38,39,91,94),
+(4,5,45,27,38,40,92,96),
+(4,5,46,27,39,41,94,98),
+(4,5,47,28,39,41,96,100),
+(4,5,48,28,39,42,98,102),
+(4,5,49,28,40,43,100,104),
+(4,5,50,29,40,43,102,106),
+(4,5,51,29,41,44,104,109),
+(4,5,52,29,41,44,106,111),
+(4,5,53,30,42,45,108,113),
+(4,5,54,30,42,46,110,115),
+(4,5,55,30,43,46,112,117),
+(4,5,56,31,43,47,114,119),
+(4,5,57,31,43,48,117,121),
+(4,5,58,31,44,48,119,124),
+(4,5,59,32,44,49,121,126),
+(4,5,60,32,45,50,123,128),
+(4,5,61,33,45,51,125,130),
+(4,5,62,33,46,51,127,132),
+(4,5,63,33,46,52,129,135),
+(4,5,64,34,47,53,132,137),
+(4,5,65,34,47,53,134,139),
+(4,5,66,34,48,54,136,142),
+(4,5,67,35,48,55,138,144),
+(4,5,68,35,49,56,140,146),
+(4,5,69,36,49,56,143,149),
+(4,5,70,36,50,57,145,151),
+(4,5,71,36,51,58,148,161),
+(4,5,72,37,51,58,151,164),
+(4,5,73,37,52,59,154,168),
+(4,5,74,38,52,60,156,171),
+(4,5,75,38,53,61,159,174),
+(4,5,76,38,54,62,162,177),
+(4,5,77,39,54,63,165,180),
+(4,5,78,39,55,64,168,183),
+(4,5,79,40,55,65,171,186),
+(4,5,80,40,56,66,200,191),
+
+(4,6,1,20,25,21,20,20),
+(4,6,2,21,26,22,20,20),
+(4,6,3,23,27,23,20,21),
+(4,6,4,24,27,25,20,21),
+(4,6,5,25,28,26,20,21),
+(4,6,6,27,29,27,20,21),
+(4,6,7,28,30,28,21,22),
+(4,6,8,29,31,29,21,22),
+(4,6,9,31,31,31,21,22),
+(4,6,10,32,32,32,21,23),
+(4,6,11,33,33,33,21,23),
+(4,6,12,35,34,34,21,23),
+(4,6,13,36,35,36,21,24),
+(4,6,14,38,36,37,21,24),
+(4,6,15,39,37,38,21,24),
+(4,6,16,41,37,40,21,25),
+(4,6,17,42,38,41,22,25),
+(4,6,18,44,39,43,22,25),
+(4,6,19,45,40,44,22,26),
+(4,6,20,47,41,45,22,26),
+(4,6,21,48,42,47,22,26),
+(4,6,22,50,43,48,22,27),
+(4,6,23,52,44,50,22,27),
+(4,6,24,53,45,51,23,28),
+(4,6,25,55,46,52,23,28),
+(4,6,26,56,47,54,23,28),
+(4,6,27,58,48,55,23,29),
+(4,6,28,60,49,57,23,29),
+(4,6,29,61,50,58,23,30),
+(4,6,30,63,51,60,24,30),
+(4,6,31,65,52,62,24,30),
+(4,6,32,66,53,63,24,31),
+(4,6,33,68,54,65,24,31),
+(4,6,34,70,55,66,24,32),
+(4,6,35,72,56,68,24,32),
+(4,6,36,73,58,69,25,33),
+(4,6,37,75,59,71,25,33),
+(4,6,38,77,60,73,25,34),
+(4,6,39,79,61,74,25,34),
+(4,6,40,81,62,76,25,35),
+(4,6,41,82,63,78,26,35),
+(4,6,42,84,64,79,26,35),
+(4,6,43,86,66,81,26,36),
+(4,6,44,88,67,83,26,36),
+(4,6,45,90,68,85,26,37),
+(4,6,46,92,69,86,27,37),
+(4,6,47,94,70,88,27,38),
+(4,6,48,96,72,90,27,38),
+(4,6,49,98,73,92,27,39),
+(4,6,50,100,74,93,28,40),
+(4,6,51,101,75,94,28,40),
+(4,6,52,102,76,95,28,41),
+(4,6,53,103,77,96,28,41),
+(4,6,54,104,77,97,29,42),
+(4,6,55,105,78,98,29,42),
+(4,6,56,108,80,101,29,43),
+(4,6,57,113,81,103,29,43),
+(4,6,58,115,82,105,30,44),
+(4,6,59,115,84,107,30,44),
+(4,6,60,120,85,109,30,45),
+(4,6,61,122,86,111,30,46),
+(4,6,62,122,88,113,30,46),
+(4,6,63,127,89,116,31,47),
+(4,6,64,127,91,118,31,47),
+(4,6,65,133,92,120,31,48),
+(4,6,66,135,94,123,31,49),
+(4,6,67,136,95,125,32,49),
+(4,6,68,137,97,127,32,50),
+(4,6,69,140,98,130,32,51),
+(4,6,70,147,100,132,32,51),
+(4,6,71,154,102,135,33,52),
+(4,6,72,156,103,137,33,53),
+(4,6,73,157,105,140,33,54),
+(4,6,74,158,107,142,33,54),
+(4,6,75,161,108,145,34,55),
+(4,6,76,164,110,148,34,56),
+(4,6,77,167,112,150,34,57),
+(4,6,78,170,113,153,34,57),
+(4,6,79,172,115,156,35,58),
+(4,6,80,177,117,159,35,59),
+
+(4,11,1,18,25,19,22,22),
+(4,11,2,19,25,20,23,23),
+(4,11,3,19,26,20,24,24),
+(4,11,4,20,26,21,25,26),
+(4,11,5,20,27,22,26,27),
+(4,11,6,21,27,22,27,28),
+(4,11,7,21,28,23,28,29),
+(4,11,8,22,28,24,29,30),
+(4,11,9,23,29,24,30,32),
+(4,11,10,23,29,25,32,33),
+(4,11,11,24,30,26,33,34),
+(4,11,12,24,31,26,34,35),
+(4,11,13,25,31,27,35,37),
+(4,11,14,26,32,28,36,38),
+(4,11,15,26,32,29,37,39),
+(4,11,16,27,33,29,38,41),
+(4,11,17,28,33,30,40,42),
+(4,11,18,28,34,31,41,43),
+(4,11,19,29,35,32,42,45),
+(4,11,20,30,35,32,43,46),
+(4,11,21,30,36,33,45,48),
+(4,11,22,31,36,34,46,49),
+(4,11,23,32,37,35,47,51),
+(4,11,24,32,38,36,48,52),
+(4,11,25,33,38,36,50,53),
+(4,11,26,34,39,37,51,55),
+(4,11,27,35,40,38,52,56),
+(4,11,28,35,40,39,54,58),
+(4,11,29,36,41,40,55,59),
+(4,11,30,37,42,41,56,61),
+(4,11,31,38,42,42,58,62),
+(4,11,32,38,43,42,59,64),
+(4,11,33,39,44,43,60,66),
+(4,11,34,40,44,44,62,67),
+(4,11,35,41,45,45,63,69),
+(4,11,36,42,46,46,65,70),
+(4,11,37,42,47,47,66,72),
+(4,11,38,43,47,48,67,74),
+(4,11,39,44,48,49,69,75),
+(4,11,40,45,49,50,70,77),
+(4,11,41,46,50,51,72,79),
+(4,11,42,46,50,52,73,80),
+(4,11,43,47,51,53,75,82),
+(4,11,44,48,52,54,76,84),
+(4,11,45,49,53,55,78,85),
+(4,11,46,50,54,56,79,87),
+(4,11,47,51,54,57,81,89),
+(4,11,48,52,55,58,83,91),
+(4,11,49,53,56,59,84,93),
+(4,11,50,53,57,60,86,94),
+(4,11,51,54,58,61,87,96),
+(4,11,52,55,59,62,89,98),
+(4,11,53,56,59,63,91,100),
+(4,11,54,57,60,64,92,102),
+(4,11,55,58,61,65,94,103),
+(4,11,56,59,62,66,95,105),
+(4,11,57,60,63,67,97,107),
+(4,11,58,61,64,68,99,109),
+(4,11,59,62,65,69,101,111),
+(4,11,60,63,66,70,102,113),
+(4,11,61,64,66,72,104,115),
+(4,11,62,65,67,73,106,117),
+(4,11,63,66,68,74,107,119),
+(4,11,64,67,69,75,109,121),
+(4,11,65,68,70,76,111,123),
+(4,11,66,69,71,77,113,125),
+(4,11,67,70,72,78,115,127),
+(4,11,68,71,73,80,116,129),
+(4,11,69,72,74,81,118,131),
+(4,11,70,73,75,82,120,133),
+(4,11,71,75,76,83,122,135),
+(4,11,72,76,78,85,125,138),
+(4,11,73,77,79,86,127,140),
+(4,11,74,78,80,88,131,143),
+(4,11,75,80,81,89,133,145),
+(4,11,76,81,82,91,134,148),
+(4,11,77,82,83,92,136,151),
+(4,11,78,84,85,94,138,153),
+(4,11,79,85,86,95,141,156),
+(4,11,80,86,87,97,143,159),
+
+(5,1,1,22,18,23,18,25),
+(5,1,2,23,19,24,18,25),
+(5,1,3,25,20,25,18,26),
+(5,1,4,26,20,26,18,26),
+(5,1,5,27,21,28,18,26),
+(5,1,6,29,22,29,18,26),
+(5,1,7,30,23,30,19,27),
+(5,1,8,31,24,31,19,27),
+(5,1,9,33,25,33,19,27),
+(5,1,10,34,25,34,19,28),
+(5,1,11,35,26,35,19,28),
+(5,1,12,37,27,36,19,28),
+(5,1,13,38,28,38,19,28),
+(5,1,14,40,29,39,19,29),
+(5,1,15,41,30,40,19,29),
+(5,1,16,43,31,42,20,29),
+(5,1,17,44,32,43,20,30),
+(5,1,18,46,33,44,20,30),
+(5,1,19,47,34,46,20,31),
+(5,1,20,49,34,47,20,31),
+(5,1,21,50,35,49,20,31),
+(5,1,22,52,36,50,20,32),
+(5,1,23,53,37,51,21,32),
+(5,1,24,55,38,53,21,32),
+(5,1,25,57,39,54,21,33),
+(5,1,26,58,40,56,21,33),
+(5,1,27,60,41,57,21,34),
+(5,1,28,62,42,59,21,34),
+(5,1,29,63,43,60,21,34),
+(5,1,30,65,44,62,22,35),
+(5,1,31,67,46,63,22,35),
+(5,1,32,68,47,65,22,36),
+(5,1,33,70,48,67,22,36),
+(5,1,34,72,49,68,22,36),
+(5,1,35,74,50,70,23,37),
+(5,1,36,75,51,71,23,37),
+(5,1,37,77,52,73,23,38),
+(5,1,38,79,53,75,23,38),
+(5,1,39,81,54,76,23,39),
+(5,1,40,83,55,78,24,39),
+(5,1,41,84,57,80,24,40),
+(5,1,42,86,58,81,24,40),
+(5,1,43,88,59,83,24,41),
+(5,1,44,90,60,85,24,41),
+(5,1,45,92,61,86,25,42),
+(5,1,46,94,62,88,25,42),
+(5,1,47,96,64,90,25,43),
+(5,1,48,98,65,92,25,43),
+(5,1,49,100,66,93,25,44),
+(5,1,50,102,67,95,26,44),
+(5,1,51,104,69,97,26,45),
+(5,1,52,106,70,99,26,45),
+(5,1,53,108,71,101,26,46),
+(5,1,54,110,72,103,27,46),
+(5,1,55,112,74,104,27,47),
+(5,1,56,114,75,106,27,48),
+(5,1,57,116,76,108,27,48),
+(5,1,58,118,78,110,28,49),
+(5,1,59,120,79,112,28,49),
+(5,1,60,122,80,114,28,50),
+(5,1,61,124,82,116,28,50),
+(5,1,62,126,83,118,29,51),
+(5,1,63,128,84,120,29,52),
+(5,1,64,131,86,122,29,52),
+(5,1,65,133,87,124,30,53),
+(5,1,66,135,88,126,30,53),
+(5,1,67,137,90,128,30,54),
+(5,1,68,139,91,130,30,55),
+(5,1,69,142,93,132,31,55),
+(5,1,70,144,94,134,31,56),
+(5,1,71,147,95,136,31,57),
+(5,1,72,150,97,139,31,58),
+(5,1,73,152,99,141,31,59),
+(5,1,74,155,100,144,32,59),
+(5,1,75,158,102,146,32,60),
+(5,1,76,163,104,149,32,61),
+(5,1,77,167,106,152,33,62),
+(5,1,78,167,107,154,33,62),
+(5,1,79,170,109,157,33,63),
+(5,1,80,173,111,160,34,64),
+
+(5,4,1,20,21,22,18,25),
+(5,4,2,21,22,23,18,25),
+(5,4,3,22,24,23,18,26),
+(5,4,4,22,25,24,18,26),
+(5,4,5,23,27,25,19,26),
+(5,4,6,24,28,25,19,27),
+(5,4,7,25,30,26,19,27),
+(5,4,8,25,31,27,19,27),
+(5,4,9,26,33,28,19,28),
+(5,4,10,27,34,28,19,28),
+(5,4,11,28,36,29,20,29),
+(5,4,12,29,38,30,20,29),
+(5,4,13,30,39,31,20,29),
+(5,4,14,31,41,32,20,30),
+(5,4,15,31,42,32,20,30),
+(5,4,16,32,44,33,21,31),
+(5,4,17,33,46,34,21,31),
+(5,4,18,34,47,35,21,32),
+(5,4,19,35,49,36,21,32),
+(5,4,20,36,51,36,21,32),
+(5,4,21,37,52,37,22,33),
+(5,4,22,38,54,38,22,33),
+(5,4,23,39,56,39,22,34),
+(5,4,24,40,58,40,22,34),
+(5,4,25,41,60,41,23,35),
+(5,4,26,42,61,42,23,35),
+(5,4,27,43,63,43,23,36),
+(5,4,28,44,65,44,23,36),
+(5,4,29,45,67,44,24,37),
+(5,4,30,46,69,45,24,37),
+(5,4,31,47,71,46,24,38),
+(5,4,32,48,72,47,24,38),
+(5,4,33,49,74,48,25,39),
+(5,4,34,50,76,49,25,39),
+(5,4,35,51,78,50,25,40),
+(5,4,36,52,80,51,25,41),
+(5,4,37,53,82,52,26,41),
+(5,4,38,54,84,53,26,42),
+(5,4,39,55,86,54,26,42),
+(5,4,40,56,88,55,27,43),
+(5,4,41,57,90,56,27,43),
+(5,4,42,59,92,57,27,44),
+(5,4,43,60,94,58,27,45),
+(5,4,44,61,96,59,28,45),
+(5,4,45,62,99,60,28,46),
+(5,4,46,63,101,61,28,46),
+(5,4,47,64,103,63,29,47),
+(5,4,48,66,105,64,29,48),
+(5,4,49,67,107,65,29,48),
+(5,4,50,68,109,66,30,49),
+(5,4,51,69,111,67,30,50),
+(5,4,52,70,114,68,30,50),
+(5,4,53,72,116,69,31,51),
+(5,4,54,73,118,70,31,52),
+(5,4,55,74,120,72,31,52),
+(5,4,56,75,123,73,32,53),
+(5,4,57,77,125,74,32,54),
+(5,4,58,78,127,75,32,54),
+(5,4,59,79,130,76,33,55),
+(5,4,60,81,132,77,33,56),
+(5,4,61,82,134,79,34,56),
+(5,4,62,83,137,80,34,57),
+(5,4,63,84,139,81,34,58),
+(5,4,64,86,141,82,35,59),
+(5,4,65,87,144,84,35,59),
+(5,4,66,88,146,85,35,60),
+(5,4,67,90,149,86,36,61),
+(5,4,68,91,151,87,36,61),
+(5,4,69,93,154,89,37,62),
+(5,4,70,94,156,90,37,63),
+(5,4,71,96,159,91,37,64),
+(5,4,72,98,162,93,38,64),
+(5,4,73,99,165,95,38,65),
+(5,4,74,101,168,96,39,66),
+(5,4,75,103,171,98,39,67),
+(5,4,76,104,174,99,39,68),
+(5,4,77,106,177,101,40,69),
+(5,4,78,108,181,103,40,70),
+(5,4,79,110,184,104,41,71),
+(5,4,80,112,187,106,41,72),
+
+(5,5,1,19,18,21,20,28),
+(5,5,2,19,18,21,21,29),
+(5,5,3,19,18,22,23,31),
+(5,5,4,19,19,22,24,32),
+(5,5,5,20,19,22,25,33),
+(5,5,6,20,19,23,27,35),
+(5,5,7,20,19,23,28,36),
+(5,5,8,20,20,24,29,38),
+(5,5,9,20,20,24,31,39),
+(5,5,10,20,20,24,32,40),
+(5,5,11,21,20,25,34,42),
+(5,5,12,21,21,25,35,43),
+(5,5,13,21,21,26,37,45),
+(5,5,14,21,21,26,38,46),
+(5,5,15,21,21,26,39,48),
+(5,5,16,22,22,27,41,50),
+(5,5,17,22,22,27,42,51),
+(5,5,18,22,22,28,44,53),
+(5,5,19,22,23,28,46,54),
+(5,5,20,22,23,29,47,56),
+(5,5,21,23,23,29,49,57),
+(5,5,22,23,23,30,50,59),
+(5,5,23,23,24,30,52,61),
+(5,5,24,23,24,31,53,62),
+(5,5,25,24,24,31,55,64),
+(5,5,26,24,25,32,57,66),
+(5,5,27,24,25,32,58,68),
+(5,5,28,24,25,33,60,69),
+(5,5,29,25,26,33,62,71),
+(5,5,30,25,26,34,63,73),
+(5,5,31,25,26,34,65,75),
+(5,5,32,25,27,35,67,76),
+(5,5,33,26,27,35,69,78),
+(5,5,34,26,27,36,70,80),
+(5,5,35,26,28,36,72,82),
+(5,5,36,26,28,37,74,84),
+(5,5,37,27,28,37,76,86),
+(5,5,38,27,29,38,77,87),
+(5,5,39,27,29,38,79,89),
+(5,5,40,28,30,39,81,91),
+(5,5,41,28,30,40,83,93),
+(5,5,42,28,30,40,85,95),
+(5,5,43,28,31,41,87,97),
+(5,5,44,29,31,41,89,99),
+(5,5,45,29,32,42,91,101),
+(5,5,46,29,32,43,92,103),
+(5,5,47,30,32,43,94,105),
+(5,5,48,30,33,44,96,107),
+(5,5,49,30,33,44,98,109),
+(5,5,50,31,34,45,100,111),
+(5,5,51,31,34,46,102,113),
+(5,5,52,31,35,46,104,115),
+(5,5,53,32,35,47,106,118),
+(5,5,54,32,35,48,108,120),
+(5,5,55,32,36,48,110,122),
+(5,5,56,33,36,49,113,124),
+(5,5,57,33,37,50,115,126),
+(5,5,58,33,37,50,117,128),
+(5,5,59,34,38,51,119,131),
+(5,5,60,34,38,52,121,133),
+(5,5,61,34,39,52,123,135),
+(5,5,62,35,39,53,125,137),
+(5,5,63,35,40,54,127,140),
+(5,5,64,36,40,55,130,142),
+(5,5,65,36,41,55,132,144),
+(5,5,66,36,41,56,134,147),
+(5,5,67,37,41,57,136,149),
+(5,5,68,37,42,58,138,151),
+(5,5,69,38,42,58,141,154),
+(5,5,70,38,43,59,143,156),
+(5,5,71,38,44,60,146,159),
+(5,5,72,39,44,60,149,162),
+(5,5,73,39,45,61,152,165),
+(5,5,74,40,45,62,157,168),
+(5,5,75,40,46,63,157,171),
+(5,5,76,40,47,64,160,174),
+(5,5,77,41,47,65,163,177),
+(5,5,78,41,48,66,166,180),
+(5,5,79,42,48,67,169,183),
+(5,5,80,42,49,68,172,186),
+
+(5,6,1,22,18,23,18,25),
+(5,6,2,23,19,24,18,25),
+(5,6,3,25,20,25,18,26),
+(5,6,4,26,20,26,18,26),
+(5,6,5,27,21,28,18,26),
+(5,6,6,29,22,29,18,26),
+(5,6,7,30,23,30,19,27),
+(5,6,8,31,24,31,19,27),
+(5,6,9,33,25,33,19,27),
+(5,6,10,34,25,34,19,28),
+(5,6,11,35,26,35,19,28),
+(5,6,12,37,27,36,19,28),
+(5,6,13,38,28,38,19,28),
+(5,6,14,40,29,39,19,29),
+(5,6,15,41,30,40,19,29),
+(5,6,16,43,31,42,20,29),
+(5,6,17,44,32,43,20,30),
+(5,6,18,46,33,44,20,30),
+(5,6,19,47,34,46,20,31),
+(5,6,20,49,34,47,20,31),
+(5,6,21,50,35,49,20,31),
+(5,6,22,52,36,50,20,32),
+(5,6,23,53,37,51,21,32),
+(5,6,24,55,38,53,21,32),
+(5,6,25,57,39,54,21,33),
+(5,6,26,58,40,56,21,33),
+(5,6,27,60,41,57,21,34),
+(5,6,28,62,42,59,21,34),
+(5,6,29,63,43,60,21,34),
+(5,6,30,65,44,62,22,35),
+(5,6,31,67,46,63,22,35),
+(5,6,32,68,47,65,22,36),
+(5,6,33,70,48,67,22,36),
+(5,6,34,72,49,68,22,36),
+(5,6,35,74,50,70,23,37),
+(5,6,36,75,51,71,23,37),
+(5,6,37,77,52,73,23,38),
+(5,6,38,79,53,75,23,38),
+(5,6,39,81,54,76,23,39),
+(5,6,40,83,55,78,24,39),
+(5,6,41,84,57,80,24,40),
+(5,6,42,86,58,81,24,40),
+(5,6,43,88,59,83,24,41),
+(5,6,44,90,60,85,24,41),
+(5,6,45,92,61,86,25,42),
+(5,6,46,94,62,88,25,42),
+(5,6,47,96,64,90,25,43),
+(5,6,48,98,65,92,25,43),
+(5,6,49,100,66,93,25,44),
+(5,6,50,102,67,95,26,44),
+(5,6,51,103,67,96,26,45),
+(5,6,52,104,68,97,26,45),
+(5,6,53,105,69,98,26,46),
+(5,6,54,106,70,99,27,46),
+(5,6,55,107,71,100,27,47),
+(5,6,56,110,73,103,27,48),
+(5,6,57,112,74,105,27,48),
+(5,6,58,114,75,107,28,49),
+(5,6,59,119,77,109,28,49),
+(5,6,60,122,78,111,28,50),
+(5,6,61,124,79,113,28,51),
+(5,6,62,127,81,115,28,51),
+(5,6,63,129,82,118,29,52),
+(5,6,64,136,84,120,29,52),
+(5,6,65,137,85,123,29,53),
+(5,6,66,138,87,125,29,54),
+(5,6,67,141,88,127,30,54),
+(5,6,68,143,90,129,30,55),
+(5,6,69,146,91,132,30,56),
+(5,6,70,149,93,134,30,56),
+(5,6,71,152,95,137,31,57),
+(5,6,72,154,96,139,31,58),
+(5,6,73,157,98,142,31,59),
+(5,6,74,158,100,145,31,59),
+(5,6,75,159,101,147,32,60),
+(5,6,76,162,103,150,32,61),
+(5,6,77,167,105,152,32,62),
+(5,6,78,173,106,155,32,62),
+(5,6,79,174,108,158,33,63),
+(5,6,80,174,110,161,33,64),
+
+(5,8,1,19,18,21,21,27),
+(5,8,2,19,18,21,22,28),
+(5,8,3,19,18,22,24,30),
+(5,8,4,19,18,22,25,31),
+(5,8,5,19,19,22,26,32),
+(5,8,6,19,19,22,28,34),
+(5,8,7,20,19,23,29,35),
+(5,8,8,20,19,23,31,36),
+(5,8,9,20,19,23,32,38),
+(5,8,10,20,19,24,34,39),
+(5,8,11,20,20,24,35,40),
+(5,8,12,20,20,24,37,42),
+(5,8,13,20,20,25,38,43),
+(5,8,14,20,20,25,40,45),
+(5,8,15,20,20,25,41,46),
+(5,8,16,21,21,26,43,48),
+(5,8,17,21,21,26,44,49),
+(5,8,18,21,21,26,46,51),
+(5,8,19,21,21,27,48,52),
+(5,8,20,21,21,27,49,54),
+(5,8,21,21,22,27,51,55),
+(5,8,22,21,22,28,52,57),
+(5,8,23,21,22,28,54,58),
+(5,8,24,22,22,29,56,60),
+(5,8,25,22,23,29,57,62),
+(5,8,26,22,23,29,59,63),
+(5,8,27,22,23,30,61,65),
+(5,8,28,22,23,30,63,67),
+(5,8,29,22,24,31,64,68),
+(5,8,30,23,24,31,66,70),
+(5,8,31,23,24,31,68,72),
+(5,8,32,23,24,32,70,73),
+(5,8,33,23,25,32,72,75),
+(5,8,34,23,25,33,73,77),
+(5,8,35,24,25,33,75,79),
+(5,8,36,24,25,34,77,80),
+(5,8,37,24,26,34,79,82),
+(5,8,38,24,26,35,81,84),
+(5,8,39,24,26,35,83,86),
+(5,8,40,24,27,35,85,88),
+(5,8,41,25,27,36,87,90),
+(5,8,42,25,27,36,89,91),
+(5,8,43,25,27,37,90,93),
+(5,8,44,25,28,37,92,95),
+(5,8,45,26,28,38,94,97),
+(5,8,46,26,28,38,96,99),
+(5,8,47,26,29,39,98,101),
+(5,8,48,26,29,39,100,103),
+(5,8,49,26,29,40,103,105),
+(5,8,50,27,30,40,105,107),
+(5,8,51,27,30,41,107,109),
+(5,8,52,27,30,42,109,111),
+(5,8,53,27,31,42,111,113),
+(5,8,54,28,31,43,113,115),
+(5,8,55,28,31,43,115,117),
+(5,8,56,28,32,44,117,119),
+(5,8,57,28,32,44,119,121),
+(5,8,58,29,32,45,122,123),
+(5,8,59,29,33,45,124,126),
+(5,8,60,29,33,46,126,128),
+(5,8,61,29,34,47,128,130),
+(5,8,62,30,34,47,131,132),
+(5,8,63,30,34,48,133,134),
+(5,8,64,30,35,48,135,136),
+(5,8,65,31,35,49,137,139),
+(5,8,66,31,35,50,140,141),
+(5,8,67,31,36,50,142,143),
+(5,8,68,31,36,51,144,145),
+(5,8,69,32,37,51,147,148),
+(5,8,70,32,37,52,149,150),
+(5,8,71,32,37,53,152,153),
+(5,8,72,32,38,54,155,156),
+(5,8,73,32,38,55,158,159),
+(5,8,74,33,39,55,161,161),
+(5,8,75,33,39,56,164,164),
+(5,8,76,33,39,57,167,167),
+(5,8,77,34,40,58,170,170),
+(5,8,78,34,40,58,173,173),
+(5,8,79,34,41,59,176,176),
+(5,8,80,35,41,60,179,179),
+
+(5,9,1,19,18,22,20,27),
+(5,9,2,19,18,23,21,28),
+(5,9,3,20,19,23,22,29),
+(5,9,4,20,19,24,24,30),
+(5,9,5,20,19,24,25,32),
+(5,9,6,20,20,25,26,33),
+(5,9,7,21,20,25,27,34),
+(5,9,8,21,21,26,28,35),
+(5,9,9,21,21,26,30,36),
+(5,9,10,22,21,27,31,38),
+(5,9,11,22,22,28,32,39),
+(5,9,12,22,22,28,34,40),
+(5,9,13,23,23,29,35,41),
+(5,9,14,23,23,30,36,43),
+(5,9,15,23,24,30,37,44),
+(5,9,16,24,24,31,39,45),
+(5,9,17,24,24,31,40,47),
+(5,9,18,24,25,32,42,48),
+(5,9,19,25,25,33,43,49),
+(5,9,20,25,26,33,44,51),
+(5,9,21,26,26,34,46,52),
+(5,9,22,26,27,35,47,53),
+(5,9,23,26,27,36,49,55),
+(5,9,24,27,28,36,50,56),
+(5,9,25,27,28,37,52,58),
+(5,9,26,27,29,38,53,59),
+(5,9,27,28,29,38,55,60),
+(5,9,28,28,30,39,56,62),
+(5,9,29,29,30,40,58,63),
+(5,9,30,29,31,41,59,65),
+(5,9,31,30,31,41,61,66),
+(5,9,32,30,32,42,62,68),
+(5,9,33,30,32,43,64,69),
+(5,9,34,31,33,44,65,71),
+(5,9,35,31,33,45,67,73),
+(5,9,36,32,34,45,69,74),
+(5,9,37,32,34,46,70,76),
+(5,9,38,33,35,47,72,77),
+(5,9,39,33,36,48,73,79),
+(5,9,40,34,36,49,75,81),
+(5,9,41,34,37,49,77,82),
+(5,9,42,35,37,50,78,84),
+(5,9,43,35,38,51,80,86),
+(5,9,44,36,39,52,82,87),
+(5,9,45,36,39,53,84,89),
+(5,9,46,37,40,54,85,91),
+(5,9,47,37,40,55,87,92),
+(5,9,48,38,41,55,89,94),
+(5,9,49,38,42,56,91,96),
+(5,9,50,39,42,57,92,98),
+(5,9,51,39,43,58,94,100),
+(5,9,52,40,44,59,96,101),
+(5,9,53,40,44,60,98,103),
+(5,9,54,41,45,61,100,105),
+(5,9,55,41,45,62,102,107),
+(5,9,56,42,46,63,103,109),
+(5,9,57,42,47,64,105,111),
+(5,9,58,43,47,65,107,112),
+(5,9,59,43,48,66,109,114),
+(5,9,60,44,49,67,111,116),
+(5,9,61,45,50,68,113,118),
+(5,9,62,45,50,69,115,120),
+(5,9,63,46,51,70,117,122),
+(5,9,64,46,52,71,119,124),
+(5,9,65,47,52,72,121,126),
+(5,9,66,48,53,73,123,128),
+(5,9,67,48,54,74,125,130),
+(5,9,68,49,55,75,127,132),
+(5,9,69,49,55,76,129,134),
+(5,9,70,50,56,77,131,136),
+(5,9,71,51,57,86,135,147),
+(5,9,72,52,57,88,136,149),
+(5,9,73,53,58,89,138,152),
+(5,9,74,53,59,90,141,155),
+(5,9,75,54,60,92,143,157),
+(5,9,76,55,61,93,146,160),
+(5,9,77,56,62,94,149,163),
+(5,9,78,56,63,96,151,166),
+(5,9,79,57,64,97,154,169),
+(5,9,80,58,65,99,157,171),
+
+(6,1,1,28,15,24,15,22),
+(6,1,2,29,16,25,15,22),
+(6,1,3,31,17,26,15,23),
+(6,1,4,32,17,27,15,23),
+(6,1,5,33,18,29,15,23),
+(6,1,6,34,19,30,15,23),
+(6,1,7,36,20,31,16,24),
+(6,1,8,37,21,32,16,24),
+(6,1,9,38,22,34,16,24),
+(6,1,10,40,22,35,16,25),
+(6,1,11,41,23,36,16,25),
+(6,1,12,43,24,37,16,25),
+(6,1,13,44,25,39,16,26),
+(6,1,14,46,26,40,16,26),
+(6,1,15,47,27,41,17,26),
+(6,1,16,48,28,43,17,27),
+(6,1,17,50,29,44,17,27),
+(6,1,18,51,30,45,17,27),
+(6,1,19,53,31,47,17,28),
+(6,1,20,54,32,48,17,28),
+(6,1,21,56,33,50,17,28),
+(6,1,22,58,34,51,18,29),
+(6,1,23,59,35,52,18,29),
+(6,1,24,61,36,54,18,30),
+(6,1,25,62,37,55,18,30),
+(6,1,26,64,38,57,18,30),
+(6,1,27,66,39,58,18,31),
+(6,1,28,67,40,60,18,31),
+(6,1,29,69,41,61,19,32),
+(6,1,30,71,42,63,19,32),
+(6,1,31,72,43,64,19,32),
+(6,1,32,74,44,66,19,33),
+(6,1,33,76,45,67,19,33),
+(6,1,34,77,46,69,20,34),
+(6,1,35,79,47,71,20,34),
+(6,1,36,81,48,72,20,35),
+(6,1,37,83,49,74,20,35),
+(6,1,38,85,50,76,20,35),
+(6,1,39,86,51,77,21,36),
+(6,1,40,88,53,79,21,36),
+(6,1,41,90,54,81,21,37),
+(6,1,42,92,55,82,21,37),
+(6,1,43,94,56,84,21,38),
+(6,1,44,96,57,86,22,38),
+(6,1,45,98,58,87,22,39),
+(6,1,46,99,60,89,22,39),
+(6,1,47,101,61,91,22,40),
+(6,1,48,103,62,93,22,40),
+(6,1,49,105,63,94,23,41),
+(6,1,50,107,65,96,23,41),
+(6,1,51,109,66,98,23,42),
+(6,1,52,111,67,100,23,42),
+(6,1,53,113,68,102,24,43),
+(6,1,54,115,70,104,24,44),
+(6,1,55,117,71,105,24,44),
+(6,1,56,119,72,107,24,45),
+(6,1,57,122,73,109,25,45),
+(6,1,58,124,75,111,25,46),
+(6,1,59,126,76,113,25,46),
+(6,1,60,128,77,115,25,47),
+(6,1,61,130,79,117,26,48),
+(6,1,62,132,80,119,26,48),
+(6,1,63,134,81,121,26,49),
+(6,1,64,137,83,123,26,49),
+(6,1,65,139,84,125,27,50),
+(6,1,66,141,85,127,27,51),
+(6,1,67,143,87,129,27,51),
+(6,1,68,145,88,131,27,52),
+(6,1,69,148,90,133,28,52),
+(6,1,70,150,91,135,28,53),
+(6,1,71,153,92,137,28,54),
+(6,1,72,155,94,140,28,55),
+(6,1,73,158,96,142,28,56),
+(6,1,74,161,97,145,29,56),
+(6,1,75,164,99,147,29,57),
+(6,1,76,167,101,150,29,58),
+(6,1,77,170,103,153,30,59),
+(6,1,78,173,104,155,30,59),
+(6,1,79,176,106,164,30,60),
+(6,1,80,179,108,170,31,61),
+
+(6,3,1,25,18,23,15,23),
+(6,3,2,25,19,24,16,24),
+(6,3,3,26,21,25,16,24),
+(6,3,4,26,22,26,17,25),
+(6,3,5,27,24,27,17,25),
+(6,3,6,27,25,28,18,26),
+(6,3,7,28,26,28,19,27),
+(6,3,8,28,28,29,19,27),
+(6,3,9,28,29,30,20,28),
+(6,3,10,29,31,31,20,29),
+(6,3,11,29,32,32,21,29),
+(6,3,12,30,34,33,22,30),
+(6,3,13,30,35,34,22,31),
+(6,3,14,31,37,35,23,32),
+(6,3,15,31,38,36,24,32),
+(6,3,16,32,40,37,24,33),
+(6,3,17,32,41,39,25,34),
+(6,3,18,33,43,40,26,35),
+(6,3,19,33,45,41,27,35),
+(6,3,20,34,46,42,27,36),
+(6,3,21,34,48,43,28,37),
+(6,3,22,35,50,44,29,38),
+(6,3,23,35,51,45,29,38),
+(6,3,24,36,53,46,30,39),
+(6,3,25,37,55,47,31,40),
+(6,3,26,37,56,48,32,41),
+(6,3,27,38,58,50,32,42),
+(6,3,28,38,60,51,33,42),
+(6,3,29,39,62,52,34,43),
+(6,3,30,39,63,53,35,44),
+(6,3,31,40,65,54,36,45),
+(6,3,32,41,67,56,36,46),
+(6,3,33,41,69,57,37,47),
+(6,3,34,42,71,58,38,48),
+(6,3,35,43,72,59,39,48),
+(6,3,36,43,74,61,40,49),
+(6,3,37,44,76,62,40,50),
+(6,3,38,45,78,63,41,51),
+(6,3,39,45,80,64,42,52),
+(6,3,40,46,82,66,43,53),
+(6,3,41,47,84,67,44,54),
+(6,3,42,47,86,68,45,55),
+(6,3,43,48,88,70,46,56),
+(6,3,44,49,90,71,46,57),
+(6,3,45,49,92,72,47,58),
+(6,3,46,50,94,74,48,59),
+(6,3,47,51,96,75,49,60),
+(6,3,48,51,98,77,50,61),
+(6,3,49,52,100,78,51,62),
+(6,3,50,53,102,79,52,63),
+(6,3,51,54,104,81,53,64),
+(6,3,52,54,106,82,54,65),
+(6,3,53,55,108,84,55,66),
+(6,3,54,56,110,85,56,67),
+(6,3,55,57,112,87,57,68),
+(6,3,56,57,114,88,58,69),
+(6,3,57,58,117,90,59,70),
+(6,3,58,59,119,91,60,71),
+(6,3,59,60,121,93,61,72),
+(6,3,60,61,123,94,62,74),
+(6,3,61,61,125,96,63,75),
+(6,3,62,62,128,97,64,76),
+(6,3,63,63,130,99,65,77),
+(6,3,64,64,132,100,66,78),
+(6,3,65,65,134,102,67,79),
+(6,3,66,66,137,104,68,80),
+(6,3,67,66,139,105,69,81),
+(6,3,68,67,141,107,70,83),
+(6,3,69,68,144,108,71,84),
+(6,3,70,69,146,110,72,85),
+(6,3,71,70,149,112,73,86),
+(6,3,72,71,152,114,74,87),
+(6,3,73,72,155,116,75,89),
+(6,3,74,73,158,118,77,90),
+(6,3,75,74,161,120,78,92),
+(6,3,76,75,164,122,79,93),
+(6,3,77,76,167,124,81,95),
+(6,3,78,77,176,126,85,96),
+(6,3,79,78,179,128,86,98),
+(6,3,80,79,183,130,88,99),
+
+(6,6,1,28,15,24,15,22),
+(6,6,2,29,16,25,15,22),
+(6,6,3,31,17,26,15,23),
+(6,6,4,32,17,27,15,23),
+(6,6,5,33,18,29,15,23),
+(6,6,6,34,19,30,15,23),
+(6,6,7,36,20,31,16,24),
+(6,6,8,37,21,32,16,24),
+(6,6,9,38,22,34,16,24),
+(6,6,10,40,22,35,16,25),
+(6,6,11,41,23,36,16,25),
+(6,6,12,43,24,37,16,25),
+(6,6,13,44,25,39,16,26),
+(6,6,14,46,26,40,16,26),
+(6,6,15,47,27,41,17,26),
+(6,6,16,48,28,43,17,27),
+(6,6,17,50,29,44,17,27),
+(6,6,18,51,30,45,17,27),
+(6,6,19,53,31,47,17,28),
+(6,6,20,54,32,48,17,28),
+(6,6,21,56,33,50,17,28),
+(6,6,22,58,34,51,18,29),
+(6,6,23,59,35,52,18,29),
+(6,6,24,61,36,54,18,30),
+(6,6,25,62,37,55,18,30),
+(6,6,26,64,38,57,18,30),
+(6,6,27,66,39,58,18,31),
+(6,6,28,67,40,60,18,31),
+(6,6,29,69,41,61,19,32),
+(6,6,30,71,42,63,19,32),
+(6,6,31,72,43,64,19,32),
+(6,6,32,74,44,66,19,33),
+(6,6,33,76,45,67,19,33),
+(6,6,34,77,46,69,20,34),
+(6,6,35,79,47,71,20,34),
+(6,6,36,81,48,72,20,35),
+(6,6,37,83,49,74,20,35),
+(6,6,38,85,50,76,20,35),
+(6,6,39,86,51,77,21,36),
+(6,6,40,88,53,79,21,36),
+(6,6,41,90,54,81,21,37),
+(6,6,42,92,55,82,21,37),
+(6,6,43,94,56,84,21,38),
+(6,6,44,96,57,86,22,38),
+(6,6,45,98,58,87,22,39),
+(6,6,46,99,60,89,22,39),
+(6,6,47,101,60,91,22,40),
+(6,6,48,103,61,93,22,40),
+(6,6,49,105,62,94,23,41),
+(6,6,50,107,63,96,23,41),
+(6,6,51,109,64,97,23,42),
+(6,6,52,110,65,98,23,42),
+(6,6,53,111,66,99,24,43),
+(6,6,54,112,67,100,24,44),
+(6,6,55,113,68,101,24,44),
+(6,6,56,116,70,104,24,45),
+(6,6,57,121,71,106,24,45),
+(6,6,58,123,72,108,25,46),
+(6,6,59,123,74,110,25,46),
+(6,6,60,125,75,112,25,47),
+(6,6,61,127,76,114,25,48),
+(6,6,62,133,78,116,25,48),
+(6,6,63,135,79,119,26,49),
+(6,6,64,139,81,121,26,49),
+(6,6,65,142,82,123,26,50),
+(6,6,66,146,84,126,26,51),
+(6,6,67,150,85,132,27,51),
+(6,6,68,153,87,137,27,52),
+(6,6,69,157,88,140,27,53),
+(6,6,70,160,90,143,27,53),
+(6,6,71,163,92,146,28,54),
+(6,6,72,165,93,148,28,55),
+(6,6,73,167,95,150,28,56),
+(6,6,74,171,97,153,28,56),
+(6,6,75,174,98,156,29,57),
+(6,6,76,178,100,156,29,58),
+(6,6,77,179,102,156,29,59),
+(6,6,78,179,103,156,29,59),
+(6,6,79,182,105,159,30,60),
+(6,6,80,185,107,162,30,61),
+
+(6,7,1,26,15,23,16,24),
+(6,7,2,27,15,24,17,25),
+(6,7,3,28,16,25,18,26),
+(6,7,4,28,16,26,19,27),
+(6,7,5,29,17,27,20,28),
+(6,7,6,30,17,28,21,29),
+(6,7,7,31,18,29,22,30),
+(6,7,8,32,18,30,23,31),
+(6,7,9,33,19,31,24,32),
+(6,7,10,34,19,32,25,33),
+(6,7,11,35,20,33,26,35),
+(6,7,12,35,20,34,27,36),
+(6,7,13,36,21,35,28,37),
+(6,7,14,37,21,36,29,38),
+(6,7,15,38,22,37,30,39),
+(6,7,16,39,22,39,31,40),
+(6,7,17,40,23,40,32,42),
+(6,7,18,41,23,41,33,43),
+(6,7,19,42,24,42,34,44),
+(6,7,20,43,24,43,35,45),
+(6,7,21,44,25,44,36,46),
+(6,7,22,45,25,45,37,48),
+(6,7,23,46,26,47,38,49),
+(6,7,24,47,27,48,40,50),
+(6,7,25,48,27,49,41,51),
+(6,7,26,49,28,50,42,53),
+(6,7,27,51,28,52,43,54),
+(6,7,28,52,29,53,44,55),
+(6,7,29,53,29,54,45,57),
+(6,7,30,54,30,55,47,58),
+(6,7,31,55,31,57,48,59),
+(6,7,32,56,31,58,49,61),
+(6,7,33,57,32,59,50,62),
+(6,7,34,58,33,61,51,64),
+(6,7,35,60,33,62,53,65),
+(6,7,36,61,34,63,54,66),
+(6,7,37,62,34,65,55,68),
+(6,7,38,63,35,66,57,69),
+(6,7,39,64,36,67,58,71),
+(6,7,40,66,36,69,59,72),
+(6,7,41,67,37,70,60,74),
+(6,7,42,68,38,72,62,75),
+(6,7,43,69,38,73,63,77),
+(6,7,44,70,39,74,64,78),
+(6,7,45,72,40,76,66,80),
+(6,7,46,73,41,77,67,81),
+(6,7,47,74,41,79,69,83),
+(6,7,48,76,42,80,70,84),
+(6,7,49,77,43,82,71,86),
+(6,7,50,78,43,83,73,88),
+(6,7,51,80,44,85,74,89),
+(6,7,52,81,45,86,76,91),
+(6,7,53,82,46,88,77,92),
+(6,7,54,84,46,90,78,94),
+(6,7,55,85,47,91,80,96),
+(6,7,56,86,48,93,81,97),
+(6,7,57,88,49,94,83,99),
+(6,7,58,89,49,96,84,101),
+(6,7,59,91,50,97,86,102),
+(6,7,60,92,51,99,87,104),
+(6,7,61,94,52,101,89,106),
+(6,7,62,95,52,102,90,108),
+(6,7,63,96,53,104,92,109),
+(6,7,64,98,54,106,93,111),
+(6,7,65,99,55,107,95,113),
+(6,7,66,101,56,109,97,115),
+(6,7,67,102,57,111,98,117),
+(6,7,68,104,57,113,100,118),
+(6,7,69,105,58,114,101,120),
+(6,7,70,107,59,116,103,122),
+(6,7,71,108,60,118,113,124),
+(6,7,72,110,61,120,117,127),
+(6,7,73,112,62,122,119,129),
+(6,7,74,114,63,125,122,131),
+(6,7,75,116,64,127,124,133),
+(6,7,76,118,65,129,126,136),
+(6,7,77,119,66,131,128,138),
+(6,7,78,121,67,133,130,140),
+(6,7,79,123,68,136,133,143),
+(6,7,80,125,69,138,135,145),
+
+(6,11,1,26,15,22,17,24),
+(6,11,2,27,16,23,18,25),
+(6,11,3,27,16,23,19,26),
+(6,11,4,28,17,24,20,27),
+(6,11,5,28,17,25,21,29),
+(6,11,6,29,18,25,22,30),
+(6,11,7,29,18,26,23,31),
+(6,11,8,30,19,27,24,32),
+(6,11,9,30,19,27,26,34),
+(6,11,10,31,20,28,27,35),
+(6,11,11,32,20,29,28,36),
+(6,11,12,32,21,29,29,37),
+(6,11,13,33,21,30,30,39),
+(6,11,14,33,22,31,31,40),
+(6,11,15,34,23,32,32,41),
+(6,11,16,35,23,32,34,43),
+(6,11,17,35,24,33,35,44),
+(6,11,18,36,24,34,36,45),
+(6,11,19,37,25,35,37,47),
+(6,11,20,37,26,35,39,48),
+(6,11,21,38,26,36,40,50),
+(6,11,22,39,27,37,41,51),
+(6,11,23,39,28,38,42,52),
+(6,11,24,40,28,39,44,54),
+(6,11,25,41,29,39,45,55),
+(6,11,26,41,30,40,46,57),
+(6,11,27,42,30,41,47,58),
+(6,11,28,43,31,42,49,60),
+(6,11,29,44,32,43,50,61),
+(6,11,30,44,32,44,52,63),
+(6,11,31,45,33,44,53,64),
+(6,11,32,46,34,45,54,66),
+(6,11,33,47,34,46,56,67),
+(6,11,34,47,35,47,57,69),
+(6,11,35,48,36,48,58,71),
+(6,11,36,49,36,49,60,72),
+(6,11,37,50,37,50,61,74),
+(6,11,38,51,38,51,63,76),
+(6,11,39,52,39,52,64,77),
+(6,11,40,52,39,53,66,79),
+(6,11,41,53,40,54,67,81),
+(6,11,42,54,41,55,69,82),
+(6,11,43,55,42,56,70,84),
+(6,11,44,56,43,57,72,86),
+(6,11,45,57,43,57,73,87),
+(6,11,46,57,44,58,75,89),
+(6,11,47,58,45,60,76,91),
+(6,11,48,59,46,61,78,93),
+(6,11,49,60,47,62,79,94),
+(6,11,50,61,47,63,81,96),
+(6,11,51,62,48,64,83,98),
+(6,11,52,63,49,65,84,100),
+(6,11,53,64,50,66,86,102),
+(6,11,54,65,51,67,87,104),
+(6,11,55,66,51,68,89,105),
+(6,11,56,67,52,69,91,107),
+(6,11,57,68,53,70,92,109),
+(6,11,58,69,54,71,94,111),
+(6,11,59,70,55,72,96,113),
+(6,11,60,71,56,73,97,115),
+(6,11,61,72,57,74,99,117),
+(6,11,62,73,58,76,101,119),
+(6,11,63,74,59,77,103,121),
+(6,11,64,75,59,78,104,123),
+(6,11,65,76,60,79,106,125),
+(6,11,66,77,61,80,108,127),
+(6,11,67,78,62,81,110,129),
+(6,11,68,79,63,83,111,131),
+(6,11,69,80,64,84,113,133),
+(6,11,70,81,65,85,115,135),
+(6,11,71,83,66,86,117,137),
+(6,11,72,84,68,88,120,140),
+(6,11,73,85,69,89,122,142),
+(6,11,74,86,70,91,124,145),
+(6,11,75,88,71,92,126,147),
+(6,11,76,89,72,94,128,150),
+(6,11,77,90,73,95,131,153),
+(6,11,78,92,75,97,133,155),
+(6,11,79,93,76,98,136,158),
+(6,11,80,94,77,100,138,185),
+
+(7,1,1,18,23,21,24,20),
+(7,1,2,19,24,22,24,20),
+(7,1,3,21,25,23,24,21),
+(7,1,4,22,25,25,24,21),
+(7,1,5,23,26,26,24,21),
+(7,1,6,25,27,27,24,21),
+(7,1,7,26,28,28,24,22),
+(7,1,8,27,29,29,25,22),
+(7,1,9,29,29,31,25,22),
+(7,1,10,30,30,32,25,23),
+(7,1,11,32,31,33,25,23),
+(7,1,12,33,32,34,25,23),
+(7,1,13,34,33,36,25,24),
+(7,1,14,36,34,37,25,24),
+(7,1,15,37,35,38,25,24),
+(7,1,16,39,36,40,25,25),
+(7,1,17,40,36,41,25,25),
+(7,1,18,42,37,43,26,25),
+(7,1,19,43,38,44,26,26),
+(7,1,20,45,39,45,26,26),
+(7,1,21,47,40,47,26,26),
+(7,1,22,48,41,48,26,27),
+(7,1,23,50,42,50,26,27),
+(7,1,24,51,43,51,26,28),
+(7,1,25,53,44,52,27,28),
+(7,1,26,55,45,54,27,28),
+(7,1,27,56,46,55,27,29),
+(7,1,28,58,47,57,27,29),
+(7,1,29,59,48,58,27,30),
+(7,1,30,61,49,60,27,30),
+(7,1,31,63,50,62,27,30),
+(7,1,32,65,51,63,28,31),
+(7,1,33,66,52,65,28,31),
+(7,1,34,68,53,66,28,32),
+(7,1,35,70,55,68,28,32),
+(7,1,36,72,56,69,28,33),
+(7,1,37,73,57,71,29,33),
+(7,1,38,75,58,73,29,34),
+(7,1,39,77,59,74,29,34),
+(7,1,40,79,60,76,29,35),
+(7,1,41,81,61,78,29,35),
+(7,1,42,82,62,79,30,35),
+(7,1,43,84,64,81,30,36),
+(7,1,44,86,65,83,30,36),
+(7,1,45,88,66,85,30,37),
+(7,1,46,90,67,86,30,37),
+(7,1,47,92,68,88,31,38),
+(7,1,48,94,70,90,31,38),
+(7,1,49,96,71,92,31,39),
+(7,1,50,98,72,93,31,40),
+(7,1,51,100,73,95,32,40),
+(7,1,52,102,75,97,32,41),
+(7,1,53,104,76,99,32,41),
+(7,1,54,106,77,101,32,42),
+(7,1,55,108,78,103,33,42),
+(7,1,56,110,80,104,33,43),
+(7,1,57,112,81,106,33,43),
+(7,1,58,114,82,108,33,44),
+(7,1,59,116,84,110,34,44),
+(7,1,60,118,85,112,34,45),
+(7,1,61,120,86,114,34,46),
+(7,1,62,122,88,116,35,46),
+(7,1,63,125,89,118,35,47),
+(7,1,64,127,91,120,35,47),
+(7,1,65,129,92,122,35,48),
+(7,1,66,131,93,124,36,49),
+(7,1,67,133,95,126,36,49),
+(7,1,68,136,96,128,36,50),
+(7,1,69,138,98,130,37,50),
+(7,1,70,140,99,132,37,51),
+(7,1,71,143,100,134,37,52),
+(7,1,72,145,102,137,37,53),
+(7,1,73,148,104,139,37,54),
+(7,1,74,151,105,142,38,54),
+(7,1,75,154,107,144,38,55),
+(7,1,76,157,109,147,38,56),
+(7,1,77,163,111,153,39,57),
+(7,1,78,169,112,158,39,57),
+(7,1,79,172,114,161,39,58),
+(7,1,80,175,116,164,40,59),
+
+(7,4,1,16,26,20,24,20),
+(7,4,2,17,27,21,24,20),
+(7,4,3,18,29,21,24,21),
+(7,4,4,18,30,22,24,21),
+(7,4,5,19,32,23,25,21),
+(7,4,6,20,33,24,25,22),
+(7,4,7,21,35,24,25,22),
+(7,4,8,22,36,25,25,23),
+(7,4,9,22,38,26,25,23),
+(7,4,10,23,39,26,25,23),
+(7,4,11,24,41,27,25,24),
+(7,4,12,25,42,28,26,24),
+(7,4,13,26,44,29,26,25),
+(7,4,14,27,46,30,26,25),
+(7,4,15,28,47,30,26,25),
+(7,4,16,28,49,31,26,26),
+(7,4,17,29,50,32,27,26),
+(7,4,18,30,52,33,27,27),
+(7,4,19,31,54,34,27,27),
+(7,4,20,32,56,35,27,28),
+(7,4,21,33,57,35,27,28),
+(7,4,22,34,59,36,28,29),
+(7,4,23,35,61,37,28,29),
+(7,4,24,36,62,38,28,30),
+(7,4,25,37,64,39,28,30),
+(7,4,26,38,66,40,29,31),
+(7,4,27,39,68,41,29,31),
+(7,4,28,40,70,42,29,32),
+(7,4,29,41,72,43,29,32),
+(7,4,30,42,73,43,29,33),
+(7,4,31,43,75,44,30,33),
+(7,4,32,44,77,45,30,34),
+(7,4,33,45,79,46,30,34),
+(7,4,34,46,81,47,31,35),
+(7,4,35,47,83,48,31,35),
+(7,4,36,48,85,49,31,36),
+(7,4,37,49,87,50,31,36),
+(7,4,38,50,89,51,32,37),
+(7,4,39,51,91,52,32,38),
+(7,4,40,53,93,53,32,38),
+(7,4,41,54,95,54,33,39),
+(7,4,42,55,97,55,33,39),
+(7,4,43,56,99,56,33,40),
+(7,4,44,57,101,57,33,40),
+(7,4,45,58,103,59,34,41),
+(7,4,46,59,105,60,34,42),
+(7,4,47,61,107,61,34,42),
+(7,4,48,62,110,62,35,43),
+(7,4,49,63,112,63,35,44),
+(7,4,50,64,114,64,35,44),
+(7,4,51,65,116,65,36,45),
+(7,4,52,67,118,66,36,45),
+(7,4,53,68,121,67,36,46),
+(7,4,54,69,123,69,37,47),
+(7,4,55,70,125,70,37,47),
+(7,4,56,72,127,71,37,48),
+(7,4,57,73,130,72,38,49),
+(7,4,58,74,132,73,38,49),
+(7,4,59,75,134,74,39,50),
+(7,4,60,77,137,76,39,51),
+(7,4,61,78,139,77,39,51),
+(7,4,62,79,141,78,40,52),
+(7,4,63,81,144,79,40,53),
+(7,4,64,82,146,80,41,54),
+(7,4,65,83,149,82,41,54),
+(7,4,66,85,151,83,41,55),
+(7,4,67,86,154,84,42,56),
+(7,4,68,87,156,85,42,57),
+(7,4,69,89,158,87,43,57),
+(7,4,70,90,161,88,43,58),
+(7,4,71,92,164,89,44,59),
+(7,4,72,94,167,91,45,59),
+(7,4,73,95,170,93,45,60),
+(7,4,74,97,173,94,46,61),
+(7,4,75,99,176,96,46,62),
+(7,4,76,100,179,97,46,63),
+(7,4,77,102,182,102,47,64),
+(7,4,78,104,186,105,47,65),
+(7,4,79,106,189,106,48,66),
+(7,4,80,108,192,108,48,67),
+
+(7,6,1,18,23,21,24,20),
+(7,6,2,19,24,22,24,20),
+(7,6,3,21,25,23,24,21),
+(7,6,4,22,25,25,24,21),
+(7,6,5,23,26,26,24,21),
+(7,6,6,25,27,27,24,21),
+(7,6,7,26,28,28,24,22),
+(7,6,8,27,29,29,25,22),
+(7,6,9,29,29,31,25,22),
+(7,6,10,30,30,32,25,23),
+(7,6,11,32,31,33,25,23),
+(7,6,12,33,32,34,25,23),
+(7,6,13,34,33,36,25,24),
+(7,6,14,36,34,37,25,24),
+(7,6,15,37,35,38,25,24),
+(7,6,16,39,36,40,25,25),
+(7,6,17,40,36,41,25,25),
+(7,6,18,42,37,43,26,25),
+(7,6,19,43,38,44,26,26),
+(7,6,20,45,39,45,26,26),
+(7,6,21,47,40,47,26,26),
+(7,6,22,48,41,48,26,27),
+(7,6,23,50,42,50,26,27),
+(7,6,24,51,43,51,26,28),
+(7,6,25,53,44,52,27,28),
+(7,6,26,55,45,54,27,28),
+(7,6,27,56,46,55,27,29),
+(7,6,28,58,47,57,27,29),
+(7,6,29,59,48,58,27,30),
+(7,6,30,61,49,60,27,30),
+(7,6,31,63,50,62,27,30),
+(7,6,32,65,51,63,28,31),
+(7,6,33,66,52,65,28,31),
+(7,6,34,68,53,66,28,32),
+(7,6,35,70,55,68,28,32),
+(7,6,36,72,56,69,28,33),
+(7,6,37,73,57,71,29,33),
+(7,6,38,75,58,73,29,34),
+(7,6,39,77,59,74,29,34),
+(7,6,40,79,60,76,29,35),
+(7,6,41,81,61,78,29,35),
+(7,6,42,82,62,79,30,35),
+(7,6,43,84,64,81,30,36),
+(7,6,44,86,65,83,30,36),
+(7,6,45,88,66,85,30,37),
+(7,6,46,90,67,86,30,37),
+(7,6,47,92,68,88,31,38),
+(7,6,48,94,70,90,31,38),
+(7,6,49,96,71,92,31,39),
+(7,6,50,98,72,93,31,40),
+(7,6,51,99,72,93,32,40),
+(7,6,52,100,73,95,32,41),
+(7,6,53,101,74,96,32,41),
+(7,6,54,102,75,97,32,42),
+(7,6,55,103,76,98,33,42),
+(7,6,56,106,78,101,33,43),
+(7,6,57,111,79,103,33,43),
+(7,6,58,113,80,105,34,44),
+(7,6,59,116,82,107,34,44),
+(7,6,60,118,83,109,34,45),
+(7,6,61,120,84,111,34,46),
+(7,6,62,127,86,119,34,46),
+(7,6,63,129,87,122,35,47),
+(7,6,64,132,89,125,35,47),
+(7,6,65,135,90,127,35,48),
+(7,6,66,137,92,130,35,49),
+(7,6,67,138,93,130,36,49),
+(7,6,68,140,95,131,36,50),
+(7,6,69,142,96,131,36,51),
+(7,6,70,145,98,132,36,51),
+(7,6,71,148,100,135,37,52),
+(7,6,72,150,101,137,37,53),
+(7,6,73,153,103,140,37,54),
+(7,6,74,154,105,142,37,54),
+(7,6,75,155,106,145,38,55),
+(7,6,76,158,108,151,38,56),
+(7,6,77,161,110,157,38,57),
+(7,6,78,164,111,162,38,57),
+(7,6,79,167,113,165,39,58),
+(7,6,80,170,115,168,39,59),
+
+(7,8,1,15,23,19,27,22),
+(7,8,2,15,23,19,28,23),
+(7,8,3,15,23,20,30,25),
+(7,8,4,15,23,20,31,26),
+(7,8,5,15,24,20,32,27),
+(7,8,6,15,24,20,34,29),
+(7,8,7,16,24,21,35,30),
+(7,8,8,16,24,21,37,31),
+(7,8,9,16,24,21,38,33),
+(7,8,10,16,24,22,40,34),
+(7,8,11,16,25,22,41,36),
+(7,8,12,16,25,22,42,37),
+(7,8,13,16,25,23,44,38),
+(7,8,14,16,25,23,45,40),
+(7,8,15,17,25,23,47,41),
+(7,8,16,17,25,24,49,43),
+(7,8,17,17,26,24,50,44),
+(7,8,18,17,26,24,52,46),
+(7,8,19,17,26,25,53,47),
+(7,8,20,17,26,25,55,49),
+(7,8,21,17,26,26,57,51),
+(7,8,22,18,27,26,58,52),
+(7,8,23,18,27,26,60,54),
+(7,8,24,18,27,27,61,55),
+(7,8,25,18,27,27,63,57),
+(7,8,26,18,28,27,65,59),
+(7,8,27,18,28,28,67,60),
+(7,8,28,18,28,28,68,62),
+(7,8,29,19,28,29,70,64),
+(7,8,30,19,29,29,72,65),
+(7,8,31,19,29,30,74,67),
+(7,8,32,19,29,30,75,69),
+(7,8,33,19,29,30,77,70),
+(7,8,34,20,30,31,79,72),
+(7,8,35,20,30,31,81,74),
+(7,8,36,20,30,32,83,76),
+(7,8,37,20,30,32,85,78),
+(7,8,38,20,31,33,86,79),
+(7,8,39,21,31,33,88,81),
+(7,8,40,21,31,34,90,83),
+(7,8,41,21,32,34,92,85),
+(7,8,42,21,32,35,94,87),
+(7,8,43,21,32,35,96,89),
+(7,8,44,22,32,36,98,91),
+(7,8,45,22,33,36,100,92),
+(7,8,46,22,33,37,102,94),
+(7,8,47,22,33,37,104,96),
+(7,8,48,22,34,38,106,98),
+(7,8,49,23,34,38,108,100),
+(7,8,50,23,34,39,110,102),
+(7,8,51,23,35,39,112,104),
+(7,8,52,23,35,40,114,106),
+(7,8,53,24,35,40,117,108),
+(7,8,54,24,36,41,119,110),
+(7,8,55,24,36,41,121,112),
+(7,8,56,24,37,42,123,114),
+(7,8,57,25,37,42,125,117),
+(7,8,58,25,37,43,127,119),
+(7,8,59,25,38,43,130,121),
+(7,8,60,25,38,44,132,123),
+(7,8,61,26,38,45,134,125),
+(7,8,62,26,39,45,136,127),
+(7,8,63,26,39,46,139,129),
+(7,8,64,26,40,46,141,132),
+(7,8,65,27,40,47,143,134),
+(7,8,66,27,40,48,146,136),
+(7,8,67,27,41,48,148,138),
+(7,8,68,27,41,49,150,140),
+(7,8,69,28,42,49,153,143),
+(7,8,70,28,42,50,155,145),
+(7,8,71,28,42,51,168,148),
+(7,8,72,28,43,52,168,151),
+(7,8,73,28,43,53,171,154),
+(7,8,74,29,44,53,174,156),
+(7,8,75,29,44,54,177,159),
+(7,8,76,29,44,55,180,162),
+(7,8,77,30,45,56,183,165),
+(7,8,78,30,45,56,186,168),
+(7,8,79,30,46,57,190,171),
+(7,8,80,31,46,58,193,174),
+
+(7,9,1,15,23,20,26,22),
+(7,9,2,15,23,21,27,23),
+(7,9,3,16,24,21,28,24),
+(7,9,4,16,24,22,29,25),
+(7,9,5,16,24,22,31,27),
+(7,9,6,17,25,23,32,28),
+(7,9,7,17,25,23,33,29),
+(7,9,8,17,26,24,34,30),
+(7,9,9,17,26,25,36,31),
+(7,9,10,18,26,25,37,33),
+(7,9,11,18,27,26,38,34),
+(7,9,12,18,27,26,39,35),
+(7,9,13,19,28,27,41,36),
+(7,9,14,19,28,28,42,38),
+(7,9,15,20,28,28,43,39),
+(7,9,16,20,29,29,45,40),
+(7,9,17,20,29,30,46,42),
+(7,9,18,21,30,30,47,43),
+(7,9,19,21,30,31,49,44),
+(7,9,20,21,31,32,50,46),
+(7,9,21,22,31,32,51,47),
+(7,9,22,22,31,33,53,49),
+(7,9,23,23,32,34,54,50),
+(7,9,24,23,32,34,56,51),
+(7,9,25,23,33,35,57,53),
+(7,9,26,24,33,36,59,54),
+(7,9,27,24,34,37,60,56),
+(7,9,28,25,34,37,62,57),
+(7,9,29,25,35,38,63,59),
+(7,9,30,25,35,39,65,60),
+(7,9,31,26,36,40,66,62),
+(7,9,32,26,36,40,68,63),
+(7,9,33,27,37,41,69,65),
+(7,9,34,27,38,42,71,66),
+(7,9,35,28,38,43,73,68),
+(7,9,36,28,39,43,74,69),
+(7,9,37,28,39,44,76,71),
+(7,9,38,29,40,45,77,73),
+(7,9,39,29,40,46,79,74),
+(7,9,40,30,41,47,81,76),
+(7,9,41,30,41,48,82,78),
+(7,9,42,31,42,48,84,79),
+(7,9,43,31,43,49,86,81),
+(7,9,44,32,43,50,88,83),
+(7,9,45,32,44,51,89,84),
+(7,9,46,33,44,52,91,86),
+(7,9,47,33,45,53,93,88),
+(7,9,48,34,46,54,95,89),
+(7,9,49,34,46,54,96,91),
+(7,9,50,35,47,55,98,93),
+(7,9,51,35,48,56,100,95),
+(7,9,52,36,48,57,102,97),
+(7,9,53,36,49,58,104,98),
+(7,9,54,37,50,59,105,100),
+(7,9,55,37,50,60,107,102),
+(7,9,56,38,51,61,109,104),
+(7,9,57,38,52,62,111,106),
+(7,9,58,39,52,63,113,108),
+(7,9,59,40,53,64,115,109),
+(7,9,60,40,54,65,117,111),
+(7,9,61,41,54,66,119,113),
+(7,9,62,41,55,67,121,115),
+(7,9,63,42,56,68,123,117),
+(7,9,64,42,57,69,125,119),
+(7,9,65,43,57,70,127,121),
+(7,9,66,44,58,71,129,123),
+(7,9,67,44,59,72,131,125),
+(7,9,68,45,59,73,133,127),
+(7,9,69,45,60,74,135,129),
+(7,9,70,46,61,75,137,131),
+(7,9,71,47,62,84,147,142),
+(7,9,72,48,62,85,148,144),
+(7,9,73,49,63,85,153,147),
+(7,9,74,49,64,88,153,150),
+(7,9,75,50,65,90,155,152),
+(7,9,76,51,66,91,158,155),
+(7,9,77,52,67,92,161,158),
+(7,9,78,52,68,93,163,161),
+(7,9,79,53,69,95,166,164),
+(7,9,80,54,70,96,170,166),
+
+(8,1,1,24,22,23,16,21),
+(8,1,2,25,23,24,16,21),
+(8,1,3,27,24,25,16,22),
+(8,1,4,28,24,26,16,22),
+(8,1,5,29,25,28,16,22),
+(8,1,6,31,26,29,16,22),
+(8,1,7,32,27,30,17,23),
+(8,1,8,33,28,31,17,23),
+(8,1,9,35,28,33,17,23),
+(8,1,10,36,29,34,17,24),
+(8,1,11,37,30,35,17,24),
+(8,1,12,39,31,36,17,24),
+(8,1,13,40,32,38,17,25),
+(8,1,14,42,33,39,17,25),
+(8,1,15,43,34,40,18,25),
+(8,1,16,45,35,42,18,26),
+(8,1,17,46,35,43,18,26),
+(8,1,18,48,36,44,18,26),
+(8,1,19,49,37,46,18,27),
+(8,1,20,51,38,47,18,27),
+(8,1,21,52,39,49,18,27),
+(8,1,22,54,40,50,18,28),
+(8,1,23,55,41,51,19,28),
+(8,1,24,57,42,53,19,29),
+(8,1,25,59,43,54,19,29),
+(8,1,26,60,44,56,19,29),
+(8,1,27,62,45,57,19,30),
+(8,1,28,63,46,59,19,30),
+(8,1,29,65,47,60,20,31),
+(8,1,30,67,48,62,20,31),
+(8,1,31,69,49,63,20,31),
+(8,1,32,70,50,65,20,32),
+(8,1,33,72,51,67,20,32),
+(8,1,34,74,53,68,20,33),
+(8,1,35,75,54,70,21,33),
+(8,1,36,77,55,71,21,34),
+(8,1,37,79,56,73,21,34),
+(8,1,38,81,57,75,21,35),
+(8,1,39,83,58,76,21,35),
+(8,1,40,84,59,78,22,35),
+(8,1,41,86,60,80,22,36),
+(8,1,42,88,62,81,22,36),
+(8,1,43,90,63,83,22,37),
+(8,1,44,92,64,85,22,37),
+(8,1,45,94,65,86,23,38),
+(8,1,46,96,66,88,23,38),
+(8,1,47,98,67,90,23,39),
+(8,1,48,100,69,92,23,39),
+(8,1,49,102,70,93,24,40),
+(8,1,50,103,71,95,24,40),
+(8,1,51,105,72,97,24,41),
+(8,1,52,107,74,99,24,42),
+(8,1,53,109,75,101,25,42),
+(8,1,54,112,76,103,25,43),
+(8,1,55,114,78,104,25,43),
+(8,1,56,116,79,106,25,44),
+(8,1,57,118,80,108,25,44),
+(8,1,58,120,81,110,26,45),
+(8,1,59,122,83,112,26,45),
+(8,1,60,124,84,114,26,46),
+(8,1,61,126,85,116,27,47),
+(8,1,62,128,87,118,27,47),
+(8,1,63,130,88,120,27,48),
+(8,1,64,133,90,122,27,48),
+(8,1,65,135,91,124,28,49),
+(8,1,66,137,92,126,28,50),
+(8,1,67,139,94,128,28,50),
+(8,1,68,141,95,130,28,51),
+(8,1,69,144,97,132,29,51),
+(8,1,70,146,98,134,29,52),
+(8,1,71,149,99,136,29,53),
+(8,1,72,151,101,139,29,54),
+(8,1,73,154,103,141,29,55),
+(8,1,74,157,104,144,30,55),
+(8,1,75,166,106,151,30,56),
+(8,1,76,172,108,157,30,57),
+(8,1,77,175,110,161,31,58),
+(8,1,78,179,111,163,31,58),
+(8,1,79,182,113,164,31,59),
+(8,1,80,185,115,169,32,60),
+
+(8,3,1,21,25,22,16,22),
+(8,3,2,21,26,23,17,23),
+(8,3,3,22,28,24,17,23),
+(8,3,4,22,29,25,18,24),
+(8,3,5,23,30,26,18,25),
+(8,3,6,23,32,27,19,25),
+(8,3,7,24,33,28,20,26),
+(8,3,8,24,35,28,20,26),
+(8,3,9,25,36,29,21,27),
+(8,3,10,25,38,30,21,28),
+(8,3,11,25,39,31,22,29),
+(8,3,12,26,41,32,23,29),
+(8,3,13,26,42,33,23,30),
+(8,3,14,27,44,34,24,31),
+(8,3,15,27,45,35,25,31),
+(8,3,16,28,47,36,25,32),
+(8,3,17,28,48,38,26,33),
+(8,3,18,29,50,39,27,34),
+(8,3,19,29,51,40,28,34),
+(8,3,20,30,53,41,28,35),
+(8,3,21,31,55,42,29,36),
+(8,3,22,31,56,43,30,37),
+(8,3,23,32,58,44,30,37),
+(8,3,24,32,60,45,31,38),
+(8,3,25,33,61,46,32,39),
+(8,3,26,33,63,48,33,40),
+(8,3,27,34,65,49,33,41),
+(8,3,28,35,66,50,34,41),
+(8,3,29,35,68,51,35,42),
+(8,3,30,36,70,52,36,43),
+(8,3,31,36,72,53,37,44),
+(8,3,32,37,73,55,37,45),
+(8,3,33,38,75,56,38,46),
+(8,3,34,38,77,57,39,47),
+(8,3,35,39,79,58,40,48),
+(8,3,36,39,81,60,41,48),
+(8,3,37,40,83,61,41,49),
+(8,3,38,41,85,62,42,50),
+(8,3,39,41,86,63,43,51),
+(8,3,40,42,88,65,44,52),
+(8,3,41,43,90,66,45,53),
+(8,3,42,43,92,67,46,54),
+(8,3,43,44,94,69,47,55),
+(8,3,44,45,96,70,47,56),
+(8,3,45,45,98,71,48,57),
+(8,3,46,46,100,73,49,58),
+(8,3,47,47,102,74,50,59),
+(8,3,48,48,104,76,51,60),
+(8,3,49,48,106,77,52,61),
+(8,3,50,49,108,78,53,62),
+(8,3,51,50,110,80,54,63),
+(8,3,52,51,113,81,55,64),
+(8,3,53,51,115,83,56,65),
+(8,3,54,52,117,84,57,66),
+(8,3,55,53,119,86,58,67),
+(8,3,56,54,121,87,59,68),
+(8,3,57,54,123,89,60,69),
+(8,3,58,55,126,90,61,70),
+(8,3,59,56,128,92,62,71),
+(8,3,60,57,130,93,63,73),
+(8,3,61,58,132,95,64,74),
+(8,3,62,58,134,96,65,75),
+(8,3,63,59,137,98,66,76),
+(8,3,64,60,139,99,67,77),
+(8,3,65,61,141,101,68,78),
+(8,3,66,62,144,103,69,79),
+(8,3,67,62,146,104,70,80),
+(8,3,68,63,148,106,71,82),
+(8,3,69,64,151,107,72,83),
+(8,3,70,65,153,109,73,84),
+(8,3,71,66,156,111,74,85),
+(8,3,72,67,159,113,75,86),
+(8,3,73,68,162,115,76,88),
+(8,3,74,69,165,117,78,89),
+(8,3,75,70,174,119,82,91),
+(8,3,76,71,177,121,83,92),
+(8,3,77,72,180,123,85,94),
+(8,3,78,73,184,125,86,95),
+(8,3,79,74,187,127,87,97),
+(8,3,80,75,190,129,89,98),
+
+(8,4,1,22,25,22,16,21),
+(8,4,2,23,26,23,16,21),
+(8,4,3,24,28,23,16,22),
+(8,4,4,24,29,24,16,22),
+(8,4,5,25,31,25,17,22),
+(8,4,6,26,32,25,17,23),
+(8,4,7,27,34,26,17,23),
+(8,4,8,27,35,27,17,24),
+(8,4,9,28,37,28,17,24),
+(8,4,10,29,38,28,18,24),
+(8,4,11,30,40,29,18,25),
+(8,4,12,31,41,30,18,25),
+(8,4,13,32,43,31,18,26),
+(8,4,14,32,45,32,18,26),
+(8,4,15,33,46,32,19,26),
+(8,4,16,34,48,33,19,27),
+(8,4,17,35,50,34,19,27),
+(8,4,18,36,51,35,19,28),
+(8,4,19,37,53,36,19,28),
+(8,4,20,38,55,36,20,29),
+(8,4,21,39,56,37,20,29),
+(8,4,22,40,58,38,20,30),
+(8,4,23,41,60,39,20,30),
+(8,4,24,42,62,40,20,31),
+(8,4,25,43,63,41,21,31),
+(8,4,26,44,65,42,21,32),
+(8,4,27,45,67,43,21,32),
+(8,4,28,46,69,44,21,33),
+(8,4,29,47,71,44,22,33),
+(8,4,30,48,72,45,22,34),
+(8,4,31,49,74,46,22,34),
+(8,4,32,50,76,47,22,35),
+(8,4,33,51,78,48,23,35),
+(8,4,34,52,80,49,23,36),
+(8,4,35,53,82,50,23,36),
+(8,4,36,54,84,51,24,37),
+(8,4,37,55,86,52,24,37),
+(8,4,38,56,88,53,24,38),
+(8,4,39,57,90,54,24,38),
+(8,4,40,58,92,55,25,39),
+(8,4,41,59,94,56,25,40),
+(8,4,42,60,96,57,25,40),
+(8,4,43,62,98,58,26,41),
+(8,4,44,63,100,59,26,41),
+(8,4,45,64,102,60,26,42),
+(8,4,46,65,104,61,27,43),
+(8,4,47,66,107,63,27,43),
+(8,4,48,67,109,64,27,44),
+(8,4,49,69,111,65,27,44),
+(8,4,50,70,113,66,28,45),
+(8,4,51,71,115,67,28,46),
+(8,4,52,72,117,68,28,46),
+(8,4,53,74,120,69,29,47),
+(8,4,54,75,122,70,29,48),
+(8,4,55,76,124,72,29,48),
+(8,4,56,77,126,73,30,49),
+(8,4,57,79,129,74,30,50),
+(8,4,58,80,131,75,30,50),
+(8,4,59,81,133,76,31,51),
+(8,4,60,82,136,77,31,52),
+(8,4,61,84,138,79,32,52),
+(8,4,62,85,140,80,32,53),
+(8,4,63,86,143,81,32,54),
+(8,4,64,88,145,82,33,55),
+(8,4,65,89,148,84,33,55),
+(8,4,66,90,150,85,33,56),
+(8,4,67,92,153,86,34,57),
+(8,4,68,93,155,87,34,58),
+(8,4,69,95,157,89,35,58),
+(8,4,70,96,160,90,35,59),
+(8,4,71,98,163,94,35,60),
+(8,4,72,100,166,96,36,60),
+(8,4,73,101,169,96,36,61),
+(8,4,74,103,172,97,37,62),
+(8,4,75,105,175,98,37,63),
+(8,4,76,106,178,99,37,64),
+(8,4,77,108,181,105,38,65),
+(8,4,78,110,185,107,38,66),
+(8,4,79,112,188,109,39,67),
+(8,4,80,114,191,110,39,68),
+
+(8,5,1,21,22,21,18,24),
+(8,5,2,21,22,21,19,25),
+(8,5,3,21,22,22,21,27),
+(8,5,4,21,23,22,22,28),
+(8,5,5,22,23,22,23,29),
+(8,5,6,22,23,23,25,31),
+(8,5,7,22,23,23,26,32),
+(8,5,8,22,24,24,27,34),
+(8,5,9,22,24,24,29,35),
+(8,5,10,22,24,24,30,37),
+(8,5,11,23,24,25,32,38),
+(8,5,12,23,24,25,33,40),
+(8,5,13,23,25,26,35,41),
+(8,5,14,23,25,26,36,43),
+(8,5,15,23,25,26,38,44),
+(8,5,16,24,26,27,39,46),
+(8,5,17,24,26,27,41,47),
+(8,5,18,24,26,28,42,49),
+(8,5,19,24,26,28,44,50),
+(8,5,20,24,27,29,45,52),
+(8,5,21,25,27,29,47,54),
+(8,5,22,25,27,30,48,55),
+(8,5,23,25,28,30,50,57),
+(8,5,24,25,28,31,52,59),
+(8,5,25,25,28,31,53,60),
+(8,5,26,26,28,32,55,62),
+(8,5,27,26,29,32,56,64),
+(8,5,28,26,29,33,58,65),
+(8,5,29,26,29,33,60,67),
+(8,5,30,27,30,34,62,69),
+(8,5,31,27,30,34,63,71),
+(8,5,32,27,30,35,65,73),
+(8,5,33,27,31,35,67,74),
+(8,5,34,28,31,36,68,76),
+(8,5,35,28,32,36,70,78),
+(8,5,36,28,32,37,72,80),
+(8,5,37,29,32,37,74,82),
+(8,5,38,29,33,38,76,84),
+(8,5,39,29,33,38,77,86),
+(8,5,40,29,33,39,79,87),
+(8,5,41,30,34,40,81,89),
+(8,5,42,30,34,40,83,91),
+(8,5,43,30,35,41,85,93),
+(8,5,44,31,35,41,87,95),
+(8,5,45,31,35,42,89,97),
+(8,5,46,31,36,43,91,99),
+(8,5,47,32,36,43,93,101),
+(8,5,48,32,37,44,94,103),
+(8,5,49,32,37,44,96,105),
+(8,5,50,33,37,45,98,107),
+(8,5,51,33,38,46,100,110),
+(8,5,52,33,38,46,102,112),
+(8,5,53,34,39,47,104,114),
+(8,5,54,34,39,48,106,116),
+(8,5,55,34,40,48,109,118),
+(8,5,56,35,40,49,111,120),
+(8,5,57,35,41,50,113,122),
+(8,5,58,35,41,50,115,125),
+(8,5,59,36,42,51,117,127),
+(8,5,60,36,42,52,119,129),
+(8,5,61,36,42,52,121,131),
+(8,5,62,37,43,53,123,133),
+(8,5,63,37,43,54,125,136),
+(8,5,64,38,44,55,128,138),
+(8,5,65,38,44,55,130,140),
+(8,5,66,38,45,56,132,143),
+(8,5,67,39,45,57,134,145),
+(8,5,68,39,46,58,136,147),
+(8,5,69,40,46,58,139,150),
+(8,5,70,40,47,59,141,152),
+(8,5,71,40,48,60,144,155),
+(8,5,72,41,48,60,147,158),
+(8,5,73,41,49,61,150,161),
+(8,5,74,42,49,62,152,164),
+(8,5,75,42,50,63,155,167),
+(8,5,76,42,51,64,158,170),
+(8,5,77,43,51,65,161,173),
+(8,5,78,43,52,66,164,176),
+(8,5,79,44,52,67,167,179),
+(8,5,80,44,53,68,170,182),
+
+(8,6,1,24,22,23,16,21),
+(8,6,2,25,23,24,16,21),
+(8,6,3,27,24,25,16,22),
+(8,6,4,28,24,26,16,22),
+(8,6,5,29,25,28,16,22),
+(8,6,6,31,26,29,16,22),
+(8,6,7,32,27,30,17,23),
+(8,6,8,33,28,31,17,23),
+(8,6,9,35,28,33,17,23),
+(8,6,10,36,29,34,17,24),
+(8,6,11,37,30,35,17,24),
+(8,6,12,39,31,36,17,24),
+(8,6,13,40,32,38,17,25),
+(8,6,14,42,33,39,17,25),
+(8,6,15,43,34,40,18,25),
+(8,6,16,45,35,42,18,26),
+(8,6,17,46,35,43,18,26),
+(8,6,18,48,36,44,18,26),
+(8,6,19,49,37,46,18,27),
+(8,6,20,51,38,47,18,27),
+(8,6,21,52,39,49,18,27),
+(8,6,22,54,40,50,18,28),
+(8,6,23,55,41,51,19,28),
+(8,6,24,57,42,53,19,29),
+(8,6,25,59,43,54,19,29),
+(8,6,26,60,44,56,19,29),
+(8,6,27,62,45,57,19,30),
+(8,6,28,63,46,59,19,30),
+(8,6,29,65,47,60,20,31),
+(8,6,30,67,48,62,20,31),
+(8,6,31,69,49,63,20,31),
+(8,6,32,70,50,65,20,32),
+(8,6,33,72,51,67,20,32),
+(8,6,34,74,53,68,20,33),
+(8,6,35,75,54,70,21,33),
+(8,6,36,77,55,71,21,34),
+(8,6,37,79,56,73,21,34),
+(8,6,38,81,57,75,21,35),
+(8,6,39,83,58,76,21,35),
+(8,6,40,84,59,78,22,35),
+(8,6,41,86,60,80,22,36),
+(8,6,42,88,62,81,22,36),
+(8,6,43,90,63,83,22,37),
+(8,6,44,92,64,85,22,37),
+(8,6,45,94,65,86,23,38),
+(8,6,46,96,66,88,23,38),
+(8,6,47,98,67,90,23,39),
+(8,6,48,100,69,92,23,39),
+(8,6,49,102,70,93,24,40),
+(8,6,50,103,71,95,24,40),
+(8,6,51,105,72,96,24,41),
+(8,6,52,106,74,97,24,42),
+(8,6,53,107,73,98,25,42),
+(8,6,54,108,74,99,25,43),
+(8,6,55,109,75,100,25,43),
+(8,6,56,112,77,103,25,44),
+(8,6,57,114,78,105,25,44),
+(8,6,58,118,79,107,26,45),
+(8,6,59,119,81,109,26,45),
+(8,6,60,121,82,111,26,46),
+(8,6,61,123,83,113,26,47),
+(8,6,62,126,85,115,26,47),
+(8,6,63,128,86,118,27,48),
+(8,6,64,131,88,120,27,48),
+(8,6,65,138,89,122,27,49),
+(8,6,66,140,91,125,27,50),
+(8,6,67,143,92,127,28,50),
+(8,6,68,145,94,129,28,51),
+(8,6,69,148,95,132,28,52),
+(8,6,70,151,97,134,28,52),
+(8,6,71,154,99,137,29,53),
+(8,6,72,156,100,139,29,54),
+(8,6,73,159,102,142,29,55),
+(8,6,74,162,104,144,29,55),
+(8,6,75,165,105,147,30,56),
+(8,6,76,168,107,150,30,57),
+(8,6,77,169,109,153,30,58),
+(8,6,78,170,110,155,30,58),
+(8,6,79,178,112,158,31,59),
+(8,6,80,181,114,161,31,60),
+
+(8,7,1,22,22,22,17,23),
+(8,7,2,23,22,23,18,24),
+(8,7,3,24,23,24,19,25),
+(8,7,4,25,23,25,20,26),
+(8,7,5,25,24,26,21,27),
+(8,7,6,26,24,27,22,28),
+(8,7,7,27,25,28,23,29),
+(8,7,8,28,25,29,24,30),
+(8,7,9,29,25,30,25,31),
+(8,7,10,30,26,31,26,33),
+(8,7,11,31,26,32,27,34),
+(8,7,12,32,27,33,28,35),
+(8,7,13,33,27,34,29,36),
+(8,7,14,34,28,35,30,37),
+(8,7,15,34,28,36,31,38),
+(8,7,16,35,29,38,32,39),
+(8,7,17,36,29,39,33,41),
+(8,7,18,37,30,40,34,42),
+(8,7,19,38,30,41,35,43),
+(8,7,20,39,31,42,36,44),
+(8,7,21,40,32,43,37,45),
+(8,7,22,41,32,45,38,47),
+(8,7,23,43,33,46,39,48),
+(8,7,24,44,33,47,40,49),
+(8,7,25,45,34,48,42,51),
+(8,7,26,46,34,49,43,52),
+(8,7,27,47,35,51,44,53),
+(8,7,28,48,35,52,45,54),
+(8,7,29,49,36,53,46,56),
+(8,7,30,50,37,54,48,57),
+(8,7,31,51,37,56,49,59),
+(8,7,32,52,38,57,50,60),
+(8,7,33,53,38,58,51,61),
+(8,7,34,55,39,60,52,63),
+(8,7,35,56,40,61,54,64),
+(8,7,36,57,40,62,55,66),
+(8,7,37,58,41,64,56,67),
+(8,7,38,59,42,65,57,68),
+(8,7,39,61,42,66,59,70),
+(8,7,40,62,43,68,60,71),
+(8,7,41,63,44,69,61,73),
+(8,7,42,64,44,71,63,74),
+(8,7,43,65,45,72,64,76),
+(8,7,44,67,46,74,65,77),
+(8,7,45,68,46,75,67,79),
+(8,7,46,69,47,76,68,80),
+(8,7,47,71,48,78,69,82),
+(8,7,48,72,49,79,71,83),
+(8,7,49,73,49,81,72,85),
+(8,7,50,74,50,82,74,87),
+(8,7,51,76,51,84,75,88),
+(8,7,52,77,51,85,77,90),
+(8,7,53,78,52,87,78,92),
+(8,7,54,80,53,89,79,93),
+(8,7,55,81,54,90,81,95),
+(8,7,56,83,55,92,82,96),
+(8,7,57,84,55,93,84,98),
+(8,7,58,85,56,95,85,100),
+(8,7,59,87,57,97,87,102),
+(8,7,60,88,58,98,88,103),
+(8,7,61,90,58,100,90,105),
+(8,7,62,91,59,101,91,107),
+(8,7,63,93,60,103,93,108),
+(8,7,64,94,61,105,94,110),
+(8,7,65,95,62,106,96,112),
+(8,7,66,97,63,108,98,114),
+(8,7,67,98,63,110,99,116),
+(8,7,68,100,64,112,101,117),
+(8,7,69,101,65,113,102,119),
+(8,7,70,103,66,115,104,121),
+(8,7,71,104,67,117,116,123),
+(8,7,72,106,68,119,118,126),
+(8,7,73,108,69,121,121,128),
+(8,7,74,110,70,124,123,130),
+(8,7,75,112,71,126,125,132),
+(8,7,76,114,72,128,127,135),
+(8,7,77,115,73,130,129,137),
+(8,7,78,117,74,132,132,139),
+(8,7,79,119,75,135,134,142),
+(8,7,80,121,76,137,136,144),
+
+(8,8,1,21,22,21,19,23),
+(8,8,2,21,22,21,20,24),
+(8,8,3,21,22,22,22,26),
+(8,8,4,21,22,22,23,27),
+(8,8,5,21,23,22,25,28),
+(8,8,6,21,23,22,26,30),
+(8,8,7,21,23,23,27,31),
+(8,8,8,22,23,23,29,32),
+(8,8,9,22,23,23,30,34),
+(8,8,10,22,23,24,32,35),
+(8,8,11,22,24,24,33,37),
+(8,8,12,22,24,24,35,38),
+(8,8,13,22,24,25,36,39),
+(8,8,14,22,24,25,38,41),
+(8,8,15,22,24,25,39,42),
+(8,8,16,22,24,26,41,44),
+(8,8,17,23,25,26,42,45),
+(8,8,18,23,25,26,44,47),
+(8,8,19,23,25,27,46,48),
+(8,8,20,23,25,27,47,50),
+(8,8,21,23,25,27,49,51),
+(8,8,22,23,26,28,51,53),
+(8,8,23,23,26,28,52,55),
+(8,8,24,24,26,29,54,56),
+(8,8,25,24,26,29,56,58),
+(8,8,26,24,27,29,57,60),
+(8,8,27,24,27,30,59,61),
+(8,8,28,24,27,30,61,63),
+(8,8,29,24,27,31,63,65),
+(8,8,30,24,28,31,64,66),
+(8,8,31,25,28,31,66,68),
+(8,8,32,25,28,32,68,70),
+(8,8,33,25,28,32,70,71),
+(8,8,34,25,29,33,71,73),
+(8,8,35,25,29,33,73,75),
+(8,8,36,26,29,34,75,77),
+(8,8,37,26,29,34,77,79),
+(8,8,38,26,30,35,79,80),
+(8,8,39,26,30,35,81,82),
+(8,8,40,26,30,35,83,84),
+(8,8,41,27,31,36,85,86),
+(8,8,42,27,31,36,87,88),
+(8,8,43,27,31,37,89,90),
+(8,8,44,27,32,37,91,91),
+(8,8,45,27,32,38,93,93),
+(8,8,46,28,32,38,95,95),
+(8,8,47,28,32,39,97,97),
+(8,8,48,28,33,39,99,99),
+(8,8,49,28,33,40,101,101),
+(8,8,50,29,33,40,103,103),
+(8,8,51,29,34,41,105,105),
+(8,8,52,29,34,42,107,107),
+(8,8,53,29,35,42,109,109),
+(8,8,54,30,35,43,111,111),
+(8,8,55,30,35,43,113,113),
+(8,8,56,30,36,44,115,115),
+(8,8,57,30,36,44,118,118),
+(8,8,58,31,36,45,120,120),
+(8,8,59,31,37,45,122,122),
+(8,8,60,31,37,46,124,124),
+(8,8,61,31,37,47,126,126),
+(8,8,62,32,38,47,129,128),
+(8,8,63,32,38,48,131,130),
+(8,8,64,32,39,48,133,133),
+(8,8,65,33,39,49,135,135),
+(8,8,66,33,39,50,138,137),
+(8,8,67,33,40,50,140,139),
+(8,8,68,33,40,51,142,141),
+(8,8,69,34,41,51,145,144),
+(8,8,70,34,41,52,147,146),
+(8,8,71,34,41,53,150,149),
+(8,8,72,34,42,54,153,152),
+(8,8,73,34,42,55,156,155),
+(8,8,74,35,43,55,159,157),
+(8,8,75,35,43,56,162,160),
+(8,8,76,35,43,57,168,163),
+(8,8,77,36,44,58,168,166),
+(8,8,78,36,44,58,171,169),
+(8,8,79,36,45,59,177,172),
+(8,8,80,37,45,60,177,175),
+
+(10,2,1,19,22,21,24,20),
+(10,2,2,20,23,22,25,21),
+(10,2,3,21,23,23,25,21),
+(10,2,4,22,24,24,26,22),
+(10,2,5,23,24,25,27,23),
+(10,2,6,25,25,26,27,24),
+(10,2,7,26,25,27,28,24),
+(10,2,8,27,26,28,29,25),
+(10,2,9,28,27,29,29,26),
+(10,2,10,29,27,31,30,26),
+(10,2,11,30,28,32,31,27),
+(10,2,12,32,29,33,31,28),
+(10,2,13,33,29,34,32,29),
+(10,2,14,34,30,35,33,30),
+(10,2,15,35,31,36,33,30),
+(10,2,16,37,31,37,34,31),
+(10,2,17,38,32,39,35,32),
+(10,2,18,39,33,40,36,33),
+(10,2,19,40,33,41,36,34),
+(10,2,20,42,34,42,37,35),
+(10,2,21,43,35,44,38,35),
+(10,2,22,44,35,45,39,36),
+(10,2,23,46,36,46,40,37),
+(10,2,24,47,37,47,40,38),
+(10,2,25,49,38,49,41,39),
+(10,2,26,50,38,50,42,40),
+(10,2,27,51,39,51,43,41),
+(10,2,28,53,40,53,44,42),
+(10,2,29,54,41,54,45,43),
+(10,2,30,56,41,55,45,43),
+(10,2,31,57,42,57,46,44),
+(10,2,32,58,43,58,47,45),
+(10,2,33,60,44,59,48,46),
+(10,2,34,61,45,61,49,47),
+(10,2,35,63,45,62,50,48),
+(10,2,36,64,46,64,51,49),
+(10,2,37,66,47,65,52,50),
+(10,2,38,67,48,67,53,51),
+(10,2,39,69,49,68,54,52),
+(10,2,40,71,50,69,55,53),
+(10,2,41,72,50,71,55,54),
+(10,2,42,74,51,72,56,55),
+(10,2,43,75,52,74,57,56),
+(10,2,44,77,53,75,58,57),
+(10,2,45,79,54,77,59,59),
+(10,2,46,80,55,78,60,60),
+(10,2,47,82,56,80,61,61),
+(10,2,48,83,57,82,62,62),
+(10,2,49,85,58,83,63,63),
+(10,2,50,87,59,85,64,64),
+(10,2,51,89,60,86,66,65),
+(10,2,52,90,61,88,67,66),
+(10,2,53,92,61,90,68,67),
+(10,2,54,94,62,91,69,69),
+(10,2,55,95,63,93,70,70),
+(10,2,56,97,64,95,71,71),
+(10,2,57,99,65,96,72,72),
+(10,2,58,101,66,98,73,73),
+(10,2,59,102,67,100,74,74),
+(10,2,60,104,68,101,75,76),
+(10,2,61,106,69,103,76,77),
+(10,2,62,108,70,105,78,78),
+(10,2,63,110,72,106,79,79),
+(10,2,64,112,73,108,80,80),
+(10,2,65,113,74,110,81,82),
+(10,2,66,115,75,112,82,83),
+(10,2,67,117,76,114,83,84),
+(10,2,68,119,77,115,85,85),
+(10,2,69,121,78,117,86,87),
+(10,2,70,123,79,119,87,88),
+(10,2,71,125,80,120,88,89),
+(10,2,72,128,81,123,90,91),
+(10,2,73,130,82,125,91,93),
+(10,2,74,133,84,127,93,94),
+(10,2,75,135,85,129,94,96),
+(10,2,76,137,86,132,96,97),
+(10,2,77,140,88,134,97,99),
+(10,2,78,143,89,136,99,101),
+(10,2,79,145,90,139,100,102),
+(10,2,80,148,92,141,102,104),
+
+(10,3,1,17,25,20,24,20),
+(10,3,2,17,26,21,25,21),
+(10,3,3,18,28,22,25,21),
+(10,3,4,18,29,23,26,22),
+(10,3,5,19,30,24,26,23),
+(10,3,6,19,32,25,27,23),
+(10,3,7,20,33,26,27,24),
+(10,3,8,20,35,27,28,25),
+(10,3,9,21,36,27,29,25),
+(10,3,10,21,38,28,29,26),
+(10,3,11,22,39,29,30,27),
+(10,3,12,22,41,30,31,27),
+(10,3,13,23,42,31,31,28),
+(10,3,14,23,44,32,32,29),
+(10,3,15,24,45,34,32,29),
+(10,3,16,24,47,35,33,30),
+(10,3,17,25,48,36,34,31),
+(10,3,18,25,50,37,34,32),
+(10,3,19,26,51,38,35,32),
+(10,3,20,26,53,39,36,33),
+(10,3,21,27,55,40,37,34),
+(10,3,22,27,56,41,37,35),
+(10,3,23,28,58,42,38,36),
+(10,3,24,28,60,43,39,36),
+(10,3,25,29,61,44,39,37),
+(10,3,26,30,63,46,40,38),
+(10,3,27,30,65,47,41,39),
+(10,3,28,31,66,48,42,40),
+(10,3,29,31,68,49,42,40),
+(10,3,30,32,70,50,43,41),
+(10,3,31,33,72,52,44,42),
+(10,3,32,33,73,53,45,43),
+(10,3,33,34,75,54,46,44),
+(10,3,34,34,77,55,46,45),
+(10,3,35,35,79,57,47,46),
+(10,3,36,36,81,58,48,47),
+(10,3,37,36,83,59,49,47),
+(10,3,38,37,85,60,50,48),
+(10,3,39,38,86,62,51,49),
+(10,3,40,38,88,63,51,50),
+(10,3,41,39,90,64,52,51),
+(10,3,42,40,92,66,53,52),
+(10,3,43,40,94,67,54,53),
+(10,3,44,41,96,68,55,54),
+(10,3,45,42,98,70,56,55),
+(10,3,46,42,100,71,57,56),
+(10,3,47,43,102,72,58,57),
+(10,3,48,44,104,74,59,58),
+(10,3,49,45,106,75,60,59),
+(10,3,50,45,108,77,61,60),
+(10,3,51,46,110,78,61,61),
+(10,3,52,47,113,79,62,62),
+(10,3,53,47,115,81,63,63),
+(10,3,54,48,117,82,64,64),
+(10,3,55,49,119,84,65,65),
+(10,3,56,50,121,85,66,66),
+(10,3,57,50,123,87,67,67),
+(10,3,58,51,126,88,68,68),
+(10,3,59,52,128,90,69,70),
+(10,3,60,53,130,91,70,71),
+(10,3,61,54,132,93,71,72),
+(10,3,62,54,134,94,72,73),
+(10,3,63,55,137,96,73,74),
+(10,3,64,56,139,97,75,75),
+(10,3,65,57,141,99,76,76),
+(10,3,66,58,144,101,77,77),
+(10,3,67,58,146,102,78,78),
+(10,3,68,59,148,104,79,80),
+(10,3,69,60,151,105,80,81),
+(10,3,70,61,153,107,81,82),
+(10,3,71,62,156,108,82,83),
+(10,3,72,63,159,110,83,84),
+(10,3,73,64,162,112,84,86),
+(10,3,74,65,165,114,86,87),
+(10,3,75,66,168,116,87,89),
+(10,3,76,67,171,118,89,90),
+(10,3,77,68,174,120,90,92),
+(10,3,78,69,177,122,91,93),
+(10,3,79,70,180,124,92,95),
+(10,3,80,71,183,126,94,96),
+
+(10,4,1,18,25,20,24,19),
+(10,4,2,19,26,21,24,19),
+(10,4,3,20,28,21,24,20),
+(10,4,4,20,29,22,24,20),
+(10,4,5,21,31,23,25,20),
+(10,4,6,22,32,24,25,21),
+(10,4,7,23,34,24,25,21),
+(10,4,8,24,35,25,25,22),
+(10,4,9,24,37,26,25,22),
+(10,4,10,25,38,26,25,22),
+(10,4,11,26,40,27,25,23),
+(10,4,12,27,41,28,26,23),
+(10,4,13,28,43,29,26,24),
+(10,4,14,29,45,30,26,24),
+(10,4,15,29,46,30,26,25),
+(10,4,16,30,48,31,26,25),
+(10,4,17,31,50,32,27,25),
+(10,4,18,32,51,33,27,26),
+(10,4,19,33,53,34,27,26),
+(10,4,20,34,55,35,27,27),
+(10,4,21,35,56,35,27,27),
+(10,4,22,36,58,36,28,28),
+(10,4,23,37,60,37,28,28),
+(10,4,24,38,62,38,28,29),
+(10,4,25,39,63,39,28,29),
+(10,4,26,40,65,40,29,30),
+(10,4,27,41,67,41,29,30),
+(10,4,28,42,69,42,29,31),
+(10,4,29,43,71,43,29,31),
+(10,4,30,44,72,43,29,32),
+(10,4,31,45,74,44,30,32),
+(10,4,32,46,76,45,30,33),
+(10,4,33,47,78,46,30,33),
+(10,4,34,48,80,47,31,34),
+(10,4,35,49,82,48,31,34),
+(10,4,36,50,84,49,31,35),
+(10,4,37,51,86,50,31,35),
+(10,4,38,52,88,51,32,36),
+(10,4,39,53,90,52,32,37),
+(10,4,40,54,92,53,32,37),
+(10,4,41,56,94,54,33,38),
+(10,4,42,57,96,55,33,38),
+(10,4,43,58,98,56,33,39),
+(10,4,44,59,100,57,33,39),
+(10,4,45,60,102,59,34,40),
+(10,4,46,61,104,60,34,41),
+(10,4,47,62,107,61,34,41),
+(10,4,48,64,109,62,35,42),
+(10,4,49,65,111,63,35,43),
+(10,4,50,66,113,64,35,43),
+(10,4,51,67,115,65,36,44),
+(10,4,52,68,117,66,36,44),
+(10,4,53,70,120,67,36,45),
+(10,4,54,71,122,69,37,46),
+(10,4,55,72,124,70,37,46),
+(10,4,56,73,126,71,37,47),
+(10,4,57,75,129,72,38,48),
+(10,4,58,76,131,73,38,48),
+(10,4,59,77,133,74,39,49),
+(10,4,60,79,136,76,39,50),
+(10,4,61,80,138,77,39,51),
+(10,4,62,81,140,78,40,51),
+(10,4,63,82,143,79,40,52),
+(10,4,64,84,145,80,41,53),
+(10,4,65,85,148,82,41,53),
+(10,4,66,87,150,83,41,54),
+(10,4,67,88,153,84,42,55),
+(10,4,68,89,155,85,42,56),
+(10,4,69,91,157,87,43,56),
+(10,4,70,92,160,88,43,57),
+(10,4,71,94,163,88,43,58),
+(10,4,72,96,166,90,44,58),
+(10,4,73,97,169,92,44,59),
+(10,4,74,99,172,93,45,60),
+(10,4,75,101,175,95,45,61),
+(10,4,76,102,178,96,45,62),
+(10,4,77,104,181,101,46,63),
+(10,4,78,106,185,104,46,64),
+(10,4,79,108,188,105,47,65),
+(10,4,80,110,191,107,47,66),
+
+(10,5,1,17,22,19,26,22),
+(10,5,2,17,22,19,27,23),
+(10,5,3,17,22,20,29,25),
+(10,5,4,17,23,20,30,26),
+(10,5,5,18,23,20,31,27),
+(10,5,6,18,23,21,33,29),
+(10,5,7,18,23,21,34,30),
+(10,5,8,18,24,22,35,32),
+(10,5,9,18,24,22,37,33),
+(10,5,10,19,24,22,38,35),
+(10,5,11,19,24,23,39,36),
+(10,5,12,19,24,23,41,38),
+(10,5,13,19,25,24,42,39),
+(10,5,14,19,25,24,44,41),
+(10,5,15,19,25,25,45,42),
+(10,5,16,20,26,25,47,44),
+(10,5,17,20,26,25,48,45),
+(10,5,18,20,26,26,50,47),
+(10,5,19,20,26,26,51,49),
+(10,5,20,21,27,27,53,50),
+(10,5,21,21,27,27,54,52),
+(10,5,22,21,27,28,56,53),
+(10,5,23,21,28,28,58,55),
+(10,5,24,21,28,29,59,57),
+(10,5,25,22,28,29,61,58),
+(10,5,26,22,28,30,62,60),
+(10,5,27,22,29,30,64,62),
+(10,5,28,22,29,31,66,64),
+(10,5,29,23,29,31,67,65),
+(10,5,30,23,30,32,69,67),
+(10,5,31,23,30,32,71,69),
+(10,5,32,23,30,33,72,71),
+(10,5,33,24,31,33,74,72),
+(10,5,34,24,31,34,76,74),
+(10,5,35,24,32,34,78,76),
+(10,5,36,24,32,35,80,78),
+(10,5,37,25,32,35,81,80),
+(10,5,38,25,33,36,83,82),
+(10,5,39,25,33,37,85,84),
+(10,5,40,26,33,37,87,86),
+(10,5,41,26,34,38,89,88),
+(10,5,42,26,34,38,91,89),
+(10,5,43,27,35,39,92,91),
+(10,5,44,27,35,39,94,93),
+(10,5,45,27,35,40,96,95),
+(10,5,46,27,36,41,98,97),
+(10,5,47,28,36,41,100,99),
+(10,5,48,28,37,42,102,101),
+(10,5,49,28,37,43,104,103),
+(10,5,50,29,37,43,106,106),
+(10,5,51,29,38,44,108,108),
+(10,5,52,29,38,44,110,110),
+(10,5,53,30,39,45,112,112),
+(10,5,54,30,39,46,114,114),
+(10,5,55,30,40,46,116,116),
+(10,5,56,31,40,47,118,118),
+(10,5,57,31,41,48,120,120),
+(10,5,58,31,41,48,123,123),
+(10,5,59,32,42,49,125,125),
+(10,5,60,32,42,50,127,127),
+(10,5,61,33,42,51,129,129),
+(10,5,62,33,43,51,131,131),
+(10,5,63,33,43,52,133,134),
+(10,5,64,34,44,53,135,136),
+(10,5,65,34,44,53,138,138),
+(10,5,66,34,45,54,140,141),
+(10,5,67,35,45,55,142,143),
+(10,5,68,35,46,56,144,145),
+(10,5,69,36,46,56,147,148),
+(10,5,70,36,47,57,149,150),
+(10,5,71,36,48,57,152,153),
+(10,5,72,37,48,57,155,156),
+(10,5,73,37,49,58,158,159),
+(10,5,74,38,49,59,160,163),
+(10,5,75,38,50,60,163,165),
+(10,5,76,38,51,61,166,170),
+(10,5,77,39,51,62,168,175),
+(10,5,78,39,52,63,172,174),
+(10,5,79,40,52,64,175,177),
+(10,5,80,40,53,65,178,180),
+
+(10,6,1,18,23,21,24,20),
+(10,6,2,19,24,22,24,20),
+(10,6,3,21,25,23,24,21),
+(10,6,4,22,25,25,24,21),
+(10,6,5,23,26,26,24,21),
+(10,6,6,25,27,27,24,21),
+(10,6,7,26,28,28,24,22),
+(10,6,8,27,29,29,25,22),
+(10,6,9,29,29,31,25,22),
+(10,6,10,30,30,32,25,23),
+(10,6,11,32,31,33,25,23),
+(10,6,12,33,32,34,25,23),
+(10,6,13,34,33,36,25,24),
+(10,6,14,36,34,37,25,24),
+(10,6,15,37,35,38,25,24),
+(10,6,16,39,36,40,25,25),
+(10,6,17,40,36,41,25,25),
+(10,6,18,42,37,43,26,25),
+(10,6,19,43,38,44,26,26),
+(10,6,20,45,39,45,26,26),
+(10,6,21,47,40,47,26,26),
+(10,6,22,48,41,48,26,27),
+(10,6,23,50,42,50,26,27),
+(10,6,24,51,43,51,26,28),
+(10,6,25,53,44,52,27,28),
+(10,6,26,55,45,54,27,28),
+(10,6,27,56,46,55,27,29),
+(10,6,28,58,47,57,27,29),
+(10,6,29,59,48,58,27,30),
+(10,6,30,61,49,60,27,30),
+(10,6,31,63,50,62,27,30),
+(10,6,32,65,51,63,28,31),
+(10,6,33,66,52,65,28,31),
+(10,6,34,68,53,66,28,32),
+(10,6,35,70,55,68,28,32),
+(10,6,36,72,56,69,28,33),
+(10,6,37,73,57,71,29,33),
+(10,6,38,75,58,73,29,34),
+(10,6,39,77,59,74,29,34),
+(10,6,40,79,60,76,29,35),
+(10,6,41,81,61,78,29,35),
+(10,6,42,82,62,79,30,35),
+(10,6,43,84,64,81,30,36),
+(10,6,44,86,65,83,30,36),
+(10,6,45,88,66,85,30,37),
+(10,6,46,90,67,86,30,37),
+(10,6,47,92,68,88,31,38),
+(10,6,48,94,69,90,31,38),
+(10,6,49,96,69,92,31,39),
+(10,6,50,98,70,93,31,40),
+(10,6,51,100,71,95,32,40),
+(10,6,52,102,72,96,32,41),
+(10,6,53,103,73,97,32,41),
+(10,6,54,104,74,98,32,41),
+(10,6,55,105,75,97,33,41),
+(10,6,56,108,77,100,33,42),
+(10,6,57,113,78,102,33,42),
+(10,6,58,115,79,104,34,43),
+(10,6,59,117,81,106,34,43),
+(10,6,60,118,82,108,34,44),
+(10,6,61,119,83,110,34,45),
+(10,6,62,121,85,112,34,45),
+(10,6,63,124,86,115,35,46),
+(10,6,64,127,88,117,35,46),
+(10,6,65,133,89,119,35,47),
+(10,6,66,135,91,122,35,48),
+(10,6,67,139,92,124,36,48),
+(10,6,68,141,94,126,36,49),
+(10,6,69,142,95,129,36,50),
+(10,6,70,145,97,131,36,50),
+(10,6,71,150,99,134,37,51),
+(10,6,72,152,100,136,37,52),
+(10,6,73,155,102,139,37,53),
+(10,6,74,158,104,141,37,53),
+(10,6,75,159,105,144,38,54),
+(10,6,76,160,107,147,38,55),
+(10,6,77,163,109,149,38,56),
+(10,6,78,166,110,152,38,56),
+(10,6,79,169,112,155,39,57),
+(10,6,80,172,114,158,39,58),
+
+(10,8,1,17,22,19,27,21),
+(10,8,2,17,22,19,28,22),
+(10,8,3,17,22,20,30,24),
+(10,8,4,17,22,20,31,25),
+(10,8,5,17,23,20,32,26),
+(10,8,6,17,23,20,34,28),
+(10,8,7,18,23,21,35,29),
+(10,8,8,18,23,21,37,30),
+(10,8,9,18,23,21,38,32),
+(10,8,10,18,23,22,40,33),
+(10,8,11,18,24,22,41,35),
+(10,8,12,18,24,22,42,36),
+(10,8,13,18,24,23,44,37),
+(10,8,14,18,24,23,45,39),
+(10,8,15,18,24,23,47,40),
+(10,8,16,19,24,24,49,42),
+(10,8,17,19,25,24,50,43),
+(10,8,18,19,25,24,52,45),
+(10,8,19,19,25,25,53,46),
+(10,8,20,19,25,25,55,48),
+(10,8,21,19,25,26,57,50),
+(10,8,22,19,26,26,58,51),
+(10,8,23,20,26,26,60,53),
+(10,8,24,20,26,27,61,54),
+(10,8,25,20,26,27,63,56),
+(10,8,26,20,27,27,65,58),
+(10,8,27,20,27,28,67,59),
+(10,8,28,20,27,28,68,61),
+(10,8,29,21,27,29,70,63),
+(10,8,30,21,28,29,72,64),
+(10,8,31,21,28,30,74,66),
+(10,8,32,21,28,30,75,68),
+(10,8,33,21,28,30,77,70),
+(10,8,34,21,29,31,79,71),
+(10,8,35,22,29,31,81,73),
+(10,8,36,22,29,32,83,75),
+(10,8,37,22,29,32,85,77),
+(10,8,38,22,30,33,86,78),
+(10,8,39,22,30,33,88,80),
+(10,8,40,23,30,34,90,82),
+(10,8,41,23,31,34,92,84),
+(10,8,42,23,31,35,94,86),
+(10,8,43,23,31,35,96,88),
+(10,8,44,23,32,36,98,90),
+(10,8,45,24,32,36,100,92),
+(10,8,46,24,32,37,102,93),
+(10,8,47,24,32,37,104,95),
+(10,8,48,24,33,38,106,97),
+(10,8,49,25,33,38,108,99),
+(10,8,50,25,33,39,110,101),
+(10,8,51,25,34,39,112,103),
+(10,8,52,25,34,40,114,105),
+(10,8,53,25,35,40,117,107),
+(10,8,54,26,35,41,119,109),
+(10,8,55,26,35,41,121,111),
+(10,8,56,26,36,42,123,113),
+(10,8,57,26,36,42,125,116),
+(10,8,58,27,36,43,127,118),
+(10,8,59,27,37,43,130,120),
+(10,8,60,27,37,44,132,122),
+(10,8,61,27,37,45,134,124),
+(10,8,62,28,38,45,136,126),
+(10,8,63,28,38,46,139,128),
+(10,8,64,28,39,46,141,131),
+(10,8,65,29,39,47,143,133),
+(10,8,66,29,39,48,146,135),
+(10,8,67,29,40,48,148,137),
+(10,8,68,29,40,49,150,139),
+(10,8,69,30,41,49,153,142),
+(10,8,70,30,41,50,155,144),
+(10,8,71,30,41,50,158,147),
+(10,8,72,30,42,51,161,150),
+(10,8,73,30,42,52,164,153),
+(10,8,74,31,43,52,167,155),
+(10,8,75,31,43,53,170,158),
+(10,8,76,31,43,54,173,161),
+(10,8,77,32,44,55,176,164),
+(10,8,78,32,44,55,179,167),
+(10,8,79,32,45,56,182,170),
+(10,8,80,33,45,57,185,173),
+
+(10,9,1,17,22,20,26,21),
+(10,9,2,17,22,21,27,22),
+(10,9,3,18,23,21,28,23),
+(10,9,4,18,23,22,29,24),
+(10,9,5,18,23,22,31,26),
+(10,9,6,18,24,23,32,27),
+(10,9,7,19,24,23,33,28),
+(10,9,8,19,25,24,34,29),
+(10,9,9,19,25,25,36,30),
+(10,9,10,20,25,25,37,32),
+(10,9,11,20,26,26,38,33),
+(10,9,12,20,26,26,39,34),
+(10,9,13,21,27,27,41,36),
+(10,9,14,21,27,28,42,37),
+(10,9,15,21,27,28,43,38),
+(10,9,16,22,28,29,45,39),
+(10,9,17,22,28,30,46,41),
+(10,9,18,23,29,30,47,42),
+(10,9,19,23,29,31,49,43),
+(10,9,20,23,30,32,50,45),
+(10,9,21,24,30,32,51,46),
+(10,9,22,24,31,33,53,48),
+(10,9,23,24,31,34,54,49),
+(10,9,24,25,31,34,56,50),
+(10,9,25,25,32,35,57,52),
+(10,9,26,26,32,36,59,53),
+(10,9,27,26,33,37,60,55),
+(10,9,28,26,33,37,62,56),
+(10,9,29,27,34,38,63,58),
+(10,9,30,27,34,39,65,59),
+(10,9,31,28,35,40,66,61),
+(10,9,32,28,36,40,68,62),
+(10,9,33,29,36,41,69,64),
+(10,9,34,29,37,42,71,65),
+(10,9,35,29,37,43,73,67),
+(10,9,36,30,38,43,74,69),
+(10,9,37,30,38,44,76,70),
+(10,9,38,31,39,45,77,72),
+(10,9,39,31,39,46,79,73),
+(10,9,40,32,40,47,81,75),
+(10,9,41,32,41,48,82,77),
+(10,9,42,33,41,48,84,78),
+(10,9,43,33,42,49,86,80),
+(10,9,44,34,42,50,88,82),
+(10,9,45,34,43,51,89,83),
+(10,9,46,35,44,52,91,85),
+(10,9,47,35,44,53,93,87),
+(10,9,48,36,45,54,95,89),
+(10,9,49,36,45,54,96,90),
+(10,9,50,37,46,55,98,92),
+(10,9,51,37,47,56,100,94),
+(10,9,52,38,47,57,102,96),
+(10,9,53,38,48,58,104,97),
+(10,9,54,39,49,59,105,99),
+(10,9,55,39,49,60,107,101),
+(10,9,56,40,50,61,109,103),
+(10,9,57,40,51,62,111,105),
+(10,9,58,41,51,63,113,107),
+(10,9,59,42,52,64,115,108),
+(10,9,60,42,53,65,117,110),
+(10,9,61,43,53,66,119,112),
+(10,9,62,43,54,67,121,114),
+(10,9,63,44,55,68,123,116),
+(10,9,64,44,56,69,125,118),
+(10,9,65,45,56,70,127,120),
+(10,9,66,46,57,71,129,122),
+(10,9,67,46,58,72,131,124),
+(10,9,68,47,58,73,133,126),
+(10,9,69,47,59,74,135,128),
+(10,9,70,48,60,75,137,130),
+(10,9,71,49,61,83,139,141),
+(10,9,72,50,61,84,142,143),
+(10,9,73,51,62,84,144,146),
+(10,9,74,51,63,86,147,149),
+(10,9,75,52,64,89,149,151),
+(10,9,76,53,65,90,155,154),
+(10,9,77,54,66,91,155,157),
+(10,9,78,54,67,93,157,160),
+(10,9,79,55,68,94,160,163),
+(10,9,80,56,69,95,163,165),
+
+(11,1,1,24,17,21,21,22),
+(11,1,2,25,18,22,21,22),
+(11,1,3,27,19,23,21,23),
+(11,1,4,28,19,25,21,23),
+(11,1,5,29,20,26,21,23),
+(11,1,6,31,21,27,21,23),
+(11,1,7,32,22,28,21,24),
+(11,1,8,33,23,29,22,24),
+(11,1,9,35,24,31,22,24),
+(11,1,10,36,24,32,22,25),
+(11,1,11,37,25,33,22,25),
+(11,1,12,39,26,34,22,25),
+(11,1,13,40,27,36,22,26),
+(11,1,14,42,28,37,22,26),
+(11,1,15,43,29,38,22,26),
+(11,1,16,45,30,40,22,27),
+(11,1,17,46,31,41,23,27),
+(11,1,18,48,32,43,23,27),
+(11,1,19,49,33,44,23,28),
+(11,1,20,51,34,45,23,28),
+(11,1,21,52,34,47,23,28),
+(11,1,22,54,35,48,23,29),
+(11,1,23,55,36,50,23,29),
+(11,1,24,57,37,51,24,30),
+(11,1,25,59,38,52,24,30),
+(11,1,26,60,39,54,24,30),
+(11,1,27,62,40,55,24,31),
+(11,1,28,63,41,57,24,31),
+(11,1,29,65,43,58,24,32),
+(11,1,30,67,44,60,24,32),
+(11,1,31,69,45,62,25,32),
+(11,1,32,70,46,63,25,33),
+(11,1,33,72,47,65,25,33),
+(11,1,34,74,48,66,25,34),
+(11,1,35,75,49,68,25,34),
+(11,1,36,77,50,69,26,35),
+(11,1,37,79,51,71,26,35),
+(11,1,38,81,52,73,26,35),
+(11,1,39,83,53,74,26,36),
+(11,1,40,84,55,76,26,36),
+(11,1,41,86,56,78,27,37),
+(11,1,42,88,57,79,27,37),
+(11,1,43,90,58,81,27,38),
+(11,1,44,92,59,83,27,38),
+(11,1,45,94,60,85,27,39),
+(11,1,46,96,62,86,28,39),
+(11,1,47,98,63,88,28,40),
+(11,1,48,100,64,90,28,40),
+(11,1,49,102,65,92,28,41),
+(11,1,50,103,66,93,29,41),
+(11,1,51,105,68,95,29,42),
+(11,1,52,107,69,97,29,42),
+(11,1,53,109,70,99,29,43),
+(11,1,54,112,71,101,30,44),
+(11,1,55,114,73,103,30,44),
+(11,1,56,116,74,104,30,45),
+(11,1,57,118,75,106,30,45),
+(11,1,58,120,77,108,31,46),
+(11,1,59,122,78,110,31,46),
+(11,1,60,124,79,112,31,47),
+(11,1,61,126,81,114,31,48),
+(11,1,62,128,82,116,32,48),
+(11,1,63,130,83,118,32,49),
+(11,1,64,133,85,120,32,49),
+(11,1,65,135,86,122,33,50),
+(11,1,66,137,87,124,33,51),
+(11,1,67,139,89,126,33,51),
+(11,1,68,141,90,128,33,52),
+(11,1,69,144,92,130,34,52),
+(11,1,70,146,93,132,34,53),
+(11,1,71,149,94,134,34,54),
+(11,1,72,151,96,137,34,55),
+(11,1,73,154,98,139,34,56),
+(11,1,74,157,99,142,35,56),
+(11,1,75,166,101,149,35,57),
+(11,1,76,172,103,155,35,58),
+(11,1,77,175,105,159,36,59),
+(11,1,78,179,106,161,36,59),
+(11,1,79,182,108,164,36,60),
+(11,1,80,185,110,167,37,61),
+
+(11,2,1,23,17,21,21,23),
+(11,2,2,24,18,22,22,24),
+(11,2,3,25,18,23,22,24),
+(11,2,4,26,19,24,23,25),
+(11,2,5,27,19,25,24,26),
+(11,2,6,29,20,26,24,26),
+(11,2,7,30,21,27,25,27),
+(11,2,8,31,21,28,26,28),
+(11,2,9,32,22,29,26,29),
+(11,2,10,33,22,31,27,29),
+(11,2,11,34,23,32,28,30),
+(11,2,12,36,24,33,28,31),
+(11,2,13,37,24,34,29,32),
+(11,2,14,38,25,35,30,32),
+(11,2,15,39,26,36,31,33),
+(11,2,16,40,26,37,31,34),
+(11,2,17,42,27,39,32,35),
+(11,2,18,43,28,40,33,36),
+(11,2,19,44,28,41,34,37),
+(11,2,20,46,29,42,34,37),
+(11,2,21,47,30,44,35,38),
+(11,2,22,48,31,45,36,39),
+(11,2,23,50,31,46,37,40),
+(11,2,24,51,32,47,38,41),
+(11,2,25,52,33,49,38,42),
+(11,2,26,54,34,50,39,43),
+(11,2,27,55,34,51,40,44),
+(11,2,28,56,35,53,41,44),
+(11,2,29,58,36,54,42,45),
+(11,2,30,59,37,55,43,46),
+(11,2,31,61,37,57,43,47),
+(11,2,32,62,38,58,44,48),
+(11,2,33,64,39,59,45,49),
+(11,2,34,65,40,61,46,50),
+(11,2,35,67,41,62,47,51),
+(11,2,36,68,42,64,48,52),
+(11,2,37,70,42,65,49,53),
+(11,2,38,71,43,67,50,54),
+(11,2,39,73,44,68,51,55),
+(11,2,40,74,45,69,52,56),
+(11,2,41,76,46,71,53,57),
+(11,2,42,78,47,72,54,58),
+(11,2,43,79,47,74,55,59),
+(11,2,44,81,48,75,56,60),
+(11,2,45,82,49,77,57,61),
+(11,2,46,84,50,78,58,62),
+(11,2,47,86,51,80,59,64),
+(11,2,48,87,52,82,60,65),
+(11,2,49,89,53,83,61,66),
+(11,2,50,91,54,85,62,67),
+(11,2,51,92,55,86,63,68),
+(11,2,52,94,56,88,64,69),
+(11,2,53,96,57,90,65,70),
+(11,2,54,97,58,91,66,71),
+(11,2,55,99,59,93,67,73),
+(11,2,56,101,60,95,68,74),
+(11,2,57,103,61,96,69,75),
+(11,2,58,105,62,98,70,76),
+(11,2,59,106,63,100,71,77),
+(11,2,60,108,64,101,72,78),
+(11,2,61,110,65,103,74,80),
+(11,2,62,112,66,105,75,81),
+(11,2,63,114,67,106,76,82),
+(11,2,64,116,68,108,77,83),
+(11,2,65,117,69,110,78,85),
+(11,2,66,119,70,112,79,86),
+(11,2,67,121,71,114,80,87),
+(11,2,68,123,72,115,82,88),
+(11,2,69,125,73,117,83,90),
+(11,2,70,127,74,119,84,91),
+(11,2,71,130,75,121,87,92),
+(11,2,72,132,76,124,90,94),
+(11,2,73,134,77,126,93,96),
+(11,2,74,137,79,128,97,97),
+(11,2,75,139,80,130,101,99),
+(11,2,76,142,81,133,106,100),
+(11,2,77,144,83,135,108,102),
+(11,2,78,147,84,137,110,104),
+(11,2,79,149,85,140,111,105),
+(11,2,80,152,87,142,113,107),
+
+(11,3,1,21,20,20,21,23),
+(11,3,2,21,21,21,22,24),
+(11,3,3,22,23,22,22,24),
+(11,3,4,22,24,23,23,25),
+(11,3,5,23,25,24,23,25),
+(11,3,6,23,27,25,24,26),
+(11,3,7,24,28,26,24,27),
+(11,3,8,24,30,27,25,27),
+(11,3,9,25,31,27,26,28),
+(11,3,10,25,33,28,26,29),
+(11,3,11,25,34,29,27,29),
+(11,3,12,26,36,30,28,30),
+(11,3,13,26,37,31,28,31),
+(11,3,14,27,39,32,29,32),
+(11,3,15,27,40,34,30,32),
+(11,3,16,28,42,35,30,33),
+(11,3,17,28,43,36,31,34),
+(11,3,18,29,45,37,32,35),
+(11,3,19,29,47,38,32,35),
+(11,3,20,30,48,39,33,36),
+(11,3,21,31,50,40,34,37),
+(11,3,22,31,51,41,34,38),
+(11,3,23,32,53,42,35,38),
+(11,3,24,32,55,43,36,39),
+(11,3,25,33,57,44,37,40),
+(11,3,26,33,58,46,37,41),
+(11,3,27,34,60,47,38,42),
+(11,3,28,35,62,48,39,42),
+(11,3,29,35,63,49,40,43),
+(11,3,30,36,65,50,40,44),
+(11,3,31,36,67,52,41,45),
+(11,3,32,37,69,53,42,46),
+(11,3,33,38,71,54,43,47),
+(11,3,34,38,72,55,44,48),
+(11,3,35,39,74,57,44,48),
+(11,3,36,39,76,58,45,49),
+(11,3,37,40,78,59,46,50),
+(11,3,38,41,80,60,47,51),
+(11,3,39,41,82,62,48,52),
+(11,3,40,42,84,63,49,53),
+(11,3,41,43,86,64,50,54),
+(11,3,42,43,88,66,50,55),
+(11,3,43,44,90,67,51,56),
+(11,3,44,45,91,68,52,57),
+(11,3,45,45,93,70,53,58),
+(11,3,46,46,95,71,54,59),
+(11,3,47,47,98,72,55,60),
+(11,3,48,48,100,74,56,61),
+(11,3,49,48,102,75,57,62),
+(11,3,50,49,104,77,58,63),
+(11,3,51,50,106,78,59,64),
+(11,3,52,51,108,79,60,65),
+(11,3,53,51,110,81,61,66),
+(11,3,54,52,112,82,61,67),
+(11,3,55,53,114,84,62,68),
+(11,3,56,54,116,85,63,69),
+(11,3,57,54,118,87,64,70),
+(11,3,58,55,121,88,65,71),
+(11,3,59,56,123,90,66,72),
+(11,3,60,57,125,91,67,74),
+(11,3,61,58,127,93,68,75),
+(11,3,62,58,130,94,69,76),
+(11,3,63,59,132,96,71,77),
+(11,3,64,60,134,97,72,78),
+(11,3,65,61,136,99,73,79),
+(11,3,66,62,139,101,74,80),
+(11,3,67,62,141,102,75,81),
+(11,3,68,63,143,104,76,83),
+(11,3,69,64,146,105,77,84),
+(11,3,70,65,148,107,78,85),
+(11,3,71,66,151,109,79,86),
+(11,3,72,67,154,111,80,87),
+(11,3,73,68,157,113,81,89),
+(11,3,74,69,160,115,83,90),
+(11,3,75,70,163,117,84,92),
+(11,3,76,71,166,119,85,93),
+(11,3,77,72,169,121,87,95),
+(11,3,78,73,172,123,88,96),
+(11,3,79,74,175,125,89,98),
+(11,3,80,75,178,127,91,99),
+
+(11,5,1,21,17,19,23,25),
+(11,5,2,21,17,19,24,26),
+(11,5,3,21,17,20,26,28),
+(11,5,4,21,18,20,27,29),
+(11,5,5,22,18,20,28,30),
+(11,5,6,22,18,21,30,32),
+(11,5,7,22,18,21,31,33),
+(11,5,8,22,19,22,32,35),
+(11,5,9,22,19,22,34,36),
+(11,5,10,22,19,22,35,38),
+(11,5,11,23,19,23,37,39),
+(11,5,12,23,20,23,38,41),
+(11,5,13,23,20,24,39,42),
+(11,5,14,23,20,24,41,44),
+(11,5,15,23,20,25,42,45),
+(11,5,16,24,21,25,44,47),
+(11,5,17,24,21,25,45,48),
+(11,5,18,24,21,26,47,50),
+(11,5,19,24,22,26,48,51),
+(11,5,20,24,22,27,50,53),
+(11,5,21,25,22,27,51,55),
+(11,5,22,25,22,28,53,56),
+(11,5,23,25,23,28,55,58),
+(11,5,24,25,23,29,56,60),
+(11,5,25,25,23,29,58,61),
+(11,5,26,26,24,30,60,63),
+(11,5,27,26,24,30,61,65),
+(11,5,28,26,24,31,63,66),
+(11,5,29,26,25,31,65,68),
+(11,5,30,27,25,32,66,70),
+(11,5,31,27,25,32,68,72),
+(11,5,32,27,26,33,70,73),
+(11,5,33,27,26,33,71,75),
+(11,5,34,28,26,34,73,77),
+(11,5,35,28,27,34,75,79),
+(11,5,36,28,27,35,77,81),
+(11,5,37,29,28,35,79,83),
+(11,5,38,29,28,36,80,85),
+(11,5,39,29,28,37,82,86),
+(11,5,40,29,29,37,84,88),
+(11,5,41,30,29,38,86,90),
+(11,5,42,30,29,38,88,92),
+(11,5,43,30,30,39,90,94),
+(11,5,44,31,30,39,91,96),
+(11,5,45,31,31,40,93,98),
+(11,5,46,31,31,41,95,100),
+(11,5,47,32,31,41,97,102),
+(11,5,48,32,32,42,99,104),
+(11,5,49,32,32,43,101,106),
+(11,5,50,33,33,43,103,108),
+(11,5,51,33,33,44,105,110),
+(11,5,52,33,34,44,107,113),
+(11,5,53,34,34,45,109,115),
+(11,5,54,34,34,46,111,117),
+(11,5,55,34,35,46,113,119),
+(11,5,56,35,35,47,115,121),
+(11,5,57,35,36,48,118,123),
+(11,5,58,35,36,48,120,126),
+(11,5,59,36,37,49,122,128),
+(11,5,60,36,37,50,124,130),
+(11,5,61,36,38,51,126,132),
+(11,5,62,37,38,51,128,134),
+(11,5,63,37,39,52,130,137),
+(11,5,64,38,39,53,133,139),
+(11,5,65,38,40,53,135,141),
+(11,5,66,38,40,54,137,144),
+(11,5,67,39,40,55,139,146),
+(11,5,68,39,41,56,141,148),
+(11,5,69,40,41,56,144,151),
+(11,5,70,40,42,57,146,153),
+(11,5,71,40,43,58,149,156),
+(11,5,72,41,43,58,155,159),
+(11,5,73,41,44,59,157,160),
+(11,5,74,42,44,61,160,163),
+(11,5,75,42,45,62,164,166),
+(11,5,76,42,46,62,167,169),
+(11,5,77,43,46,63,168,172),
+(11,5,78,43,47,64,169,177),
+(11,5,79,44,47,65,172,180),
+(11,5,80,44,48,66,175,183),
+
+(11,6,1,24,17,21,21,22),
+(11,6,2,25,18,22,21,22),
+(11,6,3,27,19,23,21,23),
+(11,6,4,28,19,25,21,23),
+(11,6,5,29,20,26,21,23),
+(11,6,6,31,21,27,21,23),
+(11,6,7,32,22,28,21,24),
+(11,6,8,33,23,29,22,24),
+(11,6,9,35,24,31,22,24),
+(11,6,10,36,24,32,22,25),
+(11,6,11,37,25,33,22,25),
+(11,6,12,39,26,34,22,25),
+(11,6,13,40,27,36,22,26),
+(11,6,14,42,28,37,22,26),
+(11,6,15,43,29,38,22,26),
+(11,6,16,45,30,40,22,27),
+(11,6,17,46,31,41,23,27),
+(11,6,18,48,32,43,23,27),
+(11,6,19,49,33,44,23,28),
+(11,6,20,51,34,45,23,28),
+(11,6,21,52,34,47,23,28),
+(11,6,22,54,35,48,23,29),
+(11,6,23,55,36,50,23,29),
+(11,6,24,57,37,51,24,30),
+(11,6,25,59,38,52,24,30),
+(11,6,26,60,39,54,24,30),
+(11,6,27,62,40,55,24,31),
+(11,6,28,63,41,57,24,31),
+(11,6,29,65,43,58,24,32),
+(11,6,30,67,44,60,24,32),
+(11,6,31,69,45,62,25,32),
+(11,6,32,70,46,63,25,33),
+(11,6,33,72,47,65,25,33),
+(11,6,34,74,48,66,25,34),
+(11,6,35,75,49,68,25,34),
+(11,6,36,77,50,69,26,35),
+(11,6,37,79,51,71,26,35),
+(11,6,38,81,52,73,26,35),
+(11,6,39,83,53,74,26,36),
+(11,6,40,84,55,76,26,36),
+(11,6,41,86,56,78,27,37),
+(11,6,42,88,57,79,27,37),
+(11,6,43,90,58,81,27,38),
+(11,6,44,92,59,83,27,38),
+(11,6,45,94,60,85,27,39),
+(11,6,46,96,62,86,28,39),
+(11,6,47,98,63,88,28,40),
+(11,6,48,100,64,90,28,40),
+(11,6,49,102,65,92,28,41),
+(11,6,50,103,65,93,29,41),
+(11,6,51,105,66,94,29,42),
+(11,6,52,106,67,95,29,42),
+(11,6,53,107,68,96,29,43),
+(11,6,54,108,69,97,30,44),
+(11,6,55,109,70,98,30,44),
+(11,6,56,112,72,101,30,45),
+(11,6,57,114,73,103,30,45),
+(11,6,58,117,74,105,31,46),
+(11,6,59,119,76,107,31,46),
+(11,6,60,121,77,109,31,47),
+(11,6,61,123,78,111,31,48),
+(11,6,62,126,80,113,31,48),
+(11,6,63,128,81,116,32,49),
+(11,6,64,131,83,118,32,49),
+(11,6,65,136,84,120,32,50),
+(11,6,66,140,86,123,32,51),
+(11,6,67,141,87,125,33,51),
+(11,6,68,141,89,127,33,52),
+(11,6,69,144,90,130,33,53),
+(11,6,70,147,92,132,33,53),
+(11,6,71,150,94,135,34,54),
+(11,6,72,152,95,137,34,55),
+(11,6,73,155,97,140,34,56),
+(11,6,74,162,99,142,34,56),
+(11,6,75,165,100,145,35,57),
+(11,6,76,167,102,146,35,58),
+(11,6,77,169,104,150,35,59),
+(11,6,78,170,105,152,35,59),
+(11,6,79,173,107,156,36,60),
+(11,6,80,176,109,159,36,61),
+
+(11,7,1,22,17,20,22,24),
+(11,7,2,23,17,21,23,25),
+(11,7,3,24,18,22,24,26),
+(11,7,4,25,18,23,25,27),
+(11,7,5,25,19,24,26,28),
+(11,7,6,26,19,25,27,29),
+(11,7,7,27,20,26,28,30),
+(11,7,8,28,20,27,28,31),
+(11,7,9,29,21,28,29,32),
+(11,7,10,30,21,29,30,33),
+(11,7,11,31,22,30,31,35),
+(11,7,12,32,22,31,32,36),
+(11,7,13,33,23,32,33,37),
+(11,7,14,34,23,33,34,38),
+(11,7,15,34,24,35,35,39),
+(11,7,16,35,24,36,36,40),
+(11,7,17,36,25,37,38,42),
+(11,7,18,37,25,38,39,43),
+(11,7,19,38,26,39,40,44),
+(11,7,20,39,26,40,41,45),
+(11,7,21,40,27,41,42,46),
+(11,7,22,41,27,43,43,48),
+(11,7,23,43,28,44,44,49),
+(11,7,24,44,28,45,45,50),
+(11,7,25,45,29,46,46,51),
+(11,7,26,46,30,47,48,53),
+(11,7,27,47,30,49,49,54),
+(11,7,28,48,31,50,50,55),
+(11,7,29,49,31,51,51,57),
+(11,7,30,50,32,53,52,58),
+(11,7,31,51,33,54,53,59),
+(11,7,32,52,33,55,55,61),
+(11,7,33,53,34,56,56,62),
+(11,7,34,55,34,58,57,64),
+(11,7,35,56,35,59,58,65),
+(11,7,36,57,36,60,60,66),
+(11,7,37,58,36,62,61,68),
+(11,7,38,59,37,63,62,69),
+(11,7,39,61,38,65,63,71),
+(11,7,40,62,38,66,65,72),
+(11,7,41,63,39,67,66,74),
+(11,7,42,64,40,69,67,75),
+(11,7,43,65,40,70,69,77),
+(11,7,44,67,41,72,70,78),
+(11,7,45,68,42,73,71,80),
+(11,7,46,69,42,75,73,81),
+(11,7,47,71,43,76,74,83),
+(11,7,48,72,44,78,76,84),
+(11,7,49,73,45,79,77,86),
+(11,7,50,74,45,81,78,88),
+(11,7,51,76,46,82,80,89),
+(11,7,52,77,47,84,81,91),
+(11,7,53,78,47,85,83,92),
+(11,7,54,80,48,87,84,94),
+(11,7,55,81,49,88,86,96),
+(11,7,56,83,50,90,87,97),
+(11,7,57,84,50,91,89,99),
+(11,7,58,85,51,93,90,101),
+(11,7,59,87,52,95,92,102),
+(11,7,60,88,53,96,93,104),
+(11,7,61,90,54,98,95,106),
+(11,7,62,91,54,99,96,108),
+(11,7,63,93,55,101,98,109),
+(11,7,64,94,56,103,99,111),
+(11,7,65,95,57,104,101,113),
+(11,7,66,97,58,106,103,115),
+(11,7,67,98,58,108,104,117),
+(11,7,68,100,59,110,106,118),
+(11,7,69,101,60,111,107,120),
+(11,7,70,103,61,113,109,122),
+(11,7,71,104,62,115,122,124),
+(11,7,72,106,63,117,124,127),
+(11,7,73,108,64,119,126,129),
+(11,7,74,110,65,122,128,131),
+(11,7,75,112,66,124,130,133),
+(11,7,76,114,67,126,133,136),
+(11,7,77,115,68,128,135,138),
+(11,7,78,117,69,130,137,140),
+(11,7,79,119,70,133,139,143),
+(11,7,80,121,71,135,141,145),
+
+(11,8,1,21,17,19,24,24),
+(11,8,2,21,17,19,25,25),
+(11,8,3,21,17,20,27,27),
+(11,8,4,21,17,20,28,28),
+(11,8,5,21,18,20,29,29),
+(11,8,6,21,18,20,31,31),
+(11,8,7,21,18,21,32,32),
+(11,8,8,22,18,21,34,33),
+(11,8,9,22,18,21,35,35),
+(11,8,10,22,19,22,37,36),
+(11,8,11,22,19,22,38,37),
+(11,8,12,22,19,22,40,39),
+(11,8,13,22,19,23,41,40),
+(11,8,14,22,19,23,43,42),
+(11,8,15,22,19,23,44,43),
+(11,8,16,22,20,24,46,45),
+(11,8,17,23,20,24,47,46),
+(11,8,18,23,20,24,49,48),
+(11,8,19,23,20,25,50,49),
+(11,8,20,23,21,25,52,51),
+(11,8,21,23,21,26,54,52),
+(11,8,22,23,21,26,55,54),
+(11,8,23,23,21,26,57,56),
+(11,8,24,24,21,27,59,57),
+(11,8,25,24,22,27,60,59),
+(11,8,26,24,22,27,62,60),
+(11,8,27,24,22,28,64,62),
+(11,8,28,24,22,28,65,64),
+(11,8,29,24,23,29,67,65),
+(11,8,30,24,23,29,69,67),
+(11,8,31,25,23,30,71,69),
+(11,8,32,25,23,30,73,71),
+(11,8,33,25,24,30,74,72),
+(11,8,34,25,24,31,76,74),
+(11,8,35,25,24,31,78,76),
+(11,8,36,26,24,32,80,78),
+(11,8,37,26,25,32,82,79),
+(11,8,38,26,25,33,84,81),
+(11,8,39,26,25,33,86,83),
+(11,8,40,26,26,34,87,85),
+(11,8,41,27,26,34,89,87),
+(11,8,42,27,26,35,91,89),
+(11,8,43,27,27,35,93,91),
+(11,8,44,27,27,36,95,92),
+(11,8,45,27,27,36,97,94),
+(11,8,46,28,27,37,99,96),
+(11,8,47,28,28,37,101,98),
+(11,8,48,28,28,38,103,100),
+(11,8,49,28,28,38,105,102),
+(11,8,50,29,29,39,107,104),
+(11,8,51,29,29,39,110,106),
+(11,8,52,29,29,40,112,108),
+(11,8,53,29,30,40,114,110),
+(11,8,54,30,30,41,116,112),
+(11,8,55,30,30,41,118,114),
+(11,8,56,30,31,42,120,116),
+(11,8,57,30,31,42,122,118),
+(11,8,58,31,31,43,125,121),
+(11,8,59,31,32,43,127,123),
+(11,8,60,31,32,44,129,125),
+(11,8,61,31,33,45,131,127),
+(11,8,62,32,33,45,133,129),
+(11,8,63,32,33,46,136,131),
+(11,8,64,32,34,46,138,134),
+(11,8,65,33,34,47,140,136),
+(11,8,66,33,34,48,143,138),
+(11,8,67,33,35,48,145,140),
+(11,8,68,33,35,49,147,142),
+(11,8,69,34,36,49,150,145),
+(11,8,70,34,36,50,152,147),
+(11,8,71,34,36,51,155,150),
+(11,8,72,34,37,52,161,153),
+(11,8,73,34,37,53,161,156),
+(11,8,74,35,38,53,164,158),
+(11,8,75,35,38,54,167,161),
+(11,8,76,35,38,55,170,164),
+(11,8,77,36,39,56,173,167),
+(11,8,78,36,39,56,176,170),
+(11,8,79,36,40,57,179,173),
+(11,8,80,37,40,58,182,176);
diff --git a/sql/updates/2008_12_22_13_mangos_item_template.sql b/sql/updates/2008_12_22_13_mangos_item_template.sql
new file mode 100644
index 00000000000..6b2d64f5166
--- /dev/null
+++ b/sql/updates/2008_12_22_13_mangos_item_template.sql
@@ -0,0 +1,4 @@
+ALTER TABLE db_version CHANGE COLUMN required_2008_12_22_12_mangos_player_levelstats required_2008_12_22_13_mangos_item_template bit;
+
+ALTER TABLE `item_template`
+ CHANGE COLUMN `TotemCategory` `TotemCategory` mediumint(9) NOT NULL default '0';
diff --git a/sql/updates/2008_12_22_14_mangos_playercreateinfo.sql b/sql/updates/2008_12_22_14_mangos_playercreateinfo.sql
new file mode 100644
index 00000000000..f36d79652bc
--- /dev/null
+++ b/sql/updates/2008_12_22_14_mangos_playercreateinfo.sql
@@ -0,0 +1,14 @@
+ALTER TABLE db_version CHANGE COLUMN required_2008_12_22_13_mangos_item_template required_2008_12_22_14_mangos_playercreateinfo bit;
+
+DELETE FROM `playercreateinfo` WHERE class = 6;
+INSERT INTO `playercreateinfo` VALUES
+(1 ,6,609,4298,2355.84,-5664.77,426.028),
+(2 ,6,609,4298,2358.44,-5666.9, 426.023),
+(3 ,6,609,4298,2358.44,-5666.9, 426.023),
+(4 ,6,609,4298,2356.21,-5662.21,426.026),
+(5 ,6,609,4298,2356.21,-5662.21,426.026),
+(6 ,6,609,4298,2358.17,-5663.21,426.027),
+(7 ,6,609,4298,2355.05,-5661.7, 426.026),
+(8 ,6,609,4298,2355.05,-5661.7, 426.026),
+(10,6,609,4298,2355.84,-5664.77,426.028),
+(11,6,609,4298,2358.17,-5663.21,426.027);
diff --git a/sql/updates/2008_12_22_15_mangos_playercreateinfo_action.sql b/sql/updates/2008_12_22_15_mangos_playercreateinfo_action.sql
new file mode 100644
index 00000000000..54bcde2914f
--- /dev/null
+++ b/sql/updates/2008_12_22_15_mangos_playercreateinfo_action.sql
@@ -0,0 +1,80 @@
+ALTER TABLE db_version CHANGE COLUMN required_2008_12_22_14_mangos_playercreateinfo required_2008_12_22_15_mangos_playercreateinfo_action bit;
+
+DELETE FROM playercreateinfo_action WHERE class = 6;
+INSERT INTO playercreateinfo_action VALUES
+(1,6,0,6603,0,0),
+(1,6,1,49576,0,0),
+(1,6,2,45477,0,0),
+(1,6,3,45462,0,0),
+(1,6,4,45902,0,0),
+(1,6,5,47541,0,0),
+(1,6,11,59752,0,0),
+(2,6,0,6603,0,0),
+(2,6,1,49576,0,0),
+(2,6,2,45477,0,0),
+(2,6,3,45462,0,0),
+(2,6,4,45902,0,0),
+(2,6,5,47541,0,0),
+(2,6,10,20572,0,0),
+(3,6,0,6603,0,0),
+(3,6,1,49576,0,0),
+(3,6,2,45477,0,0),
+(3,6,3,45462,0,0),
+(3,6,4,45902,0,0),
+(3,6,5,47541,0,0),
+(3,6,10,2481,0,0),
+(4,6,0,6603,0,0),
+(4,6,1,49576,0,0),
+(4,6,2,45477,0,0),
+(4,6,3,45462,0,0),
+(4,6,4,45902,0,0),
+(4,6,5,47541,0,0),
+(4,6,10,58984,0,0),
+(4,6,83,58984,0,0),
+(5,6,0,6603,0,0),
+(5,6,1,49576,0,0),
+(5,6,2,45477,0,0),
+(5,6,3,45462,0,0),
+(5,6,4,45902,0,0),
+(5,6,5,47541,0,0),
+(5,6,10,20577,0,0),
+(6,6,0,6603,0,0),
+(6,6,1,49576,0,0),
+(6,6,2,45477,0,0),
+(6,6,3,45462,0,0),
+(6,6,4,45902,0,0),
+(6,6,5,47541,0,0),
+(6,6,10,20549,0,0),
+(6,6,75,20549,0,0),
+(7,6,0,6603,0,0),
+(7,6,1,49576,0,0),
+(7,6,2,45477,0,0),
+(7,6,3,45462,0,0),
+(7,6,4,45902,0,0),
+(7,6,5,47541,0,0),
+(7,6,10,20589,0,0),
+(7,6,72,6603,0,0),
+(7,6,83,117,128,0),
+(7,6,84,6603,0,0),
+(7,6,96,6603,0,0),
+(7,6,108,6603,0,0),
+(8,6,0,6603,0,0),
+(8,6,1,49576,0,0),
+(8,6,2,45477,0,0),
+(8,6,3,45462,0,0),
+(8,6,4,45902,0,0),
+(8,6,5,47541,0,0),
+(8,6,10,50621,0,0),
+(10,6,0,6603,0,0),
+(10,6,1,49576,0,0),
+(10,6,2,45477,0,0),
+(10,6,3,45462,0,0),
+(10,6,4,45902,0,0),
+(10,6,5,47541,0,0),
+(10,6,6,50613,0,0),
+(11,6,0,6603,0,0),
+(11,6,1,49576,0,0),
+(11,6,2,45477,0,0),
+(11,6,3,45462,0,0),
+(11,6,4,45902,0,0),
+(11,6,5,47541,0,0);
diff --git a/sql/updates/2008_12_22_16_mangos_playercreateinfo_spell.sql b/sql/updates/2008_12_22_16_mangos_playercreateinfo_spell.sql
new file mode 100644
index 00000000000..664ea0291cd
--- /dev/null
+++ b/sql/updates/2008_12_22_16_mangos_playercreateinfo_spell.sql
@@ -0,0 +1,686 @@
+ALTER TABLE db_version CHANGE COLUMN required_2008_12_22_15_mangos_playercreateinfo_action required_2008_12_22_16_mangos_playercreateinfo_spell bit;
+
+DELETE FROM `playercreateinfo_spell` WHERE `class` = 6;
+INSERT INTO `playercreateinfo_spell` VALUES
+(1,6,81,'Dodge',1),
+(1,6,196,'One-Handed Axes',1),
+(1,6,197,'Two-Handed Axes',1),
+(1,6,200,'Polearms',1),
+(1,6,201,'One-Handed Swords',1),
+(1,6,202,'Two-Handed Swords',1),
+(1,6,203,'Unarmed',1),
+(1,6,204,'Defense',1),
+(1,6,522,'SPELLDEFENSE (DND)',1),
+(1,6,668,'Language Common',1),
+(1,6,674,'Dual Wield',1),
+(1,6,750,'Plate Mail',1),
+(1,6,1843,'Disarm',1),
+(1,6,2382,'Generic',1),
+(1,6,2479,'Honorless Target',1),
+(1,6,3050,'Detect',1),
+(1,6,3127,'Parry',1),
+(1,6,3275,'Linen Bandage',1),
+(1,6,3276,'Heavy Linen Bandage',1),
+(1,6,3277,'Wool Bandage',1),
+(1,6,3278,'Heavy Wool Bandage',1),
+(1,6,3365,'Opening',1),
+(1,6,6233,'Closing',1),
+(1,6,6246,'Closing',1),
+(1,6,6247,'Opening',1),
+(1,6,6477,'Opening',1),
+(1,6,6478,'Opening',1),
+(1,6,6603,'Attack',1),
+(1,6,7266,'Duel',1),
+(1,6,7267,'Grovel',1),
+(1,6,7355,'Stuck',1),
+(1,6,7928,'Silk Bandage',1),
+(1,6,7929,'Heavy Silk Bandage',1),
+(1,6,7934,'Anti-Venom',1),
+(1,6,8386,'Attacking',1),
+(1,6,8737,'Mail',1),
+(1,6,9077,'Leather',1),
+(1,6,9078,'Cloth',1),
+(1,6,9125,'Generic',1),
+(1,6,10840,'Mageweave Bandage',1),
+(1,6,10841,'Heavy Mageweave Bandage',1),
+(1,6,10846,'First Aid',1),
+(1,6,18629,'Runecloth Bandage',1),
+(1,6,18630,'Heavy Runecloth Bandage',1),
+(1,6,20597,'Sword Specialization',1),
+(1,6,20598,'The Human Spirit',1),
+(1,6,20599,'Diplomacy',1),
+(1,6,20864,'Mace Specialization',1),
+(1,6,21651,'Opening',1),
+(1,6,21652,'Closing',1),
+(1,6,22027,'Remove Insignia',1),
+(1,6,22810,'Opening - No Text',1),
+(1,6,33391,'Journeyman Riding',1),
+(1,6,45462,'Plague Strike',1),
+(1,6,45477,'Icy Touch',1),
+(1,6,45902,'Blood Strike',1),
+(1,6,45903,'Offensive State (DND)',1),
+(1,6,45927,'Summon Friend',1),
+(1,6,47541,'Death Coil',1),
+(1,6,48266,'Blood Presence',1),
+(1,6,49410,'Forceful Deflection',1),
+(1,6,49576,'Death Grip',1),
+(1,6,52665,'Sigil',1),
+(1,6,58985,'Perception',1),
+(1,6,59752,'Every Man for Himself',1),
+(1,6,59879,'Blood Plague',1),
+(1,6,59921,'Frost Fever',1),
+(1,6,61437,'Opening',1),
+(1,6,61455,'Runic Focus',1),
+(2,6,81,'Dodge',1),
+(2,6,196,'One-Handed Axes',1),
+(2,6,197,'Two-Handed Axes',1),
+(2,6,200,'Polearms',1),
+(2,6,201,'One-Handed Swords',1),
+(2,6,202,'Two-Handed Swords',1),
+(2,6,203,'Unarmed',1),
+(2,6,204,'Defense',1),
+(2,6,522,'SPELLDEFENSE (DND)',1),
+(2,6,669,'Language Orcish',1),
+(2,6,674,'Dual Wield',1),
+(2,6,750,'Plate Mail',1),
+(2,6,1843,'Disarm',1),
+(2,6,2382,'Generic',1),
+(2,6,2479,'Honorless Target',1),
+(2,6,3050,'Detect',1),
+(2,6,3127,'Parry',1),
+(2,6,3275,'Linen Bandage',1),
+(2,6,3276,'Heavy Linen Bandage',1),
+(2,6,3277,'Wool Bandage',1),
+(2,6,3278,'Heavy Wool Bandage',1),
+(2,6,3365,'Opening',1),
+(2,6,6233,'Closing',1),
+(2,6,6246,'Closing',1),
+(2,6,6247,'Opening',1),
+(2,6,6477,'Opening',1),
+(2,6,6478,'Opening',1),
+(2,6,6603,'Attack',1),
+(2,6,7266,'Duel',1),
+(2,6,7267,'Grovel',1),
+(2,6,7355,'Stuck',1),
+(2,6,7928,'Silk Bandage',1),
+(2,6,7929,'Heavy Silk Bandage',1),
+(2,6,7934,'Anti-Venom',1),
+(2,6,8386,'Attacking',1),
+(2,6,8737,'Mail',1),
+(2,6,9077,'Leather',1),
+(2,6,9078,'Cloth',1),
+(2,6,9125,'Generic',1),
+(2,6,10840,'Mageweave Bandage',1),
+(2,6,10841,'Heavy Mageweave Bandage',1),
+(2,6,10846,'First Aid',1),
+(2,6,18629,'Runecloth Bandage',1),
+(2,6,18630,'Heavy Runecloth Bandage',1),
+(2,6,20572,'Blood Fury',1),
+(2,6,20573,'Hardiness',1),
+(2,6,20574,'Axe Specialization',1),
+(2,6,21651,'Opening',1),
+(2,6,21652,'Closing',1),
+(2,6,22027,'Remove Insignia',1),
+(2,6,22810,'Opening - No Text',1),
+(2,6,33391,'Journeyman Riding',1),
+(2,6,45462,'Plague Strike',1),
+(2,6,45477,'Icy Touch',1),
+(2,6,45902,'Blood Strike',1),
+(2,6,45903,'Offensive State (DND)',1),
+(2,6,45927,'Summon Friend',1),
+(2,6,47541,'Death Coil',1),
+(2,6,48266,'Blood Presence',1),
+(2,6,49410,'Forceful Deflection',1),
+(2,6,49576,'Death Grip',1),
+(2,6,52665,'Sigil',1),
+(2,6,54562,'Command',1),
+(2,6,59879,'Blood Plague',1),
+(2,6,59921,'Frost Fever',1),
+(2,6,61437,'Opening',1),
+(2,6,61455,'Runic Focus',1),
+(3,6,81,'Dodge',1),
+(3,6,196,'One-Handed Axes',1),
+(3,6,197,'Two-Handed Axes',1),
+(3,6,200,'Polearms',1),
+(3,6,201,'One-Handed Swords',1),
+(3,6,202,'Two-Handed Swords',1),
+(3,6,203,'Unarmed',1),
+(3,6,204,'Defense',1),
+(3,6,522,'SPELLDEFENSE (DND)',1),
+(3,6,668,'Language Common',1),
+(3,6,672,'Language Dwarven',1),
+(3,6,674,'Dual Wield',1),
+(3,6,750,'Plate Mail',1),
+(3,6,1843,'Disarm',1),
+(3,6,2382,'Generic',1),
+(3,6,2479,'Honorless Target',1),
+(3,6,2481,'Find Treasure',1),
+(3,6,3050,'Detect',1),
+(3,6,3127,'Parry',1),
+(3,6,3275,'Linen Bandage',1),
+(3,6,3276,'Heavy Linen Bandage',1),
+(3,6,3277,'Wool Bandage',1),
+(3,6,3278,'Heavy Wool Bandage',1),
+(3,6,3365,'Opening',1),
+(3,6,6233,'Closing',1),
+(3,6,6246,'Closing',1),
+(3,6,6247,'Opening',1),
+(3,6,6477,'Opening',1),
+(3,6,6478,'Opening',1),
+(3,6,6603,'Attack',1),
+(3,6,7266,'Duel',1),
+(3,6,7267,'Grovel',1),
+(3,6,7355,'Stuck',1),
+(3,6,7928,'Silk Bandage',1),
+(3,6,7929,'Heavy Silk Bandage',1),
+(3,6,7934,'Anti-Venom',1),
+(3,6,8386,'Attacking',1),
+(3,6,8737,'Mail',1),
+(3,6,9077,'Leather',1),
+(3,6,9078,'Cloth',1),
+(3,6,9125,'Generic',1),
+(3,6,10840,'Mageweave Bandage',1),
+(3,6,10841,'Heavy Mageweave Bandage',1),
+(3,6,10846,'First Aid',1),
+(3,6,18629,'Runecloth Bandage',1),
+(3,6,18630,'Heavy Runecloth Bandage',1),
+(3,6,20594,'Stoneform',1),
+(3,6,20595,'Gun Specialization',1),
+(3,6,20596,'Frost Resistance',1),
+(3,6,21651,'Opening',1),
+(3,6,21652,'Closing',1),
+(3,6,22027,'Remove Insignia',1),
+(3,6,22810,'Opening - No Text',1),
+(3,6,33391,'Journeyman Riding',1),
+(3,6,45462,'Plague Strike',1),
+(3,6,45477,'Icy Touch',1),
+(3,6,45902,'Blood Strike',1),
+(3,6,45903,'Offensive State (DND)',1),
+(3,6,45927,'Summon Friend',1),
+(3,6,47541,'Death Coil',1),
+(3,6,48266,'Blood Presence',1),
+(3,6,49410,'Forceful Deflection',1),
+(3,6,49576,'Death Grip',1),
+(3,6,52665,'Sigil',1),
+(3,6,59224,'Mace Specialization',1),
+(3,6,59879,'Blood Plague',1),
+(3,6,59921,'Frost Fever',1),
+(3,6,61437,'Opening',1),
+(3,6,61455,'Runic Focus',1),
+(4,6,81,'Dodge',1),
+(4,6,196,'One-Handed Axes',1),
+(4,6,197,'Two-Handed Axes',1),
+(4,6,200,'Polearms',1),
+(4,6,201,'One-Handed Swords',1),
+(4,6,202,'Two-Handed Swords',1),
+(4,6,203,'Unarmed',1),
+(4,6,204,'Defense',1),
+(4,6,522,'SPELLDEFENSE (DND)',1),
+(4,6,668,'Language Common',1),
+(4,6,671,'Language Darnassian',1),
+(4,6,674,'Dual Wield',1),
+(4,6,750,'Plate Mail',1),
+(4,6,1843,'Disarm',1),
+(4,6,2382,'Generic',1),
+(4,6,2479,'Honorless Target',1),
+(4,6,3050,'Detect',1),
+(4,6,3127,'Parry',1),
+(4,6,3275,'Linen Bandage',1),
+(4,6,3276,'Heavy Linen Bandage',1),
+(4,6,3277,'Wool Bandage',1),
+(4,6,3278,'Heavy Wool Bandage',1),
+(4,6,3365,'Opening',1),
+(4,6,6233,'Closing',1),
+(4,6,6246,'Closing',1),
+(4,6,6247,'Opening',1),
+(4,6,6477,'Opening',1),
+(4,6,6478,'Opening',1),
+(4,6,6603,'Attack',1),
+(4,6,7266,'Duel',1),
+(4,6,7267,'Grovel',1),
+(4,6,7355,'Stuck',1),
+(4,6,7928,'Silk Bandage',1),
+(4,6,7929,'Heavy Silk Bandage',1),
+(4,6,7934,'Anti-Venom',1),
+(4,6,8386,'Attacking',1),
+(4,6,8737,'Mail',1),
+(4,6,9077,'Leather',1),
+(4,6,9078,'Cloth',1),
+(4,6,9125,'Generic',1),
+(4,6,10840,'Mageweave Bandage',1),
+(4,6,10841,'Heavy Mageweave Bandage',1),
+(4,6,10846,'First Aid',1),
+(4,6,18629,'Runecloth Bandage',1),
+(4,6,18630,'Heavy Runecloth Bandage',1),
+(4,6,20582,'Quickness',1),
+(4,6,20583,'Nature Resistance',1),
+(4,6,20585,'Wisp Spirit',1),
+(4,6,21651,'Opening',1),
+(4,6,21652,'Closing',1),
+(4,6,22027,'Remove Insignia',1),
+(4,6,22810,'Opening - No Text',1),
+(4,6,33391,'Journeyman Riding',1),
+(4,6,45462,'Plague Strike',1),
+(4,6,45477,'Icy Touch',1),
+(4,6,45902,'Blood Strike',1),
+(4,6,45903,'Offensive State (DND)',1),
+(4,6,45927,'Summon Friend',1),
+(4,6,47541,'Death Coil',1),
+(4,6,48266,'Blood Presence',1),
+(4,6,49410,'Forceful Deflection',1),
+(4,6,49576,'Death Grip',1),
+(4,6,52665,'Sigil',1),
+(4,6,58984,'Shadowmeld',1),
+(4,6,59879,'Blood Plague',1),
+(4,6,59921,'Frost Fever',1),
+(4,6,61437,'Opening',1),
+(4,6,61455,'Runic Focus',1),
+(5,6,81,'Dodge',1),
+(5,6,196,'One-Handed Axes',1),
+(5,6,197,'Two-Handed Axes',1),
+(5,6,200,'Polearms',1),
+(5,6,201,'One-Handed Swords',1),
+(5,6,202,'Two-Handed Swords',1),
+(5,6,203,'Unarmed',1),
+(5,6,204,'Defense',1),
+(5,6,522,'SPELLDEFENSE (DND)',1),
+(5,6,669,'Language Orcish',1),
+(5,6,674,'Dual Wield',1),
+(5,6,750,'Plate Mail',1),
+(5,6,1843,'Disarm',1),
+(5,6,2382,'Generic',1),
+(5,6,2479,'Honorless Target',1),
+(5,6,3050,'Detect',1),
+(5,6,3127,'Parry',1),
+(5,6,3275,'Linen Bandage',1),
+(5,6,3276,'Heavy Linen Bandage',1),
+(5,6,3277,'Wool Bandage',1),
+(5,6,3278,'Heavy Wool Bandage',1),
+(5,6,3365,'Opening',1),
+(5,6,5227,'Underwater Breathing',1),
+(5,6,6233,'Closing',1),
+(5,6,6246,'Closing',1),
+(5,6,6247,'Opening',1),
+(5,6,6477,'Opening',1),
+(5,6,6478,'Opening',1),
+(5,6,6603,'Attack',1),
+(5,6,7266,'Duel',1),
+(5,6,7267,'Grovel',1),
+(5,6,7355,'Stuck',1),
+(5,6,7744,'Will of the Forsaken',1),
+(5,6,7928,'Silk Bandage',1),
+(5,6,7929,'Heavy Silk Bandage',1),
+(5,6,7934,'Anti-Venom',1),
+(5,6,8386,'Attacking',1),
+(5,6,8737,'Mail',1),
+(5,6,9077,'Leather',1),
+(5,6,9078,'Cloth',1),
+(5,6,9125,'Generic',1),
+(5,6,10840,'Mageweave Bandage',1),
+(5,6,10841,'Heavy Mageweave Bandage',1),
+(5,6,10846,'First Aid',1),
+(5,6,17737,'Language Gutterspeak',1),
+(5,6,18629,'Runecloth Bandage',1),
+(5,6,18630,'Heavy Runecloth Bandage',1),
+(5,6,20577,'Cannibalize',1),
+(5,6,20579,'Shadow Resistance',1),
+(5,6,21651,'Opening',1),
+(5,6,21652,'Closing',1),
+(5,6,22027,'Remove Insignia',1),
+(5,6,22810,'Opening - No Text',1),
+(5,6,33391,'Journeyman Riding',1),
+(5,6,45462,'Plague Strike',1),
+(5,6,45477,'Icy Touch',1),
+(5,6,45902,'Blood Strike',1),
+(5,6,45903,'Offensive State (DND)',1),
+(5,6,45927,'Summon Friend',1),
+(5,6,47541,'Death Coil',1),
+(5,6,48266,'Blood Presence',1),
+(5,6,49410,'Forceful Deflection',1),
+(5,6,49576,'Death Grip',1),
+(5,6,52665,'Sigil',1),
+(5,6,59879,'Blood Plague',1),
+(5,6,59921,'Frost Fever',1),
+(5,6,61437,'Opening',1),
+(5,6,61455,'Runic Focus',1),
+(6,6,81,'Dodge',1),
+(6,6,196,'One-Handed Axes',1),
+(6,6,197,'Two-Handed Axes',1),
+(6,6,200,'Polearms',1),
+(6,6,201,'One-Handed Swords',1),
+(6,6,202,'Two-Handed Swords',1),
+(6,6,203,'Unarmed',1),
+(6,6,204,'Defense',1),
+(6,6,522,'SPELLDEFENSE (DND)',1),
+(6,6,669,'Language Orcish',1),
+(6,6,670,'Language Taurahe',1),
+(6,6,674,'Dual Wield',1),
+(6,6,750,'Plate Mail',1),
+(6,6,1843,'Disarm',1),
+(6,6,2382,'Generic',1),
+(6,6,2479,'Honorless Target',1),
+(6,6,3050,'Detect',1),
+(6,6,3127,'Parry',1),
+(6,6,3275,'Linen Bandage',1),
+(6,6,3276,'Heavy Linen Bandage',1),
+(6,6,3277,'Wool Bandage',1),
+(6,6,3278,'Heavy Wool Bandage',1),
+(6,6,3365,'Opening',1),
+(6,6,6233,'Closing',1),
+(6,6,6246,'Closing',1),
+(6,6,6247,'Opening',1),
+(6,6,6477,'Opening',1),
+(6,6,6478,'Opening',1),
+(6,6,6603,'Attack',1),
+(6,6,7266,'Duel',1),
+(6,6,7267,'Grovel',1),
+(6,6,7355,'Stuck',1),
+(6,6,7928,'Silk Bandage',1),
+(6,6,7929,'Heavy Silk Bandage',1),
+(6,6,7934,'Anti-Venom',1),
+(6,6,8386,'Attacking',1),
+(6,6,8737,'Mail',1),
+(6,6,9077,'Leather',1),
+(6,6,9078,'Cloth',1),
+(6,6,9125,'Generic',1),
+(6,6,10840,'Mageweave Bandage',1),
+(6,6,10841,'Heavy Mageweave Bandage',1),
+(6,6,10846,'First Aid',1),
+(6,6,18629,'Runecloth Bandage',1),
+(6,6,18630,'Heavy Runecloth Bandage',1),
+(6,6,20549,'War Stomp',1),
+(6,6,20550,'Endurance',1),
+(6,6,20551,'Nature Resistance',1),
+(6,6,20552,'Cultivation',1),
+(6,6,21651,'Opening',1),
+(6,6,21652,'Closing',1),
+(6,6,22027,'Remove Insignia',1),
+(6,6,22810,'Opening - No Text',1),
+(6,6,33391,'Journeyman Riding',1),
+(6,6,45462,'Plague Strike',1),
+(6,6,45477,'Icy Touch',1),
+(6,6,45902,'Blood Strike',1),
+(6,6,45903,'Offensive State (DND)',1),
+(6,6,45927,'Summon Friend',1),
+(6,6,47541,'Death Coil',1),
+(6,6,48266,'Blood Presence',1),
+(6,6,49410,'Forceful Deflection',1),
+(6,6,49576,'Death Grip',1),
+(6,6,52665,'Sigil',1),
+(6,6,59879,'Blood Plague',1),
+(6,6,59921,'Frost Fever',1),
+(6,6,61437,'Opening',1),
+(6,6,61455,'Runic Focus',1),
+(7,6,81,'Dodge',1),
+(7,6,196,'One-Handed Axes',1),
+(7,6,197,'Two-Handed Axes',1),
+(7,6,200,'Polearms',1),
+(7,6,201,'One-Handed Swords',1),
+(7,6,202,'Two-Handed Swords',1),
+(7,6,203,'Unarmed',1),
+(7,6,204,'Defense',1),
+(7,6,522,'SPELLDEFENSE (DND)',1),
+(7,6,668,'Language Common',1),
+(7,6,674,'Dual Wield',1),
+(7,6,750,'Plate Mail',1),
+(7,6,1843,'Disarm',1),
+(7,6,2382,'Generic',1),
+(7,6,2479,'Honorless Target',1),
+(7,6,3050,'Detect',1),
+(7,6,3127,'Parry',1),
+(7,6,3275,'Linen Bandage',1),
+(7,6,3276,'Heavy Linen Bandage',1),
+(7,6,3277,'Wool Bandage',1),
+(7,6,3278,'Heavy Wool Bandage',1),
+(7,6,3365,'Opening',1),
+(7,6,6233,'Closing',1),
+(7,6,6246,'Closing',1),
+(7,6,6247,'Opening',1),
+(7,6,6477,'Opening',1),
+(7,6,6478,'Opening',1),
+(7,6,6603,'Attack',1),
+(7,6,7266,'Duel',1),
+(7,6,7267,'Grovel',1),
+(7,6,7340,'Language Gnomish',1),
+(7,6,7355,'Stuck',1),
+(7,6,7928,'Silk Bandage',1),
+(7,6,7929,'Heavy Silk Bandage',1),
+(7,6,7934,'Anti-Venom',1),
+(7,6,8386,'Attacking',1),
+(7,6,8737,'Mail',1),
+(7,6,9077,'Leather',1),
+(7,6,9078,'Cloth',1),
+(7,6,9125,'Generic',1),
+(7,6,10840,'Mageweave Bandage',1),
+(7,6,10841,'Heavy Mageweave Bandage',1),
+(7,6,10846,'First Aid',1),
+(7,6,18629,'Runecloth Bandage',1),
+(7,6,18630,'Heavy Runecloth Bandage',1),
+(7,6,20589,'Escape Artist',1),
+(7,6,20591,'Expansive Mind',1),
+(7,6,20592,'Arcane Resistance',1),
+(7,6,20593,'Engineering Specialization',1),
+(7,6,21651,'Opening',1),
+(7,6,21652,'Closing',1),
+(7,6,22027,'Remove Insignia',1),
+(7,6,22810,'Opening - No Text',1),
+(7,6,33391,'Journeyman Riding',1),
+(7,6,45462,'Plague Strike',1),
+(7,6,45477,'Icy Touch',1),
+(7,6,45902,'Blood Strike',1),
+(7,6,45903,'Offensive State (DND)',1),
+(7,6,45927,'Summon Friend',1),
+(7,6,47541,'Death Coil',1),
+(7,6,48266,'Blood Presence',1),
+(7,6,49410,'Forceful Deflection',1),
+(7,6,49576,'Death Grip',1),
+(7,6,52665,'Sigil',1),
+(7,6,59879,'Blood Plague',1),
+(7,6,59921,'Frost Fever',1),
+(7,6,61437,'Opening',1),
+(7,6,61455,'Runic Focus',1),
+(8,6,81,'Dodge',1),
+(8,6,196,'One-Handed Axes',1),
+(8,6,197,'Two-Handed Axes',1),
+(8,6,200,'Polearms',1),
+(8,6,201,'One-Handed Swords',1),
+(8,6,202,'Two-Handed Swords',1),
+(8,6,203,'Unarmed',1),
+(8,6,204,'Defense',1),
+(8,6,522,'SPELLDEFENSE (DND)',1),
+(8,6,669,'Language Orcish',1),
+(8,6,674,'Dual Wield',1),
+(8,6,750,'Plate Mail',1),
+(8,6,1843,'Disarm',1),
+(8,6,2382,'Generic',1),
+(8,6,2479,'Honorless Target',1),
+(8,6,3050,'Detect',1),
+(8,6,3127,'Parry',1),
+(8,6,3275,'Linen Bandage',1),
+(8,6,3276,'Heavy Linen Bandage',1),
+(8,6,3277,'Wool Bandage',1),
+(8,6,3278,'Heavy Wool Bandage',1),
+(8,6,3365,'Opening',1),
+(8,6,6233,'Closing',1),
+(8,6,6246,'Closing',1),
+(8,6,6247,'Opening',1),
+(8,6,6477,'Opening',1),
+(8,6,6478,'Opening',1),
+(8,6,6603,'Attack',1),
+(8,6,7266,'Duel',1),
+(8,6,7267,'Grovel',1),
+(8,6,7341,'Language Troll',1),
+(8,6,7355,'Stuck',1),
+(8,6,7928,'Silk Bandage',1),
+(8,6,7929,'Heavy Silk Bandage',1),
+(8,6,7934,'Anti-Venom',1),
+(8,6,8386,'Attacking',1),
+(8,6,8737,'Mail',1),
+(8,6,9077,'Leather',1),
+(8,6,9078,'Cloth',1),
+(8,6,9125,'Generic',1),
+(8,6,10840,'Mageweave Bandage',1),
+(8,6,10841,'Heavy Mageweave Bandage',1),
+(8,6,10846,'First Aid',1),
+(8,6,18629,'Runecloth Bandage',1),
+(8,6,18630,'Heavy Runecloth Bandage',1),
+(8,6,20555,'Regeneration',1),
+(8,6,20557,'Beast Slaying',1),
+(8,6,20558,'Throwing Specialization',1),
+(8,6,21651,'Opening',1),
+(8,6,21652,'Closing',1),
+(8,6,22027,'Remove Insignia',1),
+(8,6,22810,'Opening - No Text',1),
+(8,6,26290,'Bow Specialization',1),
+(8,6,33391,'Journeyman Riding',1),
+(8,6,45462,'Plague Strike',1),
+(8,6,45477,'Icy Touch',1),
+(8,6,45902,'Blood Strike',1),
+(8,6,45903,'Offensive State (DND)',1),
+(8,6,45927,'Summon Friend',1),
+(8,6,47541,'Death Coil',1),
+(8,6,48266,'Blood Presence',1),
+(8,6,49410,'Forceful Deflection',1),
+(8,6,49576,'Death Grip',1),
+(8,6,50621,'Berserking',1),
+(8,6,52665,'Sigil',1),
+(8,6,58943,'Da Voodoo Shuffle',1),
+(8,6,59879,'Blood Plague',1),
+(8,6,59921,'Frost Fever',1),
+(8,6,61437,'Opening',1),
+(8,6,61455,'Runic Focus',1),
+(10,6,81,'Dodge',1),
+(10,6,196,'One-Handed Axes',1),
+(10,6,197,'Two-Handed Axes',1),
+(10,6,200,'Polearms',1),
+(10,6,201,'One-Handed Swords',1),
+(10,6,202,'Two-Handed Swords',1),
+(10,6,203,'Unarmed',1),
+(10,6,204,'Defense',1),
+(10,6,522,'SPELLDEFENSE (DND)',1),
+(10,6,669,'Language Orcish',1),
+(10,6,674,'Dual Wield',1),
+(10,6,750,'Plate Mail',1),
+(10,6,813,'Language Thalassian',1),
+(10,6,822,'Magic Resistance',1),
+(10,6,1843,'Disarm',1),
+(10,6,2382,'Generic',1),
+(10,6,2479,'Honorless Target',1),
+(10,6,3050,'Detect',1),
+(10,6,3127,'Parry',1),
+(10,6,3275,'Linen Bandage',1),
+(10,6,3276,'Heavy Linen Bandage',1),
+(10,6,3277,'Wool Bandage',1),
+(10,6,3278,'Heavy Wool Bandage',1),
+(10,6,3365,'Opening',1),
+(10,6,6233,'Closing',1),
+(10,6,6246,'Closing',1),
+(10,6,6247,'Opening',1),
+(10,6,6477,'Opening',1),
+(10,6,6478,'Opening',1),
+(10,6,6603,'Attack',1),
+(10,6,7266,'Duel',1),
+(10,6,7267,'Grovel',1),
+(10,6,7355,'Stuck',1),
+(10,6,7928,'Silk Bandage',1),
+(10,6,7929,'Heavy Silk Bandage',1),
+(10,6,7934,'Anti-Venom',1),
+(10,6,8386,'Attacking',1),
+(10,6,8737,'Mail',1),
+(10,6,9077,'Leather',1),
+(10,6,9078,'Cloth',1),
+(10,6,9125,'Generic',1),
+(10,6,10840,'Mageweave Bandage',1),
+(10,6,10841,'Heavy Mageweave Bandage',1),
+(10,6,10846,'First Aid',1),
+(10,6,18629,'Runecloth Bandage',1),
+(10,6,18630,'Heavy Runecloth Bandage',1),
+(10,6,21651,'Opening',1),
+(10,6,21652,'Closing',1),
+(10,6,22027,'Remove Insignia',1),
+(10,6,22810,'Opening - No Text',1),
+(10,6,28877,'Arcane Affinity',1),
+(10,6,33391,'Journeyman Riding',1),
+(10,6,45462,'Plague Strike',1),
+(10,6,45477,'Icy Touch',1),
+(10,6,45902,'Blood Strike',1),
+(10,6,45903,'Offensive State (DND)',1),
+(10,6,45927,'Summon Friend',1),
+(10,6,47541,'Death Coil',1),
+(10,6,48266,'Blood Presence',1),
+(10,6,49410,'Forceful Deflection',1),
+(10,6,49576,'Death Grip',1),
+(10,6,50613,'Arcane Torrent',1),
+(10,6,52665,'Sigil',1),
+(10,6,59879,'Blood Plague',1),
+(10,6,59921,'Frost Fever',1),
+(10,6,61437,'Opening',1),
+(10,6,61455,'Runic Focus',1),
+(11,6,81,'Dodge',1),
+(11,6,196,'One-Handed Axes',1),
+(11,6,197,'Two-Handed Axes',1),
+(11,6,200,'Polearms',1),
+(11,6,201,'One-Handed Swords',1),
+(11,6,202,'Two-Handed Swords',1),
+(11,6,203,'Unarmed',1),
+(11,6,204,'Defense',1),
+(11,6,522,'SPELLDEFENSE (DND)',1),
+(11,6,668,'Language Common',1),
+(11,6,674,'Dual Wield',1),
+(11,6,750,'Plate Mail',1),
+(11,6,1843,'Disarm',1),
+(11,6,2382,'Generic',1),
+(11,6,2479,'Honorless Target',1),
+(11,6,3050,'Detect',1),
+(11,6,3127,'Parry',1),
+(11,6,3275,'Linen Bandage',1),
+(11,6,3276,'Heavy Linen Bandage',1),
+(11,6,3277,'Wool Bandage',1),
+(11,6,3278,'Heavy Wool Bandage',1),
+(11,6,3365,'Opening',1),
+(11,6,6233,'Closing',1),
+(11,6,6246,'Closing',1),
+(11,6,6247,'Opening',1),
+(11,6,6477,'Opening',1),
+(11,6,6478,'Opening',1),
+(11,6,6562,'Heroic Presence',1),
+(11,6,6603,'Attack',1),
+(11,6,7266,'Duel',1),
+(11,6,7267,'Grovel',1),
+(11,6,7355,'Stuck',1),
+(11,6,7928,'Silk Bandage',1),
+(11,6,7929,'Heavy Silk Bandage',1),
+(11,6,7934,'Anti-Venom',1),
+(11,6,8386,'Attacking',1),
+(11,6,8737,'Mail',1),
+(11,6,9077,'Leather',1),
+(11,6,9078,'Cloth',1),
+(11,6,9125,'Generic',1),
+(11,6,10840,'Mageweave Bandage',1),
+(11,6,10841,'Heavy Mageweave Bandage',1),
+(11,6,10846,'First Aid',1),
+(11,6,18629,'Runecloth Bandage',1),
+(11,6,18630,'Heavy Runecloth Bandage',1),
+(11,6,21651,'Opening',1),
+(11,6,21652,'Closing',1),
+(11,6,22027,'Remove Insignia',1),
+(11,6,22810,'Opening - No Text',1),
+(11,6,28875,'Gemcutting',1),
+(11,6,29932,'Language Draenei',1),
+(11,6,33391,'Journeyman Riding',1),
+(11,6,45462,'Plague Strike',1),
+(11,6,45477,'Icy Touch',1),
+(11,6,45902,'Blood Strike',1),
+(11,6,45903,'Offensive State (DND)',1),
+(11,6,45927,'Summon Friend',1),
+(11,6,47541,'Death Coil',1),
+(11,6,48266,'Blood Presence',1),
+(11,6,49410,'Forceful Deflection',1),
+(11,6,49576,'Death Grip',1),
+(11,6,52665,'Sigil',1),
+(11,6,59539,'Shadow Resistance',1),
+(11,6,59545,'Gift of the Naaru',1),
+(11,6,59879,'Blood Plague',1),
+(11,6,59921,'Frost Fever',1),
+(11,6,61437,'Opening',1),
+(11,6,61455,'Runic Focus',1);
diff --git a/sql/updates/2008_12_22_17_mangos_item_template.sql b/sql/updates/2008_12_22_17_mangos_item_template.sql
new file mode 100644
index 00000000000..9e2eafaf7bb
--- /dev/null
+++ b/sql/updates/2008_12_22_17_mangos_item_template.sql
@@ -0,0 +1,18 @@
+ALTER TABLE db_version CHANGE COLUMN required_2008_12_22_16_mangos_playercreateinfo_spell required_2008_12_22_17_mangos_item_template bit;
+
+DELETE FROM item_template WHERE entry IN (34648,34649,34650,34651,34652,34653,34655,34656,34657,34658,34659,38145,38147,41751);
+INSERT INTO item_template VALUES
+(34648,4,4,-1,'Acherus Knight\'s Greaves',51496,2,32768,1,51,10,8,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,10,7,12,3,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,392,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,55,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34649,4,4,-1,'Acherus Knight\'s Gauntlets',51498,2,32768,1,34,6,10,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,15,7,6,32,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,356,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34650,4,4,-1,'Acherus Knight\'s Tunic',51494,2,32768,1,69,13,5,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,20,7,11,32,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,570,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,115,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34651,4,4,-1,'Acherus Knight\'s Girdle',51497,2,32768,1,35,7,6,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,2,4,10,32,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,320,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34652,4,4,-1,'Acherus Knight\'s Hood',51495,2,32768,1,52,10,1,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,15,7,15,32,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,463,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,70,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34653,4,4,-1,'Acherus Knight\'s Wristguard',51500,2,32768,1,36,7,9,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,7,31,7,7,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34655,4,4,-1,'Acherus Knight\'s Pauldrons',51501,2,32768,1,54,10,3,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,11,3,9,7,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,427,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,70,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34656,4,4,-1,'Acherus Knight\'s Cover',51499,2,32768,1,73,14,7,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,13,3,10,7,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,499,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,85,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34657,4,0,-1,'Choker of Damnation',6539,2,32768,1,2303,575,2,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,9,7,8,31,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34658,4,0,-1,'Plague Band',963,2,32768,1,534,133,11,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,11,3,6,7,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34659,4,1,-1,'Acherus Knight\'s Shroud',49738,2,32768,1,31,6,16,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,2,4,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(38145,1,0,-1,'Deathweave Bag',1282,1,32768,1,0,0,18,-1,-1,35,0,0,0,0,0,0,0,0,0,1,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(38147,4,0,-1,'Corrupted Band',963,2,32768,1,534,133,11,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,11,3,6,32,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(41751,0,5,-1,'Black Mushroom',36728,1,0,1,100,5,0,-1,-1,65,55,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27094,0,-1,0,0,11,1000,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,'',0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0);
diff --git a/sql/updates/2008_12_22_18_characters_characters.sql b/sql/updates/2008_12_22_18_characters_characters.sql
new file mode 100644
index 00000000000..21f25913a9b
--- /dev/null
+++ b/sql/updates/2008_12_22_18_characters_characters.sql
@@ -0,0 +1,68 @@
+ALTER TABLE character_db_version CHANGE COLUMN required_2008_12_22_06_characters_character_achievement required_2008_12_22_18_characters_characters bit;
+
+UPDATE characters SET data = REPLACE(data,' ',' ');
+UPDATE characters SET data = CONCAT(TRIM(data),' ');
+
+
+UPDATE characters SET data = CONCAT(
+ SUBSTRING(data, 1, length(SUBSTRING_INDEX(data, ' ', 10))), " 0 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 10))+2, length(SUBSTRING_INDEX(data, ' ', 18))- length(SUBSTRING_INDEX(data, ' ', 10)) - 1), " ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 20))+2, length(SUBSTRING_INDEX(data, ' ', 22))- length(SUBSTRING_INDEX(data, ' ', 20)) - 1), " ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 36))+2, length(SUBSTRING_INDEX(data, ' ', 37))- length(SUBSTRING_INDEX(data, ' ', 36)) - 1), " ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 22))+2, length(SUBSTRING_INDEX(data, ' ', 28))- length(SUBSTRING_INDEX(data, ' ', 22)) - 1), " 0 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 28))+2, length(SUBSTRING_INDEX(data, ' ', 34))- length(SUBSTRING_INDEX(data, ' ', 28)) - 1), " 0 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 1564))+2, length(SUBSTRING_INDEX(data, ' ', 1565))- length(SUBSTRING_INDEX(data, ' ', 1564)) - 1), " 0 0 0 0 0 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 1565))+2, length(SUBSTRING_INDEX(data, ' ', 1566))- length(SUBSTRING_INDEX(data, ' ', 1565)) - 1), " 0 0 0 0 0 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 34))+2, length(SUBSTRING_INDEX(data, ' ', 36))- length(SUBSTRING_INDEX(data, ' ', 34)) - 1), " 0 0 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 46))+2, length(SUBSTRING_INDEX(data, ' ', 48))- length(SUBSTRING_INDEX(data, ' ', 46)) - 1), " ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 146))+2, length(SUBSTRING_INDEX(data, ' ', 170))- length(SUBSTRING_INDEX(data, ' ', 146)) - 1), " ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 171))+2, length(SUBSTRING_INDEX(data, ' ', 209))- length(SUBSTRING_INDEX(data, ' ', 171)) - 1), " ",
+ ((SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 209))+2, length(SUBSTRING_INDEX(data, ' ', 210))- length(SUBSTRING_INDEX(data, ' ', 209)) - 1) & ~0x100) | ((SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 46))+2, length(SUBSTRING_INDEX(data, ' ', 47))- length(SUBSTRING_INDEX(data, ' ', 46)) - 1) & 0x1000) >> 4)), " ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 210))+2, length(SUBSTRING_INDEX(data, ' ', 233))- length(SUBSTRING_INDEX(data, ' ', 210)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 233))+2, length(SUBSTRING_INDEX(data, ' ', 358))- length(SUBSTRING_INDEX(data, ' ', 233)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 358))+2, length(SUBSTRING_INDEX(data, ' ', 359))- length(SUBSTRING_INDEX(data, ' ', 358)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 359))+2, length(SUBSTRING_INDEX(data, ' ', 374))- length(SUBSTRING_INDEX(data, ' ', 359)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 374))+2, length(SUBSTRING_INDEX(data, ' ', 375))- length(SUBSTRING_INDEX(data, ' ', 374)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 375))+2, length(SUBSTRING_INDEX(data, ' ', 390))- length(SUBSTRING_INDEX(data, ' ', 375)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 390))+2, length(SUBSTRING_INDEX(data, ' ', 391))- length(SUBSTRING_INDEX(data, ' ', 390)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 391))+2, length(SUBSTRING_INDEX(data, ' ', 406))- length(SUBSTRING_INDEX(data, ' ', 391)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 406))+2, length(SUBSTRING_INDEX(data, ' ', 407))- length(SUBSTRING_INDEX(data, ' ', 406)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 407))+2, length(SUBSTRING_INDEX(data, ' ', 422))- length(SUBSTRING_INDEX(data, ' ', 407)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 422))+2, length(SUBSTRING_INDEX(data, ' ', 423))- length(SUBSTRING_INDEX(data, ' ', 422)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 423))+2, length(SUBSTRING_INDEX(data, ' ', 438))- length(SUBSTRING_INDEX(data, ' ', 423)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 438))+2, length(SUBSTRING_INDEX(data, ' ', 439))- length(SUBSTRING_INDEX(data, ' ', 438)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 439))+2, length(SUBSTRING_INDEX(data, ' ', 454))- length(SUBSTRING_INDEX(data, ' ', 439)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 454))+2, length(SUBSTRING_INDEX(data, ' ', 455))- length(SUBSTRING_INDEX(data, ' ', 454)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 455))+2, length(SUBSTRING_INDEX(data, ' ', 470))- length(SUBSTRING_INDEX(data, ' ', 455)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 470))+2, length(SUBSTRING_INDEX(data, ' ', 471))- length(SUBSTRING_INDEX(data, ' ', 470)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 471))+2, length(SUBSTRING_INDEX(data, ' ', 486))- length(SUBSTRING_INDEX(data, ' ', 471)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 486))+2, length(SUBSTRING_INDEX(data, ' ', 487))- length(SUBSTRING_INDEX(data, ' ', 486)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 487))+2, length(SUBSTRING_INDEX(data, ' ', 502))- length(SUBSTRING_INDEX(data, ' ', 487)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 502))+2, length(SUBSTRING_INDEX(data, ' ', 503))- length(SUBSTRING_INDEX(data, ' ', 502)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 503))+2, length(SUBSTRING_INDEX(data, ' ', 518))- length(SUBSTRING_INDEX(data, ' ', 503)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 518))+2, length(SUBSTRING_INDEX(data, ' ', 519))- length(SUBSTRING_INDEX(data, ' ', 518)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 519))+2, length(SUBSTRING_INDEX(data, ' ', 534))- length(SUBSTRING_INDEX(data, ' ', 519)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 534))+2, length(SUBSTRING_INDEX(data, ' ', 535))- length(SUBSTRING_INDEX(data, ' ', 534)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 535))+2, length(SUBSTRING_INDEX(data, ' ', 550))- length(SUBSTRING_INDEX(data, ' ', 535)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 550))+2, length(SUBSTRING_INDEX(data, ' ', 551))- length(SUBSTRING_INDEX(data, ' ', 550)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 551))+2, length(SUBSTRING_INDEX(data, ' ', 566))- length(SUBSTRING_INDEX(data, ' ', 551)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 566))+2, length(SUBSTRING_INDEX(data, ' ', 567))- length(SUBSTRING_INDEX(data, ' ', 566)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 567))+2, length(SUBSTRING_INDEX(data, ' ', 582))- length(SUBSTRING_INDEX(data, ' ', 567)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 582))+2, length(SUBSTRING_INDEX(data, ' ', 583))- length(SUBSTRING_INDEX(data, ' ', 582)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 583))+2, length(SUBSTRING_INDEX(data, ' ', 598))- length(SUBSTRING_INDEX(data, ' ', 583)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 598))+2, length(SUBSTRING_INDEX(data, ' ', 599))- length(SUBSTRING_INDEX(data, ' ', 598)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 599))+2, length(SUBSTRING_INDEX(data, ' ', 614))- length(SUBSTRING_INDEX(data, ' ', 599)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 614))+2, length(SUBSTRING_INDEX(data, ' ', 615))- length(SUBSTRING_INDEX(data, ' ', 614)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 615))+2, length(SUBSTRING_INDEX(data, ' ', 630))- length(SUBSTRING_INDEX(data, ' ', 615)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 630))+2, length(SUBSTRING_INDEX(data, ' ', 631))- length(SUBSTRING_INDEX(data, ' ', 630)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 631))+2, length(SUBSTRING_INDEX(data, ' ', 646))- length(SUBSTRING_INDEX(data, ' ', 631)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 646))+2, length(SUBSTRING_INDEX(data, ' ', 647))- length(SUBSTRING_INDEX(data, ' ', 646)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 647))+2, length(SUBSTRING_INDEX(data, ' ', 922))- length(SUBSTRING_INDEX(data, ' ', 647)) - 1),
+ " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 922))+2, length(SUBSTRING_INDEX(data, ' ', 926))- length(SUBSTRING_INDEX(data, ' ', 922)) - 1), " 0 0 0 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 926))+2, length(SUBSTRING_INDEX(data, ' ', 1332))- length(SUBSTRING_INDEX(data, ' ', 926)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 1332))+2, length(SUBSTRING_INDEX(data, ' ', 1544))- length(SUBSTRING_INDEX(data, ' ', 1332)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 1544))+2, length(SUBSTRING_INDEX(data, ' ', 1564))- length(SUBSTRING_INDEX(data, ' ', 1544)) - 1), " ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 1566))+2, length(SUBSTRING_INDEX(data, ' ', 1592))- length(SUBSTRING_INDEX(data, ' ', 1566)) - 1),
+ " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ")
+WHERE length(SUBSTRING_INDEX(data, ' ', 1592)) < length(data) and length(SUBSTRING_INDEX(data, ' ', 1593)) >= length(data); \ No newline at end of file
diff --git a/sql/updates/2008_12_22_19_characters_item_instance.sql b/sql/updates/2008_12_22_19_characters_item_instance.sql
new file mode 100644
index 00000000000..96f31ff47d4
--- /dev/null
+++ b/sql/updates/2008_12_22_19_characters_item_instance.sql
@@ -0,0 +1,15 @@
+ALTER TABLE character_db_version CHANGE COLUMN required_2008_12_22_18_characters_characters required_2008_12_22_19_characters_item_instance bit;
+
+UPDATE item_instance SET data = REPLACE(data,' ',' ');
+UPDATE item_instance SET data = CONCAT(TRIM(data),' ');
+
+UPDATE item_instance SET data= CONCAT(
+ SUBSTRING_INDEX(SUBSTRING_INDEX(data,' ',30),' ',-30),' 0 0 0 ',
+ SUBSTRING_INDEX(SUBSTRING_INDEX(data,' ',60),' ',-60+30),' 0 ')
+WHERE SUBSTRING_INDEX(data,' ',60) = data AND SUBSTRING_INDEX(data,' ',60-1) <> data;
+
+UPDATE item_instance SET data= CONCAT(
+ SUBSTRING_INDEX(SUBSTRING_INDEX(data,' ',30),' ',-30),' 0 0 0 ',
+ SUBSTRING_INDEX(SUBSTRING_INDEX(data,' ',60),' ',-60+30),' 0 ',
+ SUBSTRING_INDEX(SUBSTRING_INDEX(data,' ',134),' ',-134+60))
+WHERE SUBSTRING_INDEX(data,' ',134) = data AND SUBSTRING_INDEX(data,' ',134-1) <> data;
diff --git a/sql/updates/6936_01_mangos_spell_chain.sql b/sql/updates/6936_01_mangos_spell_chain.sql
new file mode 100644
index 00000000000..bd5fd301ce4
--- /dev/null
+++ b/sql/updates/6936_01_mangos_spell_chain.sql
@@ -0,0 +1,2857 @@
+ALTER TABLE db_version CHANGE COLUMN required_2008_12_22_17_mangos_item_template required_6936_01_mangos_spell_chain bit;
+
+DELETE FROM spell_chain;
+INSERT INTO spell_chain VALUES
+/*------------------
+--(6) Frost
+------------------*/
+/*Blizzard*/
+(10,0,10,1,0),
+(6141,10,10,2,0),
+(8427,6141,10,3,0),
+(10185,8427,10,4,0),
+(10186,10185,10,5,0),
+(10187,10186,10,6,0),
+(27085,10187,10,7,0),
+(42939,27085,10,8,0),
+(42940,42939,10,9,0),
+/*ConeofCold*/
+(120,0,120,1,0),
+(8492,120,120,2,0),
+(10159,8492,120,3,0),
+(10160,10159,120,4,0),
+(10161,10160,120,5,0),
+(27087,10161,120,6,0),
+(42930,27087,120,7,0),
+(42931,42930,120,8,0),
+/*FrostArmor*/
+(168,0,168,1,0),
+(7300,168,168,2,0),
+(7301,7300,168,3,0),
+/*FrostNova*/
+(122,0,122,1,0),
+(865,122,122,2,0),
+(6131,865,122,3,0),
+(10230,6131,122,4,0),
+(27088,10230,122,5,0),
+(42917,27088,122,6,0),
+/*FrostWard*/
+(6143,0,6143,1,0),
+(8461,6143,6143,2,0),
+(8462,8461,6143,3,0),
+(10177,8462,6143,4,0),
+(28609,10177,6143,5,0),
+(32796,28609,6143,6,0),
+(43012,32796,6143,7,0),
+/*Frostbolt*/
+(116,0,116,1,0),
+(205,116,116,2,0),
+(837,205,116,3,0),
+(7322,837,116,4,0),
+(8406,7322,116,5,0),
+(8407,8406,116,6,0),
+(8408,8407,116,7,0),
+(10179,8408,116,8,0),
+(10180,10179,116,9,0),
+(10181,10180,116,10,0),
+(25304,10181,116,11,0),
+(27071,25304,116,12,0),
+(27072,27071,116,13,0),
+(38697,27072,116,14,0),
+(42841,38697,116,15,0),
+(42842,42841,116,16,0),
+/*IceArmor*/
+(7302,0,7302,1,0),
+(7320,7302,7302,2,0),
+(10219,7320,7302,3,0),
+(10220,10219,7302,4,0),
+(27124,10220,7302,5,0),
+(43008,27124,7302,6,0),
+/*IceBarrier*/
+(11426,0,11426,1,0),
+(13031,11426,11426,2,0),
+(13032,13031,11426,3,0),
+(13033,13032,11426,4,0),
+(27134,13033,11426,5,0),
+(33405,27134,11426,6,0),
+(43038,33405,11426,7,0),
+(43039,43038,11426,8,0),
+/*IceLance*/
+(30455,0,30455,1,0),
+(42913,30455,30455,2,0),
+(42914,42913,30455,3,0),
+/*------------------
+--(8)Fire
+------------------*/
+/*BlastWave*/
+(11113,0,11113,1,0),
+(13018,11113,11113,2,0),
+(13019,13018,11113,3,0),
+(13020,13019,11113,4,0),
+(13021,13020,11113,5,0),
+(27133,13021,11113,6,0),
+(33933,27133,11113,7,0),
+(42944,33933,11113,8,0),
+(42945,42944,11113,9,0),
+/*Dragon'sBreath*/
+(31661,0,31661,1,0),
+(33041,31661,31661,2,0),
+(33042,33041,31661,3,0),
+(33043,33042,31661,4,0),
+(42949,33043,31661,5,0),
+(42950,42949,31661,6,0),
+/*FireBlast*/
+(2136,0,2136,1,0),
+(2137,2136,2136,2,0),
+(2138,2137,2136,3,0),
+(8412,2138,2136,4,0),
+(8413,8412,2136,5,0),
+(10197,8413,2136,6,0),
+(10199,10197,2136,7,0),
+(27078,10199,2136,8,0),
+(27079,27078,2136,9,0),
+(42872,27079,2136,10,0),
+(42873,42872,2136,11,0),
+/*FireWard*/
+(543,0,543,1,0),
+(8457,543,543,2,0),
+(8458,8457,543,3,0),
+(10223,8458,543,4,0),
+(10225,10223,543,5,0),
+(27128,10225,543,6,0),
+(43010,27128,543,7,0),
+/*Fireball*/
+(133,0,133,1,0),
+(143,133,133,2,0),
+(145,143,133,3,0),
+(3140,145,133,4,0),
+(8400,3140,133,5,0),
+(8401,8400,133,6,0),
+(8402,8401,133,7,0),
+(10148,8402,133,8,0),
+(10149,10148,133,9,0),
+(10150,10149,133,10,0),
+(10151,10150,133,11,0),
+(25306,10151,133,12,0),
+(27070,25306,133,13,0),
+(38692,27070,133,14,0),
+(42832,38692,133,15,0),
+(42833,42832,133,16,0),
+/*Flamestrike*/
+(2120,0,2120,1,0),
+(2121,2120,2120,2,0),
+(8422,2121,2120,3,0),
+(8423,8422,2120,4,0),
+(10215,8423,2120,5,0),
+(10216,10215,2120,6,0),
+(27086,10216,2120,7,0),
+(42925,27086,2120,8,0),
+(42926,42925,2120,9,0),
+/*FrostfireBolt*/
+(44614,0,44614,1,0),
+(47610,44614,44614,2,0),
+/*LivingBomb*/
+(44457,0,44457,1,0),
+(55359,44457,44457,2,0),
+(55360,55359,44457,3,0),
+/*MoltenArmor*/
+(30482,0,30482,1,0),
+(43045,30482,30482,2,0),
+(43046,43045,30482,3,0),
+/*Pyroblast*/
+(11366,0,11366,1,0),
+(12505,11366,11366,2,0),
+(12522,12505,11366,3,0),
+(12523,12522,11366,4,0),
+(12524,12523,11366,5,0),
+(12525,12524,11366,6,0),
+(12526,12525,11366,7,0),
+(18809,12526,11366,8,0),
+(27132,18809,11366,9,0),
+(33938,27132,11366,10,0),
+(42890,33938,11366,11,0),
+(42891,42890,11366,12,0),
+/*Scorch*/
+(2948,0,2948,1,0),
+(8444,2948,2948,2,0),
+(8445,8444,2948,3,0),
+(8446,8445,2948,4,0),
+(10205,8446,2948,5,0),
+(10206,10205,2948,6,0),
+(10207,10206,2948,7,0),
+(27073,10207,2948,8,0),
+(27074,27073,2948,9,0),
+(42858,27074,2948,10,0),
+(42859,42858,2948,11,0),
+/*------------------
+--(26)Arms
+------------------*/
+/*Charge*/
+(100,0,100,1,0),
+(6178,100,100,2,0),
+(11578,6178,100,3,0),
+/*HeroicStrike*/
+(78,0,78,1,0),
+(284,78,78,2,0),
+(285,284,78,3,0),
+(1608,285,78,4,0),
+(11564,1608,78,5,0),
+(11565,11564,78,6,0),
+(11566,11565,78,7,0),
+(11567,11566,78,8,0),
+(25286,11567,78,9,0),
+(29707,25286,78,10,0),
+(30324,29707,78,11,0),
+(47449,30324,78,12,0),
+(47450,47449,78,13,0),
+/*MortalStrike*/
+(12294,0,12294,1,0),
+(21551,12294,12294,2,0),
+(21552,21551,12294,3,0),
+(21553,21552,12294,4,0),
+(25248,21553,12294,5,0),
+(30330,25248,12294,6,0),
+(47485,30330,12294,7,0),
+(47486,47485,12294,8,0),
+/*Rend*/
+(772,0,772,1,0),
+(6546,772,772,2,0),
+(6547,6546,772,3,0),
+(6548,6547,772,4,0),
+(11572,6548,772,5,0),
+(11573,11572,772,6,0),
+(11574,11573,772,7,0),
+(25208,11574,772,8,0),
+(46845,25208,772,9,0),
+(47465,46845,772,10,0),
+/*ThunderClap*/
+(6343,0,6343,1,0),
+(8198,6343,6343,2,0),
+(8204,8198,6343,3,0),
+(8205,8204,6343,4,0),
+(11580,8205,6343,5,0),
+(11581,11580,6343,6,0),
+(25264,11581,6343,7,0),
+(47501,25264,6343,8,0),
+(47502,47501,6343,9,0),
+/*------------------
+-- (38) Combat (Rogue)
+------------------*/
+/*Backstab*/
+(53,0,53,1,0),
+(2589,53,53,2,0),
+(2590,2589,53,3,0),
+(2591,2590,53,4,0),
+(8721,2591,53,5,0),
+(11279,8721,53,6,0),
+(11280,11279,53,7,0),
+(11281,11280,53,8,0),
+(25300,11281,53,9,0),
+(26863,25300,53,10,0),
+(48656,26863,53,11,0),
+(48657,48656,53,12,0),
+/*Evasion*/
+(5277,0,5277,1,0),
+(26669,5277,5277,2,0),
+/*Feint*/
+(1966,0,1966,1,0),
+(6768,1966,1966,2,0),
+(8637,6768,1966,3,0),
+(11303,8637,1966,4,0),
+(25302,11303,1966,5,0),
+(27448,25302,1966,6,0),
+(48658,27448,1966,7,0),
+(48659,48658,1966,8,0),
+/*Sinister Strike*/
+(1752,0,1752,1,0),
+(1757,1752,1752,2,0),
+(1758,1757,1752,3,0),
+(1759,1758,1752,4,0),
+(1760,1759,1752,5,0),
+(8621,1760,1752,6,0),
+(11293,8621,1752,7,0),
+(11294,11293,1752,8,0),
+(26861,11294,1752,9,0),
+(26862,26861,1752,10,0),
+(48637,26862,1752,11,0),
+(48638,48637,1752,12,0),
+/*Sprint*/
+(2983,0,2983,1,0),
+(8696,2983,2983,2,0),
+(11305,8696,2983,3,0),
+/*------------------
+--(39)Subtlety
+------------------*/
+/*Hemorrhage*/
+(16511,0,16511,1,0),
+(17347,16511,16511,2,0),
+(17348,17347,16511,3,0),
+(26864,17348,16511,4,0),
+(48660,26864,16511,5,0),
+/*Sap*/
+(6770,0,6770,1,0),
+(2070,6770,6770,2,0),
+(11297,2070,6770,3,0),
+(51724,11297,6770,4,0),
+/*Stealth*/
+(1784,0,1784,1,0),
+(1785,1784,1784,2,0),
+(1786,1785,1784,3,0),
+(1787,1786,1784,4,0),
+/*Vanish*/
+(1856,0,1856,1,0),
+(1857,1856,1856,2,0),
+(26889,1857,1856,3,0),
+/*------------------
+-- (50) Beast Mastery
+------------------*/
+/*Aspect of the Hawk*/
+(13165,0,13165,1,0),
+(14318,13165,13165,2,0),
+(14319,14318,13165,3,0),
+(14320,14319,13165,4,0),
+(14321,14320,13165,5,0),
+(14322,14321,13165,6,0),
+(25296,14322,13165,7,0),
+(27044,25296,13165,8,0),
+/*Aspect of the Wild*/
+(20043,0,20043,1,0),
+(20190,20043,20043,2,0),
+(27045,20190,20043,3,0),
+(49071,27045,20043,4,0),
+/*MendPet*/
+(136,0,136,1,0),
+(3111,136,136,2,0),
+(3661,3111,136,3,0),
+(3662,3661,136,4,0),
+(13542,3662,136,5,0),
+(13543,13542,136,6,0),
+(13544,13543,136,7,0),
+(27046,13544,136,8,0),
+(48989,27046,136,9,0),
+(48990,48989,136,10,0),
+/*ScareBeast*/
+(1513,0,1513,1,0),
+(14326,1513,1513,2,0),
+(14327,14326,1513,3,0),
+/*------------------
+--(51)Survival
+------------------*/
+/*Counterattack*/
+(19306,0,19306,1,0),
+(20909,19306,19306,2,0),
+(20910,20909,19306,3,0),
+(27067,20910,19306,4,0),
+(48998,27067,19306,5,0),
+(48999,48998,19306,6,0),
+/*ExplosiveShot*/
+(53301,0,53301,1,0),
+(60051,53301,53301,2,0),
+(60052,60051,53301,3,0),
+(60053,60052,53301,4,0),
+/*ExplosiveTrap*/
+(13813,0,13813,1,0),
+(14316,13813,13813,2,0),
+(14317,14316,13813,3,0),
+(27025,14317,13813,4,0),
+(49066,27025,13813,5,0),
+(49067,49066,13813,6,0),
+/*FreezingTrap*/
+(1499,0,1499,1,0),
+(14310,1499,1499,2,0),
+(14311,14310,1499,3,0),
+/*ImmolationTrap*/
+(13795,0,13795,1,0),
+(14302,13795,13795,2,0),
+(14303,14302,13795,3,0),
+(14304,14303,13795,4,0),
+(14305,14304,13795,5,0),
+(27023,14305,13795,6,0),
+(49055,27023,13795,7,0),
+(49056,49055,13795,8,0),
+/*MongooseBite*/
+(1495,0,1495,1,0),
+(14269,1495,1495,2,0),
+(14270,14269,1495,3,0),
+(14271,14270,1495,4,0),
+(36916,14271,1495,5,0),
+(53339,36916,1495,6,0),
+/*RaptorStrike*/
+(2973,0,2973,1,0),
+(14260,2973,2973,2,0),
+(14261,14260,2973,3,0),
+(14262,14261,2973,4,0),
+(14263,14262,2973,5,0),
+(14264,14263,2973,6,0),
+(14265,14264,2973,7,0),
+(14266,14265,2973,8,0),
+(27014,14266,2973,9,0),
+(48995,27014,2973,10,0),
+(48996,48995,2973,11,0),
+/*WyvernSting*/
+(19386,0,19386,1,0),
+(24132,19386,19386,2,0),
+(24133,24132,19386,3,0),
+(27068,24133,19386,4,0),
+(49011,27068,19386,5,0),
+(49012,49011,19386,6,0),
+/*------------------
+-- (56) Holy (Priest)
+------------------*/
+/*Binding Heal*/
+(32546,0,32546,1,0),
+(48119,32546,32546,2,0),
+(48120,48119,32546,3,0),
+/*Circle of Healing*/
+(34861,0,34861,1,0),
+(34863,34861,34861,2,0),
+(34864,34863,34861,3,0),
+(34865,34864,34861,4,0),
+(34866,34865,34861,5,0),
+(48088,34866,34861,6,0),
+(48089,48088,34861,7,0),
+/*DesperatePrayer*/
+(19236,0,19236,1,0),
+(19238,19236,19236,2,0),
+(19240,19238,19236,3,0),
+(19241,19240,19236,4,0),
+(19242,19241,19236,5,0),
+(19243,19242,19236,6,0),
+(25437,19243,19236,7,0),
+(48172,25437,19236,8,0),
+(48173,48172,19236,9,0),
+/*FlashHeal*/
+(2061,0,2061,1,0),
+(9472,2061,2061,2,0),
+(9473,9472,2061,3,0),
+(9474,9473,2061,4,0),
+(10915,9474,2061,5,0),
+(10916,10915,2061,6,0),
+(10917,10916,2061,7,0),
+(25233,10917,2061,8,0),
+(25235,25233,2061,9,0),
+(48070,25235,2061,10,0),
+(48071,48070,2061,11,0),
+/*GreaterHeal*/
+(2060,0,2060,1,0),
+(10963,2060,2060,2,0),
+(10964,10963,2060,3,0),
+(10965,10964,2060,4,0),
+(25314,10965,2060,5,0),
+(25210,25314,2060,6,0),
+(25213,25210,2060,7,0),
+(48062,25213,2060,8,0),
+(48063,48062,2060,9,0),
+/*Heal*/
+(2054,0,2054,1,0),
+(2055,2054,2054,2,0),
+(6063,2055,2054,3,0),
+(6064,6063,2054,4,0),
+/*Holy Fire*/
+(14914,0,14914,1,0),
+(15262,14914,14914,2,0),
+(15263,15262,14914,3,0),
+(15264,15263,14914,4,0),
+(15265,15264,14914,5,0),
+(15266,15265,14914,6,0),
+(15267,15266,14914,7,0),
+(15261,15267,14914,8,0),
+(25384,15261,14914,9,0),
+(48134,25384,14914,10,0),
+(48135,48134,14914,11,0),
+/*Holy Nova*/
+(15237,0,15237,1,0),
+(15430,15237,15237,2,0),
+(15431,15430,15237,3,0),
+(27799,15431,15237,4,0),
+(27800,27799,15237,5,0),
+(27801,27800,15237,6,0),
+(25331,27801,15237,7,0),
+(48077,25331,15237,8,0),
+(48078,48077,15237,9,0),
+/*LesserHeal*/
+(2050,0,2050,1,0),
+(2052,2050,2050,2,0),
+(2053,2052,2050,3,0),
+/*Lightwell*/
+(724,0,724,1,0),
+(27870,724,724,2,0),
+(27871,27870,724,3,0),
+(28275,27871,724,4,0),
+(48086,28275,724,5,0),
+(48087,48086,724,6,0),
+/*Prayer of Healing*/
+(596,0,596,1,0),
+(996,596,596,2,0),
+(10960,996,596,3,0),
+(10961,10960,596,4,0),
+(25316,10961,596,5,0),
+(25308,25316,596,6,0),
+(48072,25308,596,7,0),
+/*Prayer of Mending*/
+(33076,0,33076,1,0),
+(48112,33076,33076,2,0),
+(48113,48112,33076,3,0),
+/*Renew*/
+(139,0,139,1,0),
+(6074,139,139,2,0),
+(6075,6074,139,3,0),
+(6076,6075,139,4,0),
+(6077,6076,139,5,0),
+(6078,6077,139,6,0),
+(10927,6078,139,7,0),
+(10928,10927,139,8,0),
+(10929,10928,139,9,0),
+(25315,10929,139,10,0),
+(25221,25315,139,11,0),
+(25222,25221,139,12,0),
+(48067,25222,139,13,0),
+(48068,48067,139,14,0),
+/*Resurrection*/
+(2006,0,2006,1,0),
+(2010,2006,2006,2,0),
+(10880,2010,2006,3,0),
+(10881,10880,2006,4,0),
+(20770,10881,2006,5,0),
+(25435,20770,2006,6,0),
+(48171,25435,2006,7,0),
+/*Smite*/
+(585,0,585,1,0),
+(591,585,585,2,0),
+(598,591,585,3,0),
+(984,598,585,4,0),
+(1004,984,585,5,0),
+(6060,1004,585,6,0),
+(10933,6060,585,7,0),
+(10934,10933,585,8,0),
+(25363,10934,585,9,0),
+(25364,25363,585,10,0),
+(48122,25364,585,11,0),
+(48123,48122,585,12,0),
+/*------------------
+-- (78) Shadow Magic
+------------------*/
+/*Devouring Plague*/
+(2944,0,2944,1,0),
+(19276,2944,2944,2,0),
+(19277,19276,2944,3,0),
+(19278,19277,2944,4,0),
+(19279,19278,2944,5,0),
+(19280,19279,2944,6,0),
+(25467,19280,2944,7,0),
+(48299,25467,2944,8,0),
+(48300,48299,2944,9,0),
+/*Mind Blast*/
+(8092,0,8092,1,0),
+(8102,8092,8092,2,0),
+(8103,8102,8092,3,0),
+(8104,8103,8092,4,0),
+(8105,8104,8092,5,0),
+(8106,8105,8092,6,0),
+(10945,8106,8092,7,0),
+(10946,10945,8092,8,0),
+(10947,10946,8092,9,0),
+(25372,10947,8092,10,0),
+(25375,25372,8092,11,0),
+(48126,25375,8092,12,0),
+(48127,48126,8092,13,0),
+/*MindFlay*/
+(15407,0,15407,1,0),
+(17311,15407,15407,2,0),
+(17312,17311,15407,3,0),
+(17313,17312,15407,4,0),
+(17314,17313,15407,5,0),
+(18807,17314,15407,6,0),
+(25387,18807,15407,7,0),
+(48155,25387,15407,8,0),
+(48156,48155,15407,9,0),
+/*MindSear*/
+(48045,0,48045,1,0),
+(53023,48045,48045,2,0),
+/*MindVision*/
+(2096,0,2096,1,0),
+(10909,2096,2096,2,0),
+/*Prayer of Shadow Protection*/
+(27683,0,27683,1,0),
+(39374,27683,27683,2,0),
+(48170,39374,27683,3,0),
+/*PsychicScream*/
+(8122,0,8122,1,0),
+(8124,8122,8122,2,0),
+(10888,8124,8122,3,0),
+(10890,10888,8122,4,0),
+/*Shadow Protection*/
+(976,0,976,1,0),
+(10957,976,976,2,0),
+(10958,10957,976,3,0),
+(25433,10958,976,4,0),
+(48169,25433,976,5,0),
+/*ShadowWord:Death*/
+(32379,0,32379,1,0),
+(32996,32379,32379,2,0),
+(48157,32996,32379,3,0),
+(48158,48157,32379,4,0),
+/*ShadowWord:Pain*/
+(589,0,589,1,0),
+(594,589,589,2,0),
+(970,594,589,3,0),
+(992,970,589,4,0),
+(2767,992,589,5,0),
+(10892,2767,589,6,0),
+(10893,10892,589,7,0),
+(10894,10893,589,8,0),
+(25367,10894,589,9,0),
+(25368,25367,589,10,0),
+(48124,25368,589,11,0),
+(48125,48124,589,12,0),
+/*Vampiric Touch*/
+(34914,0,34914,1,0),
+(34916,34914,34914,2,0),
+(34917,34916,34914,3,0),
+(48159,34917,34914,4,0),
+(48160,48159,34914,5,0),
+/*------------------
+-- (134) Feral Combat (Druid)
+------------------*/
+/*Bash*/
+(5211,0,5211,1,0),
+(6798,5211,5211,2,0),
+(8983,6798,5211,3,0),
+/*Bear Form*/
+(5487,0,5487,1,0),
+(9634,5487,5487,2,0),
+/*Claw*/
+(1082,0,1082,1,0),
+(3029,1082,1082,2,0),
+(5201,3029,1082,3,0),
+(9849,5201,1082,4,0),
+(9850,9849,1082,5,0),
+(27000,9850,1082,6,0),
+(48569,27000,1082,7,0),
+(48570,48569,1082,8,0),
+/*Cower*/
+(8998,0,8998,1,0),
+(9000,8998,8998,2,0),
+(9892,9000,8998,3,0),
+(31709,9892,8998,4,0),
+(27004,31709,8998,5,0),
+(48575,27004,8998,6,0),
+/*Dash*/
+(1850,0,1850,1,0),
+(9821,1850,1850,2,0),
+(33357,9821,1850,3,0),
+/*Demoralizing Roar*/
+(99,0,99,1,0),
+(1735,99,99,2,0),
+(9490,1735,99,3,0),
+(9747,9490,99,4,0),
+(9898,9747,99,5,0),
+(26998,9898,99,6,0),
+(48559,26998,99,7,0),
+(48560,48559,99,8,0),
+/*Faerie Fire (Feral)*/
+(16857,0,16857,1,0),
+(17390,16857,16857,2,0),
+(17391,17390,16857,3,0),
+(17392,17391,16857,4,0),
+(27011,17392,16857,5,0),
+(48475,27011,16857,6,0),
+/*Ferocious Bite*/
+(22568,0,22568,1,0),
+(22827,22568,22568,2,0),
+(22828,22827,22568,3,0),
+(22829,22828,22568,4,0),
+(31018,22829,22568,5,0),
+(24248,31018,22568,6,0),
+(48576,24248,22568,7,0),
+(48577,48576,22568,8,0),
+/*Flight Form*/
+(33943,0,33943,1,0),
+(40120,33943,33943,2,0),
+/*Lacerate*/
+(33745,0,33745,1,0),
+(48567,33745,33745,2,0),
+(48568,48567,33745,3,0),
+/*Maim*/
+(22570,0,22570,1,0),
+(49802,22570,22570,2,0),
+/*Mangle-Bear*/
+(33878,0,33878,1,0),
+(33986,33878,33878,2,0),
+(33987,33986,33878,3,0),
+(48563,33987,33878,4,0),
+(48564,48563,33878,5,0),
+/*Mangle-Cat*/
+(33876,0,33876,1,0),
+(33982,33876,33876,2,0),
+(33983,33982,33876,3,0),
+(48565,33983,33876,4,0),
+(48566,48565,33876,5,0),
+/*Maul*/
+(6807,0,6807,1,0),
+(6808,6807,6807,2,0),
+(6809,6808,6807,3,0),
+(8972,6809,6807,4,0),
+(9745,8972,6807,5,0),
+(9880,9745,6807,6,0),
+(9881,9880,6807,7,0),
+(26996,9881,6807,8,0),
+(48479,26996,6807,9,0),
+(48480,48479,6807,10,0),
+/*Pounce*/
+(9005,0,9005,1,0),
+(9823,9005,9005,2,0),
+(9827,9823,9005,3,0),
+(27006,9827,9005,4,0),
+(49803,27006,9005,5,0),
+/*Prowl*/
+(5215,0,5215,1,0),
+(6783,5215,5215,2,0),
+(9913,6783,5215,3,0),
+/*Rake*/
+(1822,0,1822,1,0),
+(1823,1822,1822,2,0),
+(1824,1823,1822,3,0),
+(9904,1824,1822,4,0),
+(27003,9904,1822,5,0),
+(48573,27003,1822,6,0),
+(48574,48573,1822,7,0),
+/*Ravage*/
+(6785,0,6785,1,0),
+(6787,6785,6785,2,0),
+(9866,6787,6785,3,0),
+(9867,9866,6785,4,0),
+(27005,9867,6785,5,0),
+(48578,27005,6785,6,0),
+(48579,48578,6785,7,0),
+/*Rip*/
+(1079,0,1079,1,0),
+(9492,1079,1079,2,0),
+(9493,9492,1079,3,0),
+(9752,9493,1079,4,0),
+(9894,9752,1079,5,0),
+(9896,9894,1079,6,0),
+(27008,9896,1079,7,0),
+(49799,27008,1079,8,0),
+(49800,49799,1079,9,0),
+/*Shred*/
+(5221,0,5221,1,0),
+(6800,5221,5221,2,0),
+(8992,6800,5221,3,0),
+(9829,8992,5221,4,0),
+(9830,9829,5221,5,0),
+(27001,9830,5221,6,0),
+(27002,27001,5221,7,0),
+(48571,27002,5221,8,0),
+(48572,48571,5221,9,0),
+/*Swipe*/
+(779,0,779,1,0),
+(780,779,779,2,0),
+(769,780,779,3,0),
+(9754,769,779,4,0),
+(9908,9754,779,5,0),
+(26997,9908,779,6,0),
+(48561,26997,779,7,0),
+(48562,48561,779,8,0),
+/*Tiger's Fury*/
+(5217,0,5217,1,0),
+(6793,5217,5217,2,0),
+(9845,6793,5217,3,0),
+(9846,9845,5217,4,0),
+(50212,9846,5217,5,0),
+(50213,50212,5217,6,0),
+/*------------------
+--(163)Marksmanship
+------------------*/
+/*AimedShot*/
+(19434,0,19434,1,0),
+(20900,19434,19434,2,0),
+(20901,20900,19434,3,0),
+(20902,20901,19434,4,0),
+(20903,20902,19434,5,0),
+(20904,20903,19434,6,0),
+(27065,20904,19434,7,0),
+(49049,27065,19434,8,0),
+(49050,49049,19434,9,0),
+/*ArcaneShot*/
+(3044,0,3044,1,0),
+(14281,3044,3044,2,0),
+(14282,14281,3044,3,0),
+(14283,14282,3044,4,0),
+(14284,14283,3044,5,0),
+(14285,14284,3044,6,0),
+(14286,14285,3044,7,0),
+(14287,14286,3044,8,0),
+(27019,14287,3044,9,0),
+(49044,27019,3044,10,0),
+(49045,49044,3044,11,0),
+/*Hunter'sMark*/
+(1130,0,1130,1,0),
+(14323,1130,1130,2,0),
+(14324,14323,1130,3,0),
+(14325,14324,1130,4,0),
+(53338,14325,1130,5,0),
+/*KillShot*/
+(53351,0,53351,1,0),
+(61005,53351,53351,2,0),
+(61006,61005,53351,3,0),
+/*Multi-Shot*/
+(2643,0,2643,1,0),
+(14288,2643,2643,2,0),
+(14289,14288,2643,3,0),
+(14290,14289,2643,4,0),
+(25294,14290,2643,5,0),
+(27021,25294,2643,6,0),
+(49047,27021,2643,7,0),
+(49048,49047,2643,8,0),
+/*SerpentSting*/
+(1978,0,1978,1,0),
+(13549,1978,1978,2,0),
+(13550,13549,1978,3,0),
+(13551,13550,1978,4,0),
+(13552,13551,1978,5,0),
+(13553,13552,1978,6,0),
+(13554,13553,1978,7,0),
+(13555,13554,1978,8,0),
+(25295,13555,1978,9,0),
+(27016,25295,1978,10,0),
+(49000,27016,1978,11,0),
+(49001,49000,1978,12,0),
+/*SteadyShot*/
+(56641,0,56641,1,0),
+(34120,56641,56641,2,0),
+(49051,34120,56641,3,0),
+(49052,49051,56641,4,0),
+/*ViperSting*/
+(3034,0,3034,1,0),
+(14279,3034,3034,2,0),
+(14280,14279,3034,3,0),
+(27018,14280,3034,4,0),
+(49008,27018,3034,5,0),
+/*Volley*/
+(1510,0,1510,1,0),
+(14294,1510,1510,2,0),
+(14295,14294,1510,3,0),
+(27022,14295,1510,4,0),
+(58431,27022,1510,5,0),
+(58434,58431,1510,6,0),
+/*------------------
+-- (184) Retribution (Paladin)
+------------------*/
+/*Blessingof Might*/
+(19740,0,19740,1,0),
+(19834,19740,19740,2,0),
+(19835,19834,19740,3,0),
+(19836,19835,19740,4,0),
+(19837,19836,19740,5,0),
+(19838,19837,19740,6,0),
+(25291,19838,19740,7,0),
+(27140,25291,19740,8,0),
+(48931,27140,19740,9,0),
+(48932,48931,19740,10,0),
+/*Greater Blessing of Might*/
+(25782,0,25782,1,19838),
+(25916,25782,25782,2,25291),
+(27141,25916,25782,3,27140),
+(48933,27141,25782,4,48931),
+(48934,48933,25782,5,48932),
+/*Hammer of Wrath*/
+(24275,0,24275,1,0),
+(24274,24275,24275,2,0),
+(24239,24274,24275,3,0),
+(27180,24239,24275,4,0),
+(48805,27180,24275,5,0),
+(48806,48805,24275,6,0),
+/*Retribution Aura*/
+(7294,0,7294,1,0),
+(10298,7294,7294,2,0),
+(10299,10298,7294,3,0),
+(10300,10299,7294,4,0),
+(10301,10300,7294,5,0),
+(27150,10301,7294,6,0),
+(54043,27150,7294,7,0),
+/*------------------
+--(188) Pet - Imp
+------------------*/
+/*Blood Pact*/
+(6307,0,6307,1,0),
+(7804,6307,6307,2,0),
+(7805,7804,6307,3,0),
+(11766,7805,6307,4,0),
+(11767,11766,6307,5,0),
+(27268,11767,6307,6,0),
+(47982,27268,6307,7,0),
+/*FireShield*/
+(2947,0,2947,1,0),
+(8316,2947,2947,2,0),
+(8317,8316,2947,3,0),
+(11770,8317,2947,4,0),
+(11771,11770,2947,5,0),
+(27269,11771,2947,6,0),
+(47983,27269,2947,7,0),
+/*Firebolt*/
+(3110,0,3110,1,0),
+(7799,3110,3110,2,0),
+(7800,7799,3110,3,0),
+(7801,7800,3110,4,0),
+(7802,7801,3110,5,0),
+(11762,7802,3110,6,0),
+(11763,11762,3110,7,0),
+(27267,11763,3110,8,0),
+(47964,27267,3110,9,0),
+/*------------------
+--(189)Pet-Felhunter
+------------------*/
+/*DevourMagic*/
+(19505,0,19505,1,0),
+(19731,19505,19505,2,0),
+(19734,19731,19505,3,0),
+(19736,19734,19505,4,0),
+(27276,19736,19505,5,0),
+(27277,27276,19505,6,0),
+(48011,27277,19505,7,0),
+/*ShadowBite*/
+(54049,0,54049,1,0),
+(54050,54049,54049,2,0),
+(54051,54050,54049,3,0),
+(54052,54051,54049,4,0),
+(54053,54052,54049,5,0),
+/*SpellLock*/
+(19244,0,19244,1,0),
+(19647,19244,19244,2,0),
+/*------------------
+--(203)Pet-Spider
+--(208)Pet-Wolf
+--(212)Pet-Crocolisk
+--(251)Pet-Turtle
+--(653)Pet-Bat
+--(766)Pet-WarpStalker
+--(767)Pet-Ravager
+------------------*/
+/*Bite*/
+(17253,0,17253,1,0),
+(17255,17253,17253,2,0),
+(17256,17255,17253,3,0),
+(17257,17256,17253,4,0),
+(17258,17257,17253,5,0),
+(17259,17258,17253,6,0),
+(17260,17259,17253,7,0),
+(17261,17260,17253,8,0),
+(27050,17261,17253,9,0),
+(52473,27050,17253,10,0),
+(52474,52473,17253,11,0),
+/*------------------
+-- (204) Pet - Voidwalker
+------------------*/
+/*Consume Shadows*/
+(17767,0,17767,1,0),
+(17850,17767,17767,2,0),
+(17851,17850,17767,3,0),
+(17852,17851,17767,4,0),
+(17853,17852,17767,5,0),
+(17854,17853,17767,6,0),
+(27272,17854,17767,7,0),
+(47987,27272,17767,8,0),
+(47988,47987,17767,9,0),
+/*Sacrifice*/
+(7812,0,7812,1,0),
+(19438,7812,7812,2,0),
+(19440,19438,7812,3,0),
+(19441,19440,7812,4,0),
+(19442,19441,7812,5,0),
+(19443,19442,7812,6,0),
+(27273,19443,7812,7,0),
+(47985,27273,7812,8,0),
+(47986,47985,7812,9,0),
+/*Suffering*/
+(17735,0,17735,1,0),
+(17750,17735,17735,2,0),
+(17751,17750,17735,3,0),
+(17752,17751,17735,4,0),
+(27271,17752,17735,5,0),
+(33701,27271,17735,6,0),
+(47989,33701,17735,7,0),
+(47990,47989,17735,8,0),
+/*Torment*/
+(3716,0,3716,1,0),
+(7809,3716,3716,2,0),
+(7810,7809,3716,3,0),
+(7811,7810,3716,4,0),
+(11774,7811,3716,5,0),
+(11775,11774,3716,6,0),
+(27270,11775,3716,7,0),
+(47984,27270,3716,8,0),
+/*------------------
+--(205)Pet-Succubus
+------------------*/
+/*LashofPain*/
+(7814,0,7814,1,0),
+(7815,7814,7814,2,0),
+(7816,7815,7814,3,0),
+(11778,7816,7814,4,0),
+(11779,11778,7814,5,0),
+(11780,11779,7814,6,0),
+(27274,11780,7814,7,0),
+(47991,27274,7814,8,0),
+(47992,47991,7814,9,0),
+/*SoothingKiss*/
+(6360,0,6360,1,0),
+(7813,6360,6360,2,0),
+(11784,7813,6360,3,0),
+(11785,11784,6360,4,0),
+(27275,11785,6360,5,0),
+/*------------------
+-- (209) Pet - Cat
+------------------*/
+/*Prowl*/
+(24450,0,24450,1,0),
+(24452,24450,24450,2,0),
+(24453,24452,24450,3,0),
+/*Rake*/
+(59881,0,59881,1,0),
+(59882,59881,59881,2,0),
+(59883,59882,59881,3,0),
+(59884,59883,59881,4,0),
+(59885,59884,59881,5,0),
+(59886,59885,59881,6,0),
+/*------------------
+--(210)Pet-Bear
+------------------*/
+/*Swipe*/
+(50256,0,50256,1,0),
+(53526,50256,50256,2,0),
+(53528,53526,50256,3,0),
+(53529,53528,50256,4,0),
+(53532,53529,50256,5,0),
+(53533,53532,50256,6,0),
+/*------------------
+--(211)Pet-Boar
+------------------*/
+/*Gore*/
+(35290,0,35290,1,0),
+(35291,35290,35290,2,0),
+(35292,35291,35290,3,0),
+(35293,35292,35290,4,0),
+(35294,35293,35290,5,0),
+(35295,35294,35290,6,0),
+/*------------------
+--(213)Pet-CarrionBird
+------------------*/
+/*DemoralizingScreech*/
+(24423,0,24423,1,0),
+(24577,24423,24423,2,0),
+(24578,24577,24423,3,0),
+(24579,24578,24423,4,0),
+(27051,24579,24423,5,0),
+(55487,27051,24423,6,0),
+/*------------------
+--(215)Pet-Gorilla
+--(786)Pet-ExoticRhino
+--(775)Pet-Moth
+------------------*/
+/*Smack*/
+(49966,0,49966,1,0),
+(49967,49966,49966,2,0),
+(49968,49967,49966,3,0),
+(49969,49968,49966,4,0),
+(49970,49969,49966,5,0),
+(49971,49970,49966,6,0),
+(49972,49971,49966,7,0),
+(49973,49972,49966,8,0),
+(49974,49973,49966,9,0),
+(52475,49974,49966,10,0),
+(52476,52475,49966,11,0),
+/*Thunderstomp*/
+(26090,0,26090,1,0),
+(26187,26090,26090,2,0),
+(26188,26187,26090,3,0),
+(27063,26188,26090,4,0),
+(55572,27063,26090,5,0),
+(55573,55572,26090,6,0),
+/*------------------
+--(217)Pet-Raptor
+------------------*/
+/*SavageRend*/
+(50498,0,50498,1,0),
+(53578,50498,50498,2,0),
+(53579,53578,50498,3,0),
+(53580,53579,50498,4,0),
+(53581,53580,50498,5,0),
+(53582,53581,50498,6,0),
+/*------------------
+--(214)Pet-Crab
+--(218)Pet-Tallstrider
+--(783)Pet-ExoticSilithid
+------------------*/
+/*Claw*/
+(16827,0,16827,1,0),
+(16828,16827,16827,2,0),
+(16829,16828,16827,3,0),
+(16830,16829,16827,4,0),
+(16831,16830,16827,5,0),
+(16832,16831,16827,6,0),
+(3010,16832,16827,7,0),
+(3009,3010,16827,8,0),
+(27049,3009,16827,9,0),
+(52471,27049,16827,10,0),
+(52472,52471,16827,11,0),
+/*------------------
+--(236)Pet-Scorpid
+------------------*/
+/*ScorpidPoison*/
+(24640,0,24640,1,0),
+(24583,24640,24640,2,0),
+(24586,24583,24640,3,0),
+(24587,24586,24640,4,0),
+(27060,24587,24640,5,0),
+(55728,27060,24640,6,0),
+/*------------------
+--(237)Arcane
+------------------*/
+/*AmplifyMagic*/
+(1008,0,1008,1,0),
+(8455,1008,1008,2,0),
+(10169,8455,1008,3,0),
+(10170,10169,1008,4,0),
+(27130,10170,1008,5,0),
+(33946,27130,1008,6,0),
+(43017,33946,1008,7,0),
+/*ArcaneBarrage*/
+(44425,0,44425,1,0),
+(44780,44425,44425,2,0),
+(44781,44780,44425,3,0),
+/*ArcaneBlast*/
+(30451,0,30451,1,0),
+(42894,30451,30451,2,0),
+(42896,42894,30451,3,0),
+(42897,42896,30451,4,0),
+/*ArcaneBrilliance*/
+(23028,0,23028,1,0),
+(27127,23028,23028,2,0),
+(43002,27127,23028,3,0),
+/*ArcaneExplosion*/
+(1449,0,1449,1,0),
+(8437,1449,1449,2,0),
+(8438,8437,1449,3,0),
+(8439,8438,1449,4,0),
+(10201,8439,1449,5,0),
+(10202,10201,1449,6,0),
+(27080,10202,1449,7,0),
+(27082,27080,1449,8,0),
+(42920,27082,1449,9,0),
+(42921,42920,1449,10,0),
+/*ArcaneIntellect*/
+(1459,0,1459,1,0),
+(1460,1459,1459,2,0),
+(1461,1460,1459,3,0),
+(10156,1461,1459,4,0),
+(10157,10156,1459,5,0),
+(27126,10157,1459,6,0),
+(42995,27126,1459,7,0),
+/*ArcaneMissiles*/
+(5143,0,5143,1,0),
+(5144,5143,5143,2,0),
+(5145,5144,5143,3,0),
+(8416,5145,5143,4,0),
+(8417,8416,5143,5,0),
+(10211,8417,5143,6,0),
+(10212,10211,5143,7,0),
+(25345,10212,5143,8,0),
+(27075,25345,5143,9,0),
+(38699,27075,5143,10,0),
+(38704,38699,5143,11,0),
+(42843,38704,5143,12,0),
+(42846,42843,5143,13,0),
+/*ConjureFood*/
+(587,0,587,1,0),
+(597,587,587,2,0),
+(990,597,587,3,0),
+(6129,990,587,4,0),
+(10144,6129,587,5,0),
+(10145,10144,587,6,0),
+(28612,10145,587,7,0),
+(33717,28612,587,8,0),
+/*ConjureManaGem*/
+(759,0,759,1,0),
+(3552,759,759,2,0),
+(10053,3552,759,3,0),
+(10054,10053,759,4,0),
+(27101,10054,759,5,0),
+(42985,27101,759,6,0),
+/*ConjureRefreshment*/
+(42955,0,42955,1,0),
+(42956,42955,42955,2,0),
+/*ConjureWater*/
+(5504,0,5504,1,0),
+(5505,5504,5504,2,0),
+(5506,5505,5504,3,0),
+(6127,5506,5504,4,0),
+(10138,6127,5504,5,0),
+(10139,10138,5504,6,0),
+(10140,10139,5504,7,0),
+(37420,10140,5504,8,0),
+(27090,37420,5504,9,0),
+/*DampenMagic*/
+(604,0,604,1,0),
+(8450,604,604,2,0),
+(8451,8450,604,3,0),
+(10173,8451,604,4,0),
+(10174,10173,604,5,0),
+(33944,10174,604,6,0),
+(43015,33944,604,7,0),
+/*MageArmor*/
+(6117,0,6117,1,0),
+(22782,6117,6117,2,0),
+(22783,22782,6117,3,0),
+(27125,22783,6117,4,0),
+(43023,27125,6117,5,0),
+(43024,43023,6117,6,0),
+/*ManaShield*/
+(1463,0,1463,1,0),
+(8494,1463,1463,2,0),
+(8495,8494,1463,3,0),
+(10191,8495,1463,4,0),
+(10192,10191,1463,5,0),
+(10193,10192,1463,6,0),
+(27131,10193,1463,7,0),
+(43019,27131,1463,8,0),
+(43020,43019,1463,9,0),
+/*Polymorph*/
+(118,0,118,1,0),
+(12824,118,118,2,0),
+(12825,12824,118,3,0),
+(12826,12825,118,4,0),
+/*RitualofRefreshment*/
+(43987,0,43987,1,0),
+(58659,43987,43987,2,0),
+/*------------------
+--(253)Assassination
+------------------*/
+/*Ambush*/
+(8676,0,8676,1,0),
+(8724,8676,8676,2,0),
+(8725,8724,8676,3,0),
+(11267,8725,8676,4,0),
+(11268,11267,8676,5,0),
+(11269,11268,8676,6,0),
+(27441,11269,8676,7,0),
+(48689,27441,8676,8,0),
+(48690,48689,8676,9,0),
+(48691,48690,8676,10,0),
+/*DeadlyThrow*/
+(26679,0,26679,1,0),
+(48673,26679,26679,2,0),
+(48674,48673,26679,3,0),
+/*Envenom*/
+(32645,0,32645,1,0),
+(32684,32645,32645,2,0),
+(57992,32684,32645,3,0),
+(57993,57992,32645,4,0),
+/*Eviscerate*/
+(2098,0,2098,1,0),
+(6760,2098,2098,2,0),
+(6761,6760,2098,3,0),
+(6762,6761,2098,4,0),
+(8623,6762,2098,5,0),
+(8624,8623,2098,6,0),
+(11299,8624,2098,7,0),
+(11300,11299,2098,8,0),
+(31016,11300,2098,9,0),
+(26865,31016,2098,10,0),
+(48667,26865,2098,11,0),
+(48668,48667,2098,12,0),
+/*ExposeArmor*/
+(8647,0,8647,1,0),
+(8649,8647,8647,2,0),
+(8650,8649,8647,3,0),
+(11197,8650,8647,4,0),
+(11198,11197,8647,5,0),
+(26866,11198,8647,6,0),
+(48669,26866,8647,7,0),
+/*Garrote*/
+(703,0,703,1,0),
+(8631,703,703,2,0),
+(8632,8631,703,3,0),
+(8633,8632,703,4,0),
+(11289,8633,703,5,0),
+(11290,11289,703,6,0),
+(26839,11290,703,7,0),
+(26884,26839,703,8,0),
+(48675,26884,703,9,0),
+(48676,48675,703,10,0),
+/*KidneyShot*/
+(408,0,408,1,0),
+(8643,408,408,2,0),
+/*Mutilate*/
+(1329,0,1329,1,0),
+(34411,1329,1329,2,0),
+(34412,34411,1329,3,0),
+(34413,34412,1329,4,0),
+(48663,34413,1329,5,0),
+(48666,48663,1329,6,0),
+/*Rupture*/
+(1943,0,1943,1,0),
+(8639,1943,1943,2,0),
+(8640,8639,1943,3,0),
+(11273,8640,1943,4,0),
+(11274,11273,1943,5,0),
+(11275,11274,1943,6,0),
+(26867,11275,1943,7,0),
+(48671,26867,1943,8,0),
+(48672,48671,1943,9,0),
+/*SliceandDice*/
+(5171,0,5171,1,0),
+(6774,5171,5171,2,0),
+/*------------------
+--(256)Fury
+------------------*/
+/*BattleShout*/
+(6673,0,6673,1,0),
+(5242,6673,6673,2,0),
+(6192,5242,6673,3,0),
+(11549,6192,6673,4,0),
+(11550,11549,6673,5,0),
+(11551,11550,6673,6,0),
+(25289,11551,6673,7,0),
+(2048,25289,6673,8,0),
+(47436,2048,6673,9,0),
+/*Cleave*/
+(845,0,845,1,0),
+(7369,845,845,2,0),
+(11608,7369,845,3,0),
+(11609,11608,845,4,0),
+(20569,11609,845,5,0),
+(25231,20569,845,6,0),
+(47519,25231,845,7,0),
+(47520,47519,845,8,0),
+/*CommandingShout*/
+(469,0,469,1,0),
+(47439,469,469,2,0),
+(47440,47439,469,3,0),
+/*DemoralizingShout*/
+(1160,0,1160,1,0),
+(6190,1160,1160,2,0),
+(11554,6190,1160,3,0),
+(11555,11554,1160,4,0),
+(11556,11555,1160,5,0),
+(25202,11556,1160,6,0),
+(25203,25202,1160,7,0),
+(47437,25203,1160,8,0),
+/*Execute*/
+(5308,0,5308,1,0),
+(20658,5308,5308,2,0),
+(20660,20658,5308,3,0),
+(20661,20660,5308,4,0),
+(20662,20661,5308,5,0),
+(25234,20662,5308,6,0),
+(25236,25234,5308,7,0),
+(47470,25236,5308,8,0),
+(47471,47470,5308,9,0),
+/*Slam*/
+(1464,0,1464,1,0),
+(8820,1464,1464,2,0),
+(11604,8820,1464,3,0),
+(11605,11604,1464,4,0),
+(25241,11605,1464,5,0),
+(25242,25241,1464,6,0),
+(47474,25242,1464,7,0),
+(47475,47474,1464,8,0),
+/*------------------
+--(257) Protection (Warrior)
+------------------*/
+/*Devastate*/
+(20243,0,20243,1,0),
+(30016,20243,20243,2,0),
+(30022,30016,20243,3,0),
+(47497,30022,20243,4,0),
+(47498,47497,20243,5,0),
+/*Revenge*/
+(6572,0,6572,1,0),
+(6574,6572,6572,2,0),
+(7379,6574,6572,3,0),
+(11600,7379,6572,4,0),
+(11601,11600,6572,5,0),
+(25288,11601,6572,6,0),
+(25269,25288,6572,7,0),
+(30357,25269,6572,8,0),
+(57823,30357,6572,9,0),
+/*ShieldSlam*/
+(23922,0,23922,1,0),
+(23923,23922,23922,2,0),
+(23924,23923,23922,3,0),
+(23925,23924,23922,4,0),
+(25258,23925,23922,5,0),
+(30356,25258,23922,6,0),
+(47487,30356,23922,7,0),
+(47488,47487,23922,8,0),
+/*SunderArmor*/
+(7386,0,7386,1,0),
+(7405,7386,7386,2,0),
+(8380,7405,7386,3,0),
+(11596,8380,7386,4,0),
+(11597,11596,7386,5,0),
+(25225,11597,7386,6,0),
+(47467,25225,7386,7,0),
+/*------------------
+-- (267) Protection (Paladin)
+------------------*/
+/*Avenger'sShield*/
+(31935,0,31935,1,0),
+(32699,31935,31935,2,0),
+(32700,32699,31935,3,0),
+(48826,32700,31935,4,0),
+(48827,48826,31935,5,0),
+/*Devotion Aura*/
+(465,0,465,1,0),
+(10290,465,465,2,0),
+(643,10290,465,3,0),
+(10291,643,465,4,0),
+(1032,10291,465,5,0),
+(10292,1032,465,6,0),
+(10293,10292,465,7,0),
+(27149,10293,465,8,0),
+(48941,27149,465,9,0),
+(48942,48941,465,10,0),
+/*Fire Resistance Aura*/
+(19891,0,19891,1,0),
+(19899,19891,19891,2,0),
+(19900,19899,19891,3,0),
+(27153,19900,19891,4,0),
+(48947,27153,19891,5,0),
+/*Frost Resistance Aura*/
+(19888,0,19888,1,0),
+(19897,19888,19888,2,0),
+(19898,19897,19888,3,0),
+(27152,19898,19888,4,0),
+(48945,27152,19888,5,0),
+/*Greater Blessing of Kings*/
+(20217,0,20217,1,0),
+(25898,20217,20217,2,0),
+/*Greater Blessing of Sanctuary*/
+(20911,0,20911,1,0),
+(25899,20911,20911,2,0),
+/*HammerofJustice*/
+(853,0,853,1,0),
+(5588,853,853,2,0),
+(5589,5588,853,3,0),
+(10308,5589,853,4,0),
+/*HandofProtection*/
+(1022,0,1022,1,0),
+(5599,1022,1022,2,0),
+(10278,5599,1022,3,0),
+/*Holy Shield*/
+(20925,0,20925,1,0),
+(20927,20925,20925,2,0),
+(20928,20927,20925,3,0),
+(27179,20928,20925,4,0),
+(48951,27179,20925,5,0),
+(48952,48951,20925,6,0),
+/*Shadow Resistance Aura*/
+(19876,0,19876,1,0),
+(19895,19876,19876,2,0),
+(19896,19895,19876,3,0),
+(27151,19896,19876,4,0),
+(48943,27151,19876,5,0),
+/*Shield of Righteousness*/
+(53600,0,53600,1,0),
+(61411,53600,53600,2,0),
+/*Spiritual Attunement*/
+(31785,0,31785,1,0),
+(33776,31785,31785,2,0),
+/*------------------
+--(270)Pet-GenericHunter
+------------------*/
+/*Cower*/
+(1742,0,1742,1,0),
+(1753,1742,1742,2,0),
+(1754,1753,1742,3,0),
+(1755,1754,1742,4,0),
+(1756,1755,1742,5,0),
+(16697,1756,1742,6,0),
+(27048,16697,1742,7,0),
+/*GreatResistance*/
+(53427,0,53427,1,0),
+(53429,53427,53427,2,0),
+(53430,53429,53427,3,0),
+/*Growl*/
+(2649,0,2649,1,0),
+(14916,2649,2649,2,0),
+(14917,14916,2649,3,0),
+(14918,14917,2649,4,0),
+(14919,14918,2649,5,0),
+(14920,14919,2649,6,0),
+(14921,14920,2649,7,0),
+(27047,14921,2649,8,0),
+(61676,27047,2649,9,0),
+/*------------------
+--(354)Demonology
+------------------*/
+/*Banish*/
+(710,0,710,1,0),
+(18647,710,710,2,0),
+/*CreateFirestone*/
+(6366,0,6366,1,0),
+(17951,6366,6366,2,0),
+(17952,17951,6366,3,0),
+(17953,17952,6366,4,0),
+(27250,17953,6366,5,0),
+(60219,27250,6366,6,0),
+(60220,60219,6366,7,0),
+/*CreateHealthstone*/
+(6201,0,6201,1,0),
+(6202,6201,6201,2,0),
+(5699,6202,6201,3,0),
+(11729,5699,6201,4,0),
+(11730,11729,6201,5,0),
+(27230,11730,6201,6,0),
+(47871,27230,6201,7,0),
+(47878,47871,6201,8,0),
+/*CreateSoulstone*/
+(693,0,693,1,0),
+(20752,693,693,2,0),
+(20755,20752,693,3,0),
+(20756,20755,693,4,0),
+(20757,20756,693,5,0),
+(27238,20757,693,6,0),
+(47884,27238,693,7,0),
+/*CreateSpellstone*/
+(2362,0,2362,1,0),
+(17727,2362,2362,2,0),
+(17728,17727,2362,3,0),
+(28172,17728,2362,4,0),
+(47886,28172,2362,5,0),
+(47888,47886,2362,6,0),
+/*DemonArmor*/
+(706,0,706,1,0),
+(1086,706,706,2,0),
+(11733,1086,706,3,0),
+(11734,11733,706,4,0),
+(11735,11734,706,5,0),
+(27260,11735,706,6,0),
+(47793,27260,706,7,0),
+(47889,47793,706,8,0),
+/*DemonSkin*/
+(687,0,687,1,0),
+(696,687,687,2,0),
+/*EnslaveDemon*/
+(1098,0,1098,1,0),
+(11725,1098,1098,2,0),
+(11726,11725,1098,3,0),
+(61191,11726,1098,4,0),
+/*FelArmor*/
+(28176,0,28176,1,0),
+(28189,28176,28176,2,0),
+(47892,28189,28176,3,0),
+(47893,47892,28176,4,0),
+/*HealthFunnel*/
+(755,0,755,1,0),
+(3698,755,755,2,0),
+(3699,3698,755,3,0),
+(3700,3699,755,4,0),
+(11693,3700,755,5,0),
+(11694,11693,755,6,0),
+(11695,11694,755,7,0),
+(27259,11695,755,8,0),
+(47856,27259,755,9,0),
+/*RitualofSouls*/
+(29893,0,29893,1,0),
+(58887,29893,29893,2,0),
+/*ShadowWard*/
+(6229,0,6229,1,0),
+(11739,6229,6229,2,0),
+(11740,11739,6229,3,0),
+(28610,11740,6229,4,0),
+(47890,28610,6229,5,0),
+(47891,47890,6229,6,0),
+/*------------------
+--(355)Affliction
+------------------*/
+/*Corruption*/
+(172,0,172,1,0),
+(6222,172,172,2,0),
+(6223,6222,172,3,0),
+(7648,6223,172,4,0),
+(11671,7648,172,5,0),
+(11672,11671,172,6,0),
+(25311,11672,172,7,0),
+(27216,25311,172,8,0),
+(47812,27216,172,9,0),
+(47813,47812,172,10,0),
+/*CurseofAgony*/
+(980,0,980,1,0),
+(1014,980,980,2,0),
+(6217,1014,980,3,0),
+(11711,6217,980,4,0),
+(11712,11711,980,5,0),
+(11713,11712,980,6,0),
+(27218,11713,980,7,0),
+(47863,27218,980,8,0),
+(47864,47863,980,9,0),
+/*CurseofDoom*/
+(603,0,603,1,0),
+(30910,603,603,2,0),
+(47867,30910,603,3,0),
+/*CurseofRecklessness*/
+(704,0,704,1,0),
+(7658,704,704,2,0),
+(7659,7658,704,3,0),
+(11717,7659,704,4,0),
+(27226,11717,704,5,0),
+(57595,27226,704,6,0),
+/*CurseoftheElements*/
+(1490,0,1490,1,0),
+(11721,1490,1490,2,0),
+(11722,11721,1490,3,0),
+(27228,11722,1490,4,0),
+(47865,27228,1490,5,0),
+/*CurseofTongues*/
+(1714,0,1714,1,0),
+(11719,1714,1714,2,0),
+/*CurseofWeakness*/
+(702,0,702,1,0),
+(1108,702,702,2,0),
+(6205,1108,702,3,0),
+(7646,6205,702,4,0),
+(11707,7646,702,5,0),
+(11708,11707,702,6,0),
+(27224,11708,702,7,0),
+(30909,27224,702,8,0),
+(50511,30909,702,9,0),
+/*DeathCoil*/
+(6789,0,6789,1,0),
+(17925,6789,6789,2,0),
+(17926,17925,6789,3,0),
+(27223,17926,6789,4,0),
+(47859,27223,6789,5,0),
+(47860,47859,6789,6,0),
+/*DrainLife*/
+(689,0,689,1,0),
+(699,689,689,2,0),
+(709,699,689,3,0),
+(7651,709,689,4,0),
+(11699,7651,689,5,0),
+(11700,11699,689,6,0),
+(27219,11700,689,7,0),
+(27220,27219,689,8,0),
+(47857,27220,689,9,0),
+/*DrainMana*/
+(5138,0,5138,1,0),
+(6226,5138,5138,2,0),
+(11703,6226,5138,3,0),
+(11704,11703,5138,4,0),
+(27221,11704,5138,5,0),
+(30908,27221,5138,6,0),
+(47858,30908,5138,7,0),
+/*DrainSoul*/
+(1120,0,1120,1,0),
+(8288,1120,1120,2,0),
+(8289,8288,1120,3,0),
+(11675,8289,1120,4,0),
+(27217,11675,1120,5,0),
+(47855,27217,1120,6,0),
+/*Fear*/
+(5782,0,5782,1,0),
+(6213,5782,5782,2,0),
+(6215,6213,5782,3,0),
+/*Haunt*/
+(48181,0,48181,1,0),
+(59161,48181,48181,2,0),
+(59163,59161,48181,3,0),
+(59164,59163,48181,4,0),
+/*HowlofTerror*/
+(5484,0,5484,1,0),
+(17928,5484,5484,2,0),
+/*SeedofCorruption*/
+(27243,0,27243,1,0),
+(47835,27243,27243,2,0),
+(47836,47835,27243,3,0),
+/*SiphonLife*/
+(18265,0,18265,1,0),
+(18879,18265,18265,2,0),
+(18880,18879,18265,3,0),
+(18881,18880,18265,4,0),
+(27264,18881,18265,5,0),
+(30911,27264,18265,6,0),
+(47861,30911,18265,7,0),
+(47862,47861,18265,8,0),
+/*UnstableAffliction*/
+(30108,0,30108,1,0),
+(30404,30108,30108,2,0),
+(30405,30404,30108,3,0),
+(47841,30405,30108,4,0),
+(47843,47841,30108,5,0),
+/*------------------
+--(373)Enhancement
+------------------*/
+/*FireResistanceTotem*/
+(8184,0,8184,1,0),
+(10537,8184,8184,2,0),
+(10538,10537,8184,3,0),
+(25563,10538,8184,4,0),
+(58737,25563,8184,5,0),
+(58739,58737,8184,6,0),
+/*FlametongueTotem*/
+(8227,0,8227,1,0),
+(8249,8227,8227,2,0),
+(10526,8249,8227,3,0),
+(16387,10526,8227,4,0),
+(25557,16387,8227,5,0),
+(58649,25557,8227,6,0),
+(58652,58649,8227,7,0),
+(58656,58652,8227,8,0),
+/*FlametongueWeapon*/
+(8024,0,8024,1,0),
+(8027,8024,8024,2,0),
+(8030,8027,8024,3,0),
+(16339,8030,8024,4,0),
+(16341,16339,8024,5,0),
+(16342,16341,8024,6,0),
+(25489,16342,8024,7,0),
+(58785,25489,8024,8,0),
+(58789,58785,8024,9,0),
+(58790,58789,8024,10,0),
+/*FrostResistanceTotem*/
+(8181,0,8181,1,0),
+(10478,8181,8181,2,0),
+(10479,10478,8181,3,0),
+(25560,10479,8181,4,0),
+(58741,25560,8181,5,0),
+(58745,58741,8181,6,0),
+/*FrostbrandWeapon*/
+(8033,0,8033,1,0),
+(8038,8033,8033,2,0),
+(10456,8038,8033,3,0),
+(16355,10456,8033,4,0),
+(16356,16355,8033,5,0),
+(25500,16356,8033,6,0),
+(58794,25500,8033,7,0),
+(58795,58794,8033,8,0),
+(58796,58795,8033,9,0),
+/*Life Tap*/
+(1454,0,1454,1,0),
+(1455,1454,1454,2,0),
+(1456,1455,1454,3,0),
+(11687,1456,1454,4,0),
+(11688,11687,1454,5,0),
+(11689,11688,1454,6,0),
+(27222,11689,1454,7,0),
+(57946,27222,1454,8,0),
+/*Lightning Shield*/
+(324,0,324,1,0),
+(325,324,324,2,0),
+(905,325,324,3,0),
+(945,905,324,4,0),
+(8134,945,324,5,0),
+(10431,8134,324,6,0),
+(10432,10431,324,7,0),
+(25469,10432,324,8,0),
+(25472,25469,324,9,0),
+(49280,25472,324,10,0),
+(49281,49280,324,11,0),
+/*NatureResistanceTotem*/
+(10595,0,10595,1,0),
+(10600,10595,10595,2,0),
+(10601,10600,10595,3,0),
+(25574,10601,10595,4,0),
+(58746,25574,10595,5,0),
+(58749,58746,10595,6,0),
+/*RockbiterWeapon*/
+(8017,0,8017,1,0),
+(8018,8017,8017,2,0),
+(8019,8018,8017,3,0),
+(10399,8019,8017,4,0),
+/*StoneskinTotem*/
+(8071,0,8071,1,0),
+(8154,8071,8071,2,0),
+(8155,8154,8071,3,0),
+(10406,8155,8071,4,0),
+(10407,10406,8071,5,0),
+(10408,10407,8071,6,0),
+(25508,10408,8071,7,0),
+(25509,25508,8071,8,0),
+(58751,25509,8071,9,0),
+(58753,58751,8071,10,0),
+/*StrengthofEarthTotem*/
+(8075,0,8075,1,0),
+(8160,8075,8075,2,0),
+(8161,8160,8075,3,0),
+(10442,8161,8075,4,0),
+(25361,10442,8075,5,0),
+(25528,25361,8075,6,0),
+(57622,25528,8075,7,0),
+(58643,57622,8075,8,0),
+/*WindfuryWeapon*/
+(8232,0,8232,1,0),
+(8235,8232,8232,2,0),
+(10486,8235,8232,3,0),
+(16362,10486,8232,4,0),
+(25505,16362,8232,5,0),
+(58801,25505,8232,6,0),
+(58803,58801,8232,7,0),
+(58804,58803,8232,8,0),
+/*------------------
+-- (374) Restoration (Shaman)
+------------------*/
+/*AncestralSpirit*/
+(2008,0,2008,1,0),
+(20609,2008,2008,2,0),
+(20610,20609,2008,3,0),
+(20776,20610,2008,4,0),
+(20777,20776,2008,5,0),
+(25590,20777,2008,6,0),
+(49277,25590,2008,7,0),
+/*ChainHeal*/
+(1064,0,1064,1,0),
+(10622,1064,1064,2,0),
+(10623,10622,1064,3,0),
+(25422,10623,1064,4,0),
+(25423,25422,1064,5,0),
+(55458,25423,1064,6,0),
+(55459,55458,1064,7,0),
+/*EarthShield*/
+(974,0,974,1,0),
+(32593,974,974,2,0),
+(32594,32593,974,3,0),
+(49283,32594,974,4,0),
+(49284,49283,974,5,0),
+/*EarthlivingWeapon*/
+(51730,0,51730,1,0),
+(51988,51730,51730,2,0),
+(51991,51988,51730,3,0),
+(51992,51991,51730,4,0),
+(51993,51992,51730,5,0),
+(51994,51993,51730,6,0),
+/*HealingStreamTotem*/
+(5394,0,5394,1,0),
+(6375,5394,5394,2,0),
+(6377,6375,5394,3,0),
+(10462,6377,5394,4,0),
+(10463,10462,5394,5,0),
+(25567,10463,5394,6,0),
+(58755,25567,5394,7,0),
+(58756,58755,5394,8,0),
+(58757,58756,5394,9,0),
+/*HealingWave*/
+(331,0,331,1,0),
+(332,331,331,2,0),
+(547,332,331,3,0),
+(913,547,331,4,0),
+(939,913,331,5,0),
+(959,939,331,6,0),
+(8005,959,331,7,0),
+(10395,8005,331,8,0),
+(10396,10395,331,9,0),
+(25357,10396,331,10,0),
+(25391,25357,331,11,0),
+(25396,25391,331,12,0),
+(49272,25396,331,13,0),
+(49273,49272,331,14,0),
+/*LesserHealingWave*/
+(8004,0,8004,1,0),
+(8008,8004,8004,2,0),
+(8010,8008,8004,3,0),
+(10466,8010,8004,4,0),
+(10467,10466,8004,5,0),
+(10468,10467,8004,6,0),
+(25420,10468,8004,7,0),
+(49275,25420,8004,8,0),
+(49276,49275,8004,9,0),
+/*Mana Spring Totem*/
+(5675,0,5675,1,0),
+(10495,5675,5675,2,0),
+(10496,10495,5675,3,0),
+(10497,10496,5675,4,0),
+(25570,10497,5675,5,0),
+(58771,25570,5675,6,0),
+(58773,58771,5675,7,0),
+(58774,58773,5675,8,0),
+/*Riptide*/
+(61295,0,61295,1,0),
+(61299,61295,61295,2,0),
+(61300,61299,61295,3,0),
+(61301,61300,61295,4,0),
+/*Water Shield*/
+(52127,0,52127,1,0),
+(52129,52127,52127,2,0),
+(52131,52129,52127,3,0),
+(52134,52131,52127,4,0),
+(52136,52134,52127,5,0),
+(52138,52136,52127,6,0),
+(24398,52138,52127,7,0),
+(33736,24398,52127,8,0),
+(57960,33736,52127,9,0),
+/*------------------
+-- (375) Elemental Combat
+------------------*/
+/*Chain Lightning*/
+(421,0,421,1,0),
+(930,421,421,2,0),
+(2860,930,421,3,0),
+(10605,2860,421,4,0),
+(25439,10605,421,5,0),
+(25442,25439,421,6,0),
+(49270,25442,421,7,0),
+(49271,49270,421,8,0),
+/*Earth Shock*/
+(8042,0,8042,1,0),
+(8044,8042,8042,2,0),
+(8045,8044,8042,3,0),
+(8046,8045,8042,4,0),
+(10412,8046,8042,5,0),
+(10413,10412,8042,6,0),
+(10414,10413,8042,7,0),
+(25454,10414,8042,8,0),
+(49230,25454,8042,9,0),
+(49231,49230,8042,10,0),
+/*Fire Nova Totem*/
+(1535,0,1535,1,0),
+(8498,1535,1535,2,0),
+(8499,8498,1535,3,0),
+(11314,8499,1535,4,0),
+(11315,11314,1535,5,0),
+(25546,11315,1535,6,0),
+(25547,25546,1535,7,0),
+(61649,25547,1535,8,0),
+(61657,61649,1535,9,0),
+/*Flame Shock*/
+(8050,0,8050,1,0),
+(8052,8050,8050,2,0),
+(8053,8052,8050,3,0),
+(10447,8053,8050,4,0),
+(10448,10447,8050,5,0),
+(29228,10448,8050,6,0),
+(25457,29228,8050,7,0),
+(49232,25457,8050,8,0),
+(49233,49232,8050,9,0),
+/*Frost Shock*/
+(8056,0,8056,1,0),
+(8058,8056,8056,2,0),
+(10472,8058,8056,3,0),
+(10473,10472,8056,4,0),
+(25464,10473,8056,5,0),
+(49235,25464,8056,6,0),
+(49236,49235,8056,7,0),
+/*LavaBurst*/
+(51505,0,51505,1,0),
+(60043,51505,51505,2,0),
+/*LightningBolt*/
+(403,0,403,1,0),
+(529,403,403,2,0),
+(548,529,403,3,0),
+(915,548,403,4,0),
+(943,915,403,5,0),
+(6041,943,403,6,0),
+(10391,6041,403,7,0),
+(10392,10391,403,8,0),
+(15207,10392,403,9,0),
+(15208,15207,403,10,0),
+(25448,15208,403,11,0),
+(25449,25448,403,12,0),
+(49237,25449,403,13,0),
+(49238,49237,403,14,0),
+/*MagmaTotem*/
+(8190,0,8190,1,0),
+(10585,8190,8190,2,0),
+(10586,10585,8190,3,0),
+(10587,10586,8190,4,0),
+(25552,10587,8190,5,0),
+(58731,25552,8190,6,0),
+(58734,58731,8190,7,0),
+/*Purge*/
+(370,0,370,1,0),
+(8012,370,370,2,0),
+/*SearingTotem*/
+(3599,0,3599,1,0),
+(6363,3599,3599,2,0),
+(6364,6363,3599,3,0),
+(6365,6364,3599,4,0),
+(10437,6365,3599,5,0),
+(10438,10437,3599,6,0),
+(25533,10438,3599,7,0),
+(58699,25533,3599,8,0),
+(58703,58699,3599,9,0),
+(58704,58703,3599,10,0),
+/*StoneclawTotem*/
+(5730,0,5730,1,0),
+(6390,5730,5730,2,0),
+(6391,6390,5730,3,0),
+(6392,6391,5730,4,0),
+(10427,6392,5730,5,0),
+(10428,10427,5730,6,0),
+(25525,10428,5730,7,0),
+(58580,25525,5730,8,0),
+(58581,58580,5730,9,0),
+(58582,58581,5730,10,0),
+/*TotemofWrath*/
+(30706,0,30706,1,0),
+(57720,30706,30706,2,0),
+(57721,57720,30706,3,0),
+(57722,57721,30706,4,0),
+/*------------------
+--(573)Restoration
+------------------*/
+/*GiftoftheWild*/
+(21849,0,21849,1,0),
+(21850,21849,21849,2,0),
+(26991,21850,21849,3,0),
+(48470,26991,21849,4,0),
+/*HealingTouch*/
+(5185,0,5185,1,0),
+(5186,5185,5185,2,0),
+(5187,5186,5185,3,0),
+(5188,5187,5185,4,0),
+(5189,5188,5185,5,0),
+(6778,5189,5185,6,0),
+(8903,6778,5185,7,0),
+(9758,8903,5185,8,0),
+(9888,9758,5185,9,0),
+(9889,9888,5185,10,0),
+(25297,9889,5185,11,0),
+(26978,25297,5185,12,0),
+(26979,26978,5185,13,0),
+(48377,26979,5185,14,0),
+(48378,48377,5185,15,0),
+/*Lifebloom*/
+(33763,0,33763,1,0),
+(48450,33763,33763,2,0),
+(48451,48450,33763,3,0),
+/*MarkoftheWild*/
+(1126,0,1126,1,0),
+(5232,1126,1126,2,0),
+(6756,5232,1126,3,0),
+(5234,6756,1126,4,0),
+(8907,5234,1126,5,0),
+(9884,8907,1126,6,0),
+(9885,9884,1126,7,0),
+(26990,9885,1126,8,0),
+(48469,26990,1126,9,0),
+/*Nourish*/
+(50464,0,50464,1,0),
+/*Rebirth*/
+(20484,0,20484,1,0),
+(20739,20484,20484,2,0),
+(20742,20739,20484,3,0),
+(20747,20742,20484,4,0),
+(20748,20747,20484,5,0),
+(26994,20748,20484,6,0),
+(48477,26994,20484,7,0),
+/*Regrowth*/
+(8936,0,8936,1,0),
+(8938,8936,8936,2,0),
+(8939,8938,8936,3,0),
+(8940,8939,8936,4,0),
+(8941,8940,8936,5,0),
+(9750,8941,8936,6,0),
+(9856,9750,8936,7,0),
+(9857,9856,8936,8,0),
+(9858,9857,8936,9,0),
+(26980,9858,8936,10,0),
+(48442,26980,8936,11,0),
+(48443,48442,8936,12,0),
+/*Rejuvenation*/
+(774,0,774,1,0),
+(1058,774,774,2,0),
+(1430,1058,774,3,0),
+(2090,1430,774,4,0),
+(2091,2090,774,5,0),
+(3627,2091,774,6,0),
+(8910,3627,774,7,0),
+(9839,8910,774,8,0),
+(9840,9839,774,9,0),
+(9841,9840,774,10,0),
+(25299,9841,774,11,0),
+(26981,25299,774,12,0),
+(26982,26981,774,13,0),
+(48440,26982,774,14,0),
+(48441,48440,774,15,0),
+/*Revive*/
+(50769,0,50769,1,0),
+(50768,50769,50769,2,0),
+(50767,50768,50769,3,0),
+(50766,50767,50769,4,0),
+(50765,50766,50769,5,0),
+(50764,50765,50769,6,0),
+(50763,50764,50769,7,0),
+/*Tranquility*/
+(740,0,740,1,0),
+(8918,740,740,2,0),
+(9862,8918,740,3,0),
+(9863,9862,740,4,0),
+(26983,9863,740,5,0),
+(48446,26983,740,6,0),
+(48447,48446,740,7,0),
+/*WildGrowth*/
+(48438,0,48438,1,0),
+(53248,48438,48438,2,0),
+(53249,53248,48438,3,0),
+(53251,53249,48438,4,0),
+/*------------------
+--(574)Balance
+------------------*/
+/*EntanglingRoots*/
+(339,0,339,1,0),
+(1062,339,339,2,0),
+(5195,1062,339,3,0),
+(5196,5195,339,4,0),
+(9852,5196,339,5,0),
+(9853,9852,339,6,0),
+(26989,9853,339,7,0),
+(53308,26989,339,8,0),
+/*Nature'sGrasp*/
+(16689,0,16689,1,339),
+(16810,16689,16689,2,1062),
+(16811,16810,16689,3,5195),
+(16812,16811,16689,4,5196),
+(16813,16812,16689,5,9852),
+(17329,16813,16689,6,9853),
+(27009,17329,16689,7,26989),
+(53312,27009,16689,8,53308),
+/*FaerieFire*/
+(770,0,770,1,0),
+(778,770,770,2,0),
+(9749,778,770,3,0),
+(9907,9749,770,4,0),
+(26993,9907,770,5,0),
+(48476,26993,770,6,0),
+/*Hibernate*/
+(2637,0,2637,1,0),
+(18657,2637,2637,2,0),
+(18658,18657,2637,3,0),
+/*Hurricane*/
+(16914,0,16914,1,0),
+(17401,16914,16914,2,0),
+(17402,17401,16914,3,0),
+(27012,17402,16914,4,0),
+(48467,27012,16914,5,0),
+/*InsectSwarm*/
+(5570,0,5570,1,0),
+(24974,5570,5570,2,0),
+(24975,24974,5570,3,0),
+(24976,24975,5570,4,0),
+(24977,24976,5570,5,0),
+(27013,24977,5570,6,0),
+(48468,27013,5570,7,0),
+/*Moonfire*/
+(8921,0,8921,1,0),
+(8924,8921,8921,2,0),
+(8925,8924,8921,3,0),
+(8926,8925,8921,4,0),
+(8927,8926,8921,5,0),
+(8928,8927,8921,6,0),
+(8929,8928,8921,7,0),
+(9833,8929,8921,8,0),
+(9834,9833,8921,9,0),
+(9835,9834,8921,10,0),
+(26987,9835,8921,11,0),
+(26988,26987,8921,12,0),
+(48462,26988,8921,13,0),
+(48463,48462,8921,14,0),
+/*SootheAnimal*/
+(2908,0,2908,1,0),
+(8955,2908,2908,2,0),
+(9901,8955,2908,3,0),
+(26995,9901,2908,4,0),
+/*Starfall*/
+(48505,0,48505,1,0),
+(53199,48505,48505,2,0),
+(53200,53199,48505,3,0),
+(53201,53200,48505,4,0),
+/*Starfire*/
+(2912,0,2912,1,0),
+(8949,2912,2912,2,0),
+(8950,8949,2912,3,0),
+(8951,8950,2912,4,0),
+(9875,8951,2912,5,0),
+(9876,9875,2912,6,0),
+(25298,9876,2912,7,0),
+(26986,25298,2912,8,0),
+(48464,26986,2912,9,0),
+(48465,48464,2912,10,0),
+/*Thorns*/
+(467,0,467,1,0),
+(782,467,467,2,0),
+(1075,782,467,3,0),
+(8914,1075,467,4,0),
+(9756,8914,467,5,0),
+(9910,9756,467,6,0),
+(26992,9910,467,7,0),
+(53307,26992,467,8,0),
+/*Typhoon*/
+(50516,0,50516,1,0),
+(53223,50516,50516,2,0),
+(53225,53223,50516,3,0),
+(53226,53225,50516,4,0),
+(61384,53226,50516,5,0),
+/*Wrath*/
+(5176,0,5176,1,0),
+(5177,5176,5176,2,0),
+(5178,5177,5176,3,0),
+(5179,5178,5176,4,0),
+(5180,5179,5176,5,0),
+(6780,5180,5176,6,0),
+(8905,6780,5176,7,0),
+(9912,8905,5176,8,0),
+(26984,9912,5176,9,0),
+(26985,26984,5176,10,0),
+(48459,26985,5176,11,0),
+(48461,48459,5176,12,0),
+/*------------------
+--(593)Destruction
+------------------*/
+/*ChaosBolt*/
+(50796,0,50796,1,0),
+(59170,50796,50796,2,0),
+(59171,59170,50796,3,0),
+(59172,59171,50796,4,0),
+/*Conflagrate*/
+(17962,0,17962,1,0),
+(18930,17962,17962,2,0),
+(18931,18930,17962,3,0),
+(18932,18931,17962,4,0),
+(27266,18932,17962,5,0),
+(30912,27266,17962,6,0),
+(47828,30912,17962,7,0),
+(47829,47828,17962,8,0),
+/*Hellfire*/
+(1949,0,1949,1,0),
+(11683,1949,1949,2,0),
+(11684,11683,1949,3,0),
+(27213,11684,1949,4,0),
+(47823,27213,1949,5,0),
+/*Immolate*/
+(348,0,348,1,0),
+(707,348,348,2,0),
+(1094,707,348,3,0),
+(2941,1094,348,4,0),
+(11665,2941,348,5,0),
+(11667,11665,348,6,0),
+(11668,11667,348,7,0),
+(25309,11668,348,8,0),
+(27215,25309,348,9,0),
+(47810,27215,348,10,0),
+(47811,47810,348,11,0),
+/*Incinerate*/
+(29722,0,29722,1,0),
+(32231,29722,29722,2,0),
+(47837,32231,29722,3,0),
+(47838,47837,29722,4,0),
+/*RainofFire*/
+(5740,0,5740,1,0),
+(6219,5740,5740,2,0),
+(11677,6219,5740,3,0),
+(11678,11677,5740,4,0),
+(27212,11678,5740,5,0),
+(47819,27212,5740,6,0),
+(47820,47819,5740,7,0),
+/*SearingPain*/
+(5676,0,5676,1,0),
+(17919,5676,5676,2,0),
+(17920,17919,5676,3,0),
+(17921,17920,5676,4,0),
+(17922,17921,5676,5,0),
+(17923,17922,5676,6,0),
+(27210,17923,5676,7,0),
+(30459,27210,5676,8,0),
+(47814,30459,5676,9,0),
+(47815,47814,5676,10,0),
+/*ShadowBolt*/
+(686,0,686,1,0),
+(695,686,686,2,0),
+(705,695,686,3,0),
+(1088,705,686,4,0),
+(1106,1088,686,5,0),
+(7641,1106,686,6,0),
+(11659,7641,686,7,0),
+(11660,11659,686,8,0),
+(11661,11660,686,9,0),
+(25307,11661,686,10,0),
+(27209,25307,686,11,0),
+(47808,27209,686,12,0),
+(47809,47808,686,13,0),
+/*Shadowburn*/
+(17877,0,17877,1,0),
+(18867,17877,17877,2,0),
+(18868,18867,17877,3,0),
+(18869,18868,17877,4,0),
+(18870,18869,17877,5,0),
+(18871,18870,17877,6,0),
+(27263,18871,17877,7,0),
+(30546,27263,17877,8,0),
+(47826,30546,17877,9,0),
+(47827,47826,17877,10,0),
+/*Shadowflame*/
+(47897,0,47897,1,0),
+(61290,47897,47897,2,0),
+/*Shadowfury*/
+(30283,0,30283,1,0),
+(30413,30283,30283,2,0),
+(30414,30413,30283,3,0),
+(47846,30414,30283,4,0),
+(47847,47846,30283,5,0),
+/*SoulFire*/
+(6353,0,6353,1,0),
+(17924,6353,6353,2,0),
+(27211,17924,6353,3,0),
+(30545,27211,6353,4,0),
+(47824,30545,6353,5,0),
+(47825,47824,6353,6,0),
+/*------------------
+--(594) Holy (Paladin)
+------------------*/
+/*Blessing of Wisdom*/
+(19742,0,19742,1,0),
+(19850,19742,19742,2,0),
+(19852,19850,19742,3,0),
+(19853,19852,19742,4,0),
+(19854,19853,19742,5,0),
+(25290,19854,19742,6,0),
+(27142,25290,19742,7,0),
+(48935,27142,19742,8,0),
+(48936,48935,19742,9,0),
+/*Consecration*/
+(26573,0,26573,1,0),
+(20116,26573,26573,2,0),
+(20922,20116,26573,3,0),
+(20923,20922,26573,4,0),
+(20924,20923,26573,5,0),
+(27173,20924,26573,6,0),
+(48818,27173,26573,7,0),
+(48819,48818,26573,8,0),
+/*Exorcism*/
+(879,0,879,1,0),
+(5614,879,879,2,0),
+(5615,5614,879,3,0),
+(10312,5615,879,4,0),
+(10313,10312,879,5,0),
+(10314,10313,879,6,0),
+(27138,10314,879,7,0),
+(48800,27138,879,8,0),
+(48801,48800,879,9,0),
+/*Flash of Light*/
+(19750,0,19750,1,0),
+(19939,19750,19750,2,0),
+(19940,19939,19750,3,0),
+(19941,19940,19750,4,0),
+(19942,19941,19750,5,0),
+(19943,19942,19750,6,0),
+(27137,19943,19750,7,0),
+(48784,27137,19750,8,0),
+(48785,48784,19750,9,0),
+/*Greater Blessing of Wisdom*/
+(25894,0,25894,1,19854),
+(25918,25894,25894,2,25290),
+(27143,25918,25894,3,27142),
+(48937,27143,25894,4,48935),
+(48938,48937,25894,5,48936),
+/*Holy Light*/
+(635,0,635,1,0),
+(639,635,635,2,0),
+(647,639,635,3,0),
+(1026,647,635,4,0),
+(1042,1026,635,5,0),
+(3472,1042,635,6,0),
+(10328,3472,635,7,0),
+(10329,10328,635,8,0),
+(25292,10329,635,9,0),
+(27135,25292,635,10,0),
+(27136,27135,635,11,0),
+(48781,27136,635,12,0),
+(48782,48781,635,13,0),
+/*HolyShock*/
+(20473,0,20473,1,0),
+(20929,20473,20473,2,0),
+(20930,20929,20473,3,0),
+(27174,20930,20473,4,0),
+(33072,27174,20473,5,0),
+(48824,33072,20473,6,0),
+(48825,48824,20473,7,0),
+/*HolyWrath*/
+(2812,0,2812,1,0),
+(10318,2812,2812,2,0),
+(27139,10318,2812,3,0),
+(48816,27139,2812,4,0),
+(48817,48816,2812,5,0),
+/*Lay on Hands*/
+(633,0,633,1,0),
+(2800,633,633,2,0),
+(10310,2800,633,3,0),
+(27154,10310,633,4,0),
+(48788,27154,633,5,0),
+/*Redemption*/
+(7328,0,7328,1,0),
+(10322,7328,7328,2,0),
+(10324,10322,7328,3,0),
+(20772,10324,7328,4,0),
+(20773,20772,7328,5,0),
+(48949,20773,7328,6,0),
+(48950,48949,7328,7,0),
+/*------------------
+--(613)Discipline
+------------------*/
+/*DispelMagic*/
+(527,0,527,1,0),
+(988,527,527,2,0),
+/*DivineSpirit*/
+(14752,0,14752,1,0),
+(14818,14752,14752,2,0),
+(14819,14818,14752,3,0),
+(27841,14819,14752,4,0),
+(25312,27841,14752,5,0),
+(48073,25312,14752,6,0),
+/*InnerFire*/
+(588,0,588,1,0),
+(7128,588,588,2,0),
+(602,7128,588,3,0),
+(1006,602,588,4,0),
+(10951,1006,588,5,0),
+(10952,10951,588,6,0),
+(25431,10952,588,7,0),
+(48040,25431,588,8,0),
+(48168,48040,588,9,0),
+/*ManaBurn*/
+(8129,0,8129,1,0),
+(8131,8129,8129,2,0),
+(10874,8131,8129,3,0),
+(10875,10874,8129,4,0),
+(10876,10875,8129,5,0),
+(25379,10876,8129,6,0),
+(25380,25379,8129,7,0),
+(48128,25380,8129,8,0),
+/*Penance*/
+(47540,0,47540,1,0),
+(53005,47540,47540,2,0),
+(53006,53005,47540,3,0),
+(53007,53006,47540,4,0),
+/*PowerWord:Fortitude*/
+(1243,0,1243,1,0),
+(1244,1243,1243,2,0),
+(1245,1244,1243,3,0),
+(2791,1245,1243,4,0),
+(10937,2791,1243,5,0),
+(10938,10937,1243,6,0),
+(25389,10938,1243,7,0),
+(48161,25389,1243,8,0),
+/*PowerWord:Shield*/
+(17,0,17,1,0),
+(592,17,17,2,0),
+(600,592,17,3,0),
+(3747,600,17,4,0),
+(6065,3747,17,5,0),
+(6066,6065,17,6,0),
+(10898,6066,17,7,0),
+(10899,10898,17,8,0),
+(10900,10899,17,9,0),
+(10901,10900,17,10,0),
+(25217,10901,17,11,0),
+(25218,25217,17,12,0),
+(48065,25218,17,13,0),
+(48066,48065,17,14,0),
+/*PrayerofFortitude*/
+(21562,0,21562,1,0),
+(21564,21562,21562,2,0),
+(25392,21564,21562,3,0),
+(48162,25392,21562,4,0),
+/*Prayer of Spirit*/
+(27681,0,27681,1,14752),
+(32999,27681,27681,2,0),
+(48074,32999,27681,3,0),
+/*ShackleUndead*/
+(9484,0,9484,1,0),
+(9485,9484,9484,2,0),
+(10955,9485,9484,3,0),
+/*------------------
+--(654)Pet-Hyena
+------------------*/
+/*TendonRip*/
+(50271,0,50271,1,0),
+(53571,50271,50271,2,0),
+(53572,53571,50271,3,0),
+(53573,53572,50271,4,0),
+(53574,53573,50271,5,0),
+(53575,53574,50271,6,0),
+/*------------------
+--(655)Pet-BirdofPrey
+------------------*/
+/*Snatch*/
+(50541,0,50541,1,0),
+(53537,50541,50541,2,0),
+(53538,53537,50541,3,0),
+(53540,53538,50541,4,0),
+(53542,53540,50541,5,0),
+(53543,53542,50541,6,0),
+/*------------------
+--(656)Pet-WindSerpent
+------------------*/
+/*LightningBreath*/
+(24844,0,24844,1,0),
+(25008,24844,24844,2,0),
+(25009,25008,24844,3,0),
+(25010,25009,24844,4,0),
+(25011,25010,24844,5,0),
+(25012,25011,24844,6,0),
+/*------------------
+--(761)Pet-Felguard
+------------------*/
+/*Anguish*/
+(33698,0,33698,1,0),
+(33699,33698,33698,2,0),
+(33700,33699,33698,3,0),
+(47993,33700,33698,4,0),
+/*Cleave*/
+(30213,0,30213,1,0),
+(30219,30213,30213,2,0),
+(30223,30219,30213,3,0),
+(47994,30223,30213,4,0),
+/*Intercept*/
+(30151,0,30151,1,0),
+(30194,30151,30151,2,0),
+(30198,30194,30151,3,0),
+(47996,30198,30151,4,0),
+/*------------------
+--(763)Pet-Dragonhawk
+------------------*/
+/*FireBreath*/
+(34889,0,34889,1,0),
+(35323,34889,34889,2,0),
+(55482,35323,34889,3,0),
+(55483,55482,34889,4,0),
+(55484,55483,34889,5,0),
+(55485,55484,34889,6,0),
+/*------------------
+--(764)Pet-NetherRay
+--(765)Pet-Sporebat
+------------------*/
+/*SporeCloud*/
+(50274,0,50274,1,0),
+(53593,50274,50274,2,0),
+(53594,53593,50274,3,0),
+(53596,53594,50274,4,0),
+(53597,53596,50274,5,0),
+(53598,53597,50274,6,0),
+/*------------------
+--(768)Pet-Serpent
+------------------*/
+/*PoisonSpit*/
+(35387,0,35387,1,0),
+(35389,35387,35387,2,0),
+(35392,35389,35387,3,0),
+(55555,35392,35387,4,0),
+(55556,55555,35387,5,0),
+(55557,55556,35387,6,0),
+/*------------------
+--(770)Blood
+------------------*/
+/*BloodBoil*/
+(48721,0,48721,1,0),
+(49939,48721,48721,2,0),
+(49940,49939,48721,3,0),
+(49941,49940,48721,4,0),
+/*BloodStrike*/
+(45902,0,45902,1,0),
+(49926,45902,45902,2,0),
+(49927,49926,45902,3,0),
+(49928,49927,45902,4,0),
+(49929,49928,45902,5,0),
+(49930,49929,45902,6,0),
+/*HeartStrike*/
+(55050,0,55050,1,0),
+(55258,55050,55050,2,0),
+(55259,55258,55050,3,0),
+(55260,55259,55050,4,0),
+(55261,55260,55050,5,0),
+(55262,55261,55050,6,0),
+/*ImprovedRuneTap*/
+(48985,0,48985,1,0),
+(49488,48985,48985,2,0),
+(49489,49488,48985,3,0),
+/*Pestilence*/
+(50842,0,50842,1,0),
+(51426,50842,50842,2,0),
+(51427,51426,50842,3,0),
+(51428,51427,50842,4,0),
+(51429,51428,50842,5,0),
+/*Strangulate*/
+(47476,0,47476,1,0),
+(49913,47476,47476,2,0),
+(49914,49913,47476,3,0),
+(49915,49914,47476,4,0),
+(49916,49915,47476,5,0),
+/*Vendetta*/
+(49015,0,49015,1,0),
+(50154,49015,49015,2,0),
+(55136,50154,49015,3,0),
+/*------------------
+--(771)Frost
+------------------*/
+/*FrostStrike*/
+(49143,0,49143,1,0),
+(51416,49143,49143,2,0),
+(51417,51416,49143,3,0),
+(51418,51417,49143,4,0),
+(51419,51418,49143,5,0),
+(55268,51419,49143,6,0),
+/*HornofWinter*/
+(57330,0,57330,1,0),
+(57623,57330,57330,2,0),
+/*HowlingBlast*/
+(49184,0,49184,1,0),
+(51408,49184,49184,2,0),
+(51409,51408,49184,3,0),
+(51410,51409,49184,4,0),
+(51411,51410,49184,5,0),
+/*IcyTalons*/
+(50880,0,50880,1,0),
+(50884,50880,50880,2,0),
+(50885,50884,50880,3,0),
+(50886,50885,50880,4,0),
+(50887,50886,50880,5,0),
+/*IcyTouch*/
+(45477,0,45477,1,0),
+(49896,45477,45477,2,0),
+(49903,49896,45477,3,0),
+(49904,49903,45477,4,0),
+(49909,49904,45477,5,0),
+/*ImprovedIcyTouch*/
+(49175,0,49175,1,0),
+(50031,49175,49175,2,0),
+(51456,50031,49175,3,0),
+/*Obliterate*/
+(49020,0,49020,1,0),
+(51423,49020,49020,2,0),
+(51424,51423,49020,3,0),
+(51425,51424,49020,4,0),
+/*------------------
+--(772)Unholy
+------------------*/
+/*CorpseExplosion*/
+(49158,0,49158,1,0),
+(51325,49158,49158,2,0),
+(51326,51325,49158,3,0),
+(51327,51326,49158,4,0),
+(51328,51327,49158,5,0),
+/*DeathandDecay*/
+(43265,0,43265,1,0),
+(49936,43265,43265,2,0),
+(49937,49936,43265,3,0),
+(49938,49937,43265,4,0),
+/*DeathCoil*/
+(52375,0,52375,1,0),
+(49892,52375,52375,2,0),
+(49893,49892,52375,3,0),
+(49894,49893,52375,4,0),
+(49895,49894,52375,5,0),
+/*DeathStrike*/
+(49998,0,49998,1,0),
+(49999,49998,49998,2,0),
+(45463,49999,49998,3,0),
+(49923,45463,49998,4,0),
+(49924,49923,49998,5,0),
+/*MagicSuppression*/
+(49224,0,49224,1,0),
+(49610,49224,49224,2,0),
+(49611,49610,49224,3,0),
+(49612,49611,49224,4,0),
+(49614,49612,49224,5,0),
+/*Outbreak*/
+(49013,0,49013,1,0),
+(55236,49013,49013,2,0),
+(55237,55236,49013,3,0),
+/*PlagueStrike*/
+(45462,0,45462,1,0),
+(49917,45462,45462,2,0),
+(49918,49917,45462,3,0),
+(49919,49918,45462,4,0),
+(49920,49919,45462,5,0),
+(49921,49920,45462,6,0),
+/*ScourgeStrike*/
+(55090,0,55090,1,0),
+(55265,55090,55090,2,0),
+(55270,55265,55090,3,0),
+(55271,55270,55090,4,0),
+/*UnholyBlight*/
+(49194,0,49194,1,0),
+(51376,49194,49194,2,0),
+(51378,51376,49194,3,0),
+(51379,51378,49194,4,0),
+/*------------------
+--(780)Pet-ExoticChimaera
+------------------*/
+/*FroststormBreath*/
+(54644,0,54644,1,0),
+(55488,54644,54644,2,0),
+(55489,55488,54644,3,0),
+(55490,55489,54644,4,0),
+(55491,55490,54644,5,0),
+(55492,55491,54644,6,0),
+/*------------------
+--(781)Pet-ExoticDevlisaur
+------------------*/
+/*MonstrousBite*/
+(54680,0,54680,1,0),
+(55495,54680,54680,2,0),
+(55496,55495,54680,3,0),
+(55497,55496,54680,4,0),
+(55498,55497,54680,5,0),
+(55499,55498,54680,6,0),
+/*------------------
+--(784)Pet-ExoticWorm
+------------------*/
+/*AcidSpit*/
+(55749,0,55749,1,0),
+(55750,55749,55749,2,0),
+(55751,55750,55749,3,0),
+(55752,55751,55749,4,0),
+(55753,55752,55749,5,0),
+(55754,55753,55749,6,0),
+/*------------------
+--(785)Pet-Wasp
+------------------*/
+/*Sting*/
+(56626,0,56626,1,0),
+(56627,56626,56626,2,0),
+(56628,56627,56626,3,0),
+(56629,56628,56626,4,0),
+(56630,56629,56626,5,0),
+(56631,56630,56626,6,0),
+/*------------------
+--(787)Pet-ExoticCoreHound
+------------------*/
+/*LavaBreath*/
+(58604,0,58604,1,0),
+(58607,58604,58604,2,0),
+(58608,58607,58604,3,0),
+(58609,58608,58604,4,0),
+(58610,58609,58604,5,0),
+(58611,58610,58604,6,0),
+/*------------------
+--(788)Pet-ExoticSpiritBeast
+------------------*/
+/*SpiritStrike*/
+(61193,0,61193,1,0),
+(61194,61193,61193,2,0),
+(61195,61194,61193,3,0),
+(61196,61195,61193,4,0),
+(61197,61196,61193,5,0),
+(61198,61197,61193,6,0),
+/*------------------
+--Professions
+------------------*/
+/*Alchemy*/
+(2259,0,2259,1,0),
+(3101,2259,2259,2,0),
+(3464,3101,2259,3,0),
+(11611,3464,2259,4,0),
+(28596,11611,2259,5,0),
+(28672,11611,2259,5,0),
+(28675,11611,2259,5,0),
+(28677,11611,2259,5,0),
+(51304,28596,2259,6,0),
+/*Blacksmithing*/
+(2018,0,2018,1,0),
+(3100,2018,2018,2,0),
+(3538,3100,2018,3,0),
+(9785,3538,2018,4,0),
+(9787,9785,2018,5,0),
+(9788,9785,2018,5,0),
+(29844,9785,2018,5,0),
+(17039,9787,2018,6,0),
+(17040,9787,2018,6,0),
+(17041,9787,2018,6,0),
+(51300,29844,2018,6,0),
+/*Cooking*/
+(2550,0,2550,1,0),
+(3102,2550,2550,2,0),
+(3413,3102,2550,3,0),
+(18260,3413,2550,4,0),
+(33359,18260,2550,5,0),
+(51296,33359,2550,6,0),
+/*Enchanting*/
+(7411,0,7411,1,0),
+(7412,7411,7411,2,0),
+(7413,7412,7411,3,0),
+(13920,7413,7411,4,0),
+(28029,13920,7411,5,0),
+(51313,28029,7411,6,0),
+/*Engineering*/
+(4036,0,4036,1,0),
+(4037,4036,4036,2,0),
+(4038,4037,4036,3,0),
+(12656,4038,4036,4,0),
+(20219,12656,4036,5,0),
+(20222,12656,4036,5,0),
+(30350,12656,4036,5,0),
+(51306,30350,4036,6,0),
+/*First Aid*/
+(3273,0,3273,1,0),
+(3274,3273,3273,2,0),
+(7924,3274,3273,3,0),
+(10846,7924,3273,4,0),
+(27028,10846,3273,5,0),
+(45542,27028,3273,6,0),
+/*Fishing*/
+(7620,0,7620,1,0),
+(7731,7620,7620,2,0),
+(7732,7731,7620,3,0),
+(18248,7732,7620,4,0),
+(33095,18248,7620,5,0),
+(51294,33095,7620,6,0),
+/*Herb Gathering*/
+(2366,0,2366,1,0),
+(2368,2366,2366,2,0),
+(3570,2368,2366,3,0),
+(11993,3570,2366,4,0),
+(28695,11993,2366,5,0),
+(50300,28695,2366,6,0),
+/*Inscription*/
+(45357,0,45357,1,0),
+(45358,45357,45357,2,0),
+(45359,45358,45357,3,0),
+(45360,45359,45357,4,0),
+(45361,45360,45357,5,0),
+(45363,45361,45357,6,0),
+/*Jewelcrafting*/
+(25229,0,25229,1,0),
+(25230,25229,25229,2,0),
+(28894,25230,25229,3,0),
+(28895,28894,25229,4,0),
+(28897,28895,25229,5,0),
+(51311,28897,25229,6,0),
+/*Leatherworking*/
+(2108,0,2108,1,0),
+(3104,2108,2108,2,0),
+(3811,3104,2108,3,0),
+(10662,3811,2108,4,0),
+(10656,10662,2108,5,0),
+(10658,10662,2108,5,0),
+(10660,10662,2108,5,0),
+(32549,10662,2108,5,0),
+(51302,32549,2108,6,0),
+/*Mining*/
+(2575,0,2575,1,0),
+(2576,2575,2575,2,0),
+(3564,2576,2575,3,0),
+(10248,3564,2575,4,0),
+(29354,10248,2575,5,0),
+(50310,29354,2575,6,0),
+/*Riding*/
+(33388,0,33388,1,0),
+(33391,33388,33388,2,0),
+(34090,33391,33388,3,0),
+(34091,34090,33388,4,0),
+/*Skinning*/
+(8613,0,8613,1,0),
+(8617,8613,8613,2,0),
+(8618,8617,8613,3,0),
+(10768,8618,8613,4,0),
+(32678,10768,8613,5,0),
+(50305,32678,8613,6,0),
+/*Tailoring*/
+(3908,0,3908,1,0),
+(3909,3908,3908,2,0),
+(3910,3909,3908,3,0),
+(12180,3910,3908,4,0),
+(26790,12180,3908,5,0),
+(26797,12180,3908,5,0),
+(26798,12180,3908,5,0),
+(26801,12180,3908,5,0),
+(51309,26790,3908,6,0);
diff --git a/sql/updates/6939_01_mangos_quest_template.sql b/sql/updates/6939_01_mangos_quest_template.sql
new file mode 100644
index 00000000000..88eb752f496
--- /dev/null
+++ b/sql/updates/6939_01_mangos_quest_template.sql
@@ -0,0 +1,4 @@
+ALTER TABLE db_version CHANGE COLUMN required_6936_01_mangos_spell_chain required_6939_01_mangos_quest_template bit;
+
+ALTER TABLE `quest_template`
+ CHANGE `RewHonorableKills` `RewHonorableKills` int unsigned NOT NULL default '0';
diff --git a/sql/updates/6940_01_mangos_spell_learn_spell.sql b/sql/updates/6940_01_mangos_spell_learn_spell.sql
new file mode 100644
index 00000000000..8a50fbb6aac
--- /dev/null
+++ b/sql/updates/6940_01_mangos_spell_learn_spell.sql
@@ -0,0 +1,3 @@
+ALTER TABLE db_version CHANGE COLUMN required_6939_01_mangos_quest_template required_6940_01_mangos_spell_learn_spell bit;
+
+DELETE FROM spell_learn_spell WHERE entry = 2842;
diff --git a/sql/updates/6941_01_mangos_spell_learn_spell.sql b/sql/updates/6941_01_mangos_spell_learn_spell.sql
new file mode 100644
index 00000000000..b2cf824b8aa
--- /dev/null
+++ b/sql/updates/6941_01_mangos_spell_learn_spell.sql
@@ -0,0 +1,6 @@
+ALTER TABLE db_version CHANGE COLUMN required_6940_01_mangos_spell_learn_spell required_6941_01_mangos_spell_learn_spell bit;
+
+DELETE FROM spell_learn_spell WHERE entry = 53428;
+INSERT INTO spell_learn_spell VALUES
+(53428,53341),
+(53428,53343);
diff --git a/sql/updates/6944_01_mangos_mangos_string.sql b/sql/updates/6944_01_mangos_mangos_string.sql
new file mode 100644
index 00000000000..cc45f79adcf
--- /dev/null
+++ b/sql/updates/6944_01_mangos_mangos_string.sql
@@ -0,0 +1,30 @@
+ALTER TABLE db_version CHANGE COLUMN required_6941_01_mangos_spell_learn_spell required_6944_01_mangos_mangos_string bit;
+
+DELETE FROM mangos_string WHERE entry in (712,717,718,719);
+INSERT INTO mangos_string VALUES
+(712,'|cffff0000[BG Queue Announcer]:|r %s -- [%u-%u] A: %u/%u, H: %u/%u|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(717,'|cffff0000[BG Queue Announcer]:|r %s -- [%u-%u] Started!|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(718,'|cffff0000[Arena Queue Announcer]:|r %s -- Joined : %ux%u : %u|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(719,'|cffff0000[Arena Queue Announcer]:|r %s -- Exited : %ux%u : %u|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
+
+DELETE FROM mangos_string WHERE entry in (720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736);
+INSERT INTO mangos_string VALUES
+(720,'Your group is too large for this battleground. Please regroup to join.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(721,'Your group is too large for this arena. Please regroup to join.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(722,'Your group has members not in your arena team. Please regroup to join.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(723,'Your group does not have enough players to join this match.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(724,'The Gold Team wins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(725,'The Green Team wins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(726,'There aren\'t enough players in this battleground. It will end soon unless some more players join to balance the fight.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(727,'Your group has an offline member. Please remove him before joining.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(728,'Your group has players from the opposing faction. You can\'t join the battleground as a group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(729,'Your group has players from different battleground brakets. You can\'t join as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(730,'Someone in your party is already in this battleground queue. (S)he must leave it before joining as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(731,'Someone in your party is Deserter. You can\'t join as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(732,'Someone in your party is already in three battleground queues. You cannot join as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(733,'You cannot teleport to a battleground or arena map.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(734,'You cannot summon players to a battleground or arena map.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(735,'You must be in GM mode to teleport to a player in a battleground.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(736,'You cannot teleport to a battleground from another battleground. Please leave the current battleground first.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
+
+DELETE FROM mangos_string WHERE entry in (1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138);
diff --git a/sql/updates/TBC-WLK_characters.sql b/sql/updates/TBC-WLK_characters.sql
new file mode 100644
index 00000000000..d7a90514207
--- /dev/null
+++ b/sql/updates/TBC-WLK_characters.sql
@@ -0,0 +1,114 @@
+alter table `character_pet`
+ drop column `trainpoint`,
+ drop column `loyaltypoints`,
+ drop column `loyalty`,
+ add `talentpoints` int(11) UNSIGNED default '0' NOT NULL after `Reactstate`;
+
+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;
+
+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;
+
+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;
+
+UPDATE characters SET data = REPLACE(data,' ',' ');
+UPDATE characters SET data = CONCAT(TRIM(data),' ');
+UPDATE characters SET data = CONCAT(
+ SUBSTRING(data, 1, length(SUBSTRING_INDEX(data, ' ', 10))), " 0 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 10))+2, length(SUBSTRING_INDEX(data, ' ', 18))- length(SUBSTRING_INDEX(data, ' ', 10)) - 1), " ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 20))+2, length(SUBSTRING_INDEX(data, ' ', 22))- length(SUBSTRING_INDEX(data, ' ', 20)) - 1), " ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 36))+2, length(SUBSTRING_INDEX(data, ' ', 37))- length(SUBSTRING_INDEX(data, ' ', 36)) - 1), " ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 22))+2, length(SUBSTRING_INDEX(data, ' ', 28))- length(SUBSTRING_INDEX(data, ' ', 22)) - 1), " 0 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 28))+2, length(SUBSTRING_INDEX(data, ' ', 34))- length(SUBSTRING_INDEX(data, ' ', 28)) - 1), " 0 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 1564))+2, length(SUBSTRING_INDEX(data, ' ', 1565))- length(SUBSTRING_INDEX(data, ' ', 1564)) - 1), " 0 0 0 0 0 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 1565))+2, length(SUBSTRING_INDEX(data, ' ', 1566))- length(SUBSTRING_INDEX(data, ' ', 1565)) - 1), " 0 0 0 0 0 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 34))+2, length(SUBSTRING_INDEX(data, ' ', 36))- length(SUBSTRING_INDEX(data, ' ', 34)) - 1), " 0 0 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 46))+2, length(SUBSTRING_INDEX(data, ' ', 48))- length(SUBSTRING_INDEX(data, ' ', 46)) - 1), " ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 146))+2, length(SUBSTRING_INDEX(data, ' ', 170))- length(SUBSTRING_INDEX(data, ' ', 146)) - 1), " ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 171))+2, length(SUBSTRING_INDEX(data, ' ', 209))- length(SUBSTRING_INDEX(data, ' ', 171)) - 1), " ",
+ ((SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 209))+2, length(SUBSTRING_INDEX(data, ' ', 210))- length(SUBSTRING_INDEX(data, ' ', 209)) - 1) & ~0x100) | ((SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 46))+2, length(SUBSTRING_INDEX(data, ' ', 47))- length(SUBSTRING_INDEX(data, ' ', 46)) - 1) & 0x1000) >> 4)), " ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 210))+2, length(SUBSTRING_INDEX(data, ' ', 233))- length(SUBSTRING_INDEX(data, ' ', 210)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 233))+2, length(SUBSTRING_INDEX(data, ' ', 358))- length(SUBSTRING_INDEX(data, ' ', 233)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 358))+2, length(SUBSTRING_INDEX(data, ' ', 359))- length(SUBSTRING_INDEX(data, ' ', 358)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 359))+2, length(SUBSTRING_INDEX(data, ' ', 374))- length(SUBSTRING_INDEX(data, ' ', 359)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 374))+2, length(SUBSTRING_INDEX(data, ' ', 375))- length(SUBSTRING_INDEX(data, ' ', 374)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 375))+2, length(SUBSTRING_INDEX(data, ' ', 390))- length(SUBSTRING_INDEX(data, ' ', 375)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 390))+2, length(SUBSTRING_INDEX(data, ' ', 391))- length(SUBSTRING_INDEX(data, ' ', 390)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 391))+2, length(SUBSTRING_INDEX(data, ' ', 406))- length(SUBSTRING_INDEX(data, ' ', 391)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 406))+2, length(SUBSTRING_INDEX(data, ' ', 407))- length(SUBSTRING_INDEX(data, ' ', 406)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 407))+2, length(SUBSTRING_INDEX(data, ' ', 422))- length(SUBSTRING_INDEX(data, ' ', 407)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 422))+2, length(SUBSTRING_INDEX(data, ' ', 423))- length(SUBSTRING_INDEX(data, ' ', 422)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 423))+2, length(SUBSTRING_INDEX(data, ' ', 438))- length(SUBSTRING_INDEX(data, ' ', 423)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 438))+2, length(SUBSTRING_INDEX(data, ' ', 439))- length(SUBSTRING_INDEX(data, ' ', 438)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 439))+2, length(SUBSTRING_INDEX(data, ' ', 454))- length(SUBSTRING_INDEX(data, ' ', 439)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 454))+2, length(SUBSTRING_INDEX(data, ' ', 455))- length(SUBSTRING_INDEX(data, ' ', 454)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 455))+2, length(SUBSTRING_INDEX(data, ' ', 470))- length(SUBSTRING_INDEX(data, ' ', 455)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 470))+2, length(SUBSTRING_INDEX(data, ' ', 471))- length(SUBSTRING_INDEX(data, ' ', 470)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 471))+2, length(SUBSTRING_INDEX(data, ' ', 486))- length(SUBSTRING_INDEX(data, ' ', 471)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 486))+2, length(SUBSTRING_INDEX(data, ' ', 487))- length(SUBSTRING_INDEX(data, ' ', 486)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 487))+2, length(SUBSTRING_INDEX(data, ' ', 502))- length(SUBSTRING_INDEX(data, ' ', 487)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 502))+2, length(SUBSTRING_INDEX(data, ' ', 503))- length(SUBSTRING_INDEX(data, ' ', 502)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 503))+2, length(SUBSTRING_INDEX(data, ' ', 518))- length(SUBSTRING_INDEX(data, ' ', 503)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 518))+2, length(SUBSTRING_INDEX(data, ' ', 519))- length(SUBSTRING_INDEX(data, ' ', 518)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 519))+2, length(SUBSTRING_INDEX(data, ' ', 534))- length(SUBSTRING_INDEX(data, ' ', 519)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 534))+2, length(SUBSTRING_INDEX(data, ' ', 535))- length(SUBSTRING_INDEX(data, ' ', 534)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 535))+2, length(SUBSTRING_INDEX(data, ' ', 550))- length(SUBSTRING_INDEX(data, ' ', 535)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 550))+2, length(SUBSTRING_INDEX(data, ' ', 551))- length(SUBSTRING_INDEX(data, ' ', 550)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 551))+2, length(SUBSTRING_INDEX(data, ' ', 566))- length(SUBSTRING_INDEX(data, ' ', 551)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 566))+2, length(SUBSTRING_INDEX(data, ' ', 567))- length(SUBSTRING_INDEX(data, ' ', 566)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 567))+2, length(SUBSTRING_INDEX(data, ' ', 582))- length(SUBSTRING_INDEX(data, ' ', 567)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 582))+2, length(SUBSTRING_INDEX(data, ' ', 583))- length(SUBSTRING_INDEX(data, ' ', 582)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 583))+2, length(SUBSTRING_INDEX(data, ' ', 598))- length(SUBSTRING_INDEX(data, ' ', 583)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 598))+2, length(SUBSTRING_INDEX(data, ' ', 599))- length(SUBSTRING_INDEX(data, ' ', 598)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 599))+2, length(SUBSTRING_INDEX(data, ' ', 614))- length(SUBSTRING_INDEX(data, ' ', 599)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 614))+2, length(SUBSTRING_INDEX(data, ' ', 615))- length(SUBSTRING_INDEX(data, ' ', 614)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 615))+2, length(SUBSTRING_INDEX(data, ' ', 630))- length(SUBSTRING_INDEX(data, ' ', 615)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 630))+2, length(SUBSTRING_INDEX(data, ' ', 631))- length(SUBSTRING_INDEX(data, ' ', 630)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 631))+2, length(SUBSTRING_INDEX(data, ' ', 646))- length(SUBSTRING_INDEX(data, ' ', 631)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 646))+2, length(SUBSTRING_INDEX(data, ' ', 647))- length(SUBSTRING_INDEX(data, ' ', 646)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 647))+2, length(SUBSTRING_INDEX(data, ' ', 922))- length(SUBSTRING_INDEX(data, ' ', 647)) - 1),
+ " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 922))+2, length(SUBSTRING_INDEX(data, ' ', 926))- length(SUBSTRING_INDEX(data, ' ', 922)) - 1), " 0 0 0 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 926))+2, length(SUBSTRING_INDEX(data, ' ', 1332))- length(SUBSTRING_INDEX(data, ' ', 926)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 1332))+2, length(SUBSTRING_INDEX(data, ' ', 1544))- length(SUBSTRING_INDEX(data, ' ', 1332)) - 1), " 0 ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 1544))+2, length(SUBSTRING_INDEX(data, ' ', 1564))- length(SUBSTRING_INDEX(data, ' ', 1544)) - 1), " ",
+ SUBSTRING(data, length(SUBSTRING_INDEX(data, ' ', 1566))+2, length(SUBSTRING_INDEX(data, ' ', 1592))- length(SUBSTRING_INDEX(data, ' ', 1566)) - 1),
+ " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ")
+WHERE length(SUBSTRING_INDEX(data, ' ', 1592)) < length(data) and length(SUBSTRING_INDEX(data, ' ', 1593)) >= length(data);
+
+UPDATE item_instance SET data = REPLACE(data,' ',' ');
+UPDATE item_instance SET data = CONCAT(TRIM(data),' ');
+UPDATE item_instance SET data= CONCAT(
+ SUBSTRING_INDEX(SUBSTRING_INDEX(data,' ',30),' ',-30),' 0 0 0 ',
+ SUBSTRING_INDEX(SUBSTRING_INDEX(data,' ',60),' ',-60+30),' 0 ')
+WHERE SUBSTRING_INDEX(data,' ',60) = data AND SUBSTRING_INDEX(data,' ',60-1) <> data;
+UPDATE item_instance SET data= CONCAT(
+ SUBSTRING_INDEX(SUBSTRING_INDEX(data,' ',30),' ',-30),' 0 0 0 ',
+ SUBSTRING_INDEX(SUBSTRING_INDEX(data,' ',60),' ',-60+30),' 0 ',
+ SUBSTRING_INDEX(SUBSTRING_INDEX(data,' ',134),' ',-134+60))
+WHERE SUBSTRING_INDEX(data,' ',134) = data AND SUBSTRING_INDEX(data,' ',134-1) <> data;
+
+
+
+
+
+ \ No newline at end of file
diff --git a/sql/updates/TBC-WLK_world.sql b/sql/updates/TBC-WLK_world.sql
new file mode 100644
index 00000000000..8c3cf1ffed3
--- /dev/null
+++ b/sql/updates/TBC-WLK_world.sql
@@ -0,0 +1,6096 @@
+-- TRUNCATE creature_equip_template;
+alter table `creature_equip_template`
+ drop column `equipinfo1`,
+ drop column `equipinfo2`,
+ drop column `equipinfo3`,
+ drop column `equipslot1`,
+ drop column `equipslot2`,
+ drop column `equipslot3`,
+ change `equipmodel1` `equipentry1` mediumint(8) UNSIGNED default '0' NOT NULL,
+ change `equipmodel2` `equipentry2` mediumint(8) UNSIGNED default '0' NOT NULL,
+ change `equipmodel3` `equipentry3` mediumint(8) UNSIGNED default '0' NOT NULL;
+update `creature_template` set equipment_id = 0;
+
+alter table `item_template`
+ add column `ScalingStatDistribution` smallint(6) DEFAULT '0' NOT NULL after `stat_value10`,
+ add column `ScalingStatValue` smallint(6) DEFAULT '0' NOT NULL after `ScalingStatDistribution`,
+ add column `ItemLimitCategory` smallint(6) DEFAULT '0' NOT NULL after `ArmorDamageModifier`,
+ change `Duration` `Duration` int(11) NOT NULL default '0' COMMENT 'Duration in seconds. Negative value means realtime, postive value ingame time' after ArmorDamageModifier,
+ add column `StatsCount` tinyint(3) UNSIGNED DEFAULT '0' NOT NULL after `ContainerSlots`,
+ CHANGE COLUMN `TotemCategory` `TotemCategory` mediumint(9) NOT NULL default '0';
+
+
+alter table `quest_template`
+ add column `PlayersSlain` tinyint(3) UNSIGNED DEFAULT '0' NOT NULL after `CharTitleId`,
+ add column `BonusTalents` tinyint(3) UNSIGNED DEFAULT '0' NOT NULL after `PlayersSlain`,
+ CHANGE `RewHonorableKills` `RewHonorableKills` int unsigned NOT NULL default '0';
+
+DROP TABLE IF EXISTS `milling_loot_template`;
+CREATE TABLE `milling_loot_template` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `item` mediumint(8) unsigned NOT NULL default '0',
+ `ChanceOrQuestChance` float NOT NULL default '100',
+ `groupid` tinyint(3) unsigned NOT NULL default '0',
+ `mincountOrRef` mediumint(9) NOT NULL default '1',
+ `maxcount` tinyint(3) unsigned NOT NULL default '1',
+ `lootcondition` tinyint(3) unsigned NOT NULL default '0',
+ `condition_value1` mediumint(8) unsigned NOT NULL default '0',
+ `condition_value2` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`,`item`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System';
+
+DROP TABLE IF EXISTS `spell_affect`;
+CREATE TABLE `spell_affect` (
+ `entry` smallint(5) unsigned NOT NULL default '0',
+ `effectId` tinyint(3) unsigned NOT NULL default '0',
+ `SpellClassMask0` int(5) unsigned NOT NULL default '0',
+ `SpellClassMask1` int(5) unsigned NOT NULL default '0',
+ `SpellClassMask2` int(5) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`,`effectId`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+DELETE FROM trinity_string WHERE entry in (345,346);
+INSERT INTO `trinity_string` VALUES
+(345,'Forced customize for player %s will be requested at next login.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(346,'Forced customize for player %s (GUID #%u) will be requested at next login.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
+
+DELETE FROM trinity_string WHERE entry in (712,717,718,719);
+INSERT INTO trinity_string VALUES
+(712,'|cffff0000[BG Queue Announcer]:|r %s -- [%u-%u] A: %u/%u, H: %u/%u|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(717,'|cffff0000[BG Queue Announcer]:|r %s -- [%u-%u] Started!|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(718,'|cffff0000[Arena Queue Announcer]:|r %s -- Joined : %ux%u : %u|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(719,'|cffff0000[Arena Queue Announcer]:|r %s -- Exited : %ux%u : %u|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
+
+DELETE FROM trinity_string WHERE entry in (720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736);
+INSERT INTO trinity_string VALUES
+(720,'Your group is too large for this battleground. Please regroup to join.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(721,'Your group is too large for this arena. Please regroup to join.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(722,'Your group has members not in your arena team. Please regroup to join.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(723,'Your group does not have enough players to join this match.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(724,'The Gold Team wins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(725,'The Green Team wins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(726,'There aren\'t enough players in this battleground. It will end soon unless some more players join to balance the fight.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(727,'Your group has an offline member. Please remove him before joining.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(728,'Your group has players from the opposing faction. You can\'t join the battleground as a group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(729,'Your group has players from different battleground brakets. You can\'t join as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(730,'Someone in your party is already in this battleground queue. (S)he must leave it before joining as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(731,'Someone in your party is Deserter. You can\'t join as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(732,'Someone in your party is already in three battleground queues. You cannot join as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(733,'You cannot teleport to a battleground or arena map.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(734,'You cannot summon players to a battleground or arena map.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(735,'You must be in GM mode to teleport to a player in a battleground.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(736,'You cannot teleport to a battleground from another battleground. Please leave the current battleground first.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
+
+DELETE FROM trinity_string WHERE entry in (1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138);
+
+
+DELETE FROM `player_classlevelstats` WHERE class = 6 OR level > 70;
+INSERT INTO `player_classlevelstats` VALUES
+(1,71,4720,0),
+(1,72,5013,0),
+(1,73,5325,0),
+(1,74,5656,0),
+(1,75,6008,0),
+(1,76,6381,0),
+(1,77,6778,0),
+(1,78,7198,0),
+(1,79,7646,0),
+(1,80,8121,0),
+
+(2,71,3629,3097),
+(2,72,3900,3241),
+(2,73,4191,3385),
+(2,74,4503,3529),
+(2,75,4839,3673),
+(2,76,5200,3817),
+(2,77,5588,3962),
+(2,78,6005,4106),
+(2,79,6453,4250),
+(2,80,6934,4394),
+
+(3,71,3834,3549),
+(3,72,4120,3716),
+(3,73,4427,3882),
+(3,74,4757,4048),
+(3,75,5112,4215),
+(3,76,5493,4381),
+(3,77,5903,4547),
+(3,78,6343,4713),
+(3,79,6816,4880),
+(3,80,7324,5046),
+
+(4,71,3980,0),
+(4,72,4277,0),
+(4,73,4596,0),
+(4,74,4939,0),
+(4,75,5307,0),
+(4,76,5703,0),
+(4,77,6128,0),
+(4,78,6585,0),
+(4,79,7076,0),
+(4,80,7604,0),
+
+(5,71,3644,2744),
+(5,72,3916,2868),
+(5,73,4208,2993),
+(5,74,4522,3117),
+(5,75,4859,3242),
+(5,76,5221,3366),
+(5,77,5610,3490),
+(5,78,6028,3615),
+(5,79,6477,3739),
+(5,80,6960,3863),
+
+(6,1,22,0),
+(6,2,27,0),
+(6,3,32,0),
+(6,4,37,0),
+(6,5,42,0),
+(6,6,47,0),
+(6,7,52,0),
+(6,8,58,0),
+(6,9,64,0),
+(6,10,70,0),
+(6,11,77,0),
+(6,12,84,0),
+(6,13,92,0),
+(6,14,100,0),
+(6,15,117,0),
+(6,16,127,0),
+(6,17,138,0),
+(6,18,150,0),
+(6,19,163,0),
+(6,20,177,0),
+(6,21,192,0),
+(6,22,208,0),
+(6,23,225,0),
+(6,24,239,0),
+(6,25,258,0),
+(6,26,278,0),
+(6,27,299,0),
+(6,28,321,0),
+(6,29,344,0),
+(6,30,368,0),
+(6,31,393,0),
+(6,32,419,0),
+(6,33,446,0),
+(6,34,474,0),
+(6,35,503,0),
+(6,36,533,0),
+(6,37,564,0),
+(6,38,596,0),
+(6,39,629,0),
+(6,40,698,0),
+(6,41,698,0),
+(6,42,734,0),
+(6,43,771,0),
+(6,44,809,0),
+(6,45,849,0),
+(6,46,891,0),
+(6,47,935,0),
+(6,48,981,0),
+(6,49,1029,0),
+(6,50,1079,0),
+(6,51,1131,0),
+(6,52,1185,0),
+(6,53,1241,0),
+(6,54,1299,0),
+(6,55,1359,0),
+(6,56,1421,0),
+(6,57,1485,0),
+(6,58,1551,0),
+(6,59,1619,0),
+(6,60,1689,0),
+(6,61,1902,0),
+(6,62,2129,0),
+(6,63,2357,0),
+(6,64,2612,0),
+(6,65,2883,0),
+(6,66,3169,0),
+(6,67,3455,0),
+(6,68,3774,0),
+(6,69,4109,0),
+(6,70,4444,0),
+(6,71,4720,0),
+(6,72,5013,0),
+(6,73,5325,0),
+(6,74,5656,0),
+(6,75,6008,0),
+(6,76,6381,0),
+(6,77,6778,0),
+(6,78,7199,0),
+(6,79,7646,0),
+(6,80,8121,0),
+
+(7,71,3395,3102),
+(7,72,3648,3246),
+(7,73,3920,3389),
+(7,74,4212,3533),
+(7,75,4526,3677),
+(7,76,4863,3821),
+(7,77,5226,3965),
+(7,78,5616,4108),
+(7,79,6035,4252),
+(7,80,6485,4396),
+
+(8,71,3646,2343),
+(8,72,3918,2446),
+(8,73,4210,2549),
+(8,74,4524,2652),
+(8,75,4861,2754),
+(8,76,5223,2857),
+(8,77,5612,2960),
+(8,78,6030,3063),
+(8,79,6480,3165),
+(8,80,6963,3268),
+
+(9,71,3750,2739),
+(9,72,4025,2863),
+(9,73,4330,2987),
+(9,74,4646,3111),
+(9,75,4997,3235),
+(9,76,5373,3360),
+(9,77,5774,3483),
+(9,78,6207,3608),
+(9,79,6667,3732),
+(9,80,7136,3856),
+
+(11,71,3883,2482),
+(11,72,4172,2595),
+(11,73,4483,2708),
+(11,74,4817,2820),
+(11,75,5176,2933),
+(11,76,5562,3045),
+(11,77,5977,3158),
+(11,78,6423,3270),
+(11,79,6902,3383),
+(11,80,7417,3496);
+
+DELETE FROM `player_levelstats`;
+INSERT INTO `player_levelstats` VALUES
+(1,1,1,23,20,22,20,20),
+(1,1,2,24,21,23,20,20),
+(1,1,3,26,22,24,20,21),
+(1,1,4,27,22,26,20,21),
+(1,1,5,28,23,27,20,21),
+(1,1,6,30,24,28,20,21),
+(1,1,7,31,25,29,21,22),
+(1,1,8,32,26,30,21,22),
+(1,1,9,34,26,32,21,22),
+(1,1,10,35,27,33,21,23),
+(1,1,11,36,28,34,21,23),
+(1,1,12,38,29,35,21,23),
+(1,1,13,39,30,37,21,24),
+(1,1,14,41,31,38,21,24),
+(1,1,15,42,32,39,21,24),
+(1,1,16,44,33,41,21,25),
+(1,1,17,45,34,42,22,25),
+(1,1,18,47,34,43,22,25),
+(1,1,19,48,35,45,22,26),
+(1,1,20,50,36,46,22,26),
+(1,1,21,51,37,48,22,26),
+(1,1,22,53,38,49,22,27),
+(1,1,23,54,39,51,22,27),
+(1,1,24,56,40,52,23,28),
+(1,1,25,58,41,53,23,28),
+(1,1,26,59,42,55,23,28),
+(1,1,27,61,43,56,23,29),
+(1,1,28,63,44,58,23,29),
+(1,1,29,64,45,59,23,30),
+(1,1,30,66,46,61,24,30),
+(1,1,31,68,47,62,24,30),
+(1,1,32,69,48,64,24,31),
+(1,1,33,71,50,66,24,31),
+(1,1,34,73,51,67,24,32),
+(1,1,35,74,52,69,24,32),
+(1,1,36,76,53,70,25,33),
+(1,1,37,78,54,72,25,33),
+(1,1,38,80,55,74,25,34),
+(1,1,39,82,56,75,25,34),
+(1,1,40,83,57,77,25,35),
+(1,1,41,85,58,79,26,35),
+(1,1,42,87,60,80,26,35),
+(1,1,43,89,61,82,26,36),
+(1,1,44,91,62,84,26,36),
+(1,1,45,93,63,85,26,37),
+(1,1,46,95,64,87,27,37),
+(1,1,47,97,66,89,27,38),
+(1,1,48,99,67,91,27,38),
+(1,1,49,101,68,93,27,39),
+(1,1,50,103,69,94,28,40),
+(1,1,51,105,71,96,28,40),
+(1,1,52,107,72,98,28,41),
+(1,1,53,109,73,100,28,41),
+(1,1,54,111,74,102,29,42),
+(1,1,55,113,76,103,29,42),
+(1,1,56,115,77,105,29,43),
+(1,1,57,117,78,107,29,43),
+(1,1,58,119,79,109,30,44),
+(1,1,59,121,81,111,30,44),
+(1,1,60,123,82,113,30,45),
+(1,1,61,125,83,115,30,46),
+(1,1,62,127,85,117,31,46),
+(1,1,63,129,86,119,31,47),
+(1,1,64,132,88,121,31,47),
+(1,1,65,134,89,123,32,48),
+(1,1,66,136,90,125,32,49),
+(1,1,67,138,92,127,32,49),
+(1,1,68,140,93,129,32,50),
+(1,1,69,143,95,131,33,50),
+(1,1,70,145,96,133,33,51),
+(1,1,71,148,97,140,33,53),
+(1,1,72,156,99,143,33,54),
+(1,1,73,162,101,148,33,55),
+(1,1,74,162,102,148,34,55),
+(1,1,75,165,104,150,34,56),
+(1,1,76,171,106,156,34,57),
+(1,1,77,171,108,157,35,58),
+(1,1,78,174,109,159,35,58),
+(1,1,79,181,111,165,35,59),
+(1,1,80,184,113,168,36,60),
+
+(1,2,1,22,20,22,20,21),
+(1,2,2,23,21,23,21,22),
+(1,2,3,24,21,24,21,22),
+(1,2,4,25,22,25,22,23),
+(1,2,5,26,22,26,23,24),
+(1,2,6,28,23,27,23,25),
+(1,2,7,29,24,28,24,25),
+(1,2,8,30,24,29,25,26),
+(1,2,9,31,25,30,25,27),
+(1,2,10,32,25,32,26,27),
+(1,2,11,33,26,33,27,28),
+(1,2,12,35,27,34,27,29),
+(1,2,13,36,27,35,28,30),
+(1,2,14,37,28,36,29,31),
+(1,2,15,38,29,37,30,31),
+(1,2,16,40,29,38,30,32),
+(1,2,17,41,30,40,31,33),
+(1,2,18,42,31,41,32,34),
+(1,2,19,43,31,42,33,35),
+(1,2,20,45,32,43,33,35),
+(1,2,21,46,33,45,34,36),
+(1,2,22,47,33,46,35,37),
+(1,2,23,49,34,47,36,38),
+(1,2,24,50,35,48,37,39),
+(1,2,25,51,36,50,37,40),
+(1,2,26,53,36,51,38,41),
+(1,2,27,54,37,52,39,42),
+(1,2,28,56,38,54,40,43),
+(1,2,29,57,39,55,41,43),
+(1,2,30,58,39,56,42,44),
+(1,2,31,60,40,58,43,45),
+(1,2,32,61,41,59,43,46),
+(1,2,33,63,42,60,44,47),
+(1,2,34,64,43,62,45,48),
+(1,2,35,66,44,63,46,49),
+(1,2,36,67,44,65,47,50),
+(1,2,37,69,45,66,48,51),
+(1,2,38,70,46,67,49,52),
+(1,2,39,72,47,69,50,53),
+(1,2,40,73,48,70,51,54),
+(1,2,41,75,49,72,52,55),
+(1,2,42,77,49,73,53,56),
+(1,2,43,78,50,75,54,57),
+(1,2,44,80,51,76,55,58),
+(1,2,45,81,52,78,56,59),
+(1,2,46,83,53,79,57,61),
+(1,2,47,85,54,81,58,62),
+(1,2,48,86,55,83,59,63),
+(1,2,49,88,56,84,60,64),
+(1,2,50,90,57,86,61,65),
+(1,2,51,91,58,87,62,66),
+(1,2,52,93,59,89,63,67),
+(1,2,53,95,60,91,64,68),
+(1,2,54,97,61,92,65,69),
+(1,2,55,98,61,94,66,71),
+(1,2,56,100,62,95,67,72),
+(1,2,57,102,63,97,68,73),
+(1,2,58,104,64,99,69,74),
+(1,2,59,105,65,101,70,75),
+(1,2,60,107,66,102,71,77),
+(1,2,61,109,67,104,73,78),
+(1,2,62,111,69,106,74,79),
+(1,2,63,113,70,107,75,80),
+(1,2,64,115,71,109,76,81),
+(1,2,65,116,72,111,77,83),
+(1,2,66,118,73,113,78,84),
+(1,2,67,120,74,115,79,85),
+(1,2,68,122,75,116,81,86),
+(1,2,69,124,76,118,82,88),
+(1,2,70,126,77,120,83,89),
+(1,2,71,148,78,122,84,92),
+(1,2,72,150,79,125,86,94),
+(1,2,73,152,80,127,87,96),
+(1,2,74,156,82,129,89,97),
+(1,2,75,158,83,131,90,99),
+(1,2,76,162,84,134,92,100),
+(1,2,77,164,86,136,93,103),
+(1,2,78,167,87,138,95,105),
+(1,2,79,170,88,153,96,106),
+(1,2,80,173,90,160,98,108),
+
+(1,4,1,21,23,21,20,20),
+(1,4,2,22,24,22,20,20),
+(1,4,3,23,26,22,20,21),
+(1,4,4,23,27,23,20,21),
+(1,4,5,24,29,24,21,21),
+(1,4,6,25,30,25,21,22),
+(1,4,7,26,32,25,21,22),
+(1,4,8,26,33,26,21,23),
+(1,4,9,27,35,27,21,23),
+(1,4,10,28,36,27,21,23),
+(1,4,11,29,38,28,22,24),
+(1,4,12,30,39,29,22,24),
+(1,4,13,31,41,30,22,25),
+(1,4,14,31,43,31,22,25),
+(1,4,15,32,44,31,22,25),
+(1,4,16,33,46,32,23,26),
+(1,4,17,34,48,33,23,26),
+(1,4,18,35,49,34,23,27),
+(1,4,19,36,51,35,23,27),
+(1,4,20,37,53,35,23,28),
+(1,4,21,38,54,36,24,28),
+(1,4,22,39,56,37,24,29),
+(1,4,23,40,58,38,24,29),
+(1,4,24,41,60,39,24,30),
+(1,4,25,42,61,40,25,30),
+(1,4,26,43,63,41,25,31),
+(1,4,27,44,65,42,25,31),
+(1,4,28,45,67,43,25,32),
+(1,4,29,46,69,43,25,32),
+(1,4,30,47,71,44,26,33),
+(1,4,31,48,72,45,26,33),
+(1,4,32,49,74,46,26,34),
+(1,4,33,50,76,47,27,34),
+(1,4,34,51,78,48,27,35),
+(1,4,35,52,80,49,27,35),
+(1,4,36,53,82,50,27,36),
+(1,4,37,54,84,51,28,36),
+(1,4,38,55,86,52,28,37),
+(1,4,39,56,88,53,28,38),
+(1,4,40,57,90,54,28,38),
+(1,4,41,58,92,55,29,39),
+(1,4,42,60,94,56,29,39),
+(1,4,43,61,96,57,29,40),
+(1,4,44,62,98,58,30,40),
+(1,4,45,63,100,59,30,41),
+(1,4,46,64,103,61,30,42),
+(1,4,47,65,105,62,31,42),
+(1,4,48,66,107,63,31,43),
+(1,4,49,68,109,64,31,44),
+(1,4,50,69,111,65,32,44),
+(1,4,51,70,113,66,32,45),
+(1,4,52,71,116,67,32,45),
+(1,4,53,73,118,68,33,46),
+(1,4,54,74,120,69,33,47),
+(1,4,55,75,122,71,33,47),
+(1,4,56,76,125,72,34,48),
+(1,4,57,78,127,73,34,49),
+(1,4,58,79,129,74,34,49),
+(1,4,59,80,131,75,35,50),
+(1,4,60,81,134,77,35,51),
+(1,4,61,83,136,78,35,51),
+(1,4,62,84,138,79,36,52),
+(1,4,63,85,141,80,36,53),
+(1,4,64,87,143,81,37,54),
+(1,4,65,88,146,83,37,54),
+(1,4,66,89,148,84,37,55),
+(1,4,67,91,151,85,38,56),
+(1,4,68,92,153,86,38,57),
+(1,4,69,94,156,88,39,57),
+(1,4,70,95,158,89,39,58),
+(1,4,71,97,161,90,39,60),
+(1,4,72,99,164,92,40,60),
+(1,4,73,100,167,94,40,61),
+(1,4,74,102,170,95,41,62),
+(1,4,75,104,173,97,41,63),
+(1,4,76,105,176,98,41,64),
+(1,4,77,107,179,100,42,65),
+(1,4,78,109,183,106,42,66),
+(1,4,79,111,186,107,43,67),
+(1,4,80,113,189,109,43,69),
+
+(1,5,1,20,20,20,22,23),
+(1,5,2,20,20,20,23,24),
+(1,5,3,20,20,21,25,26),
+(1,5,4,20,21,21,26,27),
+(1,5,5,21,21,21,27,28),
+(1,5,6,21,21,22,29,30),
+(1,5,7,21,21,22,30,31),
+(1,5,8,21,22,23,31,33),
+(1,5,9,21,22,23,33,34),
+(1,5,10,21,22,23,34,36),
+(1,5,11,22,22,24,36,37),
+(1,5,12,22,23,24,37,39),
+(1,5,13,22,23,25,38,40),
+(1,5,14,22,23,25,40,42),
+(1,5,15,22,23,25,41,43),
+(1,5,16,23,24,26,43,45),
+(1,5,17,23,24,26,44,46),
+(1,5,18,23,24,27,46,48),
+(1,5,19,23,24,27,47,49),
+(1,5,20,23,25,28,49,51),
+(1,5,21,24,25,28,51,53),
+(1,5,22,24,25,29,52,54),
+(1,5,23,24,26,29,54,56),
+(1,5,24,24,26,30,55,58),
+(1,5,25,25,26,30,57,59),
+(1,5,26,25,27,31,59,61),
+(1,5,27,25,27,31,60,63),
+(1,5,28,25,27,32,62,65),
+(1,5,29,25,28,32,64,66),
+(1,5,30,26,28,33,65,68),
+(1,5,31,26,28,33,67,70),
+(1,5,32,26,29,34,69,72),
+(1,5,33,27,29,34,70,73),
+(1,5,34,27,29,35,72,75),
+(1,5,35,27,30,35,74,77),
+(1,5,36,27,30,36,76,79),
+(1,5,37,28,30,36,78,81),
+(1,5,38,28,31,37,79,83),
+(1,5,39,28,31,38,81,85),
+(1,5,40,28,31,38,83,87),
+(1,5,41,29,32,39,85,88),
+(1,5,42,29,32,39,87,90),
+(1,5,43,29,33,40,89,92),
+(1,5,44,30,33,40,91,94),
+(1,5,45,30,33,41,92,96),
+(1,5,46,30,34,42,94,98),
+(1,5,47,31,34,42,96,100),
+(1,5,48,31,35,43,98,102),
+(1,5,49,31,35,44,100,104),
+(1,5,50,32,36,44,102,106),
+(1,5,51,32,36,45,104,109),
+(1,5,52,32,36,45,106,111),
+(1,5,53,33,37,46,108,113),
+(1,5,54,33,37,47,110,115),
+(1,5,55,33,38,47,112,117),
+(1,5,56,34,38,48,114,119),
+(1,5,57,34,39,49,117,121),
+(1,5,58,34,39,49,119,124),
+(1,5,59,35,40,50,121,126),
+(1,5,60,35,40,51,123,128),
+(1,5,61,35,41,51,125,130),
+(1,5,62,36,41,52,127,132),
+(1,5,63,36,41,53,129,135),
+(1,5,64,37,42,54,132,137),
+(1,5,65,37,42,54,134,139),
+(1,5,66,37,43,55,136,142),
+(1,5,67,38,43,56,138,144),
+(1,5,68,38,44,57,140,146),
+(1,5,69,39,44,57,143,149),
+(1,5,70,39,45,58,145,151),
+(1,5,71,39,46,59,148,158),
+(1,5,72,40,46,59,151,161),
+(1,5,73,40,47,60,154,164),
+(1,5,74,41,47,61,156,167),
+(1,5,75,41,48,62,159,170),
+(1,5,76,41,49,63,162,174),
+(1,5,77,42,49,64,165,177),
+(1,5,78,42,50,65,168,180),
+(1,5,79,43,50,66,171,183),
+(1,5,80,43,51,67,174,186),
+
+(1,6,1,23,20,22,20,20),
+(1,6,2,24,21,23,20,20),
+(1,6,3,26,22,24,20,21),
+(1,6,4,27,22,26,20,21),
+(1,6,5,28,23,27,20,21),
+(1,6,6,30,24,28,20,21),
+(1,6,7,31,25,29,21,22),
+(1,6,8,32,26,30,21,22),
+(1,6,9,34,26,32,21,22),
+(1,6,10,35,27,33,21,23),
+(1,6,11,36,28,34,21,23),
+(1,6,12,38,29,35,21,23),
+(1,6,13,39,30,37,21,24),
+(1,6,14,41,31,38,21,24),
+(1,6,15,42,32,39,21,24),
+(1,6,16,44,33,41,21,25),
+(1,6,17,45,34,42,22,25),
+(1,6,18,47,34,43,22,25),
+(1,6,19,48,35,45,22,26),
+(1,6,20,50,36,46,22,26),
+(1,6,21,51,37,48,22,26),
+(1,6,22,53,38,49,22,27),
+(1,6,23,54,39,51,22,27),
+(1,6,24,56,40,52,23,28),
+(1,6,25,58,41,53,23,28),
+(1,6,26,59,42,55,23,28),
+(1,6,27,61,43,56,23,29),
+(1,6,28,63,44,58,23,29),
+(1,6,29,64,45,59,23,30),
+(1,6,30,66,46,61,24,30),
+(1,6,31,68,47,62,24,30),
+(1,6,32,69,48,64,24,31),
+(1,6,33,71,50,66,24,31),
+(1,6,34,73,51,67,24,32),
+(1,6,35,74,52,69,24,32),
+(1,6,36,76,53,70,25,33),
+(1,6,37,78,54,72,25,33),
+(1,6,38,80,55,74,25,34),
+(1,6,39,82,56,75,25,34),
+(1,6,40,83,57,77,25,35),
+(1,6,41,85,58,79,26,35),
+(1,6,42,87,60,80,26,35),
+(1,6,43,89,61,82,26,36),
+(1,6,44,91,62,84,26,36),
+(1,6,45,93,63,85,26,37),
+(1,6,46,95,64,87,27,37),
+(1,6,47,97,66,89,27,38),
+(1,6,48,99,67,91,27,38),
+(1,6,49,101,68,93,27,39),
+(1,6,50,103,69,94,28,40),
+(1,6,51,105,71,96,28,40),
+(1,6,52,106,72,97,28,41),
+(1,6,53,107,72,98,28,41),
+(1,6,54,107,73,98,29,42),
+(1,6,55,108,73,99,29,43),
+(1,6,56,111,75,102,29,44),
+(1,6,57,113,76,104,29,44),
+(1,6,58,118,77,106,30,45),
+(1,6,59,118,79,108,30,45),
+(1,6,60,123,80,110,30,46),
+(1,6,61,125,81,112,30,47),
+(1,6,62,128,83,114,30,47),
+(1,6,63,130,84,117,31,48),
+(1,6,64,130,86,119,31,48),
+(1,6,65,140,87,128,31,49),
+(1,6,66,143,89,131,31,50),
+(1,6,67,146,90,133,32,50),
+(1,6,68,148,92,135,32,51),
+(1,6,69,151,93,138,32,52),
+(1,6,70,154,95,140,32,52),
+(1,6,71,162,97,144,33,53),
+(1,6,72,164,98,146,33,54),
+(1,6,73,165,100,148,33,55),
+(1,6,74,166,102,151,33,55),
+(1,6,75,169,103,154,34,56),
+(1,6,76,172,105,157,34,57),
+(1,6,77,175,107,157,34,58),
+(1,6,78,176,108,157,34,58),
+(1,6,79,177,110,157,35,59),
+(1,6,80,180,112,160,35,60),
+
+(1,8,1,20,20,20,23,22),
+(1,8,2,20,20,20,24,23),
+(1,8,3,20,20,21,26,25),
+(1,8,4,20,20,21,27,26),
+(1,8,5,20,21,21,28,27),
+(1,8,6,20,21,21,30,29),
+(1,8,7,21,21,22,31,30),
+(1,8,8,21,21,22,33,31),
+(1,8,9,21,21,22,34,33),
+(1,8,10,21,21,23,36,34),
+(1,8,11,21,22,23,37,36),
+(1,8,12,21,22,23,39,37),
+(1,8,13,21,22,24,40,38),
+(1,8,14,21,22,24,42,40),
+(1,8,15,21,22,24,43,41),
+(1,8,16,21,23,25,45,43),
+(1,8,17,22,23,25,46,44),
+(1,8,18,22,23,25,48,46),
+(1,8,19,22,23,26,49,47),
+(1,8,20,22,23,26,51,49),
+(1,8,21,22,24,26,53,51),
+(1,8,22,22,24,27,54,52),
+(1,8,23,22,24,27,56,54),
+(1,8,24,23,24,28,58,55),
+(1,8,25,23,25,28,59,57),
+(1,8,26,23,25,28,61,59),
+(1,8,27,23,25,29,63,60),
+(1,8,28,23,25,29,65,62),
+(1,8,29,23,25,30,66,64),
+(1,8,30,24,26,30,68,65),
+(1,8,31,24,26,30,70,67),
+(1,8,32,24,26,31,72,69),
+(1,8,33,24,27,31,73,70),
+(1,8,34,24,27,32,75,72),
+(1,8,35,24,27,32,77,74),
+(1,8,36,25,27,33,79,76),
+(1,8,37,25,28,33,81,78),
+(1,8,38,25,28,34,83,79),
+(1,8,39,25,28,34,85,81),
+(1,8,40,25,28,35,87,83),
+(1,8,41,26,29,35,88,85),
+(1,8,42,26,29,35,90,87),
+(1,8,43,26,29,36,92,89),
+(1,8,44,26,30,36,94,91),
+(1,8,45,26,30,37,96,92),
+(1,8,46,27,30,37,98,94),
+(1,8,47,27,31,38,100,96),
+(1,8,48,27,31,38,102,98),
+(1,8,49,27,31,39,104,100),
+(1,8,50,28,32,40,106,102),
+(1,8,51,28,32,40,109,104),
+(1,8,52,28,32,41,111,106),
+(1,8,53,28,33,41,113,108),
+(1,8,54,29,33,42,115,110),
+(1,8,55,29,33,42,117,112),
+(1,8,56,29,34,43,119,114),
+(1,8,57,29,34,43,121,117),
+(1,8,58,30,34,44,124,119),
+(1,8,59,30,35,44,126,121),
+(1,8,60,30,35,45,128,123),
+(1,8,61,30,35,46,130,125),
+(1,8,62,31,36,46,132,127),
+(1,8,63,31,36,47,135,129),
+(1,8,64,31,37,47,137,132),
+(1,8,65,32,37,48,139,134),
+(1,8,66,32,37,49,142,136),
+(1,8,67,32,38,49,144,138),
+(1,8,68,32,38,50,146,140),
+(1,8,69,33,39,50,149,143),
+(1,8,70,33,39,51,151,145),
+(1,8,71,33,39,52,154,152),
+(1,8,72,33,40,53,160,155),
+(1,8,73,33,40,54,160,158),
+(1,8,74,34,41,54,163,160),
+(1,8,75,34,41,55,166,163),
+(1,8,76,34,41,56,169,166),
+(1,8,77,35,42,57,172,169),
+(1,8,78,35,42,57,175,173),
+(1,8,79,35,43,58,178,176),
+(1,8,80,36,43,59,181,179),
+
+(1,9,1,20,20,21,22,22),
+(1,9,2,20,20,22,23,23),
+(1,9,3,21,21,22,24,24),
+(1,9,4,21,21,23,26,25),
+(1,9,5,21,21,23,27,27),
+(1,9,6,21,22,24,28,28),
+(1,9,7,22,22,24,29,29),
+(1,9,8,22,23,25,30,30),
+(1,9,9,22,23,26,32,31),
+(1,9,10,23,23,26,33,33),
+(1,9,11,23,24,27,34,34),
+(1,9,12,23,24,27,35,35),
+(1,9,13,24,25,28,37,36),
+(1,9,14,24,25,29,38,38),
+(1,9,15,24,25,29,39,39),
+(1,9,16,25,26,30,41,40),
+(1,9,17,25,26,31,42,42),
+(1,9,18,25,27,31,43,43),
+(1,9,19,26,27,32,45,44),
+(1,9,20,26,28,33,46,46),
+(1,9,21,26,28,33,48,47),
+(1,9,22,27,29,34,49,49),
+(1,9,23,27,29,35,51,50),
+(1,9,24,28,30,35,52,51),
+(1,9,25,28,30,36,53,53),
+(1,9,26,28,31,37,55,54),
+(1,9,27,29,31,37,56,56),
+(1,9,28,29,32,38,58,57),
+(1,9,29,30,32,39,59,59),
+(1,9,30,30,33,40,61,60),
+(1,9,31,30,33,40,62,62),
+(1,9,32,31,34,41,64,63),
+(1,9,33,31,34,42,66,65),
+(1,9,34,32,35,43,67,66),
+(1,9,35,32,35,44,69,68),
+(1,9,36,33,36,44,70,69),
+(1,9,37,33,36,45,72,71),
+(1,9,38,34,37,46,74,73),
+(1,9,39,34,38,47,75,74),
+(1,9,40,35,38,48,77,76),
+(1,9,41,35,39,48,79,78),
+(1,9,42,35,39,49,80,79),
+(1,9,43,36,40,50,82,81),
+(1,9,44,36,40,51,84,83),
+(1,9,45,37,41,52,85,84),
+(1,9,46,37,42,53,87,86),
+(1,9,47,38,42,54,89,88),
+(1,9,48,38,43,55,91,89),
+(1,9,49,39,44,55,93,91),
+(1,9,50,40,44,56,94,93),
+(1,9,51,40,45,57,96,95),
+(1,9,52,41,45,58,98,97),
+(1,9,53,41,46,59,100,98),
+(1,9,54,42,47,60,102,100),
+(1,9,55,42,47,61,103,102),
+(1,9,56,43,48,62,105,104),
+(1,9,57,43,49,63,107,106),
+(1,9,58,44,49,64,109,108),
+(1,9,59,44,50,65,111,109),
+(1,9,60,45,51,66,113,111),
+(1,9,61,46,51,67,115,113),
+(1,9,62,46,52,68,117,115),
+(1,9,63,47,53,69,119,117),
+(1,9,64,47,54,70,121,119),
+(1,9,65,48,54,71,123,121),
+(1,9,66,49,55,72,125,123),
+(1,9,67,49,56,73,127,125),
+(1,9,68,50,57,74,129,127),
+(1,9,69,50,57,75,131,129),
+(1,9,70,51,58,76,133,131),
+(1,9,71,52,59,78,135,146),
+(1,9,72,53,59,79,138,148),
+(1,9,73,54,60,80,140,151),
+(1,9,74,54,61,89,143,154),
+(1,9,75,55,62,91,145,156),
+(1,9,76,56,63,92,148,159),
+(1,9,77,57,64,93,151,162),
+(1,9,78,57,65,95,153,165),
+(1,9,79,58,66,96,156,168),
+(1,9,80,59,67,97,159,170),
+
+(2,1,1,26,17,24,17,23),
+(2,1,2,27,18,25,17,23),
+(2,1,3,29,19,26,17,24),
+(2,1,4,30,19,27,17,24),
+(2,1,5,31,20,29,17,24),
+(2,1,6,32,21,30,17,24),
+(2,1,7,34,22,31,18,25),
+(2,1,8,35,23,32,18,25),
+(2,1,9,37,24,34,18,25),
+(2,1,10,38,24,35,18,26),
+(2,1,11,39,25,36,18,26),
+(2,1,12,41,26,37,18,26),
+(2,1,13,42,27,39,18,27),
+(2,1,14,44,28,40,18,27),
+(2,1,15,45,29,41,18,27),
+(2,1,16,47,30,43,19,28),
+(2,1,17,48,31,44,19,28),
+(2,1,18,50,32,45,19,28),
+(2,1,19,51,33,47,19,29),
+(2,1,20,53,34,48,19,29),
+(2,1,21,54,34,50,19,29),
+(2,1,22,56,35,51,19,30),
+(2,1,23,57,36,52,20,30),
+(2,1,24,59,37,54,20,30),
+(2,1,25,60,38,55,20,31),
+(2,1,26,62,39,57,20,31),
+(2,1,27,64,40,58,20,32),
+(2,1,28,65,41,60,20,32),
+(2,1,29,67,43,61,21,32),
+(2,1,30,69,44,63,21,33),
+(2,1,31,70,45,64,21,33),
+(2,1,32,72,46,66,21,34),
+(2,1,33,74,47,67,21,34),
+(2,1,34,76,48,69,21,35),
+(2,1,35,77,49,71,22,35),
+(2,1,36,79,50,72,22,36),
+(2,1,37,81,51,74,22,36),
+(2,1,38,83,52,76,22,36),
+(2,1,39,84,53,77,22,37),
+(2,1,40,86,55,79,23,37),
+(2,1,41,88,56,81,23,38),
+(2,1,42,90,57,82,23,38),
+(2,1,43,92,58,84,23,39),
+(2,1,44,94,59,86,23,39),
+(2,1,45,96,60,87,24,40),
+(2,1,46,98,62,89,24,40),
+(2,1,47,100,63,91,24,41),
+(2,1,48,101,64,93,24,41),
+(2,1,49,103,65,94,25,42),
+(2,1,50,105,66,96,25,42),
+(2,1,51,107,68,98,25,43),
+(2,1,52,109,69,100,25,43),
+(2,1,53,111,70,102,25,44),
+(2,1,54,113,71,104,26,45),
+(2,1,55,115,73,105,26,45),
+(2,1,56,118,74,107,26,46),
+(2,1,57,120,75,109,26,46),
+(2,1,58,122,77,111,27,47),
+(2,1,59,124,78,113,27,47),
+(2,1,60,126,79,115,27,48),
+(2,1,61,128,81,117,27,48),
+(2,1,62,130,82,119,28,49),
+(2,1,63,132,83,121,28,50),
+(2,1,64,135,85,123,28,50),
+(2,1,65,137,86,125,29,51),
+(2,1,66,139,87,127,29,52),
+(2,1,67,141,89,129,29,52),
+(2,1,68,143,90,131,29,53),
+(2,1,69,146,92,133,30,53),
+(2,1,70,148,93,135,30,54),
+(2,1,71,157,94,142,30,55),
+(2,1,72,162,96,148,30,56),
+(2,1,73,165,98,150,30,57),
+(2,1,74,168,99,153,31,57),
+(2,1,75,170,101,154,31,58),
+(2,1,76,172,103,156,31,59),
+(2,1,77,174,105,159,32,60),
+(2,1,78,179,106,162,32,60),
+(2,1,79,184,108,167,32,61),
+(2,1,80,187,110,170,33,62),
+
+(2,3,1,23,20,23,17,24),
+(2,3,2,23,21,24,18,25),
+(2,3,3,24,23,25,18,25),
+(2,3,4,24,24,26,19,26),
+(2,3,5,25,25,27,19,26),
+(2,3,6,25,27,28,20,27),
+(2,3,7,26,28,28,21,28),
+(2,3,8,26,30,29,21,28),
+(2,3,9,26,31,30,22,29),
+(2,3,10,27,33,31,22,30),
+(2,3,11,27,34,32,23,30),
+(2,3,12,28,36,33,24,31),
+(2,3,13,28,37,34,24,32),
+(2,3,14,29,39,35,25,33),
+(2,3,15,29,40,36,26,33),
+(2,3,16,30,42,37,26,34),
+(2,3,17,30,43,39,27,35),
+(2,3,18,31,45,40,28,35),
+(2,3,19,31,47,41,28,36),
+(2,3,20,32,48,42,29,37),
+(2,3,21,32,50,43,30,38),
+(2,3,22,33,51,44,31,39),
+(2,3,23,34,53,45,31,39),
+(2,3,24,34,55,46,32,40),
+(2,3,25,35,57,47,33,41),
+(2,3,26,35,58,48,34,42),
+(2,3,27,36,60,50,34,43),
+(2,3,28,36,62,51,35,43),
+(2,3,29,37,63,52,36,44),
+(2,3,30,38,65,53,37,45),
+(2,3,31,38,67,54,37,46),
+(2,3,32,39,69,56,38,47),
+(2,3,33,39,71,57,39,48),
+(2,3,34,40,72,58,40,49),
+(2,3,35,41,74,59,41,49),
+(2,3,36,41,76,61,42,50),
+(2,3,37,42,78,62,42,51),
+(2,3,38,43,80,63,43,52),
+(2,3,39,43,82,64,44,53),
+(2,3,40,44,84,66,45,54),
+(2,3,41,45,86,67,46,55),
+(2,3,42,45,88,68,47,56),
+(2,3,43,46,90,70,47,57),
+(2,3,44,47,91,71,48,58),
+(2,3,45,47,93,72,49,59),
+(2,3,46,48,95,74,50,60),
+(2,3,47,49,98,75,51,61),
+(2,3,48,50,100,77,52,62),
+(2,3,49,50,102,78,53,63),
+(2,3,50,51,104,79,54,64),
+(2,3,51,52,106,81,55,65),
+(2,3,52,52,108,82,56,66),
+(2,3,53,53,110,84,57,67),
+(2,3,54,54,112,85,58,68),
+(2,3,55,55,114,87,59,69),
+(2,3,56,55,116,88,60,70),
+(2,3,57,56,118,90,61,71),
+(2,3,58,57,121,91,62,72),
+(2,3,59,58,123,93,63,73),
+(2,3,60,59,125,94,64,74),
+(2,3,61,59,127,96,65,76),
+(2,3,62,60,130,97,66,77),
+(2,3,63,61,132,99,67,78),
+(2,3,64,62,134,100,68,79),
+(2,3,65,63,136,102,69,80),
+(2,3,66,64,139,104,70,81),
+(2,3,67,64,141,105,71,82),
+(2,3,68,65,143,107,72,84),
+(2,3,69,66,146,108,73,85),
+(2,3,70,67,148,110,74,86),
+(2,3,71,68,151,112,75,87),
+(2,3,72,69,154,114,76,88),
+(2,3,73,70,157,116,77,90),
+(2,3,74,71,160,118,79,91),
+(2,3,75,72,163,120,80,93),
+(2,3,76,73,166,122,81,94),
+(2,3,77,74,169,124,83,96),
+(2,3,78,75,172,126,84,97),
+(2,3,79,76,175,128,85,99),
+(2,3,80,77,178,130,87,100),
+
+(2,4,1,24,20,23,17,23),
+(2,4,2,25,21,24,17,23),
+(2,4,3,25,23,24,17,24),
+(2,4,4,26,24,25,17,24),
+(2,4,5,27,26,26,18,24),
+(2,4,6,28,27,26,18,25),
+(2,4,7,29,29,27,18,25),
+(2,4,8,29,30,28,18,26),
+(2,4,9,30,32,29,18,26),
+(2,4,10,31,33,29,19,26),
+(2,4,11,32,35,30,19,27),
+(2,4,12,33,37,31,19,27),
+(2,4,13,34,38,32,19,28),
+(2,4,14,34,40,32,19,28),
+(2,4,15,35,41,33,19,28),
+(2,4,16,36,43,34,20,29),
+(2,4,17,37,45,35,20,29),
+(2,4,18,38,46,36,20,30),
+(2,4,19,39,48,37,20,30),
+(2,4,20,40,50,37,21,31),
+(2,4,21,41,52,38,21,31),
+(2,4,22,42,53,39,21,31),
+(2,4,23,43,55,40,21,32),
+(2,4,24,43,57,41,21,32),
+(2,4,25,44,59,42,22,33),
+(2,4,26,45,60,43,22,33),
+(2,4,27,46,62,44,22,34),
+(2,4,28,47,64,44,22,34),
+(2,4,29,48,66,45,23,35),
+(2,4,30,49,68,46,23,35),
+(2,4,31,50,70,47,23,36),
+(2,4,32,51,72,48,23,36),
+(2,4,33,53,73,49,24,37),
+(2,4,34,54,75,50,24,38),
+(2,4,35,55,77,51,24,38),
+(2,4,36,56,79,52,24,39),
+(2,4,37,57,81,53,25,39),
+(2,4,38,58,83,54,25,40),
+(2,4,39,59,85,55,25,40),
+(2,4,40,60,87,56,26,41),
+(2,4,41,61,89,57,26,41),
+(2,4,42,62,91,58,26,42),
+(2,4,43,63,93,59,27,43),
+(2,4,44,65,95,60,27,43),
+(2,4,45,66,98,61,27,44),
+(2,4,46,67,100,62,27,44),
+(2,4,47,68,102,64,28,45),
+(2,4,48,69,104,65,28,46),
+(2,4,49,71,106,66,28,46),
+(2,4,50,72,108,67,29,47),
+(2,4,51,73,110,68,29,48),
+(2,4,52,74,113,69,29,48),
+(2,4,53,75,115,70,30,49),
+(2,4,54,77,117,71,30,50),
+(2,4,55,78,119,73,30,50),
+(2,4,56,79,122,74,31,51),
+(2,4,57,80,124,75,31,52),
+(2,4,58,82,126,76,31,52),
+(2,4,59,83,129,77,32,53),
+(2,4,60,84,131,78,32,54),
+(2,4,61,86,133,80,33,54),
+(2,4,62,87,136,81,33,55),
+(2,4,63,88,138,82,33,56),
+(2,4,64,90,140,83,34,57),
+(2,4,65,91,143,85,34,57),
+(2,4,66,92,145,86,34,58),
+(2,4,67,94,148,87,35,59),
+(2,4,68,95,150,88,35,59),
+(2,4,69,97,153,90,36,60),
+(2,4,70,98,155,91,36,61),
+(2,4,71,100,158,92,36,62),
+(2,4,72,102,161,94,37,62),
+(2,4,73,103,164,99,37,63),
+(2,4,74,105,167,100,38,64),
+(2,4,75,107,170,102,38,65),
+(2,4,76,108,173,102,38,66),
+(2,4,77,110,176,102,39,67),
+(2,4,78,112,180,103,39,68),
+(2,4,79,114,183,105,40,69),
+(2,4,80,116,186,107,40,70),
+
+(2,6,1,26,17,24,17,23),
+(2,6,2,27,18,25,17,23),
+(2,6,3,29,19,26,17,24),
+(2,6,4,30,19,27,17,24),
+(2,6,5,31,20,29,17,24),
+(2,6,6,32,21,30,17,24),
+(2,6,7,34,22,31,18,25),
+(2,6,8,35,23,32,18,25),
+(2,6,9,37,24,34,18,25),
+(2,6,10,38,24,35,18,26),
+(2,6,11,39,25,36,18,26),
+(2,6,12,41,26,37,18,26),
+(2,6,13,42,27,39,18,27),
+(2,6,14,44,28,40,18,27),
+(2,6,15,45,29,41,18,27),
+(2,6,16,47,30,43,19,28),
+(2,6,17,48,31,44,19,28),
+(2,6,18,50,32,45,19,28),
+(2,6,19,51,33,47,19,29),
+(2,6,20,53,34,48,19,29),
+(2,6,21,54,34,50,19,29),
+(2,6,22,56,35,51,19,30),
+(2,6,23,57,36,52,20,30),
+(2,6,24,59,37,54,20,30),
+(2,6,25,60,38,55,20,31),
+(2,6,26,62,39,57,20,31),
+(2,6,27,64,40,58,20,32),
+(2,6,28,65,41,60,20,32),
+(2,6,29,67,43,61,21,32),
+(2,6,30,69,44,63,21,33),
+(2,6,31,70,45,64,21,33),
+(2,6,32,72,46,66,21,34),
+(2,6,33,74,47,67,21,34),
+(2,6,34,76,48,69,21,35),
+(2,6,35,77,49,71,22,35),
+(2,6,36,79,50,72,22,36),
+(2,6,37,81,51,74,22,36),
+(2,6,38,83,52,76,22,36),
+(2,6,39,84,53,77,22,37),
+(2,6,40,86,55,79,23,37),
+(2,6,41,88,56,81,23,38),
+(2,6,42,90,57,82,23,38),
+(2,6,43,92,58,84,23,39),
+(2,6,44,94,59,86,23,39),
+(2,6,45,96,60,87,24,40),
+(2,6,46,98,62,89,24,40),
+(2,6,47,100,63,91,24,41),
+(2,6,48,101,64,93,24,41),
+(2,6,49,103,65,94,25,42),
+(2,6,50,105,66,96,25,42),
+(2,6,51,107,68,98,25,43),
+(2,6,52,109,69,100,25,43),
+(2,6,53,110,69,100,25,44),
+(2,6,54,111,70,101,26,45),
+(2,6,55,111,70,101,26,45),
+(2,6,56,114,72,104,26,46),
+(2,6,57,116,73,106,26,46),
+(2,6,58,118,74,108,27,47),
+(2,6,59,124,76,110,27,47),
+(2,6,60,126,77,112,27,48),
+(2,6,61,128,78,114,27,49),
+(2,6,62,131,80,116,27,49),
+(2,6,63,133,81,119,28,50),
+(2,6,64,136,83,121,28,50),
+(2,6,65,136,84,123,28,51),
+(2,6,66,142,86,126,28,52),
+(2,6,67,145,87,128,29,52),
+(2,6,68,147,89,130,29,53),
+(2,6,69,150,90,133,29,54),
+(2,6,70,157,92,135,29,54),
+(2,6,71,160,94,138,30,55),
+(2,6,72,163,95,140,30,56),
+(2,6,73,166,97,151,30,57),
+(2,6,74,169,99,154,30,57),
+(2,6,75,172,100,156,31,58),
+(2,6,76,175,102,160,31,59),
+(2,6,77,179,104,162,31,60),
+(2,6,78,182,105,165,31,60),
+(2,6,79,191,107,168,32,61),
+(2,6,80,194,109,171,32,62),
+
+(2,7,1,24,17,23,18,25),
+(2,7,2,25,17,24,19,26),
+(2,7,3,26,18,25,20,27),
+(2,7,4,26,18,26,21,28),
+(2,7,5,27,19,27,22,29),
+(2,7,6,28,19,28,23,30),
+(2,7,7,29,20,29,24,31),
+(2,7,8,30,20,30,25,32),
+(2,7,9,31,21,31,26,33),
+(2,7,10,32,21,32,27,34),
+(2,7,11,33,22,33,28,36),
+(2,7,12,34,22,34,29,37),
+(2,7,13,34,23,35,30,38),
+(2,7,14,35,23,36,31,39),
+(2,7,15,36,24,37,32,40),
+(2,7,16,37,24,39,33,41),
+(2,7,17,38,25,40,34,43),
+(2,7,18,39,25,41,35,44),
+(2,7,19,40,26,42,36,45),
+(2,7,20,41,26,43,37,46),
+(2,7,21,42,27,44,38,47),
+(2,7,22,43,27,45,39,49),
+(2,7,23,44,28,47,40,50),
+(2,7,24,45,28,48,41,51),
+(2,7,25,47,29,49,43,52),
+(2,7,26,48,30,50,44,54),
+(2,7,27,49,30,52,45,55),
+(2,7,28,50,31,53,46,56),
+(2,7,29,51,31,54,47,58),
+(2,7,30,52,32,55,48,59),
+(2,7,31,53,33,57,50,60),
+(2,7,32,54,33,58,51,62),
+(2,7,33,55,34,59,52,63),
+(2,7,34,57,34,61,53,65),
+(2,7,35,58,35,62,55,66),
+(2,7,36,59,36,63,56,67),
+(2,7,37,60,36,65,57,69),
+(2,7,38,61,37,66,58,70),
+(2,7,39,62,38,67,60,72),
+(2,7,40,64,38,69,61,73),
+(2,7,41,65,39,70,62,75),
+(2,7,42,66,40,72,64,76),
+(2,7,43,67,40,73,65,78),
+(2,7,44,69,41,74,66,79),
+(2,7,45,70,42,76,68,81),
+(2,7,46,71,42,77,69,82),
+(2,7,47,72,43,79,70,84),
+(2,7,48,74,44,80,72,85),
+(2,7,49,75,45,82,73,87),
+(2,7,50,76,45,83,75,89),
+(2,7,51,78,46,85,76,90),
+(2,7,52,79,47,86,77,92),
+(2,7,53,80,47,88,79,93),
+(2,7,54,82,48,90,80,95),
+(2,7,55,83,49,91,82,97),
+(2,7,56,85,50,93,83,98),
+(2,7,57,86,50,94,85,100),
+(2,7,58,87,51,96,86,102),
+(2,7,59,89,52,97,88,103),
+(2,7,60,90,53,99,89,105),
+(2,7,61,92,54,101,91,107),
+(2,7,62,93,54,102,92,109),
+(2,7,63,95,55,104,94,110),
+(2,7,64,96,56,106,95,112),
+(2,7,65,97,57,107,97,114),
+(2,7,66,99,58,109,99,116),
+(2,7,67,100,58,111,100,118),
+(2,7,68,102,59,113,102,119),
+(2,7,69,103,60,114,103,121),
+(2,7,70,105,61,116,105,123),
+(2,7,71,106,62,118,117,125),
+(2,7,72,108,63,120,119,128),
+(2,7,73,110,64,122,122,130),
+(2,7,74,112,65,125,124,132),
+(2,7,75,114,66,127,126,134),
+(2,7,76,116,67,129,128,137),
+(2,7,77,117,68,131,128,139),
+(2,7,78,119,69,133,133,141),
+(2,7,79,121,70,136,135,144),
+(2,7,80,123,71,138,137,146),
+
+(2,9,1,23,17,23,19,25),
+(2,9,2,23,17,24,20,26),
+(2,9,3,24,18,24,21,27),
+(2,9,4,24,18,25,23,28),
+(2,9,5,24,18,25,24,30),
+(2,9,6,24,19,26,25,31),
+(2,9,7,25,19,26,26,32),
+(2,9,8,25,20,27,27,33),
+(2,9,9,25,20,27,29,34),
+(2,9,10,26,20,28,30,36),
+(2,9,11,26,21,29,31,37),
+(2,9,12,26,21,29,33,38),
+(2,9,13,27,22,30,34,39),
+(2,9,14,27,22,31,35,41),
+(2,9,15,27,23,31,37,42),
+(2,9,16,28,23,32,38,43),
+(2,9,17,28,23,32,39,45),
+(2,9,18,28,24,33,41,46),
+(2,9,19,29,24,34,42,47),
+(2,9,20,29,25,34,43,49),
+(2,9,21,29,25,35,45,50),
+(2,9,22,30,26,36,46,51),
+(2,9,23,30,26,37,48,53),
+(2,9,24,30,27,37,49,54),
+(2,9,25,31,27,38,51,56),
+(2,9,26,31,28,39,52,57),
+(2,9,27,32,28,39,54,59),
+(2,9,28,32,29,40,55,60),
+(2,9,29,32,29,41,57,62),
+(2,9,30,33,30,42,58,63),
+(2,9,31,33,30,42,60,65),
+(2,9,32,34,31,43,61,66),
+(2,9,33,34,31,44,63,68),
+(2,9,34,35,32,45,64,69),
+(2,9,35,35,32,45,66,71),
+(2,9,36,36,33,46,68,72),
+(2,9,37,36,34,47,69,74),
+(2,9,38,36,34,48,71,76),
+(2,9,39,37,35,49,72,77),
+(2,9,40,37,35,50,74,79),
+(2,9,41,38,36,50,76,80),
+(2,9,42,38,36,51,77,82),
+(2,9,43,39,37,52,79,84),
+(2,9,44,39,38,53,81,85),
+(2,9,45,40,38,54,83,87),
+(2,9,46,40,39,55,84,89),
+(2,9,47,41,39,56,86,91),
+(2,9,48,41,40,56,88,92),
+(2,9,49,42,41,57,90,94),
+(2,9,50,42,41,58,91,96),
+(2,9,51,43,42,59,93,98),
+(2,9,52,43,43,60,95,99),
+(2,9,53,44,43,61,97,101),
+(2,9,54,45,44,62,99,103),
+(2,9,55,45,45,63,101,105),
+(2,9,56,46,45,64,102,107),
+(2,9,57,46,46,65,104,109),
+(2,9,58,47,47,66,106,110),
+(2,9,59,47,47,67,108,112),
+(2,9,60,48,48,68,110,114),
+(2,9,61,48,49,69,112,116),
+(2,9,62,49,49,70,114,118),
+(2,9,63,50,50,71,116,120),
+(2,9,64,50,51,72,118,122),
+(2,9,65,51,51,73,120,124),
+(2,9,66,52,52,74,122,126),
+(2,9,67,52,53,75,124,128),
+(2,9,68,53,54,76,126,130),
+(2,9,69,53,54,77,128,132),
+(2,9,70,54,55,78,130,134),
+(2,9,71,55,56,88,134,145),
+(2,9,72,56,56,89,135,147),
+(2,9,73,57,57,90,137,150),
+(2,9,74,57,58,91,142,153),
+(2,9,75,58,59,93,142,155),
+(2,9,76,59,60,94,145,158),
+(2,9,77,60,61,95,148,161),
+(2,9,78,60,62,97,150,164),
+(2,9,79,61,63,98,153,167),
+(2,9,80,62,64,99,156,169),
+
+(3,1,1,25,16,25,19,19),
+(3,1,2,26,17,26,19,19),
+(3,1,3,28,18,27,19,20),
+(3,1,4,29,18,28,19,20),
+(3,1,5,30,19,30,19,20),
+(3,1,6,31,20,31,19,20),
+(3,1,7,33,21,32,20,21),
+(3,1,8,34,22,33,20,21),
+(3,1,9,36,23,35,20,21),
+(3,1,10,37,23,36,20,22),
+(3,1,11,38,24,37,20,22),
+(3,1,12,40,25,38,20,22),
+(3,1,13,41,26,40,20,23),
+(3,1,14,43,27,41,20,23),
+(3,1,15,44,28,42,20,23),
+(3,1,16,46,29,44,21,24),
+(3,1,17,47,30,45,21,24),
+(3,1,18,49,31,46,21,24),
+(3,1,19,50,32,48,21,25),
+(3,1,20,52,33,49,21,25),
+(3,1,21,53,34,51,21,26),
+(3,1,22,55,34,52,21,26),
+(3,1,23,56,35,53,21,26),
+(3,1,24,58,36,55,22,27),
+(3,1,25,59,37,56,22,27),
+(3,1,26,61,38,58,22,27),
+(3,1,27,63,39,59,22,28),
+(3,1,28,64,41,61,22,28),
+(3,1,29,66,42,62,22,29),
+(3,1,30,68,43,64,23,29),
+(3,1,31,69,44,65,23,30),
+(3,1,32,71,45,67,23,30),
+(3,1,33,73,46,68,23,30),
+(3,1,34,75,47,70,23,31),
+(3,1,35,76,48,72,24,31),
+(3,1,36,78,49,73,24,32),
+(3,1,37,80,50,75,24,32),
+(3,1,38,82,51,76,24,33),
+(3,1,39,84,52,78,24,33),
+(3,1,40,85,54,80,24,34),
+(3,1,41,87,55,81,25,34),
+(3,1,42,89,56,83,25,35),
+(3,1,43,91,57,85,25,35),
+(3,1,44,93,58,87,25,36),
+(3,1,45,95,59,88,26,36),
+(3,1,46,97,61,90,26,37),
+(3,1,47,99,62,92,26,37),
+(3,1,48,101,63,94,26,38),
+(3,1,49,102,64,95,26,38),
+(3,1,50,104,65,97,27,39),
+(3,1,51,106,67,99,27,39),
+(3,1,52,108,68,101,27,40),
+(3,1,53,110,69,103,27,40),
+(3,1,54,112,70,104,28,41),
+(3,1,55,115,72,106,28,41),
+(3,1,56,117,73,108,28,42),
+(3,1,57,119,74,110,28,42),
+(3,1,58,121,76,112,29,43),
+(3,1,59,123,77,114,29,43),
+(3,1,60,125,78,116,29,44),
+(3,1,61,127,80,118,29,45),
+(3,1,62,129,81,120,30,45),
+(3,1,63,131,82,122,30,46),
+(3,1,64,134,84,124,30,46),
+(3,1,65,136,85,126,31,47),
+(3,1,66,138,86,128,31,48),
+(3,1,67,140,88,130,31,48),
+(3,1,68,142,89,132,31,49),
+(3,1,69,145,91,134,32,49),
+(3,1,70,147,92,136,32,50),
+(3,1,71,150,93,138,32,51),
+(3,1,72,152,95,141,32,52),
+(3,1,73,164,97,151,32,53),
+(3,1,74,164,98,151,33,53),
+(3,1,75,170,100,156,33,54),
+(3,1,76,173,102,160,33,55),
+(3,1,77,173,104,160,34,56),
+(3,1,78,176,105,162,34,56),
+(3,1,79,183,107,168,34,57),
+(3,1,80,186,109,171,35,58),
+
+(3,2,1,24,16,25,19,20),
+(3,2,2,25,17,26,20,21),
+(3,2,3,26,17,27,20,21),
+(3,2,4,27,18,28,21,22),
+(3,2,5,28,18,29,22,23),
+(3,2,6,29,19,30,22,24),
+(3,2,7,31,20,31,23,24),
+(3,2,8,32,20,32,24,25),
+(3,2,9,33,21,33,24,26),
+(3,2,10,34,21,34,25,26),
+(3,2,11,35,22,36,26,27),
+(3,2,12,36,23,37,26,28),
+(3,2,13,38,23,38,27,29),
+(3,2,14,39,24,39,28,30),
+(3,2,15,40,25,40,29,30),
+(3,2,16,41,25,41,29,31),
+(3,2,17,43,26,43,30,32),
+(3,2,18,44,27,44,31,33),
+(3,2,19,45,28,45,32,34),
+(3,2,20,47,28,46,32,35),
+(3,2,21,48,29,47,33,35),
+(3,2,22,49,30,49,34,36),
+(3,2,23,51,30,50,35,37),
+(3,2,24,52,31,51,36,38),
+(3,2,25,53,32,52,36,39),
+(3,2,26,55,33,54,37,40),
+(3,2,27,56,33,55,38,41),
+(3,2,28,57,34,56,39,42),
+(3,2,29,59,35,58,40,43),
+(3,2,30,60,36,59,41,43),
+(3,2,31,62,37,60,42,44),
+(3,2,32,63,37,62,42,45),
+(3,2,33,65,38,63,43,46),
+(3,2,34,66,39,65,44,47),
+(3,2,35,68,40,66,45,48),
+(3,2,36,69,41,67,46,49),
+(3,2,37,71,41,69,47,50),
+(3,2,38,72,42,70,48,51),
+(3,2,39,74,43,72,49,52),
+(3,2,40,75,44,73,50,53),
+(3,2,41,77,45,75,51,54),
+(3,2,42,78,46,76,52,55),
+(3,2,43,80,47,78,53,56),
+(3,2,44,82,47,79,54,57),
+(3,2,45,83,48,81,55,59),
+(3,2,46,85,49,82,56,60),
+(3,2,47,87,50,84,57,61),
+(3,2,48,88,51,85,58,62),
+(3,2,49,90,52,87,59,63),
+(3,2,50,92,53,89,60,64),
+(3,2,51,93,54,90,61,65),
+(3,2,52,95,55,92,62,66),
+(3,2,53,97,56,93,63,67),
+(3,2,54,98,57,95,64,69),
+(3,2,55,100,58,97,65,70),
+(3,2,56,102,59,98,66,71),
+(3,2,57,104,60,100,67,72),
+(3,2,58,106,61,102,68,73),
+(3,2,59,107,62,103,69,74),
+(3,2,60,109,63,105,70,76),
+(3,2,61,111,64,107,72,77),
+(3,2,62,113,65,109,73,78),
+(3,2,63,115,66,110,74,79),
+(3,2,64,117,67,112,75,80),
+(3,2,65,118,68,114,76,82),
+(3,2,66,120,69,116,77,83),
+(3,2,67,122,70,118,78,84),
+(3,2,68,124,71,119,80,85),
+(3,2,69,126,72,121,81,87),
+(3,2,70,128,73,123,82,88),
+(3,2,71,150,74,125,83,89),
+(3,2,72,152,75,128,85,91),
+(3,2,73,156,76,130,86,93),
+(3,2,74,158,78,132,88,94),
+(3,2,75,161,79,134,89,96),
+(3,2,76,164,80,137,91,97),
+(3,2,77,166,82,139,92,99),
+(3,2,78,170,83,141,94,101),
+(3,2,79,172,84,144,95,102),
+(3,2,80,175,86,146,97,104),
+
+(3,3,1,22,19,24,19,20),
+(3,3,2,22,20,25,20,21),
+(3,3,3,23,22,26,20,21),
+(3,3,4,23,23,27,21,22),
+(3,3,5,24,25,28,21,23),
+(3,3,6,24,26,29,22,23),
+(3,3,7,25,27,29,23,24),
+(3,3,8,25,29,30,23,25),
+(3,3,9,25,30,31,24,25),
+(3,3,10,26,32,32,24,26),
+(3,3,11,26,33,33,25,27),
+(3,3,12,27,35,34,26,27),
+(3,3,13,27,36,35,26,28),
+(3,3,14,28,38,36,27,29),
+(3,3,15,28,39,37,28,29),
+(3,3,16,29,41,38,28,30),
+(3,3,17,29,42,39,29,31),
+(3,3,18,30,44,41,30,32),
+(3,3,19,30,46,42,30,32),
+(3,3,20,31,47,43,31,33),
+(3,3,21,32,49,44,32,34),
+(3,3,22,32,51,45,33,35),
+(3,3,23,33,52,46,33,36),
+(3,3,24,33,54,47,34,36),
+(3,3,25,34,56,48,35,37),
+(3,3,26,34,57,49,35,38),
+(3,3,27,35,59,51,36,39),
+(3,3,28,35,61,52,37,40),
+(3,3,29,36,63,53,38,40),
+(3,3,30,37,64,54,39,41),
+(3,3,31,37,66,55,39,42),
+(3,3,32,38,68,57,40,43),
+(3,3,33,38,70,58,41,44),
+(3,3,34,39,71,59,42,45),
+(3,3,35,40,73,60,43,46),
+(3,3,36,40,75,62,43,47),
+(3,3,37,41,77,63,44,47),
+(3,3,38,42,79,64,45,48),
+(3,3,39,42,81,65,46,49),
+(3,3,40,43,83,67,47,50),
+(3,3,41,44,85,68,48,51),
+(3,3,42,44,87,69,49,52),
+(3,3,43,45,89,71,49,53),
+(3,3,44,46,91,72,50,54),
+(3,3,45,46,93,73,51,55),
+(3,3,46,47,95,75,52,56),
+(3,3,47,48,97,76,53,57),
+(3,3,48,49,99,78,54,58),
+(3,3,49,49,101,79,55,59),
+(3,3,50,50,103,80,56,60),
+(3,3,51,51,105,82,57,61),
+(3,3,52,51,107,83,58,62),
+(3,3,53,52,109,85,59,63),
+(3,3,54,53,111,86,60,64),
+(3,3,55,54,113,88,61,65),
+(3,3,56,55,115,89,62,66),
+(3,3,57,55,118,91,62,67),
+(3,3,58,56,120,92,63,68),
+(3,3,59,57,122,94,64,70),
+(3,3,60,58,124,95,65,71),
+(3,3,61,58,126,97,67,72),
+(3,3,62,59,129,98,68,73),
+(3,3,63,60,131,100,69,74),
+(3,3,64,61,133,101,70,75),
+(3,3,65,62,135,103,71,76),
+(3,3,66,63,138,105,72,77),
+(3,3,67,63,140,106,73,78),
+(3,3,68,64,142,108,74,80),
+(3,3,69,65,145,109,75,81),
+(3,3,70,66,147,111,76,82),
+(3,3,71,67,150,113,77,83),
+(3,3,72,68,153,115,78,84),
+(3,3,73,69,156,117,79,86),
+(3,3,74,70,159,119,81,87),
+(3,3,75,71,162,121,82,89),
+(3,3,76,72,165,123,83,90),
+(3,3,77,73,168,125,85,92),
+(3,3,78,74,171,127,86,93),
+(3,3,79,75,174,129,87,95),
+(3,3,80,76,177,131,89,96),
+
+(3,4,1,23,19,24,19,19),
+(3,4,2,24,20,25,19,19),
+(3,4,3,24,22,25,19,20),
+(3,4,4,25,23,26,19,20),
+(3,4,5,26,25,27,20,20),
+(3,4,6,27,26,27,20,21),
+(3,4,7,28,28,28,20,21),
+(3,4,8,28,29,29,20,22),
+(3,4,9,29,31,30,20,22),
+(3,4,10,30,32,30,20,22),
+(3,4,11,31,34,31,21,23),
+(3,4,12,32,36,32,21,23),
+(3,4,13,33,37,33,21,24),
+(3,4,14,33,39,33,21,24),
+(3,4,15,34,40,34,21,25),
+(3,4,16,35,42,35,22,25),
+(3,4,17,36,44,36,22,25),
+(3,4,18,37,45,37,22,26),
+(3,4,19,38,47,38,22,26),
+(3,4,20,39,49,38,22,27),
+(3,4,21,40,51,39,23,27),
+(3,4,22,41,52,40,23,28),
+(3,4,23,42,54,41,23,28),
+(3,4,24,43,56,42,23,29),
+(3,4,25,44,58,43,24,29),
+(3,4,26,44,59,44,24,30),
+(3,4,27,45,61,44,24,30),
+(3,4,28,46,63,45,24,31),
+(3,4,29,47,65,46,25,31),
+(3,4,30,48,67,47,25,32),
+(3,4,31,49,69,48,25,32),
+(3,4,32,51,71,49,25,33),
+(3,4,33,52,72,50,26,33),
+(3,4,34,53,74,51,26,34),
+(3,4,35,54,76,52,26,34),
+(3,4,36,55,78,53,26,35),
+(3,4,37,56,80,54,27,35),
+(3,4,38,57,82,55,27,36),
+(3,4,39,58,84,56,27,37),
+(3,4,40,59,86,57,28,37),
+(3,4,41,60,88,58,28,38),
+(3,4,42,61,90,59,28,38),
+(3,4,43,63,92,60,28,39),
+(3,4,44,64,95,61,29,39),
+(3,4,45,65,97,62,29,40),
+(3,4,46,66,99,63,29,41),
+(3,4,47,67,101,64,30,41),
+(3,4,48,68,103,66,30,42),
+(3,4,49,70,105,67,30,43),
+(3,4,50,71,107,68,31,43),
+(3,4,51,72,110,69,31,44),
+(3,4,52,73,112,70,31,44),
+(3,4,53,74,114,71,32,45),
+(3,4,54,76,116,72,32,46),
+(3,4,55,77,118,73,32,46),
+(3,4,56,78,121,75,33,47),
+(3,4,57,80,123,76,33,48),
+(3,4,58,81,125,77,33,48),
+(3,4,59,82,128,78,34,49),
+(3,4,60,83,130,79,34,50),
+(3,4,61,85,132,81,34,51),
+(3,4,62,86,135,82,35,51),
+(3,4,63,87,137,83,35,52),
+(3,4,64,89,139,84,36,53),
+(3,4,65,90,142,86,36,53),
+(3,4,66,91,144,87,36,54),
+(3,4,67,93,147,88,37,55),
+(3,4,68,94,149,89,37,56),
+(3,4,69,96,152,91,38,56),
+(3,4,70,97,154,92,38,57),
+(3,4,71,99,157,93,38,58),
+(3,4,72,101,160,96,39,58),
+(3,4,73,102,163,97,39,59),
+(3,4,74,104,166,98,40,60),
+(3,4,75,106,169,100,40,61),
+(3,4,76,107,172,101,40,62),
+(3,4,77,109,175,103,41,63),
+(3,4,78,111,179,105,41,64),
+(3,4,79,113,182,106,42,65),
+(3,4,80,115,185,108,42,66),
+
+(3,5,1,22,16,23,21,22),
+(3,5,2,22,16,23,22,23),
+(3,5,3,22,16,24,24,25),
+(3,5,4,22,17,24,25,26),
+(3,5,5,23,17,24,26,27),
+(3,5,6,23,17,25,28,29),
+(3,5,7,23,17,25,29,30),
+(3,5,8,23,18,26,30,32),
+(3,5,9,23,18,26,32,33),
+(3,5,10,23,18,26,33,35),
+(3,5,11,24,18,27,35,36),
+(3,5,12,24,19,27,36,38),
+(3,5,13,24,19,28,37,39),
+(3,5,14,24,19,28,39,41),
+(3,5,15,24,19,28,40,42),
+(3,5,16,24,20,29,42,44),
+(3,5,17,25,20,29,43,45),
+(3,5,18,25,20,30,45,47),
+(3,5,19,25,21,30,46,49),
+(3,5,20,25,21,31,48,50),
+(3,5,21,25,21,31,50,52),
+(3,5,22,26,22,31,51,53),
+(3,5,23,26,22,32,53,55),
+(3,5,24,26,22,32,54,57),
+(3,5,25,26,22,33,56,58),
+(3,5,26,27,23,33,58,60),
+(3,5,27,27,23,34,59,62),
+(3,5,28,27,23,34,61,64),
+(3,5,29,27,24,35,63,65),
+(3,5,30,28,24,35,64,67),
+(3,5,31,28,24,36,66,69),
+(3,5,32,28,25,36,68,71),
+(3,5,33,28,25,37,70,72),
+(3,5,34,29,26,38,71,74),
+(3,5,35,29,26,38,73,76),
+(3,5,36,29,26,39,75,78),
+(3,5,37,29,27,39,77,80),
+(3,5,38,30,27,40,78,82),
+(3,5,39,30,27,40,80,84),
+(3,5,40,30,28,41,82,86),
+(3,5,41,31,28,41,84,88),
+(3,5,42,31,29,42,86,89),
+(3,5,43,31,29,43,88,91),
+(3,5,44,32,29,43,90,93),
+(3,5,45,32,30,44,92,95),
+(3,5,46,32,30,44,93,97),
+(3,5,47,32,30,45,95,99),
+(3,5,48,33,31,46,97,101),
+(3,5,49,33,31,46,99,103),
+(3,5,50,33,32,47,101,106),
+(3,5,51,34,32,48,103,108),
+(3,5,52,34,33,48,105,110),
+(3,5,53,35,33,49,107,112),
+(3,5,54,35,33,50,109,114),
+(3,5,55,35,34,50,111,116),
+(3,5,56,36,34,51,113,118),
+(3,5,57,36,35,52,116,120),
+(3,5,58,36,35,52,118,123),
+(3,5,59,37,36,53,120,125),
+(3,5,60,37,36,54,122,127),
+(3,5,61,37,37,54,124,129),
+(3,5,62,38,37,55,126,131),
+(3,5,63,38,38,56,128,134),
+(3,5,64,39,38,57,131,136),
+(3,5,65,39,39,57,133,138),
+(3,5,66,39,39,58,135,141),
+(3,5,67,40,40,59,137,143),
+(3,5,68,40,40,59,139,145),
+(3,5,69,41,40,60,142,148),
+(3,5,70,41,41,61,144,150),
+(3,5,71,41,42,62,147,153),
+(3,5,72,42,42,62,150,163),
+(3,5,73,42,43,63,153,166),
+(3,5,74,43,43,64,155,170),
+(3,5,75,43,44,65,158,173),
+(3,5,76,43,45,66,161,176),
+(3,5,77,44,45,67,164,179),
+(3,5,78,44,46,68,167,182),
+(3,5,79,45,46,69,170,184),
+(3,5,80,45,47,70,173,189),
+
+(3,6,1,25,16,25,19,19),
+(3,6,2,26,17,26,19,19),
+(3,6,3,28,18,27,19,20),
+(3,6,4,29,18,28,19,20),
+(3,6,5,30,19,30,19,20),
+(3,6,6,31,20,31,19,20),
+(3,6,7,33,21,32,20,21),
+(3,6,8,34,22,33,20,21),
+(3,6,9,36,23,35,20,21),
+(3,6,10,37,23,36,20,22),
+(3,6,11,38,24,37,20,22),
+(3,6,12,40,25,38,20,22),
+(3,6,13,41,26,40,20,23),
+(3,6,14,43,27,41,20,23),
+(3,6,15,44,28,42,20,23),
+(3,6,16,46,29,44,21,24),
+(3,6,17,47,30,45,21,24),
+(3,6,18,49,31,46,21,24),
+(3,6,19,50,32,48,21,25),
+(3,6,20,52,33,49,21,25),
+(3,6,21,53,34,51,21,26),
+(3,6,22,55,34,52,21,26),
+(3,6,23,56,35,53,21,26),
+(3,6,24,58,36,55,22,27),
+(3,6,25,59,37,56,22,27),
+(3,6,26,61,38,58,22,27),
+(3,6,27,63,39,59,22,28),
+(3,6,28,64,41,61,22,28),
+(3,6,29,66,42,62,22,29),
+(3,6,30,68,43,64,23,29),
+(3,6,31,69,44,65,23,30),
+(3,6,32,71,45,67,23,30),
+(3,6,33,73,46,68,23,30),
+(3,6,34,75,47,70,23,31),
+(3,6,35,76,48,72,24,31),
+(3,6,36,78,49,73,24,32),
+(3,6,37,80,50,75,24,32),
+(3,6,38,82,51,76,24,33),
+(3,6,39,84,52,78,24,33),
+(3,6,40,85,54,80,24,34),
+(3,6,41,87,55,81,25,34),
+(3,6,42,89,56,83,25,35),
+(3,6,43,91,57,85,25,35),
+(3,6,44,93,58,87,25,36),
+(3,6,45,95,59,88,26,36),
+(3,6,46,97,61,90,26,37),
+(3,6,47,99,62,92,26,37),
+(3,6,48,101,63,94,26,38),
+(3,6,49,102,64,95,26,38),
+(3,6,50,104,65,97,27,39),
+(3,6,51,106,67,99,27,39),
+(3,6,52,108,68,99,27,40),
+(3,6,53,109,68,101,27,40),
+(3,6,54,110,69,101,28,41),
+(3,6,55,110,69,102,28,41),
+(3,6,56,113,71,105,28,42),
+(3,6,57,118,72,107,28,42),
+(3,6,58,120,73,109,29,43),
+(3,6,59,123,75,111,29,43),
+(3,6,60,125,76,113,29,44),
+(3,6,61,126,77,115,29,45),
+(3,6,62,127,79,117,29,45),
+(3,6,63,129,80,120,30,46),
+(3,6,64,132,82,122,30,46),
+(3,6,65,135,83,124,30,47),
+(3,6,66,137,85,127,30,48),
+(3,6,67,144,86,129,31,48),
+(3,6,68,146,88,131,31,49),
+(3,6,69,149,89,133,31,50),
+(3,6,70,152,91,136,31,50),
+(3,6,71,154,93,139,32,51),
+(3,6,72,157,94,141,32,52),
+(3,6,73,160,96,144,32,53),
+(3,6,74,163,98,146,32,53),
+(3,6,75,166,99,150,33,54),
+(3,6,76,169,101,152,33,55),
+(3,6,77,172,103,155,33,56),
+(3,6,78,176,104,157,33,56),
+(3,6,79,179,106,160,34,57),
+(3,6,80,182,108,163,34,58),
+
+(4,1,1,20,25,21,20,20),
+(4,1,2,21,26,22,20,20),
+(4,1,3,23,27,23,20,21),
+(4,1,4,24,27,25,20,21),
+(4,1,5,25,28,26,20,21),
+(4,1,6,27,29,27,20,21),
+(4,1,7,28,30,28,21,22),
+(4,1,8,29,31,29,21,22),
+(4,1,9,31,31,31,21,22),
+(4,1,10,32,32,32,21,23),
+(4,1,11,33,33,33,21,23),
+(4,1,12,35,34,34,21,23),
+(4,1,13,36,35,36,21,24),
+(4,1,14,38,36,37,21,24),
+(4,1,15,39,37,38,21,24),
+(4,1,16,41,37,40,21,25),
+(4,1,17,42,38,41,22,25),
+(4,1,18,44,39,43,22,25),
+(4,1,19,45,40,44,22,26),
+(4,1,20,47,41,45,22,26),
+(4,1,21,48,42,47,22,26),
+(4,1,22,50,43,48,22,27),
+(4,1,23,52,44,50,22,27),
+(4,1,24,53,45,51,23,28),
+(4,1,25,55,46,52,23,28),
+(4,1,26,56,47,54,23,28),
+(4,1,27,58,48,55,23,29),
+(4,1,28,60,49,57,23,29),
+(4,1,29,61,50,58,23,30),
+(4,1,30,63,51,60,24,30),
+(4,1,31,65,52,62,24,30),
+(4,1,32,66,53,63,24,31),
+(4,1,33,68,54,65,24,31),
+(4,1,34,70,55,66,24,32),
+(4,1,35,72,56,68,24,32),
+(4,1,36,73,58,69,25,33),
+(4,1,37,75,59,71,25,33),
+(4,1,38,77,60,73,25,34),
+(4,1,39,79,61,74,25,34),
+(4,1,40,81,62,76,25,35),
+(4,1,41,82,63,78,26,35),
+(4,1,42,84,64,79,26,35),
+(4,1,43,86,66,81,26,36),
+(4,1,44,88,67,83,26,36),
+(4,1,45,90,68,85,26,37),
+(4,1,46,92,69,86,27,37),
+(4,1,47,94,70,88,27,38),
+(4,1,48,96,72,90,27,38),
+(4,1,49,98,73,92,27,39),
+(4,1,50,100,74,93,28,40),
+(4,1,51,102,75,95,28,40),
+(4,1,52,104,77,97,28,41),
+(4,1,53,106,78,99,28,41),
+(4,1,54,108,79,101,29,42),
+(4,1,55,110,80,103,29,42),
+(4,1,56,112,82,104,29,43),
+(4,1,57,114,83,106,29,43),
+(4,1,58,116,84,108,30,44),
+(4,1,59,118,86,110,30,44),
+(4,1,60,120,87,112,30,45),
+(4,1,61,122,88,114,30,46),
+(4,1,62,124,90,116,31,46),
+(4,1,63,127,91,118,31,47),
+(4,1,64,129,92,120,31,47),
+(4,1,65,131,94,122,32,48),
+(4,1,66,133,95,124,32,49),
+(4,1,67,135,97,126,32,49),
+(4,1,68,138,98,128,32,50),
+(4,1,69,140,100,130,33,50),
+(4,1,70,142,101,132,33,51),
+(4,1,71,145,102,134,33,52),
+(4,1,72,147,104,137,33,53),
+(4,1,73,150,106,139,33,54),
+(4,1,74,153,107,142,34,54),
+(4,1,75,156,109,144,34,55),
+(4,1,76,159,111,148,34,56),
+(4,1,77,162,113,150,35,57),
+(4,1,78,165,114,152,35,57),
+(4,1,79,178,116,164,35,58),
+(4,1,80,181,118,167,36,59),
+
+(4,3,1,17,28,20,20,21),
+(4,3,2,17,29,21,21,22),
+(4,3,3,18,31,22,21,22),
+(4,3,4,18,32,23,22,23),
+(4,3,5,19,33,24,22,24),
+(4,3,6,19,35,25,23,24),
+(4,3,7,20,36,26,24,25),
+(4,3,8,20,38,27,24,25),
+(4,3,9,21,39,27,25,26),
+(4,3,10,21,40,28,25,27),
+(4,3,11,22,42,29,26,28),
+(4,3,12,22,43,30,27,28),
+(4,3,13,23,45,31,27,29),
+(4,3,14,23,46,32,28,30),
+(4,3,15,24,48,34,29,30),
+(4,3,16,24,50,35,29,31),
+(4,3,17,25,51,36,30,32),
+(4,3,18,25,53,37,31,33),
+(4,3,19,26,54,38,31,33),
+(4,3,20,26,56,39,32,34),
+(4,3,21,27,57,40,33,35),
+(4,3,22,27,59,41,33,36),
+(4,3,23,28,61,42,34,36),
+(4,3,24,28,62,43,35,37),
+(4,3,25,29,64,44,36,38),
+(4,3,26,30,66,46,36,39),
+(4,3,27,30,68,47,37,40),
+(4,3,28,31,69,48,38,41),
+(4,3,29,31,71,49,39,41),
+(4,3,30,32,73,50,39,42),
+(4,3,31,33,75,52,40,43),
+(4,3,32,33,76,53,41,44),
+(4,3,33,34,78,54,42,45),
+(4,3,34,34,80,55,43,46),
+(4,3,35,35,82,57,44,47),
+(4,3,36,36,84,58,44,48),
+(4,3,37,36,86,59,45,48),
+(4,3,38,37,87,60,46,49),
+(4,3,39,38,89,62,47,50),
+(4,3,40,38,91,63,48,51),
+(4,3,41,39,93,64,49,52),
+(4,3,42,40,95,66,49,53),
+(4,3,43,40,97,67,50,54),
+(4,3,44,41,99,68,51,55),
+(4,3,45,42,101,70,52,56),
+(4,3,46,42,103,71,53,57),
+(4,3,47,43,105,72,54,58),
+(4,3,48,44,107,74,55,59),
+(4,3,49,45,109,75,56,60),
+(4,3,50,45,111,77,57,61),
+(4,3,51,46,113,78,58,62),
+(4,3,52,47,115,79,59,63),
+(4,3,53,47,118,81,60,64),
+(4,3,54,48,120,82,61,65),
+(4,3,55,49,122,84,61,66),
+(4,3,56,50,124,85,62,67),
+(4,3,57,50,126,87,63,68),
+(4,3,58,51,128,88,64,69),
+(4,3,59,52,131,90,65,70),
+(4,3,60,53,133,91,66,72),
+(4,3,61,54,135,93,67,73),
+(4,3,62,54,137,94,69,74),
+(4,3,63,55,140,96,70,75),
+(4,3,64,56,142,97,71,76),
+(4,3,65,57,144,99,72,77),
+(4,3,66,58,147,101,73,78),
+(4,3,67,58,149,102,74,79),
+(4,3,68,59,151,104,75,81),
+(4,3,69,60,154,105,76,82),
+(4,3,70,61,156,107,77,83),
+(4,3,71,62,159,109,78,84),
+(4,3,72,63,162,111,79,85),
+(4,3,73,64,165,113,80,87),
+(4,3,74,65,168,115,82,88),
+(4,3,75,66,171,117,83,90),
+(4,3,76,67,174,119,84,91),
+(4,3,77,68,177,121,86,93),
+(4,3,78,69,180,123,87,94),
+(4,3,79,70,190,125,91,96),
+(4,3,80,71,193,127,93,97),
+
+(4,4,1,18,28,20,20,20),
+(4,4,2,19,29,21,20,20),
+(4,4,3,20,31,21,20,21),
+(4,4,4,20,32,22,20,21),
+(4,4,5,21,34,23,21,21),
+(4,4,6,22,35,24,21,22),
+(4,4,7,23,37,24,21,22),
+(4,4,8,24,38,25,21,23),
+(4,4,9,24,40,26,21,23),
+(4,4,10,25,41,26,21,23),
+(4,4,11,26,43,27,22,24),
+(4,4,12,27,44,28,22,24),
+(4,4,13,28,46,29,22,25),
+(4,4,14,29,48,30,22,25),
+(4,4,15,29,49,30,22,25),
+(4,4,16,30,51,31,23,26),
+(4,4,17,31,52,32,23,26),
+(4,4,18,32,54,33,23,27),
+(4,4,19,33,56,34,23,27),
+(4,4,20,34,57,35,23,28),
+(4,4,21,35,59,35,24,28),
+(4,4,22,36,61,36,24,29),
+(4,4,23,37,63,37,24,29),
+(4,4,24,38,64,38,24,30),
+(4,4,25,39,66,39,25,30),
+(4,4,26,40,68,40,25,31),
+(4,4,27,41,70,41,25,31),
+(4,4,28,42,72,42,25,32),
+(4,4,29,43,73,43,25,32),
+(4,4,30,44,75,43,26,33),
+(4,4,31,45,77,44,26,33),
+(4,4,32,46,79,45,26,34),
+(4,4,33,47,81,46,27,34),
+(4,4,34,48,83,47,27,35),
+(4,4,35,49,85,48,27,35),
+(4,4,36,50,87,49,27,36),
+(4,4,37,51,89,50,28,36),
+(4,4,38,52,91,51,28,37),
+(4,4,39,53,93,52,28,38),
+(4,4,40,54,95,53,28,38),
+(4,4,41,56,97,54,29,39),
+(4,4,42,57,99,55,29,39),
+(4,4,43,58,101,56,29,40),
+(4,4,44,59,103,57,30,40),
+(4,4,45,60,105,59,30,41),
+(4,4,46,61,107,60,30,42),
+(4,4,47,62,109,61,31,42),
+(4,4,48,64,112,62,31,43),
+(4,4,49,65,114,63,31,44),
+(4,4,50,66,116,64,32,44),
+(4,4,51,67,118,65,32,45),
+(4,4,52,68,120,66,32,45),
+(4,4,53,70,123,67,33,46),
+(4,4,54,71,125,69,33,47),
+(4,4,55,72,127,70,33,47),
+(4,4,56,73,129,71,34,48),
+(4,4,57,75,132,72,34,49),
+(4,4,58,76,134,73,34,49),
+(4,4,59,77,136,74,35,50),
+(4,4,60,79,139,76,35,51),
+(4,4,61,80,141,77,35,51),
+(4,4,62,81,143,78,36,52),
+(4,4,63,82,146,79,36,53),
+(4,4,64,84,148,80,37,54),
+(4,4,65,85,151,82,37,54),
+(4,4,66,87,153,83,37,55),
+(4,4,67,88,156,84,38,56),
+(4,4,68,89,158,85,38,57),
+(4,4,69,91,160,87,39,57),
+(4,4,70,92,163,88,39,58),
+(4,4,71,94,166,90,39,59),
+(4,4,72,96,169,91,40,59),
+(4,4,73,97,172,93,40,60),
+(4,4,74,99,175,94,41,61),
+(4,4,75,101,178,96,41,62),
+(4,4,76,102,181,97,41,63),
+(4,4,77,104,184,99,42,64),
+(4,4,78,106,188,101,42,65),
+(4,4,79,108,191,102,43,66),
+(4,4,80,110,194,104,43,67),
+
+(4,5,1,17,25,19,22,23),
+(4,5,2,17,25,19,23,24),
+(4,5,3,17,25,20,25,26),
+(4,5,4,17,26,20,26,27),
+(4,5,5,18,26,20,27,28),
+(4,5,6,18,26,21,29,30),
+(4,5,7,18,26,21,30,31),
+(4,5,8,18,26,22,31,33),
+(4,5,9,18,27,22,33,34),
+(4,5,10,19,27,22,34,36),
+(4,5,11,19,27,23,36,37),
+(4,5,12,19,27,23,37,39),
+(4,5,13,19,28,24,38,40),
+(4,5,14,19,28,24,40,42),
+(4,5,15,19,28,25,41,43),
+(4,5,16,20,28,25,43,45),
+(4,5,17,20,29,25,44,46),
+(4,5,18,20,29,26,46,48),
+(4,5,19,20,29,26,47,49),
+(4,5,20,21,30,27,49,51),
+(4,5,21,21,30,27,51,53),
+(4,5,22,21,30,28,52,54),
+(4,5,23,21,30,28,54,56),
+(4,5,24,21,31,29,55,58),
+(4,5,25,22,31,29,57,59),
+(4,5,26,22,31,30,59,61),
+(4,5,27,22,32,30,60,63),
+(4,5,28,22,32,31,62,65),
+(4,5,29,23,32,31,64,66),
+(4,5,30,23,33,32,65,68),
+(4,5,31,23,33,32,67,70),
+(4,5,32,23,33,33,69,72),
+(4,5,33,24,34,33,70,73),
+(4,5,34,24,34,34,72,75),
+(4,5,35,24,34,34,74,77),
+(4,5,36,24,35,35,76,79),
+(4,5,37,25,35,35,78,81),
+(4,5,38,25,35,36,79,83),
+(4,5,39,25,36,37,81,85),
+(4,5,40,26,36,37,83,87),
+(4,5,41,26,37,38,85,88),
+(4,5,42,26,37,38,87,90),
+(4,5,43,27,37,39,89,92),
+(4,5,44,27,38,39,91,94),
+(4,5,45,27,38,40,92,96),
+(4,5,46,27,39,41,94,98),
+(4,5,47,28,39,41,96,100),
+(4,5,48,28,39,42,98,102),
+(4,5,49,28,40,43,100,104),
+(4,5,50,29,40,43,102,106),
+(4,5,51,29,41,44,104,109),
+(4,5,52,29,41,44,106,111),
+(4,5,53,30,42,45,108,113),
+(4,5,54,30,42,46,110,115),
+(4,5,55,30,43,46,112,117),
+(4,5,56,31,43,47,114,119),
+(4,5,57,31,43,48,117,121),
+(4,5,58,31,44,48,119,124),
+(4,5,59,32,44,49,121,126),
+(4,5,60,32,45,50,123,128),
+(4,5,61,33,45,51,125,130),
+(4,5,62,33,46,51,127,132),
+(4,5,63,33,46,52,129,135),
+(4,5,64,34,47,53,132,137),
+(4,5,65,34,47,53,134,139),
+(4,5,66,34,48,54,136,142),
+(4,5,67,35,48,55,138,144),
+(4,5,68,35,49,56,140,146),
+(4,5,69,36,49,56,143,149),
+(4,5,70,36,50,57,145,151),
+(4,5,71,36,51,58,148,161),
+(4,5,72,37,51,58,151,164),
+(4,5,73,37,52,59,154,168),
+(4,5,74,38,52,60,156,171),
+(4,5,75,38,53,61,159,174),
+(4,5,76,38,54,62,162,177),
+(4,5,77,39,54,63,165,180),
+(4,5,78,39,55,64,168,183),
+(4,5,79,40,55,65,171,186),
+(4,5,80,40,56,66,200,191),
+
+(4,6,1,20,25,21,20,20),
+(4,6,2,21,26,22,20,20),
+(4,6,3,23,27,23,20,21),
+(4,6,4,24,27,25,20,21),
+(4,6,5,25,28,26,20,21),
+(4,6,6,27,29,27,20,21),
+(4,6,7,28,30,28,21,22),
+(4,6,8,29,31,29,21,22),
+(4,6,9,31,31,31,21,22),
+(4,6,10,32,32,32,21,23),
+(4,6,11,33,33,33,21,23),
+(4,6,12,35,34,34,21,23),
+(4,6,13,36,35,36,21,24),
+(4,6,14,38,36,37,21,24),
+(4,6,15,39,37,38,21,24),
+(4,6,16,41,37,40,21,25),
+(4,6,17,42,38,41,22,25),
+(4,6,18,44,39,43,22,25),
+(4,6,19,45,40,44,22,26),
+(4,6,20,47,41,45,22,26),
+(4,6,21,48,42,47,22,26),
+(4,6,22,50,43,48,22,27),
+(4,6,23,52,44,50,22,27),
+(4,6,24,53,45,51,23,28),
+(4,6,25,55,46,52,23,28),
+(4,6,26,56,47,54,23,28),
+(4,6,27,58,48,55,23,29),
+(4,6,28,60,49,57,23,29),
+(4,6,29,61,50,58,23,30),
+(4,6,30,63,51,60,24,30),
+(4,6,31,65,52,62,24,30),
+(4,6,32,66,53,63,24,31),
+(4,6,33,68,54,65,24,31),
+(4,6,34,70,55,66,24,32),
+(4,6,35,72,56,68,24,32),
+(4,6,36,73,58,69,25,33),
+(4,6,37,75,59,71,25,33),
+(4,6,38,77,60,73,25,34),
+(4,6,39,79,61,74,25,34),
+(4,6,40,81,62,76,25,35),
+(4,6,41,82,63,78,26,35),
+(4,6,42,84,64,79,26,35),
+(4,6,43,86,66,81,26,36),
+(4,6,44,88,67,83,26,36),
+(4,6,45,90,68,85,26,37),
+(4,6,46,92,69,86,27,37),
+(4,6,47,94,70,88,27,38),
+(4,6,48,96,72,90,27,38),
+(4,6,49,98,73,92,27,39),
+(4,6,50,100,74,93,28,40),
+(4,6,51,101,75,94,28,40),
+(4,6,52,102,76,95,28,41),
+(4,6,53,103,77,96,28,41),
+(4,6,54,104,77,97,29,42),
+(4,6,55,105,78,98,29,42),
+(4,6,56,108,80,101,29,43),
+(4,6,57,113,81,103,29,43),
+(4,6,58,115,82,105,30,44),
+(4,6,59,115,84,107,30,44),
+(4,6,60,120,85,109,30,45),
+(4,6,61,122,86,111,30,46),
+(4,6,62,122,88,113,30,46),
+(4,6,63,127,89,116,31,47),
+(4,6,64,127,91,118,31,47),
+(4,6,65,133,92,120,31,48),
+(4,6,66,135,94,123,31,49),
+(4,6,67,136,95,125,32,49),
+(4,6,68,137,97,127,32,50),
+(4,6,69,140,98,130,32,51),
+(4,6,70,147,100,132,32,51),
+(4,6,71,154,102,135,33,52),
+(4,6,72,156,103,137,33,53),
+(4,6,73,157,105,140,33,54),
+(4,6,74,158,107,142,33,54),
+(4,6,75,161,108,145,34,55),
+(4,6,76,164,110,148,34,56),
+(4,6,77,167,112,150,34,57),
+(4,6,78,170,113,153,34,57),
+(4,6,79,172,115,156,35,58),
+(4,6,80,177,117,159,35,59),
+
+(4,11,1,18,25,19,22,22),
+(4,11,2,19,25,20,23,23),
+(4,11,3,19,26,20,24,24),
+(4,11,4,20,26,21,25,26),
+(4,11,5,20,27,22,26,27),
+(4,11,6,21,27,22,27,28),
+(4,11,7,21,28,23,28,29),
+(4,11,8,22,28,24,29,30),
+(4,11,9,23,29,24,30,32),
+(4,11,10,23,29,25,32,33),
+(4,11,11,24,30,26,33,34),
+(4,11,12,24,31,26,34,35),
+(4,11,13,25,31,27,35,37),
+(4,11,14,26,32,28,36,38),
+(4,11,15,26,32,29,37,39),
+(4,11,16,27,33,29,38,41),
+(4,11,17,28,33,30,40,42),
+(4,11,18,28,34,31,41,43),
+(4,11,19,29,35,32,42,45),
+(4,11,20,30,35,32,43,46),
+(4,11,21,30,36,33,45,48),
+(4,11,22,31,36,34,46,49),
+(4,11,23,32,37,35,47,51),
+(4,11,24,32,38,36,48,52),
+(4,11,25,33,38,36,50,53),
+(4,11,26,34,39,37,51,55),
+(4,11,27,35,40,38,52,56),
+(4,11,28,35,40,39,54,58),
+(4,11,29,36,41,40,55,59),
+(4,11,30,37,42,41,56,61),
+(4,11,31,38,42,42,58,62),
+(4,11,32,38,43,42,59,64),
+(4,11,33,39,44,43,60,66),
+(4,11,34,40,44,44,62,67),
+(4,11,35,41,45,45,63,69),
+(4,11,36,42,46,46,65,70),
+(4,11,37,42,47,47,66,72),
+(4,11,38,43,47,48,67,74),
+(4,11,39,44,48,49,69,75),
+(4,11,40,45,49,50,70,77),
+(4,11,41,46,50,51,72,79),
+(4,11,42,46,50,52,73,80),
+(4,11,43,47,51,53,75,82),
+(4,11,44,48,52,54,76,84),
+(4,11,45,49,53,55,78,85),
+(4,11,46,50,54,56,79,87),
+(4,11,47,51,54,57,81,89),
+(4,11,48,52,55,58,83,91),
+(4,11,49,53,56,59,84,93),
+(4,11,50,53,57,60,86,94),
+(4,11,51,54,58,61,87,96),
+(4,11,52,55,59,62,89,98),
+(4,11,53,56,59,63,91,100),
+(4,11,54,57,60,64,92,102),
+(4,11,55,58,61,65,94,103),
+(4,11,56,59,62,66,95,105),
+(4,11,57,60,63,67,97,107),
+(4,11,58,61,64,68,99,109),
+(4,11,59,62,65,69,101,111),
+(4,11,60,63,66,70,102,113),
+(4,11,61,64,66,72,104,115),
+(4,11,62,65,67,73,106,117),
+(4,11,63,66,68,74,107,119),
+(4,11,64,67,69,75,109,121),
+(4,11,65,68,70,76,111,123),
+(4,11,66,69,71,77,113,125),
+(4,11,67,70,72,78,115,127),
+(4,11,68,71,73,80,116,129),
+(4,11,69,72,74,81,118,131),
+(4,11,70,73,75,82,120,133),
+(4,11,71,75,76,83,122,135),
+(4,11,72,76,78,85,125,138),
+(4,11,73,77,79,86,127,140),
+(4,11,74,78,80,88,131,143),
+(4,11,75,80,81,89,133,145),
+(4,11,76,81,82,91,134,148),
+(4,11,77,82,83,92,136,151),
+(4,11,78,84,85,94,138,153),
+(4,11,79,85,86,95,141,156),
+(4,11,80,86,87,97,143,159),
+
+(5,1,1,22,18,23,18,25),
+(5,1,2,23,19,24,18,25),
+(5,1,3,25,20,25,18,26),
+(5,1,4,26,20,26,18,26),
+(5,1,5,27,21,28,18,26),
+(5,1,6,29,22,29,18,26),
+(5,1,7,30,23,30,19,27),
+(5,1,8,31,24,31,19,27),
+(5,1,9,33,25,33,19,27),
+(5,1,10,34,25,34,19,28),
+(5,1,11,35,26,35,19,28),
+(5,1,12,37,27,36,19,28),
+(5,1,13,38,28,38,19,28),
+(5,1,14,40,29,39,19,29),
+(5,1,15,41,30,40,19,29),
+(5,1,16,43,31,42,20,29),
+(5,1,17,44,32,43,20,30),
+(5,1,18,46,33,44,20,30),
+(5,1,19,47,34,46,20,31),
+(5,1,20,49,34,47,20,31),
+(5,1,21,50,35,49,20,31),
+(5,1,22,52,36,50,20,32),
+(5,1,23,53,37,51,21,32),
+(5,1,24,55,38,53,21,32),
+(5,1,25,57,39,54,21,33),
+(5,1,26,58,40,56,21,33),
+(5,1,27,60,41,57,21,34),
+(5,1,28,62,42,59,21,34),
+(5,1,29,63,43,60,21,34),
+(5,1,30,65,44,62,22,35),
+(5,1,31,67,46,63,22,35),
+(5,1,32,68,47,65,22,36),
+(5,1,33,70,48,67,22,36),
+(5,1,34,72,49,68,22,36),
+(5,1,35,74,50,70,23,37),
+(5,1,36,75,51,71,23,37),
+(5,1,37,77,52,73,23,38),
+(5,1,38,79,53,75,23,38),
+(5,1,39,81,54,76,23,39),
+(5,1,40,83,55,78,24,39),
+(5,1,41,84,57,80,24,40),
+(5,1,42,86,58,81,24,40),
+(5,1,43,88,59,83,24,41),
+(5,1,44,90,60,85,24,41),
+(5,1,45,92,61,86,25,42),
+(5,1,46,94,62,88,25,42),
+(5,1,47,96,64,90,25,43),
+(5,1,48,98,65,92,25,43),
+(5,1,49,100,66,93,25,44),
+(5,1,50,102,67,95,26,44),
+(5,1,51,104,69,97,26,45),
+(5,1,52,106,70,99,26,45),
+(5,1,53,108,71,101,26,46),
+(5,1,54,110,72,103,27,46),
+(5,1,55,112,74,104,27,47),
+(5,1,56,114,75,106,27,48),
+(5,1,57,116,76,108,27,48),
+(5,1,58,118,78,110,28,49),
+(5,1,59,120,79,112,28,49),
+(5,1,60,122,80,114,28,50),
+(5,1,61,124,82,116,28,50),
+(5,1,62,126,83,118,29,51),
+(5,1,63,128,84,120,29,52),
+(5,1,64,131,86,122,29,52),
+(5,1,65,133,87,124,30,53),
+(5,1,66,135,88,126,30,53),
+(5,1,67,137,90,128,30,54),
+(5,1,68,139,91,130,30,55),
+(5,1,69,142,93,132,31,55),
+(5,1,70,144,94,134,31,56),
+(5,1,71,147,95,136,31,57),
+(5,1,72,150,97,139,31,58),
+(5,1,73,152,99,141,31,59),
+(5,1,74,155,100,144,32,59),
+(5,1,75,158,102,146,32,60),
+(5,1,76,163,104,149,32,61),
+(5,1,77,167,106,152,33,62),
+(5,1,78,167,107,154,33,62),
+(5,1,79,170,109,157,33,63),
+(5,1,80,173,111,160,34,64),
+
+(5,4,1,20,21,22,18,25),
+(5,4,2,21,22,23,18,25),
+(5,4,3,22,24,23,18,26),
+(5,4,4,22,25,24,18,26),
+(5,4,5,23,27,25,19,26),
+(5,4,6,24,28,25,19,27),
+(5,4,7,25,30,26,19,27),
+(5,4,8,25,31,27,19,27),
+(5,4,9,26,33,28,19,28),
+(5,4,10,27,34,28,19,28),
+(5,4,11,28,36,29,20,29),
+(5,4,12,29,38,30,20,29),
+(5,4,13,30,39,31,20,29),
+(5,4,14,31,41,32,20,30),
+(5,4,15,31,42,32,20,30),
+(5,4,16,32,44,33,21,31),
+(5,4,17,33,46,34,21,31),
+(5,4,18,34,47,35,21,32),
+(5,4,19,35,49,36,21,32),
+(5,4,20,36,51,36,21,32),
+(5,4,21,37,52,37,22,33),
+(5,4,22,38,54,38,22,33),
+(5,4,23,39,56,39,22,34),
+(5,4,24,40,58,40,22,34),
+(5,4,25,41,60,41,23,35),
+(5,4,26,42,61,42,23,35),
+(5,4,27,43,63,43,23,36),
+(5,4,28,44,65,44,23,36),
+(5,4,29,45,67,44,24,37),
+(5,4,30,46,69,45,24,37),
+(5,4,31,47,71,46,24,38),
+(5,4,32,48,72,47,24,38),
+(5,4,33,49,74,48,25,39),
+(5,4,34,50,76,49,25,39),
+(5,4,35,51,78,50,25,40),
+(5,4,36,52,80,51,25,41),
+(5,4,37,53,82,52,26,41),
+(5,4,38,54,84,53,26,42),
+(5,4,39,55,86,54,26,42),
+(5,4,40,56,88,55,27,43),
+(5,4,41,57,90,56,27,43),
+(5,4,42,59,92,57,27,44),
+(5,4,43,60,94,58,27,45),
+(5,4,44,61,96,59,28,45),
+(5,4,45,62,99,60,28,46),
+(5,4,46,63,101,61,28,46),
+(5,4,47,64,103,63,29,47),
+(5,4,48,66,105,64,29,48),
+(5,4,49,67,107,65,29,48),
+(5,4,50,68,109,66,30,49),
+(5,4,51,69,111,67,30,50),
+(5,4,52,70,114,68,30,50),
+(5,4,53,72,116,69,31,51),
+(5,4,54,73,118,70,31,52),
+(5,4,55,74,120,72,31,52),
+(5,4,56,75,123,73,32,53),
+(5,4,57,77,125,74,32,54),
+(5,4,58,78,127,75,32,54),
+(5,4,59,79,130,76,33,55),
+(5,4,60,81,132,77,33,56),
+(5,4,61,82,134,79,34,56),
+(5,4,62,83,137,80,34,57),
+(5,4,63,84,139,81,34,58),
+(5,4,64,86,141,82,35,59),
+(5,4,65,87,144,84,35,59),
+(5,4,66,88,146,85,35,60),
+(5,4,67,90,149,86,36,61),
+(5,4,68,91,151,87,36,61),
+(5,4,69,93,154,89,37,62),
+(5,4,70,94,156,90,37,63),
+(5,4,71,96,159,91,37,64),
+(5,4,72,98,162,93,38,64),
+(5,4,73,99,165,95,38,65),
+(5,4,74,101,168,96,39,66),
+(5,4,75,103,171,98,39,67),
+(5,4,76,104,174,99,39,68),
+(5,4,77,106,177,101,40,69),
+(5,4,78,108,181,103,40,70),
+(5,4,79,110,184,104,41,71),
+(5,4,80,112,187,106,41,72),
+
+(5,5,1,19,18,21,20,28),
+(5,5,2,19,18,21,21,29),
+(5,5,3,19,18,22,23,31),
+(5,5,4,19,19,22,24,32),
+(5,5,5,20,19,22,25,33),
+(5,5,6,20,19,23,27,35),
+(5,5,7,20,19,23,28,36),
+(5,5,8,20,20,24,29,38),
+(5,5,9,20,20,24,31,39),
+(5,5,10,20,20,24,32,40),
+(5,5,11,21,20,25,34,42),
+(5,5,12,21,21,25,35,43),
+(5,5,13,21,21,26,37,45),
+(5,5,14,21,21,26,38,46),
+(5,5,15,21,21,26,39,48),
+(5,5,16,22,22,27,41,50),
+(5,5,17,22,22,27,42,51),
+(5,5,18,22,22,28,44,53),
+(5,5,19,22,23,28,46,54),
+(5,5,20,22,23,29,47,56),
+(5,5,21,23,23,29,49,57),
+(5,5,22,23,23,30,50,59),
+(5,5,23,23,24,30,52,61),
+(5,5,24,23,24,31,53,62),
+(5,5,25,24,24,31,55,64),
+(5,5,26,24,25,32,57,66),
+(5,5,27,24,25,32,58,68),
+(5,5,28,24,25,33,60,69),
+(5,5,29,25,26,33,62,71),
+(5,5,30,25,26,34,63,73),
+(5,5,31,25,26,34,65,75),
+(5,5,32,25,27,35,67,76),
+(5,5,33,26,27,35,69,78),
+(5,5,34,26,27,36,70,80),
+(5,5,35,26,28,36,72,82),
+(5,5,36,26,28,37,74,84),
+(5,5,37,27,28,37,76,86),
+(5,5,38,27,29,38,77,87),
+(5,5,39,27,29,38,79,89),
+(5,5,40,28,30,39,81,91),
+(5,5,41,28,30,40,83,93),
+(5,5,42,28,30,40,85,95),
+(5,5,43,28,31,41,87,97),
+(5,5,44,29,31,41,89,99),
+(5,5,45,29,32,42,91,101),
+(5,5,46,29,32,43,92,103),
+(5,5,47,30,32,43,94,105),
+(5,5,48,30,33,44,96,107),
+(5,5,49,30,33,44,98,109),
+(5,5,50,31,34,45,100,111),
+(5,5,51,31,34,46,102,113),
+(5,5,52,31,35,46,104,115),
+(5,5,53,32,35,47,106,118),
+(5,5,54,32,35,48,108,120),
+(5,5,55,32,36,48,110,122),
+(5,5,56,33,36,49,113,124),
+(5,5,57,33,37,50,115,126),
+(5,5,58,33,37,50,117,128),
+(5,5,59,34,38,51,119,131),
+(5,5,60,34,38,52,121,133),
+(5,5,61,34,39,52,123,135),
+(5,5,62,35,39,53,125,137),
+(5,5,63,35,40,54,127,140),
+(5,5,64,36,40,55,130,142),
+(5,5,65,36,41,55,132,144),
+(5,5,66,36,41,56,134,147),
+(5,5,67,37,41,57,136,149),
+(5,5,68,37,42,58,138,151),
+(5,5,69,38,42,58,141,154),
+(5,5,70,38,43,59,143,156),
+(5,5,71,38,44,60,146,159),
+(5,5,72,39,44,60,149,162),
+(5,5,73,39,45,61,152,165),
+(5,5,74,40,45,62,157,168),
+(5,5,75,40,46,63,157,171),
+(5,5,76,40,47,64,160,174),
+(5,5,77,41,47,65,163,177),
+(5,5,78,41,48,66,166,180),
+(5,5,79,42,48,67,169,183),
+(5,5,80,42,49,68,172,186),
+
+(5,6,1,22,18,23,18,25),
+(5,6,2,23,19,24,18,25),
+(5,6,3,25,20,25,18,26),
+(5,6,4,26,20,26,18,26),
+(5,6,5,27,21,28,18,26),
+(5,6,6,29,22,29,18,26),
+(5,6,7,30,23,30,19,27),
+(5,6,8,31,24,31,19,27),
+(5,6,9,33,25,33,19,27),
+(5,6,10,34,25,34,19,28),
+(5,6,11,35,26,35,19,28),
+(5,6,12,37,27,36,19,28),
+(5,6,13,38,28,38,19,28),
+(5,6,14,40,29,39,19,29),
+(5,6,15,41,30,40,19,29),
+(5,6,16,43,31,42,20,29),
+(5,6,17,44,32,43,20,30),
+(5,6,18,46,33,44,20,30),
+(5,6,19,47,34,46,20,31),
+(5,6,20,49,34,47,20,31),
+(5,6,21,50,35,49,20,31),
+(5,6,22,52,36,50,20,32),
+(5,6,23,53,37,51,21,32),
+(5,6,24,55,38,53,21,32),
+(5,6,25,57,39,54,21,33),
+(5,6,26,58,40,56,21,33),
+(5,6,27,60,41,57,21,34),
+(5,6,28,62,42,59,21,34),
+(5,6,29,63,43,60,21,34),
+(5,6,30,65,44,62,22,35),
+(5,6,31,67,46,63,22,35),
+(5,6,32,68,47,65,22,36),
+(5,6,33,70,48,67,22,36),
+(5,6,34,72,49,68,22,36),
+(5,6,35,74,50,70,23,37),
+(5,6,36,75,51,71,23,37),
+(5,6,37,77,52,73,23,38),
+(5,6,38,79,53,75,23,38),
+(5,6,39,81,54,76,23,39),
+(5,6,40,83,55,78,24,39),
+(5,6,41,84,57,80,24,40),
+(5,6,42,86,58,81,24,40),
+(5,6,43,88,59,83,24,41),
+(5,6,44,90,60,85,24,41),
+(5,6,45,92,61,86,25,42),
+(5,6,46,94,62,88,25,42),
+(5,6,47,96,64,90,25,43),
+(5,6,48,98,65,92,25,43),
+(5,6,49,100,66,93,25,44),
+(5,6,50,102,67,95,26,44),
+(5,6,51,103,67,96,26,45),
+(5,6,52,104,68,97,26,45),
+(5,6,53,105,69,98,26,46),
+(5,6,54,106,70,99,27,46),
+(5,6,55,107,71,100,27,47),
+(5,6,56,110,73,103,27,48),
+(5,6,57,112,74,105,27,48),
+(5,6,58,114,75,107,28,49),
+(5,6,59,119,77,109,28,49),
+(5,6,60,122,78,111,28,50),
+(5,6,61,124,79,113,28,51),
+(5,6,62,127,81,115,28,51),
+(5,6,63,129,82,118,29,52),
+(5,6,64,136,84,120,29,52),
+(5,6,65,137,85,123,29,53),
+(5,6,66,138,87,125,29,54),
+(5,6,67,141,88,127,30,54),
+(5,6,68,143,90,129,30,55),
+(5,6,69,146,91,132,30,56),
+(5,6,70,149,93,134,30,56),
+(5,6,71,152,95,137,31,57),
+(5,6,72,154,96,139,31,58),
+(5,6,73,157,98,142,31,59),
+(5,6,74,158,100,145,31,59),
+(5,6,75,159,101,147,32,60),
+(5,6,76,162,103,150,32,61),
+(5,6,77,167,105,152,32,62),
+(5,6,78,173,106,155,32,62),
+(5,6,79,174,108,158,33,63),
+(5,6,80,174,110,161,33,64),
+
+(5,8,1,19,18,21,21,27),
+(5,8,2,19,18,21,22,28),
+(5,8,3,19,18,22,24,30),
+(5,8,4,19,18,22,25,31),
+(5,8,5,19,19,22,26,32),
+(5,8,6,19,19,22,28,34),
+(5,8,7,20,19,23,29,35),
+(5,8,8,20,19,23,31,36),
+(5,8,9,20,19,23,32,38),
+(5,8,10,20,19,24,34,39),
+(5,8,11,20,20,24,35,40),
+(5,8,12,20,20,24,37,42),
+(5,8,13,20,20,25,38,43),
+(5,8,14,20,20,25,40,45),
+(5,8,15,20,20,25,41,46),
+(5,8,16,21,21,26,43,48),
+(5,8,17,21,21,26,44,49),
+(5,8,18,21,21,26,46,51),
+(5,8,19,21,21,27,48,52),
+(5,8,20,21,21,27,49,54),
+(5,8,21,21,22,27,51,55),
+(5,8,22,21,22,28,52,57),
+(5,8,23,21,22,28,54,58),
+(5,8,24,22,22,29,56,60),
+(5,8,25,22,23,29,57,62),
+(5,8,26,22,23,29,59,63),
+(5,8,27,22,23,30,61,65),
+(5,8,28,22,23,30,63,67),
+(5,8,29,22,24,31,64,68),
+(5,8,30,23,24,31,66,70),
+(5,8,31,23,24,31,68,72),
+(5,8,32,23,24,32,70,73),
+(5,8,33,23,25,32,72,75),
+(5,8,34,23,25,33,73,77),
+(5,8,35,24,25,33,75,79),
+(5,8,36,24,25,34,77,80),
+(5,8,37,24,26,34,79,82),
+(5,8,38,24,26,35,81,84),
+(5,8,39,24,26,35,83,86),
+(5,8,40,24,27,35,85,88),
+(5,8,41,25,27,36,87,90),
+(5,8,42,25,27,36,89,91),
+(5,8,43,25,27,37,90,93),
+(5,8,44,25,28,37,92,95),
+(5,8,45,26,28,38,94,97),
+(5,8,46,26,28,38,96,99),
+(5,8,47,26,29,39,98,101),
+(5,8,48,26,29,39,100,103),
+(5,8,49,26,29,40,103,105),
+(5,8,50,27,30,40,105,107),
+(5,8,51,27,30,41,107,109),
+(5,8,52,27,30,42,109,111),
+(5,8,53,27,31,42,111,113),
+(5,8,54,28,31,43,113,115),
+(5,8,55,28,31,43,115,117),
+(5,8,56,28,32,44,117,119),
+(5,8,57,28,32,44,119,121),
+(5,8,58,29,32,45,122,123),
+(5,8,59,29,33,45,124,126),
+(5,8,60,29,33,46,126,128),
+(5,8,61,29,34,47,128,130),
+(5,8,62,30,34,47,131,132),
+(5,8,63,30,34,48,133,134),
+(5,8,64,30,35,48,135,136),
+(5,8,65,31,35,49,137,139),
+(5,8,66,31,35,50,140,141),
+(5,8,67,31,36,50,142,143),
+(5,8,68,31,36,51,144,145),
+(5,8,69,32,37,51,147,148),
+(5,8,70,32,37,52,149,150),
+(5,8,71,32,37,53,152,153),
+(5,8,72,32,38,54,155,156),
+(5,8,73,32,38,55,158,159),
+(5,8,74,33,39,55,161,161),
+(5,8,75,33,39,56,164,164),
+(5,8,76,33,39,57,167,167),
+(5,8,77,34,40,58,170,170),
+(5,8,78,34,40,58,173,173),
+(5,8,79,34,41,59,176,176),
+(5,8,80,35,41,60,179,179),
+
+(5,9,1,19,18,22,20,27),
+(5,9,2,19,18,23,21,28),
+(5,9,3,20,19,23,22,29),
+(5,9,4,20,19,24,24,30),
+(5,9,5,20,19,24,25,32),
+(5,9,6,20,20,25,26,33),
+(5,9,7,21,20,25,27,34),
+(5,9,8,21,21,26,28,35),
+(5,9,9,21,21,26,30,36),
+(5,9,10,22,21,27,31,38),
+(5,9,11,22,22,28,32,39),
+(5,9,12,22,22,28,34,40),
+(5,9,13,23,23,29,35,41),
+(5,9,14,23,23,30,36,43),
+(5,9,15,23,24,30,37,44),
+(5,9,16,24,24,31,39,45),
+(5,9,17,24,24,31,40,47),
+(5,9,18,24,25,32,42,48),
+(5,9,19,25,25,33,43,49),
+(5,9,20,25,26,33,44,51),
+(5,9,21,26,26,34,46,52),
+(5,9,22,26,27,35,47,53),
+(5,9,23,26,27,36,49,55),
+(5,9,24,27,28,36,50,56),
+(5,9,25,27,28,37,52,58),
+(5,9,26,27,29,38,53,59),
+(5,9,27,28,29,38,55,60),
+(5,9,28,28,30,39,56,62),
+(5,9,29,29,30,40,58,63),
+(5,9,30,29,31,41,59,65),
+(5,9,31,30,31,41,61,66),
+(5,9,32,30,32,42,62,68),
+(5,9,33,30,32,43,64,69),
+(5,9,34,31,33,44,65,71),
+(5,9,35,31,33,45,67,73),
+(5,9,36,32,34,45,69,74),
+(5,9,37,32,34,46,70,76),
+(5,9,38,33,35,47,72,77),
+(5,9,39,33,36,48,73,79),
+(5,9,40,34,36,49,75,81),
+(5,9,41,34,37,49,77,82),
+(5,9,42,35,37,50,78,84),
+(5,9,43,35,38,51,80,86),
+(5,9,44,36,39,52,82,87),
+(5,9,45,36,39,53,84,89),
+(5,9,46,37,40,54,85,91),
+(5,9,47,37,40,55,87,92),
+(5,9,48,38,41,55,89,94),
+(5,9,49,38,42,56,91,96),
+(5,9,50,39,42,57,92,98),
+(5,9,51,39,43,58,94,100),
+(5,9,52,40,44,59,96,101),
+(5,9,53,40,44,60,98,103),
+(5,9,54,41,45,61,100,105),
+(5,9,55,41,45,62,102,107),
+(5,9,56,42,46,63,103,109),
+(5,9,57,42,47,64,105,111),
+(5,9,58,43,47,65,107,112),
+(5,9,59,43,48,66,109,114),
+(5,9,60,44,49,67,111,116),
+(5,9,61,45,50,68,113,118),
+(5,9,62,45,50,69,115,120),
+(5,9,63,46,51,70,117,122),
+(5,9,64,46,52,71,119,124),
+(5,9,65,47,52,72,121,126),
+(5,9,66,48,53,73,123,128),
+(5,9,67,48,54,74,125,130),
+(5,9,68,49,55,75,127,132),
+(5,9,69,49,55,76,129,134),
+(5,9,70,50,56,77,131,136),
+(5,9,71,51,57,86,135,147),
+(5,9,72,52,57,88,136,149),
+(5,9,73,53,58,89,138,152),
+(5,9,74,53,59,90,141,155),
+(5,9,75,54,60,92,143,157),
+(5,9,76,55,61,93,146,160),
+(5,9,77,56,62,94,149,163),
+(5,9,78,56,63,96,151,166),
+(5,9,79,57,64,97,154,169),
+(5,9,80,58,65,99,157,171),
+
+(6,1,1,28,15,24,15,22),
+(6,1,2,29,16,25,15,22),
+(6,1,3,31,17,26,15,23),
+(6,1,4,32,17,27,15,23),
+(6,1,5,33,18,29,15,23),
+(6,1,6,34,19,30,15,23),
+(6,1,7,36,20,31,16,24),
+(6,1,8,37,21,32,16,24),
+(6,1,9,38,22,34,16,24),
+(6,1,10,40,22,35,16,25),
+(6,1,11,41,23,36,16,25),
+(6,1,12,43,24,37,16,25),
+(6,1,13,44,25,39,16,26),
+(6,1,14,46,26,40,16,26),
+(6,1,15,47,27,41,17,26),
+(6,1,16,48,28,43,17,27),
+(6,1,17,50,29,44,17,27),
+(6,1,18,51,30,45,17,27),
+(6,1,19,53,31,47,17,28),
+(6,1,20,54,32,48,17,28),
+(6,1,21,56,33,50,17,28),
+(6,1,22,58,34,51,18,29),
+(6,1,23,59,35,52,18,29),
+(6,1,24,61,36,54,18,30),
+(6,1,25,62,37,55,18,30),
+(6,1,26,64,38,57,18,30),
+(6,1,27,66,39,58,18,31),
+(6,1,28,67,40,60,18,31),
+(6,1,29,69,41,61,19,32),
+(6,1,30,71,42,63,19,32),
+(6,1,31,72,43,64,19,32),
+(6,1,32,74,44,66,19,33),
+(6,1,33,76,45,67,19,33),
+(6,1,34,77,46,69,20,34),
+(6,1,35,79,47,71,20,34),
+(6,1,36,81,48,72,20,35),
+(6,1,37,83,49,74,20,35),
+(6,1,38,85,50,76,20,35),
+(6,1,39,86,51,77,21,36),
+(6,1,40,88,53,79,21,36),
+(6,1,41,90,54,81,21,37),
+(6,1,42,92,55,82,21,37),
+(6,1,43,94,56,84,21,38),
+(6,1,44,96,57,86,22,38),
+(6,1,45,98,58,87,22,39),
+(6,1,46,99,60,89,22,39),
+(6,1,47,101,61,91,22,40),
+(6,1,48,103,62,93,22,40),
+(6,1,49,105,63,94,23,41),
+(6,1,50,107,65,96,23,41),
+(6,1,51,109,66,98,23,42),
+(6,1,52,111,67,100,23,42),
+(6,1,53,113,68,102,24,43),
+(6,1,54,115,70,104,24,44),
+(6,1,55,117,71,105,24,44),
+(6,1,56,119,72,107,24,45),
+(6,1,57,122,73,109,25,45),
+(6,1,58,124,75,111,25,46),
+(6,1,59,126,76,113,25,46),
+(6,1,60,128,77,115,25,47),
+(6,1,61,130,79,117,26,48),
+(6,1,62,132,80,119,26,48),
+(6,1,63,134,81,121,26,49),
+(6,1,64,137,83,123,26,49),
+(6,1,65,139,84,125,27,50),
+(6,1,66,141,85,127,27,51),
+(6,1,67,143,87,129,27,51),
+(6,1,68,145,88,131,27,52),
+(6,1,69,148,90,133,28,52),
+(6,1,70,150,91,135,28,53),
+(6,1,71,153,92,137,28,54),
+(6,1,72,155,94,140,28,55),
+(6,1,73,158,96,142,28,56),
+(6,1,74,161,97,145,29,56),
+(6,1,75,164,99,147,29,57),
+(6,1,76,167,101,150,29,58),
+(6,1,77,170,103,153,30,59),
+(6,1,78,173,104,155,30,59),
+(6,1,79,176,106,164,30,60),
+(6,1,80,179,108,170,31,61),
+
+(6,3,1,25,18,23,15,23),
+(6,3,2,25,19,24,16,24),
+(6,3,3,26,21,25,16,24),
+(6,3,4,26,22,26,17,25),
+(6,3,5,27,24,27,17,25),
+(6,3,6,27,25,28,18,26),
+(6,3,7,28,26,28,19,27),
+(6,3,8,28,28,29,19,27),
+(6,3,9,28,29,30,20,28),
+(6,3,10,29,31,31,20,29),
+(6,3,11,29,32,32,21,29),
+(6,3,12,30,34,33,22,30),
+(6,3,13,30,35,34,22,31),
+(6,3,14,31,37,35,23,32),
+(6,3,15,31,38,36,24,32),
+(6,3,16,32,40,37,24,33),
+(6,3,17,32,41,39,25,34),
+(6,3,18,33,43,40,26,35),
+(6,3,19,33,45,41,27,35),
+(6,3,20,34,46,42,27,36),
+(6,3,21,34,48,43,28,37),
+(6,3,22,35,50,44,29,38),
+(6,3,23,35,51,45,29,38),
+(6,3,24,36,53,46,30,39),
+(6,3,25,37,55,47,31,40),
+(6,3,26,37,56,48,32,41),
+(6,3,27,38,58,50,32,42),
+(6,3,28,38,60,51,33,42),
+(6,3,29,39,62,52,34,43),
+(6,3,30,39,63,53,35,44),
+(6,3,31,40,65,54,36,45),
+(6,3,32,41,67,56,36,46),
+(6,3,33,41,69,57,37,47),
+(6,3,34,42,71,58,38,48),
+(6,3,35,43,72,59,39,48),
+(6,3,36,43,74,61,40,49),
+(6,3,37,44,76,62,40,50),
+(6,3,38,45,78,63,41,51),
+(6,3,39,45,80,64,42,52),
+(6,3,40,46,82,66,43,53),
+(6,3,41,47,84,67,44,54),
+(6,3,42,47,86,68,45,55),
+(6,3,43,48,88,70,46,56),
+(6,3,44,49,90,71,46,57),
+(6,3,45,49,92,72,47,58),
+(6,3,46,50,94,74,48,59),
+(6,3,47,51,96,75,49,60),
+(6,3,48,51,98,77,50,61),
+(6,3,49,52,100,78,51,62),
+(6,3,50,53,102,79,52,63),
+(6,3,51,54,104,81,53,64),
+(6,3,52,54,106,82,54,65),
+(6,3,53,55,108,84,55,66),
+(6,3,54,56,110,85,56,67),
+(6,3,55,57,112,87,57,68),
+(6,3,56,57,114,88,58,69),
+(6,3,57,58,117,90,59,70),
+(6,3,58,59,119,91,60,71),
+(6,3,59,60,121,93,61,72),
+(6,3,60,61,123,94,62,74),
+(6,3,61,61,125,96,63,75),
+(6,3,62,62,128,97,64,76),
+(6,3,63,63,130,99,65,77),
+(6,3,64,64,132,100,66,78),
+(6,3,65,65,134,102,67,79),
+(6,3,66,66,137,104,68,80),
+(6,3,67,66,139,105,69,81),
+(6,3,68,67,141,107,70,83),
+(6,3,69,68,144,108,71,84),
+(6,3,70,69,146,110,72,85),
+(6,3,71,70,149,112,73,86),
+(6,3,72,71,152,114,74,87),
+(6,3,73,72,155,116,75,89),
+(6,3,74,73,158,118,77,90),
+(6,3,75,74,161,120,78,92),
+(6,3,76,75,164,122,79,93),
+(6,3,77,76,167,124,81,95),
+(6,3,78,77,176,126,85,96),
+(6,3,79,78,179,128,86,98),
+(6,3,80,79,183,130,88,99),
+
+(6,6,1,28,15,24,15,22),
+(6,6,2,29,16,25,15,22),
+(6,6,3,31,17,26,15,23),
+(6,6,4,32,17,27,15,23),
+(6,6,5,33,18,29,15,23),
+(6,6,6,34,19,30,15,23),
+(6,6,7,36,20,31,16,24),
+(6,6,8,37,21,32,16,24),
+(6,6,9,38,22,34,16,24),
+(6,6,10,40,22,35,16,25),
+(6,6,11,41,23,36,16,25),
+(6,6,12,43,24,37,16,25),
+(6,6,13,44,25,39,16,26),
+(6,6,14,46,26,40,16,26),
+(6,6,15,47,27,41,17,26),
+(6,6,16,48,28,43,17,27),
+(6,6,17,50,29,44,17,27),
+(6,6,18,51,30,45,17,27),
+(6,6,19,53,31,47,17,28),
+(6,6,20,54,32,48,17,28),
+(6,6,21,56,33,50,17,28),
+(6,6,22,58,34,51,18,29),
+(6,6,23,59,35,52,18,29),
+(6,6,24,61,36,54,18,30),
+(6,6,25,62,37,55,18,30),
+(6,6,26,64,38,57,18,30),
+(6,6,27,66,39,58,18,31),
+(6,6,28,67,40,60,18,31),
+(6,6,29,69,41,61,19,32),
+(6,6,30,71,42,63,19,32),
+(6,6,31,72,43,64,19,32),
+(6,6,32,74,44,66,19,33),
+(6,6,33,76,45,67,19,33),
+(6,6,34,77,46,69,20,34),
+(6,6,35,79,47,71,20,34),
+(6,6,36,81,48,72,20,35),
+(6,6,37,83,49,74,20,35),
+(6,6,38,85,50,76,20,35),
+(6,6,39,86,51,77,21,36),
+(6,6,40,88,53,79,21,36),
+(6,6,41,90,54,81,21,37),
+(6,6,42,92,55,82,21,37),
+(6,6,43,94,56,84,21,38),
+(6,6,44,96,57,86,22,38),
+(6,6,45,98,58,87,22,39),
+(6,6,46,99,60,89,22,39),
+(6,6,47,101,60,91,22,40),
+(6,6,48,103,61,93,22,40),
+(6,6,49,105,62,94,23,41),
+(6,6,50,107,63,96,23,41),
+(6,6,51,109,64,97,23,42),
+(6,6,52,110,65,98,23,42),
+(6,6,53,111,66,99,24,43),
+(6,6,54,112,67,100,24,44),
+(6,6,55,113,68,101,24,44),
+(6,6,56,116,70,104,24,45),
+(6,6,57,121,71,106,24,45),
+(6,6,58,123,72,108,25,46),
+(6,6,59,123,74,110,25,46),
+(6,6,60,125,75,112,25,47),
+(6,6,61,127,76,114,25,48),
+(6,6,62,133,78,116,25,48),
+(6,6,63,135,79,119,26,49),
+(6,6,64,139,81,121,26,49),
+(6,6,65,142,82,123,26,50),
+(6,6,66,146,84,126,26,51),
+(6,6,67,150,85,132,27,51),
+(6,6,68,153,87,137,27,52),
+(6,6,69,157,88,140,27,53),
+(6,6,70,160,90,143,27,53),
+(6,6,71,163,92,146,28,54),
+(6,6,72,165,93,148,28,55),
+(6,6,73,167,95,150,28,56),
+(6,6,74,171,97,153,28,56),
+(6,6,75,174,98,156,29,57),
+(6,6,76,178,100,156,29,58),
+(6,6,77,179,102,156,29,59),
+(6,6,78,179,103,156,29,59),
+(6,6,79,182,105,159,30,60),
+(6,6,80,185,107,162,30,61),
+
+(6,7,1,26,15,23,16,24),
+(6,7,2,27,15,24,17,25),
+(6,7,3,28,16,25,18,26),
+(6,7,4,28,16,26,19,27),
+(6,7,5,29,17,27,20,28),
+(6,7,6,30,17,28,21,29),
+(6,7,7,31,18,29,22,30),
+(6,7,8,32,18,30,23,31),
+(6,7,9,33,19,31,24,32),
+(6,7,10,34,19,32,25,33),
+(6,7,11,35,20,33,26,35),
+(6,7,12,35,20,34,27,36),
+(6,7,13,36,21,35,28,37),
+(6,7,14,37,21,36,29,38),
+(6,7,15,38,22,37,30,39),
+(6,7,16,39,22,39,31,40),
+(6,7,17,40,23,40,32,42),
+(6,7,18,41,23,41,33,43),
+(6,7,19,42,24,42,34,44),
+(6,7,20,43,24,43,35,45),
+(6,7,21,44,25,44,36,46),
+(6,7,22,45,25,45,37,48),
+(6,7,23,46,26,47,38,49),
+(6,7,24,47,27,48,40,50),
+(6,7,25,48,27,49,41,51),
+(6,7,26,49,28,50,42,53),
+(6,7,27,51,28,52,43,54),
+(6,7,28,52,29,53,44,55),
+(6,7,29,53,29,54,45,57),
+(6,7,30,54,30,55,47,58),
+(6,7,31,55,31,57,48,59),
+(6,7,32,56,31,58,49,61),
+(6,7,33,57,32,59,50,62),
+(6,7,34,58,33,61,51,64),
+(6,7,35,60,33,62,53,65),
+(6,7,36,61,34,63,54,66),
+(6,7,37,62,34,65,55,68),
+(6,7,38,63,35,66,57,69),
+(6,7,39,64,36,67,58,71),
+(6,7,40,66,36,69,59,72),
+(6,7,41,67,37,70,60,74),
+(6,7,42,68,38,72,62,75),
+(6,7,43,69,38,73,63,77),
+(6,7,44,70,39,74,64,78),
+(6,7,45,72,40,76,66,80),
+(6,7,46,73,41,77,67,81),
+(6,7,47,74,41,79,69,83),
+(6,7,48,76,42,80,70,84),
+(6,7,49,77,43,82,71,86),
+(6,7,50,78,43,83,73,88),
+(6,7,51,80,44,85,74,89),
+(6,7,52,81,45,86,76,91),
+(6,7,53,82,46,88,77,92),
+(6,7,54,84,46,90,78,94),
+(6,7,55,85,47,91,80,96),
+(6,7,56,86,48,93,81,97),
+(6,7,57,88,49,94,83,99),
+(6,7,58,89,49,96,84,101),
+(6,7,59,91,50,97,86,102),
+(6,7,60,92,51,99,87,104),
+(6,7,61,94,52,101,89,106),
+(6,7,62,95,52,102,90,108),
+(6,7,63,96,53,104,92,109),
+(6,7,64,98,54,106,93,111),
+(6,7,65,99,55,107,95,113),
+(6,7,66,101,56,109,97,115),
+(6,7,67,102,57,111,98,117),
+(6,7,68,104,57,113,100,118),
+(6,7,69,105,58,114,101,120),
+(6,7,70,107,59,116,103,122),
+(6,7,71,108,60,118,113,124),
+(6,7,72,110,61,120,117,127),
+(6,7,73,112,62,122,119,129),
+(6,7,74,114,63,125,122,131),
+(6,7,75,116,64,127,124,133),
+(6,7,76,118,65,129,126,136),
+(6,7,77,119,66,131,128,138),
+(6,7,78,121,67,133,130,140),
+(6,7,79,123,68,136,133,143),
+(6,7,80,125,69,138,135,145),
+
+(6,11,1,26,15,22,17,24),
+(6,11,2,27,16,23,18,25),
+(6,11,3,27,16,23,19,26),
+(6,11,4,28,17,24,20,27),
+(6,11,5,28,17,25,21,29),
+(6,11,6,29,18,25,22,30),
+(6,11,7,29,18,26,23,31),
+(6,11,8,30,19,27,24,32),
+(6,11,9,30,19,27,26,34),
+(6,11,10,31,20,28,27,35),
+(6,11,11,32,20,29,28,36),
+(6,11,12,32,21,29,29,37),
+(6,11,13,33,21,30,30,39),
+(6,11,14,33,22,31,31,40),
+(6,11,15,34,23,32,32,41),
+(6,11,16,35,23,32,34,43),
+(6,11,17,35,24,33,35,44),
+(6,11,18,36,24,34,36,45),
+(6,11,19,37,25,35,37,47),
+(6,11,20,37,26,35,39,48),
+(6,11,21,38,26,36,40,50),
+(6,11,22,39,27,37,41,51),
+(6,11,23,39,28,38,42,52),
+(6,11,24,40,28,39,44,54),
+(6,11,25,41,29,39,45,55),
+(6,11,26,41,30,40,46,57),
+(6,11,27,42,30,41,47,58),
+(6,11,28,43,31,42,49,60),
+(6,11,29,44,32,43,50,61),
+(6,11,30,44,32,44,52,63),
+(6,11,31,45,33,44,53,64),
+(6,11,32,46,34,45,54,66),
+(6,11,33,47,34,46,56,67),
+(6,11,34,47,35,47,57,69),
+(6,11,35,48,36,48,58,71),
+(6,11,36,49,36,49,60,72),
+(6,11,37,50,37,50,61,74),
+(6,11,38,51,38,51,63,76),
+(6,11,39,52,39,52,64,77),
+(6,11,40,52,39,53,66,79),
+(6,11,41,53,40,54,67,81),
+(6,11,42,54,41,55,69,82),
+(6,11,43,55,42,56,70,84),
+(6,11,44,56,43,57,72,86),
+(6,11,45,57,43,57,73,87),
+(6,11,46,57,44,58,75,89),
+(6,11,47,58,45,60,76,91),
+(6,11,48,59,46,61,78,93),
+(6,11,49,60,47,62,79,94),
+(6,11,50,61,47,63,81,96),
+(6,11,51,62,48,64,83,98),
+(6,11,52,63,49,65,84,100),
+(6,11,53,64,50,66,86,102),
+(6,11,54,65,51,67,87,104),
+(6,11,55,66,51,68,89,105),
+(6,11,56,67,52,69,91,107),
+(6,11,57,68,53,70,92,109),
+(6,11,58,69,54,71,94,111),
+(6,11,59,70,55,72,96,113),
+(6,11,60,71,56,73,97,115),
+(6,11,61,72,57,74,99,117),
+(6,11,62,73,58,76,101,119),
+(6,11,63,74,59,77,103,121),
+(6,11,64,75,59,78,104,123),
+(6,11,65,76,60,79,106,125),
+(6,11,66,77,61,80,108,127),
+(6,11,67,78,62,81,110,129),
+(6,11,68,79,63,83,111,131),
+(6,11,69,80,64,84,113,133),
+(6,11,70,81,65,85,115,135),
+(6,11,71,83,66,86,117,137),
+(6,11,72,84,68,88,120,140),
+(6,11,73,85,69,89,122,142),
+(6,11,74,86,70,91,124,145),
+(6,11,75,88,71,92,126,147),
+(6,11,76,89,72,94,128,150),
+(6,11,77,90,73,95,131,153),
+(6,11,78,92,75,97,133,155),
+(6,11,79,93,76,98,136,158),
+(6,11,80,94,77,100,138,185),
+
+(7,1,1,18,23,21,24,20),
+(7,1,2,19,24,22,24,20),
+(7,1,3,21,25,23,24,21),
+(7,1,4,22,25,25,24,21),
+(7,1,5,23,26,26,24,21),
+(7,1,6,25,27,27,24,21),
+(7,1,7,26,28,28,24,22),
+(7,1,8,27,29,29,25,22),
+(7,1,9,29,29,31,25,22),
+(7,1,10,30,30,32,25,23),
+(7,1,11,32,31,33,25,23),
+(7,1,12,33,32,34,25,23),
+(7,1,13,34,33,36,25,24),
+(7,1,14,36,34,37,25,24),
+(7,1,15,37,35,38,25,24),
+(7,1,16,39,36,40,25,25),
+(7,1,17,40,36,41,25,25),
+(7,1,18,42,37,43,26,25),
+(7,1,19,43,38,44,26,26),
+(7,1,20,45,39,45,26,26),
+(7,1,21,47,40,47,26,26),
+(7,1,22,48,41,48,26,27),
+(7,1,23,50,42,50,26,27),
+(7,1,24,51,43,51,26,28),
+(7,1,25,53,44,52,27,28),
+(7,1,26,55,45,54,27,28),
+(7,1,27,56,46,55,27,29),
+(7,1,28,58,47,57,27,29),
+(7,1,29,59,48,58,27,30),
+(7,1,30,61,49,60,27,30),
+(7,1,31,63,50,62,27,30),
+(7,1,32,65,51,63,28,31),
+(7,1,33,66,52,65,28,31),
+(7,1,34,68,53,66,28,32),
+(7,1,35,70,55,68,28,32),
+(7,1,36,72,56,69,28,33),
+(7,1,37,73,57,71,29,33),
+(7,1,38,75,58,73,29,34),
+(7,1,39,77,59,74,29,34),
+(7,1,40,79,60,76,29,35),
+(7,1,41,81,61,78,29,35),
+(7,1,42,82,62,79,30,35),
+(7,1,43,84,64,81,30,36),
+(7,1,44,86,65,83,30,36),
+(7,1,45,88,66,85,30,37),
+(7,1,46,90,67,86,30,37),
+(7,1,47,92,68,88,31,38),
+(7,1,48,94,70,90,31,38),
+(7,1,49,96,71,92,31,39),
+(7,1,50,98,72,93,31,40),
+(7,1,51,100,73,95,32,40),
+(7,1,52,102,75,97,32,41),
+(7,1,53,104,76,99,32,41),
+(7,1,54,106,77,101,32,42),
+(7,1,55,108,78,103,33,42),
+(7,1,56,110,80,104,33,43),
+(7,1,57,112,81,106,33,43),
+(7,1,58,114,82,108,33,44),
+(7,1,59,116,84,110,34,44),
+(7,1,60,118,85,112,34,45),
+(7,1,61,120,86,114,34,46),
+(7,1,62,122,88,116,35,46),
+(7,1,63,125,89,118,35,47),
+(7,1,64,127,91,120,35,47),
+(7,1,65,129,92,122,35,48),
+(7,1,66,131,93,124,36,49),
+(7,1,67,133,95,126,36,49),
+(7,1,68,136,96,128,36,50),
+(7,1,69,138,98,130,37,50),
+(7,1,70,140,99,132,37,51),
+(7,1,71,143,100,134,37,52),
+(7,1,72,145,102,137,37,53),
+(7,1,73,148,104,139,37,54),
+(7,1,74,151,105,142,38,54),
+(7,1,75,154,107,144,38,55),
+(7,1,76,157,109,147,38,56),
+(7,1,77,163,111,153,39,57),
+(7,1,78,169,112,158,39,57),
+(7,1,79,172,114,161,39,58),
+(7,1,80,175,116,164,40,59),
+
+(7,4,1,16,26,20,24,20),
+(7,4,2,17,27,21,24,20),
+(7,4,3,18,29,21,24,21),
+(7,4,4,18,30,22,24,21),
+(7,4,5,19,32,23,25,21),
+(7,4,6,20,33,24,25,22),
+(7,4,7,21,35,24,25,22),
+(7,4,8,22,36,25,25,23),
+(7,4,9,22,38,26,25,23),
+(7,4,10,23,39,26,25,23),
+(7,4,11,24,41,27,25,24),
+(7,4,12,25,42,28,26,24),
+(7,4,13,26,44,29,26,25),
+(7,4,14,27,46,30,26,25),
+(7,4,15,28,47,30,26,25),
+(7,4,16,28,49,31,26,26),
+(7,4,17,29,50,32,27,26),
+(7,4,18,30,52,33,27,27),
+(7,4,19,31,54,34,27,27),
+(7,4,20,32,56,35,27,28),
+(7,4,21,33,57,35,27,28),
+(7,4,22,34,59,36,28,29),
+(7,4,23,35,61,37,28,29),
+(7,4,24,36,62,38,28,30),
+(7,4,25,37,64,39,28,30),
+(7,4,26,38,66,40,29,31),
+(7,4,27,39,68,41,29,31),
+(7,4,28,40,70,42,29,32),
+(7,4,29,41,72,43,29,32),
+(7,4,30,42,73,43,29,33),
+(7,4,31,43,75,44,30,33),
+(7,4,32,44,77,45,30,34),
+(7,4,33,45,79,46,30,34),
+(7,4,34,46,81,47,31,35),
+(7,4,35,47,83,48,31,35),
+(7,4,36,48,85,49,31,36),
+(7,4,37,49,87,50,31,36),
+(7,4,38,50,89,51,32,37),
+(7,4,39,51,91,52,32,38),
+(7,4,40,53,93,53,32,38),
+(7,4,41,54,95,54,33,39),
+(7,4,42,55,97,55,33,39),
+(7,4,43,56,99,56,33,40),
+(7,4,44,57,101,57,33,40),
+(7,4,45,58,103,59,34,41),
+(7,4,46,59,105,60,34,42),
+(7,4,47,61,107,61,34,42),
+(7,4,48,62,110,62,35,43),
+(7,4,49,63,112,63,35,44),
+(7,4,50,64,114,64,35,44),
+(7,4,51,65,116,65,36,45),
+(7,4,52,67,118,66,36,45),
+(7,4,53,68,121,67,36,46),
+(7,4,54,69,123,69,37,47),
+(7,4,55,70,125,70,37,47),
+(7,4,56,72,127,71,37,48),
+(7,4,57,73,130,72,38,49),
+(7,4,58,74,132,73,38,49),
+(7,4,59,75,134,74,39,50),
+(7,4,60,77,137,76,39,51),
+(7,4,61,78,139,77,39,51),
+(7,4,62,79,141,78,40,52),
+(7,4,63,81,144,79,40,53),
+(7,4,64,82,146,80,41,54),
+(7,4,65,83,149,82,41,54),
+(7,4,66,85,151,83,41,55),
+(7,4,67,86,154,84,42,56),
+(7,4,68,87,156,85,42,57),
+(7,4,69,89,158,87,43,57),
+(7,4,70,90,161,88,43,58),
+(7,4,71,92,164,89,44,59),
+(7,4,72,94,167,91,45,59),
+(7,4,73,95,170,93,45,60),
+(7,4,74,97,173,94,46,61),
+(7,4,75,99,176,96,46,62),
+(7,4,76,100,179,97,46,63),
+(7,4,77,102,182,102,47,64),
+(7,4,78,104,186,105,47,65),
+(7,4,79,106,189,106,48,66),
+(7,4,80,108,192,108,48,67),
+
+(7,6,1,18,23,21,24,20),
+(7,6,2,19,24,22,24,20),
+(7,6,3,21,25,23,24,21),
+(7,6,4,22,25,25,24,21),
+(7,6,5,23,26,26,24,21),
+(7,6,6,25,27,27,24,21),
+(7,6,7,26,28,28,24,22),
+(7,6,8,27,29,29,25,22),
+(7,6,9,29,29,31,25,22),
+(7,6,10,30,30,32,25,23),
+(7,6,11,32,31,33,25,23),
+(7,6,12,33,32,34,25,23),
+(7,6,13,34,33,36,25,24),
+(7,6,14,36,34,37,25,24),
+(7,6,15,37,35,38,25,24),
+(7,6,16,39,36,40,25,25),
+(7,6,17,40,36,41,25,25),
+(7,6,18,42,37,43,26,25),
+(7,6,19,43,38,44,26,26),
+(7,6,20,45,39,45,26,26),
+(7,6,21,47,40,47,26,26),
+(7,6,22,48,41,48,26,27),
+(7,6,23,50,42,50,26,27),
+(7,6,24,51,43,51,26,28),
+(7,6,25,53,44,52,27,28),
+(7,6,26,55,45,54,27,28),
+(7,6,27,56,46,55,27,29),
+(7,6,28,58,47,57,27,29),
+(7,6,29,59,48,58,27,30),
+(7,6,30,61,49,60,27,30),
+(7,6,31,63,50,62,27,30),
+(7,6,32,65,51,63,28,31),
+(7,6,33,66,52,65,28,31),
+(7,6,34,68,53,66,28,32),
+(7,6,35,70,55,68,28,32),
+(7,6,36,72,56,69,28,33),
+(7,6,37,73,57,71,29,33),
+(7,6,38,75,58,73,29,34),
+(7,6,39,77,59,74,29,34),
+(7,6,40,79,60,76,29,35),
+(7,6,41,81,61,78,29,35),
+(7,6,42,82,62,79,30,35),
+(7,6,43,84,64,81,30,36),
+(7,6,44,86,65,83,30,36),
+(7,6,45,88,66,85,30,37),
+(7,6,46,90,67,86,30,37),
+(7,6,47,92,68,88,31,38),
+(7,6,48,94,70,90,31,38),
+(7,6,49,96,71,92,31,39),
+(7,6,50,98,72,93,31,40),
+(7,6,51,99,72,93,32,40),
+(7,6,52,100,73,95,32,41),
+(7,6,53,101,74,96,32,41),
+(7,6,54,102,75,97,32,42),
+(7,6,55,103,76,98,33,42),
+(7,6,56,106,78,101,33,43),
+(7,6,57,111,79,103,33,43),
+(7,6,58,113,80,105,34,44),
+(7,6,59,116,82,107,34,44),
+(7,6,60,118,83,109,34,45),
+(7,6,61,120,84,111,34,46),
+(7,6,62,127,86,119,34,46),
+(7,6,63,129,87,122,35,47),
+(7,6,64,132,89,125,35,47),
+(7,6,65,135,90,127,35,48),
+(7,6,66,137,92,130,35,49),
+(7,6,67,138,93,130,36,49),
+(7,6,68,140,95,131,36,50),
+(7,6,69,142,96,131,36,51),
+(7,6,70,145,98,132,36,51),
+(7,6,71,148,100,135,37,52),
+(7,6,72,150,101,137,37,53),
+(7,6,73,153,103,140,37,54),
+(7,6,74,154,105,142,37,54),
+(7,6,75,155,106,145,38,55),
+(7,6,76,158,108,151,38,56),
+(7,6,77,161,110,157,38,57),
+(7,6,78,164,111,162,38,57),
+(7,6,79,167,113,165,39,58),
+(7,6,80,170,115,168,39,59),
+
+(7,8,1,15,23,19,27,22),
+(7,8,2,15,23,19,28,23),
+(7,8,3,15,23,20,30,25),
+(7,8,4,15,23,20,31,26),
+(7,8,5,15,24,20,32,27),
+(7,8,6,15,24,20,34,29),
+(7,8,7,16,24,21,35,30),
+(7,8,8,16,24,21,37,31),
+(7,8,9,16,24,21,38,33),
+(7,8,10,16,24,22,40,34),
+(7,8,11,16,25,22,41,36),
+(7,8,12,16,25,22,42,37),
+(7,8,13,16,25,23,44,38),
+(7,8,14,16,25,23,45,40),
+(7,8,15,17,25,23,47,41),
+(7,8,16,17,25,24,49,43),
+(7,8,17,17,26,24,50,44),
+(7,8,18,17,26,24,52,46),
+(7,8,19,17,26,25,53,47),
+(7,8,20,17,26,25,55,49),
+(7,8,21,17,26,26,57,51),
+(7,8,22,18,27,26,58,52),
+(7,8,23,18,27,26,60,54),
+(7,8,24,18,27,27,61,55),
+(7,8,25,18,27,27,63,57),
+(7,8,26,18,28,27,65,59),
+(7,8,27,18,28,28,67,60),
+(7,8,28,18,28,28,68,62),
+(7,8,29,19,28,29,70,64),
+(7,8,30,19,29,29,72,65),
+(7,8,31,19,29,30,74,67),
+(7,8,32,19,29,30,75,69),
+(7,8,33,19,29,30,77,70),
+(7,8,34,20,30,31,79,72),
+(7,8,35,20,30,31,81,74),
+(7,8,36,20,30,32,83,76),
+(7,8,37,20,30,32,85,78),
+(7,8,38,20,31,33,86,79),
+(7,8,39,21,31,33,88,81),
+(7,8,40,21,31,34,90,83),
+(7,8,41,21,32,34,92,85),
+(7,8,42,21,32,35,94,87),
+(7,8,43,21,32,35,96,89),
+(7,8,44,22,32,36,98,91),
+(7,8,45,22,33,36,100,92),
+(7,8,46,22,33,37,102,94),
+(7,8,47,22,33,37,104,96),
+(7,8,48,22,34,38,106,98),
+(7,8,49,23,34,38,108,100),
+(7,8,50,23,34,39,110,102),
+(7,8,51,23,35,39,112,104),
+(7,8,52,23,35,40,114,106),
+(7,8,53,24,35,40,117,108),
+(7,8,54,24,36,41,119,110),
+(7,8,55,24,36,41,121,112),
+(7,8,56,24,37,42,123,114),
+(7,8,57,25,37,42,125,117),
+(7,8,58,25,37,43,127,119),
+(7,8,59,25,38,43,130,121),
+(7,8,60,25,38,44,132,123),
+(7,8,61,26,38,45,134,125),
+(7,8,62,26,39,45,136,127),
+(7,8,63,26,39,46,139,129),
+(7,8,64,26,40,46,141,132),
+(7,8,65,27,40,47,143,134),
+(7,8,66,27,40,48,146,136),
+(7,8,67,27,41,48,148,138),
+(7,8,68,27,41,49,150,140),
+(7,8,69,28,42,49,153,143),
+(7,8,70,28,42,50,155,145),
+(7,8,71,28,42,51,168,148),
+(7,8,72,28,43,52,168,151),
+(7,8,73,28,43,53,171,154),
+(7,8,74,29,44,53,174,156),
+(7,8,75,29,44,54,177,159),
+(7,8,76,29,44,55,180,162),
+(7,8,77,30,45,56,183,165),
+(7,8,78,30,45,56,186,168),
+(7,8,79,30,46,57,190,171),
+(7,8,80,31,46,58,193,174),
+
+(7,9,1,15,23,20,26,22),
+(7,9,2,15,23,21,27,23),
+(7,9,3,16,24,21,28,24),
+(7,9,4,16,24,22,29,25),
+(7,9,5,16,24,22,31,27),
+(7,9,6,17,25,23,32,28),
+(7,9,7,17,25,23,33,29),
+(7,9,8,17,26,24,34,30),
+(7,9,9,17,26,25,36,31),
+(7,9,10,18,26,25,37,33),
+(7,9,11,18,27,26,38,34),
+(7,9,12,18,27,26,39,35),
+(7,9,13,19,28,27,41,36),
+(7,9,14,19,28,28,42,38),
+(7,9,15,20,28,28,43,39),
+(7,9,16,20,29,29,45,40),
+(7,9,17,20,29,30,46,42),
+(7,9,18,21,30,30,47,43),
+(7,9,19,21,30,31,49,44),
+(7,9,20,21,31,32,50,46),
+(7,9,21,22,31,32,51,47),
+(7,9,22,22,31,33,53,49),
+(7,9,23,23,32,34,54,50),
+(7,9,24,23,32,34,56,51),
+(7,9,25,23,33,35,57,53),
+(7,9,26,24,33,36,59,54),
+(7,9,27,24,34,37,60,56),
+(7,9,28,25,34,37,62,57),
+(7,9,29,25,35,38,63,59),
+(7,9,30,25,35,39,65,60),
+(7,9,31,26,36,40,66,62),
+(7,9,32,26,36,40,68,63),
+(7,9,33,27,37,41,69,65),
+(7,9,34,27,38,42,71,66),
+(7,9,35,28,38,43,73,68),
+(7,9,36,28,39,43,74,69),
+(7,9,37,28,39,44,76,71),
+(7,9,38,29,40,45,77,73),
+(7,9,39,29,40,46,79,74),
+(7,9,40,30,41,47,81,76),
+(7,9,41,30,41,48,82,78),
+(7,9,42,31,42,48,84,79),
+(7,9,43,31,43,49,86,81),
+(7,9,44,32,43,50,88,83),
+(7,9,45,32,44,51,89,84),
+(7,9,46,33,44,52,91,86),
+(7,9,47,33,45,53,93,88),
+(7,9,48,34,46,54,95,89),
+(7,9,49,34,46,54,96,91),
+(7,9,50,35,47,55,98,93),
+(7,9,51,35,48,56,100,95),
+(7,9,52,36,48,57,102,97),
+(7,9,53,36,49,58,104,98),
+(7,9,54,37,50,59,105,100),
+(7,9,55,37,50,60,107,102),
+(7,9,56,38,51,61,109,104),
+(7,9,57,38,52,62,111,106),
+(7,9,58,39,52,63,113,108),
+(7,9,59,40,53,64,115,109),
+(7,9,60,40,54,65,117,111),
+(7,9,61,41,54,66,119,113),
+(7,9,62,41,55,67,121,115),
+(7,9,63,42,56,68,123,117),
+(7,9,64,42,57,69,125,119),
+(7,9,65,43,57,70,127,121),
+(7,9,66,44,58,71,129,123),
+(7,9,67,44,59,72,131,125),
+(7,9,68,45,59,73,133,127),
+(7,9,69,45,60,74,135,129),
+(7,9,70,46,61,75,137,131),
+(7,9,71,47,62,84,147,142),
+(7,9,72,48,62,85,148,144),
+(7,9,73,49,63,85,153,147),
+(7,9,74,49,64,88,153,150),
+(7,9,75,50,65,90,155,152),
+(7,9,76,51,66,91,158,155),
+(7,9,77,52,67,92,161,158),
+(7,9,78,52,68,93,163,161),
+(7,9,79,53,69,95,166,164),
+(7,9,80,54,70,96,170,166),
+
+(8,1,1,24,22,23,16,21),
+(8,1,2,25,23,24,16,21),
+(8,1,3,27,24,25,16,22),
+(8,1,4,28,24,26,16,22),
+(8,1,5,29,25,28,16,22),
+(8,1,6,31,26,29,16,22),
+(8,1,7,32,27,30,17,23),
+(8,1,8,33,28,31,17,23),
+(8,1,9,35,28,33,17,23),
+(8,1,10,36,29,34,17,24),
+(8,1,11,37,30,35,17,24),
+(8,1,12,39,31,36,17,24),
+(8,1,13,40,32,38,17,25),
+(8,1,14,42,33,39,17,25),
+(8,1,15,43,34,40,18,25),
+(8,1,16,45,35,42,18,26),
+(8,1,17,46,35,43,18,26),
+(8,1,18,48,36,44,18,26),
+(8,1,19,49,37,46,18,27),
+(8,1,20,51,38,47,18,27),
+(8,1,21,52,39,49,18,27),
+(8,1,22,54,40,50,18,28),
+(8,1,23,55,41,51,19,28),
+(8,1,24,57,42,53,19,29),
+(8,1,25,59,43,54,19,29),
+(8,1,26,60,44,56,19,29),
+(8,1,27,62,45,57,19,30),
+(8,1,28,63,46,59,19,30),
+(8,1,29,65,47,60,20,31),
+(8,1,30,67,48,62,20,31),
+(8,1,31,69,49,63,20,31),
+(8,1,32,70,50,65,20,32),
+(8,1,33,72,51,67,20,32),
+(8,1,34,74,53,68,20,33),
+(8,1,35,75,54,70,21,33),
+(8,1,36,77,55,71,21,34),
+(8,1,37,79,56,73,21,34),
+(8,1,38,81,57,75,21,35),
+(8,1,39,83,58,76,21,35),
+(8,1,40,84,59,78,22,35),
+(8,1,41,86,60,80,22,36),
+(8,1,42,88,62,81,22,36),
+(8,1,43,90,63,83,22,37),
+(8,1,44,92,64,85,22,37),
+(8,1,45,94,65,86,23,38),
+(8,1,46,96,66,88,23,38),
+(8,1,47,98,67,90,23,39),
+(8,1,48,100,69,92,23,39),
+(8,1,49,102,70,93,24,40),
+(8,1,50,103,71,95,24,40),
+(8,1,51,105,72,97,24,41),
+(8,1,52,107,74,99,24,42),
+(8,1,53,109,75,101,25,42),
+(8,1,54,112,76,103,25,43),
+(8,1,55,114,78,104,25,43),
+(8,1,56,116,79,106,25,44),
+(8,1,57,118,80,108,25,44),
+(8,1,58,120,81,110,26,45),
+(8,1,59,122,83,112,26,45),
+(8,1,60,124,84,114,26,46),
+(8,1,61,126,85,116,27,47),
+(8,1,62,128,87,118,27,47),
+(8,1,63,130,88,120,27,48),
+(8,1,64,133,90,122,27,48),
+(8,1,65,135,91,124,28,49),
+(8,1,66,137,92,126,28,50),
+(8,1,67,139,94,128,28,50),
+(8,1,68,141,95,130,28,51),
+(8,1,69,144,97,132,29,51),
+(8,1,70,146,98,134,29,52),
+(8,1,71,149,99,136,29,53),
+(8,1,72,151,101,139,29,54),
+(8,1,73,154,103,141,29,55),
+(8,1,74,157,104,144,30,55),
+(8,1,75,166,106,151,30,56),
+(8,1,76,172,108,157,30,57),
+(8,1,77,175,110,161,31,58),
+(8,1,78,179,111,163,31,58),
+(8,1,79,182,113,164,31,59),
+(8,1,80,185,115,169,32,60),
+
+(8,3,1,21,25,22,16,22),
+(8,3,2,21,26,23,17,23),
+(8,3,3,22,28,24,17,23),
+(8,3,4,22,29,25,18,24),
+(8,3,5,23,30,26,18,25),
+(8,3,6,23,32,27,19,25),
+(8,3,7,24,33,28,20,26),
+(8,3,8,24,35,28,20,26),
+(8,3,9,25,36,29,21,27),
+(8,3,10,25,38,30,21,28),
+(8,3,11,25,39,31,22,29),
+(8,3,12,26,41,32,23,29),
+(8,3,13,26,42,33,23,30),
+(8,3,14,27,44,34,24,31),
+(8,3,15,27,45,35,25,31),
+(8,3,16,28,47,36,25,32),
+(8,3,17,28,48,38,26,33),
+(8,3,18,29,50,39,27,34),
+(8,3,19,29,51,40,28,34),
+(8,3,20,30,53,41,28,35),
+(8,3,21,31,55,42,29,36),
+(8,3,22,31,56,43,30,37),
+(8,3,23,32,58,44,30,37),
+(8,3,24,32,60,45,31,38),
+(8,3,25,33,61,46,32,39),
+(8,3,26,33,63,48,33,40),
+(8,3,27,34,65,49,33,41),
+(8,3,28,35,66,50,34,41),
+(8,3,29,35,68,51,35,42),
+(8,3,30,36,70,52,36,43),
+(8,3,31,36,72,53,37,44),
+(8,3,32,37,73,55,37,45),
+(8,3,33,38,75,56,38,46),
+(8,3,34,38,77,57,39,47),
+(8,3,35,39,79,58,40,48),
+(8,3,36,39,81,60,41,48),
+(8,3,37,40,83,61,41,49),
+(8,3,38,41,85,62,42,50),
+(8,3,39,41,86,63,43,51),
+(8,3,40,42,88,65,44,52),
+(8,3,41,43,90,66,45,53),
+(8,3,42,43,92,67,46,54),
+(8,3,43,44,94,69,47,55),
+(8,3,44,45,96,70,47,56),
+(8,3,45,45,98,71,48,57),
+(8,3,46,46,100,73,49,58),
+(8,3,47,47,102,74,50,59),
+(8,3,48,48,104,76,51,60),
+(8,3,49,48,106,77,52,61),
+(8,3,50,49,108,78,53,62),
+(8,3,51,50,110,80,54,63),
+(8,3,52,51,113,81,55,64),
+(8,3,53,51,115,83,56,65),
+(8,3,54,52,117,84,57,66),
+(8,3,55,53,119,86,58,67),
+(8,3,56,54,121,87,59,68),
+(8,3,57,54,123,89,60,69),
+(8,3,58,55,126,90,61,70),
+(8,3,59,56,128,92,62,71),
+(8,3,60,57,130,93,63,73),
+(8,3,61,58,132,95,64,74),
+(8,3,62,58,134,96,65,75),
+(8,3,63,59,137,98,66,76),
+(8,3,64,60,139,99,67,77),
+(8,3,65,61,141,101,68,78),
+(8,3,66,62,144,103,69,79),
+(8,3,67,62,146,104,70,80),
+(8,3,68,63,148,106,71,82),
+(8,3,69,64,151,107,72,83),
+(8,3,70,65,153,109,73,84),
+(8,3,71,66,156,111,74,85),
+(8,3,72,67,159,113,75,86),
+(8,3,73,68,162,115,76,88),
+(8,3,74,69,165,117,78,89),
+(8,3,75,70,174,119,82,91),
+(8,3,76,71,177,121,83,92),
+(8,3,77,72,180,123,85,94),
+(8,3,78,73,184,125,86,95),
+(8,3,79,74,187,127,87,97),
+(8,3,80,75,190,129,89,98),
+
+(8,4,1,22,25,22,16,21),
+(8,4,2,23,26,23,16,21),
+(8,4,3,24,28,23,16,22),
+(8,4,4,24,29,24,16,22),
+(8,4,5,25,31,25,17,22),
+(8,4,6,26,32,25,17,23),
+(8,4,7,27,34,26,17,23),
+(8,4,8,27,35,27,17,24),
+(8,4,9,28,37,28,17,24),
+(8,4,10,29,38,28,18,24),
+(8,4,11,30,40,29,18,25),
+(8,4,12,31,41,30,18,25),
+(8,4,13,32,43,31,18,26),
+(8,4,14,32,45,32,18,26),
+(8,4,15,33,46,32,19,26),
+(8,4,16,34,48,33,19,27),
+(8,4,17,35,50,34,19,27),
+(8,4,18,36,51,35,19,28),
+(8,4,19,37,53,36,19,28),
+(8,4,20,38,55,36,20,29),
+(8,4,21,39,56,37,20,29),
+(8,4,22,40,58,38,20,30),
+(8,4,23,41,60,39,20,30),
+(8,4,24,42,62,40,20,31),
+(8,4,25,43,63,41,21,31),
+(8,4,26,44,65,42,21,32),
+(8,4,27,45,67,43,21,32),
+(8,4,28,46,69,44,21,33),
+(8,4,29,47,71,44,22,33),
+(8,4,30,48,72,45,22,34),
+(8,4,31,49,74,46,22,34),
+(8,4,32,50,76,47,22,35),
+(8,4,33,51,78,48,23,35),
+(8,4,34,52,80,49,23,36),
+(8,4,35,53,82,50,23,36),
+(8,4,36,54,84,51,24,37),
+(8,4,37,55,86,52,24,37),
+(8,4,38,56,88,53,24,38),
+(8,4,39,57,90,54,24,38),
+(8,4,40,58,92,55,25,39),
+(8,4,41,59,94,56,25,40),
+(8,4,42,60,96,57,25,40),
+(8,4,43,62,98,58,26,41),
+(8,4,44,63,100,59,26,41),
+(8,4,45,64,102,60,26,42),
+(8,4,46,65,104,61,27,43),
+(8,4,47,66,107,63,27,43),
+(8,4,48,67,109,64,27,44),
+(8,4,49,69,111,65,27,44),
+(8,4,50,70,113,66,28,45),
+(8,4,51,71,115,67,28,46),
+(8,4,52,72,117,68,28,46),
+(8,4,53,74,120,69,29,47),
+(8,4,54,75,122,70,29,48),
+(8,4,55,76,124,72,29,48),
+(8,4,56,77,126,73,30,49),
+(8,4,57,79,129,74,30,50),
+(8,4,58,80,131,75,30,50),
+(8,4,59,81,133,76,31,51),
+(8,4,60,82,136,77,31,52),
+(8,4,61,84,138,79,32,52),
+(8,4,62,85,140,80,32,53),
+(8,4,63,86,143,81,32,54),
+(8,4,64,88,145,82,33,55),
+(8,4,65,89,148,84,33,55),
+(8,4,66,90,150,85,33,56),
+(8,4,67,92,153,86,34,57),
+(8,4,68,93,155,87,34,58),
+(8,4,69,95,157,89,35,58),
+(8,4,70,96,160,90,35,59),
+(8,4,71,98,163,94,35,60),
+(8,4,72,100,166,96,36,60),
+(8,4,73,101,169,96,36,61),
+(8,4,74,103,172,97,37,62),
+(8,4,75,105,175,98,37,63),
+(8,4,76,106,178,99,37,64),
+(8,4,77,108,181,105,38,65),
+(8,4,78,110,185,107,38,66),
+(8,4,79,112,188,109,39,67),
+(8,4,80,114,191,110,39,68),
+
+(8,5,1,21,22,21,18,24),
+(8,5,2,21,22,21,19,25),
+(8,5,3,21,22,22,21,27),
+(8,5,4,21,23,22,22,28),
+(8,5,5,22,23,22,23,29),
+(8,5,6,22,23,23,25,31),
+(8,5,7,22,23,23,26,32),
+(8,5,8,22,24,24,27,34),
+(8,5,9,22,24,24,29,35),
+(8,5,10,22,24,24,30,37),
+(8,5,11,23,24,25,32,38),
+(8,5,12,23,24,25,33,40),
+(8,5,13,23,25,26,35,41),
+(8,5,14,23,25,26,36,43),
+(8,5,15,23,25,26,38,44),
+(8,5,16,24,26,27,39,46),
+(8,5,17,24,26,27,41,47),
+(8,5,18,24,26,28,42,49),
+(8,5,19,24,26,28,44,50),
+(8,5,20,24,27,29,45,52),
+(8,5,21,25,27,29,47,54),
+(8,5,22,25,27,30,48,55),
+(8,5,23,25,28,30,50,57),
+(8,5,24,25,28,31,52,59),
+(8,5,25,25,28,31,53,60),
+(8,5,26,26,28,32,55,62),
+(8,5,27,26,29,32,56,64),
+(8,5,28,26,29,33,58,65),
+(8,5,29,26,29,33,60,67),
+(8,5,30,27,30,34,62,69),
+(8,5,31,27,30,34,63,71),
+(8,5,32,27,30,35,65,73),
+(8,5,33,27,31,35,67,74),
+(8,5,34,28,31,36,68,76),
+(8,5,35,28,32,36,70,78),
+(8,5,36,28,32,37,72,80),
+(8,5,37,29,32,37,74,82),
+(8,5,38,29,33,38,76,84),
+(8,5,39,29,33,38,77,86),
+(8,5,40,29,33,39,79,87),
+(8,5,41,30,34,40,81,89),
+(8,5,42,30,34,40,83,91),
+(8,5,43,30,35,41,85,93),
+(8,5,44,31,35,41,87,95),
+(8,5,45,31,35,42,89,97),
+(8,5,46,31,36,43,91,99),
+(8,5,47,32,36,43,93,101),
+(8,5,48,32,37,44,94,103),
+(8,5,49,32,37,44,96,105),
+(8,5,50,33,37,45,98,107),
+(8,5,51,33,38,46,100,110),
+(8,5,52,33,38,46,102,112),
+(8,5,53,34,39,47,104,114),
+(8,5,54,34,39,48,106,116),
+(8,5,55,34,40,48,109,118),
+(8,5,56,35,40,49,111,120),
+(8,5,57,35,41,50,113,122),
+(8,5,58,35,41,50,115,125),
+(8,5,59,36,42,51,117,127),
+(8,5,60,36,42,52,119,129),
+(8,5,61,36,42,52,121,131),
+(8,5,62,37,43,53,123,133),
+(8,5,63,37,43,54,125,136),
+(8,5,64,38,44,55,128,138),
+(8,5,65,38,44,55,130,140),
+(8,5,66,38,45,56,132,143),
+(8,5,67,39,45,57,134,145),
+(8,5,68,39,46,58,136,147),
+(8,5,69,40,46,58,139,150),
+(8,5,70,40,47,59,141,152),
+(8,5,71,40,48,60,144,155),
+(8,5,72,41,48,60,147,158),
+(8,5,73,41,49,61,150,161),
+(8,5,74,42,49,62,152,164),
+(8,5,75,42,50,63,155,167),
+(8,5,76,42,51,64,158,170),
+(8,5,77,43,51,65,161,173),
+(8,5,78,43,52,66,164,176),
+(8,5,79,44,52,67,167,179),
+(8,5,80,44,53,68,170,182),
+
+(8,6,1,24,22,23,16,21),
+(8,6,2,25,23,24,16,21),
+(8,6,3,27,24,25,16,22),
+(8,6,4,28,24,26,16,22),
+(8,6,5,29,25,28,16,22),
+(8,6,6,31,26,29,16,22),
+(8,6,7,32,27,30,17,23),
+(8,6,8,33,28,31,17,23),
+(8,6,9,35,28,33,17,23),
+(8,6,10,36,29,34,17,24),
+(8,6,11,37,30,35,17,24),
+(8,6,12,39,31,36,17,24),
+(8,6,13,40,32,38,17,25),
+(8,6,14,42,33,39,17,25),
+(8,6,15,43,34,40,18,25),
+(8,6,16,45,35,42,18,26),
+(8,6,17,46,35,43,18,26),
+(8,6,18,48,36,44,18,26),
+(8,6,19,49,37,46,18,27),
+(8,6,20,51,38,47,18,27),
+(8,6,21,52,39,49,18,27),
+(8,6,22,54,40,50,18,28),
+(8,6,23,55,41,51,19,28),
+(8,6,24,57,42,53,19,29),
+(8,6,25,59,43,54,19,29),
+(8,6,26,60,44,56,19,29),
+(8,6,27,62,45,57,19,30),
+(8,6,28,63,46,59,19,30),
+(8,6,29,65,47,60,20,31),
+(8,6,30,67,48,62,20,31),
+(8,6,31,69,49,63,20,31),
+(8,6,32,70,50,65,20,32),
+(8,6,33,72,51,67,20,32),
+(8,6,34,74,53,68,20,33),
+(8,6,35,75,54,70,21,33),
+(8,6,36,77,55,71,21,34),
+(8,6,37,79,56,73,21,34),
+(8,6,38,81,57,75,21,35),
+(8,6,39,83,58,76,21,35),
+(8,6,40,84,59,78,22,35),
+(8,6,41,86,60,80,22,36),
+(8,6,42,88,62,81,22,36),
+(8,6,43,90,63,83,22,37),
+(8,6,44,92,64,85,22,37),
+(8,6,45,94,65,86,23,38),
+(8,6,46,96,66,88,23,38),
+(8,6,47,98,67,90,23,39),
+(8,6,48,100,69,92,23,39),
+(8,6,49,102,70,93,24,40),
+(8,6,50,103,71,95,24,40),
+(8,6,51,105,72,96,24,41),
+(8,6,52,106,74,97,24,42),
+(8,6,53,107,73,98,25,42),
+(8,6,54,108,74,99,25,43),
+(8,6,55,109,75,100,25,43),
+(8,6,56,112,77,103,25,44),
+(8,6,57,114,78,105,25,44),
+(8,6,58,118,79,107,26,45),
+(8,6,59,119,81,109,26,45),
+(8,6,60,121,82,111,26,46),
+(8,6,61,123,83,113,26,47),
+(8,6,62,126,85,115,26,47),
+(8,6,63,128,86,118,27,48),
+(8,6,64,131,88,120,27,48),
+(8,6,65,138,89,122,27,49),
+(8,6,66,140,91,125,27,50),
+(8,6,67,143,92,127,28,50),
+(8,6,68,145,94,129,28,51),
+(8,6,69,148,95,132,28,52),
+(8,6,70,151,97,134,28,52),
+(8,6,71,154,99,137,29,53),
+(8,6,72,156,100,139,29,54),
+(8,6,73,159,102,142,29,55),
+(8,6,74,162,104,144,29,55),
+(8,6,75,165,105,147,30,56),
+(8,6,76,168,107,150,30,57),
+(8,6,77,169,109,153,30,58),
+(8,6,78,170,110,155,30,58),
+(8,6,79,178,112,158,31,59),
+(8,6,80,181,114,161,31,60),
+
+(8,7,1,22,22,22,17,23),
+(8,7,2,23,22,23,18,24),
+(8,7,3,24,23,24,19,25),
+(8,7,4,25,23,25,20,26),
+(8,7,5,25,24,26,21,27),
+(8,7,6,26,24,27,22,28),
+(8,7,7,27,25,28,23,29),
+(8,7,8,28,25,29,24,30),
+(8,7,9,29,25,30,25,31),
+(8,7,10,30,26,31,26,33),
+(8,7,11,31,26,32,27,34),
+(8,7,12,32,27,33,28,35),
+(8,7,13,33,27,34,29,36),
+(8,7,14,34,28,35,30,37),
+(8,7,15,34,28,36,31,38),
+(8,7,16,35,29,38,32,39),
+(8,7,17,36,29,39,33,41),
+(8,7,18,37,30,40,34,42),
+(8,7,19,38,30,41,35,43),
+(8,7,20,39,31,42,36,44),
+(8,7,21,40,32,43,37,45),
+(8,7,22,41,32,45,38,47),
+(8,7,23,43,33,46,39,48),
+(8,7,24,44,33,47,40,49),
+(8,7,25,45,34,48,42,51),
+(8,7,26,46,34,49,43,52),
+(8,7,27,47,35,51,44,53),
+(8,7,28,48,35,52,45,54),
+(8,7,29,49,36,53,46,56),
+(8,7,30,50,37,54,48,57),
+(8,7,31,51,37,56,49,59),
+(8,7,32,52,38,57,50,60),
+(8,7,33,53,38,58,51,61),
+(8,7,34,55,39,60,52,63),
+(8,7,35,56,40,61,54,64),
+(8,7,36,57,40,62,55,66),
+(8,7,37,58,41,64,56,67),
+(8,7,38,59,42,65,57,68),
+(8,7,39,61,42,66,59,70),
+(8,7,40,62,43,68,60,71),
+(8,7,41,63,44,69,61,73),
+(8,7,42,64,44,71,63,74),
+(8,7,43,65,45,72,64,76),
+(8,7,44,67,46,74,65,77),
+(8,7,45,68,46,75,67,79),
+(8,7,46,69,47,76,68,80),
+(8,7,47,71,48,78,69,82),
+(8,7,48,72,49,79,71,83),
+(8,7,49,73,49,81,72,85),
+(8,7,50,74,50,82,74,87),
+(8,7,51,76,51,84,75,88),
+(8,7,52,77,51,85,77,90),
+(8,7,53,78,52,87,78,92),
+(8,7,54,80,53,89,79,93),
+(8,7,55,81,54,90,81,95),
+(8,7,56,83,55,92,82,96),
+(8,7,57,84,55,93,84,98),
+(8,7,58,85,56,95,85,100),
+(8,7,59,87,57,97,87,102),
+(8,7,60,88,58,98,88,103),
+(8,7,61,90,58,100,90,105),
+(8,7,62,91,59,101,91,107),
+(8,7,63,93,60,103,93,108),
+(8,7,64,94,61,105,94,110),
+(8,7,65,95,62,106,96,112),
+(8,7,66,97,63,108,98,114),
+(8,7,67,98,63,110,99,116),
+(8,7,68,100,64,112,101,117),
+(8,7,69,101,65,113,102,119),
+(8,7,70,103,66,115,104,121),
+(8,7,71,104,67,117,116,123),
+(8,7,72,106,68,119,118,126),
+(8,7,73,108,69,121,121,128),
+(8,7,74,110,70,124,123,130),
+(8,7,75,112,71,126,125,132),
+(8,7,76,114,72,128,127,135),
+(8,7,77,115,73,130,129,137),
+(8,7,78,117,74,132,132,139),
+(8,7,79,119,75,135,134,142),
+(8,7,80,121,76,137,136,144),
+
+(8,8,1,21,22,21,19,23),
+(8,8,2,21,22,21,20,24),
+(8,8,3,21,22,22,22,26),
+(8,8,4,21,22,22,23,27),
+(8,8,5,21,23,22,25,28),
+(8,8,6,21,23,22,26,30),
+(8,8,7,21,23,23,27,31),
+(8,8,8,22,23,23,29,32),
+(8,8,9,22,23,23,30,34),
+(8,8,10,22,23,24,32,35),
+(8,8,11,22,24,24,33,37),
+(8,8,12,22,24,24,35,38),
+(8,8,13,22,24,25,36,39),
+(8,8,14,22,24,25,38,41),
+(8,8,15,22,24,25,39,42),
+(8,8,16,22,24,26,41,44),
+(8,8,17,23,25,26,42,45),
+(8,8,18,23,25,26,44,47),
+(8,8,19,23,25,27,46,48),
+(8,8,20,23,25,27,47,50),
+(8,8,21,23,25,27,49,51),
+(8,8,22,23,26,28,51,53),
+(8,8,23,23,26,28,52,55),
+(8,8,24,24,26,29,54,56),
+(8,8,25,24,26,29,56,58),
+(8,8,26,24,27,29,57,60),
+(8,8,27,24,27,30,59,61),
+(8,8,28,24,27,30,61,63),
+(8,8,29,24,27,31,63,65),
+(8,8,30,24,28,31,64,66),
+(8,8,31,25,28,31,66,68),
+(8,8,32,25,28,32,68,70),
+(8,8,33,25,28,32,70,71),
+(8,8,34,25,29,33,71,73),
+(8,8,35,25,29,33,73,75),
+(8,8,36,26,29,34,75,77),
+(8,8,37,26,29,34,77,79),
+(8,8,38,26,30,35,79,80),
+(8,8,39,26,30,35,81,82),
+(8,8,40,26,30,35,83,84),
+(8,8,41,27,31,36,85,86),
+(8,8,42,27,31,36,87,88),
+(8,8,43,27,31,37,89,90),
+(8,8,44,27,32,37,91,91),
+(8,8,45,27,32,38,93,93),
+(8,8,46,28,32,38,95,95),
+(8,8,47,28,32,39,97,97),
+(8,8,48,28,33,39,99,99),
+(8,8,49,28,33,40,101,101),
+(8,8,50,29,33,40,103,103),
+(8,8,51,29,34,41,105,105),
+(8,8,52,29,34,42,107,107),
+(8,8,53,29,35,42,109,109),
+(8,8,54,30,35,43,111,111),
+(8,8,55,30,35,43,113,113),
+(8,8,56,30,36,44,115,115),
+(8,8,57,30,36,44,118,118),
+(8,8,58,31,36,45,120,120),
+(8,8,59,31,37,45,122,122),
+(8,8,60,31,37,46,124,124),
+(8,8,61,31,37,47,126,126),
+(8,8,62,32,38,47,129,128),
+(8,8,63,32,38,48,131,130),
+(8,8,64,32,39,48,133,133),
+(8,8,65,33,39,49,135,135),
+(8,8,66,33,39,50,138,137),
+(8,8,67,33,40,50,140,139),
+(8,8,68,33,40,51,142,141),
+(8,8,69,34,41,51,145,144),
+(8,8,70,34,41,52,147,146),
+(8,8,71,34,41,53,150,149),
+(8,8,72,34,42,54,153,152),
+(8,8,73,34,42,55,156,155),
+(8,8,74,35,43,55,159,157),
+(8,8,75,35,43,56,162,160),
+(8,8,76,35,43,57,168,163),
+(8,8,77,36,44,58,168,166),
+(8,8,78,36,44,58,171,169),
+(8,8,79,36,45,59,177,172),
+(8,8,80,37,45,60,177,175),
+
+(10,2,1,19,22,21,24,20),
+(10,2,2,20,23,22,25,21),
+(10,2,3,21,23,23,25,21),
+(10,2,4,22,24,24,26,22),
+(10,2,5,23,24,25,27,23),
+(10,2,6,25,25,26,27,24),
+(10,2,7,26,25,27,28,24),
+(10,2,8,27,26,28,29,25),
+(10,2,9,28,27,29,29,26),
+(10,2,10,29,27,31,30,26),
+(10,2,11,30,28,32,31,27),
+(10,2,12,32,29,33,31,28),
+(10,2,13,33,29,34,32,29),
+(10,2,14,34,30,35,33,30),
+(10,2,15,35,31,36,33,30),
+(10,2,16,37,31,37,34,31),
+(10,2,17,38,32,39,35,32),
+(10,2,18,39,33,40,36,33),
+(10,2,19,40,33,41,36,34),
+(10,2,20,42,34,42,37,35),
+(10,2,21,43,35,44,38,35),
+(10,2,22,44,35,45,39,36),
+(10,2,23,46,36,46,40,37),
+(10,2,24,47,37,47,40,38),
+(10,2,25,49,38,49,41,39),
+(10,2,26,50,38,50,42,40),
+(10,2,27,51,39,51,43,41),
+(10,2,28,53,40,53,44,42),
+(10,2,29,54,41,54,45,43),
+(10,2,30,56,41,55,45,43),
+(10,2,31,57,42,57,46,44),
+(10,2,32,58,43,58,47,45),
+(10,2,33,60,44,59,48,46),
+(10,2,34,61,45,61,49,47),
+(10,2,35,63,45,62,50,48),
+(10,2,36,64,46,64,51,49),
+(10,2,37,66,47,65,52,50),
+(10,2,38,67,48,67,53,51),
+(10,2,39,69,49,68,54,52),
+(10,2,40,71,50,69,55,53),
+(10,2,41,72,50,71,55,54),
+(10,2,42,74,51,72,56,55),
+(10,2,43,75,52,74,57,56),
+(10,2,44,77,53,75,58,57),
+(10,2,45,79,54,77,59,59),
+(10,2,46,80,55,78,60,60),
+(10,2,47,82,56,80,61,61),
+(10,2,48,83,57,82,62,62),
+(10,2,49,85,58,83,63,63),
+(10,2,50,87,59,85,64,64),
+(10,2,51,89,60,86,66,65),
+(10,2,52,90,61,88,67,66),
+(10,2,53,92,61,90,68,67),
+(10,2,54,94,62,91,69,69),
+(10,2,55,95,63,93,70,70),
+(10,2,56,97,64,95,71,71),
+(10,2,57,99,65,96,72,72),
+(10,2,58,101,66,98,73,73),
+(10,2,59,102,67,100,74,74),
+(10,2,60,104,68,101,75,76),
+(10,2,61,106,69,103,76,77),
+(10,2,62,108,70,105,78,78),
+(10,2,63,110,72,106,79,79),
+(10,2,64,112,73,108,80,80),
+(10,2,65,113,74,110,81,82),
+(10,2,66,115,75,112,82,83),
+(10,2,67,117,76,114,83,84),
+(10,2,68,119,77,115,85,85),
+(10,2,69,121,78,117,86,87),
+(10,2,70,123,79,119,87,88),
+(10,2,71,125,80,120,88,89),
+(10,2,72,128,81,123,90,91),
+(10,2,73,130,82,125,91,93),
+(10,2,74,133,84,127,93,94),
+(10,2,75,135,85,129,94,96),
+(10,2,76,137,86,132,96,97),
+(10,2,77,140,88,134,97,99),
+(10,2,78,143,89,136,99,101),
+(10,2,79,145,90,139,100,102),
+(10,2,80,148,92,141,102,104),
+
+(10,3,1,17,25,20,24,20),
+(10,3,2,17,26,21,25,21),
+(10,3,3,18,28,22,25,21),
+(10,3,4,18,29,23,26,22),
+(10,3,5,19,30,24,26,23),
+(10,3,6,19,32,25,27,23),
+(10,3,7,20,33,26,27,24),
+(10,3,8,20,35,27,28,25),
+(10,3,9,21,36,27,29,25),
+(10,3,10,21,38,28,29,26),
+(10,3,11,22,39,29,30,27),
+(10,3,12,22,41,30,31,27),
+(10,3,13,23,42,31,31,28),
+(10,3,14,23,44,32,32,29),
+(10,3,15,24,45,34,32,29),
+(10,3,16,24,47,35,33,30),
+(10,3,17,25,48,36,34,31),
+(10,3,18,25,50,37,34,32),
+(10,3,19,26,51,38,35,32),
+(10,3,20,26,53,39,36,33),
+(10,3,21,27,55,40,37,34),
+(10,3,22,27,56,41,37,35),
+(10,3,23,28,58,42,38,36),
+(10,3,24,28,60,43,39,36),
+(10,3,25,29,61,44,39,37),
+(10,3,26,30,63,46,40,38),
+(10,3,27,30,65,47,41,39),
+(10,3,28,31,66,48,42,40),
+(10,3,29,31,68,49,42,40),
+(10,3,30,32,70,50,43,41),
+(10,3,31,33,72,52,44,42),
+(10,3,32,33,73,53,45,43),
+(10,3,33,34,75,54,46,44),
+(10,3,34,34,77,55,46,45),
+(10,3,35,35,79,57,47,46),
+(10,3,36,36,81,58,48,47),
+(10,3,37,36,83,59,49,47),
+(10,3,38,37,85,60,50,48),
+(10,3,39,38,86,62,51,49),
+(10,3,40,38,88,63,51,50),
+(10,3,41,39,90,64,52,51),
+(10,3,42,40,92,66,53,52),
+(10,3,43,40,94,67,54,53),
+(10,3,44,41,96,68,55,54),
+(10,3,45,42,98,70,56,55),
+(10,3,46,42,100,71,57,56),
+(10,3,47,43,102,72,58,57),
+(10,3,48,44,104,74,59,58),
+(10,3,49,45,106,75,60,59),
+(10,3,50,45,108,77,61,60),
+(10,3,51,46,110,78,61,61),
+(10,3,52,47,113,79,62,62),
+(10,3,53,47,115,81,63,63),
+(10,3,54,48,117,82,64,64),
+(10,3,55,49,119,84,65,65),
+(10,3,56,50,121,85,66,66),
+(10,3,57,50,123,87,67,67),
+(10,3,58,51,126,88,68,68),
+(10,3,59,52,128,90,69,70),
+(10,3,60,53,130,91,70,71),
+(10,3,61,54,132,93,71,72),
+(10,3,62,54,134,94,72,73),
+(10,3,63,55,137,96,73,74),
+(10,3,64,56,139,97,75,75),
+(10,3,65,57,141,99,76,76),
+(10,3,66,58,144,101,77,77),
+(10,3,67,58,146,102,78,78),
+(10,3,68,59,148,104,79,80),
+(10,3,69,60,151,105,80,81),
+(10,3,70,61,153,107,81,82),
+(10,3,71,62,156,108,82,83),
+(10,3,72,63,159,110,83,84),
+(10,3,73,64,162,112,84,86),
+(10,3,74,65,165,114,86,87),
+(10,3,75,66,168,116,87,89),
+(10,3,76,67,171,118,89,90),
+(10,3,77,68,174,120,90,92),
+(10,3,78,69,177,122,91,93),
+(10,3,79,70,180,124,92,95),
+(10,3,80,71,183,126,94,96),
+
+(10,4,1,18,25,20,24,19),
+(10,4,2,19,26,21,24,19),
+(10,4,3,20,28,21,24,20),
+(10,4,4,20,29,22,24,20),
+(10,4,5,21,31,23,25,20),
+(10,4,6,22,32,24,25,21),
+(10,4,7,23,34,24,25,21),
+(10,4,8,24,35,25,25,22),
+(10,4,9,24,37,26,25,22),
+(10,4,10,25,38,26,25,22),
+(10,4,11,26,40,27,25,23),
+(10,4,12,27,41,28,26,23),
+(10,4,13,28,43,29,26,24),
+(10,4,14,29,45,30,26,24),
+(10,4,15,29,46,30,26,25),
+(10,4,16,30,48,31,26,25),
+(10,4,17,31,50,32,27,25),
+(10,4,18,32,51,33,27,26),
+(10,4,19,33,53,34,27,26),
+(10,4,20,34,55,35,27,27),
+(10,4,21,35,56,35,27,27),
+(10,4,22,36,58,36,28,28),
+(10,4,23,37,60,37,28,28),
+(10,4,24,38,62,38,28,29),
+(10,4,25,39,63,39,28,29),
+(10,4,26,40,65,40,29,30),
+(10,4,27,41,67,41,29,30),
+(10,4,28,42,69,42,29,31),
+(10,4,29,43,71,43,29,31),
+(10,4,30,44,72,43,29,32),
+(10,4,31,45,74,44,30,32),
+(10,4,32,46,76,45,30,33),
+(10,4,33,47,78,46,30,33),
+(10,4,34,48,80,47,31,34),
+(10,4,35,49,82,48,31,34),
+(10,4,36,50,84,49,31,35),
+(10,4,37,51,86,50,31,35),
+(10,4,38,52,88,51,32,36),
+(10,4,39,53,90,52,32,37),
+(10,4,40,54,92,53,32,37),
+(10,4,41,56,94,54,33,38),
+(10,4,42,57,96,55,33,38),
+(10,4,43,58,98,56,33,39),
+(10,4,44,59,100,57,33,39),
+(10,4,45,60,102,59,34,40),
+(10,4,46,61,104,60,34,41),
+(10,4,47,62,107,61,34,41),
+(10,4,48,64,109,62,35,42),
+(10,4,49,65,111,63,35,43),
+(10,4,50,66,113,64,35,43),
+(10,4,51,67,115,65,36,44),
+(10,4,52,68,117,66,36,44),
+(10,4,53,70,120,67,36,45),
+(10,4,54,71,122,69,37,46),
+(10,4,55,72,124,70,37,46),
+(10,4,56,73,126,71,37,47),
+(10,4,57,75,129,72,38,48),
+(10,4,58,76,131,73,38,48),
+(10,4,59,77,133,74,39,49),
+(10,4,60,79,136,76,39,50),
+(10,4,61,80,138,77,39,51),
+(10,4,62,81,140,78,40,51),
+(10,4,63,82,143,79,40,52),
+(10,4,64,84,145,80,41,53),
+(10,4,65,85,148,82,41,53),
+(10,4,66,87,150,83,41,54),
+(10,4,67,88,153,84,42,55),
+(10,4,68,89,155,85,42,56),
+(10,4,69,91,157,87,43,56),
+(10,4,70,92,160,88,43,57),
+(10,4,71,94,163,88,43,58),
+(10,4,72,96,166,90,44,58),
+(10,4,73,97,169,92,44,59),
+(10,4,74,99,172,93,45,60),
+(10,4,75,101,175,95,45,61),
+(10,4,76,102,178,96,45,62),
+(10,4,77,104,181,101,46,63),
+(10,4,78,106,185,104,46,64),
+(10,4,79,108,188,105,47,65),
+(10,4,80,110,191,107,47,66),
+
+(10,5,1,17,22,19,26,22),
+(10,5,2,17,22,19,27,23),
+(10,5,3,17,22,20,29,25),
+(10,5,4,17,23,20,30,26),
+(10,5,5,18,23,20,31,27),
+(10,5,6,18,23,21,33,29),
+(10,5,7,18,23,21,34,30),
+(10,5,8,18,24,22,35,32),
+(10,5,9,18,24,22,37,33),
+(10,5,10,19,24,22,38,35),
+(10,5,11,19,24,23,39,36),
+(10,5,12,19,24,23,41,38),
+(10,5,13,19,25,24,42,39),
+(10,5,14,19,25,24,44,41),
+(10,5,15,19,25,25,45,42),
+(10,5,16,20,26,25,47,44),
+(10,5,17,20,26,25,48,45),
+(10,5,18,20,26,26,50,47),
+(10,5,19,20,26,26,51,49),
+(10,5,20,21,27,27,53,50),
+(10,5,21,21,27,27,54,52),
+(10,5,22,21,27,28,56,53),
+(10,5,23,21,28,28,58,55),
+(10,5,24,21,28,29,59,57),
+(10,5,25,22,28,29,61,58),
+(10,5,26,22,28,30,62,60),
+(10,5,27,22,29,30,64,62),
+(10,5,28,22,29,31,66,64),
+(10,5,29,23,29,31,67,65),
+(10,5,30,23,30,32,69,67),
+(10,5,31,23,30,32,71,69),
+(10,5,32,23,30,33,72,71),
+(10,5,33,24,31,33,74,72),
+(10,5,34,24,31,34,76,74),
+(10,5,35,24,32,34,78,76),
+(10,5,36,24,32,35,80,78),
+(10,5,37,25,32,35,81,80),
+(10,5,38,25,33,36,83,82),
+(10,5,39,25,33,37,85,84),
+(10,5,40,26,33,37,87,86),
+(10,5,41,26,34,38,89,88),
+(10,5,42,26,34,38,91,89),
+(10,5,43,27,35,39,92,91),
+(10,5,44,27,35,39,94,93),
+(10,5,45,27,35,40,96,95),
+(10,5,46,27,36,41,98,97),
+(10,5,47,28,36,41,100,99),
+(10,5,48,28,37,42,102,101),
+(10,5,49,28,37,43,104,103),
+(10,5,50,29,37,43,106,106),
+(10,5,51,29,38,44,108,108),
+(10,5,52,29,38,44,110,110),
+(10,5,53,30,39,45,112,112),
+(10,5,54,30,39,46,114,114),
+(10,5,55,30,40,46,116,116),
+(10,5,56,31,40,47,118,118),
+(10,5,57,31,41,48,120,120),
+(10,5,58,31,41,48,123,123),
+(10,5,59,32,42,49,125,125),
+(10,5,60,32,42,50,127,127),
+(10,5,61,33,42,51,129,129),
+(10,5,62,33,43,51,131,131),
+(10,5,63,33,43,52,133,134),
+(10,5,64,34,44,53,135,136),
+(10,5,65,34,44,53,138,138),
+(10,5,66,34,45,54,140,141),
+(10,5,67,35,45,55,142,143),
+(10,5,68,35,46,56,144,145),
+(10,5,69,36,46,56,147,148),
+(10,5,70,36,47,57,149,150),
+(10,5,71,36,48,57,152,153),
+(10,5,72,37,48,57,155,156),
+(10,5,73,37,49,58,158,159),
+(10,5,74,38,49,59,160,163),
+(10,5,75,38,50,60,163,165),
+(10,5,76,38,51,61,166,170),
+(10,5,77,39,51,62,168,175),
+(10,5,78,39,52,63,172,174),
+(10,5,79,40,52,64,175,177),
+(10,5,80,40,53,65,178,180),
+
+(10,6,1,18,23,21,24,20),
+(10,6,2,19,24,22,24,20),
+(10,6,3,21,25,23,24,21),
+(10,6,4,22,25,25,24,21),
+(10,6,5,23,26,26,24,21),
+(10,6,6,25,27,27,24,21),
+(10,6,7,26,28,28,24,22),
+(10,6,8,27,29,29,25,22),
+(10,6,9,29,29,31,25,22),
+(10,6,10,30,30,32,25,23),
+(10,6,11,32,31,33,25,23),
+(10,6,12,33,32,34,25,23),
+(10,6,13,34,33,36,25,24),
+(10,6,14,36,34,37,25,24),
+(10,6,15,37,35,38,25,24),
+(10,6,16,39,36,40,25,25),
+(10,6,17,40,36,41,25,25),
+(10,6,18,42,37,43,26,25),
+(10,6,19,43,38,44,26,26),
+(10,6,20,45,39,45,26,26),
+(10,6,21,47,40,47,26,26),
+(10,6,22,48,41,48,26,27),
+(10,6,23,50,42,50,26,27),
+(10,6,24,51,43,51,26,28),
+(10,6,25,53,44,52,27,28),
+(10,6,26,55,45,54,27,28),
+(10,6,27,56,46,55,27,29),
+(10,6,28,58,47,57,27,29),
+(10,6,29,59,48,58,27,30),
+(10,6,30,61,49,60,27,30),
+(10,6,31,63,50,62,27,30),
+(10,6,32,65,51,63,28,31),
+(10,6,33,66,52,65,28,31),
+(10,6,34,68,53,66,28,32),
+(10,6,35,70,55,68,28,32),
+(10,6,36,72,56,69,28,33),
+(10,6,37,73,57,71,29,33),
+(10,6,38,75,58,73,29,34),
+(10,6,39,77,59,74,29,34),
+(10,6,40,79,60,76,29,35),
+(10,6,41,81,61,78,29,35),
+(10,6,42,82,62,79,30,35),
+(10,6,43,84,64,81,30,36),
+(10,6,44,86,65,83,30,36),
+(10,6,45,88,66,85,30,37),
+(10,6,46,90,67,86,30,37),
+(10,6,47,92,68,88,31,38),
+(10,6,48,94,69,90,31,38),
+(10,6,49,96,69,92,31,39),
+(10,6,50,98,70,93,31,40),
+(10,6,51,100,71,95,32,40),
+(10,6,52,102,72,96,32,41),
+(10,6,53,103,73,97,32,41),
+(10,6,54,104,74,98,32,41),
+(10,6,55,105,75,97,33,41),
+(10,6,56,108,77,100,33,42),
+(10,6,57,113,78,102,33,42),
+(10,6,58,115,79,104,34,43),
+(10,6,59,117,81,106,34,43),
+(10,6,60,118,82,108,34,44),
+(10,6,61,119,83,110,34,45),
+(10,6,62,121,85,112,34,45),
+(10,6,63,124,86,115,35,46),
+(10,6,64,127,88,117,35,46),
+(10,6,65,133,89,119,35,47),
+(10,6,66,135,91,122,35,48),
+(10,6,67,139,92,124,36,48),
+(10,6,68,141,94,126,36,49),
+(10,6,69,142,95,129,36,50),
+(10,6,70,145,97,131,36,50),
+(10,6,71,150,99,134,37,51),
+(10,6,72,152,100,136,37,52),
+(10,6,73,155,102,139,37,53),
+(10,6,74,158,104,141,37,53),
+(10,6,75,159,105,144,38,54),
+(10,6,76,160,107,147,38,55),
+(10,6,77,163,109,149,38,56),
+(10,6,78,166,110,152,38,56),
+(10,6,79,169,112,155,39,57),
+(10,6,80,172,114,158,39,58),
+
+(10,8,1,17,22,19,27,21),
+(10,8,2,17,22,19,28,22),
+(10,8,3,17,22,20,30,24),
+(10,8,4,17,22,20,31,25),
+(10,8,5,17,23,20,32,26),
+(10,8,6,17,23,20,34,28),
+(10,8,7,18,23,21,35,29),
+(10,8,8,18,23,21,37,30),
+(10,8,9,18,23,21,38,32),
+(10,8,10,18,23,22,40,33),
+(10,8,11,18,24,22,41,35),
+(10,8,12,18,24,22,42,36),
+(10,8,13,18,24,23,44,37),
+(10,8,14,18,24,23,45,39),
+(10,8,15,18,24,23,47,40),
+(10,8,16,19,24,24,49,42),
+(10,8,17,19,25,24,50,43),
+(10,8,18,19,25,24,52,45),
+(10,8,19,19,25,25,53,46),
+(10,8,20,19,25,25,55,48),
+(10,8,21,19,25,26,57,50),
+(10,8,22,19,26,26,58,51),
+(10,8,23,20,26,26,60,53),
+(10,8,24,20,26,27,61,54),
+(10,8,25,20,26,27,63,56),
+(10,8,26,20,27,27,65,58),
+(10,8,27,20,27,28,67,59),
+(10,8,28,20,27,28,68,61),
+(10,8,29,21,27,29,70,63),
+(10,8,30,21,28,29,72,64),
+(10,8,31,21,28,30,74,66),
+(10,8,32,21,28,30,75,68),
+(10,8,33,21,28,30,77,70),
+(10,8,34,21,29,31,79,71),
+(10,8,35,22,29,31,81,73),
+(10,8,36,22,29,32,83,75),
+(10,8,37,22,29,32,85,77),
+(10,8,38,22,30,33,86,78),
+(10,8,39,22,30,33,88,80),
+(10,8,40,23,30,34,90,82),
+(10,8,41,23,31,34,92,84),
+(10,8,42,23,31,35,94,86),
+(10,8,43,23,31,35,96,88),
+(10,8,44,23,32,36,98,90),
+(10,8,45,24,32,36,100,92),
+(10,8,46,24,32,37,102,93),
+(10,8,47,24,32,37,104,95),
+(10,8,48,24,33,38,106,97),
+(10,8,49,25,33,38,108,99),
+(10,8,50,25,33,39,110,101),
+(10,8,51,25,34,39,112,103),
+(10,8,52,25,34,40,114,105),
+(10,8,53,25,35,40,117,107),
+(10,8,54,26,35,41,119,109),
+(10,8,55,26,35,41,121,111),
+(10,8,56,26,36,42,123,113),
+(10,8,57,26,36,42,125,116),
+(10,8,58,27,36,43,127,118),
+(10,8,59,27,37,43,130,120),
+(10,8,60,27,37,44,132,122),
+(10,8,61,27,37,45,134,124),
+(10,8,62,28,38,45,136,126),
+(10,8,63,28,38,46,139,128),
+(10,8,64,28,39,46,141,131),
+(10,8,65,29,39,47,143,133),
+(10,8,66,29,39,48,146,135),
+(10,8,67,29,40,48,148,137),
+(10,8,68,29,40,49,150,139),
+(10,8,69,30,41,49,153,142),
+(10,8,70,30,41,50,155,144),
+(10,8,71,30,41,50,158,147),
+(10,8,72,30,42,51,161,150),
+(10,8,73,30,42,52,164,153),
+(10,8,74,31,43,52,167,155),
+(10,8,75,31,43,53,170,158),
+(10,8,76,31,43,54,173,161),
+(10,8,77,32,44,55,176,164),
+(10,8,78,32,44,55,179,167),
+(10,8,79,32,45,56,182,170),
+(10,8,80,33,45,57,185,173),
+
+(10,9,1,17,22,20,26,21),
+(10,9,2,17,22,21,27,22),
+(10,9,3,18,23,21,28,23),
+(10,9,4,18,23,22,29,24),
+(10,9,5,18,23,22,31,26),
+(10,9,6,18,24,23,32,27),
+(10,9,7,19,24,23,33,28),
+(10,9,8,19,25,24,34,29),
+(10,9,9,19,25,25,36,30),
+(10,9,10,20,25,25,37,32),
+(10,9,11,20,26,26,38,33),
+(10,9,12,20,26,26,39,34),
+(10,9,13,21,27,27,41,36),
+(10,9,14,21,27,28,42,37),
+(10,9,15,21,27,28,43,38),
+(10,9,16,22,28,29,45,39),
+(10,9,17,22,28,30,46,41),
+(10,9,18,23,29,30,47,42),
+(10,9,19,23,29,31,49,43),
+(10,9,20,23,30,32,50,45),
+(10,9,21,24,30,32,51,46),
+(10,9,22,24,31,33,53,48),
+(10,9,23,24,31,34,54,49),
+(10,9,24,25,31,34,56,50),
+(10,9,25,25,32,35,57,52),
+(10,9,26,26,32,36,59,53),
+(10,9,27,26,33,37,60,55),
+(10,9,28,26,33,37,62,56),
+(10,9,29,27,34,38,63,58),
+(10,9,30,27,34,39,65,59),
+(10,9,31,28,35,40,66,61),
+(10,9,32,28,36,40,68,62),
+(10,9,33,29,36,41,69,64),
+(10,9,34,29,37,42,71,65),
+(10,9,35,29,37,43,73,67),
+(10,9,36,30,38,43,74,69),
+(10,9,37,30,38,44,76,70),
+(10,9,38,31,39,45,77,72),
+(10,9,39,31,39,46,79,73),
+(10,9,40,32,40,47,81,75),
+(10,9,41,32,41,48,82,77),
+(10,9,42,33,41,48,84,78),
+(10,9,43,33,42,49,86,80),
+(10,9,44,34,42,50,88,82),
+(10,9,45,34,43,51,89,83),
+(10,9,46,35,44,52,91,85),
+(10,9,47,35,44,53,93,87),
+(10,9,48,36,45,54,95,89),
+(10,9,49,36,45,54,96,90),
+(10,9,50,37,46,55,98,92),
+(10,9,51,37,47,56,100,94),
+(10,9,52,38,47,57,102,96),
+(10,9,53,38,48,58,104,97),
+(10,9,54,39,49,59,105,99),
+(10,9,55,39,49,60,107,101),
+(10,9,56,40,50,61,109,103),
+(10,9,57,40,51,62,111,105),
+(10,9,58,41,51,63,113,107),
+(10,9,59,42,52,64,115,108),
+(10,9,60,42,53,65,117,110),
+(10,9,61,43,53,66,119,112),
+(10,9,62,43,54,67,121,114),
+(10,9,63,44,55,68,123,116),
+(10,9,64,44,56,69,125,118),
+(10,9,65,45,56,70,127,120),
+(10,9,66,46,57,71,129,122),
+(10,9,67,46,58,72,131,124),
+(10,9,68,47,58,73,133,126),
+(10,9,69,47,59,74,135,128),
+(10,9,70,48,60,75,137,130),
+(10,9,71,49,61,83,139,141),
+(10,9,72,50,61,84,142,143),
+(10,9,73,51,62,84,144,146),
+(10,9,74,51,63,86,147,149),
+(10,9,75,52,64,89,149,151),
+(10,9,76,53,65,90,155,154),
+(10,9,77,54,66,91,155,157),
+(10,9,78,54,67,93,157,160),
+(10,9,79,55,68,94,160,163),
+(10,9,80,56,69,95,163,165),
+
+(11,1,1,24,17,21,21,22),
+(11,1,2,25,18,22,21,22),
+(11,1,3,27,19,23,21,23),
+(11,1,4,28,19,25,21,23),
+(11,1,5,29,20,26,21,23),
+(11,1,6,31,21,27,21,23),
+(11,1,7,32,22,28,21,24),
+(11,1,8,33,23,29,22,24),
+(11,1,9,35,24,31,22,24),
+(11,1,10,36,24,32,22,25),
+(11,1,11,37,25,33,22,25),
+(11,1,12,39,26,34,22,25),
+(11,1,13,40,27,36,22,26),
+(11,1,14,42,28,37,22,26),
+(11,1,15,43,29,38,22,26),
+(11,1,16,45,30,40,22,27),
+(11,1,17,46,31,41,23,27),
+(11,1,18,48,32,43,23,27),
+(11,1,19,49,33,44,23,28),
+(11,1,20,51,34,45,23,28),
+(11,1,21,52,34,47,23,28),
+(11,1,22,54,35,48,23,29),
+(11,1,23,55,36,50,23,29),
+(11,1,24,57,37,51,24,30),
+(11,1,25,59,38,52,24,30),
+(11,1,26,60,39,54,24,30),
+(11,1,27,62,40,55,24,31),
+(11,1,28,63,41,57,24,31),
+(11,1,29,65,43,58,24,32),
+(11,1,30,67,44,60,24,32),
+(11,1,31,69,45,62,25,32),
+(11,1,32,70,46,63,25,33),
+(11,1,33,72,47,65,25,33),
+(11,1,34,74,48,66,25,34),
+(11,1,35,75,49,68,25,34),
+(11,1,36,77,50,69,26,35),
+(11,1,37,79,51,71,26,35),
+(11,1,38,81,52,73,26,35),
+(11,1,39,83,53,74,26,36),
+(11,1,40,84,55,76,26,36),
+(11,1,41,86,56,78,27,37),
+(11,1,42,88,57,79,27,37),
+(11,1,43,90,58,81,27,38),
+(11,1,44,92,59,83,27,38),
+(11,1,45,94,60,85,27,39),
+(11,1,46,96,62,86,28,39),
+(11,1,47,98,63,88,28,40),
+(11,1,48,100,64,90,28,40),
+(11,1,49,102,65,92,28,41),
+(11,1,50,103,66,93,29,41),
+(11,1,51,105,68,95,29,42),
+(11,1,52,107,69,97,29,42),
+(11,1,53,109,70,99,29,43),
+(11,1,54,112,71,101,30,44),
+(11,1,55,114,73,103,30,44),
+(11,1,56,116,74,104,30,45),
+(11,1,57,118,75,106,30,45),
+(11,1,58,120,77,108,31,46),
+(11,1,59,122,78,110,31,46),
+(11,1,60,124,79,112,31,47),
+(11,1,61,126,81,114,31,48),
+(11,1,62,128,82,116,32,48),
+(11,1,63,130,83,118,32,49),
+(11,1,64,133,85,120,32,49),
+(11,1,65,135,86,122,33,50),
+(11,1,66,137,87,124,33,51),
+(11,1,67,139,89,126,33,51),
+(11,1,68,141,90,128,33,52),
+(11,1,69,144,92,130,34,52),
+(11,1,70,146,93,132,34,53),
+(11,1,71,149,94,134,34,54),
+(11,1,72,151,96,137,34,55),
+(11,1,73,154,98,139,34,56),
+(11,1,74,157,99,142,35,56),
+(11,1,75,166,101,149,35,57),
+(11,1,76,172,103,155,35,58),
+(11,1,77,175,105,159,36,59),
+(11,1,78,179,106,161,36,59),
+(11,1,79,182,108,164,36,60),
+(11,1,80,185,110,167,37,61),
+
+(11,2,1,23,17,21,21,23),
+(11,2,2,24,18,22,22,24),
+(11,2,3,25,18,23,22,24),
+(11,2,4,26,19,24,23,25),
+(11,2,5,27,19,25,24,26),
+(11,2,6,29,20,26,24,26),
+(11,2,7,30,21,27,25,27),
+(11,2,8,31,21,28,26,28),
+(11,2,9,32,22,29,26,29),
+(11,2,10,33,22,31,27,29),
+(11,2,11,34,23,32,28,30),
+(11,2,12,36,24,33,28,31),
+(11,2,13,37,24,34,29,32),
+(11,2,14,38,25,35,30,32),
+(11,2,15,39,26,36,31,33),
+(11,2,16,40,26,37,31,34),
+(11,2,17,42,27,39,32,35),
+(11,2,18,43,28,40,33,36),
+(11,2,19,44,28,41,34,37),
+(11,2,20,46,29,42,34,37),
+(11,2,21,47,30,44,35,38),
+(11,2,22,48,31,45,36,39),
+(11,2,23,50,31,46,37,40),
+(11,2,24,51,32,47,38,41),
+(11,2,25,52,33,49,38,42),
+(11,2,26,54,34,50,39,43),
+(11,2,27,55,34,51,40,44),
+(11,2,28,56,35,53,41,44),
+(11,2,29,58,36,54,42,45),
+(11,2,30,59,37,55,43,46),
+(11,2,31,61,37,57,43,47),
+(11,2,32,62,38,58,44,48),
+(11,2,33,64,39,59,45,49),
+(11,2,34,65,40,61,46,50),
+(11,2,35,67,41,62,47,51),
+(11,2,36,68,42,64,48,52),
+(11,2,37,70,42,65,49,53),
+(11,2,38,71,43,67,50,54),
+(11,2,39,73,44,68,51,55),
+(11,2,40,74,45,69,52,56),
+(11,2,41,76,46,71,53,57),
+(11,2,42,78,47,72,54,58),
+(11,2,43,79,47,74,55,59),
+(11,2,44,81,48,75,56,60),
+(11,2,45,82,49,77,57,61),
+(11,2,46,84,50,78,58,62),
+(11,2,47,86,51,80,59,64),
+(11,2,48,87,52,82,60,65),
+(11,2,49,89,53,83,61,66),
+(11,2,50,91,54,85,62,67),
+(11,2,51,92,55,86,63,68),
+(11,2,52,94,56,88,64,69),
+(11,2,53,96,57,90,65,70),
+(11,2,54,97,58,91,66,71),
+(11,2,55,99,59,93,67,73),
+(11,2,56,101,60,95,68,74),
+(11,2,57,103,61,96,69,75),
+(11,2,58,105,62,98,70,76),
+(11,2,59,106,63,100,71,77),
+(11,2,60,108,64,101,72,78),
+(11,2,61,110,65,103,74,80),
+(11,2,62,112,66,105,75,81),
+(11,2,63,114,67,106,76,82),
+(11,2,64,116,68,108,77,83),
+(11,2,65,117,69,110,78,85),
+(11,2,66,119,70,112,79,86),
+(11,2,67,121,71,114,80,87),
+(11,2,68,123,72,115,82,88),
+(11,2,69,125,73,117,83,90),
+(11,2,70,127,74,119,84,91),
+(11,2,71,130,75,121,87,92),
+(11,2,72,132,76,124,90,94),
+(11,2,73,134,77,126,93,96),
+(11,2,74,137,79,128,97,97),
+(11,2,75,139,80,130,101,99),
+(11,2,76,142,81,133,106,100),
+(11,2,77,144,83,135,108,102),
+(11,2,78,147,84,137,110,104),
+(11,2,79,149,85,140,111,105),
+(11,2,80,152,87,142,113,107),
+
+(11,3,1,21,20,20,21,23),
+(11,3,2,21,21,21,22,24),
+(11,3,3,22,23,22,22,24),
+(11,3,4,22,24,23,23,25),
+(11,3,5,23,25,24,23,25),
+(11,3,6,23,27,25,24,26),
+(11,3,7,24,28,26,24,27),
+(11,3,8,24,30,27,25,27),
+(11,3,9,25,31,27,26,28),
+(11,3,10,25,33,28,26,29),
+(11,3,11,25,34,29,27,29),
+(11,3,12,26,36,30,28,30),
+(11,3,13,26,37,31,28,31),
+(11,3,14,27,39,32,29,32),
+(11,3,15,27,40,34,30,32),
+(11,3,16,28,42,35,30,33),
+(11,3,17,28,43,36,31,34),
+(11,3,18,29,45,37,32,35),
+(11,3,19,29,47,38,32,35),
+(11,3,20,30,48,39,33,36),
+(11,3,21,31,50,40,34,37),
+(11,3,22,31,51,41,34,38),
+(11,3,23,32,53,42,35,38),
+(11,3,24,32,55,43,36,39),
+(11,3,25,33,57,44,37,40),
+(11,3,26,33,58,46,37,41),
+(11,3,27,34,60,47,38,42),
+(11,3,28,35,62,48,39,42),
+(11,3,29,35,63,49,40,43),
+(11,3,30,36,65,50,40,44),
+(11,3,31,36,67,52,41,45),
+(11,3,32,37,69,53,42,46),
+(11,3,33,38,71,54,43,47),
+(11,3,34,38,72,55,44,48),
+(11,3,35,39,74,57,44,48),
+(11,3,36,39,76,58,45,49),
+(11,3,37,40,78,59,46,50),
+(11,3,38,41,80,60,47,51),
+(11,3,39,41,82,62,48,52),
+(11,3,40,42,84,63,49,53),
+(11,3,41,43,86,64,50,54),
+(11,3,42,43,88,66,50,55),
+(11,3,43,44,90,67,51,56),
+(11,3,44,45,91,68,52,57),
+(11,3,45,45,93,70,53,58),
+(11,3,46,46,95,71,54,59),
+(11,3,47,47,98,72,55,60),
+(11,3,48,48,100,74,56,61),
+(11,3,49,48,102,75,57,62),
+(11,3,50,49,104,77,58,63),
+(11,3,51,50,106,78,59,64),
+(11,3,52,51,108,79,60,65),
+(11,3,53,51,110,81,61,66),
+(11,3,54,52,112,82,61,67),
+(11,3,55,53,114,84,62,68),
+(11,3,56,54,116,85,63,69),
+(11,3,57,54,118,87,64,70),
+(11,3,58,55,121,88,65,71),
+(11,3,59,56,123,90,66,72),
+(11,3,60,57,125,91,67,74),
+(11,3,61,58,127,93,68,75),
+(11,3,62,58,130,94,69,76),
+(11,3,63,59,132,96,71,77),
+(11,3,64,60,134,97,72,78),
+(11,3,65,61,136,99,73,79),
+(11,3,66,62,139,101,74,80),
+(11,3,67,62,141,102,75,81),
+(11,3,68,63,143,104,76,83),
+(11,3,69,64,146,105,77,84),
+(11,3,70,65,148,107,78,85),
+(11,3,71,66,151,109,79,86),
+(11,3,72,67,154,111,80,87),
+(11,3,73,68,157,113,81,89),
+(11,3,74,69,160,115,83,90),
+(11,3,75,70,163,117,84,92),
+(11,3,76,71,166,119,85,93),
+(11,3,77,72,169,121,87,95),
+(11,3,78,73,172,123,88,96),
+(11,3,79,74,175,125,89,98),
+(11,3,80,75,178,127,91,99),
+
+(11,5,1,21,17,19,23,25),
+(11,5,2,21,17,19,24,26),
+(11,5,3,21,17,20,26,28),
+(11,5,4,21,18,20,27,29),
+(11,5,5,22,18,20,28,30),
+(11,5,6,22,18,21,30,32),
+(11,5,7,22,18,21,31,33),
+(11,5,8,22,19,22,32,35),
+(11,5,9,22,19,22,34,36),
+(11,5,10,22,19,22,35,38),
+(11,5,11,23,19,23,37,39),
+(11,5,12,23,20,23,38,41),
+(11,5,13,23,20,24,39,42),
+(11,5,14,23,20,24,41,44),
+(11,5,15,23,20,25,42,45),
+(11,5,16,24,21,25,44,47),
+(11,5,17,24,21,25,45,48),
+(11,5,18,24,21,26,47,50),
+(11,5,19,24,22,26,48,51),
+(11,5,20,24,22,27,50,53),
+(11,5,21,25,22,27,51,55),
+(11,5,22,25,22,28,53,56),
+(11,5,23,25,23,28,55,58),
+(11,5,24,25,23,29,56,60),
+(11,5,25,25,23,29,58,61),
+(11,5,26,26,24,30,60,63),
+(11,5,27,26,24,30,61,65),
+(11,5,28,26,24,31,63,66),
+(11,5,29,26,25,31,65,68),
+(11,5,30,27,25,32,66,70),
+(11,5,31,27,25,32,68,72),
+(11,5,32,27,26,33,70,73),
+(11,5,33,27,26,33,71,75),
+(11,5,34,28,26,34,73,77),
+(11,5,35,28,27,34,75,79),
+(11,5,36,28,27,35,77,81),
+(11,5,37,29,28,35,79,83),
+(11,5,38,29,28,36,80,85),
+(11,5,39,29,28,37,82,86),
+(11,5,40,29,29,37,84,88),
+(11,5,41,30,29,38,86,90),
+(11,5,42,30,29,38,88,92),
+(11,5,43,30,30,39,90,94),
+(11,5,44,31,30,39,91,96),
+(11,5,45,31,31,40,93,98),
+(11,5,46,31,31,41,95,100),
+(11,5,47,32,31,41,97,102),
+(11,5,48,32,32,42,99,104),
+(11,5,49,32,32,43,101,106),
+(11,5,50,33,33,43,103,108),
+(11,5,51,33,33,44,105,110),
+(11,5,52,33,34,44,107,113),
+(11,5,53,34,34,45,109,115),
+(11,5,54,34,34,46,111,117),
+(11,5,55,34,35,46,113,119),
+(11,5,56,35,35,47,115,121),
+(11,5,57,35,36,48,118,123),
+(11,5,58,35,36,48,120,126),
+(11,5,59,36,37,49,122,128),
+(11,5,60,36,37,50,124,130),
+(11,5,61,36,38,51,126,132),
+(11,5,62,37,38,51,128,134),
+(11,5,63,37,39,52,130,137),
+(11,5,64,38,39,53,133,139),
+(11,5,65,38,40,53,135,141),
+(11,5,66,38,40,54,137,144),
+(11,5,67,39,40,55,139,146),
+(11,5,68,39,41,56,141,148),
+(11,5,69,40,41,56,144,151),
+(11,5,70,40,42,57,146,153),
+(11,5,71,40,43,58,149,156),
+(11,5,72,41,43,58,155,159),
+(11,5,73,41,44,59,157,160),
+(11,5,74,42,44,61,160,163),
+(11,5,75,42,45,62,164,166),
+(11,5,76,42,46,62,167,169),
+(11,5,77,43,46,63,168,172),
+(11,5,78,43,47,64,169,177),
+(11,5,79,44,47,65,172,180),
+(11,5,80,44,48,66,175,183),
+
+(11,6,1,24,17,21,21,22),
+(11,6,2,25,18,22,21,22),
+(11,6,3,27,19,23,21,23),
+(11,6,4,28,19,25,21,23),
+(11,6,5,29,20,26,21,23),
+(11,6,6,31,21,27,21,23),
+(11,6,7,32,22,28,21,24),
+(11,6,8,33,23,29,22,24),
+(11,6,9,35,24,31,22,24),
+(11,6,10,36,24,32,22,25),
+(11,6,11,37,25,33,22,25),
+(11,6,12,39,26,34,22,25),
+(11,6,13,40,27,36,22,26),
+(11,6,14,42,28,37,22,26),
+(11,6,15,43,29,38,22,26),
+(11,6,16,45,30,40,22,27),
+(11,6,17,46,31,41,23,27),
+(11,6,18,48,32,43,23,27),
+(11,6,19,49,33,44,23,28),
+(11,6,20,51,34,45,23,28),
+(11,6,21,52,34,47,23,28),
+(11,6,22,54,35,48,23,29),
+(11,6,23,55,36,50,23,29),
+(11,6,24,57,37,51,24,30),
+(11,6,25,59,38,52,24,30),
+(11,6,26,60,39,54,24,30),
+(11,6,27,62,40,55,24,31),
+(11,6,28,63,41,57,24,31),
+(11,6,29,65,43,58,24,32),
+(11,6,30,67,44,60,24,32),
+(11,6,31,69,45,62,25,32),
+(11,6,32,70,46,63,25,33),
+(11,6,33,72,47,65,25,33),
+(11,6,34,74,48,66,25,34),
+(11,6,35,75,49,68,25,34),
+(11,6,36,77,50,69,26,35),
+(11,6,37,79,51,71,26,35),
+(11,6,38,81,52,73,26,35),
+(11,6,39,83,53,74,26,36),
+(11,6,40,84,55,76,26,36),
+(11,6,41,86,56,78,27,37),
+(11,6,42,88,57,79,27,37),
+(11,6,43,90,58,81,27,38),
+(11,6,44,92,59,83,27,38),
+(11,6,45,94,60,85,27,39),
+(11,6,46,96,62,86,28,39),
+(11,6,47,98,63,88,28,40),
+(11,6,48,100,64,90,28,40),
+(11,6,49,102,65,92,28,41),
+(11,6,50,103,65,93,29,41),
+(11,6,51,105,66,94,29,42),
+(11,6,52,106,67,95,29,42),
+(11,6,53,107,68,96,29,43),
+(11,6,54,108,69,97,30,44),
+(11,6,55,109,70,98,30,44),
+(11,6,56,112,72,101,30,45),
+(11,6,57,114,73,103,30,45),
+(11,6,58,117,74,105,31,46),
+(11,6,59,119,76,107,31,46),
+(11,6,60,121,77,109,31,47),
+(11,6,61,123,78,111,31,48),
+(11,6,62,126,80,113,31,48),
+(11,6,63,128,81,116,32,49),
+(11,6,64,131,83,118,32,49),
+(11,6,65,136,84,120,32,50),
+(11,6,66,140,86,123,32,51),
+(11,6,67,141,87,125,33,51),
+(11,6,68,141,89,127,33,52),
+(11,6,69,144,90,130,33,53),
+(11,6,70,147,92,132,33,53),
+(11,6,71,150,94,135,34,54),
+(11,6,72,152,95,137,34,55),
+(11,6,73,155,97,140,34,56),
+(11,6,74,162,99,142,34,56),
+(11,6,75,165,100,145,35,57),
+(11,6,76,167,102,146,35,58),
+(11,6,77,169,104,150,35,59),
+(11,6,78,170,105,152,35,59),
+(11,6,79,173,107,156,36,60),
+(11,6,80,176,109,159,36,61),
+
+(11,7,1,22,17,20,22,24),
+(11,7,2,23,17,21,23,25),
+(11,7,3,24,18,22,24,26),
+(11,7,4,25,18,23,25,27),
+(11,7,5,25,19,24,26,28),
+(11,7,6,26,19,25,27,29),
+(11,7,7,27,20,26,28,30),
+(11,7,8,28,20,27,28,31),
+(11,7,9,29,21,28,29,32),
+(11,7,10,30,21,29,30,33),
+(11,7,11,31,22,30,31,35),
+(11,7,12,32,22,31,32,36),
+(11,7,13,33,23,32,33,37),
+(11,7,14,34,23,33,34,38),
+(11,7,15,34,24,35,35,39),
+(11,7,16,35,24,36,36,40),
+(11,7,17,36,25,37,38,42),
+(11,7,18,37,25,38,39,43),
+(11,7,19,38,26,39,40,44),
+(11,7,20,39,26,40,41,45),
+(11,7,21,40,27,41,42,46),
+(11,7,22,41,27,43,43,48),
+(11,7,23,43,28,44,44,49),
+(11,7,24,44,28,45,45,50),
+(11,7,25,45,29,46,46,51),
+(11,7,26,46,30,47,48,53),
+(11,7,27,47,30,49,49,54),
+(11,7,28,48,31,50,50,55),
+(11,7,29,49,31,51,51,57),
+(11,7,30,50,32,53,52,58),
+(11,7,31,51,33,54,53,59),
+(11,7,32,52,33,55,55,61),
+(11,7,33,53,34,56,56,62),
+(11,7,34,55,34,58,57,64),
+(11,7,35,56,35,59,58,65),
+(11,7,36,57,36,60,60,66),
+(11,7,37,58,36,62,61,68),
+(11,7,38,59,37,63,62,69),
+(11,7,39,61,38,65,63,71),
+(11,7,40,62,38,66,65,72),
+(11,7,41,63,39,67,66,74),
+(11,7,42,64,40,69,67,75),
+(11,7,43,65,40,70,69,77),
+(11,7,44,67,41,72,70,78),
+(11,7,45,68,42,73,71,80),
+(11,7,46,69,42,75,73,81),
+(11,7,47,71,43,76,74,83),
+(11,7,48,72,44,78,76,84),
+(11,7,49,73,45,79,77,86),
+(11,7,50,74,45,81,78,88),
+(11,7,51,76,46,82,80,89),
+(11,7,52,77,47,84,81,91),
+(11,7,53,78,47,85,83,92),
+(11,7,54,80,48,87,84,94),
+(11,7,55,81,49,88,86,96),
+(11,7,56,83,50,90,87,97),
+(11,7,57,84,50,91,89,99),
+(11,7,58,85,51,93,90,101),
+(11,7,59,87,52,95,92,102),
+(11,7,60,88,53,96,93,104),
+(11,7,61,90,54,98,95,106),
+(11,7,62,91,54,99,96,108),
+(11,7,63,93,55,101,98,109),
+(11,7,64,94,56,103,99,111),
+(11,7,65,95,57,104,101,113),
+(11,7,66,97,58,106,103,115),
+(11,7,67,98,58,108,104,117),
+(11,7,68,100,59,110,106,118),
+(11,7,69,101,60,111,107,120),
+(11,7,70,103,61,113,109,122),
+(11,7,71,104,62,115,122,124),
+(11,7,72,106,63,117,124,127),
+(11,7,73,108,64,119,126,129),
+(11,7,74,110,65,122,128,131),
+(11,7,75,112,66,124,130,133),
+(11,7,76,114,67,126,133,136),
+(11,7,77,115,68,128,135,138),
+(11,7,78,117,69,130,137,140),
+(11,7,79,119,70,133,139,143),
+(11,7,80,121,71,135,141,145),
+
+(11,8,1,21,17,19,24,24),
+(11,8,2,21,17,19,25,25),
+(11,8,3,21,17,20,27,27),
+(11,8,4,21,17,20,28,28),
+(11,8,5,21,18,20,29,29),
+(11,8,6,21,18,20,31,31),
+(11,8,7,21,18,21,32,32),
+(11,8,8,22,18,21,34,33),
+(11,8,9,22,18,21,35,35),
+(11,8,10,22,19,22,37,36),
+(11,8,11,22,19,22,38,37),
+(11,8,12,22,19,22,40,39),
+(11,8,13,22,19,23,41,40),
+(11,8,14,22,19,23,43,42),
+(11,8,15,22,19,23,44,43),
+(11,8,16,22,20,24,46,45),
+(11,8,17,23,20,24,47,46),
+(11,8,18,23,20,24,49,48),
+(11,8,19,23,20,25,50,49),
+(11,8,20,23,21,25,52,51),
+(11,8,21,23,21,26,54,52),
+(11,8,22,23,21,26,55,54),
+(11,8,23,23,21,26,57,56),
+(11,8,24,24,21,27,59,57),
+(11,8,25,24,22,27,60,59),
+(11,8,26,24,22,27,62,60),
+(11,8,27,24,22,28,64,62),
+(11,8,28,24,22,28,65,64),
+(11,8,29,24,23,29,67,65),
+(11,8,30,24,23,29,69,67),
+(11,8,31,25,23,30,71,69),
+(11,8,32,25,23,30,73,71),
+(11,8,33,25,24,30,74,72),
+(11,8,34,25,24,31,76,74),
+(11,8,35,25,24,31,78,76),
+(11,8,36,26,24,32,80,78),
+(11,8,37,26,25,32,82,79),
+(11,8,38,26,25,33,84,81),
+(11,8,39,26,25,33,86,83),
+(11,8,40,26,26,34,87,85),
+(11,8,41,27,26,34,89,87),
+(11,8,42,27,26,35,91,89),
+(11,8,43,27,27,35,93,91),
+(11,8,44,27,27,36,95,92),
+(11,8,45,27,27,36,97,94),
+(11,8,46,28,27,37,99,96),
+(11,8,47,28,28,37,101,98),
+(11,8,48,28,28,38,103,100),
+(11,8,49,28,28,38,105,102),
+(11,8,50,29,29,39,107,104),
+(11,8,51,29,29,39,110,106),
+(11,8,52,29,29,40,112,108),
+(11,8,53,29,30,40,114,110),
+(11,8,54,30,30,41,116,112),
+(11,8,55,30,30,41,118,114),
+(11,8,56,30,31,42,120,116),
+(11,8,57,30,31,42,122,118),
+(11,8,58,31,31,43,125,121),
+(11,8,59,31,32,43,127,123),
+(11,8,60,31,32,44,129,125),
+(11,8,61,31,33,45,131,127),
+(11,8,62,32,33,45,133,129),
+(11,8,63,32,33,46,136,131),
+(11,8,64,32,34,46,138,134),
+(11,8,65,33,34,47,140,136),
+(11,8,66,33,34,48,143,138),
+(11,8,67,33,35,48,145,140),
+(11,8,68,33,35,49,147,142),
+(11,8,69,34,36,49,150,145),
+(11,8,70,34,36,50,152,147),
+(11,8,71,34,36,51,155,150),
+(11,8,72,34,37,52,161,153),
+(11,8,73,34,37,53,161,156),
+(11,8,74,35,38,53,164,158),
+(11,8,75,35,38,54,167,161),
+(11,8,76,35,38,55,170,164),
+(11,8,77,36,39,56,173,167),
+(11,8,78,36,39,56,176,170),
+(11,8,79,36,40,57,179,173),
+(11,8,80,37,40,58,182,176);
+
+DELETE FROM `playercreateinfo` WHERE class = 6;
+INSERT INTO `playercreateinfo` VALUES
+(1 ,6,609,4298,2355.84,-5664.77,426.028),
+(2 ,6,609,4298,2358.44,-5666.9, 426.023),
+(3 ,6,609,4298,2358.44,-5666.9, 426.023),
+(4 ,6,609,4298,2356.21,-5662.21,426.026),
+(5 ,6,609,4298,2356.21,-5662.21,426.026),
+(6 ,6,609,4298,2358.17,-5663.21,426.027),
+(7 ,6,609,4298,2355.05,-5661.7, 426.026),
+(8 ,6,609,4298,2355.05,-5661.7, 426.026),
+(10,6,609,4298,2355.84,-5664.77,426.028),
+(11,6,609,4298,2358.17,-5663.21,426.027);
+
+DELETE FROM playercreateinfo_action WHERE class = 6;
+INSERT INTO playercreateinfo_action VALUES
+(1,6,0,6603,0,0),
+(1,6,1,49576,0,0),
+(1,6,2,45477,0,0),
+(1,6,3,45462,0,0),
+(1,6,4,45902,0,0),
+(1,6,5,47541,0,0),
+(1,6,11,59752,0,0),
+(2,6,0,6603,0,0),
+(2,6,1,49576,0,0),
+(2,6,2,45477,0,0),
+(2,6,3,45462,0,0),
+(2,6,4,45902,0,0),
+(2,6,5,47541,0,0),
+(2,6,10,20572,0,0),
+(3,6,0,6603,0,0),
+(3,6,1,49576,0,0),
+(3,6,2,45477,0,0),
+(3,6,3,45462,0,0),
+(3,6,4,45902,0,0),
+(3,6,5,47541,0,0),
+(3,6,10,2481,0,0),
+(4,6,0,6603,0,0),
+(4,6,1,49576,0,0),
+(4,6,2,45477,0,0),
+(4,6,3,45462,0,0),
+(4,6,4,45902,0,0),
+(4,6,5,47541,0,0),
+(4,6,10,58984,0,0),
+(4,6,83,58984,0,0),
+(5,6,0,6603,0,0),
+(5,6,1,49576,0,0),
+(5,6,2,45477,0,0),
+(5,6,3,45462,0,0),
+(5,6,4,45902,0,0),
+(5,6,5,47541,0,0),
+(5,6,10,20577,0,0),
+(6,6,0,6603,0,0),
+(6,6,1,49576,0,0),
+(6,6,2,45477,0,0),
+(6,6,3,45462,0,0),
+(6,6,4,45902,0,0),
+(6,6,5,47541,0,0),
+(6,6,10,20549,0,0),
+(6,6,75,20549,0,0),
+(7,6,0,6603,0,0),
+(7,6,1,49576,0,0),
+(7,6,2,45477,0,0),
+(7,6,3,45462,0,0),
+(7,6,4,45902,0,0),
+(7,6,5,47541,0,0),
+(7,6,10,20589,0,0),
+(7,6,72,6603,0,0),
+(7,6,83,117,128,0),
+(7,6,84,6603,0,0),
+(7,6,96,6603,0,0),
+(7,6,108,6603,0,0),
+(8,6,0,6603,0,0),
+(8,6,1,49576,0,0),
+(8,6,2,45477,0,0),
+(8,6,3,45462,0,0),
+(8,6,4,45902,0,0),
+(8,6,5,47541,0,0),
+(8,6,10,50621,0,0),
+(10,6,0,6603,0,0),
+(10,6,1,49576,0,0),
+(10,6,2,45477,0,0),
+(10,6,3,45462,0,0),
+(10,6,4,45902,0,0),
+(10,6,5,47541,0,0),
+(10,6,6,50613,0,0),
+(11,6,0,6603,0,0),
+(11,6,1,49576,0,0),
+(11,6,2,45477,0,0),
+(11,6,3,45462,0,0),
+(11,6,4,45902,0,0),
+(11,6,5,47541,0,0);
+
+DELETE FROM `playercreateinfo_spell` WHERE `class` = 6;
+INSERT INTO `playercreateinfo_spell` VALUES
+(1,6,81,'Dodge',1),
+(1,6,196,'One-Handed Axes',1),
+(1,6,197,'Two-Handed Axes',1),
+(1,6,200,'Polearms',1),
+(1,6,201,'One-Handed Swords',1),
+(1,6,202,'Two-Handed Swords',1),
+(1,6,203,'Unarmed',1),
+(1,6,204,'Defense',1),
+(1,6,522,'SPELLDEFENSE (DND)',1),
+(1,6,668,'Language Common',1),
+(1,6,674,'Dual Wield',1),
+(1,6,750,'Plate Mail',1),
+(1,6,1843,'Disarm',1),
+(1,6,2382,'Generic',1),
+(1,6,2479,'Honorless Target',1),
+(1,6,3050,'Detect',1),
+(1,6,3127,'Parry',1),
+(1,6,3275,'Linen Bandage',1),
+(1,6,3276,'Heavy Linen Bandage',1),
+(1,6,3277,'Wool Bandage',1),
+(1,6,3278,'Heavy Wool Bandage',1),
+(1,6,3365,'Opening',1),
+(1,6,6233,'Closing',1),
+(1,6,6246,'Closing',1),
+(1,6,6247,'Opening',1),
+(1,6,6477,'Opening',1),
+(1,6,6478,'Opening',1),
+(1,6,6603,'Attack',1),
+(1,6,7266,'Duel',1),
+(1,6,7267,'Grovel',1),
+(1,6,7355,'Stuck',1),
+(1,6,7928,'Silk Bandage',1),
+(1,6,7929,'Heavy Silk Bandage',1),
+(1,6,7934,'Anti-Venom',1),
+(1,6,8386,'Attacking',1),
+(1,6,8737,'Mail',1),
+(1,6,9077,'Leather',1),
+(1,6,9078,'Cloth',1),
+(1,6,9125,'Generic',1),
+(1,6,10840,'Mageweave Bandage',1),
+(1,6,10841,'Heavy Mageweave Bandage',1),
+(1,6,10846,'First Aid',1),
+(1,6,18629,'Runecloth Bandage',1),
+(1,6,18630,'Heavy Runecloth Bandage',1),
+(1,6,20597,'Sword Specialization',1),
+(1,6,20598,'The Human Spirit',1),
+(1,6,20599,'Diplomacy',1),
+(1,6,20864,'Mace Specialization',1),
+(1,6,21651,'Opening',1),
+(1,6,21652,'Closing',1),
+(1,6,22027,'Remove Insignia',1),
+(1,6,22810,'Opening - No Text',1),
+(1,6,33391,'Journeyman Riding',1),
+(1,6,45462,'Plague Strike',1),
+(1,6,45477,'Icy Touch',1),
+(1,6,45902,'Blood Strike',1),
+(1,6,45903,'Offensive State (DND)',1),
+(1,6,45927,'Summon Friend',1),
+(1,6,47541,'Death Coil',1),
+(1,6,48266,'Blood Presence',1),
+(1,6,49410,'Forceful Deflection',1),
+(1,6,49576,'Death Grip',1),
+(1,6,52665,'Sigil',1),
+(1,6,58985,'Perception',1),
+(1,6,59752,'Every Man for Himself',1),
+(1,6,59879,'Blood Plague',1),
+(1,6,59921,'Frost Fever',1),
+(1,6,61437,'Opening',1),
+(1,6,61455,'Runic Focus',1),
+(2,6,81,'Dodge',1),
+(2,6,196,'One-Handed Axes',1),
+(2,6,197,'Two-Handed Axes',1),
+(2,6,200,'Polearms',1),
+(2,6,201,'One-Handed Swords',1),
+(2,6,202,'Two-Handed Swords',1),
+(2,6,203,'Unarmed',1),
+(2,6,204,'Defense',1),
+(2,6,522,'SPELLDEFENSE (DND)',1),
+(2,6,669,'Language Orcish',1),
+(2,6,674,'Dual Wield',1),
+(2,6,750,'Plate Mail',1),
+(2,6,1843,'Disarm',1),
+(2,6,2382,'Generic',1),
+(2,6,2479,'Honorless Target',1),
+(2,6,3050,'Detect',1),
+(2,6,3127,'Parry',1),
+(2,6,3275,'Linen Bandage',1),
+(2,6,3276,'Heavy Linen Bandage',1),
+(2,6,3277,'Wool Bandage',1),
+(2,6,3278,'Heavy Wool Bandage',1),
+(2,6,3365,'Opening',1),
+(2,6,6233,'Closing',1),
+(2,6,6246,'Closing',1),
+(2,6,6247,'Opening',1),
+(2,6,6477,'Opening',1),
+(2,6,6478,'Opening',1),
+(2,6,6603,'Attack',1),
+(2,6,7266,'Duel',1),
+(2,6,7267,'Grovel',1),
+(2,6,7355,'Stuck',1),
+(2,6,7928,'Silk Bandage',1),
+(2,6,7929,'Heavy Silk Bandage',1),
+(2,6,7934,'Anti-Venom',1),
+(2,6,8386,'Attacking',1),
+(2,6,8737,'Mail',1),
+(2,6,9077,'Leather',1),
+(2,6,9078,'Cloth',1),
+(2,6,9125,'Generic',1),
+(2,6,10840,'Mageweave Bandage',1),
+(2,6,10841,'Heavy Mageweave Bandage',1),
+(2,6,10846,'First Aid',1),
+(2,6,18629,'Runecloth Bandage',1),
+(2,6,18630,'Heavy Runecloth Bandage',1),
+(2,6,20572,'Blood Fury',1),
+(2,6,20573,'Hardiness',1),
+(2,6,20574,'Axe Specialization',1),
+(2,6,21651,'Opening',1),
+(2,6,21652,'Closing',1),
+(2,6,22027,'Remove Insignia',1),
+(2,6,22810,'Opening - No Text',1),
+(2,6,33391,'Journeyman Riding',1),
+(2,6,45462,'Plague Strike',1),
+(2,6,45477,'Icy Touch',1),
+(2,6,45902,'Blood Strike',1),
+(2,6,45903,'Offensive State (DND)',1),
+(2,6,45927,'Summon Friend',1),
+(2,6,47541,'Death Coil',1),
+(2,6,48266,'Blood Presence',1),
+(2,6,49410,'Forceful Deflection',1),
+(2,6,49576,'Death Grip',1),
+(2,6,52665,'Sigil',1),
+(2,6,54562,'Command',1),
+(2,6,59879,'Blood Plague',1),
+(2,6,59921,'Frost Fever',1),
+(2,6,61437,'Opening',1),
+(2,6,61455,'Runic Focus',1),
+(3,6,81,'Dodge',1),
+(3,6,196,'One-Handed Axes',1),
+(3,6,197,'Two-Handed Axes',1),
+(3,6,200,'Polearms',1),
+(3,6,201,'One-Handed Swords',1),
+(3,6,202,'Two-Handed Swords',1),
+(3,6,203,'Unarmed',1),
+(3,6,204,'Defense',1),
+(3,6,522,'SPELLDEFENSE (DND)',1),
+(3,6,668,'Language Common',1),
+(3,6,672,'Language Dwarven',1),
+(3,6,674,'Dual Wield',1),
+(3,6,750,'Plate Mail',1),
+(3,6,1843,'Disarm',1),
+(3,6,2382,'Generic',1),
+(3,6,2479,'Honorless Target',1),
+(3,6,2481,'Find Treasure',1),
+(3,6,3050,'Detect',1),
+(3,6,3127,'Parry',1),
+(3,6,3275,'Linen Bandage',1),
+(3,6,3276,'Heavy Linen Bandage',1),
+(3,6,3277,'Wool Bandage',1),
+(3,6,3278,'Heavy Wool Bandage',1),
+(3,6,3365,'Opening',1),
+(3,6,6233,'Closing',1),
+(3,6,6246,'Closing',1),
+(3,6,6247,'Opening',1),
+(3,6,6477,'Opening',1),
+(3,6,6478,'Opening',1),
+(3,6,6603,'Attack',1),
+(3,6,7266,'Duel',1),
+(3,6,7267,'Grovel',1),
+(3,6,7355,'Stuck',1),
+(3,6,7928,'Silk Bandage',1),
+(3,6,7929,'Heavy Silk Bandage',1),
+(3,6,7934,'Anti-Venom',1),
+(3,6,8386,'Attacking',1),
+(3,6,8737,'Mail',1),
+(3,6,9077,'Leather',1),
+(3,6,9078,'Cloth',1),
+(3,6,9125,'Generic',1),
+(3,6,10840,'Mageweave Bandage',1),
+(3,6,10841,'Heavy Mageweave Bandage',1),
+(3,6,10846,'First Aid',1),
+(3,6,18629,'Runecloth Bandage',1),
+(3,6,18630,'Heavy Runecloth Bandage',1),
+(3,6,20594,'Stoneform',1),
+(3,6,20595,'Gun Specialization',1),
+(3,6,20596,'Frost Resistance',1),
+(3,6,21651,'Opening',1),
+(3,6,21652,'Closing',1),
+(3,6,22027,'Remove Insignia',1),
+(3,6,22810,'Opening - No Text',1),
+(3,6,33391,'Journeyman Riding',1),
+(3,6,45462,'Plague Strike',1),
+(3,6,45477,'Icy Touch',1),
+(3,6,45902,'Blood Strike',1),
+(3,6,45903,'Offensive State (DND)',1),
+(3,6,45927,'Summon Friend',1),
+(3,6,47541,'Death Coil',1),
+(3,6,48266,'Blood Presence',1),
+(3,6,49410,'Forceful Deflection',1),
+(3,6,49576,'Death Grip',1),
+(3,6,52665,'Sigil',1),
+(3,6,59224,'Mace Specialization',1),
+(3,6,59879,'Blood Plague',1),
+(3,6,59921,'Frost Fever',1),
+(3,6,61437,'Opening',1),
+(3,6,61455,'Runic Focus',1),
+(4,6,81,'Dodge',1),
+(4,6,196,'One-Handed Axes',1),
+(4,6,197,'Two-Handed Axes',1),
+(4,6,200,'Polearms',1),
+(4,6,201,'One-Handed Swords',1),
+(4,6,202,'Two-Handed Swords',1),
+(4,6,203,'Unarmed',1),
+(4,6,204,'Defense',1),
+(4,6,522,'SPELLDEFENSE (DND)',1),
+(4,6,668,'Language Common',1),
+(4,6,671,'Language Darnassian',1),
+(4,6,674,'Dual Wield',1),
+(4,6,750,'Plate Mail',1),
+(4,6,1843,'Disarm',1),
+(4,6,2382,'Generic',1),
+(4,6,2479,'Honorless Target',1),
+(4,6,3050,'Detect',1),
+(4,6,3127,'Parry',1),
+(4,6,3275,'Linen Bandage',1),
+(4,6,3276,'Heavy Linen Bandage',1),
+(4,6,3277,'Wool Bandage',1),
+(4,6,3278,'Heavy Wool Bandage',1),
+(4,6,3365,'Opening',1),
+(4,6,6233,'Closing',1),
+(4,6,6246,'Closing',1),
+(4,6,6247,'Opening',1),
+(4,6,6477,'Opening',1),
+(4,6,6478,'Opening',1),
+(4,6,6603,'Attack',1),
+(4,6,7266,'Duel',1),
+(4,6,7267,'Grovel',1),
+(4,6,7355,'Stuck',1),
+(4,6,7928,'Silk Bandage',1),
+(4,6,7929,'Heavy Silk Bandage',1),
+(4,6,7934,'Anti-Venom',1),
+(4,6,8386,'Attacking',1),
+(4,6,8737,'Mail',1),
+(4,6,9077,'Leather',1),
+(4,6,9078,'Cloth',1),
+(4,6,9125,'Generic',1),
+(4,6,10840,'Mageweave Bandage',1),
+(4,6,10841,'Heavy Mageweave Bandage',1),
+(4,6,10846,'First Aid',1),
+(4,6,18629,'Runecloth Bandage',1),
+(4,6,18630,'Heavy Runecloth Bandage',1),
+(4,6,20582,'Quickness',1),
+(4,6,20583,'Nature Resistance',1),
+(4,6,20585,'Wisp Spirit',1),
+(4,6,21651,'Opening',1),
+(4,6,21652,'Closing',1),
+(4,6,22027,'Remove Insignia',1),
+(4,6,22810,'Opening - No Text',1),
+(4,6,33391,'Journeyman Riding',1),
+(4,6,45462,'Plague Strike',1),
+(4,6,45477,'Icy Touch',1),
+(4,6,45902,'Blood Strike',1),
+(4,6,45903,'Offensive State (DND)',1),
+(4,6,45927,'Summon Friend',1),
+(4,6,47541,'Death Coil',1),
+(4,6,48266,'Blood Presence',1),
+(4,6,49410,'Forceful Deflection',1),
+(4,6,49576,'Death Grip',1),
+(4,6,52665,'Sigil',1),
+(4,6,58984,'Shadowmeld',1),
+(4,6,59879,'Blood Plague',1),
+(4,6,59921,'Frost Fever',1),
+(4,6,61437,'Opening',1),
+(4,6,61455,'Runic Focus',1),
+(5,6,81,'Dodge',1),
+(5,6,196,'One-Handed Axes',1),
+(5,6,197,'Two-Handed Axes',1),
+(5,6,200,'Polearms',1),
+(5,6,201,'One-Handed Swords',1),
+(5,6,202,'Two-Handed Swords',1),
+(5,6,203,'Unarmed',1),
+(5,6,204,'Defense',1),
+(5,6,522,'SPELLDEFENSE (DND)',1),
+(5,6,669,'Language Orcish',1),
+(5,6,674,'Dual Wield',1),
+(5,6,750,'Plate Mail',1),
+(5,6,1843,'Disarm',1),
+(5,6,2382,'Generic',1),
+(5,6,2479,'Honorless Target',1),
+(5,6,3050,'Detect',1),
+(5,6,3127,'Parry',1),
+(5,6,3275,'Linen Bandage',1),
+(5,6,3276,'Heavy Linen Bandage',1),
+(5,6,3277,'Wool Bandage',1),
+(5,6,3278,'Heavy Wool Bandage',1),
+(5,6,3365,'Opening',1),
+(5,6,5227,'Underwater Breathing',1),
+(5,6,6233,'Closing',1),
+(5,6,6246,'Closing',1),
+(5,6,6247,'Opening',1),
+(5,6,6477,'Opening',1),
+(5,6,6478,'Opening',1),
+(5,6,6603,'Attack',1),
+(5,6,7266,'Duel',1),
+(5,6,7267,'Grovel',1),
+(5,6,7355,'Stuck',1),
+(5,6,7744,'Will of the Forsaken',1),
+(5,6,7928,'Silk Bandage',1),
+(5,6,7929,'Heavy Silk Bandage',1),
+(5,6,7934,'Anti-Venom',1),
+(5,6,8386,'Attacking',1),
+(5,6,8737,'Mail',1),
+(5,6,9077,'Leather',1),
+(5,6,9078,'Cloth',1),
+(5,6,9125,'Generic',1),
+(5,6,10840,'Mageweave Bandage',1),
+(5,6,10841,'Heavy Mageweave Bandage',1),
+(5,6,10846,'First Aid',1),
+(5,6,17737,'Language Gutterspeak',1),
+(5,6,18629,'Runecloth Bandage',1),
+(5,6,18630,'Heavy Runecloth Bandage',1),
+(5,6,20577,'Cannibalize',1),
+(5,6,20579,'Shadow Resistance',1),
+(5,6,21651,'Opening',1),
+(5,6,21652,'Closing',1),
+(5,6,22027,'Remove Insignia',1),
+(5,6,22810,'Opening - No Text',1),
+(5,6,33391,'Journeyman Riding',1),
+(5,6,45462,'Plague Strike',1),
+(5,6,45477,'Icy Touch',1),
+(5,6,45902,'Blood Strike',1),
+(5,6,45903,'Offensive State (DND)',1),
+(5,6,45927,'Summon Friend',1),
+(5,6,47541,'Death Coil',1),
+(5,6,48266,'Blood Presence',1),
+(5,6,49410,'Forceful Deflection',1),
+(5,6,49576,'Death Grip',1),
+(5,6,52665,'Sigil',1),
+(5,6,59879,'Blood Plague',1),
+(5,6,59921,'Frost Fever',1),
+(5,6,61437,'Opening',1),
+(5,6,61455,'Runic Focus',1),
+(6,6,81,'Dodge',1),
+(6,6,196,'One-Handed Axes',1),
+(6,6,197,'Two-Handed Axes',1),
+(6,6,200,'Polearms',1),
+(6,6,201,'One-Handed Swords',1),
+(6,6,202,'Two-Handed Swords',1),
+(6,6,203,'Unarmed',1),
+(6,6,204,'Defense',1),
+(6,6,522,'SPELLDEFENSE (DND)',1),
+(6,6,669,'Language Orcish',1),
+(6,6,670,'Language Taurahe',1),
+(6,6,674,'Dual Wield',1),
+(6,6,750,'Plate Mail',1),
+(6,6,1843,'Disarm',1),
+(6,6,2382,'Generic',1),
+(6,6,2479,'Honorless Target',1),
+(6,6,3050,'Detect',1),
+(6,6,3127,'Parry',1),
+(6,6,3275,'Linen Bandage',1),
+(6,6,3276,'Heavy Linen Bandage',1),
+(6,6,3277,'Wool Bandage',1),
+(6,6,3278,'Heavy Wool Bandage',1),
+(6,6,3365,'Opening',1),
+(6,6,6233,'Closing',1),
+(6,6,6246,'Closing',1),
+(6,6,6247,'Opening',1),
+(6,6,6477,'Opening',1),
+(6,6,6478,'Opening',1),
+(6,6,6603,'Attack',1),
+(6,6,7266,'Duel',1),
+(6,6,7267,'Grovel',1),
+(6,6,7355,'Stuck',1),
+(6,6,7928,'Silk Bandage',1),
+(6,6,7929,'Heavy Silk Bandage',1),
+(6,6,7934,'Anti-Venom',1),
+(6,6,8386,'Attacking',1),
+(6,6,8737,'Mail',1),
+(6,6,9077,'Leather',1),
+(6,6,9078,'Cloth',1),
+(6,6,9125,'Generic',1),
+(6,6,10840,'Mageweave Bandage',1),
+(6,6,10841,'Heavy Mageweave Bandage',1),
+(6,6,10846,'First Aid',1),
+(6,6,18629,'Runecloth Bandage',1),
+(6,6,18630,'Heavy Runecloth Bandage',1),
+(6,6,20549,'War Stomp',1),
+(6,6,20550,'Endurance',1),
+(6,6,20551,'Nature Resistance',1),
+(6,6,20552,'Cultivation',1),
+(6,6,21651,'Opening',1),
+(6,6,21652,'Closing',1),
+(6,6,22027,'Remove Insignia',1),
+(6,6,22810,'Opening - No Text',1),
+(6,6,33391,'Journeyman Riding',1),
+(6,6,45462,'Plague Strike',1),
+(6,6,45477,'Icy Touch',1),
+(6,6,45902,'Blood Strike',1),
+(6,6,45903,'Offensive State (DND)',1),
+(6,6,45927,'Summon Friend',1),
+(6,6,47541,'Death Coil',1),
+(6,6,48266,'Blood Presence',1),
+(6,6,49410,'Forceful Deflection',1),
+(6,6,49576,'Death Grip',1),
+(6,6,52665,'Sigil',1),
+(6,6,59879,'Blood Plague',1),
+(6,6,59921,'Frost Fever',1),
+(6,6,61437,'Opening',1),
+(6,6,61455,'Runic Focus',1),
+(7,6,81,'Dodge',1),
+(7,6,196,'One-Handed Axes',1),
+(7,6,197,'Two-Handed Axes',1),
+(7,6,200,'Polearms',1),
+(7,6,201,'One-Handed Swords',1),
+(7,6,202,'Two-Handed Swords',1),
+(7,6,203,'Unarmed',1),
+(7,6,204,'Defense',1),
+(7,6,522,'SPELLDEFENSE (DND)',1),
+(7,6,668,'Language Common',1),
+(7,6,674,'Dual Wield',1),
+(7,6,750,'Plate Mail',1),
+(7,6,1843,'Disarm',1),
+(7,6,2382,'Generic',1),
+(7,6,2479,'Honorless Target',1),
+(7,6,3050,'Detect',1),
+(7,6,3127,'Parry',1),
+(7,6,3275,'Linen Bandage',1),
+(7,6,3276,'Heavy Linen Bandage',1),
+(7,6,3277,'Wool Bandage',1),
+(7,6,3278,'Heavy Wool Bandage',1),
+(7,6,3365,'Opening',1),
+(7,6,6233,'Closing',1),
+(7,6,6246,'Closing',1),
+(7,6,6247,'Opening',1),
+(7,6,6477,'Opening',1),
+(7,6,6478,'Opening',1),
+(7,6,6603,'Attack',1),
+(7,6,7266,'Duel',1),
+(7,6,7267,'Grovel',1),
+(7,6,7340,'Language Gnomish',1),
+(7,6,7355,'Stuck',1),
+(7,6,7928,'Silk Bandage',1),
+(7,6,7929,'Heavy Silk Bandage',1),
+(7,6,7934,'Anti-Venom',1),
+(7,6,8386,'Attacking',1),
+(7,6,8737,'Mail',1),
+(7,6,9077,'Leather',1),
+(7,6,9078,'Cloth',1),
+(7,6,9125,'Generic',1),
+(7,6,10840,'Mageweave Bandage',1),
+(7,6,10841,'Heavy Mageweave Bandage',1),
+(7,6,10846,'First Aid',1),
+(7,6,18629,'Runecloth Bandage',1),
+(7,6,18630,'Heavy Runecloth Bandage',1),
+(7,6,20589,'Escape Artist',1),
+(7,6,20591,'Expansive Mind',1),
+(7,6,20592,'Arcane Resistance',1),
+(7,6,20593,'Engineering Specialization',1),
+(7,6,21651,'Opening',1),
+(7,6,21652,'Closing',1),
+(7,6,22027,'Remove Insignia',1),
+(7,6,22810,'Opening - No Text',1),
+(7,6,33391,'Journeyman Riding',1),
+(7,6,45462,'Plague Strike',1),
+(7,6,45477,'Icy Touch',1),
+(7,6,45902,'Blood Strike',1),
+(7,6,45903,'Offensive State (DND)',1),
+(7,6,45927,'Summon Friend',1),
+(7,6,47541,'Death Coil',1),
+(7,6,48266,'Blood Presence',1),
+(7,6,49410,'Forceful Deflection',1),
+(7,6,49576,'Death Grip',1),
+(7,6,52665,'Sigil',1),
+(7,6,59879,'Blood Plague',1),
+(7,6,59921,'Frost Fever',1),
+(7,6,61437,'Opening',1),
+(7,6,61455,'Runic Focus',1),
+(8,6,81,'Dodge',1),
+(8,6,196,'One-Handed Axes',1),
+(8,6,197,'Two-Handed Axes',1),
+(8,6,200,'Polearms',1),
+(8,6,201,'One-Handed Swords',1),
+(8,6,202,'Two-Handed Swords',1),
+(8,6,203,'Unarmed',1),
+(8,6,204,'Defense',1),
+(8,6,522,'SPELLDEFENSE (DND)',1),
+(8,6,669,'Language Orcish',1),
+(8,6,674,'Dual Wield',1),
+(8,6,750,'Plate Mail',1),
+(8,6,1843,'Disarm',1),
+(8,6,2382,'Generic',1),
+(8,6,2479,'Honorless Target',1),
+(8,6,3050,'Detect',1),
+(8,6,3127,'Parry',1),
+(8,6,3275,'Linen Bandage',1),
+(8,6,3276,'Heavy Linen Bandage',1),
+(8,6,3277,'Wool Bandage',1),
+(8,6,3278,'Heavy Wool Bandage',1),
+(8,6,3365,'Opening',1),
+(8,6,6233,'Closing',1),
+(8,6,6246,'Closing',1),
+(8,6,6247,'Opening',1),
+(8,6,6477,'Opening',1),
+(8,6,6478,'Opening',1),
+(8,6,6603,'Attack',1),
+(8,6,7266,'Duel',1),
+(8,6,7267,'Grovel',1),
+(8,6,7341,'Language Troll',1),
+(8,6,7355,'Stuck',1),
+(8,6,7928,'Silk Bandage',1),
+(8,6,7929,'Heavy Silk Bandage',1),
+(8,6,7934,'Anti-Venom',1),
+(8,6,8386,'Attacking',1),
+(8,6,8737,'Mail',1),
+(8,6,9077,'Leather',1),
+(8,6,9078,'Cloth',1),
+(8,6,9125,'Generic',1),
+(8,6,10840,'Mageweave Bandage',1),
+(8,6,10841,'Heavy Mageweave Bandage',1),
+(8,6,10846,'First Aid',1),
+(8,6,18629,'Runecloth Bandage',1),
+(8,6,18630,'Heavy Runecloth Bandage',1),
+(8,6,20555,'Regeneration',1),
+(8,6,20557,'Beast Slaying',1),
+(8,6,20558,'Throwing Specialization',1),
+(8,6,21651,'Opening',1),
+(8,6,21652,'Closing',1),
+(8,6,22027,'Remove Insignia',1),
+(8,6,22810,'Opening - No Text',1),
+(8,6,26290,'Bow Specialization',1),
+(8,6,33391,'Journeyman Riding',1),
+(8,6,45462,'Plague Strike',1),
+(8,6,45477,'Icy Touch',1),
+(8,6,45902,'Blood Strike',1),
+(8,6,45903,'Offensive State (DND)',1),
+(8,6,45927,'Summon Friend',1),
+(8,6,47541,'Death Coil',1),
+(8,6,48266,'Blood Presence',1),
+(8,6,49410,'Forceful Deflection',1),
+(8,6,49576,'Death Grip',1),
+(8,6,50621,'Berserking',1),
+(8,6,52665,'Sigil',1),
+(8,6,58943,'Da Voodoo Shuffle',1),
+(8,6,59879,'Blood Plague',1),
+(8,6,59921,'Frost Fever',1),
+(8,6,61437,'Opening',1),
+(8,6,61455,'Runic Focus',1),
+(10,6,81,'Dodge',1),
+(10,6,196,'One-Handed Axes',1),
+(10,6,197,'Two-Handed Axes',1),
+(10,6,200,'Polearms',1),
+(10,6,201,'One-Handed Swords',1),
+(10,6,202,'Two-Handed Swords',1),
+(10,6,203,'Unarmed',1),
+(10,6,204,'Defense',1),
+(10,6,522,'SPELLDEFENSE (DND)',1),
+(10,6,669,'Language Orcish',1),
+(10,6,674,'Dual Wield',1),
+(10,6,750,'Plate Mail',1),
+(10,6,813,'Language Thalassian',1),
+(10,6,822,'Magic Resistance',1),
+(10,6,1843,'Disarm',1),
+(10,6,2382,'Generic',1),
+(10,6,2479,'Honorless Target',1),
+(10,6,3050,'Detect',1),
+(10,6,3127,'Parry',1),
+(10,6,3275,'Linen Bandage',1),
+(10,6,3276,'Heavy Linen Bandage',1),
+(10,6,3277,'Wool Bandage',1),
+(10,6,3278,'Heavy Wool Bandage',1),
+(10,6,3365,'Opening',1),
+(10,6,6233,'Closing',1),
+(10,6,6246,'Closing',1),
+(10,6,6247,'Opening',1),
+(10,6,6477,'Opening',1),
+(10,6,6478,'Opening',1),
+(10,6,6603,'Attack',1),
+(10,6,7266,'Duel',1),
+(10,6,7267,'Grovel',1),
+(10,6,7355,'Stuck',1),
+(10,6,7928,'Silk Bandage',1),
+(10,6,7929,'Heavy Silk Bandage',1),
+(10,6,7934,'Anti-Venom',1),
+(10,6,8386,'Attacking',1),
+(10,6,8737,'Mail',1),
+(10,6,9077,'Leather',1),
+(10,6,9078,'Cloth',1),
+(10,6,9125,'Generic',1),
+(10,6,10840,'Mageweave Bandage',1),
+(10,6,10841,'Heavy Mageweave Bandage',1),
+(10,6,10846,'First Aid',1),
+(10,6,18629,'Runecloth Bandage',1),
+(10,6,18630,'Heavy Runecloth Bandage',1),
+(10,6,21651,'Opening',1),
+(10,6,21652,'Closing',1),
+(10,6,22027,'Remove Insignia',1),
+(10,6,22810,'Opening - No Text',1),
+(10,6,28877,'Arcane Affinity',1),
+(10,6,33391,'Journeyman Riding',1),
+(10,6,45462,'Plague Strike',1),
+(10,6,45477,'Icy Touch',1),
+(10,6,45902,'Blood Strike',1),
+(10,6,45903,'Offensive State (DND)',1),
+(10,6,45927,'Summon Friend',1),
+(10,6,47541,'Death Coil',1),
+(10,6,48266,'Blood Presence',1),
+(10,6,49410,'Forceful Deflection',1),
+(10,6,49576,'Death Grip',1),
+(10,6,50613,'Arcane Torrent',1),
+(10,6,52665,'Sigil',1),
+(10,6,59879,'Blood Plague',1),
+(10,6,59921,'Frost Fever',1),
+(10,6,61437,'Opening',1),
+(10,6,61455,'Runic Focus',1),
+(11,6,81,'Dodge',1),
+(11,6,196,'One-Handed Axes',1),
+(11,6,197,'Two-Handed Axes',1),
+(11,6,200,'Polearms',1),
+(11,6,201,'One-Handed Swords',1),
+(11,6,202,'Two-Handed Swords',1),
+(11,6,203,'Unarmed',1),
+(11,6,204,'Defense',1),
+(11,6,522,'SPELLDEFENSE (DND)',1),
+(11,6,668,'Language Common',1),
+(11,6,674,'Dual Wield',1),
+(11,6,750,'Plate Mail',1),
+(11,6,1843,'Disarm',1),
+(11,6,2382,'Generic',1),
+(11,6,2479,'Honorless Target',1),
+(11,6,3050,'Detect',1),
+(11,6,3127,'Parry',1),
+(11,6,3275,'Linen Bandage',1),
+(11,6,3276,'Heavy Linen Bandage',1),
+(11,6,3277,'Wool Bandage',1),
+(11,6,3278,'Heavy Wool Bandage',1),
+(11,6,3365,'Opening',1),
+(11,6,6233,'Closing',1),
+(11,6,6246,'Closing',1),
+(11,6,6247,'Opening',1),
+(11,6,6477,'Opening',1),
+(11,6,6478,'Opening',1),
+(11,6,6562,'Heroic Presence',1),
+(11,6,6603,'Attack',1),
+(11,6,7266,'Duel',1),
+(11,6,7267,'Grovel',1),
+(11,6,7355,'Stuck',1),
+(11,6,7928,'Silk Bandage',1),
+(11,6,7929,'Heavy Silk Bandage',1),
+(11,6,7934,'Anti-Venom',1),
+(11,6,8386,'Attacking',1),
+(11,6,8737,'Mail',1),
+(11,6,9077,'Leather',1),
+(11,6,9078,'Cloth',1),
+(11,6,9125,'Generic',1),
+(11,6,10840,'Mageweave Bandage',1),
+(11,6,10841,'Heavy Mageweave Bandage',1),
+(11,6,10846,'First Aid',1),
+(11,6,18629,'Runecloth Bandage',1),
+(11,6,18630,'Heavy Runecloth Bandage',1),
+(11,6,21651,'Opening',1),
+(11,6,21652,'Closing',1),
+(11,6,22027,'Remove Insignia',1),
+(11,6,22810,'Opening - No Text',1),
+(11,6,28875,'Gemcutting',1),
+(11,6,29932,'Language Draenei',1),
+(11,6,33391,'Journeyman Riding',1),
+(11,6,45462,'Plague Strike',1),
+(11,6,45477,'Icy Touch',1),
+(11,6,45902,'Blood Strike',1),
+(11,6,45903,'Offensive State (DND)',1),
+(11,6,45927,'Summon Friend',1),
+(11,6,47541,'Death Coil',1),
+(11,6,48266,'Blood Presence',1),
+(11,6,49410,'Forceful Deflection',1),
+(11,6,49576,'Death Grip',1),
+(11,6,52665,'Sigil',1),
+(11,6,59539,'Shadow Resistance',1),
+(11,6,59545,'Gift of the Naaru',1),
+(11,6,59879,'Blood Plague',1),
+(11,6,59921,'Frost Fever',1),
+(11,6,61437,'Opening',1),
+(11,6,61455,'Runic Focus',1);
+
+DELETE FROM item_template WHERE entry IN (34648,34649,34650,34651,34652,34653,34655,34656,34657,34658,34659,38145,38147,41751);
+INSERT INTO item_template VALUES
+(34648,4,4,-1,'Acherus Knight\'s Greaves',51496,2,32768,1,51,10,8,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,10,7,12,3,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,392,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,55,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34649,4,4,-1,'Acherus Knight\'s Gauntlets',51498,2,32768,1,34,6,10,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,15,7,6,32,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,356,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34650,4,4,-1,'Acherus Knight\'s Tunic',51494,2,32768,1,69,13,5,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,20,7,11,32,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,570,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,115,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34651,4,4,-1,'Acherus Knight\'s Girdle',51497,2,32768,1,35,7,6,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,2,4,10,32,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,320,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34652,4,4,-1,'Acherus Knight\'s Hood',51495,2,32768,1,52,10,1,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,15,7,15,32,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,463,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,70,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34653,4,4,-1,'Acherus Knight\'s Wristguard',51500,2,32768,1,36,7,9,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,7,31,7,7,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34655,4,4,-1,'Acherus Knight\'s Pauldrons',51501,2,32768,1,54,10,3,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,11,3,9,7,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,427,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,70,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34656,4,4,-1,'Acherus Knight\'s Cover',51499,2,32768,1,73,14,7,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,13,3,10,7,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,499,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,85,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34657,4,0,-1,'Choker of Damnation',6539,2,32768,1,2303,575,2,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,9,7,8,31,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34658,4,0,-1,'Plague Band',963,2,32768,1,534,133,11,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,11,3,6,7,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34659,4,1,-1,'Acherus Knight\'s Shroud',49738,2,32768,1,31,6,16,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,2,4,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(38145,1,0,-1,'Deathweave Bag',1282,1,32768,1,0,0,18,-1,-1,35,0,0,0,0,0,0,0,0,0,1,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(38147,4,0,-1,'Corrupted Band',963,2,32768,1,534,133,11,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,11,3,6,32,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(41751,0,5,-1,'Black Mushroom',36728,1,0,1,100,5,0,-1,-1,65,55,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27094,0,-1,0,0,11,1000,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,'',0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0);
+
+DELETE FROM spell_learn_spell WHERE entry = 2842;
+DELETE FROM spell_learn_spell WHERE entry = 53428;
+INSERT INTO spell_learn_spell VALUES
+(53428,53341),
+(53428,53343);
+
+
+
+
+ \ No newline at end of file
diff --git a/sql/world.sql b/sql/world.sql
index ec259082943..c32d83aa3fd 100644
--- a/sql/world.sql
+++ b/sql/world.sql
@@ -2,7 +2,7 @@
--
-- Host: localhost Database: world
-- ------------------------------------------------------
--- Server version 5.0.34-log
+-- Server version 5.0.56-nt
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
@@ -41,10 +41,10 @@ UNLOCK TABLES;
DROP TABLE IF EXISTS `areatrigger_scripts`;
CREATE TABLE `areatrigger_scripts` (
- `entry` mediumint(8) NOT NULL,
- `ScriptName` char(64) NOT NULL,
- PRIMARY KEY (`entry`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+ `entry` MEDIUMINT( 8 ) NOT NULL ,
+ `ScriptName` CHAR( 64 ) NOT NULL ,
+ PRIMARY KEY ( `entry` )
+) ENGINE = MYISAM DEFAULT CHARSET=utf8;
--
-- Dumping data for table `areatrigger_scripts`
@@ -95,8 +95,7 @@ CREATE TABLE `areatrigger_teleport` (
`target_position_y` float NOT NULL default '0',
`target_position_z` float NOT NULL default '0',
`target_orientation` float NOT NULL default '0',
- PRIMARY KEY (`id`),
- FULLTEXT KEY `name` (`name`)
+ PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Trigger System';
--
@@ -132,6 +131,15 @@ CREATE TABLE `battleground_template` (
LOCK TABLES `battleground_template` WRITE;
/*!40000 ALTER TABLE `battleground_template` DISABLE KEYS */;
+INSERT INTO `battleground_template` VALUES
+(1,0,0,0,0,611,2.72532,610,2.27452),
+(2,0,0,0,0,769,3.14159,770,3.14159),
+(4,0,2,10,70,929,0,936,3.14159),
+(3,0,0,0,0,890,3.40156,889,0.263892),
+(5,0,2,10,70,939,0,940,3.14159),
+(6,0,2,10,70,0,0,0,0),
+(7,0,0,0,0,1103,3.40156,1104,0.263892),
+(8,0,2,10,70,1258,0,1259,3.14159);
/*!40000 ALTER TABLE `battleground_template` ENABLE KEYS */;
UNLOCK TABLES;
@@ -173,6 +181,251 @@ CREATE TABLE `command` (
LOCK TABLES `command` WRITE;
/*!40000 ALTER TABLE `command` DISABLE KEYS */;
+INSERT INTO `command` VALUES
+('account',0,'Syntax: .account\r\n\r\nDisplay the access level of your account.'),
+('account create',4,'Syntax: .account create $account $password\r\n\r\nCreate account and set password to it.'),
+('account delete',4,'Syntax: .account delete $account\r\n\r\nDelete account with all characters.'),
+('account onlinelist',4,'Syntax: .account onlinelist\r\n\r\nShow list of online accounts.'),
+('account set addon',3,'Syntax: .account set addon [$account] #addon\r\n\r\nSet user (posible targeted) expansion addon level allowed. Addon values: 0 - normal, 1 - tbc, 2 - wotlk.'),
+('account set gmlevel',4,'Syntax: .account set gmlevel [$account] #level\r\n\r\nSet the security level for targeted player (can''t be used at self) or for account $name to a level of #level.\r\n\r\n#level may range from 0 to 3.'),
+('account set password',4,'Syntax: .account set password $account $password $password\r\n\r\nSet password for account.'),
+('additem',3,'Syntax: .additem #itemid/[#itemname]/#shift-click-item-link #itemcount\r\n\r\nAdds the specified number of items of id #itemid (or exact (!) name $itemname in brackets, or link created by shift-click at item in inventory or recipe) to your or selected character inventory. If #itemcount is omitted, only one item will be added.\r\n.'),
+('additemset',3,'Syntax: .additemset #itemsetid\r\n\r\nAdd items from itemset of id #itemsetid to your or selected character inventory. Will add by one example each item from itemset.'),
+('addmove',2,'Syntax: .addmove #creature_guid [#waittime]\r\n\r\nAdd your current location as a waypoint for creature with guid #creature_guid. And optional add wait time.'),
+('announce',1,'Syntax: .announce $MessageToBroadcast\r\n\r\nSend a global message to all players online in chat log.'),
+('aura',3,'Syntax: .aura #spellid\r\n\r\nAdd the aura from spell #spellid to the selected Unit.'),
+('ban account',3,'Syntax is: ban account $Name $bantime $reason\r\nBan account kick player.\r\n$bantime: negative value leads to permban, otherwise use a timestring like \"4d20h3s\".'),
+('ban character',3,'Syntax is: ban character $Name $bantime $reason\r\nBan account and kick player.\r\n$bantime: negative value leads to permban, otherwise use a timestring like \"4d20h3s\".'),
+('ban ip',3,'Syntax is: ban ip $Ip $bantime $reason\r\nBan IP.\r\n$bantime: negative value leads to permban, otherwise use a timestring like \"4d20h3s\".'),
+('baninfo account',3,'Syntax is: baninfo account\r\nWatch full information about a specific ban.'),
+('baninfo character',3,'Syntax is: baninfo character\r\nWatch full information about a specific ban.'),
+('baninfo ip',3,'Syntax is: baninfo ip\r\nWatch full information about a specific ban.'),
+('bank',3,'Syntax: .bank\r\n\r\nShow your bank inventory.'),
+('banlist account',3,'Syntax is: banlist account [$Name]\r\nSearches the banlist for a account name pattern or show full list account bans.'),
+('banlist character',3,'Syntax is: banlist character $Name\r\nSearches the banlist for a character name pattern. Pattern required.'),
+('banlist ip',3,'Syntax is: banlist ip [$Ip]\r\nSearches the banlist for a IP pattern or show full list of IP bans.'),
+('cast',3,'Syntax: .cast #spellid [triggered]\r\n Cast #spellid to selected target. If no target selected cast to self. If \'trigered\' or part provided then spell casted with triggered flag.'),
+('cast back',3,'Syntax: .cast back #spellid [triggered]\r\n Selected target will cast #spellid to your character. If \'trigered\' or part provided then spell casted with triggered flag.'),
+('cast dist',3,'Syntax: .cast dist #spellid [#dist [triggered]]\r\n You will cast spell to pint at distance #dist. If \'trigered\' or part provided then spell casted with triggered flag. Not all spells can be casted as area spells.'),
+('cast self',3,'Syntax: .cast self #spellid [triggered]\r\nCast #spellid by target at target itself. If \'trigered\' or part provided then spell casted with triggered flag.'),
+('cast target',3,'Syntax: .cast target #spellid [triggered]\r\n Selected target will cast #spellid to his victim. If \'trigered\' or part provided then spell casted with triggered flag.'),
+('chardelete',4,'Syntax: .chardelete $charactername\r\n\r\nDelete character.'),
+('combatstop',2,'Syntax: .combatstop [$playername]\r\nStop combat for selected character. If selected non-player then command applied to self. If $playername provided then attempt applied to online player $playername.'),
+('commands',0,'Syntax: .commands\r\n\r\nDisplay a list of available commands for your account level.'),
+('cooldown',3,'Syntax: .cooldown [#spell_id]\r\n\r\nRemove all (if spell_id not provided) or #spel_id spell cooldown from selected character or you (if no selection).'),
+('damage',3,'Syntax: .damage $damage_amount [$school [$spellid]]\r\n\r\nApply $damage to target. If not $school and $spellid provided then this flat clean melee damage without any modifiers. If $school provided then damage modified by armor reduction (if school physical), and target absorbing modifiers and result applied as melee damage to target. If spell provided then damage modified and applied as spell damage. $spellid can be shift-link.'),
+('debug anim',2,'Syntax: .debug anim #emoteid\r\n\r\nPlay emote #emoteid for your character.'),
+('debug getvalue',3,'Syntax: .debug getvalue #field #isInt\r\n\r\nGet the field #field of the selected creature. If no creature is selected, get the content of your field.\r\n\r\nUse a #isInt of value 1 if the expected field content is an integer.'),
+('debug playsound',1,'Syntax: .debug playsound #soundid\r\n\r\nPlay sound with #soundid.\r\nSound will be play only for you. Other players do not hear this.\r\nWarning: client may have more 5000 sounds...'),
+('debug setvalue',3,'Syntax: .debug setvalue #field #value #isInt\r\n\r\nSet the field #field of the selected creature with value #value. If no creature is selected, set the content of your field.\r\n\r\nUse a #isInt of value 1 if #value is an integer.'),
+('debug standstate',2,'Syntax: .debug standstate #emoteid\r\n\r\nChange the emote of your character while standing to #emoteid.'),
+('debug update',3,'Syntax: .debug update #field #value\r\n\r\nUpdate the field #field of the selected character or creature with value #value.\r\n\r\nIf no #value is provided, display the content of field #field.'),
+('delticket',2,'Syntax: .delticket all\r\n .delticket #num\r\n .delticket $character_name\r\n\rall to dalete all tickets at server, $character_name to delete ticket of this character, #num to delete ticket #num.'),
+('demorph',2,'Syntax: .demorph\r\n\r\nDemorph the selected player.'),
+('die',3,'Syntax: .die\r\n\r\nKill the selected player. If no player is selected, it will kill you.'),
+('dismount',0,'Syntax: .dismount\r\n\r\nDismount you, if you are mounted.'),
+('distance',3,'Syntax: .distance\r\n\r\nDisplay the distance from your character to the selected creature.'),
+('event',2,'Syntax: .event #event_id\r\nShow details about event with #event_id.'),
+('event activelist',2,'Syntax: .event activelist\r\nShow list of currently active events.'),
+('event start',2,'Syntax: .event start #event_id\r\nStart event #event_id. Set start time for event to current moment (change not saved in DB).'),
+('event stop',2,'Syntax: .event stop #event_id\r\nStop event #event_id. Set start time for event to time in past that make current moment is event stop time (change not saved in DB).'),
+('explorecheat',3,'Syntax: .explorecheat #flag\r\n\r\nReveal or hide all maps for the selected player. If no player is selected, hide or reveal maps to you.\r\n\r\nUse a #flag of value 1 to reveal, use a #flag value of 0 to hide all maps.'),
+('flusharenapoints','3','Syntax: .flusharenapoints\r\n\r\nUse it to distribute arena points based on arena team ratings, and start a new week.'),
+('gm',1,'Syntax: .gm [on/off]\r\n\r\nEnable or Disable in game GM MODE or show current state of on/off not provided.'),
+('gm chat',1,'Syntax: .gm chat [on/off]\r\n\r\nEnable or disable chat GM MODE (show gm badge in messages) or show current state of on/off not provided.'),
+('gm fly',3,'Syntax: .gm fly on/off\r\nEnable/disable gm fly mode.'),
+('gm ingame',0,'Syntax: .gm ingame\r\n\r\nDisplay a list of available in game Game Masters.'),
+('gm list',3,'Syntax: .gm list\r\n\r\nDisplay a list of all Game Masters accounts and security levels.'),
+('gm online',0,'Syntax: .gm online\r\n\r\nDisplay a list of available Game Masters.'),
+('gm visible',1,'Syntax: .gm visible on/off\r\n\r\nOutput current visibility state or make GM visible(on) and invisible(off) for other players.'),
+('go creature',2,'Syntax: .go creature #creature_guid\r\nTeleport your character to creature with guid #creature_guid.\r\n.gocreature #creature_name\r\nTeleport your character to creature with this name.\r\n.gocreature id #creature_id\r\nTeleport your character to a creature that was spawned from the template with this entry.\r\n*If* more than one creature is found, then you are teleported to the first that is found inside the database.'),
+('go graveyard',2,'Syntax: .go graveyard #graveyardId\r\n Teleport to graveyard with the graveyardId specified.'),
+('go grid',1,'Syntax: .go grid #gridX #gridY [#mapId]\r\n\r\nTeleport the gm to center of grid with provided indexes at map #mapId (or current map if it not provided).'),
+('go object',1,'Syntax: .go object #object_guid\r\nTeleport your character to gameobject with guid #object_guid'),
+('go trigger',2,'Syntax: .go trigger #trigger_id\r\n\r\nTeleport your character to areatrigger with id #trigger_id. Character will be teleported to trigger target if selected areatrigger is telporting trigger.'),
+('go xy',1,'Syntax: .go xy #x #y [#mapid]\r\n\r\nTeleport player to point with (#x,#y) coordinates at ground(water) level at map #mapid or same map if #mapid not provided.'),
+('go xyz',1,'Syntax: .go xyz #x #y #z [#mapid]\r\n\r\nTeleport player to point with (#x,#y,#z) coordinates at ground(water) level at map #mapid or same map if #mapid not provided.'),
+('go zonexy',1,'Syntax: .go zonexy #x #y [#zone]\r\n\r\nTeleport player to point with (#x,#y) client coordinates at ground(water) level in zone #zoneid or current zone if #zoneid not provided. You can look up zone using .lookup area $namepart'),
+('gobject add',2,'Syntax: .gobject add #id <spawntimeSecs>\r\n\r\nAdd a game object from game object templates to the world at your current location using the #id.\r\nspawntimesecs sets the spawntime, it is optional.\r\n\r\nNote: this is a copy of .gameobject.'),
+('gobject delete',2,'Syntax: .gobject delete #go_guid\r\nDelete gameobject with guid #go_guid.'),
+('gobject move',2,'Syntax: .gobject move #goguid [#x #y #z]\r\n\r\nMove gameobject #goguid to character coordinates (or to (#x,#y,#z) coordinates if its provide).'),
+('gobject near ',3,'Syntax: .gobject near [#distance]\r\n\r\nOutput gameobjects at distance #distance from player. Output gameobject guids and coordinates sorted by distance from character. If #distance not provided use 10 as default value.'),
+('gobject turn',2,'Syntax: .gobject turn #goguid \r\n\r\nSet for gameobject #goguid orientation same as current character orientation.'),
+('gobject target',2,'Syntax: .gobject target [#go_id|#go_name_part]\r\n\r\nLocate and show position nearest gameobject. If #go_id or #go_name_part provide then locate and show position of nearest gameobject with gameobject template id #go_id or name included #go_name_part as part.'),
+('goname',1,'Syntax: .goname $charactername\r\n\r\nTeleport to the given character. Either specify the character name or click on the character\'s portrait, e.g. when you are in a group.'),
+('gps',1,'Syntax: .gps\r\n\r\nDisplay the position information for a selected character or creature. Position information includes X, Y, Z, and orientation, map Id and zone Id'),
+('groupgo',1,'Syntax: .groupgo $charactername\r\n\r\nTeleport the given character and his group to you.'),
+('guid',2,'Syntax: .guid\r\n\r\nDisplay the GUID for the selected character.'),
+('guild create',2,'Syntax: .guild create $GuildLeaderName $GuildName\r\n\r\nCreate a guild named $GuildName with the player $GuildLeaderName as leader.'),
+('guild delete',2,'Syntax: .guild delete $GuildName\r\n\r\nDelete guild $GuildName.'),
+('guild invite',2,'Syntax: .guild invite $CharacterName $GuildName\r\n\r\nAdd $CharacterName into a guild $GuildName.'),
+('guild rank',2,'Syntax: .guild rank $CharacterName #Rank\r\n\r\nSet for $CharacterName rank #Rank in a guild.'),
+('guild uninvite',2,'Syntax: .guild uninvite $CharacterName\r\n\r\nRemove $CharacterName from a guild.'),
+('help',0,'Syntax: .help [$command]\r\n\r\nDisplay usage instructions for the given $command. If no $command provided show list available commands.'),
+('hidearea',3,'Syntax: .hidearea #areaid\r\n\r\nHide the area of #areaid to the selected character. If no character is selected, hide this area to you.'),
+('honor add',2,'Syntax: .honor add $amount\r\n\r\nAdd a certain amount of honor (gained today) to the selected player.'),
+('honor addkill',2,'Syntax: .honor addkikll\r\n\r\nAdd the targeted unit as one of your pvp kills today (you only get honor if it\'s a racial leader or a player)'),
+('honor update',2,'Syntax: .honor update\r\n\r\nForce the yesterday\'s honor fields to be updated with today\'s data, which will get reset for the selected player.'),
+('hover',3,'Syntax: .hover #flag\r\n\r\nEnable or disable hover mode for your character.\r\n\r\nUse a #flag of value 1 to enable, use a #flag value of 0 to disable hover.'),
+('instance unbind',3,'Syntax: .instance unbind all\r\n All of the selected player\'s binds will be cleared.'),
+('instance listbinds',3,'Syntax: .instance listbinds\r\n Lists the binds of the selected player.'),
+('instance stats',3,'Syntax: .instance stats\r\n Shows statistics about instances.'),
+('instance savedata',3,'Syntax: .instance savedata\r\n Save the InstanceData for the current player\'s map to the DB.'),
+('itemmove',2,'Syntax: .itemmove #sourceslotid #destinationslotid\r\n\r\nMove an item from slots #sourceslotid to #destinationslotid in your inventory\r\n\r\nNot yet implemented'),
+('kick',2,'Syntax: .kick [$charactername]\r\n\r\nKick the given character name from the world. If no character name is provided then the selected player (except for yourself) will be kicked.'),
+('learn',3,'Syntax: .learn #parameter\r\n\r\nSelected character learn a spell of id #parameter.'),
+('learn all',3,'Syntax: .learn all\r\n\r\nLearn all big set different spell maybe useful for Administaror.'),
+('learn all_crafts',2,'Syntax: .learn crafts\r\n\r\nLearn all professions and recipes.'),
+('learn all_default',1,'Syntax: .learn all_default [$playername]\r\n\r\nLearn for selected/$playername player all default spells for his race/class and spells rewarded by completed quests.'),
+('learn all_gm',2,'Syntax: .learn all_gm\r\n\r\nLearn all default spells for Game Masters.'),
+('learn all_lang',1,'Syntax: .learn all_lang\r\n\r\nLearn all languages'),
+('learn all_myclass',3,'Syntax: .learn all_myclass\r\n\r\nLearn all spells and talents available for his class.'),
+('learn all_myspells',3,'Syntax: .learn all_myspells\r\n\r\nLearn all spells (except talents and spells with first rank learned as talent) available for his class.'),
+('learn all_mytalents',3,'Syntax: .learn all_mytalents\r\n\r\nLearn all talents (and spells with first rank learned as talent) available for his class.'),
+('learn all_recipes',2,'Syntax: .learn all_recipes [$profession]\r\rLearns all recipes of specified profession and sets skill level to max.\rExample: .learn all_recipes enchanting'),
+('levelup',3,'Syntax: .levelup [$playername] [#numberoflevels]\r\n\r\nIncrease/decrease the level of character with $playername (or the selected if not name provided) by #numberoflevels Or +1 if no #numberoflevels provided). If #numberoflevels is omitted, the level will be increase by 1. If #numberoflevels is 0, the same level will be restarted. If no character is selected and name not provided, increase your level. Command can be used for offline character. All stats and dependent VALUESrecalculated. At level decrease talents can be reset if need. Also at level decrease equipped items with greater level requirement can be lost.'),
+('linkgrave',3,'Syntax: .linkgrave #graveyard_id [alliance|horde]\r\n\r\nLink current zone to graveyard for any (or alliance/horde faction ghosts). This let character ghost from zone teleport to graveyard after die if graveyard is nearest from linked to zone and accept ghost of this faction. Add only single graveyard at another map and only if no graveyards linked (or planned linked at same map).'),
+('list creature',3,'Syntax: .list creature #creature_id [#max_count]\r\n\r\nOutput creatures with creature id #creature_id found in world. Output creature guids and coordinates sorted by distance from character. Will be output maximum #max_count creatures. If #max_count not provided use 10 as default value.'),
+('list item',3,'Syntax: .list item #item_id [#max_count]\r\n\r\nOutput items with item id #item_id found in all character inventories, mails, auctions, and guild banks. Output item guids, item owner guid, owner account and owner name (guild name and guid in case guild bank). Will be output maximum #max_count items. If #max_count not provided use 10 as default value.'),
+('list object',3,'Syntax: .list object #gameobject_id [#max_count]\r\n\r\nOutput gameobjects with gameobject id #gameobject_id found in world. Output gameobject guids and coordinates sorted by distance from character. Will be output maximum #max_count gameobject. If #max_count not provided use 10 as default value.'),
+('loadscripts',3,'Syntax: .loadscripts $scriptlibraryname\r\n\r\nUnload current and load the script library $scriptlibraryname or reload current if $scriptlibraryname omitted, in case you changed it while the server was running.'),
+('lockaccount',0,'Syntax: .lockaccount [on|off]\r\n\r\nAllow login from account only from current used IP or remove this requirement.'),
+('lookup area',1,'Syntax: .lookup area $namepart\r\n\r\nLooks up an area by $namepart, and returns all matches with their area ID\'s.'),
+('lookup creature',3,'Syntax: .lookup creature $namepart\r\n\r\nLooks up a creature by $namepart, and returns all matches with their creature ID\'s.'),
+('lookup event',2,'Syntax: .lookup event $name\r\nAttempts to find the ID of the event with the provided $name.'),
+('lookup faction',3,'Syntax: .lookup faction $name\r\nAttempts to find the ID of the faction with the provided $name.'),
+('lookup item',3,'Syntax: .lookup item $itemname\r\n\r\nLooks up an item by $itemname, and returns all matches with their Item ID\'s.'),
+('lookup itemset',3,'Syntax: .lookup itemset $itemname\r\n\r\nLooks up an item set by $itemname, and returns all matches with their Item set ID\'s.'),
+('lookup object',3,'Syntax: .lookup object $objname\r\n\r\nLooks up an gameobject by $objname, and returns all matches with their Gameobject ID\'s.'),
+('lookup player account',2,'Syntax : .lookup player account $account ($limit) \r\n\r\n Searchs players, which account username is $account with optional parametr $limit of results.'),
+('lookup player ip',2,'Syntax : .lookup player ip $ip ($limit) \r\n\r\n Searchs players, which account ast_ip is $ip with optional parametr $limit of results.'),
+('lookup player email',2,'Syntax : .lookup player email $email ($limit) \r\n\r\n Searchs players, which account email is $email with optional parametr $limit of results.'),
+('lookup quest',3,'Syntax: .lookup quest $namepart\r\n\r\nLooks up a quest by $namepart, and returns all matches with their quest ID\'s.'),
+('lookup skill',3,'Syntax: .lookup skill $$namepart\r\n\r\nLooks up a skill by $namepart, and returns all matches with their skill ID\'s.'),
+('lookup spell',3,'Syntax: .lookup spell $namepart\r\n\r\nLooks up a spell by $namepart, and returns all matches with their spell ID\'s.'),
+('lookup tele',1,'Syntax: .lookup tele $substring\r\n\r\nSearch and output all .tele command locations with provide $substring in name.'),
+('maxskill',3,'Syntax: .maxskill\r\nSets all skills of the targeted player to their maximum VALUESfor its current level.'),
+('Mod32Value',3,'Syntax: .Mod32Value #field #value\r\n\r\nAdd #value to field #field of your character.'),
+('modify arena',3,'Syntax: .modify arena #value\r\nAdd $amount arena points to the selected player.'),
+('modify aspeed',1,'Syntax: .modify aspeed #rate\r\n\r\nModify all speeds -run,swim,run back,swim back- of the selected player to \"normalbase speed for this move type\"*rate. If no player is selected, modify your speed.\r\n\r\n #rate may range from 0.1 to 10.'),
+('modify bit',1,'Syntax: .modify bit #field #bit\r\n\r\nToggle the #bit bit of the #field field for the selected player. If no player is selected, modify your character.'),
+('modify bwalk',1,'Syntax: .modify bwalk #rate\r\n\r\nModify the speed of the selected player while running backwards to \"normal walk back speed\"*rate. If no player is selected, modify your speed.\r\n\r\n #rate may range from 0.1 to 10.'),
+('modify drunk',1,'Syntax: .modify drunk #value\r\n Set drunk level to #value (0..100). Value 0 remove drunk state, 100 is max drunked state.'),
+('modify energy',1,'Syntax: .modify energy #energy\r\n\r\nModify the energy of the selected player. If no player is selected, modify your energy.'),
+('modify faction',1,'Syntax: .modify faction #factionid #flagid #npcflagid #dynamicflagid\r\n\r\nModify the faction and flags of the selected creature. Without arguments, display the faction and flags of the selected creature.'),
+('modify gender',2,'Syntax: .modify gender male/female\r\n\r\nChange gender of selected player.'),
+('modify honor',1,'Syntax: .modify honor $amount\r\n\r\nAdd $amount honor points to the selected player.'),
+('modify hp',1,'Syntax: .modify hp #newhp\r\n\r\nModify the hp of the selected player. If no player is selected, modify your hp.'),
+('modify mana',1,'Syntax: .modify mana #newmana\r\n\r\nModify the mana of the selected player. If no player is selected, modify your mana.'),
+('modify money',1,'Syntax:\r\n.modify money #money\r\n.money #money\r\n\r\nAdd or remove money to the selected player. If no player is selected, modify your money.\r\n\r\n #gold can be negative to remove money.'),
+('modify morph',2,'Syntax: .modify morph #displayid\r\n\r\nChange your current model id to #displayid.'),
+('modify mount',1,'Syntax:\r\n.modify mount #id #speed\r\nDisplay selected player as mounted at #id creature and set speed to #speed value.'),
+('modify rage',1,'Syntax: .modify rage #newrage\r\n\r\nModify the rage of the selected player. If no player is selected, modify your rage.'),
+('modify rep',2,'Syntax: .modify rep #repId (#repvalue | $rankname [#delta])\r\nSets the selected players reputation with faction #repId to #repvalue or to $reprank.\r\nIf the reputation rank name is provided, the resulting reputation will be the lowest reputation for that rank plus the delta amount, if specified.\r\nYou can use \'.pinfo rep\' to list all known reputation ids, or use \'.lookup faction $name\' to locate a specific faction id.'),
+('modify scale',1,''),
+('modify speed',1,'Syntax:\r\n.modify speed #rate\r\n.speed #rate\r\n\r\nModify the running speed of the selected player to \"normal base run speed\"*rate. If no player is selected, modify your speed.\r\n\r\n #rate may range from 0.1 to 10.'),
+('modify spell',1,''),
+('modify swim',1,'Syntax: .modify swim #rate\r\n\r\nModify the swim speed of the selected player to \"normal swim speed\"*rate. If no player is selected, modify your speed.\r\n\r\n #rate may range from 0.1 to 10.'),
+('modify titles',1,'Syntax:\r\n.modify titles #mask\r\n\r\nAllows user to use all titles from #mask.\r\n\r\n #mask=0 disables the title-choose-field'),
+('movegens',3,'Syntax: .movegens\r\n Show movement generators stack for selected creature or player.'),
+('mute',1,'Syntax: .mute $playerName $timeInMinutes\r\n\r\nDisible chat messaging for any character from account of character $playerName at $timeInMinutes minutes.'),
+('namego',1,'Syntax: .namego $charactername\r\n\r\nTeleport the given character to you.'),
+('neargrave',3,'Syntax: .neargrave [alliance|horde]\r\n\r\nFind nearest graveyard linked to zone (or only nearest from accepts alliance or horde faction ghosts).'),
+('notify',1,'Syntax: .notify $MessageToBroadcast\r\n\r\nSend a global message to all players online in screen.'),
+('npc add',2,'Syntax: .npc add #creatureid\r\n\r\nSpawn a creature by the given template id of #creatureid.'),
+('npc additem',2,'Syntax: .npc additem #itemId <#maxcount><#incrtime><#extendedcost>r\r\n\r\nAdd item #itemid to item list of selected vendor. Also optionally set max count item in vendor item list and time to item count restoring and items ExtendedCost.'),
+('npc addweapon',3,'Not yet implemented.'),
+('npc allowmove',3,'Syntax: .npc allowmove\r\n\r\nEnable or disable movement for the selected creature.'),
+('npc changelevel',2,'Syntax: .npc changelevel #level\r\n\r\nChange the level of the selected creature to #level.\r\n\r\n#level may range from 1 to 63.'),
+('npc delete',2,'Syntax: .npc delete [#guid]\r\n\r\nDelete creature with guid #guid (or the selected if no guid is provided)'),
+('npc delitem',2,'Syntax: .npc delitem #itemId\r\n\r\nRemove item #itemid from item list of selected vendor.'),
+('npc factionid',2,'Syntax: .npc factionid #factionid\r\n\r\nSet the faction of the selected creature to #factionid.'),
+('npc flag',2,'Syntax: .npc flag #npcflag\r\n\r\nSet the NPC flags of creature template of the selected creature and selected creature to #npcflag. NPC flags will applied to all creatures of selected creature template after server restart or grid unload/load.'),
+('npc follow',2,'Syntax: .npc follow\r\n\r\nSelected creature start follow you until death/fight/etc.'),
+('npc info',3,'Syntax: .npc info\r\n\r\nDisplay a list of details for the selected creature.\r\n\r\nThe list includes:\r\n- GUID, Faction, NPC flags, Entry ID, Model ID,\r\n- Level,\r\n- Health (current/maximum),\r\n\r\n- Field flags, dynamic flags, faction template, \r\n- Position information,\r\n- and the creature type, e.g. if the creature is a vendor.'),
+('npc move',2,'Syntax: .npc move [#creature_guid]\r\n\r\nMove the targeted creature spawn point to your coordinates.'),
+('npc name',2,'Syntax: .npc name $name\r\n\r\nChange the name of the selected creature or character to $name.\r\n\r\nCommand disabled.'),
+('npc playemote',3,'Syntax: .npc playemote #emoteid\r\n\r\nMake the selected creature emote with an emote of id #emoteid.'),
+('npc setmodel',2,'Syntax: .npc setmodel #displayid\r\n\r\nChange the model id of the selected creature to #displayid.'),
+('npc setmovetype',2,'Syntax: .npc setmovetype [#creature_guid] stay/random/way [NODEL]\r\n\r\nSet for creature pointed by #creature_guid (or selected if #creature_guid not provided) movement type and move it to respawn position (if creature alive). Any existing waypoints for creature will be removed from the database if you do not use NODEL. If the creature is dead then movement type will applied at creature respawn.\r\nMake sure you use NODEL, if you want to keep the waypoints.'),
+('npc spawndist',2,'Syntax: .npc spawndist #dist\r\n\r\nAdjust spawndistance of selected creature to dist.'),
+('npc spawntime',2,'Syntax: .npc spawntime #time \r\n\r\nAdjust spawntime of selected creature to time.'),
+('npc subname',2,'Syntax: .npc subname $Name\r\n\r\nChange the subname of the selected creature or player to $Name.\r\n\r\nCommand disabled.'),
+('npc tame',2,'Syntax: .npc tame\r\n\r\nTame selected creature (tameable non pet creature). You don''t must have pet.'),
+('npc textemote',3,'Syntax: .npc textemote #emoteid\r\n\r\nMake the selected creature to do textemote with an emote of id #emoteid.'),
+('npc whisper',1,'Syntax: .npc whisper #playerguid #text\r\nMake the selected npc whisper #text to #playerguid.'),
+('npc unfollow',2,'Syntax: .npc unfollow\r\n\r\nSelected creature (non pet) stop follow you.'),
+('password',0,'Syntax: .password $old_password $new_password $new_password\r\n\r\nChange your account password.'),
+('pdump write',3,'Syntax is: pdump write $filename $playerNameOrGUID\r\nWrite character dump with name/guid $playerNameOrGUID to file $filename.'),
+('pdump load',3,'Syntax is: pdump load $filename $account [$newname] [$newguid]\r\nLoad character dump from dump file into character list of $account with saved or $newname, with saved (or first free) or $newguid guid.'),
+('pinfo',2,'Syntax: .pinfo [$player_name] [rep]\r\n\r\nOutput account information for selected player or player find by $player_name. If \"rep\" parameter provided show reputation information for player.'),
+('plimit',3,'Syntax: .plimit [#num|-1|-2|-3|reset|player|moderator|gamemaster|administrator]\r\n\r\nWithout arg show current player amount and security level limitations for login to server, with arg set player linit ($num > 0) or securiti limitation ($num < 0 or security leme name. With `reset` sets player limit to the one in the config file'),
+('quest add',3,'Syntax: .quest add #quest_id\r\n\r\nAdd to character quest log quest #quest_id. Quest started from item can\'t be added by this command but correct .additem call provided in command output.'),
+('quest complete',3,'Syntax: .quest complete #questid\r\nMark all quest objectives as completed for target character active quest. After this target character can go and get quest reward.'),
+('quest remove',3,'Syntax: .quest remove #quest_id\r\n\r\nSet quest #quest_id state to not completed and not active (and remove from active quest list) for selected player.'),
+('recall',1,'Syntax: .recall [$playername]\r\n\r\nTeleport $playername or selected player to the place where he has been before last use of a teleportation command. If no $playername is entered and no player is selected, it will teleport you.'),
+('reload',3,'Syntax: .reload table_name\r\n\r\nReload table `table_name` if reload support added for this table and this table can be _safe_ reloaded.'),
+('reload all',3,'Syntax: .reload all\r\n\r\nReload all tables with reload support added and that can be _safe_ reloaded.'),
+('reload all_area',3,'Syntax: .reload all_area\r\n\r\nReload all `areatrigger_*` tables if reload support added for this table and this table can be _safe_ reloaded.'),
+('reload all_loot',3,'Syntax: .reload all_loot\r\n\r\nReload all `*_loot_template` tables. This can be slow operation with lags for server run.'),
+('reload all_quest',3,'Syntax: .reload all_quest\r\n\r\nReload all quest related tables if reload support added for this table and this table can be _safe_ reloaded.'),
+('reload all_spell',3,'Syntax: .reload all_spell\r\n\r\nReload all `spell_*` tables with reload support added and that can be _safe_ reloaded.'),
+('reload all_locales',3,'Syntax: .reload all_locales\r\n\r\nReload all `locales_*` tables with reload support added and that can be _safe_ reloaded.'),
+('reload config',3,'Syntax: .reload config\r\n\r\nReload config settings (by default stored in mangosd.conf). Not all settings can be change at reload: some new setting values will be ignored until restart, some values will applied with delay or only to new objects/maps, some values will explicitly rejected to change at reload.'),
+('repairitems',2,'Syntax: .repairitems\r\n\r\nRepair all selected player''s items.'),
+('reset all',3,'Syntax: .reset all spells\r\n\r\nSyntax: .reset all talents\r\n\r\nRequest reset spells or talents at next login each existed character.'),
+('reset honor',3,'Syntax:\r\n.reset honor [Playername]\r\n Reset all honor data for targeted character.'),
+('reset level',3,'Syntax:\r\n.reset level [Playername]\r\n Reset level to 1 including reset stats and talents. Equipped items with greater level requirement can be lost.'),
+('reset spells',3,'Syntax:\r\n.reset spells [Playername]\r\n Removes all non-original spells from spellbook.\r\n. Playername can be name of offline character.'),
+('reset stats',3,'Syntax:\r\n.reset stats [Playername]\r\n Resets(recalculate) all stats of the targeted player to their original VALUESat current level.'),
+('reset talents',3,'Syntax:\r\n.reset talents [Playername]\r\n Removes all talents of the targeted player. Playername can be name of offline character.'),
+('respawn',3,'Syntax: .respawn\r\n\r\nRespawn selected creature or respawn all nearest creatures (if none selected) and GO without waiting respawn time expiration.'),
+('revive',3,'Syntax: .revive\r\n\r\nRevive the selected player. If no player is selected, it will revive you.'),
+('save',0,'Syntax: .save\r\n\r\nSaves your character.'),
+('saveall',1,'Syntax: .saveall\r\n\r\nSave all characters in game.'),
+('senditems',3,'Syntax: .senditems #playername "#subject" "#text" itemid1[:count1] itemid2[:count2] ... itemidN[:countN]\r\n\r\nSend a mail to a player. Subject and mail text must be in "". If for itemid not provided related count values then expected 1, if count > max items in stack then items will be send in required amount stacks. All stacks amount in mail limited to 12.'),
+('sendmail',1,'Syntax: .sendmail #playername "#subject" "#text"\r\n\r\nSend a mail to a player. Subject and mail text must be in "".'),
+('sendmoney','3','Syntax: .sendmoney #playername "#subject" "#text" #money\r\n\r\nSend mail with money to a player. Subject and mail text must be in "".'),
+('sendmessage',3,'Syntax: .sendmessage $playername $message\r\n\r\nSend screen message to player from ADMINISTRATOR.'),
+('server corpses',2,'Syntax: .server corpses\r\n\r\nTriggering corpses expire check in world.'),
+('server exit',4,'Syntax: .server exit\r\n\r\nTerminate mangosd NOW. Exit code 0.'),
+('server info',0,'Syntax: .server info\r\n\r\nDisplay server version and the number of connected players.'),
+('server idleshutdown',3,'Syntax: .server idleshutdown #delay [#exist_code]\r\n\r\nShut the server down after #delay seconds if no active connections are present (no players). Use #exist_code or 0 as program exist code.'),
+('server idleshutdown cancel',3,'Syntax: .server idleshutdown cancel\r\n\r\nCancel the restart/shutdown timer if any.'),
+('server idlerestart',3,'Syntax: .server idlerestart #delay\r\n\r\nRestart the server after #delay seconds if no active connections are present (no players). Use #exist_code or 2 as program exist code.'),
+('server idlerestart cancel',3,'Syntax: .server idlerestart cancel\r\n\r\nCancel the restart/shutdown timer if any.'),
+('server motd',0,'Syntax: .server motd\r\n\r\nShow server Message of the day.'),
+('server restart',3,'Syntax: .server restart #delay\r\n\r\nRestart the server after #delay seconds. Use #exist_code or 2 as program exist code.'),
+('server restart cancel',3,'Syntax: .server restart cancel\r\n\r\nCancel the restart/shutdown timer if any.'),
+('server set loglevel',4,'Syntax: .server set loglevel #level\r\n\r\nSet server log level (0 - errors only, 1 - basic, 2 - detail, 3 - debug).'),
+('server set motd',3,'Syntax: .server set motd $MOTD\r\n\r\nSet server Message of the day.'),
+('server shutdown',3,'Syntax: .server shutdown #delay [#exist_code]\r\n\r\nShut the server down after #delay seconds. Use #exist_code or 0 as program exist code.'),
+('server shutdown cancel',3,'Syntax: .server shutdown cancel\r\n\r\nCancel the restart/shutdown timer if any.'),
+('setskill',3,'Syntax: .setskill #skill #level [#max]\r\n\r\nSet a skill of id #skill with a current skill value of #level and a maximum value of #max (or equal current maximum if not provide) for the selected character. If no character is selected, you learn the skill.'),
+('showarea',3,'Syntax: .showarea #areaid\r\n\r\nReveal the area of #areaid to the selected character. If no character is selected, reveal this area to you.'),
+('start',0,'Syntax: .start\r\n\r\nTeleport you to the starting area of your character.'),
+('taxicheat',1,'Syntax: .taxicheat on/off\r\n\r\nTemporary grant access or remove to all taxi routes for the selected character. If no character is selected, hide or reveal all routes to you.\r\n\r\nVisited taxi nodes sill accessible after removing access.'),
+('tele',1,'Syntax: .tele #location\r\n\r\nTeleport player to a given location.'),
+('tele add',3,'Syntax: .tele add $name\r\n\r\nAdd current your position to .tele command target locations list with name $name.'),
+('tele del',3,'Syntax: .tele del $name\r\n\r\nRemove location with name $name for .tele command locations list.'),
+('tele group',1,'Syntax: .tele group#location\r\n\r\nTeleport a selected player and his group members to a given location.'),
+('tele name',1,'Syntax: .tele name #playername #location\r\n\r\nTeleport a player to a given location.'),
+('ticket',2,'Syntax: .ticket on\r\n .ticket off\r\n .ticket #num\r\n .ticket $character_name\r\n\r\non/off for GMs to show or not a new ticket directly, $character_name to show ticket of this character, #num to show ticket #num.'),
+('unaura',3,'Syntax: .unaura #spellid\r\n\r\nRemove aura due to spell #spellid from the selected Unit.'),
+('unban account',3,'Syntax is: unban account $Name\r\nUnban accounts for account name pattern.'),
+('unban character',3,'Syntax is: unban character $Name\r\nUnban accounts for character name pattern.'),
+('unban ip',3,'Syntax is: unban ip $Ip\r\nUnban accounts for IP pattern.'),
+('unlearn',3,'Syntax: .unlearn #startspell #endspell\r\n\r\nUnlearn for selected player the range of spells between id #startspell and #endspell. If no #endspell is provided, just unlearn spell of id #startspell.'),
+('unmute',1,'Syntax: .unmute $playerName\r\n\r\nRestore chat messaging for any character from account of character $playerName.'),
+('waterwalk',2,'Syntax: .waterwalk on/off\r\n\r\nSet on/off waterwalk state for selected player.'),
+('wchange',3,'Syntax: .wchange #weathertype #status\r\n\r\nSet current weather to #weathertype with an intensity of #status.\r\n\r\n#weathertype can be 1 for rain, 2 for snow, and 3 for sand. #status can be 0 for disabled, and 1 for enabled.'),
+('whispers',1,'Syntax: .whispers on|off\r\nEnable/disable accepting whispers by GM from players. By default use mangosd.conf setting.'),
+('wp',2,'Using WP Command:\r\nEach Waypoint Command has it\'s own description!'),
+('wp add',2,'Syntax: .wp add [#creature_guid or Select a Creature]'),
+('wp export',3,'Syntax: .wp export [#creature_guid or Select a Creature] $filename'),
+('wp import',3,'Syntax: .wp import $filename'),
+('wp modify',2,'Syntax: .wp modify [#creature_guid or Select a Creature]\r\nadd - Add a waypoint after the selected visual\r\nwaittime $time\r\nemote ID\r\nspell ID\r\ntext1| text2| text3| text4| text5 <text>\r\nmodel1 ID\r\nmodel2 ID\r\nmove(moves wp to player pos)\r\ndel (deletes the wp)\r\n\r\nOnly one parameter per time!'),
+('wp show',2,'Syntax: .wp show [#creature_guid or Select a Creature]\r\non\r\nfirst\r\nlast\r\noff\r\ninfo\r\n\r\nFor using info you have to do first show on and than select a Visual-Waypoint and do the show info!');
/*!40000 ALTER TABLE `command` ENABLE KEYS */;
UNLOCK TABLES;
@@ -201,7 +454,7 @@ CREATE TABLE `creature` (
`MovementType` tinyint(3) unsigned NOT NULL default '0',
PRIMARY KEY (`guid`),
KEY `idx_map` (`map`),
- KEY `idx_id` (`id`)
+ KEY `index_id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Creature System';
--
@@ -219,7 +472,7 @@ UNLOCK TABLES;
DROP TABLE IF EXISTS `creature_addon`;
CREATE TABLE `creature_addon` (
- `guid` int(10) unsigned NOT NULL default '0',
+ `guid` int(11) unsigned NOT NULL default '0',
`path_id` int(11) unsigned NOT NULL default '0',
`mount` mediumint(8) unsigned NOT NULL default '0',
`bytes0` int(10) unsigned NOT NULL default '0',
@@ -229,7 +482,7 @@ CREATE TABLE `creature_addon` (
`moveflags` int(10) unsigned NOT NULL default '0',
`auras` text,
PRIMARY KEY (`guid`)
-) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
-- Dumping data for table `creature_addon`
@@ -247,15 +500,9 @@ UNLOCK TABLES;
DROP TABLE IF EXISTS `creature_equip_template`;
CREATE TABLE `creature_equip_template` (
`entry` mediumint(8) unsigned NOT NULL default '0' COMMENT 'Unique entry',
- `equipmodel1` mediumint(8) unsigned NOT NULL default '0',
- `equipmodel2` mediumint(8) unsigned NOT NULL default '0',
- `equipmodel3` mediumint(8) unsigned NOT NULL default '0',
- `equipinfo1` int(10) unsigned NOT NULL default '0',
- `equipinfo2` int(10) unsigned NOT NULL default '0',
- `equipinfo3` int(10) unsigned NOT NULL default '0',
- `equipslot1` int(11) NOT NULL default '0',
- `equipslot2` int(11) NOT NULL default '0',
- `equipslot3` int(11) NOT NULL default '0',
+ `equipentry1` mediumint(8) unsigned NOT NULL default '0',
+ `equipentry2` mediumint(8) unsigned NOT NULL default '0',
+ `equipentry3` mediumint(8) unsigned NOT NULL default '0',
PRIMARY KEY (`entry`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Creature System (Equipment)';
@@ -304,7 +551,7 @@ CREATE TABLE `creature_loot_template` (
`condition_value1` mediumint(8) unsigned NOT NULL default '0',
`condition_value2` mediumint(8) unsigned NOT NULL default '0',
PRIMARY KEY (`entry`,`item`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Loot System';
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System';
--
-- Dumping data for table `creature_loot_template`
@@ -338,7 +585,6 @@ LOCK TABLES `creature_model_info` WRITE;
/*!40000 ALTER TABLE `creature_model_info` ENABLE KEYS */;
UNLOCK TABLES;
-
--
-- Table structure for table `waypoint_data`
--
@@ -491,7 +737,7 @@ CREATE TABLE `creature_template` (
`faction_A` smallint(5) unsigned NOT NULL default '0',
`faction_H` smallint(5) unsigned NOT NULL default '0',
`npcflag` int(10) unsigned NOT NULL default '0',
- `speed` float default '1',
+ `speed` float NOT NULL default '1',
`scale` float NOT NULL default '1',
`rank` tinyint(3) unsigned NOT NULL default '0',
`mindmg` float NOT NULL default '0',
@@ -500,7 +746,7 @@ CREATE TABLE `creature_template` (
`attackpower` int(10) unsigned NOT NULL default '0',
`baseattacktime` int(10) unsigned NOT NULL default '0',
`rangeattacktime` int(10) unsigned NOT NULL default '0',
- `flags` int(10) unsigned NOT NULL default '0',
+ `unit_flags` int(10) unsigned NOT NULL default '0',
`dynamicflags` int(10) unsigned NOT NULL default '0',
`family` tinyint(4) NOT NULL default '0',
`trainer_type` tinyint(4) NOT NULL default '0',
@@ -511,7 +757,7 @@ CREATE TABLE `creature_template` (
`maxrangedmg` float NOT NULL default '0',
`rangedattackpower` smallint(5) unsigned NOT NULL default '0',
`type` tinyint(3) unsigned NOT NULL default '0',
- `flag1` int(10) unsigned NOT NULL default '0',
+ `type_flags` int(10) unsigned NOT NULL default '0',
`lootid` mediumint(8) unsigned NOT NULL default '0',
`pickpocketloot` mediumint(8) unsigned NOT NULL default '0',
`skinloot` mediumint(8) unsigned NOT NULL default '0',
@@ -537,8 +783,7 @@ CREATE TABLE `creature_template` (
`mechanic_immune_mask` int(10) unsigned NOT NULL default '0',
`flags_extra` int(10) unsigned NOT NULL default '0',
`ScriptName` char(64) NOT NULL default '',
- PRIMARY KEY (`entry`),
- KEY `idx_name` (`name`)
+ PRIMARY KEY (`entry`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Creature System';
--
@@ -547,6 +792,8 @@ CREATE TABLE `creature_template` (
LOCK TABLES `creature_template` WRITE;
/*!40000 ALTER TABLE `creature_template` DISABLE KEYS */;
+INSERT INTO `creature_template` VALUES
+(1,1,10045,0,10045,0,'Waypoint(Only GM can see it)','Visual',NULL,1,1,64,64,0,0,0,35,35,0,0.91,1,0,14,15,0,100,2000,2200,4096,0,8,0,0,0,0,1.76,2.42,100,8,5242886,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,3,0,1,0,0,0x82,'');
/*!40000 ALTER TABLE `creature_template` ENABLE KEYS */;
UNLOCK TABLES;
@@ -665,7 +912,7 @@ CREATE TABLE `event_scripts` (
`command` mediumint(8) unsigned NOT NULL default '0',
`datalong` mediumint(8) unsigned NOT NULL default '0',
`datalong2` int(10) unsigned NOT NULL default '0',
- `datatext` text NOT NULL,
+ `dataint` int(11) NOT NULL default '0',
`x` float NOT NULL default '0',
`y` float NOT NULL default '0',
`z` float NOT NULL default '0',
@@ -856,6 +1103,78 @@ CREATE TABLE `exploration_basexp` (
LOCK TABLES `exploration_basexp` WRITE;
/*!40000 ALTER TABLE `exploration_basexp` DISABLE KEYS */;
+INSERT INTO `exploration_basexp` VALUES
+(0,0),
+(1,5),
+(2,15),
+(3,25),
+(4,35),
+(5,45),
+(6,55),
+(7,65),
+(8,70),
+(9,80),
+(10,85),
+(11,90),
+(12,90),
+(13,90),
+(14,100),
+(15,105),
+(16,115),
+(17,125),
+(18,135),
+(19,145),
+(20,155),
+(21,165),
+(22,175),
+(23,185),
+(24,195),
+(25,200),
+(26,210),
+(27,220),
+(28,230),
+(29,240),
+(30,245),
+(31,250),
+(32,255),
+(33,265),
+(34,270),
+(35,275),
+(36,280),
+(37,285),
+(38,285),
+(39,300),
+(40,315),
+(41,330),
+(42,345),
+(43,360),
+(44,375),
+(45,390),
+(46,405),
+(47,420),
+(48,440),
+(49,455),
+(50,470),
+(51,490),
+(52,510),
+(53,530),
+(54,540),
+(55,560),
+(56,580),
+(57,600),
+(58,620),
+(59,640),
+(60,660),
+(61,970),
+(62,1000),
+(63,1050),
+(64,1080),
+(65,1100),
+(66,1130),
+(67,1160),
+(68,1200),
+(69,1230),
+(70,1250);
/*!40000 ALTER TABLE `exploration_basexp` ENABLE KEYS */;
UNLOCK TABLES;
@@ -875,7 +1194,7 @@ CREATE TABLE `fishing_loot_template` (
`condition_value1` mediumint(8) unsigned NOT NULL default '0',
`condition_value2` mediumint(8) unsigned NOT NULL default '0',
PRIMARY KEY (`entry`,`item`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Loot System';
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System';
--
-- Dumping data for table `fishing_loot_template`
@@ -1293,7 +1612,7 @@ CREATE TABLE `gameobject_loot_template` (
`condition_value1` mediumint(8) unsigned NOT NULL default '0',
`condition_value2` mediumint(8) unsigned NOT NULL default '0',
PRIMARY KEY (`entry`,`item`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Loot System';
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System';
--
-- Dumping data for table `gameobject_loot_template`
@@ -1357,7 +1676,7 @@ CREATE TABLE `gameobject_scripts` (
`command` mediumint(8) unsigned NOT NULL default '0',
`datalong` mediumint(8) unsigned NOT NULL default '0',
`datalong2` int(10) unsigned NOT NULL default '0',
- `datatext` text NOT NULL,
+ `dataint` int(11) NOT NULL default '0',
`x` float NOT NULL default '0',
`y` float NOT NULL default '0',
`z` float NOT NULL default '0',
@@ -1412,8 +1731,7 @@ CREATE TABLE `gameobject_template` (
`data22` int(10) unsigned NOT NULL default '0',
`data23` int(10) unsigned NOT NULL default '0',
`ScriptName` varchar(64) NOT NULL default '',
- PRIMARY KEY (`entry`),
- KEY `idx_name` (`name`)
+ PRIMARY KEY (`entry`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Gameobject System';
--
@@ -1451,6 +1769,33 @@ CREATE TABLE `instance_template` (
LOCK TABLES `instance_template` WRITE;
/*!40000 ALTER TABLE `instance_template` DISABLE KEYS */;
+INSERT INTO `instance_template` VALUES
+(33,0,22,30,10,7200,NULL,NULL,NULL,NULL,''),
+(34,0,24,32,10,7200,NULL,NULL,NULL,NULL,''),
+(36,0,15,20,10,7200,NULL,NULL,NULL,NULL,''),
+(43,0,15,21,10,7200,NULL,NULL,NULL,NULL,''),
+(47,0,29,38,10,7200,NULL,NULL,NULL,NULL,''),
+(48,0,24,32,10,7200,NULL,NULL,NULL,NULL,''),
+(70,0,35,47,10,7200,NULL,NULL,NULL,NULL,''),
+(90,0,29,38,10,7200,NULL,NULL,NULL,NULL,''),
+(109,0,45,55,10,7200,NULL,NULL,NULL,NULL,''),
+(129,0,37,46,10,7200,NULL,NULL,NULL,NULL,''),
+(189,0,34,45,10,7200,NULL,NULL,NULL,NULL,''),
+(209,0,44,54,10,7200,NULL,NULL,NULL,NULL,''),
+(229,0,58,0,10,120000,78.5083,-225.044,49.839,5.1,''),
+(230,0,52,0,5,7200,NULL,NULL,NULL,NULL,''),
+(249,0,60,0,40,432000,NULL,NULL,NULL,NULL,''),
+(289,0,57,0,5,7200,NULL,NULL,NULL,NULL,''),
+(309,0,60,0,20,259200,NULL,NULL,NULL,NULL,''),
+(329,0,58,60,5,7200,NULL,NULL,NULL,NULL,''),
+(349,0,46,55,10,7200,NULL,NULL,NULL,NULL,''),
+(389,0,13,18,10,7200,NULL,NULL,NULL,NULL,''),
+(409,0,60,0,40,604800,NULL,NULL,NULL,NULL,''),
+(429,0,55,60,5,7200,NULL,NULL,NULL,NULL,''),
+(469,0,60,0,40,604800,NULL,NULL,NULL,NULL,''),
+(509,0,60,0,20,259200,NULL,NULL,NULL,NULL,''),
+(531,0,60,0,40,604800,NULL,NULL,NULL,NULL,''),
+(533,0,60,0,40,604800,NULL,NULL,NULL,NULL,'');
/*!40000 ALTER TABLE `instance_template` ENABLE KEYS */;
UNLOCK TABLES;
@@ -1486,7 +1831,7 @@ CREATE TABLE `item_loot_template` (
`ChanceOrQuestChance` float NOT NULL default '100',
`groupid` tinyint(3) unsigned NOT NULL default '0',
`mincountOrRef` mediumint(9) NOT NULL default '1',
- `maxcount` smallint(5) unsigned NOT NULL default '1',
+ `maxcount` tinyint(3) unsigned NOT NULL default '1',
`lootcondition` tinyint(3) unsigned NOT NULL default '0',
`condition_value1` mediumint(8) unsigned NOT NULL default '0',
`condition_value2` mediumint(8) unsigned NOT NULL default '0',
@@ -1534,6 +1879,7 @@ CREATE TABLE `item_template` (
`maxcount` smallint(5) unsigned NOT NULL default '0',
`stackable` smallint(5) unsigned NOT NULL default '1',
`ContainerSlots` tinyint(3) unsigned NOT NULL default '0',
+ `StatsCount` tinyint(3) unsigned NOT NULL default '0',
`stat_type1` tinyint(3) unsigned NOT NULL default '0',
`stat_value1` smallint(6) NOT NULL default '0',
`stat_type2` tinyint(3) unsigned NOT NULL default '0',
@@ -1554,6 +1900,8 @@ CREATE TABLE `item_template` (
`stat_value9` smallint(6) NOT NULL default '0',
`stat_type10` tinyint(3) unsigned NOT NULL default '0',
`stat_value10` smallint(6) NOT NULL default '0',
+ `ScalingStatDistribution` smallint(6) NOT NULL default '0',
+ `ScalingStatValue` smallint(6) NOT NULL default '0',
`dmg_min1` float NOT NULL default '0',
`dmg_max1` float NOT NULL default '0',
`dmg_type1` tinyint(3) unsigned NOT NULL default '0',
@@ -1631,7 +1979,7 @@ CREATE TABLE `item_template` (
`area` mediumint(8) unsigned NOT NULL default '0',
`Map` smallint(6) NOT NULL default '0',
`BagFamily` mediumint(9) NOT NULL default '0',
- `TotemCategory` tinyint(4) NOT NULL default '0',
+ `TotemCategory` mediumint(9) NOT NULL default '0',
`socketColor_1` tinyint(4) NOT NULL default '0',
`socketContent_1` mediumint(9) NOT NULL default '0',
`socketColor_2` tinyint(4) NOT NULL default '0',
@@ -1642,14 +1990,14 @@ CREATE TABLE `item_template` (
`GemProperties` mediumint(9) NOT NULL default '0',
`RequiredDisenchantSkill` smallint(6) NOT NULL default '-1',
`ArmorDamageModifier` float NOT NULL default '0',
+ `Duration` int(11) NOT NULL default '0' COMMENT 'Duration in seconds. Negative value means realtime, postive value ingame time',
+ `ItemLimitCategory` smallint(6) NOT NULL default '0',
`ScriptName` varchar(64) NOT NULL default '',
`DisenchantID` mediumint(8) unsigned NOT NULL default '0',
`FoodType` tinyint(3) unsigned NOT NULL default '0',
`minMoneyLoot` int(10) unsigned NOT NULL default '0',
`maxMoneyLoot` int(10) unsigned NOT NULL default '0',
- `Duration` int(11) NOT NULL default '0' COMMENT 'Duration in seconds. Negative value means realtime, postive value ingame time',
PRIMARY KEY (`entry`),
- KEY `idx_name` (`name`),
KEY `items_index` (`class`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Item System';
@@ -1659,6 +2007,94 @@ CREATE TABLE `item_template` (
LOCK TABLES `item_template` WRITE;
/*!40000 ALTER TABLE `item_template` DISABLE KEYS */;
+INSERT INTO `item_template` VALUES
+(25,2,7,-1,'Worn Shortsword',1542,1,0,1,35,7,21,32767,511,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1900,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,1,0,0,0,1,3,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(35,2,10,-1,'Bent Staff',472,1,0,1,47,9,17,2047,255,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2900,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,2,2,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(36,2,4,-1,'Worn Mace',5194,1,0,1,38,7,21,2047,255,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1900,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,2,3,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(37,2,0,-1,'Worn Axe',14029,1,0,1,38,7,21,2047,255,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,1,3,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(38,4,0,-1,'Recruit\'s Shirt',9891,1,0,1,1,1,4,-1,-1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(39,4,1,-1,'Recruit\'s Pants',9892,0,0,1,5,1,7,32767,511,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(40,4,0,-1,'Recruit\'s Boots',10141,1,0,1,4,1,8,32767,511,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(43,4,0,-1,'Squire\'s Boots',9938,1,0,1,4,1,8,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(44,4,1,-1,'Squire\'s Pants',9937,0,0,1,4,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(45,4,0,-1,'Squire\'s Shirt',3265,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(47,4,0,-1,'Footpad\'s Shoes',9915,1,0,1,4,1,8,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(48,4,1,-1,'Footpad\'s Pants',9913,0,0,1,4,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(49,4,0,-1,'Footpad\'s Shirt',9906,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(51,4,0,-1,'Neophyte\'s Boots',9946,1,0,1,5,1,8,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(52,4,1,-1,'Neophyte\'s Pants',9945,0,0,1,5,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(53,4,0,-1,'Neophyte\'s Shirt',9944,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(55,4,0,-1,'Apprentice\'s Boots',9929,1,0,1,5,1,8,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(56,4,1,-1,'Apprentice\'s Robe',12647,0,0,1,5,1,20,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(57,4,1,-1,'Acolyte\'s Robe',12645,0,0,1,5,1,20,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(59,4,0,-1,'Acolyte\'s Shoes',3261,1,0,1,5,1,8,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(117,0,0,-1,'Tough Jerky',2473,1,0,6,25,1,0,2047,255,5,1,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,433,0,-1,0,-1,11,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(120,4,1,-1,'Thug Pants',10006,0,0,1,4,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(121,4,0,-1,'Thug Boots',10008,1,0,1,4,1,8,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(127,4,0,-1,'Trapper\'s Shirt',9996,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(139,4,1,-1,'Brawler\'s Pants',9988,0,0,1,4,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(140,4,0,-1,'Brawler\'s Boots',9992,1,0,1,4,1,8,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(147,4,1,-1,'Rugged Trapper\'s Pants',9975,0,0,1,5,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(148,4,0,-1,'Rugged Trapper\'s Shirt',9976,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(153,4,2,-1,'Primitive Kilt',10050,0,0,1,5,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,8,0,0,0,0,0,30,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(154,4,0,-1,'Primitive Mantle',10058,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(159,0,0,-1,'Refreshing Spring Water',18084,1,0,6,25,1,0,2047,255,5,1,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,430,0,-1,0,-1,59,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(1395,4,1,-1,'Apprentice\'s Pants',9924,0,0,1,5,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(1396,4,1,-1,'Acolyte\'s Pants',3260,0,0,1,4,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2070,0,0,-1,'Darnassian Bleu',6353,1,0,6,25,1,0,2047,255,5,1,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,433,0,-1,0,-1,11,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2092,2,15,-1,'Worn Dagger',6442,1,0,1,35,7,13,2047,255,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1600,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,1,3,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2101,1,2,-1,'Light Quiver',21328,1,0,1,4,1,18,2047,255,1,1,0,0,0,0,0,0,0,0,1,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,14824,1,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2102,1,3,-1,'Small Ammo Pouch',1816,1,0,1,4,1,18,2047,255,1,1,0,0,0,0,0,0,0,0,1,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,14824,1,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2105,4,0,-1,'Thug Shirt',10005,1,0,1,5,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2361,2,5,-1,'Battleworn Hammer',8690,1,0,1,45,9,17,2047,255,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2900,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,2,1,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2362,4,6,-1,'Worn Wooden Shield',18730,0,0,1,7,1,14,32767,511,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,1,4,0,0,1,0,20,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2504,2,2,-1,'Worn Shortbow',8106,1,0,1,29,5,15,2047,255,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2300,2,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,2,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2508,2,3,-1,'Old Blunderbuss',6606,1,0,1,27,5,26,2047,255,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2300,3,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,1,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2512,6,2,-1,'Rough Arrow',5996,1,0,1,10,0,24,2047,255,5,1,0,0,0,0,0,0,0,0,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2516,6,3,-1,'Light Shot',5998,1,0,1,10,0,24,2047,255,5,1,0,0,0,0,0,0,0,0,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(2947,2,16,-1,'Small Throwing Knife',16754,1,0,1,15,0,25,2047,255,3,1,0,0,0,0,0,0,0,0,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2000,4,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(3661,2,10,-1,'Handcrafted Staff',18530,1,0,1,45,9,17,2047,255,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2900,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,2,2,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(4536,0,0,-1,'Shiny Red Apple',6410,1,0,6,25,1,0,2047,255,5,1,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,433,0,-1,0,-1,11,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(4540,0,0,-1,'Tough Hunk of Bread',6399,1,0,6,25,1,0,2047,255,5,1,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,433,0,-1,0,-1,11,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(4604,0,0,-1,'Forest Mushroom Cap',15852,1,0,6,25,1,0,2047,255,5,1,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,433,0,-1,0,-1,11,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6096,4,0,-1,'Apprentice\'s Shirt',2163,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6097,4,0,-1,'Acolyte\'s Shirt',2470,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6098,4,1,-1,'Neophyte\'s Robe',12679,0,0,1,4,1,20,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6119,4,1,-1,'Neophyte\'s Robe',12681,0,0,1,4,1,20,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6123,4,1,-1,'Novice\'s Robe',12683,0,0,1,4,1,20,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6124,4,1,-1,'Novice\'s Pants',9987,0,0,1,5,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6125,4,0,-1,'Brawler\'s Harness',9995,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6126,4,1,-1,'Trapper\'s Pants',10002,0,0,1,5,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6127,4,0,-1,'Trapper\'s Boots',10003,1,0,1,5,1,8,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6129,4,1,-1,'Acolyte\'s Robe',12646,0,0,1,5,1,20,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6134,4,0,-1,'Primitive Mantle',10108,1,0,1,1,1,4,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6135,4,2,-1,'Primitive Kilt',10109,0,0,1,5,1,7,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,8,0,0,0,0,0,30,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6139,4,1,-1,'Novice\'s Robe',12684,0,0,1,4,1,20,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6140,4,1,-1,'Apprentice\'s Robe',12649,0,0,1,4,1,20,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6144,4,1,-1,'Neophyte\'s Robe',12680,0,0,1,5,1,20,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,7,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(6948,15,0,-1,'Hearthstone',6418,1,64,1,0,0,0,32767,511,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8690,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,'',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(12282,2,1,-1,'Worn Battleaxe',22291,1,0,1,43,8,17,2047,255,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2900,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,1,1,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(14646,12,0,-1,'Northshire Gift Voucher',18499,1,0,1,0,0,0,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,'',0,0,0,5805,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(14647,12,0,-1,'Coldridge Valley Gift Voucher',18499,1,0,1,0,0,0,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,'',0,0,0,5841,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(14648,12,0,-1,'Shadowglen Gift Voucher',18499,1,0,1,0,0,0,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,'',0,0,0,5842,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(14649,12,0,-1,'Valley of Trials Gift Voucher',18499,1,0,1,0,0,0,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,'',0,0,0,5843,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(14650,12,0,-1,'Camp Narache Gift Voucher',18499,1,0,1,0,0,0,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,'',0,0,0,5844,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(14651,12,0,-1,'Deathknell Gift Voucher',18499,1,0,1,0,0,0,2047,255,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,'',0,0,0,5847,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(25861,2,16,-1,'Crude Throwing Axe',20777,1,0,1,15,0,25,2047,255,3,1,0,0,0,0,0,0,0,0,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2000,4,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'',0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,'internalItemHandler',0,0,0,0,0),
+(34648,4,4,-1,'Acherus Knight\'s Greaves',51496,2,32768,1,51,10,8,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,10,7,12,3,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,392,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,55,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34649,4,4,-1,'Acherus Knight\'s Gauntlets',51498,2,32768,1,34,6,10,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,15,7,6,32,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,356,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34650,4,4,-1,'Acherus Knight\'s Tunic',51494,2,32768,1,69,13,5,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,20,7,11,32,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,570,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,115,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34651,4,4,-1,'Acherus Knight\'s Girdle',51497,2,32768,1,35,7,6,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,2,4,10,32,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,320,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34652,4,4,-1,'Acherus Knight\'s Hood',51495,2,32768,1,52,10,1,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,15,7,15,32,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,463,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,70,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34653,4,4,-1,'Acherus Knight\'s Wristguard',51500,2,32768,1,36,7,9,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,7,31,7,7,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34655,4,4,-1,'Acherus Knight\'s Pauldrons',51501,2,32768,1,54,10,3,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,11,3,9,7,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,427,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,70,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34656,4,4,-1,'Acherus Knight\'s Cover',51499,2,32768,1,73,14,7,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,13,3,10,7,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,499,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,6,0,0,0,0,0,85,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34657,4,0,-1,'Choker of Damnation',6539,2,32768,1,2303,575,2,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,9,7,8,31,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34658,4,0,-1,'Plague Band',963,2,32768,1,534,133,11,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,11,3,6,7,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(34659,4,1,-1,'Acherus Knight\'s Shroud',49738,2,32768,1,31,6,16,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,2,4,12,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(38145,1,0,-1,'Deathweave Bag',1282,1,32768,1,0,0,18,-1,-1,35,0,0,0,0,0,0,0,0,0,1,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(38147,4,0,-1,'Corrupted Band',963,2,32768,1,534,133,11,-1,-1,60,55,0,0,0,0,0,0,0,0,1,0,3,4,11,3,6,32,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,1,'',0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0),
+(41751,0,5,-1,'Black Mushroom',36728,1,0,1,100,5,0,-1,-1,65,55,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27094,0,-1,0,0,11,1000,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,0,0,0,-1,0,-1,0,'',0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,'',0,0,0,0);
/*!40000 ALTER TABLE `item_template` ENABLE KEYS */;
UNLOCK TABLES;
@@ -1767,6 +2203,42 @@ LOCK TABLES `locales_item` WRITE;
/*!40000 ALTER TABLE `locales_item` ENABLE KEYS */;
UNLOCK TABLES;
+
+--
+-- Table structure for table `locales_npc_option`
+--
+
+DROP TABLE IF EXISTS `locales_npc_option`;
+CREATE TABLE `locales_npc_option` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `option_text_loc1` text,
+ `option_text_loc2` text,
+ `option_text_loc3` text,
+ `option_text_loc4` text,
+ `option_text_loc5` text,
+ `option_text_loc6` text,
+ `option_text_loc7` text,
+ `option_text_loc8` text,
+ `box_text_loc1` text,
+ `box_text_loc2` text,
+ `box_text_loc3` text,
+ `box_text_loc4` text,
+ `box_text_loc5` text,
+ `box_text_loc6` text,
+ `box_text_loc7` text,
+ `box_text_loc8` text,
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `locales_npc_option`
+--
+
+LOCK TABLES `locales_npc_option` WRITE;
+/*!40000 ALTER TABLE `locales_npc_option` DISABLE KEYS */;
+/*!40000 ALTER TABLE `locales_npc_option` ENABLE KEYS */;
+UNLOCK TABLES;
+
--
-- Table structure for table `locales_npc_text`
--
@@ -2041,6 +2513,647 @@ LOCK TABLES `locales_quest` WRITE;
UNLOCK TABLES;
--
+-- Table structure for table `mangos_string`
+--
+
+DROP TABLE IF EXISTS `mangos_string`;
+CREATE TABLE `mangos_string` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `content_default` text NOT NULL,
+ `content_loc1` text,
+ `content_loc2` text,
+ `content_loc3` text,
+ `content_loc4` text,
+ `content_loc5` text,
+ `content_loc6` text,
+ `content_loc7` text,
+ `content_loc8` text,
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `mangos_string`
+--
+
+LOCK TABLES `mangos_string` WRITE;
+/*!40000 ALTER TABLE `mangos_string` DISABLE KEYS */;
+INSERT INTO `mangos_string` VALUES
+(1,'You should select a character or a creature.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(2,'You should select a creature.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(3,'|cffff0000[System Message]: %s|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(4,'|cffff0000[Event Message]: %s|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(5,'There is no help for that command',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(6,'There is no such command',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(7,'There is no such subcommand',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(8,'Command %s have subcommands:%s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(9,'Commands available to you:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(10,'Incorrect syntax.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(11,'Your account level is: %i',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(12,'Online players: %u (max: %u) Queued players: %u (max: %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(13,'Server uptime: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(14,'Player saved.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(15,'All players saved.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(16,'There are the following active GMs on this server:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(17,'There are no GMs currently logged in on this server.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(18,'Cannot do that while flying.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(19,'Cannot do that in Battlegrounds.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(20,'Target is flying you can\'t do that.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(21,'%s is flying command failed.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(22,'You are not mounted so you can\'t dismount.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(23,'Cannot do that while fighting.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(24,'You used it recently.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(25,'Password not changed (unknown error)!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(26,'The password was changed',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(27,'The new passwords do not match or the old password is wrong',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(28,'Your account is now locked.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(29,'Your account is now unlocked.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(30,', rank ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(31,' [known]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(32,' [learn]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(33,' [passive]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(34,' [talent]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(35,' [active]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(36,' [complete]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(37,' (offline)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(38,'on',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(39,'off',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(40,'You are: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(41,'visible',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(42,'invisible',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(43,'done',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(44,'You',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(45,' <unknown> ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(46,'<error>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(47,'<non-existing character>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(48,'UNKNOWN',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(49,'You must be at least level %u to enter.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(50,'You must be at least level %u and have item %s to enter.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(51,'Hello! Ready for some training?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(52,'Invaid item count (%u) for item %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(53,'Mail can\'t have more %u item stacks',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(54,'The new passwords do not match',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(55,'Your password can\'t be longer than 16 characters (client limit), password not changed!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(56,'Current Message of the day: \r\n%s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(57,'Using World DB: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(58,'Using script library: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(100,'Global notify: ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(101,'Map: %u (%s) Zone: %u (%s) Area: %u (%s)\nX: %f Y: %f Z: %f Orientation: %f\ngrid[%u,%u]cell[%u,%u] InstanceID: %u\n ZoneX: %f ZoneY: %f\nGroundZ: %f FloorZ: %f Have height data (Map: %u VMap: %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(102,'%s is already being teleported.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(103,'You can summon a player to your instance only if he is in your party with you as leader.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(104,'You cannot go to the player\'s instance because you are in a party now.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(105,'You can go to the player\'s instance while not being in his party only if your GM mode is on.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(106,'You can not go to player %s from instance to instance.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(107,'You can not summon player %s from instance to instance.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(108,'You are summoning %s%s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(109,'You are being summoned by %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(110,'You are teleporting %s%s to %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(111,'You are being teleported by %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(112,'Player (%s) does not exist.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(113,'Appearing at %s\'s location.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(114,'%s is appearing to your location.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(115,'Incorrect values.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(116,'No character selected.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(117,'%s is not in a group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(118,'You changed HP of %s to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(119,'%s changed your HP to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(120,'You changed MANA of %s to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(121,'%s changed your MANA to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(122,'You changed ENERGY of %s to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(123,'%s changed your ENERGY to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(124,'Current energy: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(125,'You changed rage of %s to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(126,'%s changed your rage to %i/%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(127,'You changed level of %s to %i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(128,'GUID %i, faction is %i, flags is %i, npcflag is %i, DY flag is %i',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(129,'Wrong faction: %u (not found in factiontemplate.dbc).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(130,'You changed GUID=%i \'s Faction to %i, flags to %i, npcflag to %i, dyflag to %i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(131,'You changed the spellflatid=%i, val= %i, mark =%i to %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(132,'%s changed your spellflatid=%i, val= %i, mark =%i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(133,'%s has access to all taxi nodes now (until logout).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(134,'%s has no more access to all taxi nodes now (only visited accessible).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(135,'%s has given you access to all taxi nodes (until logout).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(136,'%s has removed access to all taxi nodes (only visited still accessible).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(137,'You set all speeds to %2.2f from normal of %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(138,'%s set all your speeds to %2.2f from normal.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(139,'You set the speed to %2.2f from normal of %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(140,'%s set your speed to %2.2f from normal.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(141,'You set the swim speed to %2.2f from normal of %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(142,'%s set your swim speed to %2.2f from normal.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(143,'You set the backwards run speed to %2.2f from normal of %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(144,'%s set your backwards run speed to %2.2f from normal.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(145,'You set the fly speed to %2.2f from normal of %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(146,'%s set your fly speed to %2.2f from normal.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(147,'You set the size %2.2f of %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(148,'%s set your size to %2.2f.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(149,'There is no such mount.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(150,'You give a mount to %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(151,'%s gave you a mount.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(152,'USER1: %i, ADD: %i, DIF: %i\n',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(153,'You take all copper of %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(154,'%s took you all of your copper.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(155,'You take %i copper from %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(156,'%s took %i copper from you.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(157,'You give %i copper to %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(158,'%s gave you %i copper.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(159,'You hear sound %u.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(160,'USER2: %i, ADD: %i, RESULT: %i\n',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(161,'Removed bit %i in field %i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(162,'Set bit %i in field %i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(163,'Teleport location table is empty!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(164,'Teleport location not found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(165,'Requires search parameter.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(166,'There are no teleport locations matching your request.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(168,'Locations found are:\n %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(169,'Mail sent to %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(170,'You try to hear sound %u but it doesn\'t exist.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(172,'server console command',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(200,'No selection.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(201,'Object GUID is: lowpart %u highpart %X',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(202,'The name was too long by %i characters.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(203,'Error, name can only contain characters A-Z and a-z.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(204,'The subname was too long by %i characters.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(205,'Not yet implemented',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(206,'Item \'%i\' \'%s\' added to list with maxcount \'%i\' and incrtime \'%i\' and extendedcost \'%i\'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(207,'Item \'%i\' not found in database.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(208,'Item \'%i\' \'%s\' deleted from vendor list',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(209,'Item \'%i\' not found in vendor list.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(210,'Item \'%i\' already in vendor list.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(211,'Spells of %s reset.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(212,'Spells of %s will reset at next login.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(213,'Talents of %s reset.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(214,'Talents of %s will reset at next login.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(215,'Your spells have been reset.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(216,'Your talents have been reset.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(217,'Unknown case \'%s\' for .resetall command. Type full correct case name.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(218,'Spells will reset for all players at login. Strongly recommend re-login!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(219,'Talents will reset for all players at login. Strongly recommend re-login!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(220,'Creature (GUID: %u) No waypoint found.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(221,'Creature (GUID: %u) Last waypoint not found.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(222,'Creature (GUID: %u) No waypoint found - used \'wpguid\'. Now trying to find it by its position...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(223,'Creature (GUID: %u) No waypoints found - This is a MaNGOS db problem (single float).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(224,'Selected creature is ignored - provided GUID is used',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(225,'Creature (GUID: %u) not found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(226,'You must select a visual waypoint.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(227,'No visual waypoints found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(228,'Could not create visual waypoint with creatureID: %d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(229,'All visual waypoints removed',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(230,'Could not create waypoint-creature with ID: %d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(231,'No GUID provided.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(232,'No waypoint number provided.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(233,'Argument required for \'%s\'.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(234,'Waypoint %i added to GUID: %d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(235,'Waypoint %d added.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(236,'Waypoint changed.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(237,'Waypoint %s modified.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(238,'WP export successfull.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(239,'No waypoints found inside the database.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(240,'File imported.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(241,'Waypoint removed.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(242,'Warning: Could not delete WP from the world with ID: %d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(243,'This happens if the waypoint is too far away from your char.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(244,'The WP is deleted from the database, but not from the world here.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(245,'They will disappear after a server restart.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(246,'Waypoint %d: Info for creature: %s, GUID: %d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(247,'Waittime: %d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(248,'Model %d: %d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(249,'Emote: %d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(250,'Spell: %d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(251,'Text%d (ID: %i): %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(252,'AIScript: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(253,'Forced rename for player %s will be requested at next login.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(254,'Forced rename for player %s (GUID #%u) will be requested at next login.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(255,'Waypoint-Creature (GUID: %u) Not found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(256,'Could not find NPC...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(257,'Creature movement type set to \'%s\', waypoints removed (if any).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(258,'Creature movement type set to \'%s\', waypoints were not removed.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(259,'Incorrect value, use on or off',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(260,'Value saved.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(261,'Value saved, you may need to rejoin or clean your client cache.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(262,'Areatrigger ID %u not found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(263,'Target map or coordinates is invalid (X: %f Y: %f MapId: %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(264,'Zone coordinates is invalid (X: %f Y: %f AreaId: %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(265,'Zone %u (%s) is part of instanceable map %u (%s)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(266,'Nothing found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(267,'Object not found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(268,'Creature not found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(269,'Warning: Mob found more than once - you will be teleported to the first one found in DB.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(270,'Creature Removed',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(271,'Creature moved.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(272,'Creature (GUID:%u) must be on the same map as player!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(273,'Game Object (GUID: %u) not found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(274,'Game Object (GUID: %u) has references in not found creature %u GO list, can\'t be deleted.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(275,'Game Object (GUID: %u) removed',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(276,'Game Object (GUID: %u) turned',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(277,'Game Object (GUID: %u) moved',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(278,'You must select a vendor',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(279,'You must send id for item',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(280,'Vendor has too many items (max 128)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(281,'You can\'t kick self, logout instead',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(282,'Player %s kicked.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(283,'Player %s not found.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(284,'Accepting Whisper: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(285,'Accepting Whisper: ON',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(286,'Accepting Whisper: OFF',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(287,'Creature (GUID: %u) not found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(288,'Tickets count: %i show new tickets: %s\n',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(289,'New ticket from %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(290,'Ticket of %s (Last updated: %s):\n%s ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(291,'New ticket show: ON',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(292,'New ticket show: OFF',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(293,'Ticket %i doesn\'t exist',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(294,'All tickets deleted.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(295,'Character %s ticket deleted.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(296,'Ticket deleted.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(297,'Spawn distance changed to: %f',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(298,'Spawn time changed to: %i',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(299,'The honor of %s was set to %u!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(300,'Your chat has been disabled for %u minutes.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(301,'You have disabled %s\'s chat for %u minutes.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(302,'Player\'s chat is already enabled.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(303,'Your chat has been enabled.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(304,'You have enabled %s\'s chat.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(305, 'Faction %s (%u) reputation of %s was set to %5d!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(306, 'The arena points of %s was set to %u!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(307, 'No faction found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(308, 'Faction %i unknown!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(309, 'Invalid parameter %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(310, 'delta must be between 0 and %d (inclusive)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(311, '%d - |cffffffff|Hfaction:%d|h[%s]|h|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(312, ' [visible]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(313, ' [at war]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(314, ' [peace forced]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(315, ' [hidden]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(316, ' [invisible forced]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(317, ' [inactive]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(318, 'Hated',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(319, 'Hostile',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(320, 'Unfriendly',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(321, 'Neutral',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(322, 'Friendly',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(323, 'Honored',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(324, 'Revered',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(325, 'Exalted',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(326, 'Faction %s (%u) can\'not have reputation.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(327, ' [no reputation]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(328,'Characters at account %s (Id: %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(329,' %s (GUID %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(330,'No players found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(331,'Extended item cost %u not exist',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(332,'GM mode is ON',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(333,'GM mode is OFF',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(334,'GM Chat Badge is ON',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(335,'GM Chat Badge is OFF',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(336,'You repair all %s''s items.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(337,'All your items repaired by %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(338,'You set waterwalk mode %s for %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(339,'Your waterwalk mode %s by %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(340,'%s is now following you.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(341,'%s is not following you.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(342,'%s is now not following you.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(343,'Creature (Entry: %u) cannot be tamed.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(344,'You already have pet.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(345,'Forced customize for player %s will be requested at next login.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(346,'Forced customize for player %s (GUID #%u) will be requested at next login.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(400,'|cffff0000[System Message]:|rScripts reloaded',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(401,'You change security level of account %s to %i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(402,'%s changed your security level to %i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(403,'You have low security level for this.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(404,'Creature movement disabled.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(405,'Creature movement enabled.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(406,'Weather can\'t be changed for this zone.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(407,'Weather system disabled at server.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(408,'%s is banned for %s. Reason: %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(409,'%s is banned permanently for %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(410,'%s %s not found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(411,'%s unbanned.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(412,'There was an error removing the ban on %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(413,'Account not exist: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(414,'There is no such character.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(415,'There is no such IP in banlist.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(416,'Account %s has never been banned',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(417,'Ban history for account %s:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(418,'Ban Date: %s Bantime: %s Still active: %s Reason: %s Set by: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(419,'Inf.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(420,'Never',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(421,'Yes',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(422,'No',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(423,'IP: %s\nBan Date: %s\nUnban Date: %s\nRemaining: %s\nReason: %s\nSet by: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(424,'There is no matching IPban.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(425,'There is no matching account.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(426,'There is no banned account owning a character matching this part.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(427,'The following IPs match your pattern:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(428,'The following accounts match your query:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(429,'You learned many spells/skills.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(430,'You learned all spells for class.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(431,'You learned all talents for class.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(432,'You learned all languages.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(433,'You learned all craft skills and recipes.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(434,'Could not find \'%s\'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(435,'Invalid item id: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(436,'No items found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(437,'Invalid gameobject id: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(438,'Found items %u: %u ( inventory %u mail %u auction %u guild %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(439,'Found gameobjects %u: %u ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(440,'Invalid creature id: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(441,'Found creatures %u: %u ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(442,'No area found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(443,'No item sets found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(444,'No skills found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(445,'No spells found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(446,'No quests found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(447,'No creatures found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(448,'No gameobjects found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(449,'Graveyard #%u doesn\'t exist.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(450,'Graveyard #%u already linked to zone #%u (current).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(451,'Graveyard #%u linked to zone #%u (current).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(452,'Graveyard #%u can\'t be linked to subzone or not existed zone #%u (internal error).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(454,'No faction in Graveyard with id= #%u , fix your DB',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(455,'invalid team, please fix database',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(456,'any',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(457,'alliance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(458,'horde',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(459,'Graveyard #%u (faction: %s) is nearest from linked to zone #%u.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(460,'Zone #%u doesn\'t have linked graveyards.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(461,'Zone #%u doesn\'t have linked graveyards for faction: %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(462,'Teleport location already exists!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(463,'Teleport location added.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(464,'Teleport location NOT added: database error.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(465,'Teleport location deleted.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(467,'Target unit has %d auras:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(468,'id: %d eff: %d type: %d duration: %d maxduration: %d name: %s%s%s caster: %s %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(469,'Target unit has %d auras of type %d:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(470,'id: %d eff: %d name: %s%s%s caster: %s %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(471,'Quest %u not found.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(472,'Quest %u started from item. For correct work, please, add item to inventory and start quest in normal way: .additem %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(473,'Quest removed.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(474,' [rewarded]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(475,' [complete]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(476,' [active]',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(477,'%s\'s Fly Mode %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(478,'Opcode %u sent to %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(479,'Character loaded successfully!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(480,'Failed to load the character!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(481,'Character dumped successfully!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(482,'Character dump failed!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(483,'Spell %u broken and not allowed to cast or learn!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(484,'Skill %u (%s) for player %s set to %u and current maximum set to %u (without permanent (talent) bonuses).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(485,'Player %s must have skill %u (%s) before using this command.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(486,'Invalid skill id (%u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(487,'You learned default GM spells/skills.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(488,'You already know that spell.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(489,'Target(%s) already know that spell.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(490,'%s doesn\'t know that spell.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(491,'You already forgot that spell.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(492,'All spell cooldowns removed for %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(493,'Spell %u cooldown removed for %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(494,'Command : Additem, itemId = %i, amount = %i',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(495,'Command : Additemset, itemsetId = %i',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(496,'Removed itemID = %i, amount = %i from %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(497,'Cannot create item \'%i\' (amount: %i)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(498,'You need to provide a guild name!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(499,'Player not found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(500,'Player already has a guild!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(501,'Guild not created! (already exists?)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(502,'No items from itemset \'%u\' found.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(503,'The distance is: (3D) %f (2D) %f yards.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(504,'Item \'%i\' \'%s\' Item Slot %i',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(505,'Item \'%i\' doesn\'t exist.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(506,'Item \'%i\' \'%s\' Added to Slot %i',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(507,'Item save failed!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(508,'%d - owner: %s (guid: %u account: %u ) %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(509,'%d - sender: %s (guid: %u account: %u ) receiver: %s (guid: %u account: %u ) %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(510,'%d - owner: %s (guid: %u account: %u ) %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(511,'Wrong link type!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(512,'%d - |cffffffff|Hitem:%d:0:0:0:0:0:0:0|h[%s]|h|r ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(513,'%d - |cffffffff|Hquest:%d|h[%s]|h|r %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(514,'%d - |cffffffff|Hcreature_entry:%d|h[%s]|h|r ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(515,'%d - |cffffffff|Hcreature:%d|h[%s X:%f Y:%f Z:%f MapId:%d]|h|r ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(516,'%d - |cffffffff|Hgameobject_entry:%d|h[%s]|h|r ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(517,'%d - |cffffffff|Hgameobject:%d|h[%s X:%f Y:%f Z:%f MapId:%d]|h|r ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(518,'%d - |cffffffff|Hitemset:%d|h[%s %s]|h|r ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(519,'|cffffffff|Htele:%s|h[%s]|h|r ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(520,'%d - |cffffffff|Hspell:%d|h[%s]|h|r ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(521,'%d - |cffffffff|Hskill:%d|h[%s %s]|h|r %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(522,'Game Object (GUID: %u) not found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(523,'>> Game Object %s (GUID: %u) at %f %f %f. Orientation %f.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(524,'Selected object:\n|cffffffff|Hitemset:%d|h[%s]|h|r\nGUID: %u ID: %u\nX: %f Y: %f Z: %f MapId: %u\nOrientation: %f',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(525,'>> Add Game Object \'%i\' (%s) (GUID: %i) added at \'%f %f %f\'.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(526,'%s (lowguid: %u) movement generators stack:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(527,' Idle',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(528,' Random',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(529,' Waypoint',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(530,' Animal random',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(531,' Confused',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(532,' Targeted to player %s (lowguid %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(533,' Targeted to creature %s (lowguid %u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(534,' Targeted to <NULL>',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(535,' Home movement to (X:%f Y:%f Z:%f)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(536,' Home movement used for player?!?',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(537,' Taxi flight',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(538,' Unknown movement generator (%u)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(539,'Player selected NPC\nGUID: %u.\nFaction: %u.\nnpcFlags: %u.\nEntry: %u.\nDisplayID: %u (Native: %u).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(540,'Level: %u.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(541,'Health (base): %u. (max): %u. (current): %u.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(542,'Field Flags: %u.\nDynamic Flags: %u.\nFaction Template: %u.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(543,'Loot: %u Pickpocket: %u Skinning: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(544,'Position: %f %f %f.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(545,'*** Is a vendor!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(546,'*** Is a trainer!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(547,'InstanceID: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(548,'Player%s %s (guid: %u) Account: %s (id: %u) GMLevel: %u Last IP: %s Last login: %s Latency: %ums',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(549,'Played time: %s Level: %u Money: %ug%us%uc',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(550,'Command .pinfo doesn\'t support \'rep\' option for offline players.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(551,'%s has explored all zones now.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(552,'%s has no more explored zones.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(553,'%s has explored all zones for you.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(554,'%s has hidden all zones from you.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(555,'Hover enabled',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(556,'Hover disabled',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(557,'You have been leveled up (%i)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(558,'You have been leveled down (%i)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(559,'Your level progress has been reset.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(560,'The area has been set as explored.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(561,'The area has been set as not explored.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(562,'GUID=%i \'s updateIndex: %i, value: %i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(563,'You change GUID=%i \'s UpdateIndex: %i value to %i.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(564,'The value index %u is too big to %u(count: %u).',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(565,'Set %u uint32 Value:[OPCODE]:%u [VALUE]:%u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(566,'You Set %u Field:%u to uint32 Value: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(567,'Set %u float Value:[OPCODE]:%u [VALUE]:%f',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(568,'You Set %u Field:%i to float Value: %f',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(569,'Get %u uint32 Value:[OPCODE]:%u [VALUE]:%u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(570,'The uint32 value of %u in %u is: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(571,'Get %u float Value:[OPCODE]:%u [VALUE]:%f',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(572,'The float of %u value in %u is: %f',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(573,'.Set32Bit:[OPCODE]:%u [VALUE]:%u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(574,'You set Bit of Field:%u to Value: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(575,'.Mod32Value:[OPCODE]:%u [VALUE]:%i',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(576,'You modified the value of Field:%u to Value: %u',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(577,'You are now invisible.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(578,'You are now visible.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(579,'Selected player or creature not have victim.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(580,'You learned all default spells for race/class and completed quests rewarded spells.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(581,'Found near gameobjects (distance %f): %u ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(582,'SpawnTime: Full:%s Remain:%s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(583,'%d - |cffffffff|Hgameevent:%d|h[%s]|h|r%s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(584,'No event found!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(585,'Event not exist!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(586,'Event %u: %s%s\nStart: %s End: %s Occurence: %s Length: %s\nNext state change: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(587,'Event %u already active!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(588,'Event %u not active!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(589,' Point movement to (X:%f Y:%f Z:%f)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(590,' Fear movement',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(591,' Distract movement',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(592,'You have learned all spells in craft: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(593,'Currently Banned Accounts:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(594,'| Account | BanDate | UnbanDate | Banned By | Ban Reason |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(595,'Currently Banned IPs:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(596,'| IP | BanDate | UnbanDate | Banned By | Ban Reason |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(597,'Current gamemasters:',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(598,'| Account | GM |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(599,'No gamemasters.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(600,'The Alliance wins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(601,'The Horde wins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(602,'The battle for Warsong Gulch begins in 1 minute.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(603,'The battle for Warsong Gulch begins in 30 seconds. Prepare yourselves!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(604,'Let the battle for Warsong Gulch begin!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(605,'$n captured the Horde flag!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(606,'$n captured the Alliance flag!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(607,'The Horde flag was dropped by $n!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(608,'The Alliance Flag was dropped by $n!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(609,'The Alliance Flag was returned to its base by $n!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(610,'The Horde flag was returned to its base by $n!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(611,'The Horde flag was picked up by $n!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(612,'The Alliance Flag was picked up by $n!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(613,'The flags are now placed at their bases.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(636,'The Battle for Eye of the Storm begins in 1 minute.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(637,'The Battle for Eye of the Storm begins in 30 seconds.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(638,'The Battle for Eye of the Storm has begun!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(650,'Alliance',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(651,'Horde',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(652,'stables',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(653,'blacksmith',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(654,'farm',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(655,'lumber mill',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(656,'mine',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(657,'The %s has taken the %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(658,'$n has defended the %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(659,'$n has assaulted the %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(660,'$n claims the %s! If left unchallenged, the %s will control it in 1 minute!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(661,'The Battle for Arathi Basin begins in 1 minute.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(662,'The Battle for Arathi Basin begins in 30 seconds. Prepare yourselves!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(663,'The Battle for Arathi Basin has begun!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(664,'The Alliance has gathered $1776W resources, and is near victory!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(665,'The Horde has gathered $1777W resources, and is near victory!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(666,'After your recent battle in %s our best attempts to award you a Mark of Honor failed. Enclosed you will find the Mark of Honor we were not able to deliver to you at the time. Thanks for fighting in %s!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(700,'You must be level %u to form an arena team',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(701,'One minute until the Arena battle begins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(702,'Thirty seconds until the Arena battle begins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(703,'Fifteen seconds until the Arena battle begins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(704,'The Arena battle has begun!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(705,'You must wait %s before speaking again.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(706,'This item(s) have problems with equipping/storing in inventory.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(707,'%s wishes to not be disturbed and cannot receive whisper messages: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(708,'%s is Away from Keyboard: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(709,'Do not Disturb',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(710,'Away from Keyboard',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(711,'Queue status for %s (Lvl: %u to %u)\nQueued alliances: %u (Need at least %u more)\nQueued hordes: %u (Need at least %u more)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(712,'|cffff0000[BG Queue Announcer]:|r %s -- [%u-%u] A: %u (Need: %u), H: %u (Needs %u)|r',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(713,'You must be level %u to join an arena team!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(714,'%s is not high enough level to join your team',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(715,'You don\'t meet Battleground level requirements',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(716,'Your arena team is full, %s cannot join it.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(801,'You do not have enough gold',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(802,'You do not have enough free slots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(803,'Your partner does not have enough free bag slots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(804,'You do not have permission to perform that function',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(805,'Unknown language',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(806,'You don\'t know that language',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(807,'Please provide character name',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(808,'Player %s not found or offline',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(809,'Account for character %s not found',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1000,'Exiting daemon...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1001,'Account deleted: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1002,'Account %s NOT deleted (probably sql file format was updated)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1003,'Account %s NOT deleted (unknown error)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1004,'Account created: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1005,'Account name can\'t be longer than 16 characters (client limit), account not created!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1006,'Account with this name already exist!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1007,'Account %s NOT created (probably sql file format was updated)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1008,'Account %s NOT created (unknown error)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1009,'Player %s (Guid: %u) Account %s (Id: %u) deleted.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1010,'| Account | Character | IP | GM | TBC |',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1011,'|<Error> | %20s |<Error> |<Er>|<Err>|',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1100,'Account %s (Id: %u) have up to %u expansion allowed now.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1101,'Message of the day changed to:\r\n%s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1102,'Message sent to %s: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1103,'%d - %s %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1104,'%d - %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1105,'%d - %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1106,'%d - %s %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1107,'%d - %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1108,'%d - %s %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1109,'%d - %s %s %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1110,'%d - %s X:%f Y:%f Z:%f MapId:%d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1111,'%d - %s X:%f Y:%f Z:%f MapId:%d',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1112,'Failed to open file: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1113,'Account %s (%u) have max amount allowed characters (client limit)',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1114,'Dump file have broken data!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1115,'Invalid character name!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1116,'Invalid character guid!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1117,'Character guid %u in use!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1118,'%d - guild: %s (guid: %u) %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1119,'You must use male or female as gender.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1120,'You change gender of %s to %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1121,'Your gender changed to %s by %s.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1122,'Your group is too large for this battleground. Please regroup to join.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1123,'Your group is too large for this arena. Please regroup to join.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1124,'Your group has members not in your arena team. Please regroup to join.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1125,'Your group does not have enough players to join this match.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1126,'The Gold Team wins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1127,'The Green Team wins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1128,'There aren\'t enough players in this battleground. It will end soon unless some more players join to balance the fight.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1129,'Your group has an offline member. Please remove him before joining.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1130,'Your group has players from the opposing faction. You can\'t join the battleground as a group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1131,'Your group has players from different battleground brakets. You can\'t join as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1132,'Someone in your party is already in this battleground queue. (S)he must leave it before joining as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1133,'Someone in your party is Deserter. You can\'t join as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1134,'Someone in your party is already in three battleground queues. You cannot join as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1135,'You cannot teleport to a battleground or arena map.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1136,'You cannot summon players to a battleground or arena map.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1137,'You must be in GM mode to teleport to a player in a battleground.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
+(1138,'You cannot teleport to a battleground from another battleground. Please leave the current battleground first.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
+/*!40000 ALTER TABLE `mangos_string` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `milling_loot_template`
+--
+
+DROP TABLE IF EXISTS `milling_loot_template`;
+CREATE TABLE `milling_loot_template` (
+ `entry` mediumint(8) unsigned NOT NULL default '0',
+ `item` mediumint(8) unsigned NOT NULL default '0',
+ `ChanceOrQuestChance` float NOT NULL default '100',
+ `groupid` tinyint(3) unsigned NOT NULL default '0',
+ `mincountOrRef` mediumint(9) NOT NULL default '1',
+ `maxcount` tinyint(3) unsigned NOT NULL default '1',
+ `lootcondition` tinyint(3) unsigned NOT NULL default '0',
+ `condition_value1` mediumint(8) unsigned NOT NULL default '0',
+ `condition_value2` mediumint(8) unsigned NOT NULL default '0',
+ PRIMARY KEY (`entry`,`item`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Loot System';
+
+--
+-- Dumping data for table `milling_loot_template`
+--
+
+LOCK TABLES `milling_loot_template` WRITE;
+/*!40000 ALTER TABLE `milling_loot_template` DISABLE KEYS */;
+/*!40000 ALTER TABLE `milling_loot_template` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
-- Table structure for table `npc_gossip`
--
@@ -2087,12 +3200,15 @@ UNLOCK TABLES;
DROP TABLE IF EXISTS `npc_option`;
CREATE TABLE `npc_option` (
- `id` tinyint(3) unsigned NOT NULL default '0',
- `gossip_id` tinyint(3) unsigned NOT NULL default '0',
+ `id` mediumint(8) unsigned NOT NULL default '0',
+ `gossip_id` mediumint(8) unsigned NOT NULL default '0',
`npcflag` int(10) unsigned NOT NULL default '0',
`icon` tinyint(3) unsigned NOT NULL default '0',
- `action` tinyint(3) unsigned NOT NULL default '0',
+ `action` mediumint(8) unsigned NOT NULL default '0',
+ `box_money` int(10) unsigned NOT NULL default '0',
+ `coded` tinyint(3) unsigned NOT NULL default '0',
`option_text` text,
+ `box_text` text,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
@@ -2216,7 +3332,7 @@ CREATE TABLE `npc_trainer` (
`reqskill` smallint(5) unsigned NOT NULL default '0',
`reqskillvalue` smallint(5) unsigned NOT NULL default '0',
`reqlevel` tinyint(3) unsigned NOT NULL default '0',
- PRIMARY KEY (`entry`,`spell`)
+ UNIQUE KEY `entry_spell` (`entry`,`spell`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
@@ -2261,7 +3377,7 @@ CREATE TABLE `page_text` (
`text` longtext NOT NULL,
`next_page` mediumint(8) unsigned NOT NULL default '0',
PRIMARY KEY (`entry`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Item System';
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Item System';
--
-- Dumping data for table `page_text`
@@ -2319,6 +3435,268 @@ CREATE TABLE `pet_name_generation` (
LOCK TABLES `pet_name_generation` WRITE;
/*!40000 ALTER TABLE `pet_name_generation` DISABLE KEYS */;
+INSERT INTO `pet_name_generation` (`word`,`entry`,`half`) VALUES
+('Aba',416,0),
+('Az',416,0),
+('Bel',416,0),
+('Biz',416,0),
+('Cho',416,0),
+('Dag',416,0),
+('Gak',416,0),
+('Gar',416,0),
+('Gel',416,0),
+('Gho',416,0),
+('Gob',416,0),
+('Gra',416,0),
+('Jak',416,0),
+('Jub',416,0),
+('Kar',416,0),
+('Kup',416,0),
+('Laz',416,0),
+('Nal',416,0),
+('Nok',416,0),
+('Pag',416,0),
+('Pig',416,0),
+('Pip',416,0),
+('Piz',416,0),
+('Quz',416,0),
+('Rui',416,0),
+('Rul',416,0),
+('Rup',416,0),
+('Tar',416,0),
+('Vol',416,0),
+('Yaz',416,0),
+('Zep',416,0),
+('Zig',416,0),
+('Zil',416,0),
+('Zor',416,0),
+('bis',416,1),
+('fip',416,1),
+('gup',416,1),
+('ham',416,1),
+('jub',416,1),
+('kin',416,1),
+('kol',416,1),
+('lop',416,1),
+('loz',416,1),
+('mat',416,1),
+('mir',416,1),
+('nam',416,1),
+('nar',416,1),
+('nik',416,1),
+('nip',416,1),
+('pad',416,1),
+('pep',416,1),
+('pit',416,1),
+('qua',416,1),
+('rai',416,1),
+('rin',416,1),
+('rot',416,1),
+('tai',416,1),
+('tal',416,1),
+('tik',416,1),
+('tip',416,1),
+('tog',416,1),
+('tuk',416,1),
+('uri',416,1),
+('yal',416,1),
+('yap',416,1),
+('Bhee',417,0),
+('Bruu',417,0),
+('Czaa',417,0),
+('Droo',417,0),
+('Flaa',417,0),
+('Fzuu',417,0),
+('Ghaa',417,0),
+('Gree',417,0),
+('Gzaa',417,0),
+('Haa',417,0),
+('Haad',417,0),
+('Haag',417,0),
+('Haap',417,0),
+('Jhaa',417,0),
+('Jhuu',417,0),
+('Khaa',417,0),
+('Khii',417,0),
+('Khuu',417,0),
+('Kree',417,0),
+('Luu',417,0),
+('Maa',417,0),
+('Nhee',417,0),
+('Phuu',417,0),
+('Pryy',417,0),
+('Rhuu',417,0),
+('Shaa',417,0),
+('Sloo',417,0),
+('Sruu',417,0),
+('Thoo',417,0),
+('Traa',417,0),
+('Wraa',417,0),
+('Zhaa',417,0),
+('dhon',417,1),
+('dhum',417,1),
+('dhun',417,1),
+('dom',417,1),
+('don',417,1),
+('drom',417,1),
+('dym',417,1),
+('fenn',417,1),
+('fum',417,1),
+('fun',417,1),
+('ghon',417,1),
+('ghun',417,1),
+('grom',417,1),
+('grym',417,1),
+('hom',417,1),
+('hon',417,1),
+('hun',417,1),
+('jhom',417,1),
+('kun',417,1),
+('lum',417,1),
+('mmon',417,1),
+('mon',417,1),
+('myn',417,1),
+('nam',417,1),
+('nem',417,1),
+('nhym',417,1),
+('nom',417,1),
+('num',417,1),
+('phom',417,1),
+('roon',417,1),
+('rym',417,1),
+('shon',417,1),
+('thun',417,1),
+('tom',417,1),
+('zhem',417,1),
+('zhum',417,1),
+('zun',417,1),
+('Bar',1860,0),
+('Bel',1860,0),
+('Char',1860,0),
+('Grak\'',1860,0),
+('Graz\'',1860,0),
+('Grim',1860,0),
+('Hath',1860,0),
+('Hel',1860,0),
+('Hok',1860,0),
+('Huk',1860,0),
+('Jhaz',1860,0),
+('Jhom',1860,0),
+('Juk\'',1860,0),
+('Kal\'',1860,0),
+('Klath',1860,0),
+('Kon',1860,0),
+('Krag',1860,0),
+('Krak',1860,0),
+('Mak',1860,0),
+('Mezz',1860,0),
+('Orm',1860,0),
+('Phan',1860,0),
+('Sar',1860,0),
+('Tang',1860,0),
+('Than',1860,0),
+('Thog',1860,0),
+('Thok',1860,0),
+('Thul',1860,0),
+('Zag\'',1860,0),
+('Zang',1860,0),
+('Zhar\'',1860,0),
+('kath',1860,1),
+('doc',1860,1),
+('dok',1860,1),
+('gak',1860,1),
+('garth',1860,1),
+('gore',1860,1),
+('gorg',1860,1),
+('grave',1860,1),
+('gron',1860,1),
+('juk',1860,1),
+('krast',1860,1),
+('kresh',1860,1),
+('krit',1860,1),
+('los',1860,1),
+('mon',1860,1),
+('mos',1860,1),
+('moth',1860,1),
+('nagma',1860,1),
+('nak',1860,1),
+('nar',1860,1),
+('nos',1860,1),
+('nuz',1860,1),
+('phog',1860,1),
+('rath',1860,1),
+('tast',1860,1),
+('taz',1860,1),
+('thak',1860,1),
+('thang',1860,1),
+('thyk',1860,1),
+('vhug',1860,1),
+('zazt',1860,1),
+('Ael',1863,0),
+('Aez',1863,0),
+('Ang',1863,0),
+('Ban',1863,0),
+('Bet',1863,0),
+('Bro',1863,0),
+('Bry',1863,0),
+('Cat',1863,0),
+('Dir',1863,0),
+('Dis',1863,0),
+('Dom',1863,0),
+('Drus',1863,0),
+('Fie',1863,0),
+('Fier',1863,0),
+('Gly',1863,0),
+('Hel',1863,0),
+('Hes',1863,0),
+('Kal',1863,0),
+('Lyn',1863,0),
+('Mir',1863,0),
+('Nim',1863,0),
+('Sar',1863,0),
+('Sel',1863,0),
+('Vil',1863,0),
+('Zah',1863,0),
+('aith',1863,1),
+('anda',1863,1),
+('antia',1863,1),
+('evere',1863,1),
+('lia',1863,1),
+('lissa',1863,1),
+('neri',1863,1),
+('neth',1863,1),
+('nia',1863,1),
+('nlissa',1863,1),
+('nora',1863,1),
+('nva',1863,1),
+('nys',1863,1),
+('ola',1863,1),
+('ona',1863,1),
+('ora',1863,1),
+('rah',1863,1),
+('riana',1863,1),
+('riel',1863,1),
+('rona',1863,1),
+('tai',1863,1),
+('tevere',1863,1),
+('thea',1863,1),
+('vina',1863,1),
+('wena',1863,1),
+('wyn',1863,1),
+('xia',1863,1),
+('yla',1863,1),
+('yssa',1863,1),
+('Flaa',17252,0),
+('Haa',17252,0),
+('Jhuu',17252,0),
+('Shaa',17252,0),
+('Thoo',17252,0),
+('dhun',17252,1),
+('ghun',17252,1),
+('roon',17252,1),
+('thun',17252,1),
+('tom',17252,1);
+
/*!40000 ALTER TABLE `pet_name_generation` ENABLE KEYS */;
UNLOCK TABLES;
@@ -2391,6 +3769,807 @@ CREATE TABLE `player_classlevelstats` (
LOCK TABLES `player_classlevelstats` WRITE;
/*!40000 ALTER TABLE `player_classlevelstats` DISABLE KEYS */;
+INSERT INTO `player_classlevelstats` VALUES
+(1,1,20,0),
+(1,2,29,0),
+(1,3,38,0),
+(1,4,47,0),
+(1,5,56,0),
+(1,6,65,0),
+(1,7,74,0),
+(1,8,83,0),
+(1,9,92,0),
+(1,10,101,0),
+(1,11,100,0),
+(1,12,109,0),
+(1,13,118,0),
+(1,14,128,0),
+(1,15,139,0),
+(1,16,151,0),
+(1,17,154,0),
+(1,18,168,0),
+(1,19,183,0),
+(1,20,199,0),
+(1,21,206,0),
+(1,22,224,0),
+(1,23,243,0),
+(1,24,253,0),
+(1,25,274,0),
+(1,26,296,0),
+(1,27,309,0),
+(1,28,333,0),
+(1,29,348,0),
+(1,30,374,0),
+(1,31,401,0),
+(1,32,419,0),
+(1,33,448,0),
+(1,34,468,0),
+(1,35,499,0),
+(1,36,521,0),
+(1,37,545,0),
+(1,38,581,0),
+(1,39,609,0),
+(1,40,649,0),
+(1,41,681,0),
+(1,42,715,0),
+(1,43,761,0),
+(1,44,799,0),
+(1,45,839,0),
+(1,46,881,0),
+(1,47,935,0),
+(1,48,981,0),
+(1,49,1029,0),
+(1,50,1079,0),
+(1,51,1131,0),
+(1,52,1185,0),
+(1,53,1241,0),
+(1,54,1299,0),
+(1,55,1359,0),
+(1,56,1421,0),
+(1,57,1485,0),
+(1,58,1551,0),
+(1,59,1619,0),
+(1,60,1689,0),
+(1,61,1902,0),
+(1,62,2129,0),
+(1,63,2357,0),
+(1,64,2612,0),
+(1,65,2883,0),
+(1,66,3169,0),
+(1,67,3455,0),
+(1,68,3774,0),
+(1,69,4109,0),
+(1,70,4444,0),
+(1,71,4720,0),
+(1,72,5013,0),
+(1,73,5325,0),
+(1,74,5656,0),
+(1,75,6008,0),
+(1,76,6381,0),
+(1,77,6778,0),
+(1,78,7198,0),
+(1,79,7646,0),
+(1,80,8121,0),
+(2,1,28,60),
+(2,2,36,78),
+(2,3,44,98),
+(2,4,52,104),
+(2,5,60,111),
+(2,6,68,134),
+(2,7,76,143),
+(2,8,84,153),
+(2,9,92,179),
+(2,10,100,192),
+(2,11,108,205),
+(2,12,116,219),
+(2,13,124,249),
+(2,14,132,265),
+(2,15,131,282),
+(2,16,141,315),
+(2,17,152,334),
+(2,18,164,354),
+(2,19,177,390),
+(2,20,191,412),
+(2,21,206,435),
+(2,22,222,459),
+(2,23,239,499),
+(2,24,247,525),
+(2,25,266,552),
+(2,26,286,579),
+(2,27,307,621),
+(2,28,329,648),
+(2,29,342,675),
+(2,30,366,702),
+(2,31,391,729),
+(2,32,407,756),
+(2,33,434,798),
+(2,34,462,825),
+(2,35,481,852),
+(2,36,511,879),
+(2,37,542,906),
+(2,38,564,933),
+(2,39,597,960),
+(2,40,621,987),
+(2,41,656,1014),
+(2,42,682,1041),
+(2,43,719,1068),
+(2,44,747,1110),
+(2,45,786,1137),
+(2,46,816,1164),
+(2,47,857,1176),
+(2,48,889,1203),
+(2,49,922,1230),
+(2,50,966,1257),
+(2,51,1001,1284),
+(2,52,1037,1311),
+(2,53,1084,1338),
+(2,54,1122,1365),
+(2,55,1161,1392),
+(2,56,1201,1419),
+(2,57,1252,1446),
+(2,58,1294,1458),
+(2,59,1337,1485),
+(2,60,1381,1512),
+(2,61,1540,1656),
+(2,62,1708,1800),
+(2,63,1884,1944),
+(2,64,2068,2088),
+(2,65,2262,2232),
+(2,66,2466,2377),
+(2,67,2679,2521),
+(2,68,2901,2665),
+(2,69,3134,2809),
+(2,70,3377,2953),
+(2,71,3629,3097),
+(2,72,3900,3241),
+(2,73,4191,3385),
+(2,74,4503,3529),
+(2,75,4839,3673),
+(2,76,5200,3817),
+(2,77,5588,3962),
+(2,78,6005,4106),
+(2,79,6453,4250),
+(2,80,6934,4394),
+(3,1,46,65),
+(3,2,53,70),
+(3,3,60,76),
+(3,4,67,98),
+(3,5,74,106),
+(3,6,81,130),
+(3,7,88,140),
+(3,8,95,166),
+(3,9,102,193),
+(3,10,109,206),
+(3,11,116,235),
+(3,12,123,250),
+(3,13,130,266),
+(3,14,138,298),
+(3,15,147,316),
+(3,16,157,350),
+(3,17,168,370),
+(3,18,180,391),
+(3,19,193,428),
+(3,20,207,451),
+(3,21,222,475),
+(3,22,238,515),
+(3,23,255,541),
+(3,24,273,568),
+(3,25,292,611),
+(3,26,312,640),
+(3,27,333,670),
+(3,28,355,715),
+(3,29,378,745),
+(3,30,402,775),
+(3,31,417,805),
+(3,32,443,850),
+(3,33,470,880),
+(3,34,498,910),
+(3,35,527,940),
+(3,36,547,970),
+(3,37,578,1015),
+(3,38,610,1045),
+(3,39,643,1075),
+(3,40,667,1105),
+(3,41,702,1135),
+(3,42,738,1180),
+(3,43,775,1210),
+(3,44,803,1240),
+(3,45,842,1270),
+(3,46,872,1300),
+(3,47,913,1330),
+(3,48,955,1360),
+(3,49,994,1390),
+(3,50,1047,1420),
+(3,51,1067,1450),
+(3,52,1113,1480),
+(3,53,1150,1510),
+(3,54,1198,1540),
+(3,55,1237,1570),
+(3,56,1287,1600),
+(3,57,1328,1630),
+(3,58,1370,1660),
+(3,59,1423,1690),
+(3,60,1467,1720),
+(3,61,1633,1886),
+(3,62,1819,2053),
+(3,63,2003,2219),
+(3,64,2195,2385),
+(3,65,2397,2552),
+(3,66,2623,2718),
+(3,67,2844,2884),
+(3,68,3075,3050),
+(3,69,3316,3217),
+(3,70,3568,3383),
+(3,71,3834,3549),
+(3,72,4120,3716),
+(3,73,4427,3882),
+(3,74,4757,4048),
+(3,75,5112,4215),
+(3,76,5493,4381),
+(3,77,5903,4547),
+(3,78,6343,4713),
+(3,79,6816,4880),
+(3,80,7324,5046),
+(4,1,25,0),
+(4,2,32,0),
+(4,3,49,0),
+(4,4,56,0),
+(4,5,63,0),
+(4,6,70,0),
+(4,7,87,0),
+(4,8,94,0),
+(4,9,101,0),
+(4,10,118,0),
+(4,11,125,0),
+(4,12,142,0),
+(4,13,149,0),
+(4,14,156,0),
+(4,15,173,0),
+(4,16,181,0),
+(4,17,190,0),
+(4,18,200,0),
+(4,19,221,0),
+(4,20,233,0),
+(4,21,246,0),
+(4,22,260,0),
+(4,23,275,0),
+(4,24,301,0),
+(4,25,318,0),
+(4,26,336,0),
+(4,27,355,0),
+(4,28,375,0),
+(4,29,396,0),
+(4,30,428,0),
+(4,31,451,0),
+(4,32,475,0),
+(4,33,500,0),
+(4,34,526,0),
+(4,35,553,0),
+(4,36,581,0),
+(4,37,610,0),
+(4,38,640,0),
+(4,39,671,0),
+(4,40,703,0),
+(4,41,736,0),
+(4,42,770,0),
+(4,43,805,0),
+(4,44,841,0),
+(4,45,878,0),
+(4,46,916,0),
+(4,47,955,0),
+(4,48,995,0),
+(4,49,1026,0),
+(4,50,1068,0),
+(4,51,1111,0),
+(4,52,1155,0),
+(4,53,1200,0),
+(4,54,1246,0),
+(4,55,1283,0),
+(4,56,1331,0),
+(4,57,1380,0),
+(4,58,1430,0),
+(4,59,1471,0),
+(4,60,1523,0),
+(4,61,1702,0),
+(4,62,1879,0),
+(4,63,2077,0),
+(4,64,2285,0),
+(4,65,2489,0),
+(4,66,2717,0),
+(4,67,2941,0),
+(4,68,3190,0),
+(4,69,3450,0),
+(4,70,3704,0),
+(4,71,3980,0),
+(4,72,4277,0),
+(4,73,4596,0),
+(4,74,4939,0),
+(4,75,5307,0),
+(4,76,5703,0),
+(4,77,6128,0),
+(4,78,6585,0),
+(4,79,7076,0),
+(4,80,7604,0),
+(5,1,52,73),
+(5,2,57,76),
+(5,3,72,95),
+(5,4,77,114),
+(5,5,92,133),
+(5,6,97,152),
+(5,7,112,171),
+(5,8,117,190),
+(5,9,132,209),
+(5,10,137,212),
+(5,11,142,215),
+(5,12,157,234),
+(5,13,172,254),
+(5,14,177,260),
+(5,15,192,282),
+(5,16,197,305),
+(5,17,212,329),
+(5,18,227,339),
+(5,19,232,365),
+(5,20,247,377),
+(5,21,252,405),
+(5,22,268,434),
+(5,23,275,449),
+(5,24,293,480),
+(5,25,302,497),
+(5,26,322,530),
+(5,27,343,549),
+(5,28,355,584),
+(5,29,378,605),
+(5,30,392,627),
+(5,31,417,665),
+(5,32,433,689),
+(5,33,460,728),
+(5,34,478,752),
+(5,35,507,776),
+(5,36,527,800),
+(5,37,548,839),
+(5,38,580,863),
+(5,39,603,887),
+(5,40,637,911),
+(5,41,662,950),
+(5,42,698,974),
+(5,43,725,998),
+(5,44,763,1022),
+(5,45,792,1046),
+(5,46,822,1070),
+(5,47,863,1094),
+(5,48,895,1118),
+(5,49,928,1142),
+(5,50,972,1166),
+(5,51,1007,1190),
+(5,52,1053,1214),
+(5,53,1090,1238),
+(5,54,1128,1262),
+(5,55,1177,1271),
+(5,56,1217,1295),
+(5,57,1258,1319),
+(5,58,1300,1343),
+(5,59,1353,1352),
+(5,60,1397,1376),
+(5,61,1557,1500),
+(5,62,1738,1625),
+(5,63,1916,1749),
+(5,64,2101,1873),
+(5,65,2295,1998),
+(5,66,2495,2122),
+(5,67,2719,2247),
+(5,68,2936,2371),
+(5,69,3160,2495),
+(5,70,3391,2620),
+(5,71,3644,2744),
+(5,72,3916,2868),
+(5,73,4208,2993),
+(5,74,4522,3117),
+(5,75,4859,3242),
+(5,76,5221,3366),
+(5,77,5610,3490),
+(5,78,6028,3615),
+(5,79,6477,3739),
+(5,80,6960,3863),
+(6,1,22,0),
+(6,2,27,0),
+(6,3,32,0),
+(6,4,37,0),
+(6,5,42,0),
+(6,6,47,0),
+(6,7,52,0),
+(6,8,58,0),
+(6,9,64,0),
+(6,10,70,0),
+(6,11,77,0),
+(6,12,84,0),
+(6,13,92,0),
+(6,14,100,0),
+(6,15,117,0),
+(6,16,127,0),
+(6,17,138,0),
+(6,18,150,0),
+(6,19,163,0),
+(6,20,177,0),
+(6,21,192,0),
+(6,22,208,0),
+(6,23,225,0),
+(6,24,239,0),
+(6,25,258,0),
+(6,26,278,0),
+(6,27,299,0),
+(6,28,321,0),
+(6,29,344,0),
+(6,30,368,0),
+(6,31,393,0),
+(6,32,419,0),
+(6,33,446,0),
+(6,34,474,0),
+(6,35,503,0),
+(6,36,533,0),
+(6,37,564,0),
+(6,38,596,0),
+(6,39,629,0),
+(6,40,698,0),
+(6,41,698,0),
+(6,42,734,0),
+(6,43,771,0),
+(6,44,809,0),
+(6,45,849,0),
+(6,46,891,0),
+(6,47,935,0),
+(6,48,981,0),
+(6,49,1029,0),
+(6,50,1079,0),
+(6,51,1131,0),
+(6,52,1185,0),
+(6,53,1241,0),
+(6,54,1299,0),
+(6,55,1359,0),
+(6,56,1421,0),
+(6,57,1485,0),
+(6,58,1551,0),
+(6,59,1619,0),
+(6,60,1689,0),
+(6,61,1902,0),
+(6,62,2129,0),
+(6,63,2357,0),
+(6,64,2612,0),
+(6,65,2883,0),
+(6,66,3169,0),
+(6,67,3455,0),
+(6,68,3774,0),
+(6,69,4109,0),
+(6,70,4444,0),
+(6,71,4720,0),
+(6,72,5013,0),
+(6,73,5325,0),
+(6,74,5656,0),
+(6,75,6008,0),
+(6,76,6381,0),
+(6,77,6778,0),
+(6,78,7199,0),
+(6,79,7646,0),
+(6,80,8121,0),
+(7,1,37,85),
+(7,2,44,91),
+(7,3,51,98),
+(7,4,58,106),
+(7,5,65,115),
+(7,6,72,125),
+(7,7,79,136),
+(7,8,86,148),
+(7,9,93,161),
+(7,10,100,175),
+(7,11,107,190),
+(7,12,114,206),
+(7,13,121,223),
+(7,14,128,241),
+(7,15,135,260),
+(7,16,142,280),
+(7,17,150,301),
+(7,18,159,323),
+(7,19,169,346),
+(7,20,180,370),
+(7,21,192,395),
+(7,22,205,421),
+(7,23,219,448),
+(7,24,234,476),
+(7,25,240,505),
+(7,26,257,535),
+(7,27,275,566),
+(7,28,294,598),
+(7,29,314,631),
+(7,30,335,665),
+(7,31,347,699),
+(7,32,370,733),
+(7,33,394,767),
+(7,34,419,786),
+(7,35,435,820),
+(7,36,462,854),
+(7,37,490,888),
+(7,38,509,922),
+(7,39,539,941),
+(7,40,570,975),
+(7,41,592,1009),
+(7,42,625,1028),
+(7,43,649,1062),
+(7,44,684,1096),
+(7,45,710,1115),
+(7,46,747,1149),
+(7,47,775,1183),
+(7,48,814,1202),
+(7,49,844,1236),
+(7,50,885,1255),
+(7,51,917,1289),
+(7,52,960,1323),
+(7,53,994,1342),
+(7,54,1029,1376),
+(7,55,1075,1395),
+(7,56,1112,1414),
+(7,57,1150,1448),
+(7,58,1199,1467),
+(7,59,1239,1501),
+(7,60,1330,1520),
+(7,61,1428,1664),
+(7,62,1583,1808),
+(7,63,1760,1951),
+(7,64,1932,2095),
+(7,65,2114,2239),
+(7,66,2304,2383),
+(7,67,2504,2527),
+(7,68,2713,2670),
+(7,69,2931,2814),
+(7,70,3159,2958),
+(7,71,3395,3102),
+(7,72,3648,3246),
+(7,73,3920,3389),
+(7,74,4212,3533),
+(7,75,4526,3677),
+(7,76,4863,3821),
+(7,77,5226,3965),
+(7,78,5616,4108),
+(7,79,6035,4252),
+(7,80,6485,4396),
+(8,1,32,100),
+(8,2,47,110),
+(8,3,52,106),
+(8,4,67,118),
+(8,5,82,131),
+(8,6,97,130),
+(8,7,102,145),
+(8,8,117,146),
+(8,9,132,163),
+(8,10,137,196),
+(8,11,152,215),
+(8,12,167,220),
+(8,13,172,241),
+(8,14,187,263),
+(8,15,202,271),
+(8,16,207,295),
+(8,17,222,305),
+(8,18,237,331),
+(8,19,242,343),
+(8,20,257,371),
+(8,21,272,385),
+(8,22,277,415),
+(8,23,292,431),
+(8,24,298,463),
+(8,25,315,481),
+(8,26,333,515),
+(8,27,342,535),
+(8,28,362,556),
+(8,29,373,592),
+(8,30,395,613),
+(8,31,418,634),
+(8,32,432,670),
+(8,33,457,691),
+(8,34,473,712),
+(8,35,500,733),
+(8,36,518,754),
+(8,37,547,790),
+(8,38,577,811),
+(8,39,598,832),
+(8,40,630,853),
+(8,41,653,874),
+(8,42,687,895),
+(8,43,712,916),
+(8,44,748,937),
+(8,45,775,958),
+(8,46,813,979),
+(8,47,842,1000),
+(8,48,882,1021),
+(8,49,913,1042),
+(8,50,955,1048),
+(8,51,988,1069),
+(8,52,1032,1090),
+(8,53,1067,1111),
+(8,54,1103,1117),
+(8,55,1150,1138),
+(8,56,1188,1159),
+(8,57,1237,1165),
+(8,58,1277,1186),
+(8,59,1328,1192),
+(8,60,1370,1213),
+(8,61,1526,1316),
+(8,62,1702,1419),
+(8,63,1875,1521),
+(8,64,2070,1624),
+(8,65,2261,1727),
+(8,66,2461,1830),
+(8,67,2686,1932),
+(8,68,2906,2035),
+(8,69,3136,2138),
+(8,70,3393,2241),
+(8,71,3646,2343),
+(8,72,3918,2446),
+(8,73,4210,2549),
+(8,74,4524,2652),
+(8,75,4861,2754),
+(8,76,5223,2857),
+(8,77,5612,2960),
+(8,78,6030,3063),
+(8,79,6480,3165),
+(8,80,6963,3268),
+(9,1,23,90),
+(9,2,28,98),
+(9,3,43,107),
+(9,4,48,102),
+(9,5,63,113),
+(9,6,68,126),
+(9,7,83,144),
+(9,8,88,162),
+(9,9,93,180),
+(9,10,108,198),
+(9,11,123,200),
+(9,12,128,218),
+(9,13,143,237),
+(9,14,148,257),
+(9,15,153,278),
+(9,16,168,300),
+(9,17,173,308),
+(9,18,189,332),
+(9,19,196,357),
+(9,20,204,383),
+(9,21,223,395),
+(9,22,233,423),
+(9,23,244,452),
+(9,24,266,467),
+(9,25,279,498),
+(9,26,293,530),
+(9,27,318,548),
+(9,28,334,582),
+(9,29,351,602),
+(9,30,379,638),
+(9,31,398,674),
+(9,32,418,695),
+(9,33,439,731),
+(9,34,471,752),
+(9,35,494,788),
+(9,36,518,809),
+(9,37,543,830),
+(9,38,569,866),
+(9,39,606,887),
+(9,40,634,923),
+(9,41,663,944),
+(9,42,693,965),
+(9,43,724,1001),
+(9,44,756,1022),
+(9,45,799,1043),
+(9,46,832,1064),
+(9,47,868,1100),
+(9,48,904,1121),
+(9,49,941,1142),
+(9,50,979,1163),
+(9,51,1018,1184),
+(9,52,1058,1205),
+(9,53,1099,1226),
+(9,54,1141,1247),
+(9,55,1184,1268),
+(9,56,1228,1289),
+(9,57,1273,1310),
+(9,58,1319,1331),
+(9,59,1366,1352),
+(9,60,1414,1373),
+(9,61,1580,1497),
+(9,62,1755,1621),
+(9,63,1939,1745),
+(9,64,2133,1870),
+(9,65,2323,1994),
+(9,66,2535,2118),
+(9,67,2758,2242),
+(9,68,2991,2366),
+(9,69,3235,2490),
+(9,70,3490,2615),
+(9,71,3750,2739),
+(9,72,4025,2863),
+(9,73,4330,2987),
+(9,74,4646,3111),
+(9,75,4997,3235),
+(9,76,5373,3360),
+(9,77,5774,3483),
+(9,78,6207,3608),
+(9,79,6667,3732),
+(9,80,7136,3856),
+(11,1,44,60),
+(11,2,51,66),
+(11,3,58,73),
+(11,4,75,81),
+(11,5,82,90),
+(11,6,89,100),
+(11,7,106,111),
+(11,8,113,123),
+(11,9,120,136),
+(11,10,137,150),
+(11,11,144,165),
+(11,12,151,182),
+(11,13,168,200),
+(11,14,175,219),
+(11,15,182,239),
+(11,16,199,260),
+(11,17,206,282),
+(11,18,214,305),
+(11,19,233,329),
+(11,20,243,354),
+(11,21,254,380),
+(11,22,266,392),
+(11,23,289,420),
+(11,24,303,449),
+(11,25,318,479),
+(11,26,334,509),
+(11,27,361,524),
+(11,28,379,554),
+(11,29,398,584),
+(11,30,418,614),
+(11,31,439,629),
+(11,32,461,659),
+(11,33,494,689),
+(11,34,518,704),
+(11,35,543,734),
+(11,36,569,749),
+(11,37,596,779),
+(11,38,624,809),
+(11,39,653,824),
+(11,40,683,854),
+(11,41,714,869),
+(11,42,746,899),
+(11,43,779,914),
+(11,44,823,944),
+(11,45,858,959),
+(11,46,894,989),
+(11,47,921,1004),
+(11,48,959,1019),
+(11,49,998,1049),
+(11,50,1038,1064),
+(11,51,1079,1079),
+(11,52,1121,1109),
+(11,53,1164,1124),
+(11,54,1208,1139),
+(11,55,1253,1154),
+(11,56,1299,1169),
+(11,57,1346,1199),
+(11,58,1384,1214),
+(11,59,1433,1229),
+(11,60,1483,1244),
+(11,61,1657,1357),
+(11,62,1840,1469),
+(11,63,2020,1582),
+(11,64,2222,1694),
+(11,65,2433,1807),
+(11,66,2640,1919),
+(11,67,2872,2032),
+(11,68,3114,2145),
+(11,69,3351,2257),
+(11,70,3614,2370),
+(11,71,3883,2482),
+(11,72,4172,2595),
+(11,73,4483,2708),
+(11,74,4817,2820),
+(11,75,5176,2933),
+(11,76,5562,3045),
+(11,77,5977,3158),
+(11,78,6423,3270),
+(11,79,6902,3383),
+(11,80,7417,3496);
/*!40000 ALTER TABLE `player_classlevelstats` ENABLE KEYS */;
UNLOCK TABLES;
@@ -2417,6 +4596,4967 @@ CREATE TABLE `player_levelstats` (
LOCK TABLES `player_levelstats` WRITE;
/*!40000 ALTER TABLE `player_levelstats` DISABLE KEYS */;
+INSERT INTO `player_levelstats` VALUES
+(1,1,1,23,20,22,20,20),
+(1,1,2,24,21,23,20,20),
+(1,1,3,26,22,24,20,21),
+(1,1,4,27,22,26,20,21),
+(1,1,5,28,23,27,20,21),
+(1,1,6,30,24,28,20,21),
+(1,1,7,31,25,29,21,22),
+(1,1,8,32,26,30,21,22),
+(1,1,9,34,26,32,21,22),
+(1,1,10,35,27,33,21,23),
+(1,1,11,36,28,34,21,23),
+(1,1,12,38,29,35,21,23),
+(1,1,13,39,30,37,21,24),
+(1,1,14,41,31,38,21,24),
+(1,1,15,42,32,39,21,24),
+(1,1,16,44,33,41,21,25),
+(1,1,17,45,34,42,22,25),
+(1,1,18,47,34,43,22,25),
+(1,1,19,48,35,45,22,26),
+(1,1,20,50,36,46,22,26),
+(1,1,21,51,37,48,22,26),
+(1,1,22,53,38,49,22,27),
+(1,1,23,54,39,51,22,27),
+(1,1,24,56,40,52,23,28),
+(1,1,25,58,41,53,23,28),
+(1,1,26,59,42,55,23,28),
+(1,1,27,61,43,56,23,29),
+(1,1,28,63,44,58,23,29),
+(1,1,29,64,45,59,23,30),
+(1,1,30,66,46,61,24,30),
+(1,1,31,68,47,62,24,30),
+(1,1,32,69,48,64,24,31),
+(1,1,33,71,50,66,24,31),
+(1,1,34,73,51,67,24,32),
+(1,1,35,74,52,69,24,32),
+(1,1,36,76,53,70,25,33),
+(1,1,37,78,54,72,25,33),
+(1,1,38,80,55,74,25,34),
+(1,1,39,82,56,75,25,34),
+(1,1,40,83,57,77,25,35),
+(1,1,41,85,58,79,26,35),
+(1,1,42,87,60,80,26,35),
+(1,1,43,89,61,82,26,36),
+(1,1,44,91,62,84,26,36),
+(1,1,45,93,63,85,26,37),
+(1,1,46,95,64,87,27,37),
+(1,1,47,97,66,89,27,38),
+(1,1,48,99,67,91,27,38),
+(1,1,49,101,68,93,27,39),
+(1,1,50,103,69,94,28,40),
+(1,1,51,105,71,96,28,40),
+(1,1,52,107,72,98,28,41),
+(1,1,53,109,73,100,28,41),
+(1,1,54,111,74,102,29,42),
+(1,1,55,113,76,103,29,42),
+(1,1,56,115,77,105,29,43),
+(1,1,57,117,78,107,29,43),
+(1,1,58,119,79,109,30,44),
+(1,1,59,121,81,111,30,44),
+(1,1,60,123,82,113,30,45),
+(1,1,61,125,83,115,30,46),
+(1,1,62,127,85,117,31,46),
+(1,1,63,129,86,119,31,47),
+(1,1,64,132,88,121,31,47),
+(1,1,65,134,89,123,32,48),
+(1,1,66,136,90,125,32,49),
+(1,1,67,138,92,127,32,49),
+(1,1,68,140,93,129,32,50),
+(1,1,69,143,95,131,33,50),
+(1,1,70,145,96,133,33,51),
+(1,1,71,148,97,140,33,53),
+(1,1,72,156,99,143,33,54),
+(1,1,73,162,101,148,33,55),
+(1,1,74,162,102,148,34,55),
+(1,1,75,165,104,150,34,56),
+(1,1,76,171,106,156,34,57),
+(1,1,77,171,108,157,35,58),
+(1,1,78,174,109,159,35,58),
+(1,1,79,181,111,165,35,59),
+(1,1,80,184,113,168,36,60),
+(1,2,1,22,20,22,20,21),
+(1,2,2,23,21,23,21,22),
+(1,2,3,24,21,24,21,22),
+(1,2,4,25,22,25,22,23),
+(1,2,5,26,22,26,23,24),
+(1,2,6,28,23,27,23,25),
+(1,2,7,29,24,28,24,25),
+(1,2,8,30,24,29,25,26),
+(1,2,9,31,25,30,25,27),
+(1,2,10,32,25,32,26,27),
+(1,2,11,33,26,33,27,28),
+(1,2,12,35,27,34,27,29),
+(1,2,13,36,27,35,28,30),
+(1,2,14,37,28,36,29,31),
+(1,2,15,38,29,37,30,31),
+(1,2,16,40,29,38,30,32),
+(1,2,17,41,30,40,31,33),
+(1,2,18,42,31,41,32,34),
+(1,2,19,43,31,42,33,35),
+(1,2,20,45,32,43,33,35),
+(1,2,21,46,33,45,34,36),
+(1,2,22,47,33,46,35,37),
+(1,2,23,49,34,47,36,38),
+(1,2,24,50,35,48,37,39),
+(1,2,25,51,36,50,37,40),
+(1,2,26,53,36,51,38,41),
+(1,2,27,54,37,52,39,42),
+(1,2,28,56,38,54,40,43),
+(1,2,29,57,39,55,41,43),
+(1,2,30,58,39,56,42,44),
+(1,2,31,60,40,58,43,45),
+(1,2,32,61,41,59,43,46),
+(1,2,33,63,42,60,44,47),
+(1,2,34,64,43,62,45,48),
+(1,2,35,66,44,63,46,49),
+(1,2,36,67,44,65,47,50),
+(1,2,37,69,45,66,48,51),
+(1,2,38,70,46,67,49,52),
+(1,2,39,72,47,69,50,53),
+(1,2,40,73,48,70,51,54),
+(1,2,41,75,49,72,52,55),
+(1,2,42,77,49,73,53,56),
+(1,2,43,78,50,75,54,57),
+(1,2,44,80,51,76,55,58),
+(1,2,45,81,52,78,56,59),
+(1,2,46,83,53,79,57,61),
+(1,2,47,85,54,81,58,62),
+(1,2,48,86,55,83,59,63),
+(1,2,49,88,56,84,60,64),
+(1,2,50,90,57,86,61,65),
+(1,2,51,91,58,87,62,66),
+(1,2,52,93,59,89,63,67),
+(1,2,53,95,60,91,64,68),
+(1,2,54,97,61,92,65,69),
+(1,2,55,98,61,94,66,71),
+(1,2,56,100,62,95,67,72),
+(1,2,57,102,63,97,68,73),
+(1,2,58,104,64,99,69,74),
+(1,2,59,105,65,101,70,75),
+(1,2,60,107,66,102,71,77),
+(1,2,61,109,67,104,73,78),
+(1,2,62,111,69,106,74,79),
+(1,2,63,113,70,107,75,80),
+(1,2,64,115,71,109,76,81),
+(1,2,65,116,72,111,77,83),
+(1,2,66,118,73,113,78,84),
+(1,2,67,120,74,115,79,85),
+(1,2,68,122,75,116,81,86),
+(1,2,69,124,76,118,82,88),
+(1,2,70,126,77,120,83,89),
+(1,2,71,148,78,122,84,92),
+(1,2,72,150,79,125,86,94),
+(1,2,73,152,80,127,87,96),
+(1,2,74,156,82,129,89,97),
+(1,2,75,158,83,131,90,99),
+(1,2,76,162,84,134,92,100),
+(1,2,77,164,86,136,93,103),
+(1,2,78,167,87,138,95,105),
+(1,2,79,170,88,153,96,106),
+(1,2,80,173,90,160,98,108),
+(1,4,1,21,23,21,20,20),
+(1,4,2,22,24,22,20,20),
+(1,4,3,23,26,22,20,21),
+(1,4,4,23,27,23,20,21),
+(1,4,5,24,29,24,21,21),
+(1,4,6,25,30,25,21,22),
+(1,4,7,26,32,25,21,22),
+(1,4,8,26,33,26,21,23),
+(1,4,9,27,35,27,21,23),
+(1,4,10,28,36,27,21,23),
+(1,4,11,29,38,28,22,24),
+(1,4,12,30,39,29,22,24),
+(1,4,13,31,41,30,22,25),
+(1,4,14,31,43,31,22,25),
+(1,4,15,32,44,31,22,25),
+(1,4,16,33,46,32,23,26),
+(1,4,17,34,48,33,23,26),
+(1,4,18,35,49,34,23,27),
+(1,4,19,36,51,35,23,27),
+(1,4,20,37,53,35,23,28),
+(1,4,21,38,54,36,24,28),
+(1,4,22,39,56,37,24,29),
+(1,4,23,40,58,38,24,29),
+(1,4,24,41,60,39,24,30),
+(1,4,25,42,61,40,25,30),
+(1,4,26,43,63,41,25,31),
+(1,4,27,44,65,42,25,31),
+(1,4,28,45,67,43,25,32),
+(1,4,29,46,69,43,25,32),
+(1,4,30,47,71,44,26,33),
+(1,4,31,48,72,45,26,33),
+(1,4,32,49,74,46,26,34),
+(1,4,33,50,76,47,27,34),
+(1,4,34,51,78,48,27,35),
+(1,4,35,52,80,49,27,35),
+(1,4,36,53,82,50,27,36),
+(1,4,37,54,84,51,28,36),
+(1,4,38,55,86,52,28,37),
+(1,4,39,56,88,53,28,38),
+(1,4,40,57,90,54,28,38),
+(1,4,41,58,92,55,29,39),
+(1,4,42,60,94,56,29,39),
+(1,4,43,61,96,57,29,40),
+(1,4,44,62,98,58,30,40),
+(1,4,45,63,100,59,30,41),
+(1,4,46,64,103,61,30,42),
+(1,4,47,65,105,62,31,42),
+(1,4,48,66,107,63,31,43),
+(1,4,49,68,109,64,31,44),
+(1,4,50,69,111,65,32,44),
+(1,4,51,70,113,66,32,45),
+(1,4,52,71,116,67,32,45),
+(1,4,53,73,118,68,33,46),
+(1,4,54,74,120,69,33,47),
+(1,4,55,75,122,71,33,47),
+(1,4,56,76,125,72,34,48),
+(1,4,57,78,127,73,34,49),
+(1,4,58,79,129,74,34,49),
+(1,4,59,80,131,75,35,50),
+(1,4,60,81,134,77,35,51),
+(1,4,61,83,136,78,35,51),
+(1,4,62,84,138,79,36,52),
+(1,4,63,85,141,80,36,53),
+(1,4,64,87,143,81,37,54),
+(1,4,65,88,146,83,37,54),
+(1,4,66,89,148,84,37,55),
+(1,4,67,91,151,85,38,56),
+(1,4,68,92,153,86,38,57),
+(1,4,69,94,156,88,39,57),
+(1,4,70,95,158,89,39,58),
+(1,4,71,97,161,90,39,60),
+(1,4,72,99,164,92,40,60),
+(1,4,73,100,167,94,40,61),
+(1,4,74,102,170,95,41,62),
+(1,4,75,104,173,97,41,63),
+(1,4,76,105,176,98,41,64),
+(1,4,77,107,179,100,42,65),
+(1,4,78,109,183,106,42,66),
+(1,4,79,111,186,107,43,67),
+(1,4,80,113,189,109,43,69),
+(1,5,1,20,20,20,22,23),
+(1,5,2,20,20,20,23,24),
+(1,5,3,20,20,21,25,26),
+(1,5,4,20,21,21,26,27),
+(1,5,5,21,21,21,27,28),
+(1,5,6,21,21,22,29,30),
+(1,5,7,21,21,22,30,31),
+(1,5,8,21,22,23,31,33),
+(1,5,9,21,22,23,33,34),
+(1,5,10,21,22,23,34,36),
+(1,5,11,22,22,24,36,37),
+(1,5,12,22,23,24,37,39),
+(1,5,13,22,23,25,38,40),
+(1,5,14,22,23,25,40,42),
+(1,5,15,22,23,25,41,43),
+(1,5,16,23,24,26,43,45),
+(1,5,17,23,24,26,44,46),
+(1,5,18,23,24,27,46,48),
+(1,5,19,23,24,27,47,49),
+(1,5,20,23,25,28,49,51),
+(1,5,21,24,25,28,51,53),
+(1,5,22,24,25,29,52,54),
+(1,5,23,24,26,29,54,56),
+(1,5,24,24,26,30,55,58),
+(1,5,25,25,26,30,57,59),
+(1,5,26,25,27,31,59,61),
+(1,5,27,25,27,31,60,63),
+(1,5,28,25,27,32,62,65),
+(1,5,29,25,28,32,64,66),
+(1,5,30,26,28,33,65,68),
+(1,5,31,26,28,33,67,70),
+(1,5,32,26,29,34,69,72),
+(1,5,33,27,29,34,70,73),
+(1,5,34,27,29,35,72,75),
+(1,5,35,27,30,35,74,77),
+(1,5,36,27,30,36,76,79),
+(1,5,37,28,30,36,78,81),
+(1,5,38,28,31,37,79,83),
+(1,5,39,28,31,38,81,85),
+(1,5,40,28,31,38,83,87),
+(1,5,41,29,32,39,85,88),
+(1,5,42,29,32,39,87,90),
+(1,5,43,29,33,40,89,92),
+(1,5,44,30,33,40,91,94),
+(1,5,45,30,33,41,92,96),
+(1,5,46,30,34,42,94,98),
+(1,5,47,31,34,42,96,100),
+(1,5,48,31,35,43,98,102),
+(1,5,49,31,35,44,100,104),
+(1,5,50,32,36,44,102,106),
+(1,5,51,32,36,45,104,109),
+(1,5,52,32,36,45,106,111),
+(1,5,53,33,37,46,108,113),
+(1,5,54,33,37,47,110,115),
+(1,5,55,33,38,47,112,117),
+(1,5,56,34,38,48,114,119),
+(1,5,57,34,39,49,117,121),
+(1,5,58,34,39,49,119,124),
+(1,5,59,35,40,50,121,126),
+(1,5,60,35,40,51,123,128),
+(1,5,61,35,41,51,125,130),
+(1,5,62,36,41,52,127,132),
+(1,5,63,36,41,53,129,135),
+(1,5,64,37,42,54,132,137),
+(1,5,65,37,42,54,134,139),
+(1,5,66,37,43,55,136,142),
+(1,5,67,38,43,56,138,144),
+(1,5,68,38,44,57,140,146),
+(1,5,69,39,44,57,143,149),
+(1,5,70,39,45,58,145,151),
+(1,5,71,39,46,59,148,158),
+(1,5,72,40,46,59,151,161),
+(1,5,73,40,47,60,154,164),
+(1,5,74,41,47,61,156,167),
+(1,5,75,41,48,62,159,170),
+(1,5,76,41,49,63,162,174),
+(1,5,77,42,49,64,165,177),
+(1,5,78,42,50,65,168,180),
+(1,5,79,43,50,66,171,183),
+(1,5,80,43,51,67,174,186),
+(1,6,1,23,20,22,20,20),
+(1,6,2,24,21,23,20,20),
+(1,6,3,26,22,24,20,21),
+(1,6,4,27,22,26,20,21),
+(1,6,5,28,23,27,20,21),
+(1,6,6,30,24,28,20,21),
+(1,6,7,31,25,29,21,22),
+(1,6,8,32,26,30,21,22),
+(1,6,9,34,26,32,21,22),
+(1,6,10,35,27,33,21,23),
+(1,6,11,36,28,34,21,23),
+(1,6,12,38,29,35,21,23),
+(1,6,13,39,30,37,21,24),
+(1,6,14,41,31,38,21,24),
+(1,6,15,42,32,39,21,24),
+(1,6,16,44,33,41,21,25),
+(1,6,17,45,34,42,22,25),
+(1,6,18,47,34,43,22,25),
+(1,6,19,48,35,45,22,26),
+(1,6,20,50,36,46,22,26),
+(1,6,21,51,37,48,22,26),
+(1,6,22,53,38,49,22,27),
+(1,6,23,54,39,51,22,27),
+(1,6,24,56,40,52,23,28),
+(1,6,25,58,41,53,23,28),
+(1,6,26,59,42,55,23,28),
+(1,6,27,61,43,56,23,29),
+(1,6,28,63,44,58,23,29),
+(1,6,29,64,45,59,23,30),
+(1,6,30,66,46,61,24,30),
+(1,6,31,68,47,62,24,30),
+(1,6,32,69,48,64,24,31),
+(1,6,33,71,50,66,24,31),
+(1,6,34,73,51,67,24,32),
+(1,6,35,74,52,69,24,32),
+(1,6,36,76,53,70,25,33),
+(1,6,37,78,54,72,25,33),
+(1,6,38,80,55,74,25,34),
+(1,6,39,82,56,75,25,34),
+(1,6,40,83,57,77,25,35),
+(1,6,41,85,58,79,26,35),
+(1,6,42,87,60,80,26,35),
+(1,6,43,89,61,82,26,36),
+(1,6,44,91,62,84,26,36),
+(1,6,45,93,63,85,26,37),
+(1,6,46,95,64,87,27,37),
+(1,6,47,97,66,89,27,38),
+(1,6,48,99,67,91,27,38),
+(1,6,49,101,68,93,27,39),
+(1,6,50,103,69,94,28,40),
+(1,6,51,105,71,96,28,40),
+(1,6,52,106,72,97,28,41),
+(1,6,53,107,72,98,28,41),
+(1,6,54,107,73,98,29,42),
+(1,6,55,108,73,99,29,43),
+(1,6,56,111,75,102,29,44),
+(1,6,57,113,76,104,29,44),
+(1,6,58,118,77,106,30,45),
+(1,6,59,118,79,108,30,45),
+(1,6,60,123,80,110,30,46),
+(1,6,61,125,81,112,30,47),
+(1,6,62,128,83,114,30,47),
+(1,6,63,130,84,117,31,48),
+(1,6,64,130,86,119,31,48),
+(1,6,65,140,87,128,31,49),
+(1,6,66,143,89,131,31,50),
+(1,6,67,146,90,133,32,50),
+(1,6,68,148,92,135,32,51),
+(1,6,69,151,93,138,32,52),
+(1,6,70,154,95,140,32,52),
+(1,6,71,162,97,144,33,53),
+(1,6,72,164,98,146,33,54),
+(1,6,73,165,100,148,33,55),
+(1,6,74,166,102,151,33,55),
+(1,6,75,169,103,154,34,56),
+(1,6,76,172,105,157,34,57),
+(1,6,77,175,107,157,34,58),
+(1,6,78,176,108,157,34,58),
+(1,6,79,177,110,157,35,59),
+(1,6,80,180,112,160,35,60),
+(1,8,1,20,20,20,23,22),
+(1,8,2,20,20,20,24,23),
+(1,8,3,20,20,21,26,25),
+(1,8,4,20,20,21,27,26),
+(1,8,5,20,21,21,28,27),
+(1,8,6,20,21,21,30,29),
+(1,8,7,21,21,22,31,30),
+(1,8,8,21,21,22,33,31),
+(1,8,9,21,21,22,34,33),
+(1,8,10,21,21,23,36,34),
+(1,8,11,21,22,23,37,36),
+(1,8,12,21,22,23,39,37),
+(1,8,13,21,22,24,40,38),
+(1,8,14,21,22,24,42,40),
+(1,8,15,21,22,24,43,41),
+(1,8,16,21,23,25,45,43),
+(1,8,17,22,23,25,46,44),
+(1,8,18,22,23,25,48,46),
+(1,8,19,22,23,26,49,47),
+(1,8,20,22,23,26,51,49),
+(1,8,21,22,24,26,53,51),
+(1,8,22,22,24,27,54,52),
+(1,8,23,22,24,27,56,54),
+(1,8,24,23,24,28,58,55),
+(1,8,25,23,25,28,59,57),
+(1,8,26,23,25,28,61,59),
+(1,8,27,23,25,29,63,60),
+(1,8,28,23,25,29,65,62),
+(1,8,29,23,25,30,66,64),
+(1,8,30,24,26,30,68,65),
+(1,8,31,24,26,30,70,67),
+(1,8,32,24,26,31,72,69),
+(1,8,33,24,27,31,73,70),
+(1,8,34,24,27,32,75,72),
+(1,8,35,24,27,32,77,74),
+(1,8,36,25,27,33,79,76),
+(1,8,37,25,28,33,81,78),
+(1,8,38,25,28,34,83,79),
+(1,8,39,25,28,34,85,81),
+(1,8,40,25,28,35,87,83),
+(1,8,41,26,29,35,88,85),
+(1,8,42,26,29,35,90,87),
+(1,8,43,26,29,36,92,89),
+(1,8,44,26,30,36,94,91),
+(1,8,45,26,30,37,96,92),
+(1,8,46,27,30,37,98,94),
+(1,8,47,27,31,38,100,96),
+(1,8,48,27,31,38,102,98),
+(1,8,49,27,31,39,104,100),
+(1,8,50,28,32,40,106,102),
+(1,8,51,28,32,40,109,104),
+(1,8,52,28,32,41,111,106),
+(1,8,53,28,33,41,113,108),
+(1,8,54,29,33,42,115,110),
+(1,8,55,29,33,42,117,112),
+(1,8,56,29,34,43,119,114),
+(1,8,57,29,34,43,121,117),
+(1,8,58,30,34,44,124,119),
+(1,8,59,30,35,44,126,121),
+(1,8,60,30,35,45,128,123),
+(1,8,61,30,35,46,130,125),
+(1,8,62,31,36,46,132,127),
+(1,8,63,31,36,47,135,129),
+(1,8,64,31,37,47,137,132),
+(1,8,65,32,37,48,139,134),
+(1,8,66,32,37,49,142,136),
+(1,8,67,32,38,49,144,138),
+(1,8,68,32,38,50,146,140),
+(1,8,69,33,39,50,149,143),
+(1,8,70,33,39,51,151,145),
+(1,8,71,33,39,52,154,152),
+(1,8,72,33,40,53,160,155),
+(1,8,73,33,40,54,160,158),
+(1,8,74,34,41,54,163,160),
+(1,8,75,34,41,55,166,163),
+(1,8,76,34,41,56,169,166),
+(1,8,77,35,42,57,172,169),
+(1,8,78,35,42,57,175,173),
+(1,8,79,35,43,58,178,176),
+(1,8,80,36,43,59,181,179),
+(1,9,1,20,20,21,22,22),
+(1,9,2,20,20,22,23,23),
+(1,9,3,21,21,22,24,24),
+(1,9,4,21,21,23,26,25),
+(1,9,5,21,21,23,27,27),
+(1,9,6,21,22,24,28,28),
+(1,9,7,22,22,24,29,29),
+(1,9,8,22,23,25,30,30),
+(1,9,9,22,23,26,32,31),
+(1,9,10,23,23,26,33,33),
+(1,9,11,23,24,27,34,34),
+(1,9,12,23,24,27,35,35),
+(1,9,13,24,25,28,37,36),
+(1,9,14,24,25,29,38,38),
+(1,9,15,24,25,29,39,39),
+(1,9,16,25,26,30,41,40),
+(1,9,17,25,26,31,42,42),
+(1,9,18,25,27,31,43,43),
+(1,9,19,26,27,32,45,44),
+(1,9,20,26,28,33,46,46),
+(1,9,21,26,28,33,48,47),
+(1,9,22,27,29,34,49,49),
+(1,9,23,27,29,35,51,50),
+(1,9,24,28,30,35,52,51),
+(1,9,25,28,30,36,53,53),
+(1,9,26,28,31,37,55,54),
+(1,9,27,29,31,37,56,56),
+(1,9,28,29,32,38,58,57),
+(1,9,29,30,32,39,59,59),
+(1,9,30,30,33,40,61,60),
+(1,9,31,30,33,40,62,62),
+(1,9,32,31,34,41,64,63),
+(1,9,33,31,34,42,66,65),
+(1,9,34,32,35,43,67,66),
+(1,9,35,32,35,44,69,68),
+(1,9,36,33,36,44,70,69),
+(1,9,37,33,36,45,72,71),
+(1,9,38,34,37,46,74,73),
+(1,9,39,34,38,47,75,74),
+(1,9,40,35,38,48,77,76),
+(1,9,41,35,39,48,79,78),
+(1,9,42,35,39,49,80,79),
+(1,9,43,36,40,50,82,81),
+(1,9,44,36,40,51,84,83),
+(1,9,45,37,41,52,85,84),
+(1,9,46,37,42,53,87,86),
+(1,9,47,38,42,54,89,88),
+(1,9,48,38,43,55,91,89),
+(1,9,49,39,44,55,93,91),
+(1,9,50,40,44,56,94,93),
+(1,9,51,40,45,57,96,95),
+(1,9,52,41,45,58,98,97),
+(1,9,53,41,46,59,100,98),
+(1,9,54,42,47,60,102,100),
+(1,9,55,42,47,61,103,102),
+(1,9,56,43,48,62,105,104),
+(1,9,57,43,49,63,107,106),
+(1,9,58,44,49,64,109,108),
+(1,9,59,44,50,65,111,109),
+(1,9,60,45,51,66,113,111),
+(1,9,61,46,51,67,115,113),
+(1,9,62,46,52,68,117,115),
+(1,9,63,47,53,69,119,117),
+(1,9,64,47,54,70,121,119),
+(1,9,65,48,54,71,123,121),
+(1,9,66,49,55,72,125,123),
+(1,9,67,49,56,73,127,125),
+(1,9,68,50,57,74,129,127),
+(1,9,69,50,57,75,131,129),
+(1,9,70,51,58,76,133,131),
+(1,9,71,52,59,78,135,146),
+(1,9,72,53,59,79,138,148),
+(1,9,73,54,60,80,140,151),
+(1,9,74,54,61,89,143,154),
+(1,9,75,55,62,91,145,156),
+(1,9,76,56,63,92,148,159),
+(1,9,77,57,64,93,151,162),
+(1,9,78,57,65,95,153,165),
+(1,9,79,58,66,96,156,168),
+(1,9,80,59,67,97,159,170),
+(2,1,1,26,17,24,17,23),
+(2,1,2,27,18,25,17,23),
+(2,1,3,29,19,26,17,24),
+(2,1,4,30,19,27,17,24),
+(2,1,5,31,20,29,17,24),
+(2,1,6,32,21,30,17,24),
+(2,1,7,34,22,31,18,25),
+(2,1,8,35,23,32,18,25),
+(2,1,9,37,24,34,18,25),
+(2,1,10,38,24,35,18,26),
+(2,1,11,39,25,36,18,26),
+(2,1,12,41,26,37,18,26),
+(2,1,13,42,27,39,18,27),
+(2,1,14,44,28,40,18,27),
+(2,1,15,45,29,41,18,27),
+(2,1,16,47,30,43,19,28),
+(2,1,17,48,31,44,19,28),
+(2,1,18,50,32,45,19,28),
+(2,1,19,51,33,47,19,29),
+(2,1,20,53,34,48,19,29),
+(2,1,21,54,34,50,19,29),
+(2,1,22,56,35,51,19,30),
+(2,1,23,57,36,52,20,30),
+(2,1,24,59,37,54,20,30),
+(2,1,25,60,38,55,20,31),
+(2,1,26,62,39,57,20,31),
+(2,1,27,64,40,58,20,32),
+(2,1,28,65,41,60,20,32),
+(2,1,29,67,43,61,21,32),
+(2,1,30,69,44,63,21,33),
+(2,1,31,70,45,64,21,33),
+(2,1,32,72,46,66,21,34),
+(2,1,33,74,47,67,21,34),
+(2,1,34,76,48,69,21,35),
+(2,1,35,77,49,71,22,35),
+(2,1,36,79,50,72,22,36),
+(2,1,37,81,51,74,22,36),
+(2,1,38,83,52,76,22,36),
+(2,1,39,84,53,77,22,37),
+(2,1,40,86,55,79,23,37),
+(2,1,41,88,56,81,23,38),
+(2,1,42,90,57,82,23,38),
+(2,1,43,92,58,84,23,39),
+(2,1,44,94,59,86,23,39),
+(2,1,45,96,60,87,24,40),
+(2,1,46,98,62,89,24,40),
+(2,1,47,100,63,91,24,41),
+(2,1,48,101,64,93,24,41),
+(2,1,49,103,65,94,25,42),
+(2,1,50,105,66,96,25,42),
+(2,1,51,107,68,98,25,43),
+(2,1,52,109,69,100,25,43),
+(2,1,53,111,70,102,25,44),
+(2,1,54,113,71,104,26,45),
+(2,1,55,115,73,105,26,45),
+(2,1,56,118,74,107,26,46),
+(2,1,57,120,75,109,26,46),
+(2,1,58,122,77,111,27,47),
+(2,1,59,124,78,113,27,47),
+(2,1,60,126,79,115,27,48),
+(2,1,61,128,81,117,27,48),
+(2,1,62,130,82,119,28,49),
+(2,1,63,132,83,121,28,50),
+(2,1,64,135,85,123,28,50),
+(2,1,65,137,86,125,29,51),
+(2,1,66,139,87,127,29,52),
+(2,1,67,141,89,129,29,52),
+(2,1,68,143,90,131,29,53),
+(2,1,69,146,92,133,30,53),
+(2,1,70,148,93,135,30,54),
+(2,1,71,157,94,142,30,55),
+(2,1,72,162,96,148,30,56),
+(2,1,73,165,98,150,30,57),
+(2,1,74,168,99,153,31,57),
+(2,1,75,170,101,154,31,58),
+(2,1,76,172,103,156,31,59),
+(2,1,77,174,105,159,32,60),
+(2,1,78,179,106,162,32,60),
+(2,1,79,184,108,167,32,61),
+(2,1,80,187,110,170,33,62),
+(2,3,1,23,20,23,17,24),
+(2,3,2,23,21,24,18,25),
+(2,3,3,24,23,25,18,25),
+(2,3,4,24,24,26,19,26),
+(2,3,5,25,25,27,19,26),
+(2,3,6,25,27,28,20,27),
+(2,3,7,26,28,28,21,28),
+(2,3,8,26,30,29,21,28),
+(2,3,9,26,31,30,22,29),
+(2,3,10,27,33,31,22,30),
+(2,3,11,27,34,32,23,30),
+(2,3,12,28,36,33,24,31),
+(2,3,13,28,37,34,24,32),
+(2,3,14,29,39,35,25,33),
+(2,3,15,29,40,36,26,33),
+(2,3,16,30,42,37,26,34),
+(2,3,17,30,43,39,27,35),
+(2,3,18,31,45,40,28,35),
+(2,3,19,31,47,41,28,36),
+(2,3,20,32,48,42,29,37),
+(2,3,21,32,50,43,30,38),
+(2,3,22,33,51,44,31,39),
+(2,3,23,34,53,45,31,39),
+(2,3,24,34,55,46,32,40),
+(2,3,25,35,57,47,33,41),
+(2,3,26,35,58,48,34,42),
+(2,3,27,36,60,50,34,43),
+(2,3,28,36,62,51,35,43),
+(2,3,29,37,63,52,36,44),
+(2,3,30,38,65,53,37,45),
+(2,3,31,38,67,54,37,46),
+(2,3,32,39,69,56,38,47),
+(2,3,33,39,71,57,39,48),
+(2,3,34,40,72,58,40,49),
+(2,3,35,41,74,59,41,49),
+(2,3,36,41,76,61,42,50),
+(2,3,37,42,78,62,42,51),
+(2,3,38,43,80,63,43,52),
+(2,3,39,43,82,64,44,53),
+(2,3,40,44,84,66,45,54),
+(2,3,41,45,86,67,46,55),
+(2,3,42,45,88,68,47,56),
+(2,3,43,46,90,70,47,57),
+(2,3,44,47,91,71,48,58),
+(2,3,45,47,93,72,49,59),
+(2,3,46,48,95,74,50,60),
+(2,3,47,49,98,75,51,61),
+(2,3,48,50,100,77,52,62),
+(2,3,49,50,102,78,53,63),
+(2,3,50,51,104,79,54,64),
+(2,3,51,52,106,81,55,65),
+(2,3,52,52,108,82,56,66),
+(2,3,53,53,110,84,57,67),
+(2,3,54,54,112,85,58,68),
+(2,3,55,55,114,87,59,69),
+(2,3,56,55,116,88,60,70),
+(2,3,57,56,118,90,61,71),
+(2,3,58,57,121,91,62,72),
+(2,3,59,58,123,93,63,73),
+(2,3,60,59,125,94,64,74),
+(2,3,61,59,127,96,65,76),
+(2,3,62,60,130,97,66,77),
+(2,3,63,61,132,99,67,78),
+(2,3,64,62,134,100,68,79),
+(2,3,65,63,136,102,69,80),
+(2,3,66,64,139,104,70,81),
+(2,3,67,64,141,105,71,82),
+(2,3,68,65,143,107,72,84),
+(2,3,69,66,146,108,73,85),
+(2,3,70,67,148,110,74,86),
+(2,3,71,68,151,112,75,87),
+(2,3,72,69,154,114,76,88),
+(2,3,73,70,157,116,77,90),
+(2,3,74,71,160,118,79,91),
+(2,3,75,72,163,120,80,93),
+(2,3,76,73,166,122,81,94),
+(2,3,77,74,169,124,83,96),
+(2,3,78,75,172,126,84,97),
+(2,3,79,76,175,128,85,99),
+(2,3,80,77,178,130,87,100),
+(2,4,1,24,20,23,17,23),
+(2,4,2,25,21,24,17,23),
+(2,4,3,25,23,24,17,24),
+(2,4,4,26,24,25,17,24),
+(2,4,5,27,26,26,18,24),
+(2,4,6,28,27,26,18,25),
+(2,4,7,29,29,27,18,25),
+(2,4,8,29,30,28,18,26),
+(2,4,9,30,32,29,18,26),
+(2,4,10,31,33,29,19,26),
+(2,4,11,32,35,30,19,27),
+(2,4,12,33,37,31,19,27),
+(2,4,13,34,38,32,19,28),
+(2,4,14,34,40,32,19,28),
+(2,4,15,35,41,33,19,28),
+(2,4,16,36,43,34,20,29),
+(2,4,17,37,45,35,20,29),
+(2,4,18,38,46,36,20,30),
+(2,4,19,39,48,37,20,30),
+(2,4,20,40,50,37,21,31),
+(2,4,21,41,52,38,21,31),
+(2,4,22,42,53,39,21,31),
+(2,4,23,43,55,40,21,32),
+(2,4,24,43,57,41,21,32),
+(2,4,25,44,59,42,22,33),
+(2,4,26,45,60,43,22,33),
+(2,4,27,46,62,44,22,34),
+(2,4,28,47,64,44,22,34),
+(2,4,29,48,66,45,23,35),
+(2,4,30,49,68,46,23,35),
+(2,4,31,50,70,47,23,36),
+(2,4,32,51,72,48,23,36),
+(2,4,33,53,73,49,24,37),
+(2,4,34,54,75,50,24,38),
+(2,4,35,55,77,51,24,38),
+(2,4,36,56,79,52,24,39),
+(2,4,37,57,81,53,25,39),
+(2,4,38,58,83,54,25,40),
+(2,4,39,59,85,55,25,40),
+(2,4,40,60,87,56,26,41),
+(2,4,41,61,89,57,26,41),
+(2,4,42,62,91,58,26,42),
+(2,4,43,63,93,59,27,43),
+(2,4,44,65,95,60,27,43),
+(2,4,45,66,98,61,27,44),
+(2,4,46,67,100,62,27,44),
+(2,4,47,68,102,64,28,45),
+(2,4,48,69,104,65,28,46),
+(2,4,49,71,106,66,28,46),
+(2,4,50,72,108,67,29,47),
+(2,4,51,73,110,68,29,48),
+(2,4,52,74,113,69,29,48),
+(2,4,53,75,115,70,30,49),
+(2,4,54,77,117,71,30,50),
+(2,4,55,78,119,73,30,50),
+(2,4,56,79,122,74,31,51),
+(2,4,57,80,124,75,31,52),
+(2,4,58,82,126,76,31,52),
+(2,4,59,83,129,77,32,53),
+(2,4,60,84,131,78,32,54),
+(2,4,61,86,133,80,33,54),
+(2,4,62,87,136,81,33,55),
+(2,4,63,88,138,82,33,56),
+(2,4,64,90,140,83,34,57),
+(2,4,65,91,143,85,34,57),
+(2,4,66,92,145,86,34,58),
+(2,4,67,94,148,87,35,59),
+(2,4,68,95,150,88,35,59),
+(2,4,69,97,153,90,36,60),
+(2,4,70,98,155,91,36,61),
+(2,4,71,100,158,92,36,62),
+(2,4,72,102,161,94,37,62),
+(2,4,73,103,164,99,37,63),
+(2,4,74,105,167,100,38,64),
+(2,4,75,107,170,102,38,65),
+(2,4,76,108,173,102,38,66),
+(2,4,77,110,176,102,39,67),
+(2,4,78,112,180,103,39,68),
+(2,4,79,114,183,105,40,69),
+(2,4,80,116,186,107,40,70),
+(2,6,1,26,17,24,17,23),
+(2,6,2,27,18,25,17,23),
+(2,6,3,29,19,26,17,24),
+(2,6,4,30,19,27,17,24),
+(2,6,5,31,20,29,17,24),
+(2,6,6,32,21,30,17,24),
+(2,6,7,34,22,31,18,25),
+(2,6,8,35,23,32,18,25),
+(2,6,9,37,24,34,18,25),
+(2,6,10,38,24,35,18,26),
+(2,6,11,39,25,36,18,26),
+(2,6,12,41,26,37,18,26),
+(2,6,13,42,27,39,18,27),
+(2,6,14,44,28,40,18,27),
+(2,6,15,45,29,41,18,27),
+(2,6,16,47,30,43,19,28),
+(2,6,17,48,31,44,19,28),
+(2,6,18,50,32,45,19,28),
+(2,6,19,51,33,47,19,29),
+(2,6,20,53,34,48,19,29),
+(2,6,21,54,34,50,19,29),
+(2,6,22,56,35,51,19,30),
+(2,6,23,57,36,52,20,30),
+(2,6,24,59,37,54,20,30),
+(2,6,25,60,38,55,20,31),
+(2,6,26,62,39,57,20,31),
+(2,6,27,64,40,58,20,32),
+(2,6,28,65,41,60,20,32),
+(2,6,29,67,43,61,21,32),
+(2,6,30,69,44,63,21,33),
+(2,6,31,70,45,64,21,33),
+(2,6,32,72,46,66,21,34),
+(2,6,33,74,47,67,21,34),
+(2,6,34,76,48,69,21,35),
+(2,6,35,77,49,71,22,35),
+(2,6,36,79,50,72,22,36),
+(2,6,37,81,51,74,22,36),
+(2,6,38,83,52,76,22,36),
+(2,6,39,84,53,77,22,37),
+(2,6,40,86,55,79,23,37),
+(2,6,41,88,56,81,23,38),
+(2,6,42,90,57,82,23,38),
+(2,6,43,92,58,84,23,39),
+(2,6,44,94,59,86,23,39),
+(2,6,45,96,60,87,24,40),
+(2,6,46,98,62,89,24,40),
+(2,6,47,100,63,91,24,41),
+(2,6,48,101,64,93,24,41),
+(2,6,49,103,65,94,25,42),
+(2,6,50,105,66,96,25,42),
+(2,6,51,107,68,98,25,43),
+(2,6,52,109,69,100,25,43),
+(2,6,53,110,69,100,25,44),
+(2,6,54,111,70,101,26,45),
+(2,6,55,111,70,101,26,45),
+(2,6,56,114,72,104,26,46),
+(2,6,57,116,73,106,26,46),
+(2,6,58,118,74,108,27,47),
+(2,6,59,124,76,110,27,47),
+(2,6,60,126,77,112,27,48),
+(2,6,61,128,78,114,27,49),
+(2,6,62,131,80,116,27,49),
+(2,6,63,133,81,119,28,50),
+(2,6,64,136,83,121,28,50),
+(2,6,65,136,84,123,28,51),
+(2,6,66,142,86,126,28,52),
+(2,6,67,145,87,128,29,52),
+(2,6,68,147,89,130,29,53),
+(2,6,69,150,90,133,29,54),
+(2,6,70,157,92,135,29,54),
+(2,6,71,160,94,138,30,55),
+(2,6,72,163,95,140,30,56),
+(2,6,73,166,97,151,30,57),
+(2,6,74,169,99,154,30,57),
+(2,6,75,172,100,156,31,58),
+(2,6,76,175,102,160,31,59),
+(2,6,77,179,104,162,31,60),
+(2,6,78,182,105,165,31,60),
+(2,6,79,191,107,168,32,61),
+(2,6,80,194,109,171,32,62),
+(2,7,1,24,17,23,18,25),
+(2,7,2,25,17,24,19,26),
+(2,7,3,26,18,25,20,27),
+(2,7,4,26,18,26,21,28),
+(2,7,5,27,19,27,22,29),
+(2,7,6,28,19,28,23,30),
+(2,7,7,29,20,29,24,31),
+(2,7,8,30,20,30,25,32),
+(2,7,9,31,21,31,26,33),
+(2,7,10,32,21,32,27,34),
+(2,7,11,33,22,33,28,36),
+(2,7,12,34,22,34,29,37),
+(2,7,13,34,23,35,30,38),
+(2,7,14,35,23,36,31,39),
+(2,7,15,36,24,37,32,40),
+(2,7,16,37,24,39,33,41),
+(2,7,17,38,25,40,34,43),
+(2,7,18,39,25,41,35,44),
+(2,7,19,40,26,42,36,45),
+(2,7,20,41,26,43,37,46),
+(2,7,21,42,27,44,38,47),
+(2,7,22,43,27,45,39,49),
+(2,7,23,44,28,47,40,50),
+(2,7,24,45,28,48,41,51),
+(2,7,25,47,29,49,43,52),
+(2,7,26,48,30,50,44,54),
+(2,7,27,49,30,52,45,55),
+(2,7,28,50,31,53,46,56),
+(2,7,29,51,31,54,47,58),
+(2,7,30,52,32,55,48,59),
+(2,7,31,53,33,57,50,60),
+(2,7,32,54,33,58,51,62),
+(2,7,33,55,34,59,52,63),
+(2,7,34,57,34,61,53,65),
+(2,7,35,58,35,62,55,66),
+(2,7,36,59,36,63,56,67),
+(2,7,37,60,36,65,57,69),
+(2,7,38,61,37,66,58,70),
+(2,7,39,62,38,67,60,72),
+(2,7,40,64,38,69,61,73),
+(2,7,41,65,39,70,62,75),
+(2,7,42,66,40,72,64,76),
+(2,7,43,67,40,73,65,78),
+(2,7,44,69,41,74,66,79),
+(2,7,45,70,42,76,68,81),
+(2,7,46,71,42,77,69,82),
+(2,7,47,72,43,79,70,84),
+(2,7,48,74,44,80,72,85),
+(2,7,49,75,45,82,73,87),
+(2,7,50,76,45,83,75,89),
+(2,7,51,78,46,85,76,90),
+(2,7,52,79,47,86,77,92),
+(2,7,53,80,47,88,79,93),
+(2,7,54,82,48,90,80,95),
+(2,7,55,83,49,91,82,97),
+(2,7,56,85,50,93,83,98),
+(2,7,57,86,50,94,85,100),
+(2,7,58,87,51,96,86,102),
+(2,7,59,89,52,97,88,103),
+(2,7,60,90,53,99,89,105),
+(2,7,61,92,54,101,91,107),
+(2,7,62,93,54,102,92,109),
+(2,7,63,95,55,104,94,110),
+(2,7,64,96,56,106,95,112),
+(2,7,65,97,57,107,97,114),
+(2,7,66,99,58,109,99,116),
+(2,7,67,100,58,111,100,118),
+(2,7,68,102,59,113,102,119),
+(2,7,69,103,60,114,103,121),
+(2,7,70,105,61,116,105,123),
+(2,7,71,106,62,118,117,125),
+(2,7,72,108,63,120,119,128),
+(2,7,73,110,64,122,122,130),
+(2,7,74,112,65,125,124,132),
+(2,7,75,114,66,127,126,134),
+(2,7,76,116,67,129,128,137),
+(2,7,77,117,68,131,128,139),
+(2,7,78,119,69,133,133,141),
+(2,7,79,121,70,136,135,144),
+(2,7,80,123,71,138,137,146),
+(2,9,1,23,17,23,19,25),
+(2,9,2,23,17,24,20,26),
+(2,9,3,24,18,24,21,27),
+(2,9,4,24,18,25,23,28),
+(2,9,5,24,18,25,24,30),
+(2,9,6,24,19,26,25,31),
+(2,9,7,25,19,26,26,32),
+(2,9,8,25,20,27,27,33),
+(2,9,9,25,20,27,29,34),
+(2,9,10,26,20,28,30,36),
+(2,9,11,26,21,29,31,37),
+(2,9,12,26,21,29,33,38),
+(2,9,13,27,22,30,34,39),
+(2,9,14,27,22,31,35,41),
+(2,9,15,27,23,31,37,42),
+(2,9,16,28,23,32,38,43),
+(2,9,17,28,23,32,39,45),
+(2,9,18,28,24,33,41,46),
+(2,9,19,29,24,34,42,47),
+(2,9,20,29,25,34,43,49),
+(2,9,21,29,25,35,45,50),
+(2,9,22,30,26,36,46,51),
+(2,9,23,30,26,37,48,53),
+(2,9,24,30,27,37,49,54),
+(2,9,25,31,27,38,51,56),
+(2,9,26,31,28,39,52,57),
+(2,9,27,32,28,39,54,59),
+(2,9,28,32,29,40,55,60),
+(2,9,29,32,29,41,57,62),
+(2,9,30,33,30,42,58,63),
+(2,9,31,33,30,42,60,65),
+(2,9,32,34,31,43,61,66),
+(2,9,33,34,31,44,63,68),
+(2,9,34,35,32,45,64,69),
+(2,9,35,35,32,45,66,71),
+(2,9,36,36,33,46,68,72),
+(2,9,37,36,34,47,69,74),
+(2,9,38,36,34,48,71,76),
+(2,9,39,37,35,49,72,77),
+(2,9,40,37,35,50,74,79),
+(2,9,41,38,36,50,76,80),
+(2,9,42,38,36,51,77,82),
+(2,9,43,39,37,52,79,84),
+(2,9,44,39,38,53,81,85),
+(2,9,45,40,38,54,83,87),
+(2,9,46,40,39,55,84,89),
+(2,9,47,41,39,56,86,91),
+(2,9,48,41,40,56,88,92),
+(2,9,49,42,41,57,90,94),
+(2,9,50,42,41,58,91,96),
+(2,9,51,43,42,59,93,98),
+(2,9,52,43,43,60,95,99),
+(2,9,53,44,43,61,97,101),
+(2,9,54,45,44,62,99,103),
+(2,9,55,45,45,63,101,105),
+(2,9,56,46,45,64,102,107),
+(2,9,57,46,46,65,104,109),
+(2,9,58,47,47,66,106,110),
+(2,9,59,47,47,67,108,112),
+(2,9,60,48,48,68,110,114),
+(2,9,61,48,49,69,112,116),
+(2,9,62,49,49,70,114,118),
+(2,9,63,50,50,71,116,120),
+(2,9,64,50,51,72,118,122),
+(2,9,65,51,51,73,120,124),
+(2,9,66,52,52,74,122,126),
+(2,9,67,52,53,75,124,128),
+(2,9,68,53,54,76,126,130),
+(2,9,69,53,54,77,128,132),
+(2,9,70,54,55,78,130,134),
+(2,9,71,55,56,88,134,145),
+(2,9,72,56,56,89,135,147),
+(2,9,73,57,57,90,137,150),
+(2,9,74,57,58,91,142,153),
+(2,9,75,58,59,93,142,155),
+(2,9,76,59,60,94,145,158),
+(2,9,77,60,61,95,148,161),
+(2,9,78,60,62,97,150,164),
+(2,9,79,61,63,98,153,167),
+(2,9,80,62,64,99,156,169),
+(3,1,1,25,16,25,19,19),
+(3,1,2,26,17,26,19,19),
+(3,1,3,28,18,27,19,20),
+(3,1,4,29,18,28,19,20),
+(3,1,5,30,19,30,19,20),
+(3,1,6,31,20,31,19,20),
+(3,1,7,33,21,32,20,21),
+(3,1,8,34,22,33,20,21),
+(3,1,9,36,23,35,20,21),
+(3,1,10,37,23,36,20,22),
+(3,1,11,38,24,37,20,22),
+(3,1,12,40,25,38,20,22),
+(3,1,13,41,26,40,20,23),
+(3,1,14,43,27,41,20,23),
+(3,1,15,44,28,42,20,23),
+(3,1,16,46,29,44,21,24),
+(3,1,17,47,30,45,21,24),
+(3,1,18,49,31,46,21,24),
+(3,1,19,50,32,48,21,25),
+(3,1,20,52,33,49,21,25),
+(3,1,21,53,34,51,21,26),
+(3,1,22,55,34,52,21,26),
+(3,1,23,56,35,53,21,26),
+(3,1,24,58,36,55,22,27),
+(3,1,25,59,37,56,22,27),
+(3,1,26,61,38,58,22,27),
+(3,1,27,63,39,59,22,28),
+(3,1,28,64,41,61,22,28),
+(3,1,29,66,42,62,22,29),
+(3,1,30,68,43,64,23,29),
+(3,1,31,69,44,65,23,30),
+(3,1,32,71,45,67,23,30),
+(3,1,33,73,46,68,23,30),
+(3,1,34,75,47,70,23,31),
+(3,1,35,76,48,72,24,31),
+(3,1,36,78,49,73,24,32),
+(3,1,37,80,50,75,24,32),
+(3,1,38,82,51,76,24,33),
+(3,1,39,84,52,78,24,33),
+(3,1,40,85,54,80,24,34),
+(3,1,41,87,55,81,25,34),
+(3,1,42,89,56,83,25,35),
+(3,1,43,91,57,85,25,35),
+(3,1,44,93,58,87,25,36),
+(3,1,45,95,59,88,26,36),
+(3,1,46,97,61,90,26,37),
+(3,1,47,99,62,92,26,37),
+(3,1,48,101,63,94,26,38),
+(3,1,49,102,64,95,26,38),
+(3,1,50,104,65,97,27,39),
+(3,1,51,106,67,99,27,39),
+(3,1,52,108,68,101,27,40),
+(3,1,53,110,69,103,27,40),
+(3,1,54,112,70,104,28,41),
+(3,1,55,115,72,106,28,41),
+(3,1,56,117,73,108,28,42),
+(3,1,57,119,74,110,28,42),
+(3,1,58,121,76,112,29,43),
+(3,1,59,123,77,114,29,43),
+(3,1,60,125,78,116,29,44),
+(3,1,61,127,80,118,29,45),
+(3,1,62,129,81,120,30,45),
+(3,1,63,131,82,122,30,46),
+(3,1,64,134,84,124,30,46),
+(3,1,65,136,85,126,31,47),
+(3,1,66,138,86,128,31,48),
+(3,1,67,140,88,130,31,48),
+(3,1,68,142,89,132,31,49),
+(3,1,69,145,91,134,32,49),
+(3,1,70,147,92,136,32,50),
+(3,1,71,150,93,138,32,51),
+(3,1,72,152,95,141,32,52),
+(3,1,73,164,97,151,32,53),
+(3,1,74,164,98,151,33,53),
+(3,1,75,170,100,156,33,54),
+(3,1,76,173,102,160,33,55),
+(3,1,77,173,104,160,34,56),
+(3,1,78,176,105,162,34,56),
+(3,1,79,183,107,168,34,57),
+(3,1,80,186,109,171,35,58),
+(3,2,1,24,16,25,19,20),
+(3,2,2,25,17,26,20,21),
+(3,2,3,26,17,27,20,21),
+(3,2,4,27,18,28,21,22),
+(3,2,5,28,18,29,22,23),
+(3,2,6,29,19,30,22,24),
+(3,2,7,31,20,31,23,24),
+(3,2,8,32,20,32,24,25),
+(3,2,9,33,21,33,24,26),
+(3,2,10,34,21,34,25,26),
+(3,2,11,35,22,36,26,27),
+(3,2,12,36,23,37,26,28),
+(3,2,13,38,23,38,27,29),
+(3,2,14,39,24,39,28,30),
+(3,2,15,40,25,40,29,30),
+(3,2,16,41,25,41,29,31),
+(3,2,17,43,26,43,30,32),
+(3,2,18,44,27,44,31,33),
+(3,2,19,45,28,45,32,34),
+(3,2,20,47,28,46,32,35),
+(3,2,21,48,29,47,33,35),
+(3,2,22,49,30,49,34,36),
+(3,2,23,51,30,50,35,37),
+(3,2,24,52,31,51,36,38),
+(3,2,25,53,32,52,36,39),
+(3,2,26,55,33,54,37,40),
+(3,2,27,56,33,55,38,41),
+(3,2,28,57,34,56,39,42),
+(3,2,29,59,35,58,40,43),
+(3,2,30,60,36,59,41,43),
+(3,2,31,62,37,60,42,44),
+(3,2,32,63,37,62,42,45),
+(3,2,33,65,38,63,43,46),
+(3,2,34,66,39,65,44,47),
+(3,2,35,68,40,66,45,48),
+(3,2,36,69,41,67,46,49),
+(3,2,37,71,41,69,47,50),
+(3,2,38,72,42,70,48,51),
+(3,2,39,74,43,72,49,52),
+(3,2,40,75,44,73,50,53),
+(3,2,41,77,45,75,51,54),
+(3,2,42,78,46,76,52,55),
+(3,2,43,80,47,78,53,56),
+(3,2,44,82,47,79,54,57),
+(3,2,45,83,48,81,55,59),
+(3,2,46,85,49,82,56,60),
+(3,2,47,87,50,84,57,61),
+(3,2,48,88,51,85,58,62),
+(3,2,49,90,52,87,59,63),
+(3,2,50,92,53,89,60,64),
+(3,2,51,93,54,90,61,65),
+(3,2,52,95,55,92,62,66),
+(3,2,53,97,56,93,63,67),
+(3,2,54,98,57,95,64,69),
+(3,2,55,100,58,97,65,70),
+(3,2,56,102,59,98,66,71),
+(3,2,57,104,60,100,67,72),
+(3,2,58,106,61,102,68,73),
+(3,2,59,107,62,103,69,74),
+(3,2,60,109,63,105,70,76),
+(3,2,61,111,64,107,72,77),
+(3,2,62,113,65,109,73,78),
+(3,2,63,115,66,110,74,79),
+(3,2,64,117,67,112,75,80),
+(3,2,65,118,68,114,76,82),
+(3,2,66,120,69,116,77,83),
+(3,2,67,122,70,118,78,84),
+(3,2,68,124,71,119,80,85),
+(3,2,69,126,72,121,81,87),
+(3,2,70,128,73,123,82,88),
+(3,2,71,150,74,125,83,89),
+(3,2,72,152,75,128,85,91),
+(3,2,73,156,76,130,86,93),
+(3,2,74,158,78,132,88,94),
+(3,2,75,161,79,134,89,96),
+(3,2,76,164,80,137,91,97),
+(3,2,77,166,82,139,92,99),
+(3,2,78,170,83,141,94,101),
+(3,2,79,172,84,144,95,102),
+(3,2,80,175,86,146,97,104),
+(3,3,1,22,19,24,19,20),
+(3,3,2,22,20,25,20,21),
+(3,3,3,23,22,26,20,21),
+(3,3,4,23,23,27,21,22),
+(3,3,5,24,25,28,21,23),
+(3,3,6,24,26,29,22,23),
+(3,3,7,25,27,29,23,24),
+(3,3,8,25,29,30,23,25),
+(3,3,9,25,30,31,24,25),
+(3,3,10,26,32,32,24,26),
+(3,3,11,26,33,33,25,27),
+(3,3,12,27,35,34,26,27),
+(3,3,13,27,36,35,26,28),
+(3,3,14,28,38,36,27,29),
+(3,3,15,28,39,37,28,29),
+(3,3,16,29,41,38,28,30),
+(3,3,17,29,42,39,29,31),
+(3,3,18,30,44,41,30,32),
+(3,3,19,30,46,42,30,32),
+(3,3,20,31,47,43,31,33),
+(3,3,21,32,49,44,32,34),
+(3,3,22,32,51,45,33,35),
+(3,3,23,33,52,46,33,36),
+(3,3,24,33,54,47,34,36),
+(3,3,25,34,56,48,35,37),
+(3,3,26,34,57,49,35,38),
+(3,3,27,35,59,51,36,39),
+(3,3,28,35,61,52,37,40),
+(3,3,29,36,63,53,38,40),
+(3,3,30,37,64,54,39,41),
+(3,3,31,37,66,55,39,42),
+(3,3,32,38,68,57,40,43),
+(3,3,33,38,70,58,41,44),
+(3,3,34,39,71,59,42,45),
+(3,3,35,40,73,60,43,46),
+(3,3,36,40,75,62,43,47),
+(3,3,37,41,77,63,44,47),
+(3,3,38,42,79,64,45,48),
+(3,3,39,42,81,65,46,49),
+(3,3,40,43,83,67,47,50),
+(3,3,41,44,85,68,48,51),
+(3,3,42,44,87,69,49,52),
+(3,3,43,45,89,71,49,53),
+(3,3,44,46,91,72,50,54),
+(3,3,45,46,93,73,51,55),
+(3,3,46,47,95,75,52,56),
+(3,3,47,48,97,76,53,57),
+(3,3,48,49,99,78,54,58),
+(3,3,49,49,101,79,55,59),
+(3,3,50,50,103,80,56,60),
+(3,3,51,51,105,82,57,61),
+(3,3,52,51,107,83,58,62),
+(3,3,53,52,109,85,59,63),
+(3,3,54,53,111,86,60,64),
+(3,3,55,54,113,88,61,65),
+(3,3,56,55,115,89,62,66),
+(3,3,57,55,118,91,62,67),
+(3,3,58,56,120,92,63,68),
+(3,3,59,57,122,94,64,70),
+(3,3,60,58,124,95,65,71),
+(3,3,61,58,126,97,67,72),
+(3,3,62,59,129,98,68,73),
+(3,3,63,60,131,100,69,74),
+(3,3,64,61,133,101,70,75),
+(3,3,65,62,135,103,71,76),
+(3,3,66,63,138,105,72,77),
+(3,3,67,63,140,106,73,78),
+(3,3,68,64,142,108,74,80),
+(3,3,69,65,145,109,75,81),
+(3,3,70,66,147,111,76,82),
+(3,3,71,67,150,113,77,83),
+(3,3,72,68,153,115,78,84),
+(3,3,73,69,156,117,79,86),
+(3,3,74,70,159,119,81,87),
+(3,3,75,71,162,121,82,89),
+(3,3,76,72,165,123,83,90),
+(3,3,77,73,168,125,85,92),
+(3,3,78,74,171,127,86,93),
+(3,3,79,75,174,129,87,95),
+(3,3,80,76,177,131,89,96),
+(3,4,1,23,19,24,19,19),
+(3,4,2,24,20,25,19,19),
+(3,4,3,24,22,25,19,20),
+(3,4,4,25,23,26,19,20),
+(3,4,5,26,25,27,20,20),
+(3,4,6,27,26,27,20,21),
+(3,4,7,28,28,28,20,21),
+(3,4,8,28,29,29,20,22),
+(3,4,9,29,31,30,20,22),
+(3,4,10,30,32,30,20,22),
+(3,4,11,31,34,31,21,23),
+(3,4,12,32,36,32,21,23),
+(3,4,13,33,37,33,21,24),
+(3,4,14,33,39,33,21,24),
+(3,4,15,34,40,34,21,25),
+(3,4,16,35,42,35,22,25),
+(3,4,17,36,44,36,22,25),
+(3,4,18,37,45,37,22,26),
+(3,4,19,38,47,38,22,26),
+(3,4,20,39,49,38,22,27),
+(3,4,21,40,51,39,23,27),
+(3,4,22,41,52,40,23,28),
+(3,4,23,42,54,41,23,28),
+(3,4,24,43,56,42,23,29),
+(3,4,25,44,58,43,24,29),
+(3,4,26,44,59,44,24,30),
+(3,4,27,45,61,44,24,30),
+(3,4,28,46,63,45,24,31),
+(3,4,29,47,65,46,25,31),
+(3,4,30,48,67,47,25,32),
+(3,4,31,49,69,48,25,32),
+(3,4,32,51,71,49,25,33),
+(3,4,33,52,72,50,26,33),
+(3,4,34,53,74,51,26,34),
+(3,4,35,54,76,52,26,34),
+(3,4,36,55,78,53,26,35),
+(3,4,37,56,80,54,27,35),
+(3,4,38,57,82,55,27,36),
+(3,4,39,58,84,56,27,37),
+(3,4,40,59,86,57,28,37),
+(3,4,41,60,88,58,28,38),
+(3,4,42,61,90,59,28,38),
+(3,4,43,63,92,60,28,39),
+(3,4,44,64,95,61,29,39),
+(3,4,45,65,97,62,29,40),
+(3,4,46,66,99,63,29,41),
+(3,4,47,67,101,64,30,41),
+(3,4,48,68,103,66,30,42),
+(3,4,49,70,105,67,30,43),
+(3,4,50,71,107,68,31,43),
+(3,4,51,72,110,69,31,44),
+(3,4,52,73,112,70,31,44),
+(3,4,53,74,114,71,32,45),
+(3,4,54,76,116,72,32,46),
+(3,4,55,77,118,73,32,46),
+(3,4,56,78,121,75,33,47),
+(3,4,57,80,123,76,33,48),
+(3,4,58,81,125,77,33,48),
+(3,4,59,82,128,78,34,49),
+(3,4,60,83,130,79,34,50),
+(3,4,61,85,132,81,34,51),
+(3,4,62,86,135,82,35,51),
+(3,4,63,87,137,83,35,52),
+(3,4,64,89,139,84,36,53),
+(3,4,65,90,142,86,36,53),
+(3,4,66,91,144,87,36,54),
+(3,4,67,93,147,88,37,55),
+(3,4,68,94,149,89,37,56),
+(3,4,69,96,152,91,38,56),
+(3,4,70,97,154,92,38,57),
+(3,4,71,99,157,93,38,58),
+(3,4,72,101,160,96,39,58),
+(3,4,73,102,163,97,39,59),
+(3,4,74,104,166,98,40,60),
+(3,4,75,106,169,100,40,61),
+(3,4,76,107,172,101,40,62),
+(3,4,77,109,175,103,41,63),
+(3,4,78,111,179,105,41,64),
+(3,4,79,113,182,106,42,65),
+(3,4,80,115,185,108,42,66),
+(3,5,1,22,16,23,21,22),
+(3,5,2,22,16,23,22,23),
+(3,5,3,22,16,24,24,25),
+(3,5,4,22,17,24,25,26),
+(3,5,5,23,17,24,26,27),
+(3,5,6,23,17,25,28,29),
+(3,5,7,23,17,25,29,30),
+(3,5,8,23,18,26,30,32),
+(3,5,9,23,18,26,32,33),
+(3,5,10,23,18,26,33,35),
+(3,5,11,24,18,27,35,36),
+(3,5,12,24,19,27,36,38),
+(3,5,13,24,19,28,37,39),
+(3,5,14,24,19,28,39,41),
+(3,5,15,24,19,28,40,42),
+(3,5,16,24,20,29,42,44),
+(3,5,17,25,20,29,43,45),
+(3,5,18,25,20,30,45,47),
+(3,5,19,25,21,30,46,49),
+(3,5,20,25,21,31,48,50),
+(3,5,21,25,21,31,50,52),
+(3,5,22,26,22,31,51,53),
+(3,5,23,26,22,32,53,55),
+(3,5,24,26,22,32,54,57),
+(3,5,25,26,22,33,56,58),
+(3,5,26,27,23,33,58,60),
+(3,5,27,27,23,34,59,62),
+(3,5,28,27,23,34,61,64),
+(3,5,29,27,24,35,63,65),
+(3,5,30,28,24,35,64,67),
+(3,5,31,28,24,36,66,69),
+(3,5,32,28,25,36,68,71),
+(3,5,33,28,25,37,70,72),
+(3,5,34,29,26,38,71,74),
+(3,5,35,29,26,38,73,76),
+(3,5,36,29,26,39,75,78),
+(3,5,37,29,27,39,77,80),
+(3,5,38,30,27,40,78,82),
+(3,5,39,30,27,40,80,84),
+(3,5,40,30,28,41,82,86),
+(3,5,41,31,28,41,84,88),
+(3,5,42,31,29,42,86,89),
+(3,5,43,31,29,43,88,91),
+(3,5,44,32,29,43,90,93),
+(3,5,45,32,30,44,92,95),
+(3,5,46,32,30,44,93,97),
+(3,5,47,32,30,45,95,99),
+(3,5,48,33,31,46,97,101),
+(3,5,49,33,31,46,99,103),
+(3,5,50,33,32,47,101,106),
+(3,5,51,34,32,48,103,108),
+(3,5,52,34,33,48,105,110),
+(3,5,53,35,33,49,107,112),
+(3,5,54,35,33,50,109,114),
+(3,5,55,35,34,50,111,116),
+(3,5,56,36,34,51,113,118),
+(3,5,57,36,35,52,116,120),
+(3,5,58,36,35,52,118,123),
+(3,5,59,37,36,53,120,125),
+(3,5,60,37,36,54,122,127),
+(3,5,61,37,37,54,124,129),
+(3,5,62,38,37,55,126,131),
+(3,5,63,38,38,56,128,134),
+(3,5,64,39,38,57,131,136),
+(3,5,65,39,39,57,133,138),
+(3,5,66,39,39,58,135,141),
+(3,5,67,40,40,59,137,143),
+(3,5,68,40,40,59,139,145),
+(3,5,69,41,40,60,142,148),
+(3,5,70,41,41,61,144,150),
+(3,5,71,41,42,62,147,153),
+(3,5,72,42,42,62,150,163),
+(3,5,73,42,43,63,153,166),
+(3,5,74,43,43,64,155,170),
+(3,5,75,43,44,65,158,173),
+(3,5,76,43,45,66,161,176),
+(3,5,77,44,45,67,164,179),
+(3,5,78,44,46,68,167,182),
+(3,5,79,45,46,69,170,184),
+(3,5,80,45,47,70,173,189),
+(3,6,1,25,16,25,19,19),
+(3,6,2,26,17,26,19,19),
+(3,6,3,28,18,27,19,20),
+(3,6,4,29,18,28,19,20),
+(3,6,5,30,19,30,19,20),
+(3,6,6,31,20,31,19,20),
+(3,6,7,33,21,32,20,21),
+(3,6,8,34,22,33,20,21),
+(3,6,9,36,23,35,20,21),
+(3,6,10,37,23,36,20,22),
+(3,6,11,38,24,37,20,22),
+(3,6,12,40,25,38,20,22),
+(3,6,13,41,26,40,20,23),
+(3,6,14,43,27,41,20,23),
+(3,6,15,44,28,42,20,23),
+(3,6,16,46,29,44,21,24),
+(3,6,17,47,30,45,21,24),
+(3,6,18,49,31,46,21,24),
+(3,6,19,50,32,48,21,25),
+(3,6,20,52,33,49,21,25),
+(3,6,21,53,34,51,21,26),
+(3,6,22,55,34,52,21,26),
+(3,6,23,56,35,53,21,26),
+(3,6,24,58,36,55,22,27),
+(3,6,25,59,37,56,22,27),
+(3,6,26,61,38,58,22,27),
+(3,6,27,63,39,59,22,28),
+(3,6,28,64,41,61,22,28),
+(3,6,29,66,42,62,22,29),
+(3,6,30,68,43,64,23,29),
+(3,6,31,69,44,65,23,30),
+(3,6,32,71,45,67,23,30),
+(3,6,33,73,46,68,23,30),
+(3,6,34,75,47,70,23,31),
+(3,6,35,76,48,72,24,31),
+(3,6,36,78,49,73,24,32),
+(3,6,37,80,50,75,24,32),
+(3,6,38,82,51,76,24,33),
+(3,6,39,84,52,78,24,33),
+(3,6,40,85,54,80,24,34),
+(3,6,41,87,55,81,25,34),
+(3,6,42,89,56,83,25,35),
+(3,6,43,91,57,85,25,35),
+(3,6,44,93,58,87,25,36),
+(3,6,45,95,59,88,26,36),
+(3,6,46,97,61,90,26,37),
+(3,6,47,99,62,92,26,37),
+(3,6,48,101,63,94,26,38),
+(3,6,49,102,64,95,26,38),
+(3,6,50,104,65,97,27,39),
+(3,6,51,106,67,99,27,39),
+(3,6,52,108,68,99,27,40),
+(3,6,53,109,68,101,27,40),
+(3,6,54,110,69,101,28,41),
+(3,6,55,110,69,102,28,41),
+(3,6,56,113,71,105,28,42),
+(3,6,57,118,72,107,28,42),
+(3,6,58,120,73,109,29,43),
+(3,6,59,123,75,111,29,43),
+(3,6,60,125,76,113,29,44),
+(3,6,61,126,77,115,29,45),
+(3,6,62,127,79,117,29,45),
+(3,6,63,129,80,120,30,46),
+(3,6,64,132,82,122,30,46),
+(3,6,65,135,83,124,30,47),
+(3,6,66,137,85,127,30,48),
+(3,6,67,144,86,129,31,48),
+(3,6,68,146,88,131,31,49),
+(3,6,69,149,89,133,31,50),
+(3,6,70,152,91,136,31,50),
+(3,6,71,154,93,139,32,51),
+(3,6,72,157,94,141,32,52),
+(3,6,73,160,96,144,32,53),
+(3,6,74,163,98,146,32,53),
+(3,6,75,166,99,150,33,54),
+(3,6,76,169,101,152,33,55),
+(3,6,77,172,103,155,33,56),
+(3,6,78,176,104,157,33,56),
+(3,6,79,179,106,160,34,57),
+(3,6,80,182,108,163,34,58),
+(4,1,1,20,25,21,20,20),
+(4,1,2,21,26,22,20,20),
+(4,1,3,23,27,23,20,21),
+(4,1,4,24,27,25,20,21),
+(4,1,5,25,28,26,20,21),
+(4,1,6,27,29,27,20,21),
+(4,1,7,28,30,28,21,22),
+(4,1,8,29,31,29,21,22),
+(4,1,9,31,31,31,21,22),
+(4,1,10,32,32,32,21,23),
+(4,1,11,33,33,33,21,23),
+(4,1,12,35,34,34,21,23),
+(4,1,13,36,35,36,21,24),
+(4,1,14,38,36,37,21,24),
+(4,1,15,39,37,38,21,24),
+(4,1,16,41,37,40,21,25),
+(4,1,17,42,38,41,22,25),
+(4,1,18,44,39,43,22,25),
+(4,1,19,45,40,44,22,26),
+(4,1,20,47,41,45,22,26),
+(4,1,21,48,42,47,22,26),
+(4,1,22,50,43,48,22,27),
+(4,1,23,52,44,50,22,27),
+(4,1,24,53,45,51,23,28),
+(4,1,25,55,46,52,23,28),
+(4,1,26,56,47,54,23,28),
+(4,1,27,58,48,55,23,29),
+(4,1,28,60,49,57,23,29),
+(4,1,29,61,50,58,23,30),
+(4,1,30,63,51,60,24,30),
+(4,1,31,65,52,62,24,30),
+(4,1,32,66,53,63,24,31),
+(4,1,33,68,54,65,24,31),
+(4,1,34,70,55,66,24,32),
+(4,1,35,72,56,68,24,32),
+(4,1,36,73,58,69,25,33),
+(4,1,37,75,59,71,25,33),
+(4,1,38,77,60,73,25,34),
+(4,1,39,79,61,74,25,34),
+(4,1,40,81,62,76,25,35),
+(4,1,41,82,63,78,26,35),
+(4,1,42,84,64,79,26,35),
+(4,1,43,86,66,81,26,36),
+(4,1,44,88,67,83,26,36),
+(4,1,45,90,68,85,26,37),
+(4,1,46,92,69,86,27,37),
+(4,1,47,94,70,88,27,38),
+(4,1,48,96,72,90,27,38),
+(4,1,49,98,73,92,27,39),
+(4,1,50,100,74,93,28,40),
+(4,1,51,102,75,95,28,40),
+(4,1,52,104,77,97,28,41),
+(4,1,53,106,78,99,28,41),
+(4,1,54,108,79,101,29,42),
+(4,1,55,110,80,103,29,42),
+(4,1,56,112,82,104,29,43),
+(4,1,57,114,83,106,29,43),
+(4,1,58,116,84,108,30,44),
+(4,1,59,118,86,110,30,44),
+(4,1,60,120,87,112,30,45),
+(4,1,61,122,88,114,30,46),
+(4,1,62,124,90,116,31,46),
+(4,1,63,127,91,118,31,47),
+(4,1,64,129,92,120,31,47),
+(4,1,65,131,94,122,32,48),
+(4,1,66,133,95,124,32,49),
+(4,1,67,135,97,126,32,49),
+(4,1,68,138,98,128,32,50),
+(4,1,69,140,100,130,33,50),
+(4,1,70,142,101,132,33,51),
+(4,1,71,145,102,134,33,52),
+(4,1,72,147,104,137,33,53),
+(4,1,73,150,106,139,33,54),
+(4,1,74,153,107,142,34,54),
+(4,1,75,156,109,144,34,55),
+(4,1,76,159,111,148,34,56),
+(4,1,77,162,113,150,35,57),
+(4,1,78,165,114,152,35,57),
+(4,1,79,178,116,164,35,58),
+(4,1,80,181,118,167,36,59),
+(4,3,1,17,28,20,20,21),
+(4,3,2,17,29,21,21,22),
+(4,3,3,18,31,22,21,22),
+(4,3,4,18,32,23,22,23),
+(4,3,5,19,33,24,22,24),
+(4,3,6,19,35,25,23,24),
+(4,3,7,20,36,26,24,25),
+(4,3,8,20,38,27,24,25),
+(4,3,9,21,39,27,25,26),
+(4,3,10,21,40,28,25,27),
+(4,3,11,22,42,29,26,28),
+(4,3,12,22,43,30,27,28),
+(4,3,13,23,45,31,27,29),
+(4,3,14,23,46,32,28,30),
+(4,3,15,24,48,34,29,30),
+(4,3,16,24,50,35,29,31),
+(4,3,17,25,51,36,30,32),
+(4,3,18,25,53,37,31,33),
+(4,3,19,26,54,38,31,33),
+(4,3,20,26,56,39,32,34),
+(4,3,21,27,57,40,33,35),
+(4,3,22,27,59,41,33,36),
+(4,3,23,28,61,42,34,36),
+(4,3,24,28,62,43,35,37),
+(4,3,25,29,64,44,36,38),
+(4,3,26,30,66,46,36,39),
+(4,3,27,30,68,47,37,40),
+(4,3,28,31,69,48,38,41),
+(4,3,29,31,71,49,39,41),
+(4,3,30,32,73,50,39,42),
+(4,3,31,33,75,52,40,43),
+(4,3,32,33,76,53,41,44),
+(4,3,33,34,78,54,42,45),
+(4,3,34,34,80,55,43,46),
+(4,3,35,35,82,57,44,47),
+(4,3,36,36,84,58,44,48),
+(4,3,37,36,86,59,45,48),
+(4,3,38,37,87,60,46,49),
+(4,3,39,38,89,62,47,50),
+(4,3,40,38,91,63,48,51),
+(4,3,41,39,93,64,49,52),
+(4,3,42,40,95,66,49,53),
+(4,3,43,40,97,67,50,54),
+(4,3,44,41,99,68,51,55),
+(4,3,45,42,101,70,52,56),
+(4,3,46,42,103,71,53,57),
+(4,3,47,43,105,72,54,58),
+(4,3,48,44,107,74,55,59),
+(4,3,49,45,109,75,56,60),
+(4,3,50,45,111,77,57,61),
+(4,3,51,46,113,78,58,62),
+(4,3,52,47,115,79,59,63),
+(4,3,53,47,118,81,60,64),
+(4,3,54,48,120,82,61,65),
+(4,3,55,49,122,84,61,66),
+(4,3,56,50,124,85,62,67),
+(4,3,57,50,126,87,63,68),
+(4,3,58,51,128,88,64,69),
+(4,3,59,52,131,90,65,70),
+(4,3,60,53,133,91,66,72),
+(4,3,61,54,135,93,67,73),
+(4,3,62,54,137,94,69,74),
+(4,3,63,55,140,96,70,75),
+(4,3,64,56,142,97,71,76),
+(4,3,65,57,144,99,72,77),
+(4,3,66,58,147,101,73,78),
+(4,3,67,58,149,102,74,79),
+(4,3,68,59,151,104,75,81),
+(4,3,69,60,154,105,76,82),
+(4,3,70,61,156,107,77,83),
+(4,3,71,62,159,109,78,84),
+(4,3,72,63,162,111,79,85),
+(4,3,73,64,165,113,80,87),
+(4,3,74,65,168,115,82,88),
+(4,3,75,66,171,117,83,90),
+(4,3,76,67,174,119,84,91),
+(4,3,77,68,177,121,86,93),
+(4,3,78,69,180,123,87,94),
+(4,3,79,70,190,125,91,96),
+(4,3,80,71,193,127,93,97),
+(4,4,1,18,28,20,20,20),
+(4,4,2,19,29,21,20,20),
+(4,4,3,20,31,21,20,21),
+(4,4,4,20,32,22,20,21),
+(4,4,5,21,34,23,21,21),
+(4,4,6,22,35,24,21,22),
+(4,4,7,23,37,24,21,22),
+(4,4,8,24,38,25,21,23),
+(4,4,9,24,40,26,21,23),
+(4,4,10,25,41,26,21,23),
+(4,4,11,26,43,27,22,24),
+(4,4,12,27,44,28,22,24),
+(4,4,13,28,46,29,22,25),
+(4,4,14,29,48,30,22,25),
+(4,4,15,29,49,30,22,25),
+(4,4,16,30,51,31,23,26),
+(4,4,17,31,52,32,23,26),
+(4,4,18,32,54,33,23,27),
+(4,4,19,33,56,34,23,27),
+(4,4,20,34,57,35,23,28),
+(4,4,21,35,59,35,24,28),
+(4,4,22,36,61,36,24,29),
+(4,4,23,37,63,37,24,29),
+(4,4,24,38,64,38,24,30),
+(4,4,25,39,66,39,25,30),
+(4,4,26,40,68,40,25,31),
+(4,4,27,41,70,41,25,31),
+(4,4,28,42,72,42,25,32),
+(4,4,29,43,73,43,25,32),
+(4,4,30,44,75,43,26,33),
+(4,4,31,45,77,44,26,33),
+(4,4,32,46,79,45,26,34),
+(4,4,33,47,81,46,27,34),
+(4,4,34,48,83,47,27,35),
+(4,4,35,49,85,48,27,35),
+(4,4,36,50,87,49,27,36),
+(4,4,37,51,89,50,28,36),
+(4,4,38,52,91,51,28,37),
+(4,4,39,53,93,52,28,38),
+(4,4,40,54,95,53,28,38),
+(4,4,41,56,97,54,29,39),
+(4,4,42,57,99,55,29,39),
+(4,4,43,58,101,56,29,40),
+(4,4,44,59,103,57,30,40),
+(4,4,45,60,105,59,30,41),
+(4,4,46,61,107,60,30,42),
+(4,4,47,62,109,61,31,42),
+(4,4,48,64,112,62,31,43),
+(4,4,49,65,114,63,31,44),
+(4,4,50,66,116,64,32,44),
+(4,4,51,67,118,65,32,45),
+(4,4,52,68,120,66,32,45),
+(4,4,53,70,123,67,33,46),
+(4,4,54,71,125,69,33,47),
+(4,4,55,72,127,70,33,47),
+(4,4,56,73,129,71,34,48),
+(4,4,57,75,132,72,34,49),
+(4,4,58,76,134,73,34,49),
+(4,4,59,77,136,74,35,50),
+(4,4,60,79,139,76,35,51),
+(4,4,61,80,141,77,35,51),
+(4,4,62,81,143,78,36,52),
+(4,4,63,82,146,79,36,53),
+(4,4,64,84,148,80,37,54),
+(4,4,65,85,151,82,37,54),
+(4,4,66,87,153,83,37,55),
+(4,4,67,88,156,84,38,56),
+(4,4,68,89,158,85,38,57),
+(4,4,69,91,160,87,39,57),
+(4,4,70,92,163,88,39,58),
+(4,4,71,94,166,90,39,59),
+(4,4,72,96,169,91,40,59),
+(4,4,73,97,172,93,40,60),
+(4,4,74,99,175,94,41,61),
+(4,4,75,101,178,96,41,62),
+(4,4,76,102,181,97,41,63),
+(4,4,77,104,184,99,42,64),
+(4,4,78,106,188,101,42,65),
+(4,4,79,108,191,102,43,66),
+(4,4,80,110,194,104,43,67),
+(4,5,1,17,25,19,22,23),
+(4,5,2,17,25,19,23,24),
+(4,5,3,17,25,20,25,26),
+(4,5,4,17,26,20,26,27),
+(4,5,5,18,26,20,27,28),
+(4,5,6,18,26,21,29,30),
+(4,5,7,18,26,21,30,31),
+(4,5,8,18,26,22,31,33),
+(4,5,9,18,27,22,33,34),
+(4,5,10,19,27,22,34,36),
+(4,5,11,19,27,23,36,37),
+(4,5,12,19,27,23,37,39),
+(4,5,13,19,28,24,38,40),
+(4,5,14,19,28,24,40,42),
+(4,5,15,19,28,25,41,43),
+(4,5,16,20,28,25,43,45),
+(4,5,17,20,29,25,44,46),
+(4,5,18,20,29,26,46,48),
+(4,5,19,20,29,26,47,49),
+(4,5,20,21,30,27,49,51),
+(4,5,21,21,30,27,51,53),
+(4,5,22,21,30,28,52,54),
+(4,5,23,21,30,28,54,56),
+(4,5,24,21,31,29,55,58),
+(4,5,25,22,31,29,57,59),
+(4,5,26,22,31,30,59,61),
+(4,5,27,22,32,30,60,63),
+(4,5,28,22,32,31,62,65),
+(4,5,29,23,32,31,64,66),
+(4,5,30,23,33,32,65,68),
+(4,5,31,23,33,32,67,70),
+(4,5,32,23,33,33,69,72),
+(4,5,33,24,34,33,70,73),
+(4,5,34,24,34,34,72,75),
+(4,5,35,24,34,34,74,77),
+(4,5,36,24,35,35,76,79),
+(4,5,37,25,35,35,78,81),
+(4,5,38,25,35,36,79,83),
+(4,5,39,25,36,37,81,85),
+(4,5,40,26,36,37,83,87),
+(4,5,41,26,37,38,85,88),
+(4,5,42,26,37,38,87,90),
+(4,5,43,27,37,39,89,92),
+(4,5,44,27,38,39,91,94),
+(4,5,45,27,38,40,92,96),
+(4,5,46,27,39,41,94,98),
+(4,5,47,28,39,41,96,100),
+(4,5,48,28,39,42,98,102),
+(4,5,49,28,40,43,100,104),
+(4,5,50,29,40,43,102,106),
+(4,5,51,29,41,44,104,109),
+(4,5,52,29,41,44,106,111),
+(4,5,53,30,42,45,108,113),
+(4,5,54,30,42,46,110,115),
+(4,5,55,30,43,46,112,117),
+(4,5,56,31,43,47,114,119),
+(4,5,57,31,43,48,117,121),
+(4,5,58,31,44,48,119,124),
+(4,5,59,32,44,49,121,126),
+(4,5,60,32,45,50,123,128),
+(4,5,61,33,45,51,125,130),
+(4,5,62,33,46,51,127,132),
+(4,5,63,33,46,52,129,135),
+(4,5,64,34,47,53,132,137),
+(4,5,65,34,47,53,134,139),
+(4,5,66,34,48,54,136,142),
+(4,5,67,35,48,55,138,144),
+(4,5,68,35,49,56,140,146),
+(4,5,69,36,49,56,143,149),
+(4,5,70,36,50,57,145,151),
+(4,5,71,36,51,58,148,161),
+(4,5,72,37,51,58,151,164),
+(4,5,73,37,52,59,154,168),
+(4,5,74,38,52,60,156,171),
+(4,5,75,38,53,61,159,174),
+(4,5,76,38,54,62,162,177),
+(4,5,77,39,54,63,165,180),
+(4,5,78,39,55,64,168,183),
+(4,5,79,40,55,65,171,186),
+(4,5,80,40,56,66,200,191),
+(4,6,1,20,25,21,20,20),
+(4,6,2,21,26,22,20,20),
+(4,6,3,23,27,23,20,21),
+(4,6,4,24,27,25,20,21),
+(4,6,5,25,28,26,20,21),
+(4,6,6,27,29,27,20,21),
+(4,6,7,28,30,28,21,22),
+(4,6,8,29,31,29,21,22),
+(4,6,9,31,31,31,21,22),
+(4,6,10,32,32,32,21,23),
+(4,6,11,33,33,33,21,23),
+(4,6,12,35,34,34,21,23),
+(4,6,13,36,35,36,21,24),
+(4,6,14,38,36,37,21,24),
+(4,6,15,39,37,38,21,24),
+(4,6,16,41,37,40,21,25),
+(4,6,17,42,38,41,22,25),
+(4,6,18,44,39,43,22,25),
+(4,6,19,45,40,44,22,26),
+(4,6,20,47,41,45,22,26),
+(4,6,21,48,42,47,22,26),
+(4,6,22,50,43,48,22,27),
+(4,6,23,52,44,50,22,27),
+(4,6,24,53,45,51,23,28),
+(4,6,25,55,46,52,23,28),
+(4,6,26,56,47,54,23,28),
+(4,6,27,58,48,55,23,29),
+(4,6,28,60,49,57,23,29),
+(4,6,29,61,50,58,23,30),
+(4,6,30,63,51,60,24,30),
+(4,6,31,65,52,62,24,30),
+(4,6,32,66,53,63,24,31),
+(4,6,33,68,54,65,24,31),
+(4,6,34,70,55,66,24,32),
+(4,6,35,72,56,68,24,32),
+(4,6,36,73,58,69,25,33),
+(4,6,37,75,59,71,25,33),
+(4,6,38,77,60,73,25,34),
+(4,6,39,79,61,74,25,34),
+(4,6,40,81,62,76,25,35),
+(4,6,41,82,63,78,26,35),
+(4,6,42,84,64,79,26,35),
+(4,6,43,86,66,81,26,36),
+(4,6,44,88,67,83,26,36),
+(4,6,45,90,68,85,26,37),
+(4,6,46,92,69,86,27,37),
+(4,6,47,94,70,88,27,38),
+(4,6,48,96,72,90,27,38),
+(4,6,49,98,73,92,27,39),
+(4,6,50,100,74,93,28,40),
+(4,6,51,101,75,94,28,40),
+(4,6,52,102,76,95,28,41),
+(4,6,53,103,77,96,28,41),
+(4,6,54,104,77,97,29,42),
+(4,6,55,105,78,98,29,42),
+(4,6,56,108,80,101,29,43),
+(4,6,57,113,81,103,29,43),
+(4,6,58,115,82,105,30,44),
+(4,6,59,115,84,107,30,44),
+(4,6,60,120,85,109,30,45),
+(4,6,61,122,86,111,30,46),
+(4,6,62,122,88,113,30,46),
+(4,6,63,127,89,116,31,47),
+(4,6,64,127,91,118,31,47),
+(4,6,65,133,92,120,31,48),
+(4,6,66,135,94,123,31,49),
+(4,6,67,136,95,125,32,49),
+(4,6,68,137,97,127,32,50),
+(4,6,69,140,98,130,32,51),
+(4,6,70,147,100,132,32,51),
+(4,6,71,154,102,135,33,52),
+(4,6,72,156,103,137,33,53),
+(4,6,73,157,105,140,33,54),
+(4,6,74,158,107,142,33,54),
+(4,6,75,161,108,145,34,55),
+(4,6,76,164,110,148,34,56),
+(4,6,77,167,112,150,34,57),
+(4,6,78,170,113,153,34,57),
+(4,6,79,172,115,156,35,58),
+(4,6,80,177,117,159,35,59),
+(4,11,1,18,25,19,22,22),
+(4,11,2,19,25,20,23,23),
+(4,11,3,19,26,20,24,24),
+(4,11,4,20,26,21,25,26),
+(4,11,5,20,27,22,26,27),
+(4,11,6,21,27,22,27,28),
+(4,11,7,21,28,23,28,29),
+(4,11,8,22,28,24,29,30),
+(4,11,9,23,29,24,30,32),
+(4,11,10,23,29,25,32,33),
+(4,11,11,24,30,26,33,34),
+(4,11,12,24,31,26,34,35),
+(4,11,13,25,31,27,35,37),
+(4,11,14,26,32,28,36,38),
+(4,11,15,26,32,29,37,39),
+(4,11,16,27,33,29,38,41),
+(4,11,17,28,33,30,40,42),
+(4,11,18,28,34,31,41,43),
+(4,11,19,29,35,32,42,45),
+(4,11,20,30,35,32,43,46),
+(4,11,21,30,36,33,45,48),
+(4,11,22,31,36,34,46,49),
+(4,11,23,32,37,35,47,51),
+(4,11,24,32,38,36,48,52),
+(4,11,25,33,38,36,50,53),
+(4,11,26,34,39,37,51,55),
+(4,11,27,35,40,38,52,56),
+(4,11,28,35,40,39,54,58),
+(4,11,29,36,41,40,55,59),
+(4,11,30,37,42,41,56,61),
+(4,11,31,38,42,42,58,62),
+(4,11,32,38,43,42,59,64),
+(4,11,33,39,44,43,60,66),
+(4,11,34,40,44,44,62,67),
+(4,11,35,41,45,45,63,69),
+(4,11,36,42,46,46,65,70),
+(4,11,37,42,47,47,66,72),
+(4,11,38,43,47,48,67,74),
+(4,11,39,44,48,49,69,75),
+(4,11,40,45,49,50,70,77),
+(4,11,41,46,50,51,72,79),
+(4,11,42,46,50,52,73,80),
+(4,11,43,47,51,53,75,82),
+(4,11,44,48,52,54,76,84),
+(4,11,45,49,53,55,78,85),
+(4,11,46,50,54,56,79,87),
+(4,11,47,51,54,57,81,89),
+(4,11,48,52,55,58,83,91),
+(4,11,49,53,56,59,84,93),
+(4,11,50,53,57,60,86,94),
+(4,11,51,54,58,61,87,96),
+(4,11,52,55,59,62,89,98),
+(4,11,53,56,59,63,91,100),
+(4,11,54,57,60,64,92,102),
+(4,11,55,58,61,65,94,103),
+(4,11,56,59,62,66,95,105),
+(4,11,57,60,63,67,97,107),
+(4,11,58,61,64,68,99,109),
+(4,11,59,62,65,69,101,111),
+(4,11,60,63,66,70,102,113),
+(4,11,61,64,66,72,104,115),
+(4,11,62,65,67,73,106,117),
+(4,11,63,66,68,74,107,119),
+(4,11,64,67,69,75,109,121),
+(4,11,65,68,70,76,111,123),
+(4,11,66,69,71,77,113,125),
+(4,11,67,70,72,78,115,127),
+(4,11,68,71,73,80,116,129),
+(4,11,69,72,74,81,118,131),
+(4,11,70,73,75,82,120,133),
+(4,11,71,75,76,83,122,135),
+(4,11,72,76,78,85,125,138),
+(4,11,73,77,79,86,127,140),
+(4,11,74,78,80,88,131,143),
+(4,11,75,80,81,89,133,145),
+(4,11,76,81,82,91,134,148),
+(4,11,77,82,83,92,136,151),
+(4,11,78,84,85,94,138,153),
+(4,11,79,85,86,95,141,156),
+(4,11,80,86,87,97,143,159),
+(5,1,1,22,18,23,18,25),
+(5,1,2,23,19,24,18,25),
+(5,1,3,25,20,25,18,26),
+(5,1,4,26,20,26,18,26),
+(5,1,5,27,21,28,18,26),
+(5,1,6,29,22,29,18,26),
+(5,1,7,30,23,30,19,27),
+(5,1,8,31,24,31,19,27),
+(5,1,9,33,25,33,19,27),
+(5,1,10,34,25,34,19,28),
+(5,1,11,35,26,35,19,28),
+(5,1,12,37,27,36,19,28),
+(5,1,13,38,28,38,19,28),
+(5,1,14,40,29,39,19,29),
+(5,1,15,41,30,40,19,29),
+(5,1,16,43,31,42,20,29),
+(5,1,17,44,32,43,20,30),
+(5,1,18,46,33,44,20,30),
+(5,1,19,47,34,46,20,31),
+(5,1,20,49,34,47,20,31),
+(5,1,21,50,35,49,20,31),
+(5,1,22,52,36,50,20,32),
+(5,1,23,53,37,51,21,32),
+(5,1,24,55,38,53,21,32),
+(5,1,25,57,39,54,21,33),
+(5,1,26,58,40,56,21,33),
+(5,1,27,60,41,57,21,34),
+(5,1,28,62,42,59,21,34),
+(5,1,29,63,43,60,21,34),
+(5,1,30,65,44,62,22,35),
+(5,1,31,67,46,63,22,35),
+(5,1,32,68,47,65,22,36),
+(5,1,33,70,48,67,22,36),
+(5,1,34,72,49,68,22,36),
+(5,1,35,74,50,70,23,37),
+(5,1,36,75,51,71,23,37),
+(5,1,37,77,52,73,23,38),
+(5,1,38,79,53,75,23,38),
+(5,1,39,81,54,76,23,39),
+(5,1,40,83,55,78,24,39),
+(5,1,41,84,57,80,24,40),
+(5,1,42,86,58,81,24,40),
+(5,1,43,88,59,83,24,41),
+(5,1,44,90,60,85,24,41),
+(5,1,45,92,61,86,25,42),
+(5,1,46,94,62,88,25,42),
+(5,1,47,96,64,90,25,43),
+(5,1,48,98,65,92,25,43),
+(5,1,49,100,66,93,25,44),
+(5,1,50,102,67,95,26,44),
+(5,1,51,104,69,97,26,45),
+(5,1,52,106,70,99,26,45),
+(5,1,53,108,71,101,26,46),
+(5,1,54,110,72,103,27,46),
+(5,1,55,112,74,104,27,47),
+(5,1,56,114,75,106,27,48),
+(5,1,57,116,76,108,27,48),
+(5,1,58,118,78,110,28,49),
+(5,1,59,120,79,112,28,49),
+(5,1,60,122,80,114,28,50),
+(5,1,61,124,82,116,28,50),
+(5,1,62,126,83,118,29,51),
+(5,1,63,128,84,120,29,52),
+(5,1,64,131,86,122,29,52),
+(5,1,65,133,87,124,30,53),
+(5,1,66,135,88,126,30,53),
+(5,1,67,137,90,128,30,54),
+(5,1,68,139,91,130,30,55),
+(5,1,69,142,93,132,31,55),
+(5,1,70,144,94,134,31,56),
+(5,1,71,147,95,136,31,57),
+(5,1,72,150,97,139,31,58),
+(5,1,73,152,99,141,31,59),
+(5,1,74,155,100,144,32,59),
+(5,1,75,158,102,146,32,60),
+(5,1,76,163,104,149,32,61),
+(5,1,77,167,106,152,33,62),
+(5,1,78,167,107,154,33,62),
+(5,1,79,170,109,157,33,63),
+(5,1,80,173,111,160,34,64),
+(5,4,1,20,21,22,18,25),
+(5,4,2,21,22,23,18,25),
+(5,4,3,22,24,23,18,26),
+(5,4,4,22,25,24,18,26),
+(5,4,5,23,27,25,19,26),
+(5,4,6,24,28,25,19,27),
+(5,4,7,25,30,26,19,27),
+(5,4,8,25,31,27,19,27),
+(5,4,9,26,33,28,19,28),
+(5,4,10,27,34,28,19,28),
+(5,4,11,28,36,29,20,29),
+(5,4,12,29,38,30,20,29),
+(5,4,13,30,39,31,20,29),
+(5,4,14,31,41,32,20,30),
+(5,4,15,31,42,32,20,30),
+(5,4,16,32,44,33,21,31),
+(5,4,17,33,46,34,21,31),
+(5,4,18,34,47,35,21,32),
+(5,4,19,35,49,36,21,32),
+(5,4,20,36,51,36,21,32),
+(5,4,21,37,52,37,22,33),
+(5,4,22,38,54,38,22,33),
+(5,4,23,39,56,39,22,34),
+(5,4,24,40,58,40,22,34),
+(5,4,25,41,60,41,23,35),
+(5,4,26,42,61,42,23,35),
+(5,4,27,43,63,43,23,36),
+(5,4,28,44,65,44,23,36),
+(5,4,29,45,67,44,24,37),
+(5,4,30,46,69,45,24,37),
+(5,4,31,47,71,46,24,38),
+(5,4,32,48,72,47,24,38),
+(5,4,33,49,74,48,25,39),
+(5,4,34,50,76,49,25,39),
+(5,4,35,51,78,50,25,40),
+(5,4,36,52,80,51,25,41),
+(5,4,37,53,82,52,26,41),
+(5,4,38,54,84,53,26,42),
+(5,4,39,55,86,54,26,42),
+(5,4,40,56,88,55,27,43),
+(5,4,41,57,90,56,27,43),
+(5,4,42,59,92,57,27,44),
+(5,4,43,60,94,58,27,45),
+(5,4,44,61,96,59,28,45),
+(5,4,45,62,99,60,28,46),
+(5,4,46,63,101,61,28,46),
+(5,4,47,64,103,63,29,47),
+(5,4,48,66,105,64,29,48),
+(5,4,49,67,107,65,29,48),
+(5,4,50,68,109,66,30,49),
+(5,4,51,69,111,67,30,50),
+(5,4,52,70,114,68,30,50),
+(5,4,53,72,116,69,31,51),
+(5,4,54,73,118,70,31,52),
+(5,4,55,74,120,72,31,52),
+(5,4,56,75,123,73,32,53),
+(5,4,57,77,125,74,32,54),
+(5,4,58,78,127,75,32,54),
+(5,4,59,79,130,76,33,55),
+(5,4,60,81,132,77,33,56),
+(5,4,61,82,134,79,34,56),
+(5,4,62,83,137,80,34,57),
+(5,4,63,84,139,81,34,58),
+(5,4,64,86,141,82,35,59),
+(5,4,65,87,144,84,35,59),
+(5,4,66,88,146,85,35,60),
+(5,4,67,90,149,86,36,61),
+(5,4,68,91,151,87,36,61),
+(5,4,69,93,154,89,37,62),
+(5,4,70,94,156,90,37,63),
+(5,4,71,96,159,91,37,64),
+(5,4,72,98,162,93,38,64),
+(5,4,73,99,165,95,38,65),
+(5,4,74,101,168,96,39,66),
+(5,4,75,103,171,98,39,67),
+(5,4,76,104,174,99,39,68),
+(5,4,77,106,177,101,40,69),
+(5,4,78,108,181,103,40,70),
+(5,4,79,110,184,104,41,71),
+(5,4,80,112,187,106,41,72),
+(5,5,1,19,18,21,20,28),
+(5,5,2,19,18,21,21,29),
+(5,5,3,19,18,22,23,31),
+(5,5,4,19,19,22,24,32),
+(5,5,5,20,19,22,25,33),
+(5,5,6,20,19,23,27,35),
+(5,5,7,20,19,23,28,36),
+(5,5,8,20,20,24,29,38),
+(5,5,9,20,20,24,31,39),
+(5,5,10,20,20,24,32,40),
+(5,5,11,21,20,25,34,42),
+(5,5,12,21,21,25,35,43),
+(5,5,13,21,21,26,37,45),
+(5,5,14,21,21,26,38,46),
+(5,5,15,21,21,26,39,48),
+(5,5,16,22,22,27,41,50),
+(5,5,17,22,22,27,42,51),
+(5,5,18,22,22,28,44,53),
+(5,5,19,22,23,28,46,54),
+(5,5,20,22,23,29,47,56),
+(5,5,21,23,23,29,49,57),
+(5,5,22,23,23,30,50,59),
+(5,5,23,23,24,30,52,61),
+(5,5,24,23,24,31,53,62),
+(5,5,25,24,24,31,55,64),
+(5,5,26,24,25,32,57,66),
+(5,5,27,24,25,32,58,68),
+(5,5,28,24,25,33,60,69),
+(5,5,29,25,26,33,62,71),
+(5,5,30,25,26,34,63,73),
+(5,5,31,25,26,34,65,75),
+(5,5,32,25,27,35,67,76),
+(5,5,33,26,27,35,69,78),
+(5,5,34,26,27,36,70,80),
+(5,5,35,26,28,36,72,82),
+(5,5,36,26,28,37,74,84),
+(5,5,37,27,28,37,76,86),
+(5,5,38,27,29,38,77,87),
+(5,5,39,27,29,38,79,89),
+(5,5,40,28,30,39,81,91),
+(5,5,41,28,30,40,83,93),
+(5,5,42,28,30,40,85,95),
+(5,5,43,28,31,41,87,97),
+(5,5,44,29,31,41,89,99),
+(5,5,45,29,32,42,91,101),
+(5,5,46,29,32,43,92,103),
+(5,5,47,30,32,43,94,105),
+(5,5,48,30,33,44,96,107),
+(5,5,49,30,33,44,98,109),
+(5,5,50,31,34,45,100,111),
+(5,5,51,31,34,46,102,113),
+(5,5,52,31,35,46,104,115),
+(5,5,53,32,35,47,106,118),
+(5,5,54,32,35,48,108,120),
+(5,5,55,32,36,48,110,122),
+(5,5,56,33,36,49,113,124),
+(5,5,57,33,37,50,115,126),
+(5,5,58,33,37,50,117,128),
+(5,5,59,34,38,51,119,131),
+(5,5,60,34,38,52,121,133),
+(5,5,61,34,39,52,123,135),
+(5,5,62,35,39,53,125,137),
+(5,5,63,35,40,54,127,140),
+(5,5,64,36,40,55,130,142),
+(5,5,65,36,41,55,132,144),
+(5,5,66,36,41,56,134,147),
+(5,5,67,37,41,57,136,149),
+(5,5,68,37,42,58,138,151),
+(5,5,69,38,42,58,141,154),
+(5,5,70,38,43,59,143,156),
+(5,5,71,38,44,60,146,159),
+(5,5,72,39,44,60,149,162),
+(5,5,73,39,45,61,152,165),
+(5,5,74,40,45,62,157,168),
+(5,5,75,40,46,63,157,171),
+(5,5,76,40,47,64,160,174),
+(5,5,77,41,47,65,163,177),
+(5,5,78,41,48,66,166,180),
+(5,5,79,42,48,67,169,183),
+(5,5,80,42,49,68,172,186),
+(5,6,1,22,18,23,18,25),
+(5,6,2,23,19,24,18,25),
+(5,6,3,25,20,25,18,26),
+(5,6,4,26,20,26,18,26),
+(5,6,5,27,21,28,18,26),
+(5,6,6,29,22,29,18,26),
+(5,6,7,30,23,30,19,27),
+(5,6,8,31,24,31,19,27),
+(5,6,9,33,25,33,19,27),
+(5,6,10,34,25,34,19,28),
+(5,6,11,35,26,35,19,28),
+(5,6,12,37,27,36,19,28),
+(5,6,13,38,28,38,19,28),
+(5,6,14,40,29,39,19,29),
+(5,6,15,41,30,40,19,29),
+(5,6,16,43,31,42,20,29),
+(5,6,17,44,32,43,20,30),
+(5,6,18,46,33,44,20,30),
+(5,6,19,47,34,46,20,31),
+(5,6,20,49,34,47,20,31),
+(5,6,21,50,35,49,20,31),
+(5,6,22,52,36,50,20,32),
+(5,6,23,53,37,51,21,32),
+(5,6,24,55,38,53,21,32),
+(5,6,25,57,39,54,21,33),
+(5,6,26,58,40,56,21,33),
+(5,6,27,60,41,57,21,34),
+(5,6,28,62,42,59,21,34),
+(5,6,29,63,43,60,21,34),
+(5,6,30,65,44,62,22,35),
+(5,6,31,67,46,63,22,35),
+(5,6,32,68,47,65,22,36),
+(5,6,33,70,48,67,22,36),
+(5,6,34,72,49,68,22,36),
+(5,6,35,74,50,70,23,37),
+(5,6,36,75,51,71,23,37),
+(5,6,37,77,52,73,23,38),
+(5,6,38,79,53,75,23,38),
+(5,6,39,81,54,76,23,39),
+(5,6,40,83,55,78,24,39),
+(5,6,41,84,57,80,24,40),
+(5,6,42,86,58,81,24,40),
+(5,6,43,88,59,83,24,41),
+(5,6,44,90,60,85,24,41),
+(5,6,45,92,61,86,25,42),
+(5,6,46,94,62,88,25,42),
+(5,6,47,96,64,90,25,43),
+(5,6,48,98,65,92,25,43),
+(5,6,49,100,66,93,25,44),
+(5,6,50,102,67,95,26,44),
+(5,6,51,103,67,96,26,45),
+(5,6,52,104,68,97,26,45),
+(5,6,53,105,69,98,26,46),
+(5,6,54,106,70,99,27,46),
+(5,6,55,107,71,100,27,47),
+(5,6,56,110,73,103,27,48),
+(5,6,57,112,74,105,27,48),
+(5,6,58,114,75,107,28,49),
+(5,6,59,119,77,109,28,49),
+(5,6,60,122,78,111,28,50),
+(5,6,61,124,79,113,28,51),
+(5,6,62,127,81,115,28,51),
+(5,6,63,129,82,118,29,52),
+(5,6,64,136,84,120,29,52),
+(5,6,65,137,85,123,29,53),
+(5,6,66,138,87,125,29,54),
+(5,6,67,141,88,127,30,54),
+(5,6,68,143,90,129,30,55),
+(5,6,69,146,91,132,30,56),
+(5,6,70,149,93,134,30,56),
+(5,6,71,152,95,137,31,57),
+(5,6,72,154,96,139,31,58),
+(5,6,73,157,98,142,31,59),
+(5,6,74,158,100,145,31,59),
+(5,6,75,159,101,147,32,60),
+(5,6,76,162,103,150,32,61),
+(5,6,77,167,105,152,32,62),
+(5,6,78,173,106,155,32,62),
+(5,6,79,174,108,158,33,63),
+(5,6,80,174,110,161,33,64),
+(5,8,1,19,18,21,21,27),
+(5,8,2,19,18,21,22,28),
+(5,8,3,19,18,22,24,30),
+(5,8,4,19,18,22,25,31),
+(5,8,5,19,19,22,26,32),
+(5,8,6,19,19,22,28,34),
+(5,8,7,20,19,23,29,35),
+(5,8,8,20,19,23,31,36),
+(5,8,9,20,19,23,32,38),
+(5,8,10,20,19,24,34,39),
+(5,8,11,20,20,24,35,40),
+(5,8,12,20,20,24,37,42),
+(5,8,13,20,20,25,38,43),
+(5,8,14,20,20,25,40,45),
+(5,8,15,20,20,25,41,46),
+(5,8,16,21,21,26,43,48),
+(5,8,17,21,21,26,44,49),
+(5,8,18,21,21,26,46,51),
+(5,8,19,21,21,27,48,52),
+(5,8,20,21,21,27,49,54),
+(5,8,21,21,22,27,51,55),
+(5,8,22,21,22,28,52,57),
+(5,8,23,21,22,28,54,58),
+(5,8,24,22,22,29,56,60),
+(5,8,25,22,23,29,57,62),
+(5,8,26,22,23,29,59,63),
+(5,8,27,22,23,30,61,65),
+(5,8,28,22,23,30,63,67),
+(5,8,29,22,24,31,64,68),
+(5,8,30,23,24,31,66,70),
+(5,8,31,23,24,31,68,72),
+(5,8,32,23,24,32,70,73),
+(5,8,33,23,25,32,72,75),
+(5,8,34,23,25,33,73,77),
+(5,8,35,24,25,33,75,79),
+(5,8,36,24,25,34,77,80),
+(5,8,37,24,26,34,79,82),
+(5,8,38,24,26,35,81,84),
+(5,8,39,24,26,35,83,86),
+(5,8,40,24,27,35,85,88),
+(5,8,41,25,27,36,87,90),
+(5,8,42,25,27,36,89,91),
+(5,8,43,25,27,37,90,93),
+(5,8,44,25,28,37,92,95),
+(5,8,45,26,28,38,94,97),
+(5,8,46,26,28,38,96,99),
+(5,8,47,26,29,39,98,101),
+(5,8,48,26,29,39,100,103),
+(5,8,49,26,29,40,103,105),
+(5,8,50,27,30,40,105,107),
+(5,8,51,27,30,41,107,109),
+(5,8,52,27,30,42,109,111),
+(5,8,53,27,31,42,111,113),
+(5,8,54,28,31,43,113,115),
+(5,8,55,28,31,43,115,117),
+(5,8,56,28,32,44,117,119),
+(5,8,57,28,32,44,119,121),
+(5,8,58,29,32,45,122,123),
+(5,8,59,29,33,45,124,126),
+(5,8,60,29,33,46,126,128),
+(5,8,61,29,34,47,128,130),
+(5,8,62,30,34,47,131,132),
+(5,8,63,30,34,48,133,134),
+(5,8,64,30,35,48,135,136),
+(5,8,65,31,35,49,137,139),
+(5,8,66,31,35,50,140,141),
+(5,8,67,31,36,50,142,143),
+(5,8,68,31,36,51,144,145),
+(5,8,69,32,37,51,147,148),
+(5,8,70,32,37,52,149,150),
+(5,8,71,32,37,53,152,153),
+(5,8,72,32,38,54,155,156),
+(5,8,73,32,38,55,158,159),
+(5,8,74,33,39,55,161,161),
+(5,8,75,33,39,56,164,164),
+(5,8,76,33,39,57,167,167),
+(5,8,77,34,40,58,170,170),
+(5,8,78,34,40,58,173,173),
+(5,8,79,34,41,59,176,176),
+(5,8,80,35,41,60,179,179),
+(5,9,1,19,18,22,20,27),
+(5,9,2,19,18,23,21,28),
+(5,9,3,20,19,23,22,29),
+(5,9,4,20,19,24,24,30),
+(5,9,5,20,19,24,25,32),
+(5,9,6,20,20,25,26,33),
+(5,9,7,21,20,25,27,34),
+(5,9,8,21,21,26,28,35),
+(5,9,9,21,21,26,30,36),
+(5,9,10,22,21,27,31,38),
+(5,9,11,22,22,28,32,39),
+(5,9,12,22,22,28,34,40),
+(5,9,13,23,23,29,35,41),
+(5,9,14,23,23,30,36,43),
+(5,9,15,23,24,30,37,44),
+(5,9,16,24,24,31,39,45),
+(5,9,17,24,24,31,40,47),
+(5,9,18,24,25,32,42,48),
+(5,9,19,25,25,33,43,49),
+(5,9,20,25,26,33,44,51),
+(5,9,21,26,26,34,46,52),
+(5,9,22,26,27,35,47,53),
+(5,9,23,26,27,36,49,55),
+(5,9,24,27,28,36,50,56),
+(5,9,25,27,28,37,52,58),
+(5,9,26,27,29,38,53,59),
+(5,9,27,28,29,38,55,60),
+(5,9,28,28,30,39,56,62),
+(5,9,29,29,30,40,58,63),
+(5,9,30,29,31,41,59,65),
+(5,9,31,30,31,41,61,66),
+(5,9,32,30,32,42,62,68),
+(5,9,33,30,32,43,64,69),
+(5,9,34,31,33,44,65,71),
+(5,9,35,31,33,45,67,73),
+(5,9,36,32,34,45,69,74),
+(5,9,37,32,34,46,70,76),
+(5,9,38,33,35,47,72,77),
+(5,9,39,33,36,48,73,79),
+(5,9,40,34,36,49,75,81),
+(5,9,41,34,37,49,77,82),
+(5,9,42,35,37,50,78,84),
+(5,9,43,35,38,51,80,86),
+(5,9,44,36,39,52,82,87),
+(5,9,45,36,39,53,84,89),
+(5,9,46,37,40,54,85,91),
+(5,9,47,37,40,55,87,92),
+(5,9,48,38,41,55,89,94),
+(5,9,49,38,42,56,91,96),
+(5,9,50,39,42,57,92,98),
+(5,9,51,39,43,58,94,100),
+(5,9,52,40,44,59,96,101),
+(5,9,53,40,44,60,98,103),
+(5,9,54,41,45,61,100,105),
+(5,9,55,41,45,62,102,107),
+(5,9,56,42,46,63,103,109),
+(5,9,57,42,47,64,105,111),
+(5,9,58,43,47,65,107,112),
+(5,9,59,43,48,66,109,114),
+(5,9,60,44,49,67,111,116),
+(5,9,61,45,50,68,113,118),
+(5,9,62,45,50,69,115,120),
+(5,9,63,46,51,70,117,122),
+(5,9,64,46,52,71,119,124),
+(5,9,65,47,52,72,121,126),
+(5,9,66,48,53,73,123,128),
+(5,9,67,48,54,74,125,130),
+(5,9,68,49,55,75,127,132),
+(5,9,69,49,55,76,129,134),
+(5,9,70,50,56,77,131,136),
+(5,9,71,51,57,86,135,147),
+(5,9,72,52,57,88,136,149),
+(5,9,73,53,58,89,138,152),
+(5,9,74,53,59,90,141,155),
+(5,9,75,54,60,92,143,157),
+(5,9,76,55,61,93,146,160),
+(5,9,77,56,62,94,149,163),
+(5,9,78,56,63,96,151,166),
+(5,9,79,57,64,97,154,169),
+(5,9,80,58,65,99,157,171),
+(6,1,1,28,15,24,15,22),
+(6,1,2,29,16,25,15,22),
+(6,1,3,31,17,26,15,23),
+(6,1,4,32,17,27,15,23),
+(6,1,5,33,18,29,15,23),
+(6,1,6,34,19,30,15,23),
+(6,1,7,36,20,31,16,24),
+(6,1,8,37,21,32,16,24),
+(6,1,9,38,22,34,16,24),
+(6,1,10,40,22,35,16,25),
+(6,1,11,41,23,36,16,25),
+(6,1,12,43,24,37,16,25),
+(6,1,13,44,25,39,16,26),
+(6,1,14,46,26,40,16,26),
+(6,1,15,47,27,41,17,26),
+(6,1,16,48,28,43,17,27),
+(6,1,17,50,29,44,17,27),
+(6,1,18,51,30,45,17,27),
+(6,1,19,53,31,47,17,28),
+(6,1,20,54,32,48,17,28),
+(6,1,21,56,33,50,17,28),
+(6,1,22,58,34,51,18,29),
+(6,1,23,59,35,52,18,29),
+(6,1,24,61,36,54,18,30),
+(6,1,25,62,37,55,18,30),
+(6,1,26,64,38,57,18,30),
+(6,1,27,66,39,58,18,31),
+(6,1,28,67,40,60,18,31),
+(6,1,29,69,41,61,19,32),
+(6,1,30,71,42,63,19,32),
+(6,1,31,72,43,64,19,32),
+(6,1,32,74,44,66,19,33),
+(6,1,33,76,45,67,19,33),
+(6,1,34,77,46,69,20,34),
+(6,1,35,79,47,71,20,34),
+(6,1,36,81,48,72,20,35),
+(6,1,37,83,49,74,20,35),
+(6,1,38,85,50,76,20,35),
+(6,1,39,86,51,77,21,36),
+(6,1,40,88,53,79,21,36),
+(6,1,41,90,54,81,21,37),
+(6,1,42,92,55,82,21,37),
+(6,1,43,94,56,84,21,38),
+(6,1,44,96,57,86,22,38),
+(6,1,45,98,58,87,22,39),
+(6,1,46,99,60,89,22,39),
+(6,1,47,101,61,91,22,40),
+(6,1,48,103,62,93,22,40),
+(6,1,49,105,63,94,23,41),
+(6,1,50,107,65,96,23,41),
+(6,1,51,109,66,98,23,42),
+(6,1,52,111,67,100,23,42),
+(6,1,53,113,68,102,24,43),
+(6,1,54,115,70,104,24,44),
+(6,1,55,117,71,105,24,44),
+(6,1,56,119,72,107,24,45),
+(6,1,57,122,73,109,25,45),
+(6,1,58,124,75,111,25,46),
+(6,1,59,126,76,113,25,46),
+(6,1,60,128,77,115,25,47),
+(6,1,61,130,79,117,26,48),
+(6,1,62,132,80,119,26,48),
+(6,1,63,134,81,121,26,49),
+(6,1,64,137,83,123,26,49),
+(6,1,65,139,84,125,27,50),
+(6,1,66,141,85,127,27,51),
+(6,1,67,143,87,129,27,51),
+(6,1,68,145,88,131,27,52),
+(6,1,69,148,90,133,28,52),
+(6,1,70,150,91,135,28,53),
+(6,1,71,153,92,137,28,54),
+(6,1,72,155,94,140,28,55),
+(6,1,73,158,96,142,28,56),
+(6,1,74,161,97,145,29,56),
+(6,1,75,164,99,147,29,57),
+(6,1,76,167,101,150,29,58),
+(6,1,77,170,103,153,30,59),
+(6,1,78,173,104,155,30,59),
+(6,1,79,176,106,164,30,60),
+(6,1,80,179,108,170,31,61),
+(6,3,1,25,18,23,15,23),
+(6,3,2,25,19,24,16,24),
+(6,3,3,26,21,25,16,24),
+(6,3,4,26,22,26,17,25),
+(6,3,5,27,24,27,17,25),
+(6,3,6,27,25,28,18,26),
+(6,3,7,28,26,28,19,27),
+(6,3,8,28,28,29,19,27),
+(6,3,9,28,29,30,20,28),
+(6,3,10,29,31,31,20,29),
+(6,3,11,29,32,32,21,29),
+(6,3,12,30,34,33,22,30),
+(6,3,13,30,35,34,22,31),
+(6,3,14,31,37,35,23,32),
+(6,3,15,31,38,36,24,32),
+(6,3,16,32,40,37,24,33),
+(6,3,17,32,41,39,25,34),
+(6,3,18,33,43,40,26,35),
+(6,3,19,33,45,41,27,35),
+(6,3,20,34,46,42,27,36),
+(6,3,21,34,48,43,28,37),
+(6,3,22,35,50,44,29,38),
+(6,3,23,35,51,45,29,38),
+(6,3,24,36,53,46,30,39),
+(6,3,25,37,55,47,31,40),
+(6,3,26,37,56,48,32,41),
+(6,3,27,38,58,50,32,42),
+(6,3,28,38,60,51,33,42),
+(6,3,29,39,62,52,34,43),
+(6,3,30,39,63,53,35,44),
+(6,3,31,40,65,54,36,45),
+(6,3,32,41,67,56,36,46),
+(6,3,33,41,69,57,37,47),
+(6,3,34,42,71,58,38,48),
+(6,3,35,43,72,59,39,48),
+(6,3,36,43,74,61,40,49),
+(6,3,37,44,76,62,40,50),
+(6,3,38,45,78,63,41,51),
+(6,3,39,45,80,64,42,52),
+(6,3,40,46,82,66,43,53),
+(6,3,41,47,84,67,44,54),
+(6,3,42,47,86,68,45,55),
+(6,3,43,48,88,70,46,56),
+(6,3,44,49,90,71,46,57),
+(6,3,45,49,92,72,47,58),
+(6,3,46,50,94,74,48,59),
+(6,3,47,51,96,75,49,60),
+(6,3,48,51,98,77,50,61),
+(6,3,49,52,100,78,51,62),
+(6,3,50,53,102,79,52,63),
+(6,3,51,54,104,81,53,64),
+(6,3,52,54,106,82,54,65),
+(6,3,53,55,108,84,55,66),
+(6,3,54,56,110,85,56,67),
+(6,3,55,57,112,87,57,68),
+(6,3,56,57,114,88,58,69),
+(6,3,57,58,117,90,59,70),
+(6,3,58,59,119,91,60,71),
+(6,3,59,60,121,93,61,72),
+(6,3,60,61,123,94,62,74),
+(6,3,61,61,125,96,63,75),
+(6,3,62,62,128,97,64,76),
+(6,3,63,63,130,99,65,77),
+(6,3,64,64,132,100,66,78),
+(6,3,65,65,134,102,67,79),
+(6,3,66,66,137,104,68,80),
+(6,3,67,66,139,105,69,81),
+(6,3,68,67,141,107,70,83),
+(6,3,69,68,144,108,71,84),
+(6,3,70,69,146,110,72,85),
+(6,3,71,70,149,112,73,86),
+(6,3,72,71,152,114,74,87),
+(6,3,73,72,155,116,75,89),
+(6,3,74,73,158,118,77,90),
+(6,3,75,74,161,120,78,92),
+(6,3,76,75,164,122,79,93),
+(6,3,77,76,167,124,81,95),
+(6,3,78,77,176,126,85,96),
+(6,3,79,78,179,128,86,98),
+(6,3,80,79,183,130,88,99),
+(6,6,1,28,15,24,15,22),
+(6,6,2,29,16,25,15,22),
+(6,6,3,31,17,26,15,23),
+(6,6,4,32,17,27,15,23),
+(6,6,5,33,18,29,15,23),
+(6,6,6,34,19,30,15,23),
+(6,6,7,36,20,31,16,24),
+(6,6,8,37,21,32,16,24),
+(6,6,9,38,22,34,16,24),
+(6,6,10,40,22,35,16,25),
+(6,6,11,41,23,36,16,25),
+(6,6,12,43,24,37,16,25),
+(6,6,13,44,25,39,16,26),
+(6,6,14,46,26,40,16,26),
+(6,6,15,47,27,41,17,26),
+(6,6,16,48,28,43,17,27),
+(6,6,17,50,29,44,17,27),
+(6,6,18,51,30,45,17,27),
+(6,6,19,53,31,47,17,28),
+(6,6,20,54,32,48,17,28),
+(6,6,21,56,33,50,17,28),
+(6,6,22,58,34,51,18,29),
+(6,6,23,59,35,52,18,29),
+(6,6,24,61,36,54,18,30),
+(6,6,25,62,37,55,18,30),
+(6,6,26,64,38,57,18,30),
+(6,6,27,66,39,58,18,31),
+(6,6,28,67,40,60,18,31),
+(6,6,29,69,41,61,19,32),
+(6,6,30,71,42,63,19,32),
+(6,6,31,72,43,64,19,32),
+(6,6,32,74,44,66,19,33),
+(6,6,33,76,45,67,19,33),
+(6,6,34,77,46,69,20,34),
+(6,6,35,79,47,71,20,34),
+(6,6,36,81,48,72,20,35),
+(6,6,37,83,49,74,20,35),
+(6,6,38,85,50,76,20,35),
+(6,6,39,86,51,77,21,36),
+(6,6,40,88,53,79,21,36),
+(6,6,41,90,54,81,21,37),
+(6,6,42,92,55,82,21,37),
+(6,6,43,94,56,84,21,38),
+(6,6,44,96,57,86,22,38),
+(6,6,45,98,58,87,22,39),
+(6,6,46,99,60,89,22,39),
+(6,6,47,101,60,91,22,40),
+(6,6,48,103,61,93,22,40),
+(6,6,49,105,62,94,23,41),
+(6,6,50,107,63,96,23,41),
+(6,6,51,109,64,97,23,42),
+(6,6,52,110,65,98,23,42),
+(6,6,53,111,66,99,24,43),
+(6,6,54,112,67,100,24,44),
+(6,6,55,113,68,101,24,44),
+(6,6,56,116,70,104,24,45),
+(6,6,57,121,71,106,24,45),
+(6,6,58,123,72,108,25,46),
+(6,6,59,123,74,110,25,46),
+(6,6,60,125,75,112,25,47),
+(6,6,61,127,76,114,25,48),
+(6,6,62,133,78,116,25,48),
+(6,6,63,135,79,119,26,49),
+(6,6,64,139,81,121,26,49),
+(6,6,65,142,82,123,26,50),
+(6,6,66,146,84,126,26,51),
+(6,6,67,150,85,132,27,51),
+(6,6,68,153,87,137,27,52),
+(6,6,69,157,88,140,27,53),
+(6,6,70,160,90,143,27,53),
+(6,6,71,163,92,146,28,54),
+(6,6,72,165,93,148,28,55),
+(6,6,73,167,95,150,28,56),
+(6,6,74,171,97,153,28,56),
+(6,6,75,174,98,156,29,57),
+(6,6,76,178,100,156,29,58),
+(6,6,77,179,102,156,29,59),
+(6,6,78,179,103,156,29,59),
+(6,6,79,182,105,159,30,60),
+(6,6,80,185,107,162,30,61),
+(6,7,1,26,15,23,16,24),
+(6,7,2,27,15,24,17,25),
+(6,7,3,28,16,25,18,26),
+(6,7,4,28,16,26,19,27),
+(6,7,5,29,17,27,20,28),
+(6,7,6,30,17,28,21,29),
+(6,7,7,31,18,29,22,30),
+(6,7,8,32,18,30,23,31),
+(6,7,9,33,19,31,24,32),
+(6,7,10,34,19,32,25,33),
+(6,7,11,35,20,33,26,35),
+(6,7,12,35,20,34,27,36),
+(6,7,13,36,21,35,28,37),
+(6,7,14,37,21,36,29,38),
+(6,7,15,38,22,37,30,39),
+(6,7,16,39,22,39,31,40),
+(6,7,17,40,23,40,32,42),
+(6,7,18,41,23,41,33,43),
+(6,7,19,42,24,42,34,44),
+(6,7,20,43,24,43,35,45),
+(6,7,21,44,25,44,36,46),
+(6,7,22,45,25,45,37,48),
+(6,7,23,46,26,47,38,49),
+(6,7,24,47,27,48,40,50),
+(6,7,25,48,27,49,41,51),
+(6,7,26,49,28,50,42,53),
+(6,7,27,51,28,52,43,54),
+(6,7,28,52,29,53,44,55),
+(6,7,29,53,29,54,45,57),
+(6,7,30,54,30,55,47,58),
+(6,7,31,55,31,57,48,59),
+(6,7,32,56,31,58,49,61),
+(6,7,33,57,32,59,50,62),
+(6,7,34,58,33,61,51,64),
+(6,7,35,60,33,62,53,65),
+(6,7,36,61,34,63,54,66),
+(6,7,37,62,34,65,55,68),
+(6,7,38,63,35,66,57,69),
+(6,7,39,64,36,67,58,71),
+(6,7,40,66,36,69,59,72),
+(6,7,41,67,37,70,60,74),
+(6,7,42,68,38,72,62,75),
+(6,7,43,69,38,73,63,77),
+(6,7,44,70,39,74,64,78),
+(6,7,45,72,40,76,66,80),
+(6,7,46,73,41,77,67,81),
+(6,7,47,74,41,79,69,83),
+(6,7,48,76,42,80,70,84),
+(6,7,49,77,43,82,71,86),
+(6,7,50,78,43,83,73,88),
+(6,7,51,80,44,85,74,89),
+(6,7,52,81,45,86,76,91),
+(6,7,53,82,46,88,77,92),
+(6,7,54,84,46,90,78,94),
+(6,7,55,85,47,91,80,96),
+(6,7,56,86,48,93,81,97),
+(6,7,57,88,49,94,83,99),
+(6,7,58,89,49,96,84,101),
+(6,7,59,91,50,97,86,102),
+(6,7,60,92,51,99,87,104),
+(6,7,61,94,52,101,89,106),
+(6,7,62,95,52,102,90,108),
+(6,7,63,96,53,104,92,109),
+(6,7,64,98,54,106,93,111),
+(6,7,65,99,55,107,95,113),
+(6,7,66,101,56,109,97,115),
+(6,7,67,102,57,111,98,117),
+(6,7,68,104,57,113,100,118),
+(6,7,69,105,58,114,101,120),
+(6,7,70,107,59,116,103,122),
+(6,7,71,108,60,118,113,124),
+(6,7,72,110,61,120,117,127),
+(6,7,73,112,62,122,119,129),
+(6,7,74,114,63,125,122,131),
+(6,7,75,116,64,127,124,133),
+(6,7,76,118,65,129,126,136),
+(6,7,77,119,66,131,128,138),
+(6,7,78,121,67,133,130,140),
+(6,7,79,123,68,136,133,143),
+(6,7,80,125,69,138,135,145),
+(6,11,1,26,15,22,17,24),
+(6,11,2,27,16,23,18,25),
+(6,11,3,27,16,23,19,26),
+(6,11,4,28,17,24,20,27),
+(6,11,5,28,17,25,21,29),
+(6,11,6,29,18,25,22,30),
+(6,11,7,29,18,26,23,31),
+(6,11,8,30,19,27,24,32),
+(6,11,9,30,19,27,26,34),
+(6,11,10,31,20,28,27,35),
+(6,11,11,32,20,29,28,36),
+(6,11,12,32,21,29,29,37),
+(6,11,13,33,21,30,30,39),
+(6,11,14,33,22,31,31,40),
+(6,11,15,34,23,32,32,41),
+(6,11,16,35,23,32,34,43),
+(6,11,17,35,24,33,35,44),
+(6,11,18,36,24,34,36,45),
+(6,11,19,37,25,35,37,47),
+(6,11,20,37,26,35,39,48),
+(6,11,21,38,26,36,40,50),
+(6,11,22,39,27,37,41,51),
+(6,11,23,39,28,38,42,52),
+(6,11,24,40,28,39,44,54),
+(6,11,25,41,29,39,45,55),
+(6,11,26,41,30,40,46,57),
+(6,11,27,42,30,41,47,58),
+(6,11,28,43,31,42,49,60),
+(6,11,29,44,32,43,50,61),
+(6,11,30,44,32,44,52,63),
+(6,11,31,45,33,44,53,64),
+(6,11,32,46,34,45,54,66),
+(6,11,33,47,34,46,56,67),
+(6,11,34,47,35,47,57,69),
+(6,11,35,48,36,48,58,71),
+(6,11,36,49,36,49,60,72),
+(6,11,37,50,37,50,61,74),
+(6,11,38,51,38,51,63,76),
+(6,11,39,52,39,52,64,77),
+(6,11,40,52,39,53,66,79),
+(6,11,41,53,40,54,67,81),
+(6,11,42,54,41,55,69,82),
+(6,11,43,55,42,56,70,84),
+(6,11,44,56,43,57,72,86),
+(6,11,45,57,43,57,73,87),
+(6,11,46,57,44,58,75,89),
+(6,11,47,58,45,60,76,91),
+(6,11,48,59,46,61,78,93),
+(6,11,49,60,47,62,79,94),
+(6,11,50,61,47,63,81,96),
+(6,11,51,62,48,64,83,98),
+(6,11,52,63,49,65,84,100),
+(6,11,53,64,50,66,86,102),
+(6,11,54,65,51,67,87,104),
+(6,11,55,66,51,68,89,105),
+(6,11,56,67,52,69,91,107),
+(6,11,57,68,53,70,92,109),
+(6,11,58,69,54,71,94,111),
+(6,11,59,70,55,72,96,113),
+(6,11,60,71,56,73,97,115),
+(6,11,61,72,57,74,99,117),
+(6,11,62,73,58,76,101,119),
+(6,11,63,74,59,77,103,121),
+(6,11,64,75,59,78,104,123),
+(6,11,65,76,60,79,106,125),
+(6,11,66,77,61,80,108,127),
+(6,11,67,78,62,81,110,129),
+(6,11,68,79,63,83,111,131),
+(6,11,69,80,64,84,113,133),
+(6,11,70,81,65,85,115,135),
+(6,11,71,83,66,86,117,137),
+(6,11,72,84,68,88,120,140),
+(6,11,73,85,69,89,122,142),
+(6,11,74,86,70,91,124,145),
+(6,11,75,88,71,92,126,147),
+(6,11,76,89,72,94,128,150),
+(6,11,77,90,73,95,131,153),
+(6,11,78,92,75,97,133,155),
+(6,11,79,93,76,98,136,158),
+(6,11,80,94,77,100,138,185),
+(7,1,1,18,23,21,24,20),
+(7,1,2,19,24,22,24,20),
+(7,1,3,21,25,23,24,21),
+(7,1,4,22,25,25,24,21),
+(7,1,5,23,26,26,24,21),
+(7,1,6,25,27,27,24,21),
+(7,1,7,26,28,28,24,22),
+(7,1,8,27,29,29,25,22),
+(7,1,9,29,29,31,25,22),
+(7,1,10,30,30,32,25,23),
+(7,1,11,32,31,33,25,23),
+(7,1,12,33,32,34,25,23),
+(7,1,13,34,33,36,25,24),
+(7,1,14,36,34,37,25,24),
+(7,1,15,37,35,38,25,24),
+(7,1,16,39,36,40,25,25),
+(7,1,17,40,36,41,25,25),
+(7,1,18,42,37,43,26,25),
+(7,1,19,43,38,44,26,26),
+(7,1,20,45,39,45,26,26),
+(7,1,21,47,40,47,26,26),
+(7,1,22,48,41,48,26,27),
+(7,1,23,50,42,50,26,27),
+(7,1,24,51,43,51,26,28),
+(7,1,25,53,44,52,27,28),
+(7,1,26,55,45,54,27,28),
+(7,1,27,56,46,55,27,29),
+(7,1,28,58,47,57,27,29),
+(7,1,29,59,48,58,27,30),
+(7,1,30,61,49,60,27,30),
+(7,1,31,63,50,62,27,30),
+(7,1,32,65,51,63,28,31),
+(7,1,33,66,52,65,28,31),
+(7,1,34,68,53,66,28,32),
+(7,1,35,70,55,68,28,32),
+(7,1,36,72,56,69,28,33),
+(7,1,37,73,57,71,29,33),
+(7,1,38,75,58,73,29,34),
+(7,1,39,77,59,74,29,34),
+(7,1,40,79,60,76,29,35),
+(7,1,41,81,61,78,29,35),
+(7,1,42,82,62,79,30,35),
+(7,1,43,84,64,81,30,36),
+(7,1,44,86,65,83,30,36),
+(7,1,45,88,66,85,30,37),
+(7,1,46,90,67,86,30,37),
+(7,1,47,92,68,88,31,38),
+(7,1,48,94,70,90,31,38),
+(7,1,49,96,71,92,31,39),
+(7,1,50,98,72,93,31,40),
+(7,1,51,100,73,95,32,40),
+(7,1,52,102,75,97,32,41),
+(7,1,53,104,76,99,32,41),
+(7,1,54,106,77,101,32,42),
+(7,1,55,108,78,103,33,42),
+(7,1,56,110,80,104,33,43),
+(7,1,57,112,81,106,33,43),
+(7,1,58,114,82,108,33,44),
+(7,1,59,116,84,110,34,44),
+(7,1,60,118,85,112,34,45),
+(7,1,61,120,86,114,34,46),
+(7,1,62,122,88,116,35,46),
+(7,1,63,125,89,118,35,47),
+(7,1,64,127,91,120,35,47),
+(7,1,65,129,92,122,35,48),
+(7,1,66,131,93,124,36,49),
+(7,1,67,133,95,126,36,49),
+(7,1,68,136,96,128,36,50),
+(7,1,69,138,98,130,37,50),
+(7,1,70,140,99,132,37,51),
+(7,1,71,143,100,134,37,52),
+(7,1,72,145,102,137,37,53),
+(7,1,73,148,104,139,37,54),
+(7,1,74,151,105,142,38,54),
+(7,1,75,154,107,144,38,55),
+(7,1,76,157,109,147,38,56),
+(7,1,77,163,111,153,39,57),
+(7,1,78,169,112,158,39,57),
+(7,1,79,172,114,161,39,58),
+(7,1,80,175,116,164,40,59),
+(7,4,1,16,26,20,24,20),
+(7,4,2,17,27,21,24,20),
+(7,4,3,18,29,21,24,21),
+(7,4,4,18,30,22,24,21),
+(7,4,5,19,32,23,25,21),
+(7,4,6,20,33,24,25,22),
+(7,4,7,21,35,24,25,22),
+(7,4,8,22,36,25,25,23),
+(7,4,9,22,38,26,25,23),
+(7,4,10,23,39,26,25,23),
+(7,4,11,24,41,27,25,24),
+(7,4,12,25,42,28,26,24),
+(7,4,13,26,44,29,26,25),
+(7,4,14,27,46,30,26,25),
+(7,4,15,28,47,30,26,25),
+(7,4,16,28,49,31,26,26),
+(7,4,17,29,50,32,27,26),
+(7,4,18,30,52,33,27,27),
+(7,4,19,31,54,34,27,27),
+(7,4,20,32,56,35,27,28),
+(7,4,21,33,57,35,27,28),
+(7,4,22,34,59,36,28,29),
+(7,4,23,35,61,37,28,29),
+(7,4,24,36,62,38,28,30),
+(7,4,25,37,64,39,28,30),
+(7,4,26,38,66,40,29,31),
+(7,4,27,39,68,41,29,31),
+(7,4,28,40,70,42,29,32),
+(7,4,29,41,72,43,29,32),
+(7,4,30,42,73,43,29,33),
+(7,4,31,43,75,44,30,33),
+(7,4,32,44,77,45,30,34),
+(7,4,33,45,79,46,30,34),
+(7,4,34,46,81,47,31,35),
+(7,4,35,47,83,48,31,35),
+(7,4,36,48,85,49,31,36),
+(7,4,37,49,87,50,31,36),
+(7,4,38,50,89,51,32,37),
+(7,4,39,51,91,52,32,38),
+(7,4,40,53,93,53,32,38),
+(7,4,41,54,95,54,33,39),
+(7,4,42,55,97,55,33,39),
+(7,4,43,56,99,56,33,40),
+(7,4,44,57,101,57,33,40),
+(7,4,45,58,103,59,34,41),
+(7,4,46,59,105,60,34,42),
+(7,4,47,61,107,61,34,42),
+(7,4,48,62,110,62,35,43),
+(7,4,49,63,112,63,35,44),
+(7,4,50,64,114,64,35,44),
+(7,4,51,65,116,65,36,45),
+(7,4,52,67,118,66,36,45),
+(7,4,53,68,121,67,36,46),
+(7,4,54,69,123,69,37,47),
+(7,4,55,70,125,70,37,47),
+(7,4,56,72,127,71,37,48),
+(7,4,57,73,130,72,38,49),
+(7,4,58,74,132,73,38,49),
+(7,4,59,75,134,74,39,50),
+(7,4,60,77,137,76,39,51),
+(7,4,61,78,139,77,39,51),
+(7,4,62,79,141,78,40,52),
+(7,4,63,81,144,79,40,53),
+(7,4,64,82,146,80,41,54),
+(7,4,65,83,149,82,41,54),
+(7,4,66,85,151,83,41,55),
+(7,4,67,86,154,84,42,56),
+(7,4,68,87,156,85,42,57),
+(7,4,69,89,158,87,43,57),
+(7,4,70,90,161,88,43,58),
+(7,4,71,92,164,89,44,59),
+(7,4,72,94,167,91,45,59),
+(7,4,73,95,170,93,45,60),
+(7,4,74,97,173,94,46,61),
+(7,4,75,99,176,96,46,62),
+(7,4,76,100,179,97,46,63),
+(7,4,77,102,182,102,47,64),
+(7,4,78,104,186,105,47,65),
+(7,4,79,106,189,106,48,66),
+(7,4,80,108,192,108,48,67),
+(7,6,1,18,23,21,24,20),
+(7,6,2,19,24,22,24,20),
+(7,6,3,21,25,23,24,21),
+(7,6,4,22,25,25,24,21),
+(7,6,5,23,26,26,24,21),
+(7,6,6,25,27,27,24,21),
+(7,6,7,26,28,28,24,22),
+(7,6,8,27,29,29,25,22),
+(7,6,9,29,29,31,25,22),
+(7,6,10,30,30,32,25,23),
+(7,6,11,32,31,33,25,23),
+(7,6,12,33,32,34,25,23),
+(7,6,13,34,33,36,25,24),
+(7,6,14,36,34,37,25,24),
+(7,6,15,37,35,38,25,24),
+(7,6,16,39,36,40,25,25),
+(7,6,17,40,36,41,25,25),
+(7,6,18,42,37,43,26,25),
+(7,6,19,43,38,44,26,26),
+(7,6,20,45,39,45,26,26),
+(7,6,21,47,40,47,26,26),
+(7,6,22,48,41,48,26,27),
+(7,6,23,50,42,50,26,27),
+(7,6,24,51,43,51,26,28),
+(7,6,25,53,44,52,27,28),
+(7,6,26,55,45,54,27,28),
+(7,6,27,56,46,55,27,29),
+(7,6,28,58,47,57,27,29),
+(7,6,29,59,48,58,27,30),
+(7,6,30,61,49,60,27,30),
+(7,6,31,63,50,62,27,30),
+(7,6,32,65,51,63,28,31),
+(7,6,33,66,52,65,28,31),
+(7,6,34,68,53,66,28,32),
+(7,6,35,70,55,68,28,32),
+(7,6,36,72,56,69,28,33),
+(7,6,37,73,57,71,29,33),
+(7,6,38,75,58,73,29,34),
+(7,6,39,77,59,74,29,34),
+(7,6,40,79,60,76,29,35),
+(7,6,41,81,61,78,29,35),
+(7,6,42,82,62,79,30,35),
+(7,6,43,84,64,81,30,36),
+(7,6,44,86,65,83,30,36),
+(7,6,45,88,66,85,30,37),
+(7,6,46,90,67,86,30,37),
+(7,6,47,92,68,88,31,38),
+(7,6,48,94,70,90,31,38),
+(7,6,49,96,71,92,31,39),
+(7,6,50,98,72,93,31,40),
+(7,6,51,99,72,93,32,40),
+(7,6,52,100,73,95,32,41),
+(7,6,53,101,74,96,32,41),
+(7,6,54,102,75,97,32,42),
+(7,6,55,103,76,98,33,42),
+(7,6,56,106,78,101,33,43),
+(7,6,57,111,79,103,33,43),
+(7,6,58,113,80,105,34,44),
+(7,6,59,116,82,107,34,44),
+(7,6,60,118,83,109,34,45),
+(7,6,61,120,84,111,34,46),
+(7,6,62,127,86,119,34,46),
+(7,6,63,129,87,122,35,47),
+(7,6,64,132,89,125,35,47),
+(7,6,65,135,90,127,35,48),
+(7,6,66,137,92,130,35,49),
+(7,6,67,138,93,130,36,49),
+(7,6,68,140,95,131,36,50),
+(7,6,69,142,96,131,36,51),
+(7,6,70,145,98,132,36,51),
+(7,6,71,148,100,135,37,52),
+(7,6,72,150,101,137,37,53),
+(7,6,73,153,103,140,37,54),
+(7,6,74,154,105,142,37,54),
+(7,6,75,155,106,145,38,55),
+(7,6,76,158,108,151,38,56),
+(7,6,77,161,110,157,38,57),
+(7,6,78,164,111,162,38,57),
+(7,6,79,167,113,165,39,58),
+(7,6,80,170,115,168,39,59),
+(7,8,1,15,23,19,27,22),
+(7,8,2,15,23,19,28,23),
+(7,8,3,15,23,20,30,25),
+(7,8,4,15,23,20,31,26),
+(7,8,5,15,24,20,32,27),
+(7,8,6,15,24,20,34,29),
+(7,8,7,16,24,21,35,30),
+(7,8,8,16,24,21,37,31),
+(7,8,9,16,24,21,38,33),
+(7,8,10,16,24,22,40,34),
+(7,8,11,16,25,22,41,36),
+(7,8,12,16,25,22,42,37),
+(7,8,13,16,25,23,44,38),
+(7,8,14,16,25,23,45,40),
+(7,8,15,17,25,23,47,41),
+(7,8,16,17,25,24,49,43),
+(7,8,17,17,26,24,50,44),
+(7,8,18,17,26,24,52,46),
+(7,8,19,17,26,25,53,47),
+(7,8,20,17,26,25,55,49),
+(7,8,21,17,26,26,57,51),
+(7,8,22,18,27,26,58,52),
+(7,8,23,18,27,26,60,54),
+(7,8,24,18,27,27,61,55),
+(7,8,25,18,27,27,63,57),
+(7,8,26,18,28,27,65,59),
+(7,8,27,18,28,28,67,60),
+(7,8,28,18,28,28,68,62),
+(7,8,29,19,28,29,70,64),
+(7,8,30,19,29,29,72,65),
+(7,8,31,19,29,30,74,67),
+(7,8,32,19,29,30,75,69),
+(7,8,33,19,29,30,77,70),
+(7,8,34,20,30,31,79,72),
+(7,8,35,20,30,31,81,74),
+(7,8,36,20,30,32,83,76),
+(7,8,37,20,30,32,85,78),
+(7,8,38,20,31,33,86,79),
+(7,8,39,21,31,33,88,81),
+(7,8,40,21,31,34,90,83),
+(7,8,41,21,32,34,92,85),
+(7,8,42,21,32,35,94,87),
+(7,8,43,21,32,35,96,89),
+(7,8,44,22,32,36,98,91),
+(7,8,45,22,33,36,100,92),
+(7,8,46,22,33,37,102,94),
+(7,8,47,22,33,37,104,96),
+(7,8,48,22,34,38,106,98),
+(7,8,49,23,34,38,108,100),
+(7,8,50,23,34,39,110,102),
+(7,8,51,23,35,39,112,104),
+(7,8,52,23,35,40,114,106),
+(7,8,53,24,35,40,117,108),
+(7,8,54,24,36,41,119,110),
+(7,8,55,24,36,41,121,112),
+(7,8,56,24,37,42,123,114),
+(7,8,57,25,37,42,125,117),
+(7,8,58,25,37,43,127,119),
+(7,8,59,25,38,43,130,121),
+(7,8,60,25,38,44,132,123),
+(7,8,61,26,38,45,134,125),
+(7,8,62,26,39,45,136,127),
+(7,8,63,26,39,46,139,129),
+(7,8,64,26,40,46,141,132),
+(7,8,65,27,40,47,143,134),
+(7,8,66,27,40,48,146,136),
+(7,8,67,27,41,48,148,138),
+(7,8,68,27,41,49,150,140),
+(7,8,69,28,42,49,153,143),
+(7,8,70,28,42,50,155,145),
+(7,8,71,28,42,51,168,148),
+(7,8,72,28,43,52,168,151),
+(7,8,73,28,43,53,171,154),
+(7,8,74,29,44,53,174,156),
+(7,8,75,29,44,54,177,159),
+(7,8,76,29,44,55,180,162),
+(7,8,77,30,45,56,183,165),
+(7,8,78,30,45,56,186,168),
+(7,8,79,30,46,57,190,171),
+(7,8,80,31,46,58,193,174),
+(7,9,1,15,23,20,26,22),
+(7,9,2,15,23,21,27,23),
+(7,9,3,16,24,21,28,24),
+(7,9,4,16,24,22,29,25),
+(7,9,5,16,24,22,31,27),
+(7,9,6,17,25,23,32,28),
+(7,9,7,17,25,23,33,29),
+(7,9,8,17,26,24,34,30),
+(7,9,9,17,26,25,36,31),
+(7,9,10,18,26,25,37,33),
+(7,9,11,18,27,26,38,34),
+(7,9,12,18,27,26,39,35),
+(7,9,13,19,28,27,41,36),
+(7,9,14,19,28,28,42,38),
+(7,9,15,20,28,28,43,39),
+(7,9,16,20,29,29,45,40),
+(7,9,17,20,29,30,46,42),
+(7,9,18,21,30,30,47,43),
+(7,9,19,21,30,31,49,44),
+(7,9,20,21,31,32,50,46),
+(7,9,21,22,31,32,51,47),
+(7,9,22,22,31,33,53,49),
+(7,9,23,23,32,34,54,50),
+(7,9,24,23,32,34,56,51),
+(7,9,25,23,33,35,57,53),
+(7,9,26,24,33,36,59,54),
+(7,9,27,24,34,37,60,56),
+(7,9,28,25,34,37,62,57),
+(7,9,29,25,35,38,63,59),
+(7,9,30,25,35,39,65,60),
+(7,9,31,26,36,40,66,62),
+(7,9,32,26,36,40,68,63),
+(7,9,33,27,37,41,69,65),
+(7,9,34,27,38,42,71,66),
+(7,9,35,28,38,43,73,68),
+(7,9,36,28,39,43,74,69),
+(7,9,37,28,39,44,76,71),
+(7,9,38,29,40,45,77,73),
+(7,9,39,29,40,46,79,74),
+(7,9,40,30,41,47,81,76),
+(7,9,41,30,41,48,82,78),
+(7,9,42,31,42,48,84,79),
+(7,9,43,31,43,49,86,81),
+(7,9,44,32,43,50,88,83),
+(7,9,45,32,44,51,89,84),
+(7,9,46,33,44,52,91,86),
+(7,9,47,33,45,53,93,88),
+(7,9,48,34,46,54,95,89),
+(7,9,49,34,46,54,96,91),
+(7,9,50,35,47,55,98,93),
+(7,9,51,35,48,56,100,95),
+(7,9,52,36,48,57,102,97),
+(7,9,53,36,49,58,104,98),
+(7,9,54,37,50,59,105,100),
+(7,9,55,37,50,60,107,102),
+(7,9,56,38,51,61,109,104),
+(7,9,57,38,52,62,111,106),
+(7,9,58,39,52,63,113,108),
+(7,9,59,40,53,64,115,109),
+(7,9,60,40,54,65,117,111),
+(7,9,61,41,54,66,119,113),
+(7,9,62,41,55,67,121,115),
+(7,9,63,42,56,68,123,117),
+(7,9,64,42,57,69,125,119),
+(7,9,65,43,57,70,127,121),
+(7,9,66,44,58,71,129,123),
+(7,9,67,44,59,72,131,125),
+(7,9,68,45,59,73,133,127),
+(7,9,69,45,60,74,135,129),
+(7,9,70,46,61,75,137,131),
+(7,9,71,47,62,84,147,142),
+(7,9,72,48,62,85,148,144),
+(7,9,73,49,63,85,153,147),
+(7,9,74,49,64,88,153,150),
+(7,9,75,50,65,90,155,152),
+(7,9,76,51,66,91,158,155),
+(7,9,77,52,67,92,161,158),
+(7,9,78,52,68,93,163,161),
+(7,9,79,53,69,95,166,164),
+(7,9,80,54,70,96,170,166),
+(8,1,1,24,22,23,16,21),
+(8,1,2,25,23,24,16,21),
+(8,1,3,27,24,25,16,22),
+(8,1,4,28,24,26,16,22),
+(8,1,5,29,25,28,16,22),
+(8,1,6,31,26,29,16,22),
+(8,1,7,32,27,30,17,23),
+(8,1,8,33,28,31,17,23),
+(8,1,9,35,28,33,17,23),
+(8,1,10,36,29,34,17,24),
+(8,1,11,37,30,35,17,24),
+(8,1,12,39,31,36,17,24),
+(8,1,13,40,32,38,17,25),
+(8,1,14,42,33,39,17,25),
+(8,1,15,43,34,40,18,25),
+(8,1,16,45,35,42,18,26),
+(8,1,17,46,35,43,18,26),
+(8,1,18,48,36,44,18,26),
+(8,1,19,49,37,46,18,27),
+(8,1,20,51,38,47,18,27),
+(8,1,21,52,39,49,18,27),
+(8,1,22,54,40,50,18,28),
+(8,1,23,55,41,51,19,28),
+(8,1,24,57,42,53,19,29),
+(8,1,25,59,43,54,19,29),
+(8,1,26,60,44,56,19,29),
+(8,1,27,62,45,57,19,30),
+(8,1,28,63,46,59,19,30),
+(8,1,29,65,47,60,20,31),
+(8,1,30,67,48,62,20,31),
+(8,1,31,69,49,63,20,31),
+(8,1,32,70,50,65,20,32),
+(8,1,33,72,51,67,20,32),
+(8,1,34,74,53,68,20,33),
+(8,1,35,75,54,70,21,33),
+(8,1,36,77,55,71,21,34),
+(8,1,37,79,56,73,21,34),
+(8,1,38,81,57,75,21,35),
+(8,1,39,83,58,76,21,35),
+(8,1,40,84,59,78,22,35),
+(8,1,41,86,60,80,22,36),
+(8,1,42,88,62,81,22,36),
+(8,1,43,90,63,83,22,37),
+(8,1,44,92,64,85,22,37),
+(8,1,45,94,65,86,23,38),
+(8,1,46,96,66,88,23,38),
+(8,1,47,98,67,90,23,39),
+(8,1,48,100,69,92,23,39),
+(8,1,49,102,70,93,24,40),
+(8,1,50,103,71,95,24,40),
+(8,1,51,105,72,97,24,41),
+(8,1,52,107,74,99,24,42),
+(8,1,53,109,75,101,25,42),
+(8,1,54,112,76,103,25,43),
+(8,1,55,114,78,104,25,43),
+(8,1,56,116,79,106,25,44),
+(8,1,57,118,80,108,25,44),
+(8,1,58,120,81,110,26,45),
+(8,1,59,122,83,112,26,45),
+(8,1,60,124,84,114,26,46),
+(8,1,61,126,85,116,27,47),
+(8,1,62,128,87,118,27,47),
+(8,1,63,130,88,120,27,48),
+(8,1,64,133,90,122,27,48),
+(8,1,65,135,91,124,28,49),
+(8,1,66,137,92,126,28,50),
+(8,1,67,139,94,128,28,50),
+(8,1,68,141,95,130,28,51),
+(8,1,69,144,97,132,29,51),
+(8,1,70,146,98,134,29,52),
+(8,1,71,149,99,136,29,53),
+(8,1,72,151,101,139,29,54),
+(8,1,73,154,103,141,29,55),
+(8,1,74,157,104,144,30,55),
+(8,1,75,166,106,151,30,56),
+(8,1,76,172,108,157,30,57),
+(8,1,77,175,110,161,31,58),
+(8,1,78,179,111,163,31,58),
+(8,1,79,182,113,164,31,59),
+(8,1,80,185,115,169,32,60),
+(8,3,1,21,25,22,16,22),
+(8,3,2,21,26,23,17,23),
+(8,3,3,22,28,24,17,23),
+(8,3,4,22,29,25,18,24),
+(8,3,5,23,30,26,18,25),
+(8,3,6,23,32,27,19,25),
+(8,3,7,24,33,28,20,26),
+(8,3,8,24,35,28,20,26),
+(8,3,9,25,36,29,21,27),
+(8,3,10,25,38,30,21,28),
+(8,3,11,25,39,31,22,29),
+(8,3,12,26,41,32,23,29),
+(8,3,13,26,42,33,23,30),
+(8,3,14,27,44,34,24,31),
+(8,3,15,27,45,35,25,31),
+(8,3,16,28,47,36,25,32),
+(8,3,17,28,48,38,26,33),
+(8,3,18,29,50,39,27,34),
+(8,3,19,29,51,40,28,34),
+(8,3,20,30,53,41,28,35),
+(8,3,21,31,55,42,29,36),
+(8,3,22,31,56,43,30,37),
+(8,3,23,32,58,44,30,37),
+(8,3,24,32,60,45,31,38),
+(8,3,25,33,61,46,32,39),
+(8,3,26,33,63,48,33,40),
+(8,3,27,34,65,49,33,41),
+(8,3,28,35,66,50,34,41),
+(8,3,29,35,68,51,35,42),
+(8,3,30,36,70,52,36,43),
+(8,3,31,36,72,53,37,44),
+(8,3,32,37,73,55,37,45),
+(8,3,33,38,75,56,38,46),
+(8,3,34,38,77,57,39,47),
+(8,3,35,39,79,58,40,48),
+(8,3,36,39,81,60,41,48),
+(8,3,37,40,83,61,41,49),
+(8,3,38,41,85,62,42,50),
+(8,3,39,41,86,63,43,51),
+(8,3,40,42,88,65,44,52),
+(8,3,41,43,90,66,45,53),
+(8,3,42,43,92,67,46,54),
+(8,3,43,44,94,69,47,55),
+(8,3,44,45,96,70,47,56),
+(8,3,45,45,98,71,48,57),
+(8,3,46,46,100,73,49,58),
+(8,3,47,47,102,74,50,59),
+(8,3,48,48,104,76,51,60),
+(8,3,49,48,106,77,52,61),
+(8,3,50,49,108,78,53,62),
+(8,3,51,50,110,80,54,63),
+(8,3,52,51,113,81,55,64),
+(8,3,53,51,115,83,56,65),
+(8,3,54,52,117,84,57,66),
+(8,3,55,53,119,86,58,67),
+(8,3,56,54,121,87,59,68),
+(8,3,57,54,123,89,60,69),
+(8,3,58,55,126,90,61,70),
+(8,3,59,56,128,92,62,71),
+(8,3,60,57,130,93,63,73),
+(8,3,61,58,132,95,64,74),
+(8,3,62,58,134,96,65,75),
+(8,3,63,59,137,98,66,76),
+(8,3,64,60,139,99,67,77),
+(8,3,65,61,141,101,68,78),
+(8,3,66,62,144,103,69,79),
+(8,3,67,62,146,104,70,80),
+(8,3,68,63,148,106,71,82),
+(8,3,69,64,151,107,72,83),
+(8,3,70,65,153,109,73,84),
+(8,3,71,66,156,111,74,85),
+(8,3,72,67,159,113,75,86),
+(8,3,73,68,162,115,76,88),
+(8,3,74,69,165,117,78,89),
+(8,3,75,70,174,119,82,91),
+(8,3,76,71,177,121,83,92),
+(8,3,77,72,180,123,85,94),
+(8,3,78,73,184,125,86,95),
+(8,3,79,74,187,127,87,97),
+(8,3,80,75,190,129,89,98),
+(8,4,1,22,25,22,16,21),
+(8,4,2,23,26,23,16,21),
+(8,4,3,24,28,23,16,22),
+(8,4,4,24,29,24,16,22),
+(8,4,5,25,31,25,17,22),
+(8,4,6,26,32,25,17,23),
+(8,4,7,27,34,26,17,23),
+(8,4,8,27,35,27,17,24),
+(8,4,9,28,37,28,17,24),
+(8,4,10,29,38,28,18,24),
+(8,4,11,30,40,29,18,25),
+(8,4,12,31,41,30,18,25),
+(8,4,13,32,43,31,18,26),
+(8,4,14,32,45,32,18,26),
+(8,4,15,33,46,32,19,26),
+(8,4,16,34,48,33,19,27),
+(8,4,17,35,50,34,19,27),
+(8,4,18,36,51,35,19,28),
+(8,4,19,37,53,36,19,28),
+(8,4,20,38,55,36,20,29),
+(8,4,21,39,56,37,20,29),
+(8,4,22,40,58,38,20,30),
+(8,4,23,41,60,39,20,30),
+(8,4,24,42,62,40,20,31),
+(8,4,25,43,63,41,21,31),
+(8,4,26,44,65,42,21,32),
+(8,4,27,45,67,43,21,32),
+(8,4,28,46,69,44,21,33),
+(8,4,29,47,71,44,22,33),
+(8,4,30,48,72,45,22,34),
+(8,4,31,49,74,46,22,34),
+(8,4,32,50,76,47,22,35),
+(8,4,33,51,78,48,23,35),
+(8,4,34,52,80,49,23,36),
+(8,4,35,53,82,50,23,36),
+(8,4,36,54,84,51,24,37),
+(8,4,37,55,86,52,24,37),
+(8,4,38,56,88,53,24,38),
+(8,4,39,57,90,54,24,38),
+(8,4,40,58,92,55,25,39),
+(8,4,41,59,94,56,25,40),
+(8,4,42,60,96,57,25,40),
+(8,4,43,62,98,58,26,41),
+(8,4,44,63,100,59,26,41),
+(8,4,45,64,102,60,26,42),
+(8,4,46,65,104,61,27,43),
+(8,4,47,66,107,63,27,43),
+(8,4,48,67,109,64,27,44),
+(8,4,49,69,111,65,27,44),
+(8,4,50,70,113,66,28,45),
+(8,4,51,71,115,67,28,46),
+(8,4,52,72,117,68,28,46),
+(8,4,53,74,120,69,29,47),
+(8,4,54,75,122,70,29,48),
+(8,4,55,76,124,72,29,48),
+(8,4,56,77,126,73,30,49),
+(8,4,57,79,129,74,30,50),
+(8,4,58,80,131,75,30,50),
+(8,4,59,81,133,76,31,51),
+(8,4,60,82,136,77,31,52),
+(8,4,61,84,138,79,32,52),
+(8,4,62,85,140,80,32,53),
+(8,4,63,86,143,81,32,54),
+(8,4,64,88,145,82,33,55),
+(8,4,65,89,148,84,33,55),
+(8,4,66,90,150,85,33,56),
+(8,4,67,92,153,86,34,57),
+(8,4,68,93,155,87,34,58),
+(8,4,69,95,157,89,35,58),
+(8,4,70,96,160,90,35,59),
+(8,4,71,98,163,94,35,60),
+(8,4,72,100,166,96,36,60),
+(8,4,73,101,169,96,36,61),
+(8,4,74,103,172,97,37,62),
+(8,4,75,105,175,98,37,63),
+(8,4,76,106,178,99,37,64),
+(8,4,77,108,181,105,38,65),
+(8,4,78,110,185,107,38,66),
+(8,4,79,112,188,109,39,67),
+(8,4,80,114,191,110,39,68),
+(8,5,1,21,22,21,18,24),
+(8,5,2,21,22,21,19,25),
+(8,5,3,21,22,22,21,27),
+(8,5,4,21,23,22,22,28),
+(8,5,5,22,23,22,23,29),
+(8,5,6,22,23,23,25,31),
+(8,5,7,22,23,23,26,32),
+(8,5,8,22,24,24,27,34),
+(8,5,9,22,24,24,29,35),
+(8,5,10,22,24,24,30,37),
+(8,5,11,23,24,25,32,38),
+(8,5,12,23,24,25,33,40),
+(8,5,13,23,25,26,35,41),
+(8,5,14,23,25,26,36,43),
+(8,5,15,23,25,26,38,44),
+(8,5,16,24,26,27,39,46),
+(8,5,17,24,26,27,41,47),
+(8,5,18,24,26,28,42,49),
+(8,5,19,24,26,28,44,50),
+(8,5,20,24,27,29,45,52),
+(8,5,21,25,27,29,47,54),
+(8,5,22,25,27,30,48,55),
+(8,5,23,25,28,30,50,57),
+(8,5,24,25,28,31,52,59),
+(8,5,25,25,28,31,53,60),
+(8,5,26,26,28,32,55,62),
+(8,5,27,26,29,32,56,64),
+(8,5,28,26,29,33,58,65),
+(8,5,29,26,29,33,60,67),
+(8,5,30,27,30,34,62,69),
+(8,5,31,27,30,34,63,71),
+(8,5,32,27,30,35,65,73),
+(8,5,33,27,31,35,67,74),
+(8,5,34,28,31,36,68,76),
+(8,5,35,28,32,36,70,78),
+(8,5,36,28,32,37,72,80),
+(8,5,37,29,32,37,74,82),
+(8,5,38,29,33,38,76,84),
+(8,5,39,29,33,38,77,86),
+(8,5,40,29,33,39,79,87),
+(8,5,41,30,34,40,81,89),
+(8,5,42,30,34,40,83,91),
+(8,5,43,30,35,41,85,93),
+(8,5,44,31,35,41,87,95),
+(8,5,45,31,35,42,89,97),
+(8,5,46,31,36,43,91,99),
+(8,5,47,32,36,43,93,101),
+(8,5,48,32,37,44,94,103),
+(8,5,49,32,37,44,96,105),
+(8,5,50,33,37,45,98,107),
+(8,5,51,33,38,46,100,110),
+(8,5,52,33,38,46,102,112),
+(8,5,53,34,39,47,104,114),
+(8,5,54,34,39,48,106,116),
+(8,5,55,34,40,48,109,118),
+(8,5,56,35,40,49,111,120),
+(8,5,57,35,41,50,113,122),
+(8,5,58,35,41,50,115,125),
+(8,5,59,36,42,51,117,127),
+(8,5,60,36,42,52,119,129),
+(8,5,61,36,42,52,121,131),
+(8,5,62,37,43,53,123,133),
+(8,5,63,37,43,54,125,136),
+(8,5,64,38,44,55,128,138),
+(8,5,65,38,44,55,130,140),
+(8,5,66,38,45,56,132,143),
+(8,5,67,39,45,57,134,145),
+(8,5,68,39,46,58,136,147),
+(8,5,69,40,46,58,139,150),
+(8,5,70,40,47,59,141,152),
+(8,5,71,40,48,60,144,155),
+(8,5,72,41,48,60,147,158),
+(8,5,73,41,49,61,150,161),
+(8,5,74,42,49,62,152,164),
+(8,5,75,42,50,63,155,167),
+(8,5,76,42,51,64,158,170),
+(8,5,77,43,51,65,161,173),
+(8,5,78,43,52,66,164,176),
+(8,5,79,44,52,67,167,179),
+(8,5,80,44,53,68,170,182),
+(8,6,1,24,22,23,16,21),
+(8,6,2,25,23,24,16,21),
+(8,6,3,27,24,25,16,22),
+(8,6,4,28,24,26,16,22),
+(8,6,5,29,25,28,16,22),
+(8,6,6,31,26,29,16,22),
+(8,6,7,32,27,30,17,23),
+(8,6,8,33,28,31,17,23),
+(8,6,9,35,28,33,17,23),
+(8,6,10,36,29,34,17,24),
+(8,6,11,37,30,35,17,24),
+(8,6,12,39,31,36,17,24),
+(8,6,13,40,32,38,17,25),
+(8,6,14,42,33,39,17,25),
+(8,6,15,43,34,40,18,25),
+(8,6,16,45,35,42,18,26),
+(8,6,17,46,35,43,18,26),
+(8,6,18,48,36,44,18,26),
+(8,6,19,49,37,46,18,27),
+(8,6,20,51,38,47,18,27),
+(8,6,21,52,39,49,18,27),
+(8,6,22,54,40,50,18,28),
+(8,6,23,55,41,51,19,28),
+(8,6,24,57,42,53,19,29),
+(8,6,25,59,43,54,19,29),
+(8,6,26,60,44,56,19,29),
+(8,6,27,62,45,57,19,30),
+(8,6,28,63,46,59,19,30),
+(8,6,29,65,47,60,20,31),
+(8,6,30,67,48,62,20,31),
+(8,6,31,69,49,63,20,31),
+(8,6,32,70,50,65,20,32),
+(8,6,33,72,51,67,20,32),
+(8,6,34,74,53,68,20,33),
+(8,6,35,75,54,70,21,33),
+(8,6,36,77,55,71,21,34),
+(8,6,37,79,56,73,21,34),
+(8,6,38,81,57,75,21,35),
+(8,6,39,83,58,76,21,35),
+(8,6,40,84,59,78,22,35),
+(8,6,41,86,60,80,22,36),
+(8,6,42,88,62,81,22,36),
+(8,6,43,90,63,83,22,37),
+(8,6,44,92,64,85,22,37),
+(8,6,45,94,65,86,23,38),
+(8,6,46,96,66,88,23,38),
+(8,6,47,98,67,90,23,39),
+(8,6,48,100,69,92,23,39),
+(8,6,49,102,70,93,24,40),
+(8,6,50,103,71,95,24,40),
+(8,6,51,105,72,96,24,41),
+(8,6,52,106,74,97,24,42),
+(8,6,53,107,73,98,25,42),
+(8,6,54,108,74,99,25,43),
+(8,6,55,109,75,100,25,43),
+(8,6,56,112,77,103,25,44),
+(8,6,57,114,78,105,25,44),
+(8,6,58,118,79,107,26,45),
+(8,6,59,119,81,109,26,45),
+(8,6,60,121,82,111,26,46),
+(8,6,61,123,83,113,26,47),
+(8,6,62,126,85,115,26,47),
+(8,6,63,128,86,118,27,48),
+(8,6,64,131,88,120,27,48),
+(8,6,65,138,89,122,27,49),
+(8,6,66,140,91,125,27,50),
+(8,6,67,143,92,127,28,50),
+(8,6,68,145,94,129,28,51),
+(8,6,69,148,95,132,28,52),
+(8,6,70,151,97,134,28,52),
+(8,6,71,154,99,137,29,53),
+(8,6,72,156,100,139,29,54),
+(8,6,73,159,102,142,29,55),
+(8,6,74,162,104,144,29,55),
+(8,6,75,165,105,147,30,56),
+(8,6,76,168,107,150,30,57),
+(8,6,77,169,109,153,30,58),
+(8,6,78,170,110,155,30,58),
+(8,6,79,178,112,158,31,59),
+(8,6,80,181,114,161,31,60),
+(8,7,1,22,22,22,17,23),
+(8,7,2,23,22,23,18,24),
+(8,7,3,24,23,24,19,25),
+(8,7,4,25,23,25,20,26),
+(8,7,5,25,24,26,21,27),
+(8,7,6,26,24,27,22,28),
+(8,7,7,27,25,28,23,29),
+(8,7,8,28,25,29,24,30),
+(8,7,9,29,25,30,25,31),
+(8,7,10,30,26,31,26,33),
+(8,7,11,31,26,32,27,34),
+(8,7,12,32,27,33,28,35),
+(8,7,13,33,27,34,29,36),
+(8,7,14,34,28,35,30,37),
+(8,7,15,34,28,36,31,38),
+(8,7,16,35,29,38,32,39),
+(8,7,17,36,29,39,33,41),
+(8,7,18,37,30,40,34,42),
+(8,7,19,38,30,41,35,43),
+(8,7,20,39,31,42,36,44),
+(8,7,21,40,32,43,37,45),
+(8,7,22,41,32,45,38,47),
+(8,7,23,43,33,46,39,48),
+(8,7,24,44,33,47,40,49),
+(8,7,25,45,34,48,42,51),
+(8,7,26,46,34,49,43,52),
+(8,7,27,47,35,51,44,53),
+(8,7,28,48,35,52,45,54),
+(8,7,29,49,36,53,46,56),
+(8,7,30,50,37,54,48,57),
+(8,7,31,51,37,56,49,59),
+(8,7,32,52,38,57,50,60),
+(8,7,33,53,38,58,51,61),
+(8,7,34,55,39,60,52,63),
+(8,7,35,56,40,61,54,64),
+(8,7,36,57,40,62,55,66),
+(8,7,37,58,41,64,56,67),
+(8,7,38,59,42,65,57,68),
+(8,7,39,61,42,66,59,70),
+(8,7,40,62,43,68,60,71),
+(8,7,41,63,44,69,61,73),
+(8,7,42,64,44,71,63,74),
+(8,7,43,65,45,72,64,76),
+(8,7,44,67,46,74,65,77),
+(8,7,45,68,46,75,67,79),
+(8,7,46,69,47,76,68,80),
+(8,7,47,71,48,78,69,82),
+(8,7,48,72,49,79,71,83),
+(8,7,49,73,49,81,72,85),
+(8,7,50,74,50,82,74,87),
+(8,7,51,76,51,84,75,88),
+(8,7,52,77,51,85,77,90),
+(8,7,53,78,52,87,78,92),
+(8,7,54,80,53,89,79,93),
+(8,7,55,81,54,90,81,95),
+(8,7,56,83,55,92,82,96),
+(8,7,57,84,55,93,84,98),
+(8,7,58,85,56,95,85,100),
+(8,7,59,87,57,97,87,102),
+(8,7,60,88,58,98,88,103),
+(8,7,61,90,58,100,90,105),
+(8,7,62,91,59,101,91,107),
+(8,7,63,93,60,103,93,108),
+(8,7,64,94,61,105,94,110),
+(8,7,65,95,62,106,96,112),
+(8,7,66,97,63,108,98,114),
+(8,7,67,98,63,110,99,116),
+(8,7,68,100,64,112,101,117),
+(8,7,69,101,65,113,102,119),
+(8,7,70,103,66,115,104,121),
+(8,7,71,104,67,117,116,123),
+(8,7,72,106,68,119,118,126),
+(8,7,73,108,69,121,121,128),
+(8,7,74,110,70,124,123,130),
+(8,7,75,112,71,126,125,132),
+(8,7,76,114,72,128,127,135),
+(8,7,77,115,73,130,129,137),
+(8,7,78,117,74,132,132,139),
+(8,7,79,119,75,135,134,142),
+(8,7,80,121,76,137,136,144),
+(8,8,1,21,22,21,19,23),
+(8,8,2,21,22,21,20,24),
+(8,8,3,21,22,22,22,26),
+(8,8,4,21,22,22,23,27),
+(8,8,5,21,23,22,25,28),
+(8,8,6,21,23,22,26,30),
+(8,8,7,21,23,23,27,31),
+(8,8,8,22,23,23,29,32),
+(8,8,9,22,23,23,30,34),
+(8,8,10,22,23,24,32,35),
+(8,8,11,22,24,24,33,37),
+(8,8,12,22,24,24,35,38),
+(8,8,13,22,24,25,36,39),
+(8,8,14,22,24,25,38,41),
+(8,8,15,22,24,25,39,42),
+(8,8,16,22,24,26,41,44),
+(8,8,17,23,25,26,42,45),
+(8,8,18,23,25,26,44,47),
+(8,8,19,23,25,27,46,48),
+(8,8,20,23,25,27,47,50),
+(8,8,21,23,25,27,49,51),
+(8,8,22,23,26,28,51,53),
+(8,8,23,23,26,28,52,55),
+(8,8,24,24,26,29,54,56),
+(8,8,25,24,26,29,56,58),
+(8,8,26,24,27,29,57,60),
+(8,8,27,24,27,30,59,61),
+(8,8,28,24,27,30,61,63),
+(8,8,29,24,27,31,63,65),
+(8,8,30,24,28,31,64,66),
+(8,8,31,25,28,31,66,68),
+(8,8,32,25,28,32,68,70),
+(8,8,33,25,28,32,70,71),
+(8,8,34,25,29,33,71,73),
+(8,8,35,25,29,33,73,75),
+(8,8,36,26,29,34,75,77),
+(8,8,37,26,29,34,77,79),
+(8,8,38,26,30,35,79,80),
+(8,8,39,26,30,35,81,82),
+(8,8,40,26,30,35,83,84),
+(8,8,41,27,31,36,85,86),
+(8,8,42,27,31,36,87,88),
+(8,8,43,27,31,37,89,90),
+(8,8,44,27,32,37,91,91),
+(8,8,45,27,32,38,93,93),
+(8,8,46,28,32,38,95,95),
+(8,8,47,28,32,39,97,97),
+(8,8,48,28,33,39,99,99),
+(8,8,49,28,33,40,101,101),
+(8,8,50,29,33,40,103,103),
+(8,8,51,29,34,41,105,105),
+(8,8,52,29,34,42,107,107),
+(8,8,53,29,35,42,109,109),
+(8,8,54,30,35,43,111,111),
+(8,8,55,30,35,43,113,113),
+(8,8,56,30,36,44,115,115),
+(8,8,57,30,36,44,118,118),
+(8,8,58,31,36,45,120,120),
+(8,8,59,31,37,45,122,122),
+(8,8,60,31,37,46,124,124),
+(8,8,61,31,37,47,126,126),
+(8,8,62,32,38,47,129,128),
+(8,8,63,32,38,48,131,130),
+(8,8,64,32,39,48,133,133),
+(8,8,65,33,39,49,135,135),
+(8,8,66,33,39,50,138,137),
+(8,8,67,33,40,50,140,139),
+(8,8,68,33,40,51,142,141),
+(8,8,69,34,41,51,145,144),
+(8,8,70,34,41,52,147,146),
+(8,8,71,34,41,53,150,149),
+(8,8,72,34,42,54,153,152),
+(8,8,73,34,42,55,156,155),
+(8,8,74,35,43,55,159,157),
+(8,8,75,35,43,56,162,160),
+(8,8,76,35,43,57,168,163),
+(8,8,77,36,44,58,168,166),
+(8,8,78,36,44,58,171,169),
+(8,8,79,36,45,59,177,172),
+(8,8,80,37,45,60,177,175),
+(10,2,1,19,22,21,24,20),
+(10,2,2,20,23,22,25,21),
+(10,2,3,21,23,23,25,21),
+(10,2,4,22,24,24,26,22),
+(10,2,5,23,24,25,27,23),
+(10,2,6,25,25,26,27,24),
+(10,2,7,26,25,27,28,24),
+(10,2,8,27,26,28,29,25),
+(10,2,9,28,27,29,29,26),
+(10,2,10,29,27,31,30,26),
+(10,2,11,30,28,32,31,27),
+(10,2,12,32,29,33,31,28),
+(10,2,13,33,29,34,32,29),
+(10,2,14,34,30,35,33,30),
+(10,2,15,35,31,36,33,30),
+(10,2,16,37,31,37,34,31),
+(10,2,17,38,32,39,35,32),
+(10,2,18,39,33,40,36,33),
+(10,2,19,40,33,41,36,34),
+(10,2,20,42,34,42,37,35),
+(10,2,21,43,35,44,38,35),
+(10,2,22,44,35,45,39,36),
+(10,2,23,46,36,46,40,37),
+(10,2,24,47,37,47,40,38),
+(10,2,25,49,38,49,41,39),
+(10,2,26,50,38,50,42,40),
+(10,2,27,51,39,51,43,41),
+(10,2,28,53,40,53,44,42),
+(10,2,29,54,41,54,45,43),
+(10,2,30,56,41,55,45,43),
+(10,2,31,57,42,57,46,44),
+(10,2,32,58,43,58,47,45),
+(10,2,33,60,44,59,48,46),
+(10,2,34,61,45,61,49,47),
+(10,2,35,63,45,62,50,48),
+(10,2,36,64,46,64,51,49),
+(10,2,37,66,47,65,52,50),
+(10,2,38,67,48,67,53,51),
+(10,2,39,69,49,68,54,52),
+(10,2,40,71,50,69,55,53),
+(10,2,41,72,50,71,55,54),
+(10,2,42,74,51,72,56,55),
+(10,2,43,75,52,74,57,56),
+(10,2,44,77,53,75,58,57),
+(10,2,45,79,54,77,59,59),
+(10,2,46,80,55,78,60,60),
+(10,2,47,82,56,80,61,61),
+(10,2,48,83,57,82,62,62),
+(10,2,49,85,58,83,63,63),
+(10,2,50,87,59,85,64,64),
+(10,2,51,89,60,86,66,65),
+(10,2,52,90,61,88,67,66),
+(10,2,53,92,61,90,68,67),
+(10,2,54,94,62,91,69,69),
+(10,2,55,95,63,93,70,70),
+(10,2,56,97,64,95,71,71),
+(10,2,57,99,65,96,72,72),
+(10,2,58,101,66,98,73,73),
+(10,2,59,102,67,100,74,74),
+(10,2,60,104,68,101,75,76),
+(10,2,61,106,69,103,76,77),
+(10,2,62,108,70,105,78,78),
+(10,2,63,110,72,106,79,79),
+(10,2,64,112,73,108,80,80),
+(10,2,65,113,74,110,81,82),
+(10,2,66,115,75,112,82,83),
+(10,2,67,117,76,114,83,84),
+(10,2,68,119,77,115,85,85),
+(10,2,69,121,78,117,86,87),
+(10,2,70,123,79,119,87,88),
+(10,2,71,125,80,120,88,89),
+(10,2,72,128,81,123,90,91),
+(10,2,73,130,82,125,91,93),
+(10,2,74,133,84,127,93,94),
+(10,2,75,135,85,129,94,96),
+(10,2,76,137,86,132,96,97),
+(10,2,77,140,88,134,97,99),
+(10,2,78,143,89,136,99,101),
+(10,2,79,145,90,139,100,102),
+(10,2,80,148,92,141,102,104),
+(10,3,1,17,25,20,24,20),
+(10,3,2,17,26,21,25,21),
+(10,3,3,18,28,22,25,21),
+(10,3,4,18,29,23,26,22),
+(10,3,5,19,30,24,26,23),
+(10,3,6,19,32,25,27,23),
+(10,3,7,20,33,26,27,24),
+(10,3,8,20,35,27,28,25),
+(10,3,9,21,36,27,29,25),
+(10,3,10,21,38,28,29,26),
+(10,3,11,22,39,29,30,27),
+(10,3,12,22,41,30,31,27),
+(10,3,13,23,42,31,31,28),
+(10,3,14,23,44,32,32,29),
+(10,3,15,24,45,34,32,29),
+(10,3,16,24,47,35,33,30),
+(10,3,17,25,48,36,34,31),
+(10,3,18,25,50,37,34,32),
+(10,3,19,26,51,38,35,32),
+(10,3,20,26,53,39,36,33),
+(10,3,21,27,55,40,37,34),
+(10,3,22,27,56,41,37,35),
+(10,3,23,28,58,42,38,36),
+(10,3,24,28,60,43,39,36),
+(10,3,25,29,61,44,39,37),
+(10,3,26,30,63,46,40,38),
+(10,3,27,30,65,47,41,39),
+(10,3,28,31,66,48,42,40),
+(10,3,29,31,68,49,42,40),
+(10,3,30,32,70,50,43,41),
+(10,3,31,33,72,52,44,42),
+(10,3,32,33,73,53,45,43),
+(10,3,33,34,75,54,46,44),
+(10,3,34,34,77,55,46,45),
+(10,3,35,35,79,57,47,46),
+(10,3,36,36,81,58,48,47),
+(10,3,37,36,83,59,49,47),
+(10,3,38,37,85,60,50,48),
+(10,3,39,38,86,62,51,49),
+(10,3,40,38,88,63,51,50),
+(10,3,41,39,90,64,52,51),
+(10,3,42,40,92,66,53,52),
+(10,3,43,40,94,67,54,53),
+(10,3,44,41,96,68,55,54),
+(10,3,45,42,98,70,56,55),
+(10,3,46,42,100,71,57,56),
+(10,3,47,43,102,72,58,57),
+(10,3,48,44,104,74,59,58),
+(10,3,49,45,106,75,60,59),
+(10,3,50,45,108,77,61,60),
+(10,3,51,46,110,78,61,61),
+(10,3,52,47,113,79,62,62),
+(10,3,53,47,115,81,63,63),
+(10,3,54,48,117,82,64,64),
+(10,3,55,49,119,84,65,65),
+(10,3,56,50,121,85,66,66),
+(10,3,57,50,123,87,67,67),
+(10,3,58,51,126,88,68,68),
+(10,3,59,52,128,90,69,70),
+(10,3,60,53,130,91,70,71),
+(10,3,61,54,132,93,71,72),
+(10,3,62,54,134,94,72,73),
+(10,3,63,55,137,96,73,74),
+(10,3,64,56,139,97,75,75),
+(10,3,65,57,141,99,76,76),
+(10,3,66,58,144,101,77,77),
+(10,3,67,58,146,102,78,78),
+(10,3,68,59,148,104,79,80),
+(10,3,69,60,151,105,80,81),
+(10,3,70,61,153,107,81,82),
+(10,3,71,62,156,108,82,83),
+(10,3,72,63,159,110,83,84),
+(10,3,73,64,162,112,84,86),
+(10,3,74,65,165,114,86,87),
+(10,3,75,66,168,116,87,89),
+(10,3,76,67,171,118,89,90),
+(10,3,77,68,174,120,90,92),
+(10,3,78,69,177,122,91,93),
+(10,3,79,70,180,124,92,95),
+(10,3,80,71,183,126,94,96),
+(10,4,1,18,25,20,24,19),
+(10,4,2,19,26,21,24,19),
+(10,4,3,20,28,21,24,20),
+(10,4,4,20,29,22,24,20),
+(10,4,5,21,31,23,25,20),
+(10,4,6,22,32,24,25,21),
+(10,4,7,23,34,24,25,21),
+(10,4,8,24,35,25,25,22),
+(10,4,9,24,37,26,25,22),
+(10,4,10,25,38,26,25,22),
+(10,4,11,26,40,27,25,23),
+(10,4,12,27,41,28,26,23),
+(10,4,13,28,43,29,26,24),
+(10,4,14,29,45,30,26,24),
+(10,4,15,29,46,30,26,25),
+(10,4,16,30,48,31,26,25),
+(10,4,17,31,50,32,27,25),
+(10,4,18,32,51,33,27,26),
+(10,4,19,33,53,34,27,26),
+(10,4,20,34,55,35,27,27),
+(10,4,21,35,56,35,27,27),
+(10,4,22,36,58,36,28,28),
+(10,4,23,37,60,37,28,28),
+(10,4,24,38,62,38,28,29),
+(10,4,25,39,63,39,28,29),
+(10,4,26,40,65,40,29,30),
+(10,4,27,41,67,41,29,30),
+(10,4,28,42,69,42,29,31),
+(10,4,29,43,71,43,29,31),
+(10,4,30,44,72,43,29,32),
+(10,4,31,45,74,44,30,32),
+(10,4,32,46,76,45,30,33),
+(10,4,33,47,78,46,30,33),
+(10,4,34,48,80,47,31,34),
+(10,4,35,49,82,48,31,34),
+(10,4,36,50,84,49,31,35),
+(10,4,37,51,86,50,31,35),
+(10,4,38,52,88,51,32,36),
+(10,4,39,53,90,52,32,37),
+(10,4,40,54,92,53,32,37),
+(10,4,41,56,94,54,33,38),
+(10,4,42,57,96,55,33,38),
+(10,4,43,58,98,56,33,39),
+(10,4,44,59,100,57,33,39),
+(10,4,45,60,102,59,34,40),
+(10,4,46,61,104,60,34,41),
+(10,4,47,62,107,61,34,41),
+(10,4,48,64,109,62,35,42),
+(10,4,49,65,111,63,35,43),
+(10,4,50,66,113,64,35,43),
+(10,4,51,67,115,65,36,44),
+(10,4,52,68,117,66,36,44),
+(10,4,53,70,120,67,36,45),
+(10,4,54,71,122,69,37,46),
+(10,4,55,72,124,70,37,46),
+(10,4,56,73,126,71,37,47),
+(10,4,57,75,129,72,38,48),
+(10,4,58,76,131,73,38,48),
+(10,4,59,77,133,74,39,49),
+(10,4,60,79,136,76,39,50),
+(10,4,61,80,138,77,39,51),
+(10,4,62,81,140,78,40,51),
+(10,4,63,82,143,79,40,52),
+(10,4,64,84,145,80,41,53),
+(10,4,65,85,148,82,41,53),
+(10,4,66,87,150,83,41,54),
+(10,4,67,88,153,84,42,55),
+(10,4,68,89,155,85,42,56),
+(10,4,69,91,157,87,43,56),
+(10,4,70,92,160,88,43,57),
+(10,4,71,94,163,88,43,58),
+(10,4,72,96,166,90,44,58),
+(10,4,73,97,169,92,44,59),
+(10,4,74,99,172,93,45,60),
+(10,4,75,101,175,95,45,61),
+(10,4,76,102,178,96,45,62),
+(10,4,77,104,181,101,46,63),
+(10,4,78,106,185,104,46,64),
+(10,4,79,108,188,105,47,65),
+(10,4,80,110,191,107,47,66),
+(10,5,1,17,22,19,26,22),
+(10,5,2,17,22,19,27,23),
+(10,5,3,17,22,20,29,25),
+(10,5,4,17,23,20,30,26),
+(10,5,5,18,23,20,31,27),
+(10,5,6,18,23,21,33,29),
+(10,5,7,18,23,21,34,30),
+(10,5,8,18,24,22,35,32),
+(10,5,9,18,24,22,37,33),
+(10,5,10,19,24,22,38,35),
+(10,5,11,19,24,23,39,36),
+(10,5,12,19,24,23,41,38),
+(10,5,13,19,25,24,42,39),
+(10,5,14,19,25,24,44,41),
+(10,5,15,19,25,25,45,42),
+(10,5,16,20,26,25,47,44),
+(10,5,17,20,26,25,48,45),
+(10,5,18,20,26,26,50,47),
+(10,5,19,20,26,26,51,49),
+(10,5,20,21,27,27,53,50),
+(10,5,21,21,27,27,54,52),
+(10,5,22,21,27,28,56,53),
+(10,5,23,21,28,28,58,55),
+(10,5,24,21,28,29,59,57),
+(10,5,25,22,28,29,61,58),
+(10,5,26,22,28,30,62,60),
+(10,5,27,22,29,30,64,62),
+(10,5,28,22,29,31,66,64),
+(10,5,29,23,29,31,67,65),
+(10,5,30,23,30,32,69,67),
+(10,5,31,23,30,32,71,69),
+(10,5,32,23,30,33,72,71),
+(10,5,33,24,31,33,74,72),
+(10,5,34,24,31,34,76,74),
+(10,5,35,24,32,34,78,76),
+(10,5,36,24,32,35,80,78),
+(10,5,37,25,32,35,81,80),
+(10,5,38,25,33,36,83,82),
+(10,5,39,25,33,37,85,84),
+(10,5,40,26,33,37,87,86),
+(10,5,41,26,34,38,89,88),
+(10,5,42,26,34,38,91,89),
+(10,5,43,27,35,39,92,91),
+(10,5,44,27,35,39,94,93),
+(10,5,45,27,35,40,96,95),
+(10,5,46,27,36,41,98,97),
+(10,5,47,28,36,41,100,99),
+(10,5,48,28,37,42,102,101),
+(10,5,49,28,37,43,104,103),
+(10,5,50,29,37,43,106,106),
+(10,5,51,29,38,44,108,108),
+(10,5,52,29,38,44,110,110),
+(10,5,53,30,39,45,112,112),
+(10,5,54,30,39,46,114,114),
+(10,5,55,30,40,46,116,116),
+(10,5,56,31,40,47,118,118),
+(10,5,57,31,41,48,120,120),
+(10,5,58,31,41,48,123,123),
+(10,5,59,32,42,49,125,125),
+(10,5,60,32,42,50,127,127),
+(10,5,61,33,42,51,129,129),
+(10,5,62,33,43,51,131,131),
+(10,5,63,33,43,52,133,134),
+(10,5,64,34,44,53,135,136),
+(10,5,65,34,44,53,138,138),
+(10,5,66,34,45,54,140,141),
+(10,5,67,35,45,55,142,143),
+(10,5,68,35,46,56,144,145),
+(10,5,69,36,46,56,147,148),
+(10,5,70,36,47,57,149,150),
+(10,5,71,36,48,57,152,153),
+(10,5,72,37,48,57,155,156),
+(10,5,73,37,49,58,158,159),
+(10,5,74,38,49,59,160,163),
+(10,5,75,38,50,60,163,165),
+(10,5,76,38,51,61,166,170),
+(10,5,77,39,51,62,168,175),
+(10,5,78,39,52,63,172,174),
+(10,5,79,40,52,64,175,177),
+(10,5,80,40,53,65,178,180),
+(10,6,1,18,23,21,24,20),
+(10,6,2,19,24,22,24,20),
+(10,6,3,21,25,23,24,21),
+(10,6,4,22,25,25,24,21),
+(10,6,5,23,26,26,24,21),
+(10,6,6,25,27,27,24,21),
+(10,6,7,26,28,28,24,22),
+(10,6,8,27,29,29,25,22),
+(10,6,9,29,29,31,25,22),
+(10,6,10,30,30,32,25,23),
+(10,6,11,32,31,33,25,23),
+(10,6,12,33,32,34,25,23),
+(10,6,13,34,33,36,25,24),
+(10,6,14,36,34,37,25,24),
+(10,6,15,37,35,38,25,24),
+(10,6,16,39,36,40,25,25),
+(10,6,17,40,36,41,25,25),
+(10,6,18,42,37,43,26,25),
+(10,6,19,43,38,44,26,26),
+(10,6,20,45,39,45,26,26),
+(10,6,21,47,40,47,26,26),
+(10,6,22,48,41,48,26,27),
+(10,6,23,50,42,50,26,27),
+(10,6,24,51,43,51,26,28),
+(10,6,25,53,44,52,27,28),
+(10,6,26,55,45,54,27,28),
+(10,6,27,56,46,55,27,29),
+(10,6,28,58,47,57,27,29),
+(10,6,29,59,48,58,27,30),
+(10,6,30,61,49,60,27,30),
+(10,6,31,63,50,62,27,30),
+(10,6,32,65,51,63,28,31),
+(10,6,33,66,52,65,28,31),
+(10,6,34,68,53,66,28,32),
+(10,6,35,70,55,68,28,32),
+(10,6,36,72,56,69,28,33),
+(10,6,37,73,57,71,29,33),
+(10,6,38,75,58,73,29,34),
+(10,6,39,77,59,74,29,34),
+(10,6,40,79,60,76,29,35),
+(10,6,41,81,61,78,29,35),
+(10,6,42,82,62,79,30,35),
+(10,6,43,84,64,81,30,36),
+(10,6,44,86,65,83,30,36),
+(10,6,45,88,66,85,30,37),
+(10,6,46,90,67,86,30,37),
+(10,6,47,92,68,88,31,38),
+(10,6,48,94,69,90,31,38),
+(10,6,49,96,69,92,31,39),
+(10,6,50,98,70,93,31,40),
+(10,6,51,100,71,95,32,40),
+(10,6,52,102,72,96,32,41),
+(10,6,53,103,73,97,32,41),
+(10,6,54,104,74,98,32,41),
+(10,6,55,105,75,97,33,41),
+(10,6,56,108,77,100,33,42),
+(10,6,57,113,78,102,33,42),
+(10,6,58,115,79,104,34,43),
+(10,6,59,117,81,106,34,43),
+(10,6,60,118,82,108,34,44),
+(10,6,61,119,83,110,34,45),
+(10,6,62,121,85,112,34,45),
+(10,6,63,124,86,115,35,46),
+(10,6,64,127,88,117,35,46),
+(10,6,65,133,89,119,35,47),
+(10,6,66,135,91,122,35,48),
+(10,6,67,139,92,124,36,48),
+(10,6,68,141,94,126,36,49),
+(10,6,69,142,95,129,36,50),
+(10,6,70,145,97,131,36,50),
+(10,6,71,150,99,134,37,51),
+(10,6,72,152,100,136,37,52),
+(10,6,73,155,102,139,37,53),
+(10,6,74,158,104,141,37,53),
+(10,6,75,159,105,144,38,54),
+(10,6,76,160,107,147,38,55),
+(10,6,77,163,109,149,38,56),
+(10,6,78,166,110,152,38,56),
+(10,6,79,169,112,155,39,57),
+(10,6,80,172,114,158,39,58),
+(10,8,1,17,22,19,27,21),
+(10,8,2,17,22,19,28,22),
+(10,8,3,17,22,20,30,24),
+(10,8,4,17,22,20,31,25),
+(10,8,5,17,23,20,32,26),
+(10,8,6,17,23,20,34,28),
+(10,8,7,18,23,21,35,29),
+(10,8,8,18,23,21,37,30),
+(10,8,9,18,23,21,38,32),
+(10,8,10,18,23,22,40,33),
+(10,8,11,18,24,22,41,35),
+(10,8,12,18,24,22,42,36),
+(10,8,13,18,24,23,44,37),
+(10,8,14,18,24,23,45,39),
+(10,8,15,18,24,23,47,40),
+(10,8,16,19,24,24,49,42),
+(10,8,17,19,25,24,50,43),
+(10,8,18,19,25,24,52,45),
+(10,8,19,19,25,25,53,46),
+(10,8,20,19,25,25,55,48),
+(10,8,21,19,25,26,57,50),
+(10,8,22,19,26,26,58,51),
+(10,8,23,20,26,26,60,53),
+(10,8,24,20,26,27,61,54),
+(10,8,25,20,26,27,63,56),
+(10,8,26,20,27,27,65,58),
+(10,8,27,20,27,28,67,59),
+(10,8,28,20,27,28,68,61),
+(10,8,29,21,27,29,70,63),
+(10,8,30,21,28,29,72,64),
+(10,8,31,21,28,30,74,66),
+(10,8,32,21,28,30,75,68),
+(10,8,33,21,28,30,77,70),
+(10,8,34,21,29,31,79,71),
+(10,8,35,22,29,31,81,73),
+(10,8,36,22,29,32,83,75),
+(10,8,37,22,29,32,85,77),
+(10,8,38,22,30,33,86,78),
+(10,8,39,22,30,33,88,80),
+(10,8,40,23,30,34,90,82),
+(10,8,41,23,31,34,92,84),
+(10,8,42,23,31,35,94,86),
+(10,8,43,23,31,35,96,88),
+(10,8,44,23,32,36,98,90),
+(10,8,45,24,32,36,100,92),
+(10,8,46,24,32,37,102,93),
+(10,8,47,24,32,37,104,95),
+(10,8,48,24,33,38,106,97),
+(10,8,49,25,33,38,108,99),
+(10,8,50,25,33,39,110,101),
+(10,8,51,25,34,39,112,103),
+(10,8,52,25,34,40,114,105),
+(10,8,53,25,35,40,117,107),
+(10,8,54,26,35,41,119,109),
+(10,8,55,26,35,41,121,111),
+(10,8,56,26,36,42,123,113),
+(10,8,57,26,36,42,125,116),
+(10,8,58,27,36,43,127,118),
+(10,8,59,27,37,43,130,120),
+(10,8,60,27,37,44,132,122),
+(10,8,61,27,37,45,134,124),
+(10,8,62,28,38,45,136,126),
+(10,8,63,28,38,46,139,128),
+(10,8,64,28,39,46,141,131),
+(10,8,65,29,39,47,143,133),
+(10,8,66,29,39,48,146,135),
+(10,8,67,29,40,48,148,137),
+(10,8,68,29,40,49,150,139),
+(10,8,69,30,41,49,153,142),
+(10,8,70,30,41,50,155,144),
+(10,8,71,30,41,50,158,147),
+(10,8,72,30,42,51,161,150),
+(10,8,73,30,42,52,164,153),
+(10,8,74,31,43,52,167,155),
+(10,8,75,31,43,53,170,158),
+(10,8,76,31,43,54,173,161),
+(10,8,77,32,44,55,176,164),
+(10,8,78,32,44,55,179,167),
+(10,8,79,32,45,56,182,170),
+(10,8,80,33,45,57,185,173),
+(10,9,1,17,22,20,26,21),
+(10,9,2,17,22,21,27,22),
+(10,9,3,18,23,21,28,23),
+(10,9,4,18,23,22,29,24),
+(10,9,5,18,23,22,31,26),
+(10,9,6,18,24,23,32,27),
+(10,9,7,19,24,23,33,28),
+(10,9,8,19,25,24,34,29),
+(10,9,9,19,25,25,36,30),
+(10,9,10,20,25,25,37,32),
+(10,9,11,20,26,26,38,33),
+(10,9,12,20,26,26,39,34),
+(10,9,13,21,27,27,41,36),
+(10,9,14,21,27,28,42,37),
+(10,9,15,21,27,28,43,38),
+(10,9,16,22,28,29,45,39),
+(10,9,17,22,28,30,46,41),
+(10,9,18,23,29,30,47,42),
+(10,9,19,23,29,31,49,43),
+(10,9,20,23,30,32,50,45),
+(10,9,21,24,30,32,51,46),
+(10,9,22,24,31,33,53,48),
+(10,9,23,24,31,34,54,49),
+(10,9,24,25,31,34,56,50),
+(10,9,25,25,32,35,57,52),
+(10,9,26,26,32,36,59,53),
+(10,9,27,26,33,37,60,55),
+(10,9,28,26,33,37,62,56),
+(10,9,29,27,34,38,63,58),
+(10,9,30,27,34,39,65,59),
+(10,9,31,28,35,40,66,61),
+(10,9,32,28,36,40,68,62),
+(10,9,33,29,36,41,69,64),
+(10,9,34,29,37,42,71,65),
+(10,9,35,29,37,43,73,67),
+(10,9,36,30,38,43,74,69),
+(10,9,37,30,38,44,76,70),
+(10,9,38,31,39,45,77,72),
+(10,9,39,31,39,46,79,73),
+(10,9,40,32,40,47,81,75),
+(10,9,41,32,41,48,82,77),
+(10,9,42,33,41,48,84,78),
+(10,9,43,33,42,49,86,80),
+(10,9,44,34,42,50,88,82),
+(10,9,45,34,43,51,89,83),
+(10,9,46,35,44,52,91,85),
+(10,9,47,35,44,53,93,87),
+(10,9,48,36,45,54,95,89),
+(10,9,49,36,45,54,96,90),
+(10,9,50,37,46,55,98,92),
+(10,9,51,37,47,56,100,94),
+(10,9,52,38,47,57,102,96),
+(10,9,53,38,48,58,104,97),
+(10,9,54,39,49,59,105,99),
+(10,9,55,39,49,60,107,101),
+(10,9,56,40,50,61,109,103),
+(10,9,57,40,51,62,111,105),
+(10,9,58,41,51,63,113,107),
+(10,9,59,42,52,64,115,108),
+(10,9,60,42,53,65,117,110),
+(10,9,61,43,53,66,119,112),
+(10,9,62,43,54,67,121,114),
+(10,9,63,44,55,68,123,116),
+(10,9,64,44,56,69,125,118),
+(10,9,65,45,56,70,127,120),
+(10,9,66,46,57,71,129,122),
+(10,9,67,46,58,72,131,124),
+(10,9,68,47,58,73,133,126),
+(10,9,69,47,59,74,135,128),
+(10,9,70,48,60,75,137,130),
+(10,9,71,49,61,83,139,141),
+(10,9,72,50,61,84,142,143),
+(10,9,73,51,62,84,144,146),
+(10,9,74,51,63,86,147,149),
+(10,9,75,52,64,89,149,151),
+(10,9,76,53,65,90,155,154),
+(10,9,77,54,66,91,155,157),
+(10,9,78,54,67,93,157,160),
+(10,9,79,55,68,94,160,163),
+(10,9,80,56,69,95,163,165),
+(11,1,1,24,17,21,21,22),
+(11,1,2,25,18,22,21,22),
+(11,1,3,27,19,23,21,23),
+(11,1,4,28,19,25,21,23),
+(11,1,5,29,20,26,21,23),
+(11,1,6,31,21,27,21,23),
+(11,1,7,32,22,28,21,24),
+(11,1,8,33,23,29,22,24),
+(11,1,9,35,24,31,22,24),
+(11,1,10,36,24,32,22,25),
+(11,1,11,37,25,33,22,25),
+(11,1,12,39,26,34,22,25),
+(11,1,13,40,27,36,22,26),
+(11,1,14,42,28,37,22,26),
+(11,1,15,43,29,38,22,26),
+(11,1,16,45,30,40,22,27),
+(11,1,17,46,31,41,23,27),
+(11,1,18,48,32,43,23,27),
+(11,1,19,49,33,44,23,28),
+(11,1,20,51,34,45,23,28),
+(11,1,21,52,34,47,23,28),
+(11,1,22,54,35,48,23,29),
+(11,1,23,55,36,50,23,29),
+(11,1,24,57,37,51,24,30),
+(11,1,25,59,38,52,24,30),
+(11,1,26,60,39,54,24,30),
+(11,1,27,62,40,55,24,31),
+(11,1,28,63,41,57,24,31),
+(11,1,29,65,43,58,24,32),
+(11,1,30,67,44,60,24,32),
+(11,1,31,69,45,62,25,32),
+(11,1,32,70,46,63,25,33),
+(11,1,33,72,47,65,25,33),
+(11,1,34,74,48,66,25,34),
+(11,1,35,75,49,68,25,34),
+(11,1,36,77,50,69,26,35),
+(11,1,37,79,51,71,26,35),
+(11,1,38,81,52,73,26,35),
+(11,1,39,83,53,74,26,36),
+(11,1,40,84,55,76,26,36),
+(11,1,41,86,56,78,27,37),
+(11,1,42,88,57,79,27,37),
+(11,1,43,90,58,81,27,38),
+(11,1,44,92,59,83,27,38),
+(11,1,45,94,60,85,27,39),
+(11,1,46,96,62,86,28,39),
+(11,1,47,98,63,88,28,40),
+(11,1,48,100,64,90,28,40),
+(11,1,49,102,65,92,28,41),
+(11,1,50,103,66,93,29,41),
+(11,1,51,105,68,95,29,42),
+(11,1,52,107,69,97,29,42),
+(11,1,53,109,70,99,29,43),
+(11,1,54,112,71,101,30,44),
+(11,1,55,114,73,103,30,44),
+(11,1,56,116,74,104,30,45),
+(11,1,57,118,75,106,30,45),
+(11,1,58,120,77,108,31,46),
+(11,1,59,122,78,110,31,46),
+(11,1,60,124,79,112,31,47),
+(11,1,61,126,81,114,31,48),
+(11,1,62,128,82,116,32,48),
+(11,1,63,130,83,118,32,49),
+(11,1,64,133,85,120,32,49),
+(11,1,65,135,86,122,33,50),
+(11,1,66,137,87,124,33,51),
+(11,1,67,139,89,126,33,51),
+(11,1,68,141,90,128,33,52),
+(11,1,69,144,92,130,34,52),
+(11,1,70,146,93,132,34,53),
+(11,1,71,149,94,134,34,54),
+(11,1,72,151,96,137,34,55),
+(11,1,73,154,98,139,34,56),
+(11,1,74,157,99,142,35,56),
+(11,1,75,166,101,149,35,57),
+(11,1,76,172,103,155,35,58),
+(11,1,77,175,105,159,36,59),
+(11,1,78,179,106,161,36,59),
+(11,1,79,182,108,164,36,60),
+(11,1,80,185,110,167,37,61),
+(11,2,1,23,17,21,21,23),
+(11,2,2,24,18,22,22,24),
+(11,2,3,25,18,23,22,24),
+(11,2,4,26,19,24,23,25),
+(11,2,5,27,19,25,24,26),
+(11,2,6,29,20,26,24,26),
+(11,2,7,30,21,27,25,27),
+(11,2,8,31,21,28,26,28),
+(11,2,9,32,22,29,26,29),
+(11,2,10,33,22,31,27,29),
+(11,2,11,34,23,32,28,30),
+(11,2,12,36,24,33,28,31),
+(11,2,13,37,24,34,29,32),
+(11,2,14,38,25,35,30,32),
+(11,2,15,39,26,36,31,33),
+(11,2,16,40,26,37,31,34),
+(11,2,17,42,27,39,32,35),
+(11,2,18,43,28,40,33,36),
+(11,2,19,44,28,41,34,37),
+(11,2,20,46,29,42,34,37),
+(11,2,21,47,30,44,35,38),
+(11,2,22,48,31,45,36,39),
+(11,2,23,50,31,46,37,40),
+(11,2,24,51,32,47,38,41),
+(11,2,25,52,33,49,38,42),
+(11,2,26,54,34,50,39,43),
+(11,2,27,55,34,51,40,44),
+(11,2,28,56,35,53,41,44),
+(11,2,29,58,36,54,42,45),
+(11,2,30,59,37,55,43,46),
+(11,2,31,61,37,57,43,47),
+(11,2,32,62,38,58,44,48),
+(11,2,33,64,39,59,45,49),
+(11,2,34,65,40,61,46,50),
+(11,2,35,67,41,62,47,51),
+(11,2,36,68,42,64,48,52),
+(11,2,37,70,42,65,49,53),
+(11,2,38,71,43,67,50,54),
+(11,2,39,73,44,68,51,55),
+(11,2,40,74,45,69,52,56),
+(11,2,41,76,46,71,53,57),
+(11,2,42,78,47,72,54,58),
+(11,2,43,79,47,74,55,59),
+(11,2,44,81,48,75,56,60),
+(11,2,45,82,49,77,57,61),
+(11,2,46,84,50,78,58,62),
+(11,2,47,86,51,80,59,64),
+(11,2,48,87,52,82,60,65),
+(11,2,49,89,53,83,61,66),
+(11,2,50,91,54,85,62,67),
+(11,2,51,92,55,86,63,68),
+(11,2,52,94,56,88,64,69),
+(11,2,53,96,57,90,65,70),
+(11,2,54,97,58,91,66,71),
+(11,2,55,99,59,93,67,73),
+(11,2,56,101,60,95,68,74),
+(11,2,57,103,61,96,69,75),
+(11,2,58,105,62,98,70,76),
+(11,2,59,106,63,100,71,77),
+(11,2,60,108,64,101,72,78),
+(11,2,61,110,65,103,74,80),
+(11,2,62,112,66,105,75,81),
+(11,2,63,114,67,106,76,82),
+(11,2,64,116,68,108,77,83),
+(11,2,65,117,69,110,78,85),
+(11,2,66,119,70,112,79,86),
+(11,2,67,121,71,114,80,87),
+(11,2,68,123,72,115,82,88),
+(11,2,69,125,73,117,83,90),
+(11,2,70,127,74,119,84,91),
+(11,2,71,130,75,121,87,92),
+(11,2,72,132,76,124,90,94),
+(11,2,73,134,77,126,93,96),
+(11,2,74,137,79,128,97,97),
+(11,2,75,139,80,130,101,99),
+(11,2,76,142,81,133,106,100),
+(11,2,77,144,83,135,108,102),
+(11,2,78,147,84,137,110,104),
+(11,2,79,149,85,140,111,105),
+(11,2,80,152,87,142,113,107),
+(11,3,1,21,20,20,21,23),
+(11,3,2,21,21,21,22,24),
+(11,3,3,22,23,22,22,24),
+(11,3,4,22,24,23,23,25),
+(11,3,5,23,25,24,23,25),
+(11,3,6,23,27,25,24,26),
+(11,3,7,24,28,26,24,27),
+(11,3,8,24,30,27,25,27),
+(11,3,9,25,31,27,26,28),
+(11,3,10,25,33,28,26,29),
+(11,3,11,25,34,29,27,29),
+(11,3,12,26,36,30,28,30),
+(11,3,13,26,37,31,28,31),
+(11,3,14,27,39,32,29,32),
+(11,3,15,27,40,34,30,32),
+(11,3,16,28,42,35,30,33),
+(11,3,17,28,43,36,31,34),
+(11,3,18,29,45,37,32,35),
+(11,3,19,29,47,38,32,35),
+(11,3,20,30,48,39,33,36),
+(11,3,21,31,50,40,34,37),
+(11,3,22,31,51,41,34,38),
+(11,3,23,32,53,42,35,38),
+(11,3,24,32,55,43,36,39),
+(11,3,25,33,57,44,37,40),
+(11,3,26,33,58,46,37,41),
+(11,3,27,34,60,47,38,42),
+(11,3,28,35,62,48,39,42),
+(11,3,29,35,63,49,40,43),
+(11,3,30,36,65,50,40,44),
+(11,3,31,36,67,52,41,45),
+(11,3,32,37,69,53,42,46),
+(11,3,33,38,71,54,43,47),
+(11,3,34,38,72,55,44,48),
+(11,3,35,39,74,57,44,48),
+(11,3,36,39,76,58,45,49),
+(11,3,37,40,78,59,46,50),
+(11,3,38,41,80,60,47,51),
+(11,3,39,41,82,62,48,52),
+(11,3,40,42,84,63,49,53),
+(11,3,41,43,86,64,50,54),
+(11,3,42,43,88,66,50,55),
+(11,3,43,44,90,67,51,56),
+(11,3,44,45,91,68,52,57),
+(11,3,45,45,93,70,53,58),
+(11,3,46,46,95,71,54,59),
+(11,3,47,47,98,72,55,60),
+(11,3,48,48,100,74,56,61),
+(11,3,49,48,102,75,57,62),
+(11,3,50,49,104,77,58,63),
+(11,3,51,50,106,78,59,64),
+(11,3,52,51,108,79,60,65),
+(11,3,53,51,110,81,61,66),
+(11,3,54,52,112,82,61,67),
+(11,3,55,53,114,84,62,68),
+(11,3,56,54,116,85,63,69),
+(11,3,57,54,118,87,64,70),
+(11,3,58,55,121,88,65,71),
+(11,3,59,56,123,90,66,72),
+(11,3,60,57,125,91,67,74),
+(11,3,61,58,127,93,68,75),
+(11,3,62,58,130,94,69,76),
+(11,3,63,59,132,96,71,77),
+(11,3,64,60,134,97,72,78),
+(11,3,65,61,136,99,73,79),
+(11,3,66,62,139,101,74,80),
+(11,3,67,62,141,102,75,81),
+(11,3,68,63,143,104,76,83),
+(11,3,69,64,146,105,77,84),
+(11,3,70,65,148,107,78,85),
+(11,3,71,66,151,109,79,86),
+(11,3,72,67,154,111,80,87),
+(11,3,73,68,157,113,81,89),
+(11,3,74,69,160,115,83,90),
+(11,3,75,70,163,117,84,92),
+(11,3,76,71,166,119,85,93),
+(11,3,77,72,169,121,87,95),
+(11,3,78,73,172,123,88,96),
+(11,3,79,74,175,125,89,98),
+(11,3,80,75,178,127,91,99),
+(11,5,1,21,17,19,23,25),
+(11,5,2,21,17,19,24,26),
+(11,5,3,21,17,20,26,28),
+(11,5,4,21,18,20,27,29),
+(11,5,5,22,18,20,28,30),
+(11,5,6,22,18,21,30,32),
+(11,5,7,22,18,21,31,33),
+(11,5,8,22,19,22,32,35),
+(11,5,9,22,19,22,34,36),
+(11,5,10,22,19,22,35,38),
+(11,5,11,23,19,23,37,39),
+(11,5,12,23,20,23,38,41),
+(11,5,13,23,20,24,39,42),
+(11,5,14,23,20,24,41,44),
+(11,5,15,23,20,25,42,45),
+(11,5,16,24,21,25,44,47),
+(11,5,17,24,21,25,45,48),
+(11,5,18,24,21,26,47,50),
+(11,5,19,24,22,26,48,51),
+(11,5,20,24,22,27,50,53),
+(11,5,21,25,22,27,51,55),
+(11,5,22,25,22,28,53,56),
+(11,5,23,25,23,28,55,58),
+(11,5,24,25,23,29,56,60),
+(11,5,25,25,23,29,58,61),
+(11,5,26,26,24,30,60,63),
+(11,5,27,26,24,30,61,65),
+(11,5,28,26,24,31,63,66),
+(11,5,29,26,25,31,65,68),
+(11,5,30,27,25,32,66,70),
+(11,5,31,27,25,32,68,72),
+(11,5,32,27,26,33,70,73),
+(11,5,33,27,26,33,71,75),
+(11,5,34,28,26,34,73,77),
+(11,5,35,28,27,34,75,79),
+(11,5,36,28,27,35,77,81),
+(11,5,37,29,28,35,79,83),
+(11,5,38,29,28,36,80,85),
+(11,5,39,29,28,37,82,86),
+(11,5,40,29,29,37,84,88),
+(11,5,41,30,29,38,86,90),
+(11,5,42,30,29,38,88,92),
+(11,5,43,30,30,39,90,94),
+(11,5,44,31,30,39,91,96),
+(11,5,45,31,31,40,93,98),
+(11,5,46,31,31,41,95,100),
+(11,5,47,32,31,41,97,102),
+(11,5,48,32,32,42,99,104),
+(11,5,49,32,32,43,101,106),
+(11,5,50,33,33,43,103,108),
+(11,5,51,33,33,44,105,110),
+(11,5,52,33,34,44,107,113),
+(11,5,53,34,34,45,109,115),
+(11,5,54,34,34,46,111,117),
+(11,5,55,34,35,46,113,119),
+(11,5,56,35,35,47,115,121),
+(11,5,57,35,36,48,118,123),
+(11,5,58,35,36,48,120,126),
+(11,5,59,36,37,49,122,128),
+(11,5,60,36,37,50,124,130),
+(11,5,61,36,38,51,126,132),
+(11,5,62,37,38,51,128,134),
+(11,5,63,37,39,52,130,137),
+(11,5,64,38,39,53,133,139),
+(11,5,65,38,40,53,135,141),
+(11,5,66,38,40,54,137,144),
+(11,5,67,39,40,55,139,146),
+(11,5,68,39,41,56,141,148),
+(11,5,69,40,41,56,144,151),
+(11,5,70,40,42,57,146,153),
+(11,5,71,40,43,58,149,156),
+(11,5,72,41,43,58,155,159),
+(11,5,73,41,44,59,157,160),
+(11,5,74,42,44,61,160,163),
+(11,5,75,42,45,62,164,166),
+(11,5,76,42,46,62,167,169),
+(11,5,77,43,46,63,168,172),
+(11,5,78,43,47,64,169,177),
+(11,5,79,44,47,65,172,180),
+(11,5,80,44,48,66,175,183),
+(11,6,1,24,17,21,21,22),
+(11,6,2,25,18,22,21,22),
+(11,6,3,27,19,23,21,23),
+(11,6,4,28,19,25,21,23),
+(11,6,5,29,20,26,21,23),
+(11,6,6,31,21,27,21,23),
+(11,6,7,32,22,28,21,24),
+(11,6,8,33,23,29,22,24),
+(11,6,9,35,24,31,22,24),
+(11,6,10,36,24,32,22,25),
+(11,6,11,37,25,33,22,25),
+(11,6,12,39,26,34,22,25),
+(11,6,13,40,27,36,22,26),
+(11,6,14,42,28,37,22,26),
+(11,6,15,43,29,38,22,26),
+(11,6,16,45,30,40,22,27),
+(11,6,17,46,31,41,23,27),
+(11,6,18,48,32,43,23,27),
+(11,6,19,49,33,44,23,28),
+(11,6,20,51,34,45,23,28),
+(11,6,21,52,34,47,23,28),
+(11,6,22,54,35,48,23,29),
+(11,6,23,55,36,50,23,29),
+(11,6,24,57,37,51,24,30),
+(11,6,25,59,38,52,24,30),
+(11,6,26,60,39,54,24,30),
+(11,6,27,62,40,55,24,31),
+(11,6,28,63,41,57,24,31),
+(11,6,29,65,43,58,24,32),
+(11,6,30,67,44,60,24,32),
+(11,6,31,69,45,62,25,32),
+(11,6,32,70,46,63,25,33),
+(11,6,33,72,47,65,25,33),
+(11,6,34,74,48,66,25,34),
+(11,6,35,75,49,68,25,34),
+(11,6,36,77,50,69,26,35),
+(11,6,37,79,51,71,26,35),
+(11,6,38,81,52,73,26,35),
+(11,6,39,83,53,74,26,36),
+(11,6,40,84,55,76,26,36),
+(11,6,41,86,56,78,27,37),
+(11,6,42,88,57,79,27,37),
+(11,6,43,90,58,81,27,38),
+(11,6,44,92,59,83,27,38),
+(11,6,45,94,60,85,27,39),
+(11,6,46,96,62,86,28,39),
+(11,6,47,98,63,88,28,40),
+(11,6,48,100,64,90,28,40),
+(11,6,49,102,65,92,28,41),
+(11,6,50,103,65,93,29,41),
+(11,6,51,105,66,94,29,42),
+(11,6,52,106,67,95,29,42),
+(11,6,53,107,68,96,29,43),
+(11,6,54,108,69,97,30,44),
+(11,6,55,109,70,98,30,44),
+(11,6,56,112,72,101,30,45),
+(11,6,57,114,73,103,30,45),
+(11,6,58,117,74,105,31,46),
+(11,6,59,119,76,107,31,46),
+(11,6,60,121,77,109,31,47),
+(11,6,61,123,78,111,31,48),
+(11,6,62,126,80,113,31,48),
+(11,6,63,128,81,116,32,49),
+(11,6,64,131,83,118,32,49),
+(11,6,65,136,84,120,32,50),
+(11,6,66,140,86,123,32,51),
+(11,6,67,141,87,125,33,51),
+(11,6,68,141,89,127,33,52),
+(11,6,69,144,90,130,33,53),
+(11,6,70,147,92,132,33,53),
+(11,6,71,150,94,135,34,54),
+(11,6,72,152,95,137,34,55),
+(11,6,73,155,97,140,34,56),
+(11,6,74,162,99,142,34,56),
+(11,6,75,165,100,145,35,57),
+(11,6,76,167,102,146,35,58),
+(11,6,77,169,104,150,35,59),
+(11,6,78,170,105,152,35,59),
+(11,6,79,173,107,156,36,60),
+(11,6,80,176,109,159,36,61),
+(11,7,1,22,17,20,22,24),
+(11,7,2,23,17,21,23,25),
+(11,7,3,24,18,22,24,26),
+(11,7,4,25,18,23,25,27),
+(11,7,5,25,19,24,26,28),
+(11,7,6,26,19,25,27,29),
+(11,7,7,27,20,26,28,30),
+(11,7,8,28,20,27,28,31),
+(11,7,9,29,21,28,29,32),
+(11,7,10,30,21,29,30,33),
+(11,7,11,31,22,30,31,35),
+(11,7,12,32,22,31,32,36),
+(11,7,13,33,23,32,33,37),
+(11,7,14,34,23,33,34,38),
+(11,7,15,34,24,35,35,39),
+(11,7,16,35,24,36,36,40),
+(11,7,17,36,25,37,38,42),
+(11,7,18,37,25,38,39,43),
+(11,7,19,38,26,39,40,44),
+(11,7,20,39,26,40,41,45),
+(11,7,21,40,27,41,42,46),
+(11,7,22,41,27,43,43,48),
+(11,7,23,43,28,44,44,49),
+(11,7,24,44,28,45,45,50),
+(11,7,25,45,29,46,46,51),
+(11,7,26,46,30,47,48,53),
+(11,7,27,47,30,49,49,54),
+(11,7,28,48,31,50,50,55),
+(11,7,29,49,31,51,51,57),
+(11,7,30,50,32,53,52,58),
+(11,7,31,51,33,54,53,59),
+(11,7,32,52,33,55,55,61),
+(11,7,33,53,34,56,56,62),
+(11,7,34,55,34,58,57,64),
+(11,7,35,56,35,59,58,65),
+(11,7,36,57,36,60,60,66),
+(11,7,37,58,36,62,61,68),
+(11,7,38,59,37,63,62,69),
+(11,7,39,61,38,65,63,71),
+(11,7,40,62,38,66,65,72),
+(11,7,41,63,39,67,66,74),
+(11,7,42,64,40,69,67,75),
+(11,7,43,65,40,70,69,77),
+(11,7,44,67,41,72,70,78),
+(11,7,45,68,42,73,71,80),
+(11,7,46,69,42,75,73,81),
+(11,7,47,71,43,76,74,83),
+(11,7,48,72,44,78,76,84),
+(11,7,49,73,45,79,77,86),
+(11,7,50,74,45,81,78,88),
+(11,7,51,76,46,82,80,89),
+(11,7,52,77,47,84,81,91),
+(11,7,53,78,47,85,83,92),
+(11,7,54,80,48,87,84,94),
+(11,7,55,81,49,88,86,96),
+(11,7,56,83,50,90,87,97),
+(11,7,57,84,50,91,89,99),
+(11,7,58,85,51,93,90,101),
+(11,7,59,87,52,95,92,102),
+(11,7,60,88,53,96,93,104),
+(11,7,61,90,54,98,95,106),
+(11,7,62,91,54,99,96,108),
+(11,7,63,93,55,101,98,109),
+(11,7,64,94,56,103,99,111),
+(11,7,65,95,57,104,101,113),
+(11,7,66,97,58,106,103,115),
+(11,7,67,98,58,108,104,117),
+(11,7,68,100,59,110,106,118),
+(11,7,69,101,60,111,107,120),
+(11,7,70,103,61,113,109,122),
+(11,7,71,104,62,115,122,124),
+(11,7,72,106,63,117,124,127),
+(11,7,73,108,64,119,126,129),
+(11,7,74,110,65,122,128,131),
+(11,7,75,112,66,124,130,133),
+(11,7,76,114,67,126,133,136),
+(11,7,77,115,68,128,135,138),
+(11,7,78,117,69,130,137,140),
+(11,7,79,119,70,133,139,143),
+(11,7,80,121,71,135,141,145),
+(11,8,1,21,17,19,24,24),
+(11,8,2,21,17,19,25,25),
+(11,8,3,21,17,20,27,27),
+(11,8,4,21,17,20,28,28),
+(11,8,5,21,18,20,29,29),
+(11,8,6,21,18,20,31,31),
+(11,8,7,21,18,21,32,32),
+(11,8,8,22,18,21,34,33),
+(11,8,9,22,18,21,35,35),
+(11,8,10,22,19,22,37,36),
+(11,8,11,22,19,22,38,37),
+(11,8,12,22,19,22,40,39),
+(11,8,13,22,19,23,41,40),
+(11,8,14,22,19,23,43,42),
+(11,8,15,22,19,23,44,43),
+(11,8,16,22,20,24,46,45),
+(11,8,17,23,20,24,47,46),
+(11,8,18,23,20,24,49,48),
+(11,8,19,23,20,25,50,49),
+(11,8,20,23,21,25,52,51),
+(11,8,21,23,21,26,54,52),
+(11,8,22,23,21,26,55,54),
+(11,8,23,23,21,26,57,56),
+(11,8,24,24,21,27,59,57),
+(11,8,25,24,22,27,60,59),
+(11,8,26,24,22,27,62,60),
+(11,8,27,24,22,28,64,62),
+(11,8,28,24,22,28,65,64),
+(11,8,29,24,23,29,67,65),
+(11,8,30,24,23,29,69,67),
+(11,8,31,25,23,30,71,69),
+(11,8,32,25,23,30,73,71),
+(11,8,33,25,24,30,74,72),
+(11,8,34,25,24,31,76,74),
+(11,8,35,25,24,31,78,76),
+(11,8,36,26,24,32,80,78),
+(11,8,37,26,25,32,82,79),
+(11,8,38,26,25,33,84,81),
+(11,8,39,26,25,33,86,83),
+(11,8,40,26,26,34,87,85),
+(11,8,41,27,26,34,89,87),
+(11,8,42,27,26,35,91,89),
+(11,8,43,27,27,35,93,91),
+(11,8,44,27,27,36,95,92),
+(11,8,45,27,27,36,97,94),
+(11,8,46,28,27,37,99,96),
+(11,8,47,28,28,37,101,98),
+(11,8,48,28,28,38,103,100),
+(11,8,49,28,28,38,105,102),
+(11,8,50,29,29,39,107,104),
+(11,8,51,29,29,39,110,106),
+(11,8,52,29,29,40,112,108),
+(11,8,53,29,30,40,114,110),
+(11,8,54,30,30,41,116,112),
+(11,8,55,30,30,41,118,114),
+(11,8,56,30,31,42,120,116),
+(11,8,57,30,31,42,122,118),
+(11,8,58,31,31,43,125,121),
+(11,8,59,31,32,43,127,123),
+(11,8,60,31,32,44,129,125),
+(11,8,61,31,33,45,131,127),
+(11,8,62,32,33,45,133,129),
+(11,8,63,32,33,46,136,131),
+(11,8,64,32,34,46,138,134),
+(11,8,65,33,34,47,140,136),
+(11,8,66,33,34,48,143,138),
+(11,8,67,33,35,48,145,140),
+(11,8,68,33,35,49,147,142),
+(11,8,69,34,36,49,150,145),
+(11,8,70,34,36,50,152,147),
+(11,8,71,34,36,51,155,150),
+(11,8,72,34,37,52,161,153),
+(11,8,73,34,37,53,161,156),
+(11,8,74,35,38,53,164,158),
+(11,8,75,35,38,54,167,161),
+(11,8,76,35,38,55,170,164),
+(11,8,77,36,39,56,173,167),
+(11,8,78,36,39,56,176,170),
+(11,8,79,36,40,57,179,173),
+(11,8,80,37,40,58,182,176);
/*!40000 ALTER TABLE `player_levelstats` ENABLE KEYS */;
UNLOCK TABLES;
@@ -2442,6 +9582,69 @@ CREATE TABLE `playercreateinfo` (
LOCK TABLES `playercreateinfo` WRITE;
/*!40000 ALTER TABLE `playercreateinfo` DISABLE KEYS */;
+INSERT INTO `playercreateinfo` VALUES
+(1,1,0,12,-8949,-132,84),
+(1,2,0,12,-8949,-132,84),
+(1,4,0,12,-8949,-132,84),
+(1,5,0,12,-8949,-132,84),
+(1,6,609,4298,2355.84,-5664.77,426.028),
+(1,8,0,12,-8949,-132,84),
+(1,9,0,12,-8949,-132,84),
+(2,1,1,14,-618,-4251,39),
+(2,3,1,14,-618,-4251,39),
+(2,4,1,14,-618,-4251,39),
+(2,6,609,4298,2358.44,-5666.9,426.023),
+(2,7,1,14,-618,-4251,39),
+(2,9,1,14,-618,-4251,39),
+(3,1,0,1,-6240,331,383),
+(3,2,0,1,-6240,331,383),
+(3,3,0,1,-6240,331,383),
+(3,4,0,1,-6240,331,383),
+(3,5,0,1,-6240,331,383),
+(3,6,609,4298,2358.44,-5666.9,426.023),
+(4,1,1,141,10311,832,1327),
+(4,3,1,141,10311,832,1327),
+(4,4,1,141,10311,832,1327),
+(4,5,1,141,10311,832,1327),
+(4,6,609,4298,2356.21,-5662.21,426.026),
+(4,11,1,141,10311,832,1327),
+(5,1,0,85,1676,1677,122),
+(5,4,0,85,1676,1677,122),
+(5,5,0,85,1676,1677,122),
+(5,8,0,85,1676,1677,122),
+(5,9,0,85,1676,1677,122),
+(5,6,609,4298,2356.21,-5662.21,426.026),
+(6,1,1,215,-2917,-257,53),
+(6,3,1,215,-2917,-257,53),
+(6,6,609,4298,2358.17,-5663.21,426.027),
+(6,7,1,215,-2917,-257,53),
+(6,11,1,215,-2917,-257,53),
+(7,1,0,1,-6240,331,383),
+(7,4,0,1,-6340,331,383),
+(7,6,609,4298,2355.05,-5661.7, 426.026),
+(7,8,0,1,-6340,331,383),
+(7,9,0,1,-6340,331,383),
+(8,1,1,14,-618,-4251,39),
+(8,3,1,14,-618,-4251,39),
+(8,4,1,14,-618,-4251,39),
+(8,5,1,14,-618,-4251,39),
+(8,6,609,4298,2355.05,-5661.7, 426.026),
+(8,7,1,14,-618,-4251,39),
+(8,8,1,14,-618,-4251,39),
+(10,2,530,3431,10349.6,-6357.29,33.4026),
+(10,3,530,3431,10349.6,-6357.29,33.4026),
+(10,4,530,3431,10349.6,-6357.29,33.4026),
+(10,5,530,3431,10349.6,-6357.29,33.4026),
+(10,6,609,4298,2355.84,-5664.77,426.028),
+(10,8,530,3431,10349.6,-6357.29,33.4026),
+(10,9,530,3431,10349.6,-6357.29,33.4026),
+(11,1,530,3526,-3961.64,-13931.2,100.615),
+(11,2,530,3526,-3961.64,-13931.2,100.615),
+(11,3,530,3526,-3961.64,-13931.2,100.615),
+(11,5,530,3526,-3961.64,-13931.2,100.615),
+(11,6,609,4298,2358.17,-5663.21,426.027),
+(11,7,530,3526,-3961.64,-13931.2,100.615),
+(11,8,530,3526,-3961.64,-13931.2,100.615);
/*!40000 ALTER TABLE `playercreateinfo` ENABLE KEYS */;
UNLOCK TABLES;
@@ -2466,6 +9669,360 @@ CREATE TABLE `playercreateinfo_action` (
LOCK TABLES `playercreateinfo_action` WRITE;
/*!40000 ALTER TABLE `playercreateinfo_action` DISABLE KEYS */;
+INSERT INTO `playercreateinfo_action` VALUES
+(1,1,1,78,0,0),
+(1,1,0,6603,0,0),
+(1,1,11,117,128,0),
+(1,2,2,635,0,0),
+(1,2,0,6603,0,0),
+(1,2,1,21084,0,0),
+(1,2,10,159,128,0),
+(1,2,11,2070,128,0),
+(1,4,1,1752,0,0),
+(1,4,2,2098,0,0),
+(1,4,3,2764,0,0),
+(1,4,0,6603,0,0),
+(1,4,11,2070,128,0),
+(1,5,1,585,0,0),
+(1,5,2,2050,0,0),
+(1,5,0,6603,0,0),
+(1,5,10,159,128,0),
+(1,5,11,2070,128,0),
+(1,6,0,6603,0,0),
+(1,6,1,49576,0,0),
+(1,6,2,45477,0,0),
+(1,6,3,45462,0,0),
+(1,6,4,45902,0,0),
+(1,6,5,47541,0,0),
+(1,6,11,59752,0,0),
+(1,8,1,133,0,0),
+(1,8,2,168,0,0),
+(1,8,0,6603,0,0),
+(1,8,10,159,128,0),
+(1,8,11,2070,128,0),
+(1,9,1,686,0,0),
+(1,9,2,687,0,0),
+(1,9,0,6603,0,0),
+(1,9,10,159,128,0),
+(1,9,11,4604,128,0),
+(2,1,1,78,0,0),
+(2,1,0,6603,0,0),
+(2,1,11,117,128,0),
+(2,3,2,75,0,0),
+(2,3,1,2973,0,0),
+(2,3,0,6603,0,0),
+(2,3,11,117,128,0),
+(2,3,10,159,128,0),
+(2,4,10,0,128,0),
+(2,4,1,1752,0,0),
+(2,4,2,2098,0,0),
+(2,4,0,6603,0,0),
+(2,4,11,117,128,0),
+(2,6,0,6603,0,0),
+(2,6,1,49576,0,0),
+(2,6,2,45477,0,0),
+(2,6,3,45462,0,0),
+(2,6,4,45902,0,0),
+(2,6,5,47541,0,0),
+(2,6,10,20572,0,0),
+(2,7,2,331,0,0),
+(2,7,1,403,0,0),
+(2,7,0,6603,0,0),
+(2,7,11,117,128,0),
+(2,7,10,159,128,0),
+(2,9,1,686,0,0),
+(2,9,2,687,0,0),
+(2,9,0,6603,0,0),
+(2,9,11,117,128,0),
+(2,9,10,159,128,0),
+(3,1,1,78,0,0),
+(3,1,0,6603,0,0),
+(3,1,11,117,128,0),
+(3,2,2,635,0,0),
+(3,2,0,6603,0,0),
+(3,2,1,21084,0,0),
+(3,2,10,159,128,0),
+(3,2,11,4540,128,0),
+(3,3,2,75,0,0),
+(3,3,1,2973,0,0),
+(3,3,0,6603,0,0),
+(3,3,11,117,128,0),
+(3,3,10,159,128,0),
+(3,4,1,1752,0,0),
+(3,4,2,2098,0,0),
+(3,4,3,2764,0,0),
+(3,4,0,6603,0,0),
+(3,4,11,4540,128,0),
+(3,5,1,585,0,0),
+(3,5,2,2050,0,0),
+(3,5,0,6603,0,0),
+(3,5,10,159,128,0),
+(3,5,11,4540,128,0),
+(3,6,0,6603,0,0),
+(3,6,1,49576,0,0),
+(3,6,2,45477,0,0),
+(3,6,3,45462,0,0),
+(3,6,4,45902,0,0),
+(3,6,5,47541,0,0),
+(3,6,10,2481,0,0),
+(4,1,1,78,0,0),
+(4,1,0,6603,0,0),
+(4,1,11,117,128,0),
+(4,3,2,75,0,0),
+(4,3,1,2973,0,0),
+(4,3,0,6603,0,0),
+(4,3,11,117,128,0),
+(4,3,10,159,128,0),
+(4,4,1,1752,0,0),
+(4,4,2,2098,0,0),
+(4,4,3,2764,0,0),
+(4,4,0,6603,0,0),
+(4,4,11,4540,128,0),
+(4,5,1,585,0,0),
+(4,5,2,2050,0,0),
+(4,5,0,6603,0,0),
+(4,5,10,159,128,0),
+(4,5,11,2070,128,0),
+(4,6,0,6603,0,0),
+(4,6,1,49576,0,0),
+(4,6,2,45477,0,0),
+(4,6,3,45462,0,0),
+(4,6,4,45902,0,0),
+(4,6,5,47541,0,0),
+(4,6,10,58984,0,0),
+(4,6,83,58984,0,0),
+(4,11,1,5176,0,0),
+(4,11,2,5185,0,0),
+(4,11,0,6603,0,0),
+(4,11,10,159,128,0),
+(4,11,11,4536,128,0),
+(5,1,11,4604,128,0),
+(5,1,0,6603,0,0),
+(5,1,1,78,0,0),
+(5,4,11,4604,128,0),
+(5,4,3,2764,0,0),
+(5,4,2,2098,0,0),
+(5,4,1,1752,0,0),
+(5,4,0,6603,0,0),
+(5,5,10,159,128,0),
+(5,5,2,2050,0,0),
+(5,5,1,585,0,0),
+(5,5,11,4604,128,0),
+(5,5,0,6603,0,0),
+(5,6,0,6603,0,0),
+(5,6,1,49576,0,0),
+(5,6,2,45477,0,0),
+(5,6,3,45462,0,0),
+(5,6,4,45902,0,0),
+(5,6,5,47541,0,0),
+(5,6,10,20577,0,0),
+(5,8,11,4604,128,0),
+(5,8,10,159,128,0),
+(5,8,2,168,0,0),
+(5,8,1,133,0,0),
+(5,8,0,6603,0,0),
+(5,9,1,686,0,0),
+(5,9,10,159,128,0),
+(5,9,2,687,0,0),
+(5,9,11,4604,128,0),
+(5,9,0,6603,0,0),
+(6,1,1,78,0,0),
+(6,1,2,20549,0,0),
+(6,1,11,4540,128,0),
+(6,1,0,6603,0,0),
+(6,3,1,2973,0,0),
+(6,3,10,159,128,0),
+(6,3,2,75,0,0),
+(6,3,3,20549,0,0),
+(6,3,11,117,128,0),
+(6,3,0,6603,0,0),
+(6,6,0,6603,0,0),
+(6,6,1,49576,0,0),
+(6,6,2,45477,0,0),
+(6,6,3,45462,0,0),
+(6,6,4,45902,0,0),
+(6,6,5,47541,0,0),
+(6,6,10,20549,0,0),
+(6,6,75,20549,0,0),
+(6,7,1,403,0,0),
+(6,7,10,159,128,0),
+(6,7,2,331,0,0),
+(6,7,3,20549,0,0),
+(6,7,11,4604,128,0),
+(6,7,0,6603,0,0),
+(6,11,1,5176,0,0),
+(6,11,10,159,128,0),
+(6,11,2,5185,0,0),
+(6,11,3,20549,0,0),
+(6,11,11,4536,128,0),
+(6,11,0,6603,0,0),
+(7,1,11,117,128,0),
+(7,1,1,78,0,0),
+(7,1,0,6603,0,0),
+(7,4,11,117,128,0),
+(7,4,3,2764,0,0),
+(7,4,1,1752,0,0),
+(7,4,2,2098,0,0),
+(7,4,0,6603,0,0),
+(7,6,0,6603,0,0),
+(7,6,1,49576,0,0),
+(7,6,2,45477,0,0),
+(7,6,3,45462,0,0),
+(7,6,4,45902,0,0),
+(7,6,5,47541,0,0),
+(7,6,10,20589,0,0),
+(7,6,72,6603,0,0),
+(7,6,83,117,128,0),
+(7,6,84,6603,0,0),
+(7,6,96,6603,0,0),
+(7,6,108,6603,0,0),
+(7,8,11,4536,128,0),
+(7,8,1,133,0,0),
+(7,8,2,168,0,0),
+(7,8,10,159,128,0),
+(7,8,0,6603,0,0),
+(7,9,11,4604,128,0),
+(7,9,1,686,0,0),
+(7,9,2,687,0,0),
+(7,9,10,159,128,0),
+(7,9,0,6603,0,0),
+(8,1,11,117,128,0),
+(8,1,1,78,0,0),
+(8,1,3,2764,0,0),
+(8,1,0,6603,0,0),
+(8,3,10,159,128,0),
+(8,3,11,4604,128,0),
+(8,3,1,2973,0,0),
+(8,3,2,75,0,0),
+(8,3,0,6603,0,0),
+(8,4,1,1752,0,0),
+(8,4,3,2764,0,0),
+(8,4,2,2098,0,0),
+(8,4,11,117,128,0),
+(8,4,0,6603,0,0),
+(8,5,1,585,0,0),
+(8,5,10,159,128,0),
+(8,5,2,2050,0,0),
+(8,5,11,4540,128,0),
+(8,5,0,6603,0,0),
+(8,6,0,6603,0,0),
+(8,6,1,49576,0,0),
+(8,6,2,45477,0,0),
+(8,6,3,45462,0,0),
+(8,6,4,45902,0,0),
+(8,6,5,47541,0,0),
+(8,6,10,50621,0,0),
+(8,7,1,403,0,0),
+(8,7,10,159,128,0),
+(8,7,2,331,0,0),
+(8,7,11,117,128,0),
+(8,7,0,6603,0,0),
+(8,8,1,133,0,0),
+(8,8,10,159,128,0),
+(8,8,2,168,0,0),
+(8,8,11,117,128,0),
+(8,8,0,6603,0,0),
+(10,2,0,6603,0,0),
+(10,2,1,21084,0,0),
+(10,2,2,635,0,0),
+(10,2,3,28734,0,0),
+(10,2,4,28730,0,0),
+(10,2,10,159,128,0),
+(10,2,11,20857,128,0),
+(10,3,0,6603,0,0),
+(10,3,1,2973,0,0),
+(10,3,2,75,0,0),
+(10,3,3,28734,0,0),
+(10,3,4,28730,0,0),
+(10,3,10,159,128,0),
+(10,3,11,20857,128,0),
+(10,4,0,6603,0,0),
+(10,4,1,1752,0,0),
+(10,4,2,2098,0,0),
+(10,4,3,2764,0,0),
+(10,4,4,28734,0,0),
+(10,4,5,25046,0,0),
+(10,4,11,20857,128,0),
+(10,5,0,6603,0,0),
+(10,5,1,585,0,0),
+(10,5,2,2050,0,0),
+(10,5,3,28734,0,0),
+(10,5,4,28730,0,0),
+(10,5,10,159,128,0),
+(10,5,11,20857,128,0),
+(10,6,0,6603,0,0),
+(10,6,1,49576,0,0),
+(10,6,2,45477,0,0),
+(10,6,3,45462,0,0),
+(10,6,4,45902,0,0),
+(10,6,5,47541,0,0),
+(10,6,6,50613,0,0),
+(10,8,0,6603,0,0),
+(10,8,1,133,0,0),
+(10,8,2,168,0,0),
+(10,8,3,28734,0,0),
+(10,8,4,28730,0,0),
+(10,8,10,159,128,0),
+(10,8,11,20857,128,0),
+(10,9,11,20857,128,0),
+(10,9,10,159,128,0),
+(10,9,4,28730,0,0),
+(10,9,3,28734,0,0),
+(10,9,2,687,0,0),
+(10,9,1,686,0,0),
+(10,9,0,6603,0,0),
+(11,1,0,6603,0,0),
+(11,1,72,6603,0,0),
+(11,1,73,78,0,0),
+(11,1,74,28880,0,0),
+(11,1,83,4540,128,0),
+(11,1,84,6603,0,0),
+(11,1,96,6603,0,0),
+(11,1,108,6603,0,0),
+(11,2,0,6603,0,0),
+(11,2,1,21084,0,0),
+(11,2,2,635,0,0),
+(11,2,3,28880,0,0),
+(11,2,10,159,128,0),
+(11,2,11,4540,128,0),
+(11,2,83,4540,128,0),
+(11,3,0,6603,0,0),
+(11,3,1,2973,0,0),
+(11,3,2,75,0,0),
+(11,3,3,28880,0,0),
+(11,3,10,159,128,0),
+(11,3,11,4540,128,0),
+(11,3,72,6603,0,0),
+(11,3,73,2973,0,0),
+(11,3,74,75,0,0),
+(11,3,82,159,128,0),
+(11,3,83,4540,128,0),
+(11,5,0,6603,0,0),
+(11,5,1,585,0,0),
+(11,5,2,2050,0,0),
+(11,5,3,28880,0,0),
+(11,5,10,159,128,0),
+(11,5,11,4540,128,0),
+(11,5,83,4540,128,0),
+(11,6,0,6603,0,0),
+(11,6,1,49576,0,0),
+(11,6,2,45477,0,0),
+(11,6,3,45462,0,0),
+(11,6,4,45902,0,0),
+(11,6,5,47541,0,0),
+(11,7,0,6603,0,0),
+(11,7,1,403,0,0),
+(11,7,2,331,0,0),
+(11,7,3,28880,0,0),
+(11,7,10,159,128,0),
+(11,7,11,4540,128,0),
+(11,8,0,6603,0,0),
+(11,8,1,133,0,0),
+(11,8,2,168,0,0),
+(11,8,3,28880,0,0),
+(11,8,10,159,128,0),
+(11,8,11,4540,128,0),
+(11,8,83,4540,128,0);
/*!40000 ALTER TABLE `playercreateinfo_action` ENABLE KEYS */;
UNLOCK TABLES;
@@ -2511,6 +10068,2694 @@ CREATE TABLE `playercreateinfo_spell` (
LOCK TABLES `playercreateinfo_spell` WRITE;
/*!40000 ALTER TABLE `playercreateinfo_spell` DISABLE KEYS */;
+INSERT INTO `playercreateinfo_spell` VALUES
+(1,1,78,'Heroic Strike',1),
+(1,1,81,'Dodge',1),
+(1,1,107,'Block',1),
+(1,1,196,'One-Handed Axes',1),
+(1,1,198,'One-Handed Maces',1),
+(1,1,201,'One-Handed Swords',1),
+(1,1,203,'Unarmed',1),
+(1,1,204,'Defense',1),
+(1,1,522,'SPELLDEFENSE(DND)',1),
+(1,1,668,'Language Common',1),
+(1,1,2382,'Generic',1),
+(1,1,2457,'Battle Stance',1),
+(1,1,2479,'Honorless Target',1),
+(1,1,3050,'Detect',1),
+(1,1,3365,'Opening',1),
+(1,1,5301,'Defensive State(DND)',1),
+(1,1,6233,'Closing',1),
+(1,1,6246,'Closing',1),
+(1,1,6247,'Opening',1),
+(1,1,6477,'Opening',1),
+(1,1,6478,'Opening',1),
+(1,1,6603,'Attack',1),
+(1,1,7266,'Duel',1),
+(1,1,7267,'Grovel',1),
+(1,1,7355,'Stuck',1),
+(1,1,7376,'Defensive Stance Passive',0),
+(1,1,7381,'Berserker Stance Passive',0),
+(1,1,8386,'Attacking',1),
+(1,1,8737,'Mail',1),
+(1,1,9077,'Leather',1),
+(1,1,9078,'Cloth',1),
+(1,1,9116,'Shield',1),
+(1,1,9125,'Generic',1),
+(1,1,20597,'Sword Specialization',1),
+(1,1,20598,'The Human Spirit',1),
+(1,1,20599,'Diplomacy',1),
+(1,1,20600,'Perception',1),
+(1,1,20864,'Mace Specialization',1),
+(1,1,21156,'Battle Stance Passive',0),
+(1,1,21651,'Opening',1),
+(1,1,21652,'Closing',1),
+(1,1,22027,'Remove Insignia',1),
+(1,1,22810,'Opening - No Text',1),
+(1,1,32215,'Victorious State',1),
+(1,2,81,'Dodge',1),
+(1,2,107,'Block',1),
+(1,2,198,'One-Handed Maces',1),
+(1,2,199,'Two-Handed Maces',1),
+(1,2,203,'Unarmed',1),
+(1,2,204,'Defense',1),
+(1,2,522,'SPELLDEFENSE(DND)',1),
+(1,2,635,'Holy Light',1),
+(1,2,668,'Language Common',1),
+(1,2,2382,'Generic',1),
+(1,2,2479,'Honorless Target',1),
+(1,2,3050,'Detect',1),
+(1,2,3365,'Opening',1),
+(1,2,6233,'Closing',1),
+(1,2,6246,'Closing',1),
+(1,2,6247,'Opening',1),
+(1,2,6477,'Opening',1),
+(1,2,6478,'Opening',1),
+(1,2,6603,'Attack',1),
+(1,2,7266,'Duel',1),
+(1,2,7267,'Grovel',1),
+(1,2,7355,'Stuck',1),
+(1,2,8386,'Attacking',1),
+(1,2,8737,'Mail',1),
+(1,2,9077,'Leather',1),
+(1,2,9078,'Cloth',1),
+(1,2,9116,'Shield',1),
+(1,2,9125,'Generic',1),
+(1,2,21084,'Seal of Righteousness',1),
+(1,2,20597,'Sword Specialization',1),
+(1,2,20598,'The Human Spirit',1),
+(1,2,20599,'Diplomacy',1),
+(1,2,20600,'Perception',1),
+(1,2,20864,'Mace Specialization',1),
+(1,2,21651,'Opening',1),
+(1,2,21652,'Closing',1),
+(1,2,22027,'Remove Insignia',1),
+(1,2,22810,'Opening - No Text',1),
+(1,2,27762,'Libram',1),
+(1,4,81,'Dodge',1),
+(1,4,203,'Unarmed',1),
+(1,4,204,'Defense',1),
+(1,4,522,'SPELLDEFENSE(DND)',1),
+(1,4,668,'Language Common',1),
+(1,4,1180,'Daggers',1),
+(1,4,1752,'Sinister Strike',1),
+(1,4,2098,'Eviscerate',1),
+(1,4,2382,'Generic',1),
+(1,4,2479,'Honorless Target',1),
+(1,4,2567,'Thrown',1),
+(1,4,2764,'Throw',1),
+(1,4,3050,'Detect',1),
+(1,4,3365,'Opening',1),
+(1,4,6233,'Closing',1),
+(1,4,6246,'Closing',1),
+(1,4,6247,'Opening',1),
+(1,4,6477,'Opening',1),
+(1,4,6478,'Opening',1),
+(1,4,6603,'Attack',1),
+(1,4,7266,'Duel',1),
+(1,4,7267,'Grovel',1),
+(1,4,7355,'Stuck',1),
+(1,4,8386,'Attacking',1),
+(1,4,9077,'Leather',1),
+(1,4,9078,'Cloth',1),
+(1,4,9125,'Generic',1),
+(1,4,16092,'Defensive State(DND)',1),
+(1,4,20597,'Sword Specialization',1),
+(1,4,20598,'The Human Spirit',1),
+(1,4,20599,'Diplomacy',1),
+(1,4,20600,'Perception',1),
+(1,4,20864,'Mace Specialization',1),
+(1,4,21184,'Rogue Passive(DND)',1),
+(1,4,21651,'Opening',1),
+(1,4,21652,'Closing',1),
+(1,4,22027,'Remove Insignia',1),
+(1,4,22810,'Opening - No Text',1),
+(1,5,81,'Dodge',1),
+(1,5,198,'One-Handed Maces',1),
+(1,5,203,'Unarmed',1),
+(1,5,204,'Defense',1),
+(1,5,522,'SPELLDEFENSE(DND)',1),
+(1,5,585,'Smite',1),
+(1,5,668,'Language Common',1),
+(1,5,2050,'Lesser Heal',1),
+(1,5,2382,'Generic',1),
+(1,5,2479,'Honorless Target',1),
+(1,5,3050,'Detect',1),
+(1,5,3365,'Opening',1),
+(1,5,5009,'Wands',1),
+(1,5,5019,'Shoot',1),
+(1,5,6233,'Closing',1),
+(1,5,6246,'Closing',1),
+(1,5,6247,'Opening',1),
+(1,5,6477,'Opening',1),
+(1,5,6478,'Opening',1),
+(1,5,6603,'Attack',1),
+(1,5,7266,'Duel',1),
+(1,5,7267,'Grovel',1),
+(1,5,7355,'Stuck',1),
+(1,5,8386,'Attacking',1),
+(1,5,9078,'Cloth',1),
+(1,5,9125,'Generic',1),
+(1,5,20597,'Sword Specialization',1),
+(1,5,20598,'The Human Spirit',1),
+(1,5,20599,'Diplomacy',1),
+(1,5,20600,'Perception',1),
+(1,5,20864,'Mace Specialization',1),
+(1,5,21651,'Opening',1),
+(1,5,21652,'Closing',1),
+(1,5,22027,'Remove Insignia',1),
+(1,5,22810,'Opening - No Text',1),
+(1,6,81,'Dodge',1),
+(1,6,196,'One-Handed Axes',1),
+(1,6,197,'Two-Handed Axes',1),
+(1,6,200,'Polearms',1),
+(1,6,201,'One-Handed Swords',1),
+(1,6,202,'Two-Handed Swords',1),
+(1,6,203,'Unarmed',1),
+(1,6,204,'Defense',1),
+(1,6,522,'SPELLDEFENSE (DND)',1),
+(1,6,668,'Language Common',1),
+(1,6,674,'Dual Wield',1),
+(1,6,750,'Plate Mail',1),
+(1,6,1843,'Disarm',1),
+(1,6,2382,'Generic',1),
+(1,6,2479,'Honorless Target',1),
+(1,6,3050,'Detect',1),
+(1,6,3127,'Parry',1),
+(1,6,3275,'Linen Bandage',1),
+(1,6,3276,'Heavy Linen Bandage',1),
+(1,6,3277,'Wool Bandage',1),
+(1,6,3278,'Heavy Wool Bandage',1),
+(1,6,3365,'Opening',1),
+(1,6,6233,'Closing',1),
+(1,6,6246,'Closing',1),
+(1,6,6247,'Opening',1),
+(1,6,6477,'Opening',1),
+(1,6,6478,'Opening',1),
+(1,6,6603,'Attack',1),
+(1,6,7266,'Duel',1),
+(1,6,7267,'Grovel',1),
+(1,6,7355,'Stuck',1),
+(1,6,7928,'Silk Bandage',1),
+(1,6,7929,'Heavy Silk Bandage',1),
+(1,6,7934,'Anti-Venom',1),
+(1,6,8386,'Attacking',1),
+(1,6,8737,'Mail',1),
+(1,6,9077,'Leather',1),
+(1,6,9078,'Cloth',1),
+(1,6,9125,'Generic',1),
+(1,6,10840,'Mageweave Bandage',1),
+(1,6,10841,'Heavy Mageweave Bandage',1),
+(1,6,10846,'First Aid',1),
+(1,6,18629,'Runecloth Bandage',1),
+(1,6,18630,'Heavy Runecloth Bandage',1),
+(1,6,20597,'Sword Specialization',1),
+(1,6,20598,'The Human Spirit',1),
+(1,6,20599,'Diplomacy',1),
+(1,6,20864,'Mace Specialization',1),
+(1,6,21651,'Opening',1),
+(1,6,21652,'Closing',1),
+(1,6,22027,'Remove Insignia',1),
+(1,6,22810,'Opening - No Text',1),
+(1,6,33391,'Journeyman Riding',1),
+(1,6,45462,'Plague Strike',1),
+(1,6,45477,'Icy Touch',1),
+(1,6,45902,'Blood Strike',1),
+(1,6,45903,'Offensive State (DND)',1),
+(1,6,45927,'Summon Friend',1),
+(1,6,47541,'Death Coil',1),
+(1,6,48266,'Blood Presence',1),
+(1,6,49410,'Forceful Deflection',1),
+(1,6,49576,'Death Grip',1),
+(1,6,52665,'Sigil',1),
+(1,6,58985,'Perception',1),
+(1,6,59752,'Every Man for Himself',1),
+(1,6,59879,'Blood Plague',1),
+(1,6,59921,'Frost Fever',1),
+(1,6,61437,'Opening',1),
+(1,6,61455,'Runic Focus',1),
+(1,8,81,'Dodge',1),
+(1,8,133,'Fireball',1),
+(1,8,168,'Frost Armor',1),
+(1,8,203,'Unarmed',1),
+(1,8,204,'Defense',1),
+(1,8,227,'Staves',1),
+(1,8,522,'SPELLDEFENSE(DND)',1),
+(1,8,668,'Language Common',1),
+(1,8,2382,'Generic',1),
+(1,8,2479,'Honorless Target',1),
+(1,8,3050,'Detect',1),
+(1,8,3365,'Opening',1),
+(1,8,5009,'Wands',1),
+(1,8,5019,'Shoot',1),
+(1,8,6233,'Closing',1),
+(1,8,6246,'Closing',1),
+(1,8,6247,'Opening',1),
+(1,8,6477,'Opening',1),
+(1,8,6478,'Opening',1),
+(1,8,6603,'Attack',1),
+(1,8,7266,'Duel',1),
+(1,8,7267,'Grovel',1),
+(1,8,7355,'Stuck',1),
+(1,8,8386,'Attacking',1),
+(1,8,9078,'Cloth',1),
+(1,8,9125,'Generic',1),
+(1,8,20597,'Sword Specialization',1),
+(1,8,20598,'The Human Spirit',1),
+(1,8,20599,'Diplomacy',1),
+(1,8,20600,'Perception',1),
+(1,8,20864,'Mace Specialization',1),
+(1,8,21651,'Opening',1),
+(1,8,21652,'Closing',1),
+(1,8,22027,'Remove Insignia',1),
+(1,8,22810,'Opening - No Text',1),
+(1,9,81,'Dodge',1),
+(1,9,203,'Unarmed',1),
+(1,9,204,'Defense',1),
+(1,9,522,'SPELLDEFENSE(DND)',1),
+(1,9,668,'Language Common',1),
+(1,9,686,'Shadow Bolt',1),
+(1,9,687,'Demon Skin',1),
+(1,9,1180,'Daggers',1),
+(1,9,2382,'Generic',1),
+(1,9,2479,'Honorless Target',1),
+(1,9,3050,'Detect',1),
+(1,9,3365,'Opening',1),
+(1,9,5009,'Wands',1),
+(1,9,5019,'Shoot',1),
+(1,9,6233,'Closing',1),
+(1,9,6246,'Closing',1),
+(1,9,6247,'Opening',1),
+(1,9,6477,'Opening',1),
+(1,9,6478,'Opening',1),
+(1,9,6603,'Attack',1),
+(1,9,7266,'Duel',1),
+(1,9,7267,'Grovel',1),
+(1,9,7355,'Stuck',1),
+(1,9,8386,'Attacking',1),
+(1,9,9078,'Cloth',1),
+(1,9,9125,'Generic',1),
+(1,9,20597,'Sword Specialization',1),
+(1,9,20598,'The Human Spirit',1),
+(1,9,20599,'Diplomacy',1),
+(1,9,20600,'Perception',1),
+(1,9,20864,'Mace Specialization',1),
+(1,9,21651,'Opening',1),
+(1,9,21652,'Closing',1),
+(1,9,22027,'Remove Insignia',1),
+(1,9,22810,'Opening - No Text',1),
+(2,1,78,'Heroic Strike',1),
+(2,1,81,'Dodge',1),
+(2,1,107,'Block',1),
+(2,1,196,'One-Handed Axes',1),
+(2,1,197,'Two-Handed Axes',1),
+(2,1,201,'One-Handed Swords',1),
+(2,1,203,'Unarmed',1),
+(2,1,204,'Defense',1),
+(2,1,522,'SPELLDEFENSE(DND)',1),
+(2,1,669,'Language Orcish',1),
+(2,1,2382,'Generic',1),
+(2,1,2457,'Battle Stance',1),
+(2,1,2479,'Honorless Target',1),
+(2,1,3050,'Detect',1),
+(2,1,3365,'Opening',1),
+(2,1,5301,'Defensive State(DND)',1),
+(2,1,6233,'Closing',1),
+(2,1,6246,'Closing',1),
+(2,1,6247,'Opening',1),
+(2,1,6477,'Opening',1),
+(2,1,6478,'Opening',1),
+(2,1,6603,'Attack',1),
+(2,1,7266,'Duel',1),
+(2,1,7267,'Grovel',1),
+(2,1,7355,'Stuck',1),
+(2,1,7376,'Defensive Stance Passive',0),
+(2,1,7381,'Berserker Stance Passive',0),
+(2,1,8386,'Attacking',1),
+(2,1,8737,'Mail',1),
+(2,1,9077,'Leather',1),
+(2,1,9078,'Cloth',1),
+(2,1,9116,'Shield',1),
+(2,1,9125,'Generic',1),
+(2,1,20572,'Blood Fury',1),
+(2,1,20573,'Hardiness',1),
+(2,1,20574,'Axe Specialization',1),
+(2,1,21156,'Battle Stance Passive',0),
+(2,1,21563,'Command',1),
+(2,1,21651,'Opening',1),
+(2,1,21652,'Closing',1),
+(2,1,22027,'Remove Insignia',1),
+(2,1,22810,'Opening - No Text',1),
+(2,1,32215,'Victorious State',1),
+(2,3,75,'Auto Shot',1),
+(2,3,81,'Dodge',1),
+(2,3,196,'One-Handed Axes',1),
+(2,3,203,'Unarmed',1),
+(2,3,204,'Defense',1),
+(2,3,264,'Bows',1),
+(2,3,522,'SPELLDEFENSE(DND)',1),
+(2,3,669,'Language Orcish',1),
+(2,3,2382,'Generic',1),
+(2,3,2479,'Honorless Target',1),
+(2,3,2973,'Raptor Strike',1),
+(2,3,3050,'Detect',1),
+(2,3,3365,'Opening',1),
+(2,3,6233,'Closing',1),
+(2,3,6246,'Closing',1),
+(2,3,6247,'Opening',1),
+(2,3,6477,'Opening',1),
+(2,3,6478,'Opening',1),
+(2,3,6603,'Attack',1),
+(2,3,7266,'Duel',1),
+(2,3,7267,'Grovel',1),
+(2,3,7355,'Stuck',1),
+(2,3,8386,'Attacking',1),
+(2,3,9077,'Leather',1),
+(2,3,9078,'Cloth',1),
+(2,3,9125,'Generic',1),
+(2,3,13358,'Defensive State(DND)',1),
+(2,3,20572,'Blood Fury',1),
+(2,3,20573,'Hardiness',1),
+(2,3,20574,'Axe Specialization',1),
+(2,3,20576,'Command',1),
+(2,3,21651,'Opening',1),
+(2,3,21652,'Closing',1),
+(2,3,22027,'Remove Insignia',1),
+(2,3,22810,'Opening - No Text',1),
+(2,3,24949,'Defensive State 2(DND)',1),
+(2,3,34082,'Advantaged State(DND)',1),
+(2,4,81,'Dodge',1),
+(2,4,203,'Unarmed',1),
+(2,4,204,'Defense',1),
+(2,4,522,'SPELLDEFENSE(DND)',1),
+(2,4,669,'Language Orcish',1),
+(2,4,1180,'Daggers',1),
+(2,4,1752,'Sinister Strike',1),
+(2,4,2098,'Eviscerate',1),
+(2,4,2382,'Generic',1),
+(2,4,2479,'Honorless Target',1),
+(2,4,2567,'Thrown',1),
+(2,4,2764,'Throw',1),
+(2,4,3050,'Detect',1),
+(2,4,3365,'Opening',1),
+(2,4,6233,'Closing',1),
+(2,4,6246,'Closing',1),
+(2,4,6247,'Opening',1),
+(2,4,6477,'Opening',1),
+(2,4,6478,'Opening',1),
+(2,4,6603,'Attack',1),
+(2,4,7266,'Duel',1),
+(2,4,7267,'Grovel',1),
+(2,4,7355,'Stuck',1),
+(2,4,8386,'Attacking',1),
+(2,4,9077,'Leather',1),
+(2,4,9078,'Cloth',1),
+(2,4,9125,'Generic',1),
+(2,4,16092,'Defensive State(DND)',1),
+(2,4,20572,'Blood Fury',1),
+(2,4,20573,'Hardiness',1),
+(2,4,20574,'Axe Specialization',1),
+(2,4,21184,'Rogue Passive(DND)',1),
+(2,4,21563,'Command',1),
+(2,4,21651,'Opening',1),
+(2,4,21652,'Closing',1),
+(2,4,22027,'Remove Insignia',1),
+(2,4,22810,'Opening - No Text',1),
+(2,6,81,'Dodge',1),
+(2,6,196,'One-Handed Axes',1),
+(2,6,197,'Two-Handed Axes',1),
+(2,6,200,'Polearms',1),
+(2,6,201,'One-Handed Swords',1),
+(2,6,202,'Two-Handed Swords',1),
+(2,6,203,'Unarmed',1),
+(2,6,204,'Defense',1),
+(2,6,522,'SPELLDEFENSE (DND)',1),
+(2,6,669,'Language Orcish',1),
+(2,6,674,'Dual Wield',1),
+(2,6,750,'Plate Mail',1),
+(2,6,1843,'Disarm',1),
+(2,6,2382,'Generic',1),
+(2,6,2479,'Honorless Target',1),
+(2,6,3050,'Detect',1),
+(2,6,3127,'Parry',1),
+(2,6,3275,'Linen Bandage',1),
+(2,6,3276,'Heavy Linen Bandage',1),
+(2,6,3277,'Wool Bandage',1),
+(2,6,3278,'Heavy Wool Bandage',1),
+(2,6,3365,'Opening',1),
+(2,6,6233,'Closing',1),
+(2,6,6246,'Closing',1),
+(2,6,6247,'Opening',1),
+(2,6,6477,'Opening',1),
+(2,6,6478,'Opening',1),
+(2,6,6603,'Attack',1),
+(2,6,7266,'Duel',1),
+(2,6,7267,'Grovel',1),
+(2,6,7355,'Stuck',1),
+(2,6,7928,'Silk Bandage',1),
+(2,6,7929,'Heavy Silk Bandage',1),
+(2,6,7934,'Anti-Venom',1),
+(2,6,8386,'Attacking',1),
+(2,6,8737,'Mail',1),
+(2,6,9077,'Leather',1),
+(2,6,9078,'Cloth',1),
+(2,6,9125,'Generic',1),
+(2,6,10840,'Mageweave Bandage',1),
+(2,6,10841,'Heavy Mageweave Bandage',1),
+(2,6,10846,'First Aid',1),
+(2,6,18629,'Runecloth Bandage',1),
+(2,6,18630,'Heavy Runecloth Bandage',1),
+(2,6,20572,'Blood Fury',1),
+(2,6,20573,'Hardiness',1),
+(2,6,20574,'Axe Specialization',1),
+(2,6,21651,'Opening',1),
+(2,6,21652,'Closing',1),
+(2,6,22027,'Remove Insignia',1),
+(2,6,22810,'Opening - No Text',1),
+(2,6,33391,'Journeyman Riding',1),
+(2,6,45462,'Plague Strike',1),
+(2,6,45477,'Icy Touch',1),
+(2,6,45902,'Blood Strike',1),
+(2,6,45903,'Offensive State (DND)',1),
+(2,6,45927,'Summon Friend',1),
+(2,6,47541,'Death Coil',1),
+(2,6,48266,'Blood Presence',1),
+(2,6,49410,'Forceful Deflection',1),
+(2,6,49576,'Death Grip',1),
+(2,6,52665,'Sigil',1),
+(2,6,54562,'Command',1),
+(2,6,59879,'Blood Plague',1),
+(2,6,59921,'Frost Fever',1),
+(2,6,61437,'Opening',1),
+(2,6,61455,'Runic Focus',1),
+(2,7,81,'Dodge',1),
+(2,7,107,'Block',1),
+(2,7,198,'One-Handed Maces',1),
+(2,7,203,'Unarmed',1),
+(2,7,204,'Defense',1),
+(2,7,227,'Staves',1),
+(2,7,331,'Healing Wave',1),
+(2,7,403,'Lightning Bolt',1),
+(2,7,522,'SPELLDEFENSE(DND)',1),
+(2,7,669,'Language Orcish',1),
+(2,7,2382,'Generic',1),
+(2,7,2479,'Honorless Target',1),
+(2,7,3050,'Detect',1),
+(2,7,3365,'Opening',1),
+(2,7,6233,'Closing',1),
+(2,7,6246,'Closing',1),
+(2,7,6247,'Opening',1),
+(2,7,6477,'Opening',1),
+(2,7,6478,'Opening',1),
+(2,7,6603,'Attack',1),
+(2,7,7266,'Duel',1),
+(2,7,7267,'Grovel',1),
+(2,7,7355,'Stuck',1),
+(2,7,8386,'Attacking',1),
+(2,7,9077,'Leather',1),
+(2,7,9078,'Cloth',1),
+(2,7,9116,'Shield',1),
+(2,7,9125,'Generic',1),
+(2,7,20573,'Hardiness',1),
+(2,7,20574,'Axe Specialization',1),
+(2,7,21563,'Command',1),
+(2,7,21651,'Opening',1),
+(2,7,21652,'Closing',1),
+(2,7,22027,'Remove Insignia',1),
+(2,7,22810,'Opening - No Text',1),
+(2,7,27763,'Totem',1),
+(2,7,33697,'Blood Fury',1),
+(2,9,81,'Dodge',1),
+(2,9,203,'Unarmed',1),
+(2,9,204,'Defense',1),
+(2,9,522,'SPELLDEFENSE(DND)',1),
+(2,9,669,'Language Orcish',1),
+(2,9,686,'Shadow Bolt',1),
+(2,9,687,'Demon Skin',1),
+(2,9,1180,'Daggers',1),
+(2,9,2382,'Generic',1),
+(2,9,2479,'Honorless Target',1),
+(2,9,3050,'Detect',1),
+(2,9,3365,'Opening',1),
+(2,9,5009,'Wands',1),
+(2,9,5019,'Shoot',1),
+(2,9,6233,'Closing',1),
+(2,9,6246,'Closing',1),
+(2,9,6247,'Opening',1),
+(2,9,6477,'Opening',1),
+(2,9,6478,'Opening',1),
+(2,9,6603,'Attack',1),
+(2,9,7266,'Duel',1),
+(2,9,7267,'Grovel',1),
+(2,9,7355,'Stuck',1),
+(2,9,8386,'Attacking',1),
+(2,9,9078,'Cloth',1),
+(2,9,9125,'Generic',1),
+(2,9,20573,'Hardiness',1),
+(2,9,20574,'Axe Specialization',1),
+(2,9,20575,'Command',1),
+(2,9,21651,'Opening',1),
+(2,9,21652,'Closing',1),
+(2,9,22027,'Remove Insignia',1),
+(2,9,22810,'Opening - No Text',1),
+(2,9,33702,'Blood Fury',1),
+(3,1,78,'Heroic Strike',1),
+(3,1,81,'Dodge',1),
+(3,1,107,'Block',1),
+(3,1,196,'One-Handed Axes',1),
+(3,1,197,'Two-Handed Axes',1),
+(3,1,198,'One-Handed Maces',1),
+(3,1,203,'Unarmed',1),
+(3,1,204,'Defense',1),
+(3,1,522,'SPELLDEFENSE(DND)',1),
+(3,1,668,'Language Common',1),
+(3,1,672,'Language Dwarven',1),
+(3,1,2382,'Generic',1),
+(3,1,2457,'Battle Stance',1),
+(3,1,2479,'Honorless Target',1),
+(3,1,2481,'Find Treasure',1),
+(3,1,3050,'Detect',1),
+(3,1,3365,'Opening',1),
+(3,1,5301,'Defensive State(DND)',1),
+(3,1,6233,'Closing',1),
+(3,1,6246,'Closing',1),
+(3,1,6247,'Opening',1),
+(3,1,6477,'Opening',1),
+(3,1,6478,'Opening',1),
+(3,1,6603,'Attack',1),
+(3,1,7266,'Duel',1),
+(3,1,7267,'Grovel',1),
+(3,1,7355,'Stuck',1),
+(3,1,7376,'Defensive Stance Passive',0),
+(3,1,7381,'Berserker Stance Passive',0),
+(3,1,8386,'Attacking',1),
+(3,1,8737,'Mail',1),
+(3,1,9077,'Leather',1),
+(3,1,9078,'Cloth',1),
+(3,1,9116,'Shield',1),
+(3,1,9125,'Generic',1),
+(3,1,20594,'Stoneform',1),
+(3,1,20595,'Gun Specialization',1),
+(3,1,20596,'Frost Resistance',1),
+(3,1,21156,'Battle Stance Passive',0),
+(3,1,21651,'Opening',1),
+(3,1,21652,'Closing',1),
+(3,1,22027,'Remove Insignia',1),
+(3,1,22810,'Opening - No Text',1),
+(3,1,32215,'Victorious State',1),
+(3,2,81,'Dodge',1),
+(3,2,107,'Block',1),
+(3,2,198,'One-Handed Maces',1),
+(3,2,199,'Two-Handed Maces',1),
+(3,2,203,'Unarmed',1),
+(3,2,204,'Defense',1),
+(3,2,522,'SPELLDEFENSE(DND)',1),
+(3,2,635,'Holy Light',1),
+(3,2,668,'Language Common',1),
+(3,2,672,'Language Dwarven',1),
+(3,2,2382,'Generic',1),
+(3,2,2479,'Honorless Target',1),
+(3,2,2481,'Find Treasure',1),
+(3,2,3050,'Detect',1),
+(3,2,3365,'Opening',1),
+(3,2,6233,'Closing',1),
+(3,2,6246,'Closing',1),
+(3,2,6247,'Opening',1),
+(3,2,6477,'Opening',1),
+(3,2,6478,'Opening',1),
+(3,2,6603,'Attack',1),
+(3,2,7266,'Duel',1),
+(3,2,7267,'Grovel',1),
+(3,2,7355,'Stuck',1),
+(3,2,8386,'Attacking',1),
+(3,2,8737,'Mail',1),
+(3,2,9077,'Leather',1),
+(3,2,9078,'Cloth',1),
+(3,2,9116,'Shield',1),
+(3,2,9125,'Generic',1),
+(3,2,21084,'Seal of Righteousness',1),
+(3,2,20594,'Stoneform',1),
+(3,2,20595,'Gun Specialization',1),
+(3,2,20596,'Frost Resistance',1),
+(3,2,21651,'Opening',1),
+(3,2,21652,'Closing',1),
+(3,2,22027,'Remove Insignia',1),
+(3,2,22810,'Opening - No Text',1),
+(3,2,27762,'Libram',1),
+(3,3,75,'Auto Shot',1),
+(3,3,81,'Dodge',1),
+(3,3,196,'One-Handed Axes',1),
+(3,3,203,'Unarmed',1),
+(3,3,204,'Defense',1),
+(3,3,266,'Guns',1),
+(3,3,522,'SPELLDEFENSE(DND)',1),
+(3,3,668,'Language Common',1),
+(3,3,672,'Language Dwarven',1),
+(3,3,2382,'Generic',1),
+(3,3,2479,'Honorless Target',1),
+(3,3,2481,'Find Treasure',1),
+(3,3,2973,'Raptor Strike',1),
+(3,3,3050,'Detect',1),
+(3,3,3365,'Opening',1),
+(3,3,6233,'Closing',1),
+(3,3,6246,'Closing',1),
+(3,3,6247,'Opening',1),
+(3,3,6477,'Opening',1),
+(3,3,6478,'Opening',1),
+(3,3,6603,'Attack',1),
+(3,3,7266,'Duel',1),
+(3,3,7267,'Grovel',1),
+(3,3,7355,'Stuck',1),
+(3,3,8386,'Attacking',1),
+(3,3,9077,'Leather',1),
+(3,3,9078,'Cloth',1),
+(3,3,9125,'Generic',1),
+(3,3,13358,'Defensive State(DND)',1),
+(3,3,20594,'Stoneform',1),
+(3,3,20595,'Gun Specialization',1),
+(3,3,20596,'Frost Resistance',1),
+(3,3,21651,'Opening',1),
+(3,3,21652,'Closing',1),
+(3,3,22027,'Remove Insignia',1),
+(3,3,22810,'Opening - No Text',1),
+(3,3,24949,'Defensive State 2(DND)',1),
+(3,3,34082,'Advantaged State(DND)',1),
+(3,4,81,'Dodge',1),
+(3,4,203,'Unarmed',1),
+(3,4,204,'Defense',1),
+(3,4,522,'SPELLDEFENSE(DND)',1),
+(3,4,668,'Language Common',1),
+(3,4,672,'Language Dwarven',1),
+(3,4,1180,'Daggers',1),
+(3,4,1752,'Sinister Strike',1),
+(3,4,2098,'Eviscerate',1),
+(3,4,2382,'Generic',1),
+(3,4,2479,'Honorless Target',1),
+(3,4,2481,'Find Treasure',1),
+(3,4,2567,'Thrown',1),
+(3,4,2764,'Throw',1),
+(3,4,3050,'Detect',1),
+(3,4,3365,'Opening',1),
+(3,4,6233,'Closing',1),
+(3,4,6246,'Closing',1),
+(3,4,6247,'Opening',1),
+(3,4,6477,'Opening',1),
+(3,4,6478,'Opening',1),
+(3,4,6603,'Attack',1),
+(3,4,7266,'Duel',1),
+(3,4,7267,'Grovel',1),
+(3,4,7355,'Stuck',1),
+(3,4,8386,'Attacking',1),
+(3,4,9077,'Leather',1),
+(3,4,9078,'Cloth',1),
+(3,4,9125,'Generic',1),
+(3,4,16092,'Defensive State(DND)',1),
+(3,4,20594,'Stoneform',1),
+(3,4,20595,'Gun Specialization',1),
+(3,4,20596,'Frost Resistance',1),
+(3,4,21184,'Rogue Passive(DND)',1),
+(3,4,21651,'Opening',1),
+(3,4,21652,'Closing',1),
+(3,4,22027,'Remove Insignia',1),
+(3,4,22810,'Opening - No Text',1),
+(3,5,81,'Dodge',1),
+(3,5,198,'One-Handed Maces',1),
+(3,5,203,'Unarmed',1),
+(3,5,204,'Defense',1),
+(3,5,522,'SPELLDEFENSE(DND)',1),
+(3,5,585,'Smite',1),
+(3,5,668,'Language Common',1),
+(3,5,672,'Language Dwarven',1),
+(3,5,2050,'Lesser Heal',1),
+(3,5,2382,'Generic',1),
+(3,5,2479,'Honorless Target',1),
+(3,5,2481,'Find Treasure',1),
+(3,5,3050,'Detect',1),
+(3,5,3365,'Opening',1),
+(3,5,5009,'Wands',1),
+(3,5,5019,'Shoot',1),
+(3,5,6233,'Closing',1),
+(3,5,6246,'Closing',1),
+(3,5,6247,'Opening',1),
+(3,5,6477,'Opening',1),
+(3,5,6478,'Opening',1),
+(3,5,6603,'Attack',1),
+(3,5,7266,'Duel',1),
+(3,5,7267,'Grovel',1),
+(3,5,7355,'Stuck',1),
+(3,5,8386,'Attacking',1),
+(3,5,9078,'Cloth',1),
+(3,5,9125,'Generic',1),
+(3,5,20594,'Stoneform',1),
+(3,5,20595,'Gun Specialization',1),
+(3,5,20596,'Frost Resistance',1),
+(3,5,21651,'Opening',1),
+(3,5,21652,'Closing',1),
+(3,5,22027,'Remove Insignia',1),
+(3,5,22810,'Opening - No Text',1),
+(3,6,81,'Dodge',1),
+(3,6,196,'One-Handed Axes',1),
+(3,6,197,'Two-Handed Axes',1),
+(3,6,200,'Polearms',1),
+(3,6,201,'One-Handed Swords',1),
+(3,6,202,'Two-Handed Swords',1),
+(3,6,203,'Unarmed',1),
+(3,6,204,'Defense',1),
+(3,6,522,'SPELLDEFENSE (DND)',1),
+(3,6,668,'Language Common',1),
+(3,6,672,'Language Dwarven',1),
+(3,6,674,'Dual Wield',1),
+(3,6,750,'Plate Mail',1),
+(3,6,1843,'Disarm',1),
+(3,6,2382,'Generic',1),
+(3,6,2479,'Honorless Target',1),
+(3,6,2481,'Find Treasure',1),
+(3,6,3050,'Detect',1),
+(3,6,3127,'Parry',1),
+(3,6,3275,'Linen Bandage',1),
+(3,6,3276,'Heavy Linen Bandage',1),
+(3,6,3277,'Wool Bandage',1),
+(3,6,3278,'Heavy Wool Bandage',1),
+(3,6,3365,'Opening',1),
+(3,6,6233,'Closing',1),
+(3,6,6246,'Closing',1),
+(3,6,6247,'Opening',1),
+(3,6,6477,'Opening',1),
+(3,6,6478,'Opening',1),
+(3,6,6603,'Attack',1),
+(3,6,7266,'Duel',1),
+(3,6,7267,'Grovel',1),
+(3,6,7355,'Stuck',1),
+(3,6,7928,'Silk Bandage',1),
+(3,6,7929,'Heavy Silk Bandage',1),
+(3,6,7934,'Anti-Venom',1),
+(3,6,8386,'Attacking',1),
+(3,6,8737,'Mail',1),
+(3,6,9077,'Leather',1),
+(3,6,9078,'Cloth',1),
+(3,6,9125,'Generic',1),
+(3,6,10840,'Mageweave Bandage',1),
+(3,6,10841,'Heavy Mageweave Bandage',1),
+(3,6,10846,'First Aid',1),
+(3,6,18629,'Runecloth Bandage',1),
+(3,6,18630,'Heavy Runecloth Bandage',1),
+(3,6,20594,'Stoneform',1),
+(3,6,20595,'Gun Specialization',1),
+(3,6,20596,'Frost Resistance',1),
+(3,6,21651,'Opening',1),
+(3,6,21652,'Closing',1),
+(3,6,22027,'Remove Insignia',1),
+(3,6,22810,'Opening - No Text',1),
+(3,6,33391,'Journeyman Riding',1),
+(3,6,45462,'Plague Strike',1),
+(3,6,45477,'Icy Touch',1),
+(3,6,45902,'Blood Strike',1),
+(3,6,45903,'Offensive State (DND)',1),
+(3,6,45927,'Summon Friend',1),
+(3,6,47541,'Death Coil',1),
+(3,6,48266,'Blood Presence',1),
+(3,6,49410,'Forceful Deflection',1),
+(3,6,49576,'Death Grip',1),
+(3,6,52665,'Sigil',1),
+(3,6,59224,'Mace Specialization',1),
+(3,6,59879,'Blood Plague',1),
+(3,6,59921,'Frost Fever',1),
+(3,6,61437,'Opening',1),
+(3,6,61455,'Runic Focus',1),
+(4,1,78,'Heroic Strike',1),
+(4,1,81,'Dodge',1),
+(4,1,107,'Block',1),
+(4,1,198,'One-Handed Maces',1),
+(4,1,201,'One-Handed Swords',1),
+(4,1,203,'Unarmed',1),
+(4,1,204,'Defense',1),
+(4,1,522,'SPELLDEFENSE(DND)',1),
+(4,1,668,'Language Common',1),
+(4,1,671,'Language Darnassian',1),
+(4,1,1180,'Daggers',1),
+(4,1,2382,'Generic',1),
+(4,1,2457,'Battle Stance',1),
+(4,1,2479,'Honorless Target',1),
+(4,1,3050,'Detect',1),
+(4,1,3365,'Opening',1),
+(4,1,5301,'Defensive State(DND)',1),
+(4,1,6233,'Closing',1),
+(4,1,6246,'Closing',1),
+(4,1,6247,'Opening',1),
+(4,1,6477,'Opening',1),
+(4,1,6478,'Opening',1),
+(4,1,6603,'Attack',1),
+(4,1,7266,'Duel',1),
+(4,1,7267,'Grovel',1),
+(4,1,7355,'Stuck',1),
+(4,1,7376,'Defensive Stance Passive',0),
+(4,1,7381,'Berserker Stance Passive',0),
+(4,1,8386,'Attacking',1),
+(4,1,8737,'Mail',1),
+(4,1,9077,'Leather',1),
+(4,1,9078,'Cloth',1),
+(4,1,9116,'Shield',1),
+(4,1,9125,'Generic',1),
+(4,1,20580,'Shadowmeld',1),
+(4,1,20582,'Quickness',1),
+(4,1,20583,'Nature Resistance',1),
+(4,1,20585,'Wisp Spirit',1),
+(4,1,21009,'Shadowmeld Passive',1),
+(4,1,21156,'Battle Stance Passive',0),
+(4,1,21651,'Opening',1),
+(4,1,21652,'Closing',1),
+(4,1,22027,'Remove Insignia',1),
+(4,1,22810,'Opening - No Text',1),
+(4,1,32215,'Victorious State',1),
+(4,3,75,'Auto Shot',1),
+(4,3,81,'Dodge',1),
+(4,3,203,'Unarmed',1),
+(4,3,204,'Defense',1),
+(4,3,264,'Bows',1),
+(4,3,522,'SPELLDEFENSE(DND)',1),
+(4,3,668,'Language Common',1),
+(4,3,671,'Language Darnassian',1),
+(4,3,1180,'Daggers',1),
+(4,3,2382,'Generic',1),
+(4,3,2479,'Honorless Target',1),
+(4,3,2973,'Raptor Strike',1),
+(4,3,3050,'Detect',1),
+(4,3,3365,'Opening',1),
+(4,3,6233,'Closing',1),
+(4,3,6246,'Closing',1),
+(4,3,6247,'Opening',1),
+(4,3,6477,'Opening',1),
+(4,3,6478,'Opening',1),
+(4,3,6603,'Attack',1),
+(4,3,7266,'Duel',1),
+(4,3,7267,'Grovel',1),
+(4,3,7355,'Stuck',1),
+(4,3,8386,'Attacking',1),
+(4,3,9077,'Leather',1),
+(4,3,9078,'Cloth',1),
+(4,3,9125,'Generic',1),
+(4,3,13358,'Defensive State(DND)',1),
+(4,3,20580,'Shadowmeld',1),
+(4,3,20582,'Quickness',1),
+(4,3,20583,'Nature Resistance',1),
+(4,3,20585,'Wisp Spirit',1),
+(4,3,21009,'Shadowmeld Passive',1),
+(4,3,21651,'Opening',1),
+(4,3,21652,'Closing',1),
+(4,3,22027,'Remove Insignia',1),
+(4,3,22810,'Opening - No Text',1),
+(4,3,24949,'Defensive State 2(DND)',1),
+(4,3,34082,'Advantaged State(DND)',1),
+(4,4,81,'Dodge',1),
+(4,4,203,'Unarmed',1),
+(4,4,204,'Defense',1),
+(4,4,522,'SPELLDEFENSE(DND)',1),
+(4,4,668,'Language Common',1),
+(4,4,671,'Language Darnassian',1),
+(4,4,1180,'Daggers',1),
+(4,4,1752,'Sinister Strike',1),
+(4,4,2098,'Eviscerate',1),
+(4,4,2382,'Generic',1),
+(4,4,2479,'Honorless Target',1),
+(4,4,2567,'Thrown',1),
+(4,4,2764,'Throw',1),
+(4,4,3050,'Detect',1),
+(4,4,3365,'Opening',1),
+(4,4,6233,'Closing',1),
+(4,4,6246,'Closing',1),
+(4,4,6247,'Opening',1),
+(4,4,6477,'Opening',1),
+(4,4,6478,'Opening',1),
+(4,4,6603,'Attack',1),
+(4,4,7266,'Duel',1),
+(4,4,7267,'Grovel',1),
+(4,4,7355,'Stuck',1),
+(4,4,8386,'Attacking',1),
+(4,4,9077,'Leather',1),
+(4,4,9078,'Cloth',1),
+(4,4,9125,'Generic',1),
+(4,4,16092,'Defensive State(DND)',1),
+(4,4,20580,'Shadowmeld',1),
+(4,4,20582,'Quickness',1),
+(4,4,20583,'Nature Resistance',1),
+(4,4,20585,'Wisp Spirit',1),
+(4,4,21009,'Shadowmeld Passive',1),
+(4,4,21184,'Rogue Passive(DND)',1),
+(4,4,21651,'Opening',1),
+(4,4,21652,'Closing',1),
+(4,4,22027,'Remove Insignia',1),
+(4,4,22810,'Opening - No Text',1),
+(4,5,81,'Dodge',1),
+(4,5,198,'One-Handed Maces',1),
+(4,5,203,'Unarmed',1),
+(4,5,204,'Defense',1),
+(4,5,522,'SPELLDEFENSE(DND)',1),
+(4,5,585,'Smite',1),
+(4,5,668,'Language Common',1),
+(4,5,671,'Language Darnassian',1),
+(4,5,2050,'Lesser Heal',1),
+(4,5,2382,'Generic',1),
+(4,5,2479,'Honorless Target',1),
+(4,5,3050,'Detect',1),
+(4,5,3365,'Opening',1),
+(4,5,5009,'Wands',1),
+(4,5,5019,'Shoot',1),
+(4,5,6233,'Closing',1),
+(4,5,6246,'Closing',1),
+(4,5,6247,'Opening',1),
+(4,5,6477,'Opening',1),
+(4,5,6478,'Opening',1),
+(4,5,6603,'Attack',1),
+(4,5,7266,'Duel',1),
+(4,5,7267,'Grovel',1),
+(4,5,7355,'Stuck',1),
+(4,5,8386,'Attacking',1),
+(4,5,9078,'Cloth',1),
+(4,5,9125,'Generic',1),
+(4,5,20580,'Shadowmeld',1),
+(4,5,20582,'Quickness',1),
+(4,5,20583,'Nature Resistance',1),
+(4,5,20585,'Wisp Spirit',1),
+(4,5,21009,'Shadowmeld Passive',1),
+(4,5,21651,'Opening',1),
+(4,5,21652,'Closing',1),
+(4,5,22027,'Remove Insignia',1),
+(4,5,22810,'Opening - No Text',1),
+(4,6,81,'Dodge',1),
+(4,6,196,'One-Handed Axes',1),
+(4,6,197,'Two-Handed Axes',1),
+(4,6,200,'Polearms',1),
+(4,6,201,'One-Handed Swords',1),
+(4,6,202,'Two-Handed Swords',1),
+(4,6,203,'Unarmed',1),
+(4,6,204,'Defense',1),
+(4,6,522,'SPELLDEFENSE (DND)',1),
+(4,6,668,'Language Common',1),
+(4,6,671,'Language Darnassian',1),
+(4,6,674,'Dual Wield',1),
+(4,6,750,'Plate Mail',1),
+(4,6,1843,'Disarm',1),
+(4,6,2382,'Generic',1),
+(4,6,2479,'Honorless Target',1),
+(4,6,3050,'Detect',1),
+(4,6,3127,'Parry',1),
+(4,6,3275,'Linen Bandage',1),
+(4,6,3276,'Heavy Linen Bandage',1),
+(4,6,3277,'Wool Bandage',1),
+(4,6,3278,'Heavy Wool Bandage',1),
+(4,6,3365,'Opening',1),
+(4,6,6233,'Closing',1),
+(4,6,6246,'Closing',1),
+(4,6,6247,'Opening',1),
+(4,6,6477,'Opening',1),
+(4,6,6478,'Opening',1),
+(4,6,6603,'Attack',1),
+(4,6,7266,'Duel',1),
+(4,6,7267,'Grovel',1),
+(4,6,7355,'Stuck',1),
+(4,6,7928,'Silk Bandage',1),
+(4,6,7929,'Heavy Silk Bandage',1),
+(4,6,7934,'Anti-Venom',1),
+(4,6,8386,'Attacking',1),
+(4,6,8737,'Mail',1),
+(4,6,9077,'Leather',1),
+(4,6,9078,'Cloth',1),
+(4,6,9125,'Generic',1),
+(4,6,10840,'Mageweave Bandage',1),
+(4,6,10841,'Heavy Mageweave Bandage',1),
+(4,6,10846,'First Aid',1),
+(4,6,18629,'Runecloth Bandage',1),
+(4,6,18630,'Heavy Runecloth Bandage',1),
+(4,6,20582,'Quickness',1),
+(4,6,20583,'Nature Resistance',1),
+(4,6,20585,'Wisp Spirit',1),
+(4,6,21651,'Opening',1),
+(4,6,21652,'Closing',1),
+(4,6,22027,'Remove Insignia',1),
+(4,6,22810,'Opening - No Text',1),
+(4,6,33391,'Journeyman Riding',1),
+(4,6,45462,'Plague Strike',1),
+(4,6,45477,'Icy Touch',1),
+(4,6,45902,'Blood Strike',1),
+(4,6,45903,'Offensive State (DND)',1),
+(4,6,45927,'Summon Friend',1),
+(4,6,47541,'Death Coil',1),
+(4,6,48266,'Blood Presence',1),
+(4,6,49410,'Forceful Deflection',1),
+(4,6,49576,'Death Grip',1),
+(4,6,52665,'Sigil',1),
+(4,6,58984,'Shadowmeld',1),
+(4,6,59879,'Blood Plague',1),
+(4,6,59921,'Frost Fever',1),
+(4,6,61437,'Opening',1),
+(4,6,61455,'Runic Focus',1),
+(4,11,81,'Dodge',1),
+(4,11,203,'Unarmed',1),
+(4,11,204,'Defense',1),
+(4,11,227,'Staves',1),
+(4,11,522,'SPELLDEFENSE(DND)',1),
+(4,11,668,'Language Common',1),
+(4,11,671,'Language Darnassian',1),
+(4,11,1178,'Bear Form(Passive)',0),
+(4,11,1180,'Daggers',1),
+(4,11,2382,'Generic',1),
+(4,11,2479,'Honorless Target',1),
+(4,11,3025,'Cat Form(Passive)',0),
+(4,11,3050,'Detect',1),
+(4,11,3365,'Opening',1),
+(4,11,5176,'Wrath',1),
+(4,11,5185,'Healing Touch',1),
+(4,11,5419,'Travel Form(Passive)',0),
+(4,11,5420,'Tree of Life',0),
+(4,11,5421,'Aquatic Form(Passive)',0),
+(4,11,6233,'Closing',1),
+(4,11,6246,'Closing',1),
+(4,11,6247,'Opening',1),
+(4,11,6477,'Opening',1),
+(4,11,6478,'Opening',1),
+(4,11,6603,'Attack',1),
+(4,11,7266,'Duel',1),
+(4,11,7267,'Grovel',1),
+(4,11,7355,'Stuck',1),
+(4,11,8386,'Attacking',1),
+(4,11,9077,'Leather',1),
+(4,11,9078,'Cloth',1),
+(4,11,9125,'Generic',1),
+(4,11,9635,'Dire Bear Form(Passive)',0),
+(4,11,20580,'Shadowmeld',1),
+(4,11,20582,'Quickness',1),
+(4,11,20583,'Nature Resistance',1),
+(4,11,20585,'Wisp Spirit',1),
+(4,11,21009,'Shadowmeld Passive',1),
+(4,11,21178,'Bear Form(Passive2)',0),
+(4,11,21651,'Opening',1),
+(4,11,21652,'Closing',1),
+(4,11,22027,'Remove Insignia',1),
+(4,11,22810,'Opening - No Text',1),
+(4,11,24905,'Moonkin Form(Passive)',0),
+(4,11,27764,'Fetish',1),
+(4,11,33948,'Flight Form(Passive)',0),
+(4,11,34123,'Tree of Life(Passive)',0),
+(4,11,40121,'Swift Flight Form(Passive)',0),
+(5,1,78,'Heroic Strike',1),
+(5,1,81,'Dodge',1),
+(5,1,107,'Block',1),
+(5,1,201,'One-Handed Swords',1),
+(5,1,202,'Two-Handed Swords',1),
+(5,1,203,'Unarmed',1),
+(5,1,204,'Defense',1),
+(5,1,522,'SPELLDEFENSE(DND)',1),
+(5,1,669,'Language Orcish',1),
+(5,1,1180,'Daggers',1),
+(5,1,2382,'Generic',1),
+(5,1,2457,'Battle Stance',1),
+(5,1,2479,'Honorless Target',1),
+(5,1,3050,'Detect',1),
+(5,1,3365,'Opening',1),
+(5,1,5227,'Underwater Breathing',1),
+(5,1,5301,'Defensive State(DND)',1),
+(5,1,6233,'Closing',1),
+(5,1,6246,'Closing',1),
+(5,1,6247,'Opening',1),
+(5,1,6477,'Opening',1),
+(5,1,6478,'Opening',1),
+(5,1,6603,'Attack',1),
+(5,1,7266,'Duel',1),
+(5,1,7267,'Grovel',1),
+(5,1,7355,'Stuck',1),
+(5,1,7376,'Defensive Stance Passive',0),
+(5,1,7381,'Berserker Stance Passive',0),
+(5,1,7744,'Will of the Forsaken',1),
+(5,1,8386,'Attacking',1),
+(5,1,8737,'Mail',1),
+(5,1,9077,'Leather',1),
+(5,1,9078,'Cloth',1),
+(5,1,9116,'Shield',1),
+(5,1,9125,'Generic',1),
+(5,1,17737,'Language Gutterspeak',1),
+(5,1,20577,'Cannibalize',1),
+(5,1,20579,'Shadow Resistance',1),
+(5,1,21156,'Battle Stance Passive',0),
+(5,1,21651,'Opening',1),
+(5,1,21652,'Closing',1),
+(5,1,22027,'Remove Insignia',1),
+(5,1,22810,'Opening - No Text',1),
+(5,1,32215,'Victorious State',1),
+(5,4,81,'Dodge',1),
+(5,4,203,'Unarmed',1),
+(5,4,204,'Defense',1),
+(5,4,522,'SPELLDEFENSE(DND)',1),
+(5,4,669,'Language Orcish',1),
+(5,4,1180,'Daggers',1),
+(5,4,1752,'Sinister Strike',1),
+(5,4,2098,'Eviscerate',1),
+(5,4,2382,'Generic',1),
+(5,4,2479,'Honorless Target',1),
+(5,4,2567,'Thrown',1),
+(5,4,2764,'Throw',1),
+(5,4,3050,'Detect',1),
+(5,4,3365,'Opening',1),
+(5,4,5227,'Underwater Breathing',1),
+(5,4,6233,'Closing',1),
+(5,4,6246,'Closing',1),
+(5,4,6247,'Opening',1),
+(5,4,6477,'Opening',1),
+(5,4,6478,'Opening',1),
+(5,4,6603,'Attack',1),
+(5,4,7266,'Duel',1),
+(5,4,7267,'Grovel',1),
+(5,4,7355,'Stuck',1),
+(5,4,7744,'Will of the Forsaken',1),
+(5,4,8386,'Attacking',1),
+(5,4,9077,'Leather',1),
+(5,4,9078,'Cloth',1),
+(5,4,9125,'Generic',1),
+(5,4,16092,'Defensive State(DND)',1),
+(5,4,17737,'Language Gutterspeak',1),
+(5,4,20577,'Cannibalize',1),
+(5,4,20579,'Shadow Resistance',1),
+(5,4,21184,'Rogue Passive(DND)',1),
+(5,4,21651,'Opening',1),
+(5,4,21652,'Closing',1),
+(5,4,22027,'Remove Insignia',1),
+(5,4,22810,'Opening - No Text',1),
+(5,5,81,'Dodge',1),
+(5,5,198,'One-Handed Maces',1),
+(5,5,203,'Unarmed',1),
+(5,5,204,'Defense',1),
+(5,5,522,'SPELLDEFENSE(DND)',1),
+(5,5,585,'Smite',1),
+(5,5,669,'Language Orcish',1),
+(5,5,2050,'Lesser Heal',1),
+(5,5,2382,'Generic',1),
+(5,5,2479,'Honorless Target',1),
+(5,5,3050,'Detect',1),
+(5,5,3365,'Opening',1),
+(5,5,5009,'Wands',1),
+(5,5,5019,'Shoot',1),
+(5,5,5227,'Underwater Breathing',1),
+(5,5,6233,'Closing',1),
+(5,5,6246,'Closing',1),
+(5,5,6247,'Opening',1),
+(5,5,6477,'Opening',1),
+(5,5,6478,'Opening',1),
+(5,5,6603,'Attack',1),
+(5,5,7266,'Duel',1),
+(5,5,7267,'Grovel',1),
+(5,5,7355,'Stuck',1),
+(5,5,7744,'Will of the Forsaken',1),
+(5,5,8386,'Attacking',1),
+(5,5,9078,'Cloth',1),
+(5,5,9125,'Generic',1),
+(5,5,17737,'Language Gutterspeak',1),
+(5,5,20577,'Cannibalize',1),
+(5,5,20579,'Shadow Resistance',1),
+(5,5,21651,'Opening',1),
+(5,5,21652,'Closing',1),
+(5,5,22027,'Remove Insignia',1),
+(5,5,22810,'Opening - No Text',1),
+(5,6,81,'Dodge',1),
+(5,6,196,'One-Handed Axes',1),
+(5,6,197,'Two-Handed Axes',1),
+(5,6,200,'Polearms',1),
+(5,6,201,'One-Handed Swords',1),
+(5,6,202,'Two-Handed Swords',1),
+(5,6,203,'Unarmed',1),
+(5,6,204,'Defense',1),
+(5,6,522,'SPELLDEFENSE (DND)',1),
+(5,6,669,'Language Orcish',1),
+(5,6,674,'Dual Wield',1),
+(5,6,750,'Plate Mail',1),
+(5,6,1843,'Disarm',1),
+(5,6,2382,'Generic',1),
+(5,6,2479,'Honorless Target',1),
+(5,6,3050,'Detect',1),
+(5,6,3127,'Parry',1),
+(5,6,3275,'Linen Bandage',1),
+(5,6,3276,'Heavy Linen Bandage',1),
+(5,6,3277,'Wool Bandage',1),
+(5,6,3278,'Heavy Wool Bandage',1),
+(5,6,3365,'Opening',1),
+(5,6,5227,'Underwater Breathing',1),
+(5,6,6233,'Closing',1),
+(5,6,6246,'Closing',1),
+(5,6,6247,'Opening',1),
+(5,6,6477,'Opening',1),
+(5,6,6478,'Opening',1),
+(5,6,6603,'Attack',1),
+(5,6,7266,'Duel',1),
+(5,6,7267,'Grovel',1),
+(5,6,7355,'Stuck',1),
+(5,6,7744,'Will of the Forsaken',1),
+(5,6,7928,'Silk Bandage',1),
+(5,6,7929,'Heavy Silk Bandage',1),
+(5,6,7934,'Anti-Venom',1),
+(5,6,8386,'Attacking',1),
+(5,6,8737,'Mail',1),
+(5,6,9077,'Leather',1),
+(5,6,9078,'Cloth',1),
+(5,6,9125,'Generic',1),
+(5,6,10840,'Mageweave Bandage',1),
+(5,6,10841,'Heavy Mageweave Bandage',1),
+(5,6,10846,'First Aid',1),
+(5,6,17737,'Language Gutterspeak',1),
+(5,6,18629,'Runecloth Bandage',1),
+(5,6,18630,'Heavy Runecloth Bandage',1),
+(5,6,20577,'Cannibalize',1),
+(5,6,20579,'Shadow Resistance',1),
+(5,6,21651,'Opening',1),
+(5,6,21652,'Closing',1),
+(5,6,22027,'Remove Insignia',1),
+(5,6,22810,'Opening - No Text',1),
+(5,6,33391,'Journeyman Riding',1),
+(5,6,45462,'Plague Strike',1),
+(5,6,45477,'Icy Touch',1),
+(5,6,45902,'Blood Strike',1),
+(5,6,45903,'Offensive State (DND)',1),
+(5,6,45927,'Summon Friend',1),
+(5,6,47541,'Death Coil',1),
+(5,6,48266,'Blood Presence',1),
+(5,6,49410,'Forceful Deflection',1),
+(5,6,49576,'Death Grip',1),
+(5,6,52665,'Sigil',1),
+(5,6,59879,'Blood Plague',1),
+(5,6,59921,'Frost Fever',1),
+(5,6,61437,'Opening',1),
+(5,6,61455,'Runic Focus',1),
+(5,8,81,'Dodge',1),
+(5,8,133,'Fireball',1),
+(5,8,168,'Frost Armor',1),
+(5,8,203,'Unarmed',1),
+(5,8,204,'Defense',1),
+(5,8,227,'Staves',1),
+(5,8,522,'SPELLDEFENSE(DND)',1),
+(5,8,669,'Language Orcish',1),
+(5,8,2382,'Generic',1),
+(5,8,2479,'Honorless Target',1),
+(5,8,3050,'Detect',1),
+(5,8,3365,'Opening',1),
+(5,8,5009,'Wands',1),
+(5,8,5019,'Shoot',1),
+(5,8,5227,'Underwater Breathing',1),
+(5,8,6233,'Closing',1),
+(5,8,6246,'Closing',1),
+(5,8,6247,'Opening',1),
+(5,8,6477,'Opening',1),
+(5,8,6478,'Opening',1),
+(5,8,6603,'Attack',1),
+(5,8,7266,'Duel',1),
+(5,8,7267,'Grovel',1),
+(5,8,7355,'Stuck',1),
+(5,8,7744,'Will of the Forsaken',1),
+(5,8,8386,'Attacking',1),
+(5,8,9078,'Cloth',1),
+(5,8,9125,'Generic',1),
+(5,8,17737,'Language Gutterspeak',1),
+(5,8,20577,'Cannibalize',1),
+(5,8,20579,'Shadow Resistance',1),
+(5,8,21651,'Opening',1),
+(5,8,21652,'Closing',1),
+(5,8,22027,'Remove Insignia',1),
+(5,8,22810,'Opening - No Text',1),
+(5,9,81,'Dodge',1),
+(5,9,203,'Unarmed',1),
+(5,9,204,'Defense',1),
+(5,9,522,'SPELLDEFENSE(DND)',1),
+(5,9,669,'Language Orcish',1),
+(5,9,686,'Shadow Bolt',1),
+(5,9,687,'Demon Skin',1),
+(5,9,1180,'Daggers',1),
+(5,9,2382,'Generic',1),
+(5,9,2479,'Honorless Target',1),
+(5,9,3050,'Detect',1),
+(5,9,3365,'Opening',1),
+(5,9,5009,'Wands',1),
+(5,9,5019,'Shoot',1),
+(5,9,5227,'Underwater Breathing',1),
+(5,9,6233,'Closing',1),
+(5,9,6246,'Closing',1),
+(5,9,6247,'Opening',1),
+(5,9,6477,'Opening',1),
+(5,9,6478,'Opening',1),
+(5,9,6603,'Attack',1),
+(5,9,7266,'Duel',1),
+(5,9,7267,'Grovel',1),
+(5,9,7355,'Stuck',1),
+(5,9,7744,'Will of the Forsaken',1),
+(5,9,8386,'Attacking',1),
+(5,9,9078,'Cloth',1),
+(5,9,9125,'Generic',1),
+(5,9,17737,'Language Gutterspeak',1),
+(5,9,20577,'Cannibalize',1),
+(5,9,20579,'Shadow Resistance',1),
+(5,9,21651,'Opening',1),
+(5,9,21652,'Closing',1),
+(5,9,22027,'Remove Insignia',1),
+(5,9,22810,'Opening - No Text',1),
+(6,1,78,'Heroic Strike',1),
+(6,1,81,'Dodge',1),
+(6,1,107,'Block',1),
+(6,1,196,'One-Handed Axes',1),
+(6,1,198,'One-Handed Maces',1),
+(6,1,199,'Two-Handed Maces',1),
+(6,1,203,'Unarmed',1),
+(6,1,204,'Defense',1),
+(6,1,522,'SPELLDEFENSE(DND)',1),
+(6,1,669,'Language Orcish',1),
+(6,1,670,'Language Taurahe',1),
+(6,1,2382,'Generic',1),
+(6,1,2457,'Battle Stance',1),
+(6,1,2479,'Honorless Target',1),
+(6,1,3050,'Detect',1),
+(6,1,3365,'Opening',1),
+(6,1,5301,'Defensive State(DND)',1),
+(6,1,6233,'Closing',1),
+(6,1,6246,'Closing',1),
+(6,1,6247,'Opening',1),
+(6,1,6477,'Opening',1),
+(6,1,6478,'Opening',1),
+(6,1,6603,'Attack',1),
+(6,1,7266,'Duel',1),
+(6,1,7267,'Grovel',1),
+(6,1,7355,'Stuck',1),
+(6,1,7376,'Defensive Stance Passive',0),
+(6,1,7381,'Berserker Stance Passive',0),
+(6,1,8386,'Attacking',1),
+(6,1,8737,'Mail',1),
+(6,1,9077,'Leather',1),
+(6,1,9078,'Cloth',1),
+(6,1,9116,'Shield',1),
+(6,1,9125,'Generic',1),
+(6,1,20549,'War Stomp',1),
+(6,1,20550,'Endurance',1),
+(6,1,20551,'Nature Resistance',1),
+(6,1,20552,'Cultivation',1),
+(6,1,21156,'Battle Stance Passive',0),
+(6,1,21651,'Opening',1),
+(6,1,21652,'Closing',1),
+(6,1,22027,'Remove Insignia',1),
+(6,1,22810,'Opening - No Text',1),
+(6,1,32215,'Victorious State',1),
+(6,3,75,'Auto Shot',1),
+(6,3,81,'Dodge',1),
+(6,3,196,'One-Handed Axes',1),
+(6,3,203,'Unarmed',1),
+(6,3,204,'Defense',1),
+(6,3,266,'Guns',1),
+(6,3,522,'SPELLDEFENSE(DND)',1),
+(6,3,669,'Language Orcish',1),
+(6,3,670,'Language Taurahe',1),
+(6,3,2382,'Generic',1),
+(6,3,2479,'Honorless Target',1),
+(6,3,2973,'Raptor Strike',1),
+(6,3,3050,'Detect',1),
+(6,3,3365,'Opening',1),
+(6,3,6233,'Closing',1),
+(6,3,6246,'Closing',1),
+(6,3,6247,'Opening',1),
+(6,3,6477,'Opening',1),
+(6,3,6478,'Opening',1),
+(6,3,6603,'Attack',1),
+(6,3,7266,'Duel',1),
+(6,3,7267,'Grovel',1),
+(6,3,7355,'Stuck',1),
+(6,3,8386,'Attacking',1),
+(6,3,9077,'Leather',1),
+(6,3,9078,'Cloth',1),
+(6,3,9125,'Generic',1),
+(6,3,13358,'Defensive State(DND)',1),
+(6,3,20549,'War Stomp',1),
+(6,3,20550,'Endurance',1),
+(6,3,20551,'Nature Resistance',1),
+(6,3,20552,'Cultivation',1),
+(6,3,21651,'Opening',1),
+(6,3,21652,'Closing',1),
+(6,3,22027,'Remove Insignia',1),
+(6,3,22810,'Opening - No Text',1),
+(6,3,24949,'Defensive State 2(DND)',1),
+(6,3,34082,'Advantaged State(DND)',1),
+(6,6,81,'Dodge',1),
+(6,6,196,'One-Handed Axes',1),
+(6,6,197,'Two-Handed Axes',1),
+(6,6,200,'Polearms',1),
+(6,6,201,'One-Handed Swords',1),
+(6,6,202,'Two-Handed Swords',1),
+(6,6,203,'Unarmed',1),
+(6,6,204,'Defense',1),
+(6,6,522,'SPELLDEFENSE (DND)',1),
+(6,6,669,'Language Orcish',1),
+(6,6,670,'Language Taurahe',1),
+(6,6,674,'Dual Wield',1),
+(6,6,750,'Plate Mail',1),
+(6,6,1843,'Disarm',1),
+(6,6,2382,'Generic',1),
+(6,6,2479,'Honorless Target',1),
+(6,6,3050,'Detect',1),
+(6,6,3127,'Parry',1),
+(6,6,3275,'Linen Bandage',1),
+(6,6,3276,'Heavy Linen Bandage',1),
+(6,6,3277,'Wool Bandage',1),
+(6,6,3278,'Heavy Wool Bandage',1),
+(6,6,3365,'Opening',1),
+(6,6,6233,'Closing',1),
+(6,6,6246,'Closing',1),
+(6,6,6247,'Opening',1),
+(6,6,6477,'Opening',1),
+(6,6,6478,'Opening',1),
+(6,6,6603,'Attack',1),
+(6,6,7266,'Duel',1),
+(6,6,7267,'Grovel',1),
+(6,6,7355,'Stuck',1),
+(6,6,7928,'Silk Bandage',1),
+(6,6,7929,'Heavy Silk Bandage',1),
+(6,6,7934,'Anti-Venom',1),
+(6,6,8386,'Attacking',1),
+(6,6,8737,'Mail',1),
+(6,6,9077,'Leather',1),
+(6,6,9078,'Cloth',1),
+(6,6,9125,'Generic',1),
+(6,6,10840,'Mageweave Bandage',1),
+(6,6,10841,'Heavy Mageweave Bandage',1),
+(6,6,10846,'First Aid',1),
+(6,6,18629,'Runecloth Bandage',1),
+(6,6,18630,'Heavy Runecloth Bandage',1),
+(6,6,20549,'War Stomp',1),
+(6,6,20550,'Endurance',1),
+(6,6,20551,'Nature Resistance',1),
+(6,6,20552,'Cultivation',1),
+(6,6,21651,'Opening',1),
+(6,6,21652,'Closing',1),
+(6,6,22027,'Remove Insignia',1),
+(6,6,22810,'Opening - No Text',1),
+(6,6,33391,'Journeyman Riding',1),
+(6,6,45462,'Plague Strike',1),
+(6,6,45477,'Icy Touch',1),
+(6,6,45902,'Blood Strike',1),
+(6,6,45903,'Offensive State (DND)',1),
+(6,6,45927,'Summon Friend',1),
+(6,6,47541,'Death Coil',1),
+(6,6,48266,'Blood Presence',1),
+(6,6,49410,'Forceful Deflection',1),
+(6,6,49576,'Death Grip',1),
+(6,6,52665,'Sigil',1),
+(6,6,59879,'Blood Plague',1),
+(6,6,59921,'Frost Fever',1),
+(6,6,61437,'Opening',1),
+(6,6,61455,'Runic Focus',1),
+(6,7,81,'Dodge',1),
+(6,7,107,'Block',1),
+(6,7,198,'One-Handed Maces',1),
+(6,7,203,'Unarmed',1),
+(6,7,204,'Defense',1),
+(6,7,227,'Staves',1),
+(6,7,331,'Healing Wave',1),
+(6,7,403,'Lightning Bolt',1),
+(6,7,522,'SPELLDEFENSE(DND)',1),
+(6,7,669,'Language Orcish',1),
+(6,7,670,'Language Taurahe',1),
+(6,7,2382,'Generic',1),
+(6,7,2479,'Honorless Target',1),
+(6,7,3050,'Detect',1),
+(6,7,3365,'Opening',1),
+(6,7,6233,'Closing',1),
+(6,7,6246,'Closing',1),
+(6,7,6247,'Opening',1),
+(6,7,6477,'Opening',1),
+(6,7,6478,'Opening',1),
+(6,7,6603,'Attack',1),
+(6,7,7266,'Duel',1),
+(6,7,7267,'Grovel',1),
+(6,7,7355,'Stuck',1),
+(6,7,8386,'Attacking',1),
+(6,7,9077,'Leather',1),
+(6,7,9078,'Cloth',1),
+(6,7,9116,'Shield',1),
+(6,7,9125,'Generic',1),
+(6,7,20549,'War Stomp',1),
+(6,7,20550,'Endurance',1),
+(6,7,20551,'Nature Resistance',1),
+(6,7,20552,'Cultivation',1),
+(6,7,21651,'Opening',1),
+(6,7,21652,'Closing',1),
+(6,7,22027,'Remove Insignia',1),
+(6,7,22810,'Opening - No Text',1),
+(6,7,27763,'Totem',1),
+(6,11,81,'Dodge',1),
+(6,11,198,'One-Handed Maces',1),
+(6,11,203,'Unarmed',1),
+(6,11,204,'Defense',1),
+(6,11,227,'Staves',1),
+(6,11,522,'SPELLDEFENSE(DND)',1),
+(6,11,669,'Language Orcish',1),
+(6,11,670,'Language Taurahe',1),
+(6,11,1178,'Bear Form(Passive)',0),
+(6,11,2382,'Generic',1),
+(6,11,2479,'Honorless Target',1),
+(6,11,3025,'Cat Form(Passive)',0),
+(6,11,3050,'Detect',1),
+(6,11,3365,'Opening',1),
+(6,11,5176,'Wrath',1),
+(6,11,5185,'Healing Touch',1),
+(6,11,5419,'Travel Form(Passive)',0),
+(6,11,5420,'Tree of Life',0),
+(6,11,5421,'Aquatic Form(Passive)',0),
+(6,11,6233,'Closing',1),
+(6,11,6246,'Closing',1),
+(6,11,6247,'Opening',1),
+(6,11,6477,'Opening',1),
+(6,11,6478,'Opening',1),
+(6,11,6603,'Attack',1),
+(6,11,7266,'Duel',1),
+(6,11,7267,'Grovel',1),
+(6,11,7355,'Stuck',1),
+(6,11,8386,'Attacking',1),
+(6,11,9077,'Leather',1),
+(6,11,9078,'Cloth',1),
+(6,11,9125,'Generic',1),
+(6,11,9635,'Dire Bear Form(Passive)',0),
+(6,11,20549,'War Stomp',1),
+(6,11,20550,'Endurance',1),
+(6,11,20551,'Nature Resistance',1),
+(6,11,20552,'Cultivation',1),
+(6,11,21178,'Bear Form(Passive2)',0),
+(6,11,21651,'Opening',1),
+(6,11,21652,'Closing',1),
+(6,11,22027,'Remove Insignia',1),
+(6,11,22810,'Opening - No Text',1),
+(6,11,24905,'Moonkin Form(Passive)',0),
+(6,11,27764,'Fetish',1),
+(6,11,33948,'Flight Form(Passive)',0),
+(6,11,34123,'Tree of Life(Passive)',0),
+(6,11,40121,'Swift Flight Form(Passive)',0),
+(7,1,78,'Heroic Strike',1),
+(7,1,81,'Dodge',1),
+(7,1,107,'Block',1),
+(7,1,198,'One-Handed Maces',1),
+(7,1,201,'One-Handed Swords',1),
+(7,1,203,'Unarmed',1),
+(7,1,204,'Defense',1),
+(7,1,522,'SPELLDEFENSE(DND)',1),
+(7,1,668,'Language Common',1),
+(7,1,1180,'Daggers',1),
+(7,1,2382,'Generic',1),
+(7,1,2457,'Battle Stance',1),
+(7,1,2479,'Honorless Target',1),
+(7,1,3050,'Detect',1),
+(7,1,3365,'Opening',1),
+(7,1,5301,'Defensive State(DND)',1),
+(7,1,6233,'Closing',1),
+(7,1,6246,'Closing',1),
+(7,1,6247,'Opening',1),
+(7,1,6477,'Opening',1),
+(7,1,6478,'Opening',1),
+(7,1,6603,'Attack',1),
+(7,1,7266,'Duel',1),
+(7,1,7267,'Grovel',1),
+(7,1,7340,'Language Gnomish',1),
+(7,1,7355,'Stuck',1),
+(7,1,7376,'Defensive Stance Passive',0),
+(7,1,7381,'Berserker Stance Passive',0),
+(7,1,8386,'Attacking',1),
+(7,1,8737,'Mail',1),
+(7,1,9077,'Leather',1),
+(7,1,9078,'Cloth',1),
+(7,1,9116,'Shield',1),
+(7,1,9125,'Generic',1),
+(7,1,20589,'Escape Artist',1),
+(7,1,20591,'Expansive Mind',1),
+(7,1,20592,'Arcane Resistance',1),
+(7,1,20593,'Engineering Specialization',1),
+(7,1,21156,'Battle Stance Passive',0),
+(7,1,21651,'Opening',1),
+(7,1,21652,'Closing',1),
+(7,1,22027,'Remove Insignia',1),
+(7,1,22810,'Opening - No Text',1),
+(7,1,32215,'Victorious State',1),
+(7,4,81,'Dodge',1),
+(7,4,203,'Unarmed',1),
+(7,4,204,'Defense',1),
+(7,4,522,'SPELLDEFENSE(DND)',1),
+(7,4,668,'Language Common',1),
+(7,4,1180,'Daggers',1),
+(7,4,1752,'Sinister Strike',1),
+(7,4,2098,'Eviscerate',1),
+(7,4,2382,'Generic',1),
+(7,4,2479,'Honorless Target',1),
+(7,4,2567,'Thrown',1),
+(7,4,2764,'Throw',1),
+(7,4,3050,'Detect',1),
+(7,4,3365,'Opening',1),
+(7,4,6233,'Closing',1),
+(7,4,6246,'Closing',1),
+(7,4,6247,'Opening',1),
+(7,4,6477,'Opening',1),
+(7,4,6478,'Opening',1),
+(7,4,6603,'Attack',1),
+(7,4,7266,'Duel',1),
+(7,4,7267,'Grovel',1),
+(7,4,7340,'Language Gnomish',1),
+(7,4,7355,'Stuck',1),
+(7,4,8386,'Attacking',1),
+(7,4,9077,'Leather',1),
+(7,4,9078,'Cloth',1),
+(7,4,9125,'Generic',1),
+(7,4,16092,'Defensive State(DND)',1),
+(7,4,20589,'Escape Artist',1),
+(7,4,20591,'Expansive Mind',1),
+(7,4,20592,'Arcane Resistance',1),
+(7,4,20593,'Engineering Specialization',1),
+(7,4,21184,'Rogue Passive(DND)',1),
+(7,4,21651,'Opening',1),
+(7,4,21652,'Closing',1),
+(7,4,22027,'Remove Insignia',1),
+(7,4,22810,'Opening - No Text',1),
+(7,6,81,'Dodge',1),
+(7,6,196,'One-Handed Axes',1),
+(7,6,197,'Two-Handed Axes',1),
+(7,6,200,'Polearms',1),
+(7,6,201,'One-Handed Swords',1),
+(7,6,202,'Two-Handed Swords',1),
+(7,6,203,'Unarmed',1),
+(7,6,204,'Defense',1),
+(7,6,522,'SPELLDEFENSE (DND)',1),
+(7,6,668,'Language Common',1),
+(7,6,674,'Dual Wield',1),
+(7,6,750,'Plate Mail',1),
+(7,6,1843,'Disarm',1),
+(7,6,2382,'Generic',1),
+(7,6,2479,'Honorless Target',1),
+(7,6,3050,'Detect',1),
+(7,6,3127,'Parry',1),
+(7,6,3275,'Linen Bandage',1),
+(7,6,3276,'Heavy Linen Bandage',1),
+(7,6,3277,'Wool Bandage',1),
+(7,6,3278,'Heavy Wool Bandage',1),
+(7,6,3365,'Opening',1),
+(7,6,6233,'Closing',1),
+(7,6,6246,'Closing',1),
+(7,6,6247,'Opening',1),
+(7,6,6477,'Opening',1),
+(7,6,6478,'Opening',1),
+(7,6,6603,'Attack',1),
+(7,6,7266,'Duel',1),
+(7,6,7267,'Grovel',1),
+(7,6,7340,'Language Gnomish',1),
+(7,6,7355,'Stuck',1),
+(7,6,7928,'Silk Bandage',1),
+(7,6,7929,'Heavy Silk Bandage',1),
+(7,6,7934,'Anti-Venom',1),
+(7,6,8386,'Attacking',1),
+(7,6,8737,'Mail',1),
+(7,6,9077,'Leather',1),
+(7,6,9078,'Cloth',1),
+(7,6,9125,'Generic',1),
+(7,6,10840,'Mageweave Bandage',1),
+(7,6,10841,'Heavy Mageweave Bandage',1),
+(7,6,10846,'First Aid',1),
+(7,6,18629,'Runecloth Bandage',1),
+(7,6,18630,'Heavy Runecloth Bandage',1),
+(7,6,20589,'Escape Artist',1),
+(7,6,20591,'Expansive Mind',1),
+(7,6,20592,'Arcane Resistance',1),
+(7,6,20593,'Engineering Specialization',1),
+(7,6,21651,'Opening',1),
+(7,6,21652,'Closing',1),
+(7,6,22027,'Remove Insignia',1),
+(7,6,22810,'Opening - No Text',1),
+(7,6,33391,'Journeyman Riding',1),
+(7,6,45462,'Plague Strike',1),
+(7,6,45477,'Icy Touch',1),
+(7,6,45902,'Blood Strike',1),
+(7,6,45903,'Offensive State (DND)',1),
+(7,6,45927,'Summon Friend',1),
+(7,6,47541,'Death Coil',1),
+(7,6,48266,'Blood Presence',1),
+(7,6,49410,'Forceful Deflection',1),
+(7,6,49576,'Death Grip',1),
+(7,6,52665,'Sigil',1),
+(7,6,59879,'Blood Plague',1),
+(7,6,59921,'Frost Fever',1),
+(7,6,61437,'Opening',1),
+(7,6,61455,'Runic Focus',1),
+(7,8,81,'Dodge',1),
+(7,8,133,'Fireball',1),
+(7,8,168,'Frost Armor',1),
+(7,8,203,'Unarmed',1),
+(7,8,204,'Defense',1),
+(7,8,227,'Staves',1),
+(7,8,522,'SPELLDEFENSE(DND)',1),
+(7,8,668,'Language Common',1),
+(7,8,2382,'Generic',1),
+(7,8,2479,'Honorless Target',1),
+(7,8,3050,'Detect',1),
+(7,8,3365,'Opening',1),
+(7,8,5009,'Wands',1),
+(7,8,5019,'Shoot',1),
+(7,8,6233,'Closing',1),
+(7,8,6246,'Closing',1),
+(7,8,6247,'Opening',1),
+(7,8,6477,'Opening',1),
+(7,8,6478,'Opening',1),
+(7,8,6603,'Attack',1),
+(7,8,7266,'Duel',1),
+(7,8,7267,'Grovel',1),
+(7,8,7340,'Language Gnomish',1),
+(7,8,7355,'Stuck',1),
+(7,8,8386,'Attacking',1),
+(7,8,9078,'Cloth',1),
+(7,8,9125,'Generic',1),
+(7,8,20589,'Escape Artist',1),
+(7,8,20591,'Expansive Mind',1),
+(7,8,20592,'Arcane Resistance',1),
+(7,8,20593,'Engineering Specialization',1),
+(7,8,21651,'Opening',1),
+(7,8,21652,'Closing',1),
+(7,8,22027,'Remove Insignia',1),
+(7,8,22810,'Opening - No Text',1),
+(7,9,81,'Dodge',1),
+(7,9,203,'Unarmed',1),
+(7,9,204,'Defense',1),
+(7,9,522,'SPELLDEFENSE(DND)',1),
+(7,9,668,'Language Common',1),
+(7,9,686,'Shadow Bolt',1),
+(7,9,687,'Demon Skin',1),
+(7,9,1180,'Daggers',1),
+(7,9,2382,'Generic',1),
+(7,9,2479,'Honorless Target',1),
+(7,9,3050,'Detect',1),
+(7,9,3365,'Opening',1),
+(7,9,5009,'Wands',1),
+(7,9,5019,'Shoot',1),
+(7,9,6233,'Closing',1),
+(7,9,6246,'Closing',1),
+(7,9,6247,'Opening',1),
+(7,9,6477,'Opening',1),
+(7,9,6478,'Opening',1),
+(7,9,6603,'Attack',1),
+(7,9,7266,'Duel',1),
+(7,9,7267,'Grovel',1),
+(7,9,7340,'Language Gnomish',1),
+(7,9,7355,'Stuck',1),
+(7,9,8386,'Attacking',1),
+(7,9,9078,'Cloth',1),
+(7,9,9125,'Generic',1),
+(7,9,20589,'Escape Artist',1),
+(7,9,20591,'Expansive Mind',1),
+(7,9,20592,'Arcane Resistance',1),
+(7,9,20593,'Engineering Specialization',1),
+(7,9,21651,'Opening',1),
+(7,9,21652,'Closing',1),
+(7,9,22027,'Remove Insignia',1),
+(7,9,22810,'Opening - No Text',1),
+(8,1,78,'Heroic Strike',1),
+(8,1,81,'Dodge',1),
+(8,1,107,'Block',1),
+(8,1,196,'One-Handed Axes',1),
+(8,1,203,'Unarmed',1),
+(8,1,204,'Defense',1),
+(8,1,522,'SPELLDEFENSE(DND)',1),
+(8,1,669,'Language Orcish',1),
+(8,1,1180,'Daggers',1),
+(8,1,2382,'Generic',1),
+(8,1,2457,'Battle Stance',1),
+(8,1,2479,'Honorless Target',1),
+(8,1,2567,'Thrown',1),
+(8,1,2764,'Throw',1),
+(8,1,3050,'Detect',1),
+(8,1,3365,'Opening',1),
+(8,1,5301,'Defensive State(DND)',1),
+(8,1,6233,'Closing',1),
+(8,1,6246,'Closing',1),
+(8,1,6247,'Opening',1),
+(8,1,6477,'Opening',1),
+(8,1,6478,'Opening',1),
+(8,1,6603,'Attack',1),
+(8,1,7266,'Duel',1),
+(8,1,7267,'Grovel',1),
+(8,1,7341,'Language Troll',1),
+(8,1,7355,'Stuck',1),
+(8,1,7376,'Defensive Stance Passive',0),
+(8,1,7381,'Berserker Stance Passive',0),
+(8,1,8386,'Attacking',1),
+(8,1,8737,'Mail',1),
+(8,1,9077,'Leather',1),
+(8,1,9078,'Cloth',1),
+(8,1,9116,'Shield',1),
+(8,1,9125,'Generic',1),
+(8,1,20555,'Regeneration',1),
+(8,1,20557,'Beast Slaying',1),
+(8,1,20558,'Throwing Specialization',1),
+(8,1,21156,'Battle Stance Passive',0),
+(8,1,21651,'Opening',1),
+(8,1,21652,'Closing',1),
+(8,1,22027,'Remove Insignia',1),
+(8,1,22810,'Opening - No Text',1),
+(8,1,26290,'Bow Specialization',1),
+(8,1,26296,'Berserking',1),
+(8,1,32215,'Victorious State',1),
+(8,3,75,'Auto Shot',1),
+(8,3,81,'Dodge',1),
+(8,3,196,'One-Handed Axes',1),
+(8,3,203,'Unarmed',1),
+(8,3,204,'Defense',1),
+(8,3,264,'Bows',1),
+(8,3,522,'SPELLDEFENSE(DND)',1),
+(8,3,669,'Language Orcish',1),
+(8,3,2382,'Generic',1),
+(8,3,2479,'Honorless Target',1),
+(8,3,2973,'Raptor Strike',1),
+(8,3,3050,'Detect',1),
+(8,3,3365,'Opening',1),
+(8,3,6233,'Closing',1),
+(8,3,6246,'Closing',1),
+(8,3,6247,'Opening',1),
+(8,3,6477,'Opening',1),
+(8,3,6478,'Opening',1),
+(8,3,6603,'Attack',1),
+(8,3,7266,'Duel',1),
+(8,3,7267,'Grovel',1),
+(8,3,7341,'Language Troll',1),
+(8,3,7355,'Stuck',1),
+(8,3,8386,'Attacking',1),
+(8,3,9077,'Leather',1),
+(8,3,9078,'Cloth',1),
+(8,3,9125,'Generic',1),
+(8,3,13358,'Defensive State(DND)',1),
+(8,3,20554,'Berserking',1),
+(8,3,20555,'Regeneration',1),
+(8,3,20557,'Beast Slaying',1),
+(8,3,20558,'Throwing Specialization',1),
+(8,3,21651,'Opening',1),
+(8,3,21652,'Closing',1),
+(8,3,22027,'Remove Insignia',1),
+(8,3,22810,'Opening - No Text',1),
+(8,3,24949,'Defensive State 2(DND)',1),
+(8,3,26290,'Bow Specialization',1),
+(8,3,34082,'Advantaged State(DND)',1),
+(8,4,81,'Dodge',1),
+(8,4,203,'Unarmed',1),
+(8,4,204,'Defense',1),
+(8,4,522,'SPELLDEFENSE(DND)',1),
+(8,4,669,'Language Orcish',1),
+(8,4,1180,'Daggers',1),
+(8,4,1752,'Sinister Strike',1),
+(8,4,2098,'Eviscerate',1),
+(8,4,2382,'Generic',1),
+(8,4,2479,'Honorless Target',1),
+(8,4,2567,'Thrown',1),
+(8,4,2764,'Throw',1),
+(8,4,3050,'Detect',1),
+(8,4,3365,'Opening',1),
+(8,4,6233,'Closing',1),
+(8,4,6246,'Closing',1),
+(8,4,6247,'Opening',1),
+(8,4,6477,'Opening',1),
+(8,4,6478,'Opening',1),
+(8,4,6603,'Attack',1),
+(8,4,7266,'Duel',1),
+(8,4,7267,'Grovel',1),
+(8,4,7341,'Language Troll',1),
+(8,4,7355,'Stuck',1),
+(8,4,8386,'Attacking',1),
+(8,4,9077,'Leather',1),
+(8,4,9078,'Cloth',1),
+(8,4,9125,'Generic',1),
+(8,4,16092,'Defensive State(DND)',1),
+(8,4,20555,'Regeneration',1),
+(8,4,20557,'Beast Slaying',1),
+(8,4,20558,'Throwing Specialization',1),
+(8,4,21184,'Rogue Passive(DND)',1),
+(8,4,21651,'Opening',1),
+(8,4,21652,'Closing',1),
+(8,4,22027,'Remove Insignia',1),
+(8,4,22810,'Opening - No Text',1),
+(8,4,26290,'Bow Specialization',1),
+(8,4,26297,'Berserking',1),
+(8,5,81,'Dodge',1),
+(8,5,198,'One-Handed Maces',1),
+(8,5,203,'Unarmed',1),
+(8,5,204,'Defense',1),
+(8,5,522,'SPELLDEFENSE(DND)',1),
+(8,5,585,'Smite',1),
+(8,5,669,'Language Orcish',1),
+(8,5,2050,'Lesser Heal',1),
+(8,5,2382,'Generic',1),
+(8,5,2479,'Honorless Target',1),
+(8,5,3050,'Detect',1),
+(8,5,3365,'Opening',1),
+(8,5,5009,'Wands',1),
+(8,5,5019,'Shoot',1),
+(8,5,6233,'Closing',1),
+(8,5,6246,'Closing',1),
+(8,5,6247,'Opening',1),
+(8,5,6477,'Opening',1),
+(8,5,6478,'Opening',1),
+(8,5,6603,'Attack',1),
+(8,5,7266,'Duel',1),
+(8,5,7267,'Grovel',1),
+(8,5,7341,'Language Troll',1),
+(8,5,7355,'Stuck',1),
+(8,5,8386,'Attacking',1),
+(8,5,9078,'Cloth',1),
+(8,5,9125,'Generic',1),
+(8,5,20554,'Berserking',1),
+(8,5,20555,'Regeneration',1),
+(8,5,20557,'Beast Slaying',1),
+(8,5,20558,'Throwing Specialization',1),
+(8,5,21651,'Opening',1),
+(8,5,21652,'Closing',1),
+(8,5,22027,'Remove Insignia',1),
+(8,5,22810,'Opening - No Text',1),
+(8,5,26290,'Bow Specialization',1),
+(8,6,81,'Dodge',1),
+(8,6,196,'One-Handed Axes',1),
+(8,6,197,'Two-Handed Axes',1),
+(8,6,200,'Polearms',1),
+(8,6,201,'One-Handed Swords',1),
+(8,6,202,'Two-Handed Swords',1),
+(8,6,203,'Unarmed',1),
+(8,6,204,'Defense',1),
+(8,6,522,'SPELLDEFENSE (DND)',1),
+(8,6,669,'Language Orcish',1),
+(8,6,674,'Dual Wield',1),
+(8,6,750,'Plate Mail',1),
+(8,6,1843,'Disarm',1),
+(8,6,2382,'Generic',1),
+(8,6,2479,'Honorless Target',1),
+(8,6,3050,'Detect',1),
+(8,6,3127,'Parry',1),
+(8,6,3275,'Linen Bandage',1),
+(8,6,3276,'Heavy Linen Bandage',1),
+(8,6,3277,'Wool Bandage',1),
+(8,6,3278,'Heavy Wool Bandage',1),
+(8,6,3365,'Opening',1),
+(8,6,6233,'Closing',1),
+(8,6,6246,'Closing',1),
+(8,6,6247,'Opening',1),
+(8,6,6477,'Opening',1),
+(8,6,6478,'Opening',1),
+(8,6,6603,'Attack',1),
+(8,6,7266,'Duel',1),
+(8,6,7267,'Grovel',1),
+(8,6,7341,'Language Troll',1),
+(8,6,7355,'Stuck',1),
+(8,6,7928,'Silk Bandage',1),
+(8,6,7929,'Heavy Silk Bandage',1),
+(8,6,7934,'Anti-Venom',1),
+(8,6,8386,'Attacking',1),
+(8,6,8737,'Mail',1),
+(8,6,9077,'Leather',1),
+(8,6,9078,'Cloth',1),
+(8,6,9125,'Generic',1),
+(8,6,10840,'Mageweave Bandage',1),
+(8,6,10841,'Heavy Mageweave Bandage',1),
+(8,6,10846,'First Aid',1),
+(8,6,18629,'Runecloth Bandage',1),
+(8,6,18630,'Heavy Runecloth Bandage',1),
+(8,6,20555,'Regeneration',1),
+(8,6,20557,'Beast Slaying',1),
+(8,6,20558,'Throwing Specialization',1),
+(8,6,21651,'Opening',1),
+(8,6,21652,'Closing',1),
+(8,6,22027,'Remove Insignia',1),
+(8,6,22810,'Opening - No Text',1),
+(8,6,26290,'Bow Specialization',1),
+(8,6,33391,'Journeyman Riding',1),
+(8,6,45462,'Plague Strike',1),
+(8,6,45477,'Icy Touch',1),
+(8,6,45902,'Blood Strike',1),
+(8,6,45903,'Offensive State (DND)',1),
+(8,6,45927,'Summon Friend',1),
+(8,6,47541,'Death Coil',1),
+(8,6,48266,'Blood Presence',1),
+(8,6,49410,'Forceful Deflection',1),
+(8,6,49576,'Death Grip',1),
+(8,6,50621,'Berserking',1),
+(8,6,52665,'Sigil',1),
+(8,6,58943,'Da Voodoo Shuffle',1),
+(8,6,59879,'Blood Plague',1),
+(8,6,59921,'Frost Fever',1),
+(8,6,61437,'Opening',1),
+(8,6,61455,'Runic Focus',1),
+(8,7,81,'Dodge',1),
+(8,7,107,'Block',1),
+(8,7,198,'One-Handed Maces',1),
+(8,7,203,'Unarmed',1),
+(8,7,204,'Defense',1),
+(8,7,227,'Staves',1),
+(8,7,331,'Healing Wave',1),
+(8,7,403,'Lightning Bolt',1),
+(8,7,522,'SPELLDEFENSE(DND)',1),
+(8,7,669,'Language Orcish',1),
+(8,7,2382,'Generic',1),
+(8,7,2479,'Honorless Target',1),
+(8,7,3050,'Detect',1),
+(8,7,3365,'Opening',1),
+(8,7,6233,'Closing',1),
+(8,7,6246,'Closing',1),
+(8,7,6247,'Opening',1),
+(8,7,6477,'Opening',1),
+(8,7,6478,'Opening',1),
+(8,7,6603,'Attack',1),
+(8,7,7266,'Duel',1),
+(8,7,7267,'Grovel',1),
+(8,7,7341,'Language Troll',1),
+(8,7,7355,'Stuck',1),
+(8,7,8386,'Attacking',1),
+(8,7,9077,'Leather',1),
+(8,7,9078,'Cloth',1),
+(8,7,9116,'Shield',1),
+(8,7,9125,'Generic',1),
+(8,7,20554,'Berserking',1),
+(8,7,20555,'Regeneration',1),
+(8,7,20557,'Beast Slaying',1),
+(8,7,20558,'Throwing Specialization',1),
+(8,7,21651,'Opening',1),
+(8,7,21652,'Closing',1),
+(8,7,22027,'Remove Insignia',1),
+(8,7,22810,'Opening - No Text',1),
+(8,7,26290,'Bow Specialization',1),
+(8,7,27763,'Totem',1),
+(8,8,81,'Dodge',1),
+(8,8,133,'Fireball',1),
+(8,8,168,'Frost Armor',1),
+(8,8,203,'Unarmed',1),
+(8,8,204,'Defense',1),
+(8,8,227,'Staves',1),
+(8,8,522,'SPELLDEFENSE(DND)',1),
+(8,8,669,'Language Orcish',1),
+(8,8,2382,'Generic',1),
+(8,8,2479,'Honorless Target',1),
+(8,8,3050,'Detect',1),
+(8,8,3365,'Opening',1),
+(8,8,5009,'Wands',1),
+(8,8,5019,'Shoot',1),
+(8,8,6233,'Closing',1),
+(8,8,6246,'Closing',1),
+(8,8,6247,'Opening',1),
+(8,8,6477,'Opening',1),
+(8,8,6478,'Opening',1),
+(8,8,6603,'Attack',1),
+(8,8,7266,'Duel',1),
+(8,8,7267,'Grovel',1),
+(8,8,7341,'Language Troll',1),
+(8,8,7355,'Stuck',1),
+(8,8,8386,'Attacking',1),
+(8,8,9078,'Cloth',1),
+(8,8,9125,'Generic',1),
+(8,8,20554,'Berserking',1),
+(8,8,20555,'Regeneration',1),
+(8,8,20557,'Beast Slaying',1),
+(8,8,20558,'Throwing Specialization',1),
+(8,8,21651,'Opening',1),
+(8,8,21652,'Closing',1),
+(8,8,22027,'Remove Insignia',1),
+(8,8,22810,'Opening - No Text',1),
+(8,8,26290,'Bow Specialization',1),
+(10,2,81,'Dodge',1),
+(10,2,107,'Block',1),
+(10,2,201,'One-Handed Swords',1),
+(10,2,202,'Two-Handed Swords',1),
+(10,2,203,'Unarmed',1),
+(10,2,204,'Defense',1),
+(10,2,522,'SPELLDEFENSE(DND)',1),
+(10,2,635,'Holy Light',1),
+(10,2,669,'Language Orcish',1),
+(10,2,813,'Language Thalassian',1),
+(10,2,822,'Magic Resistance',1),
+(10,2,2382,'Generic',1),
+(10,2,2479,'Honorless Target',1),
+(10,2,3050,'Detect',1),
+(10,2,3365,'Opening',1),
+(10,2,6233,'Closing',1),
+(10,2,6246,'Closing',1),
+(10,2,6247,'Opening',1),
+(10,2,6477,'Opening',1),
+(10,2,6478,'Opening',1),
+(10,2,6603,'Attack',1),
+(10,2,7266,'Duel',1),
+(10,2,7267,'Grovel',1),
+(10,2,7355,'Stuck',1),
+(10,2,8386,'Attacking',1),
+(10,2,8737,'Mail',1),
+(10,2,9077,'Leather',1),
+(10,2,9078,'Cloth',1),
+(10,2,9116,'Shield',1),
+(10,2,9125,'Generic',1),
+(10,2,21084,'Seal of Righteousness',1),
+(10,2,21651,'Opening',1),
+(10,2,21652,'Closing',1),
+(10,2,22027,'Remove Insignia',1),
+(10,2,22810,'Opening - No Text',1),
+(10,2,27762,'Libram',1),
+(10,2,28730,'Arcane Torrent',1),
+(10,2,28734,'Mana Tap',1),
+(10,2,28877,'Arcane Affinity',1),
+(10,3,75,'Auto Shot',1),
+(10,3,81,'Dodge',1),
+(10,3,203,'Unarmed',1),
+(10,3,204,'Defense',1),
+(10,3,264,'Bows',1),
+(10,3,522,'SPELLDEFENSE(DND)',1),
+(10,3,669,'Language Orcish',1),
+(10,3,813,'Language Thalassian',1),
+(10,3,822,'Magic Resistance',1),
+(10,3,1180,'Daggers',1),
+(10,3,2382,'Generic',1),
+(10,3,2479,'Honorless Target',1),
+(10,3,2973,'Raptor Strike',1),
+(10,3,3050,'Detect',1),
+(10,3,3365,'Opening',1),
+(10,3,6233,'Closing',1),
+(10,3,6246,'Closing',1),
+(10,3,6247,'Opening',1),
+(10,3,6477,'Opening',1),
+(10,3,6478,'Opening',1),
+(10,3,6603,'Attack',1),
+(10,3,7266,'Duel',1),
+(10,3,7267,'Grovel',1),
+(10,3,7355,'Stuck',1),
+(10,3,8386,'Attacking',1),
+(10,3,9077,'Leather',1),
+(10,3,9078,'Cloth',1),
+(10,3,9125,'Generic',1),
+(10,3,13358,'Defensive State(DND)',1),
+(10,3,21651,'Opening',1),
+(10,3,21652,'Closing',1),
+(10,3,22027,'Remove Insignia',1),
+(10,3,22810,'Opening - No Text',1),
+(10,3,24949,'Defensive State 2(DND)',1),
+(10,3,28730,'Arcane Torrent',1),
+(10,3,28734,'Mana Tap',1),
+(10,3,28877,'Arcane Affinity',1),
+(10,3,34082,'Advantaged State(DND)',1),
+(10,4,81,'Dodge',1),
+(10,4,203,'Unarmed',1),
+(10,4,204,'Defense',1),
+(10,4,522,'SPELLDEFENSE(DND)',1),
+(10,4,669,'Language Orcish',1),
+(10,4,813,'Language Thalassian',1),
+(10,4,822,'Magic Resistance',1),
+(10,4,1180,'Daggers',1),
+(10,4,1752,'Sinister Strike',1),
+(10,4,2098,'Eviscerate',1),
+(10,4,2382,'Generic',1),
+(10,4,2479,'Honorless Target',1),
+(10,4,2567,'Thrown',1),
+(10,4,2764,'Throw',1),
+(10,4,3050,'Detect',1),
+(10,4,3365,'Opening',1),
+(10,4,6233,'Closing',1),
+(10,4,6246,'Closing',1),
+(10,4,6247,'Opening',1),
+(10,4,6477,'Opening',1),
+(10,4,6478,'Opening',1),
+(10,4,6603,'Attack',1),
+(10,4,7266,'Duel',1),
+(10,4,7267,'Grovel',1),
+(10,4,7355,'Stuck',1),
+(10,4,8386,'Attacking',1),
+(10,4,9077,'Leather',1),
+(10,4,9078,'Cloth',1),
+(10,4,9125,'Generic',1),
+(10,4,16092,'Defensive State(DND)',1),
+(10,4,21184,'Rogue Passive(DND)',1),
+(10,4,21651,'Opening',1),
+(10,4,21652,'Closing',1),
+(10,4,22027,'Remove Insignia',1),
+(10,4,22810,'Opening - No Text',1),
+(10,4,25046,'Arcane Torrent',1),
+(10,4,28734,'Mana Tap',1),
+(10,4,28877,'Arcane Affinity',1),
+(10,5,81,'Dodge',1),
+(10,5,198,'One-Handed Maces',1),
+(10,5,203,'Unarmed',1),
+(10,5,204,'Defense',1),
+(10,5,522,'SPELLDEFENSE(DND)',1),
+(10,5,585,'Smite',1),
+(10,5,669,'Language Orcish',1),
+(10,5,813,'Language Thalassian',1),
+(10,5,822,'Magic Resistance',1),
+(10,5,2050,'Lesser Heal',1),
+(10,5,2382,'Generic',1),
+(10,5,2479,'Honorless Target',1),
+(10,5,3050,'Detect',1),
+(10,5,3365,'Opening',1),
+(10,5,5009,'Wands',1),
+(10,5,5019,'Shoot',1),
+(10,5,6233,'Closing',1),
+(10,5,6246,'Closing',1),
+(10,5,6247,'Opening',1),
+(10,5,6477,'Opening',1),
+(10,5,6478,'Opening',1),
+(10,5,6603,'Attack',1),
+(10,5,7266,'Duel',1),
+(10,5,7267,'Grovel',1),
+(10,5,7355,'Stuck',1),
+(10,5,8386,'Attacking',1),
+(10,5,9078,'Cloth',1),
+(10,5,9125,'Generic',1),
+(10,5,21651,'Opening',1),
+(10,5,21652,'Closing',1),
+(10,5,22027,'Remove Insignia',1),
+(10,5,22810,'Opening - No Text',1),
+(10,5,28730,'Arcane Torrent',1),
+(10,5,28734,'Mana Tap',1),
+(10,5,28877,'Arcane Affinity',1),
+(10,6,81,'Dodge',1),
+(10,6,196,'One-Handed Axes',1),
+(10,6,197,'Two-Handed Axes',1),
+(10,6,200,'Polearms',1),
+(10,6,201,'One-Handed Swords',1),
+(10,6,202,'Two-Handed Swords',1),
+(10,6,203,'Unarmed',1),
+(10,6,204,'Defense',1),
+(10,6,522,'SPELLDEFENSE (DND)',1),
+(10,6,669,'Language Orcish',1),
+(10,6,674,'Dual Wield',1),
+(10,6,750,'Plate Mail',1),
+(10,6,813,'Language Thalassian',1),
+(10,6,822,'Magic Resistance',1),
+(10,6,1843,'Disarm',1),
+(10,6,2382,'Generic',1),
+(10,6,2479,'Honorless Target',1),
+(10,6,3050,'Detect',1),
+(10,6,3127,'Parry',1),
+(10,6,3275,'Linen Bandage',1),
+(10,6,3276,'Heavy Linen Bandage',1),
+(10,6,3277,'Wool Bandage',1),
+(10,6,3278,'Heavy Wool Bandage',1),
+(10,6,3365,'Opening',1),
+(10,6,6233,'Closing',1),
+(10,6,6246,'Closing',1),
+(10,6,6247,'Opening',1),
+(10,6,6477,'Opening',1),
+(10,6,6478,'Opening',1),
+(10,6,6603,'Attack',1),
+(10,6,7266,'Duel',1),
+(10,6,7267,'Grovel',1),
+(10,6,7355,'Stuck',1),
+(10,6,7928,'Silk Bandage',1),
+(10,6,7929,'Heavy Silk Bandage',1),
+(10,6,7934,'Anti-Venom',1),
+(10,6,8386,'Attacking',1),
+(10,6,8737,'Mail',1),
+(10,6,9077,'Leather',1),
+(10,6,9078,'Cloth',1),
+(10,6,9125,'Generic',1),
+(10,6,10840,'Mageweave Bandage',1),
+(10,6,10841,'Heavy Mageweave Bandage',1),
+(10,6,10846,'First Aid',1),
+(10,6,18629,'Runecloth Bandage',1),
+(10,6,18630,'Heavy Runecloth Bandage',1),
+(10,6,21651,'Opening',1),
+(10,6,21652,'Closing',1),
+(10,6,22027,'Remove Insignia',1),
+(10,6,22810,'Opening - No Text',1),
+(10,6,28877,'Arcane Affinity',1),
+(10,6,33391,'Journeyman Riding',1),
+(10,6,45462,'Plague Strike',1),
+(10,6,45477,'Icy Touch',1),
+(10,6,45902,'Blood Strike',1),
+(10,6,45903,'Offensive State (DND)',1),
+(10,6,45927,'Summon Friend',1),
+(10,6,47541,'Death Coil',1),
+(10,6,48266,'Blood Presence',1),
+(10,6,49410,'Forceful Deflection',1),
+(10,6,49576,'Death Grip',1),
+(10,6,50613,'Arcane Torrent',1),
+(10,6,52665,'Sigil',1),
+(10,6,59879,'Blood Plague',1),
+(10,6,59921,'Frost Fever',1),
+(10,6,61437,'Opening',1),
+(10,6,61455,'Runic Focus',1),
+(10,8,81,'Dodge',1),
+(10,8,133,'Fireball',1),
+(10,8,168,'Frost Armor',1),
+(10,8,203,'Unarmed',1),
+(10,8,204,'Defense',1),
+(10,8,227,'Staves',1),
+(10,8,522,'SPELLDEFENSE(DND)',1),
+(10,8,669,'Language Orcish',1),
+(10,8,813,'Language Thalassian',1),
+(10,8,822,'Magic Resistance',1),
+(10,8,2382,'Generic',1),
+(10,8,2479,'Honorless Target',1),
+(10,8,3050,'Detect',1),
+(10,8,3365,'Opening',1),
+(10,8,5009,'Wands',1),
+(10,8,5019,'Shoot',1),
+(10,8,6233,'Closing',1),
+(10,8,6246,'Closing',1),
+(10,8,6247,'Opening',1),
+(10,8,6477,'Opening',1),
+(10,8,6478,'Opening',1),
+(10,8,6603,'Attack',1),
+(10,8,7266,'Duel',1),
+(10,8,7267,'Grovel',1),
+(10,8,7355,'Stuck',1),
+(10,8,8386,'Attacking',1),
+(10,8,9078,'Cloth',1),
+(10,8,9125,'Generic',1),
+(10,8,21651,'Opening',1),
+(10,8,21652,'Closing',1),
+(10,8,22027,'Remove Insignia',1),
+(10,8,22810,'Opening - No Text',1),
+(10,8,28730,'Arcane Torrent',1),
+(10,8,28734,'Mana Tap',1),
+(10,8,28877,'Arcane Affinity',1),
+(10,9,81,'Dodge',1),
+(10,9,203,'Unarmed',1),
+(10,9,204,'Defense',1),
+(10,9,522,'SPELLDEFENSE(DND)',1),
+(10,9,669,'Language Orcish',1),
+(10,9,686,'Shadow Bolt',1),
+(10,9,687,'Demon Skin',1),
+(10,9,813,'Language Thalassian',1),
+(10,9,822,'Magic Resistance',1),
+(10,9,1180,'Daggers',1),
+(10,9,2382,'Generic',1),
+(10,9,2479,'Honorless Target',1),
+(10,9,3050,'Detect',1),
+(10,9,3365,'Opening',1),
+(10,9,5009,'Wands',1),
+(10,9,5019,'Shoot',1),
+(10,9,6233,'Closing',1),
+(10,9,6246,'Closing',1),
+(10,9,6247,'Opening',1),
+(10,9,6477,'Opening',1),
+(10,9,6478,'Opening',1),
+(10,9,6603,'Attack',1),
+(10,9,7266,'Duel',1),
+(10,9,7267,'Grovel',1),
+(10,9,7355,'Stuck',1),
+(10,9,8386,'Attacking',1),
+(10,9,9078,'Cloth',1),
+(10,9,9125,'Generic',1),
+(10,9,21651,'Opening',1),
+(10,9,21652,'Closing',1),
+(10,9,22027,'Remove Insignia',1),
+(10,9,22810,'Opening - No Text',1),
+(10,9,28730,'Arcane Torrent',1),
+(10,9,28734,'Mana Tap',1),
+(10,9,28877,'Arcane Affinity',1),
+(11,1,78,'Heroic Strike',1),
+(11,1,81,'Dodge',1),
+(11,1,107,'Block',1),
+(11,1,198,'One-Handed Maces',1),
+(11,1,201,'One-Handed Swords',1),
+(11,1,202,'Two-Handed Swords',1),
+(11,1,203,'Unarmed',1),
+(11,1,204,'Defense',1),
+(11,1,522,'SPELLDEFENSE(DND)',1),
+(11,1,668,'Language Common',1),
+(11,1,2382,'Generic',1),
+(11,1,2457,'Battle Stance',1),
+(11,1,2479,'Honorless Target',1),
+(11,1,3050,'Detect',1),
+(11,1,3365,'Opening',1),
+(11,1,5301,'Defensive State(DND)',1),
+(11,1,6233,'Closing',1),
+(11,1,6246,'Closing',1),
+(11,1,6247,'Opening',1),
+(11,1,6477,'Opening',1),
+(11,1,6478,'Opening',1),
+(11,1,6562,'Heroic Presence',1),
+(11,1,6603,'Attack',1),
+(11,1,7266,'Duel',1),
+(11,1,7267,'Grovel',1),
+(11,1,7355,'Stuck',1),
+(11,1,7376,'Defensive Stance Passive',0),
+(11,1,7381,'Berserker Stance Passive',0),
+(11,1,8386,'Attacking',1),
+(11,1,8737,'Mail',1),
+(11,1,9077,'Leather',1),
+(11,1,9078,'Cloth',1),
+(11,1,9116,'Shield',1),
+(11,1,9125,'Generic',1),
+(11,1,20579,'Shadow Resistance',1),
+(11,1,21156,'Battle Stance Passive',0),
+(11,1,21651,'Opening',1),
+(11,1,21652,'Closing',1),
+(11,1,22027,'Remove Insignia',1),
+(11,1,22810,'Opening - No Text',1),
+(11,1,28875,'Gemcutting',1),
+(11,1,28880,'Gift of the Naaru',1),
+(11,1,29932,'Language Draenei',1),
+(11,1,32215,'Victorious State',1),
+(11,2,81,'Dodge',1),
+(11,2,107,'Block',1),
+(11,2,198,'One-Handed Maces',1),
+(11,2,199,'Two-Handed Maces',1),
+(11,2,203,'Unarmed',1),
+(11,2,204,'Defense',1),
+(11,2,522,'SPELLDEFENSE(DND)',1),
+(11,2,635,'Holy Light',1),
+(11,2,668,'Language Common',1),
+(11,2,2382,'Generic',1),
+(11,2,2479,'Honorless Target',1),
+(11,2,3050,'Detect',1),
+(11,2,3365,'Opening',1),
+(11,2,6233,'Closing',1),
+(11,2,6246,'Closing',1),
+(11,2,6247,'Opening',1),
+(11,2,6477,'Opening',1),
+(11,2,6478,'Opening',1),
+(11,2,6562,'Heroic Presence',1),
+(11,2,6603,'Attack',1),
+(11,2,7266,'Duel',1),
+(11,2,7267,'Grovel',1),
+(11,2,7355,'Stuck',1),
+(11,2,8386,'Attacking',1),
+(11,2,8737,'Mail',1),
+(11,2,9077,'Leather',1),
+(11,2,9078,'Cloth',1),
+(11,2,9116,'Shield',1),
+(11,2,9125,'Generic',1),
+(11,2,21084,'Seal of Righteousness',1),
+(11,2,20579,'Shadow Resistance',1),
+(11,2,21651,'Opening',1),
+(11,2,21652,'Closing',1),
+(11,2,22027,'Remove Insignia',1),
+(11,2,22810,'Opening - No Text',1),
+(11,2,27762,'Libram',1),
+(11,2,28875,'Gemcutting',1),
+(11,2,28880,'Gift of the Naaru',1),
+(11,2,29932,'Language Draenei',1),
+(11,3,75,'Auto Shot',1),
+(11,3,81,'Dodge',1),
+(11,3,201,'One-Handed Swords',1),
+(11,3,203,'Unarmed',1),
+(11,3,204,'Defense',1),
+(11,3,522,'SPELLDEFENSE(DND)',1),
+(11,3,668,'Language Common',1),
+(11,3,2382,'Generic',1),
+(11,3,2479,'Honorless Target',1),
+(11,3,2973,'Raptor Strike',1),
+(11,3,3050,'Detect',1),
+(11,3,3365,'Opening',1),
+(11,3,5011,'Crossbows',1),
+(11,3,6233,'Closing',1),
+(11,3,6246,'Closing',1),
+(11,3,6247,'Opening',1),
+(11,3,6477,'Opening',1),
+(11,3,6478,'Opening',1),
+(11,3,6562,'Heroic Presence',1),
+(11,3,6603,'Attack',1),
+(11,3,7266,'Duel',1),
+(11,3,7267,'Grovel',1),
+(11,3,7355,'Stuck',1),
+(11,3,8386,'Attacking',1),
+(11,3,9077,'Leather',1),
+(11,3,9078,'Cloth',1),
+(11,3,9125,'Generic',1),
+(11,3,13358,'Defensive State(DND)',1),
+(11,3,20579,'Shadow Resistance',1),
+(11,3,21651,'Opening',1),
+(11,3,21652,'Closing',1),
+(11,3,22027,'Remove Insignia',1),
+(11,3,22810,'Opening - No Text',1),
+(11,3,24949,'Defensive State 2(DND)',1),
+(11,3,28875,'Gemcutting',1),
+(11,3,28880,'Gift of the Naaru',1),
+(11,3,29932,'Language Draenei',1),
+(11,3,34082,'Advantaged State(DND)',1),
+(11,5,81,'Dodge',1),
+(11,5,198,'One-Handed Maces',1),
+(11,5,203,'Unarmed',1),
+(11,5,204,'Defense',1),
+(11,5,522,'SPELLDEFENSE(DND)',1),
+(11,5,585,'Smite',1),
+(11,5,668,'Language Common',1),
+(11,5,2050,'Lesser Heal',1),
+(11,5,2382,'Generic',1),
+(11,5,2479,'Honorless Target',1),
+(11,5,3050,'Detect',1),
+(11,5,3365,'Opening',1),
+(11,5,5009,'Wands',1),
+(11,5,5019,'Shoot',1),
+(11,5,6233,'Closing',1),
+(11,5,6246,'Closing',1),
+(11,5,6247,'Opening',1),
+(11,5,6477,'Opening',1),
+(11,5,6478,'Opening',1),
+(11,5,6603,'Attack',1),
+(11,5,7266,'Duel',1),
+(11,5,7267,'Grovel',1),
+(11,5,7355,'Stuck',1),
+(11,5,8386,'Attacking',1),
+(11,5,9078,'Cloth',1),
+(11,5,9125,'Generic',1),
+(11,5,20579,'Shadow Resistance',1),
+(11,5,21651,'Opening',1),
+(11,5,21652,'Closing',1),
+(11,5,22027,'Remove Insignia',1),
+(11,5,22810,'Opening - No Text',1),
+(11,5,28875,'Gemcutting',1),
+(11,5,28878,'Inspiring Presence',1),
+(11,5,28880,'Gift of the Naaru',1),
+(11,5,29932,'Language Draenei',1),
+(11,6,81,'Dodge',1),
+(11,6,196,'One-Handed Axes',1),
+(11,6,197,'Two-Handed Axes',1),
+(11,6,200,'Polearms',1),
+(11,6,201,'One-Handed Swords',1),
+(11,6,202,'Two-Handed Swords',1),
+(11,6,203,'Unarmed',1),
+(11,6,204,'Defense',1),
+(11,6,522,'SPELLDEFENSE (DND)',1),
+(11,6,668,'Language Common',1),
+(11,6,674,'Dual Wield',1),
+(11,6,750,'Plate Mail',1),
+(11,6,1843,'Disarm',1),
+(11,6,2382,'Generic',1),
+(11,6,2479,'Honorless Target',1),
+(11,6,3050,'Detect',1),
+(11,6,3127,'Parry',1),
+(11,6,3275,'Linen Bandage',1),
+(11,6,3276,'Heavy Linen Bandage',1),
+(11,6,3277,'Wool Bandage',1),
+(11,6,3278,'Heavy Wool Bandage',1),
+(11,6,3365,'Opening',1),
+(11,6,6233,'Closing',1),
+(11,6,6246,'Closing',1),
+(11,6,6247,'Opening',1),
+(11,6,6477,'Opening',1),
+(11,6,6478,'Opening',1),
+(11,6,6562,'Heroic Presence',1),
+(11,6,6603,'Attack',1),
+(11,6,7266,'Duel',1),
+(11,6,7267,'Grovel',1),
+(11,6,7355,'Stuck',1),
+(11,6,7928,'Silk Bandage',1),
+(11,6,7929,'Heavy Silk Bandage',1),
+(11,6,7934,'Anti-Venom',1),
+(11,6,8386,'Attacking',1),
+(11,6,8737,'Mail',1),
+(11,6,9077,'Leather',1),
+(11,6,9078,'Cloth',1),
+(11,6,9125,'Generic',1),
+(11,6,10840,'Mageweave Bandage',1),
+(11,6,10841,'Heavy Mageweave Bandage',1),
+(11,6,10846,'First Aid',1),
+(11,6,18629,'Runecloth Bandage',1),
+(11,6,18630,'Heavy Runecloth Bandage',1),
+(11,6,21651,'Opening',1),
+(11,6,21652,'Closing',1),
+(11,6,22027,'Remove Insignia',1),
+(11,6,22810,'Opening - No Text',1),
+(11,6,28875,'Gemcutting',1),
+(11,6,29932,'Language Draenei',1),
+(11,6,33391,'Journeyman Riding',1),
+(11,6,45462,'Plague Strike',1),
+(11,6,45477,'Icy Touch',1),
+(11,6,45902,'Blood Strike',1),
+(11,6,45903,'Offensive State (DND)',1),
+(11,6,45927,'Summon Friend',1),
+(11,6,47541,'Death Coil',1),
+(11,6,48266,'Blood Presence',1),
+(11,6,49410,'Forceful Deflection',1),
+(11,6,49576,'Death Grip',1),
+(11,6,52665,'Sigil',1),
+(11,6,59539,'Shadow Resistance',1),
+(11,6,59545,'Gift of the Naaru',1),
+(11,6,59879,'Blood Plague',1),
+(11,6,59921,'Frost Fever',1),
+(11,6,61437,'Opening',1),
+(11,6,61455,'Runic Focus',1),
+(11,7,81,'Dodge',1),
+(11,7,107,'Block',1),
+(11,7,198,'One-Handed Maces',1),
+(11,7,203,'Unarmed',1),
+(11,7,204,'Defense',1),
+(11,7,227,'Staves',1),
+(11,7,331,'Healing Wave',1),
+(11,7,403,'Lightning Bolt',1),
+(11,7,522,'SPELLDEFENSE(DND)',1),
+(11,7,668,'Language Common',1),
+(11,7,2382,'Generic',1),
+(11,7,2479,'Honorless Target',1),
+(11,7,3050,'Detect',1),
+(11,7,3365,'Opening',1),
+(11,7,6233,'Closing',1),
+(11,7,6246,'Closing',1),
+(11,7,6247,'Opening',1),
+(11,7,6477,'Opening',1),
+(11,7,6478,'Opening',1),
+(11,7,6603,'Attack',1),
+(11,7,7266,'Duel',1),
+(11,7,7267,'Grovel',1),
+(11,7,7355,'Stuck',1),
+(11,7,8386,'Attacking',1),
+(11,7,9077,'Leather',1),
+(11,7,9078,'Cloth',1),
+(11,7,9116,'Shield',1),
+(11,7,9125,'Generic',1),
+(11,7,20579,'Shadow Resistance',1),
+(11,7,21651,'Opening',1),
+(11,7,21652,'Closing',1),
+(11,7,22027,'Remove Insignia',1),
+(11,7,22810,'Opening - No Text',1),
+(11,7,27763,'Totem',1),
+(11,7,28875,'Gemcutting',1),
+(11,7,28878,'Inspiring Presence',1),
+(11,7,28880,'Gift of the Naaru',1),
+(11,7,29932,'Language Draenei',1),
+(11,8,81,'Dodge',1),
+(11,8,133,'Fireball',1),
+(11,8,168,'Frost Armor',1),
+(11,8,203,'Unarmed',1),
+(11,8,204,'Defense',1),
+(11,8,227,'Staves',1),
+(11,8,522,'SPELLDEFENSE(DND)',1),
+(11,8,668,'Language Common',1),
+(11,8,2382,'Generic',1),
+(11,8,2479,'Honorless Target',1),
+(11,8,3050,'Detect',1),
+(11,8,3365,'Opening',1),
+(11,8,5009,'Wands',1),
+(11,8,5019,'Shoot',1),
+(11,8,6233,'Closing',1),
+(11,8,6246,'Closing',1),
+(11,8,6247,'Opening',1),
+(11,8,6477,'Opening',1),
+(11,8,6478,'Opening',1),
+(11,8,6603,'Attack',1),
+(11,8,7266,'Duel',1),
+(11,8,7267,'Grovel',1),
+(11,8,7355,'Stuck',1),
+(11,8,8386,'Attacking',1),
+(11,8,9078,'Cloth',1),
+(11,8,9125,'Generic',1),
+(11,8,20579,'Shadow Resistance',1),
+(11,8,21651,'Opening',1),
+(11,8,21652,'Closing',1),
+(11,8,22027,'Remove Insignia',1),
+(11,8,22810,'Opening - No Text',1),
+(11,8,28875,'Gemcutting',1),
+(11,8,28878,'Inspiring Presence',1),
+(11,8,28880,'Gift of the Naaru',1),
+(11,8,29932,'Language Draenei',1);
/*!40000 ALTER TABLE `playercreateinfo_spell` ENABLE KEYS */;
UNLOCK TABLES;
@@ -2575,7 +12820,7 @@ CREATE TABLE `quest_end_scripts` (
`command` mediumint(8) unsigned NOT NULL default '0',
`datalong` mediumint(8) unsigned NOT NULL default '0',
`datalong2` int(10) unsigned NOT NULL default '0',
- `datatext` text NOT NULL,
+ `dataint` int(11) NOT NULL default '0',
`x` float NOT NULL default '0',
`y` float NOT NULL default '0',
`z` float NOT NULL default '0',
@@ -2592,6 +12837,33 @@ LOCK TABLES `quest_end_scripts` WRITE;
UNLOCK TABLES;
--
+-- Table structure for table `quest_start_scripts`
+--
+
+DROP TABLE IF EXISTS `quest_start_scripts`;
+CREATE TABLE `quest_start_scripts` (
+ `id` mediumint(8) unsigned NOT NULL default '0',
+ `delay` int(10) unsigned NOT NULL default '0',
+ `command` mediumint(8) unsigned NOT NULL default '0',
+ `datalong` mediumint(8) unsigned NOT NULL default '0',
+ `datalong2` int(10) unsigned NOT NULL default '0',
+ `dataint` int(11) NOT NULL default '0',
+ `x` float NOT NULL default '0',
+ `y` float NOT NULL default '0',
+ `z` float NOT NULL default '0',
+ `o` float NOT NULL default '0'
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+--
+-- Dumping data for table `quest_start_scripts`
+--
+
+LOCK TABLES `quest_start_scripts` WRITE;
+/*!40000 ALTER TABLE `quest_start_scripts` DISABLE KEYS */;
+/*!40000 ALTER TABLE `quest_start_scripts` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
-- Table structure for table `quest_mail_loot_template`
--
@@ -2619,33 +12891,6 @@ LOCK TABLES `quest_mail_loot_template` WRITE;
UNLOCK TABLES;
--
--- Table structure for table `quest_start_scripts`
---
-
-DROP TABLE IF EXISTS `quest_start_scripts`;
-CREATE TABLE `quest_start_scripts` (
- `id` mediumint(8) unsigned NOT NULL default '0',
- `delay` int(10) unsigned NOT NULL default '0',
- `command` mediumint(8) unsigned NOT NULL default '0',
- `datalong` mediumint(8) unsigned NOT NULL default '0',
- `datalong2` int(10) unsigned NOT NULL default '0',
- `datatext` text NOT NULL,
- `x` float NOT NULL default '0',
- `y` float NOT NULL default '0',
- `z` float NOT NULL default '0',
- `o` float NOT NULL default '0'
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
---
--- Dumping data for table `quest_start_scripts`
---
-
-LOCK TABLES `quest_start_scripts` WRITE;
-/*!40000 ALTER TABLE `quest_start_scripts` DISABLE KEYS */;
-/*!40000 ALTER TABLE `quest_start_scripts` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
-- Table structure for table `quest_template`
--
@@ -2671,6 +12916,8 @@ CREATE TABLE `quest_template` (
`QuestFlags` smallint(5) unsigned NOT NULL default '0',
`SpecialFlags` tinyint(3) unsigned NOT NULL default '0',
`CharTitleId` tinyint(3) unsigned NOT NULL default '0',
+ `PlayersSlain` tinyint(3) unsigned NOT NULL default '0',
+ `BonusTalents` tinyint(3) unsigned NOT NULL default '0',
`PrevQuestId` mediumint(9) NOT NULL default '0',
`NextQuestId` mediumint(9) NOT NULL default '0',
`ExclusiveGroup` mediumint(9) NOT NULL default '0',
@@ -2750,7 +12997,7 @@ CREATE TABLE `quest_template` (
`RewRepValue3` mediumint(9) NOT NULL default '0',
`RewRepValue4` mediumint(9) NOT NULL default '0',
`RewRepValue5` mediumint(9) NOT NULL default '0',
- `RewHonorableKills` mediumint(9) unsigned NOT NULL default '0',
+ `RewHonorableKills` int unsigned NOT NULL default '0',
`RewOrReqMoney` int(11) NOT NULL default '0',
`RewMoneyMaxLevel` int(10) unsigned NOT NULL default '0',
`RewSpell` mediumint(8) unsigned NOT NULL default '0',
@@ -2979,7 +13226,9 @@ DROP TABLE IF EXISTS `spell_affect`;
CREATE TABLE `spell_affect` (
`entry` smallint(5) unsigned NOT NULL default '0',
`effectId` tinyint(3) unsigned NOT NULL default '0',
- `SpellFamilyMask` bigint(20) unsigned NOT NULL default '0',
+ `SpellClassMask0` int(5) unsigned NOT NULL default '0',
+ `SpellClassMask1` int(5) unsigned NOT NULL default '0',
+ `SpellClassMask2` int(5) unsigned NOT NULL default '0',
PRIMARY KEY (`entry`,`effectId`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
@@ -3053,6 +13302,106 @@ CREATE TABLE `spell_elixir` (
LOCK TABLES `spell_elixir` WRITE;
/*!40000 ALTER TABLE `spell_elixir` DISABLE KEYS */;
+INSERT INTO `spell_elixir` VALUES
+( 673,0x2),
+( 2367,0x1),
+( 2374,0x1),
+( 2378,0x2),
+( 2380,0x2),
+( 3160,0x1),
+( 3164,0x1),
+( 3166,0x2),
+( 3219,0x2),
+( 3220,0x2),
+( 3222,0x2),
+( 3223,0x2),
+( 3593,0x2),
+( 7844,0x1),
+( 8212,0x1),
+(10667,0x1),
+(10668,0x2),
+(10669,0x1),
+(10692,0x2),
+(10693,0x2),
+(11319,0x2),
+(11328,0x1),
+(11334,0x1),
+(11348,0x2),
+(11349,0x2),
+(11364,0x2),
+(11371,0x2),
+(11390,0x1),
+(11396,0x2),
+(11405,0x1),
+(11406,0x1),
+(11474,0x1),
+(15231,0x2),
+(15233,0x2),
+(16321,0x2),
+(16322,0x1),
+(16323,0x1),
+(16325,0x2),
+(16326,0x2),
+(16327,0x2),
+(16329,0x1),
+(17038,0x1),
+(17535,0x2),
+(17537,0x1),
+(17538,0x1),
+(17539,0x1),
+(17624,0x3),
+(17626,0x3),
+(17627,0x3),
+(17629,0x3),
+(17628,0x3),
+(21920,0x1),
+(24361,0x2),
+(24363,0x2),
+(24382,0x2),
+(24383,0x2),
+(24417,0x2),
+(26276,0x1),
+(27652,0x2),
+(27653,0x2),
+(28486,0x1),
+(28488,0x1),
+(28490,0x1),
+(28491,0x1),
+(28493,0x1),
+(28497,0x1),
+(28501,0x1),
+(28502,0x2),
+(28503,0x1),
+(28509,0x2),
+(28514,0x2),
+(28518,0x3),
+(28519,0x3),
+(28520,0x3),
+(28521,0x3),
+(28540,0x3),
+(29348,0x2),
+(33720,0x1),
+(33721,0x1),
+(33726,0x1),
+(38954,0x1),
+(39625,0x2),
+(39626,0x2),
+(39627,0x2),
+(39628,0x2),
+(40567,0x7),
+(40568,0x7),
+(40572,0x7),
+(40573,0x7),
+(40575,0x7),
+(40576,0x7),
+(41608,0xB),
+(41609,0xB),
+(41610,0xB),
+(41611,0xB),
+(42735,0x3),
+(45373,0x1),
+(46837,0xB),
+(46839,0xB);
/*!40000 ALTER TABLE `spell_elixir` ENABLE KEYS */;
UNLOCK TABLES;
@@ -3073,6 +13422,20 @@ CREATE TABLE `spell_learn_spell` (
LOCK TABLES `spell_learn_spell` WRITE;
/*!40000 ALTER TABLE `spell_learn_spell` DISABLE KEYS */;
+INSERT INTO `spell_learn_spell` VALUES
+(2842,8681),
+(5784,33388),
+(13819,33388),
+(17002,24867),
+(23161,33391),
+(23214,33391),
+(24866,24864),
+(33872,47179),
+(33873,47180),
+(33943,34090),
+(34767,33391),
+(34769,33388);
+
/*!40000 ALTER TABLE `spell_learn_spell` ENABLE KEYS */;
UNLOCK TABLES;
@@ -3094,6 +13457,42 @@ CREATE TABLE `spell_pet_auras` (
LOCK TABLES `spell_pet_auras` WRITE;
/*!40000 ALTER TABLE `spell_pet_auras` DISABLE KEYS */;
+INSERT INTO `spell_pet_auras` VALUES
+(19028, 0, 25228),
+(19578, 0, 19579),
+(20895, 0, 24529),
+(28757, 0, 28758),
+(35029, 0, 35060),
+(35030, 0, 35061),
+(35691, 0, 35696),
+(35692, 0, 35696),
+(35693, 0, 35696),
+(23785, 416, 23759),
+(23822, 416, 23826),
+(23823, 416, 23827),
+(23824, 416, 23828),
+(23825, 416, 23829),
+(23785, 417, 23762),
+(23822, 417, 23837),
+(23823, 417, 23838),
+(23824, 417, 23839),
+(23825, 417, 23840),
+(23785, 1860, 23760),
+(23822, 1860, 23841),
+(23823, 1860, 23842),
+(23824, 1860, 23843),
+(23825, 1860, 23844),
+(23785, 1863, 23761),
+(23822, 1863, 23833),
+(23823, 1863, 23834),
+(23824, 1863, 23835),
+(23825, 1863, 23836),
+(23785, 17252, 35702),
+(23822, 17252, 35703),
+(23823, 17252, 35704),
+(23824, 17252, 35705),
+(23825, 17252, 35706);
+
/*!40000 ALTER TABLE `spell_pet_auras` ENABLE KEYS */;
UNLOCK TABLES;
@@ -3134,7 +13533,7 @@ CREATE TABLE `spell_script_target` (
`type` tinyint(3) unsigned NOT NULL default '0',
`targetEntry` mediumint(8) unsigned NOT NULL default '0',
UNIQUE KEY `entry_type_target` (`entry`,`type`,`targetEntry`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Spell System';
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Spell System';
--
-- Dumping data for table `spell_script_target`
@@ -3156,7 +13555,7 @@ CREATE TABLE `spell_scripts` (
`command` mediumint(8) unsigned NOT NULL default '0',
`datalong` mediumint(8) unsigned NOT NULL default '0',
`datalong2` int(10) unsigned NOT NULL default '0',
- `datatext` text character set latin1 NOT NULL,
+ `dataint` int(11) NOT NULL default '0',
`x` float NOT NULL default '0',
`y` float NOT NULL default '0',
`z` float NOT NULL default '0',
@@ -3213,6 +13612,93 @@ CREATE TABLE `spell_threat` (
LOCK TABLES `spell_threat` WRITE;
/*!40000 ALTER TABLE `spell_threat` DISABLE KEYS */;
+INSERT INTO `spell_threat` VALUES
+(78,20),
+(284,39),
+(285,59),
+(770,108),
+(778,108),
+(1608,78),
+(1672,180),
+(1715,61),
+(2139,300),
+(6343,17),
+(6572,155),
+(6574,195),
+(6809,89),
+(7372,101),
+(7373,141),
+(7379,235),
+(7386,100),
+(7405,140),
+(8198,40),
+(8204,64),
+(8205,96),
+(8380,180),
+(8972,118),
+(9745,148),
+(9749,108),
+(9880,178),
+(9881,207),
+(9907,108),
+(11556,43),
+(11564,98),
+(11565,118),
+(11566,137),
+(11567,145),
+(11580,143),
+(11581,180),
+(11596,220),
+(11597,261),
+(11600,275),
+(11601,315),
+(11775,395),
+(14274,200),
+(14921,415),
+(15629,300),
+(15630,400),
+(15631,500),
+(15632,600),
+(16857,108),
+(17735,200),
+(17750,300),
+(17751,450),
+(17752,600),
+(17390,108),
+(17391,108),
+(17392,108),
+(20569,100),
+(20736,100),
+(20925,20),
+(20927,30),
+(20928,40),
+(23922,160),
+(23923,190),
+(23924,220),
+(23925,250),
+(24394,580),
+(24583,5),
+(25225,300),
+(25231,130),
+(25258,286),
+(25264,215),
+(25269,400),
+(25286,175),
+(25288,355),
+(25289,60),
+(26993,127),
+(26996,176),
+(27011,127),
+(27179,54),
+(29704,230),
+(29707,196),
+(30324,220),
+(30356,323),
+(30357,483),
+(33745,285),
+(33878,129),
+(33986,180),
+(33987,232);
/*!40000 ALTER TABLE `spell_threat` ENABLE KEYS */;
UNLOCK TABLES;
@@ -3296,4 +13782,4 @@ UNLOCK TABLES;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
--- Dump completed on 2008-10-14 13:23:35
+-- Dump completed on 2008-03-30 15:34:54
diff --git a/src/Makefile.am b/src/Makefile.am
index 40787fa17d0..be1fefa8db3 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -9,17 +9,17 @@
#
# 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
+# 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
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
## Process this file with automake to produce Makefile.in
## Sub-directories to parse
-SUBDIRS = framework shared trinityrealm game bindings trinitycore
+SUBDIRS = tools framework shared realmd game bindings mangosd
## Additional files to include when running 'make dist'
# Nothing yet.
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 73c3f6121db..f26209d4340 100644
--- a/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
+++ b/src/bindings/scripts/scripts/zone/black_temple/boss_illidan.cpp
@@ -137,6 +137,9 @@ 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
{
@@ -454,7 +457,7 @@ struct TRINITY_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI
{
GameObject* Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(i));
if(Door)
- Door->SetUInt32Value(GAMEOBJECT_STATE, 0); // Open Doors
+ Door->SetGoState(0); // Open Doors
}
}
@@ -487,10 +490,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_DISPLAY))
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 45479);
+ if(!m_creature->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID))
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 45479);
else
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 45481);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 45481);
m_creature->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE );
}
}
@@ -567,8 +570,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_DISPLAY, 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+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);
@@ -653,14 +656,14 @@ struct TRINITY_DLL_DECL boss_illidan_stormrageAI : public ScriptedAI
if(DemonTransformation[TransformCount].equip)
{
- 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->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 45479); // Requip warglaives if needed
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 45481);
m_creature->SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE );
}
else
{
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0); // Unequip warglaives if needed
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+0, 0); // Unequip warglaives if needed
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0);
}
switch(TransformCount)
@@ -1006,10 +1009,10 @@ struct TRINITY_DLL_DECL npc_akama_illidanAI : public ScriptedAI
DoorGUID[1] = pInstance->GetData64(DATA_GAMEOBJECT_ILLIDAN_DOOR_L);
if(GETGO(Gate, GateGUID))
- Gate->SetUInt32Value(GAMEOBJECT_STATE, 1);
+ Gate->SetGoState(1);
for(uint8 i = 0; i < 2; i++)
if(GETGO(Door, DoorGUID[i]))
- Door->SetUInt32Value(GAMEOBJECT_STATE, 1);
+ Door->SetGoState(1);
}
else
{
@@ -1079,7 +1082,7 @@ struct TRINITY_DLL_DECL npc_akama_illidanAI : public ScriptedAI
for(uint8 i = 0; i < 2; i++)
if(GETGO(Door, DoorGUID[i]))
- Door->SetUInt32Value(GAMEOBJECT_STATE, 1);
+ Door->SetGoState(1);
if(GETCRE(Illidan, IllidanGUID))
{
@@ -1245,7 +1248,7 @@ struct TRINITY_DLL_DECL npc_akama_illidanAI : public ScriptedAI
Spirit[0]->InterruptNonMeleeSpells(true);
Spirit[1]->InterruptNonMeleeSpells(true);
if(GETGO(Gate, GateGUID))
- Gate->SetUInt32Value(GAMEOBJECT_STATE, 0);
+ Gate->SetGoState(0);
Timer = 2000;
break;
case 4:
@@ -1276,7 +1279,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->SetUInt32Value(GAMEOBJECT_STATE, 0);
+ Door->SetGoState(0);
break;
case 8:
if(Phase == PHASE_WALK)
@@ -1386,9 +1389,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_DISPLAY, 44850);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY + 1, 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY + 2, 45738);
+ 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);
}
void Aggro(Unit *who) {}
@@ -1674,7 +1677,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->SetUInt32Value(GAMEOBJECT_STATE, 0);
+ go->SetGoState(0);
return true;
}
@@ -1859,8 +1862,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_DISPLAY, 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0);
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING + MOVEMENTFLAG_ONTRANSPORT);
m_creature->CastSpell(m_creature, SPELL_DUAL_WIELD, true);
@@ -1907,8 +1910,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_DISPLAY, 45479); // Equip our warglaives!
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 45481);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 45479); // Equip our warglaives!
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+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 645a70df9f5..30a74c2da15 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->SetUInt32Value(GAMEOBJECT_STATE, open ? 0 : 1);
+ Door->SetGoState(open ? 0 : 1);
}
void CloseDoor(uint64 DoorGUID, bool close)
{
if(GameObject *Door = instance->GetGameObjectInMap(DoorGUID))
- Door->SetUInt32Value(GAMEOBJECT_STATE, close ? 1 : 0);
+ Door->SetGoState(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 301301c27c2..aa89d902573 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
@@ -88,13 +88,13 @@ struct TRINITY_DLL_DECL instance_blackrock_depths : public ScriptedInstance
void OpenGO(uint64 DoorGUID, bool open)
{
if(GameObject *Door = instance->GetGameObjectInMap(DoorGUID))
- Door->SetUInt32Value(GAMEOBJECT_STATE, open ? 0 : 1);
+ Door->SetGoState(open ? 0 : 1);
}
void CloseGO(uint64 DoorGUID, bool close)
{
if(GameObject *Door = instance->GetGameObjectInMap(DoorGUID))
- Door->SetUInt32Value(GAMEOBJECT_STATE, close ? 1 : 0);
+ Door->SetGoState(close ? 1 : 0);
}
uint32 GetData(uint32 type)
@@ -145,13 +145,13 @@ struct TRINITY_DLL_DECL instance_blackrock_depths : public ScriptedInstance
{
switch(go->GetEntry())
{
- 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;
+ 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;
}
}
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 e442d067bc4..401651ae221 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_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);
+ 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);
break;
case 10:
m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, THRALL_MODEL_EQUIPPED);
@@ -399,12 +399,8 @@ struct TRINITY_DLL_DECL npc_thrall_old_hillsbradAI : public npc_escortAI
{
DoUnmount();
HadMount = false;
- 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_VIRTUAL_ITEM_SLOT_ID, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 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 ffa9094b439..833bb03bce2 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_DISPLAY , 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID , 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+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_DISPLAY , 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID , 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+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_DISPLAY , 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID , 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+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 aaf6abdd3b0..4e7f3d1989c 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->SetUInt32Value(GAMEOBJECT_STATE, open ? 0 : 1);
+ Door->SetGoState(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 23d65ce42f7..df7ea54efb0 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->SetUInt32Value(GAMEOBJECT_STATE, 0);
+ DefiasCannon->SetGoState(0);
DoPlaySound(DefiasCannon, SOUND_CANNONFIRE);
}
void BlastOutDoor()
{
- IronCladDoor->SetUInt32Value(GAMEOBJECT_STATE, 2);
+ IronCladDoor->SetGoState(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 cf1ff7c1eeb..d31df82df58 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_DISPLAY, 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+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 f20ad6c69a5..08ee10967a1 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_DISPLAY, 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, 0);
+ 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+1, 0);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+2, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+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_DISPLAY, AXE_EQUIP_MODEL);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, AXE_EQUIP_INFO);
+ 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+1, AXE_EQUIP_MODEL);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+2, 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);
//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_DISPLAY, AXE_EQUIP_MODEL);
- axe->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, AXE_EQUIP_INFO);
+ axe->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 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 f66e20ed5cd..d546c5b2d6f 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_DISABLE_ROTATE);
+ m_creature->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_STUNNED);
}
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_DISABLE_ROTATE);
+ m_creature->RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_STUNNED);
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 86051831fb5..0db9f283374 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->SetUInt32Value(GAMEOBJECT_STATE,1);
+ Shrine->SetGoState(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->SetUInt32Value(GAMEOBJECT_STATE,1);
+ Shrine->SetGoState(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 e9454d713ed..61aca9df2e3 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->SetUInt32Value(GAMEOBJECT_STATE, open ? 0 : 1);
+ Door->SetGoState(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 c564088be76..ca231a6bd12 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->SetUInt32Value(GAMEOBJECT_STATE,1);
+ go->SetGoState(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->SetUInt32Value(GAMEOBJECT_STATE, 0);
+ go->SetGoState(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 82a993c3894..4c56d230263 100644
--- a/src/bindings/scripts/scripts/zone/zulaman/boss_hexlord.cpp
+++ b/src/bindings/scripts/scripts/zone/zulaman/boss_hexlord.cpp
@@ -237,8 +237,7 @@ struct TRINITY_DLL_DECL boss_hex_lord_malacrassAI : public ScriptedAI
SpawnAdds();
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 46916);
- m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, 50268674);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 46916);
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 844e4a6c0ce..3ebb0931d4d 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_DISPLAY + 1, 5122);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 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_DISPLAY + 1, 5122);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 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_DISPLAY + 1, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 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 2c50875e4ad..3ace2e79e22 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_DISPLAY, 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_ID, 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_DISPLAY, 0);
+ m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 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 95e62063e26..b510f74bb67 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->SetUInt32Value(GAMEOBJECT_STATE, open ? 0 : 1);
+ Door->SetGoState(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 f79247bbfc0..8b993815c00 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_DISPLAY, 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_ID, 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_DISPLAY, 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_ID, 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
new file mode 100644
index 00000000000..e4e26dec111
--- /dev/null
+++ b/src/game/AchievementMgr.cpp
@@ -0,0 +1,910 @@
+/*
+ * 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
new file mode 100644
index 00000000000..6392a9fc647
--- /dev/null
+++ b/src/game/AchievementMgr.h
@@ -0,0 +1,101 @@
+/*
+ * 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/ArenaTeamHandler.cpp b/src/game/ArenaTeamHandler.cpp
index d2c9f54d04b..f48529a3f77 100644
--- a/src/game/ArenaTeamHandler.cpp
+++ b/src/game/ArenaTeamHandler.cpp
@@ -173,7 +173,7 @@ void WorldSession::HandleArenaTeamInviteAcceptOpcode(WorldPacket & /*recv_data*/
if(!at)
return;
- if(_player->GetArenaTeamIdFromDB(_player->GetGUIDLow(), at->GetType()))
+ if(_player->GetArenaTeamId(at->GetType()))
{
SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S,"","",ERR_ALREADY_IN_ARENA_TEAM); // already in arena team that size
return;
diff --git a/src/game/AuctionHouse.cpp b/src/game/AuctionHouse.cpp
index 71a8bb495b4..a12e8a8f238 100644
--- a/src/game/AuctionHouse.cpp
+++ b/src/game/AuctionHouse.cpp
@@ -752,3 +752,23 @@ 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 765d40f3962..5c870bdb2b7 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); // Maximum 20 Slots
+ memset(m_bagslot, 0, sizeof(Item *) * MAX_BAG_SIZE);
}
Bag::~Bag()
diff --git a/src/game/BattleGround.cpp b/src/game/BattleGround.cpp
index d392f074600..b562517dc08 100644
--- a/src/game/BattleGround.cpp
+++ b/src/game/BattleGround.cpp
@@ -576,6 +576,7 @@ 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)
@@ -1405,10 +1406,10 @@ bool BattleGround::AddSpiritGuide(uint32 type, float x, float y, float z, float
pCreature->SetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT, pCreature->GetGUID());
// aura
- 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);
+ 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);
// 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 3c98afe6d17..7b93adb7dfb 100644
--- a/src/game/BattleGround.h
+++ b/src/game/BattleGround.h
@@ -132,8 +132,6 @@ struct BattleGroundObjectInfo
uint32 spellid;
};
-#define MAX_QUEUED_PLAYERS_MAP 7
-
enum BattleGroundTypeId
{
BATTLEGROUND_AV = 1,
@@ -143,7 +141,10 @@ enum BattleGroundTypeId
BATTLEGROUND_BE = 5,
BATTLEGROUND_AA = 6,
BATTLEGROUND_EY = 7,
- BATTLEGROUND_RL = 8
+ BATTLEGROUND_RL = 8,
+ BATTLEGROUND_SA = 9,
+ BATTLEGROUND_DS = 10,
+ BATTLEGROUND_RV = 11
};
// 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/BattleGroundHandler.cpp b/src/game/BattleGroundHandler.cpp
index fc99fe3f1fe..4cdef6eebac 100644
--- a/src/game/BattleGroundHandler.cpp
+++ b/src/game/BattleGroundHandler.cpp
@@ -180,6 +180,8 @@ void WorldSession::HandleBattleGroundJoinOpcode( WorldPacket & recv_data )
}
sLog.outDebug("Battleground: group end");
sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, _player->GetBattleGroundQueueIdFromLevel());
+ if(!ginfo->IsInvitedToBGInstanceGUID)
+ sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AnnounceWorld(ginfo, _player->GetGUID(), true);
}
else
{
@@ -196,6 +198,8 @@ void WorldSession::HandleBattleGroundJoinOpcode( WorldPacket & recv_data )
GroupQueueInfo * ginfo = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AddGroup(_player, bgTypeId, 0, false, 0);
sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AddPlayer(_player, ginfo);
sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, _player->GetBattleGroundQueueIdFromLevel());
+ if(!ginfo->IsInvitedToBGInstanceGUID)
+ sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AnnounceWorld(ginfo, _player->GetGUID(), true);
sLog.outDebug("Battleground: player joined queue for bg queue type %u bg type %u: GUID %u, NAME %s",bgQueueTypeId,bgTypeId,_player->GetGUIDLow(), _player->GetName());
}
}
@@ -784,6 +788,8 @@ void WorldSession::HandleBattleGroundArenaJoin( WorldPacket & recv_data )
}
sLog.outDebug("Battleground: arena join as group end");
sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].Update(bgTypeId, _player->GetBattleGroundQueueIdFromLevel(), arenatype, isRated, arenaRating);
+ if(isRated)
+ sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].AnnounceWorld(ginfo, _player->GetGUID(), true);
}
else
{
diff --git a/src/game/BattleGroundMgr.cpp b/src/game/BattleGroundMgr.cpp
index 4be2320be6a..2b904ba6850 100644
--- a/src/game/BattleGroundMgr.cpp
+++ b/src/game/BattleGroundMgr.cpp
@@ -243,38 +243,6 @@ void BattleGroundQueue::AddPlayer(Player *plr, GroupQueueInfo *ginfo)
// add the pinfo to ginfo's list
ginfo->Players[plr->GetGUID()] = &info;
-/*
- if( sWorld.getConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE) )
- {
- BattleGround* bg = sBattleGroundMgr.GetBattleGround(bgTypeId);
- char const* bgName = bg->GetName();
-
- uint32 q_min_level = Player::GetMinLevelForBattleGroundQueueId(queue_id);
- uint32 q_max_level = Player::GetMaxLevelForBattleGroundQueueId(queue_id);
-
- // replace hardcoded max level by player max level for nice output
- if(q_max_level > sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL))
- q_max_level = sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL);
-
- int8 MinPlayers = bg->GetMinPlayersPerTeam();
-
- uint8 qHorde = m_QueuedPlayers[queue_id].Horde;
- uint8 qAlliance = m_QueuedPlayers[queue_id].Alliance;
-
- // Show queue status to player only (when joining queue)
- if(sWorld.getConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY))
- {
- ChatHandler(plr).PSendSysMessage(LANG_BG_QUEUE_ANNOUNCE_SELF,
- bgName, q_min_level, q_max_level, qAlliance, (MinPlayers > qAlliance) ? (MinPlayers - qAlliance) : 0, qHorde, (MinPlayers > qHorde) ? (MinPlayers - qHorde) : 0);
- }
- // System message
- else
- {
- sWorld.SendWorldText(LANG_BG_QUEUE_ANNOUNCE_WORLD,
- bgName, q_min_level, q_max_level, qAlliance, (MinPlayers > qAlliance) ? (MinPlayers - qAlliance) : 0, qHorde, (MinPlayers > qHorde) ? (MinPlayers - qHorde) : 0);
- }
-
- }*/
}
void BattleGroundQueue::RemovePlayer(uint64 guid, bool decreaseInvitedCount)
@@ -360,6 +328,11 @@ void BattleGroundQueue::RemovePlayer(uint64 guid, bool decreaseInvitedCount)
// remove player queue info
m_QueuedPlayers[queue_id].erase(itr);
// remove group queue info if needed
+
+ //if we left BG queue(not porting) OR if arena team left queue for rated match
+ if((decreaseInvitedCount && !group->ArenaType) || (group->ArenaType && group->IsRated && group->Players.empty()))
+ AnnounceWorld(group, guid, false);
+
if(group->Players.empty())
{
m_QueuedGroups[queue_id].erase(group_itr);
@@ -388,6 +361,85 @@ void BattleGroundQueue::RemovePlayer(uint64 guid, bool decreaseInvitedCount)
}
}
+void BattleGroundQueue::AnnounceWorld(GroupQueueInfo *ginfo, uint64 playerGUID, bool isAddedToQueue)
+{
+
+ if(ginfo->ArenaType) //if Arena
+ {
+ if( sWorld.getConfig(CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE) && ginfo->IsRated)
+ {
+ BattleGround* bg = sBattleGroundMgr.GetBattleGroundTemplate(ginfo->BgTypeId);
+ if(!bg)
+ return;
+
+ char const* bgName = bg->GetName();
+ if(isAddedToQueue)
+ sWorld.SendWorldText(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN, bgName, ginfo->ArenaType, ginfo->ArenaType, ginfo->ArenaTeamRating);
+ else
+ sWorld.SendWorldText(LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT, bgName, ginfo->ArenaType, ginfo->ArenaType, ginfo->ArenaTeamRating);
+ }
+ }
+ else //if BG
+ {
+ if( sWorld.getConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE) )
+ {
+ Player *plr = objmgr.GetPlayer(playerGUID);
+ if(!plr)
+ return;
+
+ BattleGround* bg = sBattleGroundMgr.GetBattleGroundTemplate(ginfo->BgTypeId);
+ if(!bg)
+ return;
+
+ uint32 queue_id = plr->GetBattleGroundQueueIdFromLevel();
+ char const* bgName = bg->GetName();
+
+ uint32 q_min_level = Player::GetMinLevelForBattleGroundQueueId(queue_id);
+ uint32 q_max_level = Player::GetMaxLevelForBattleGroundQueueId(queue_id);
+
+ // replace hardcoded max level by player max level for nice output
+ if(q_max_level > sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL))
+ q_max_level = sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL);
+
+ int8 MinPlayers = bg->GetMinPlayersPerTeam();
+
+ uint8 qHorde = 0;
+ uint8 qAlliance = 0;
+
+ uint32 bgTypeId = ginfo->BgTypeId;
+ QueuedPlayersMap::iterator itr;
+ for(itr = m_QueuedPlayers[queue_id].begin(); itr!= m_QueuedPlayers[queue_id].end(); ++itr)
+ {
+ if(itr->second.GroupInfo->BgTypeId == bgTypeId)
+ {
+ switch(itr->second.GroupInfo->Team)
+ {
+ case HORDE:
+ qHorde++; break;
+ case ALLIANCE:
+ qAlliance++; break;
+ default:
+ break;
+ }
+ }
+ }
+
+ // Show queue status to player only (when joining queue)
+ if(sWorld.getConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY))
+ {
+ ChatHandler(plr).PSendSysMessage(LANG_BG_QUEUE_ANNOUNCE_SELF,
+ bgName, q_min_level, q_max_level, qAlliance, MinPlayers, qHorde, MinPlayers);
+ }
+ // System message
+ else
+ {
+ sWorld.SendWorldText(LANG_BG_QUEUE_ANNOUNCE_WORLD,
+ bgName, q_min_level, q_max_level, qAlliance, MinPlayers, qHorde, MinPlayers);
+ }
+ }
+ }
+}
+
bool BattleGroundQueue::InviteGroupToBG(GroupQueueInfo * ginfo, BattleGround * bg, uint32 side)
{
// set side if needed
@@ -715,6 +767,15 @@ void BattleGroundQueue::Update(uint32 bgTypeId, uint32 queue_id, uint8 arenatype
{
// create new battleground
bg2 = sBattleGroundMgr.CreateNewBattleGround(bgTypeId);
+ if( sWorld.getConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE) )
+ {
+ char const* bgName = bg2->GetName();
+ uint32 q_min_level = Player::GetMinLevelForBattleGroundQueueId(queue_id);
+ uint32 q_max_level = Player::GetMaxLevelForBattleGroundQueueId(queue_id);
+ if(q_max_level > sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL))
+ q_max_level = sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL);
+ sWorld.SendWorldText(LANG_BG_STARTED_ANNOUNCE_WORLD, bgName, q_min_level, q_max_level);
+ }
}
if(!bg2)
@@ -1267,13 +1328,16 @@ 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 b217c1d692e..faf6196979d 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 7 // for level ranges 10-19, 20-29, 30-39, 40-49, 50-59, 60-69, 70+
+#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_TYPES 9 // each BG type will be in array
+#define MAX_BATTLEGROUND_TYPES 12 // each BG type will be in array
#define MAX_BATTLEGROUND_QUEUE_TYPES 8
@@ -77,6 +77,7 @@ class BattleGroundQueue
void RemovePlayer(uint64 guid, bool decreaseInvitedCount);
void DecreaseGroupLength(uint32 queueId, uint32 AsGroup);
void BGEndedRemoveInvites(BattleGround * bg);
+ void AnnounceWorld(GroupQueueInfo *ginfo, uint64 playerGUID, bool isAddedToQueue);
typedef std::map<uint64, PlayerQueueInfo> QueuedPlayersMap;
QueuedPlayersMap m_QueuedPlayers[MAX_BATTLEGROUND_QUEUES];
diff --git a/src/game/Calendar.cpp b/src/game/Calendar.cpp
new file mode 100644
index 00000000000..cebf7252e78
--- /dev/null
+++ b/src/game/Calendar.cpp
@@ -0,0 +1,17 @@
+/*
+ * 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/Tools.h b/src/game/Calendar.h
index 03b48a7e9a3..94e4ff103f5 100644
--- a/src/game/Tools.h
+++ b/src/game/Calendar.h
@@ -1,7 +1,5 @@
/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
- *
- * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
+ * 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
@@ -10,19 +8,19 @@
*
* 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
+ * 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
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#ifndef TRINITY_TOOLS_H
-#define TRINITY_TOOLS_H
-#include "Common.h"
-#include "WorldPacket.h"
+#ifndef MANGOS_CALENDAR_H
+#define MANGOS_CALENDAR_H
+
+class Calendar
+{
-bool readGUID(WorldPacket & data, uint64& guid);
-void writeGUID(WorldPacket & data, uint64 & guid);
+};
#endif
diff --git a/src/game/CalendarHandler.cpp b/src/game/CalendarHandler.cpp
new file mode 100644
index 00000000000..9c69e3a91f6
--- /dev/null
+++ b/src/game/CalendarHandler.cpp
@@ -0,0 +1,118 @@
+/*
+ * 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 aa884ddd2df..121a9b0d98d 100644
--- a/src/game/CharacterHandler.cpp
+++ b/src/game/CharacterHandler.cpp
@@ -82,7 +82,9 @@ 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_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));
return res;
}
@@ -232,17 +234,16 @@ void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data )
if (raceEntry->addon > Expansion())
{
data << (uint8)CHAR_CREATE_EXPANSION;
- sLog.outError("Not Expansion 1 account:[%d] but tried to Create character with expansion 1 race (%u)",GetAccountId(),race_);
+ sLog.outError("Expansion %u account:[%d] tried to Create character with expansion %u race (%u)",Expansion(),GetAccountId(),raceEntry->addon,race_);
SendPacket( &data );
return;
}
// prevent character creating Expansion class without Expansion account
- // TODO: use possible addon field in ChrClassesEntry in next dbc version
- if (Expansion() < 2 && class_ == CLASS_DEATH_KNIGHT)
+ if (classEntry->addon > Expansion())
{
- data << (uint8)CHAR_CREATE_EXPANSION;
- sLog.outError("Not Expansion 2 account:[%d] but tried to Create character with expansion 2 class (%u)",GetAccountId(),class_);
+ 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_);
SendPacket( &data );
return;
}
@@ -309,29 +310,77 @@ 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(!AllowTwoSideAccounts || skipCinematics == 1)
+
+ // 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)
{
- QueryResult *result2 = CharacterDatabase.PQuery("SELECT DISTINCT race FROM characters WHERE account = '%u' %s", GetAccountId(),skipCinematics == 1 ? "" : "LIMIT 1");
+ QueryResult *result2 = CharacterDatabase.PQuery("SELECT guid,race,class FROM characters WHERE account = '%u' %s",
+ GetAccountId(), (skipCinematics == 1 || class_ == CLASS_DEATH_KNIGHT) ? "" : "LIMIT 1");
if(result2)
{
uint32 team_= Player::TeamForRace(race_);
Field* field = result2->Fetch();
- uint8 race = field[0].GetUInt32();
+ 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;
+ }
+ }
// need to check team only for first character
// TODO: what to if account already has characters of both races?
if (!AllowTwoSideAccounts)
{
- uint32 team=0;
- if(race > 0)
- team = Player::TeamForRace(race);
+ uint32 acc_team=0;
+ if(acc_race > 0)
+ acc_team = Player::TeamForRace(acc_race);
- if(team != team_)
+ if(acc_team != team_)
{
data << (uint8)CHAR_CREATE_PVP_TEAMS_VIOLATION;
SendPacket( &data );
@@ -340,20 +389,55 @@ void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data )
}
}
- if (skipCinematics == 1)
+ // 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)
{
- // TODO: check if cinematic already shown? (already logged in?; cinematic field)
- while (race_ != race && result2->NextRow())
+ 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)
{
- field = result2->Fetch();
- race = field[0].GetUInt32();
+ 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;
+ }
}
- 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;
@@ -510,9 +594,11 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder)
data << pCurrChar->GetOrientation();
SendPacket(&data);
- data.Initialize( SMSG_ACCOUNT_DATA_TIMES, 128 );
- for(int i = 0; i < 32; i++)
- data << uint32(0);
+ 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
SendPacket(&data);
data.Initialize(SMSG_FEATURE_SYSTEM_STATUS, 2); // added in 2.2.0
@@ -609,12 +695,20 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder)
{
pCurrChar->setCinematic(1);
- ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(pCurrChar->getRace());
- if(rEntry)
+ if(ChrClassesEntry const* cEntry = sChrClassesStore.LookupEntry(pCurrChar->getClass()))
{
- data.Initialize( SMSG_TRIGGER_CINEMATIC,4 );
- data << uint32(rEntry->startmovie);
- SendPacket( &data );
+ 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 );
+ }
}
}
@@ -658,22 +752,6 @@ 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);
}
@@ -903,11 +981,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;
@@ -915,15 +993,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;
}
@@ -932,7 +1010,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;
}
@@ -961,7 +1039,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;
}
@@ -975,11 +1053,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 << guid;
+ WorldPacket data(SMSG_CHAR_RENAME, 1+8+(newname.size()+1));
+ data << uint8(RESPONSE_SUCCESS);
+ data << uint64(guid);
data << newname;
session->SendPacket(&data);
}
@@ -1073,3 +1151,166 @@ 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 1beb78b9419..c05fd2b35c6 100644
--- a/src/game/Chat.cpp
+++ b/src/game/Chat.cpp
@@ -190,6 +190,7 @@ 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 },
@@ -263,6 +264,7 @@ 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 },
@@ -589,6 +591,7 @@ 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 16f764366ac..b324d2d5f5e 100644
--- a/src/game/Chat.h
+++ b/src/game/Chat.h
@@ -233,6 +233,7 @@ 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);
@@ -434,6 +435,7 @@ 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);
@@ -467,6 +469,7 @@ 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 989ccd61151..77b553f6856 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_HASPOSITION);
+ m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION);
m_valuesCount = CORPSE_END;
diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp
index 629b5ec6d43..5c5ccef3897 100644
--- a/src/game/Creature.cpp
+++ b/src/game/Creature.cpp
@@ -145,11 +145,12 @@ 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_reactState(REACT_AGGRESSIVE),
-m_regenTimer(2000), m_defaultMovementType(IDLE_MOTION_TYPE), m_equipmentId(0),
+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_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,7 +317,6 @@ 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)
@@ -766,8 +766,11 @@ bool Creature::isCanInteractWithBattleMaster(Player* pPlayer, bool msg) const
case BATTLEGROUND_NA:
case BATTLEGROUND_BE:
case BATTLEGROUND_AA:
- case BATTLEGROUND_RL: pPlayer->PlayerTalkClass->SendGossipMenu(10024,GetGUID()); break;
- break;
+ case BATTLEGROUND_RL:
+ case BATTLEGROUND_SA:
+ case BATTLEGROUND_DS:
+ case BATTLEGROUND_RV: pPlayer->PlayerTalkClass->SendGossipMenu(10024,GetGUID()); break;
+ default: break;
}
return false;
}
@@ -1460,11 +1463,7 @@ void Creature::LoadEquipment(uint32 equip_entry, bool force)
if (force)
{
for (uint8 i = 0; i < 3; i++)
- {
- 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);
- }
+ SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + i, 0);
m_equipmentId = 0;
}
return;
@@ -1476,11 +1475,7 @@ void Creature::LoadEquipment(uint32 equip_entry, bool force)
m_equipmentId = equip_entry;
for (uint8 i = 0; i < 3; 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]);
- }
+ SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + i, einfo->equipentry[i]);
}
bool Creature::hasQuest(uint32 quest_id) const
diff --git a/src/game/Creature.h b/src/game/Creature.h
index 1ae41b86776..ff512fb5da0 100644
--- a/src/game/Creature.h
+++ b/src/game/Creature.h
@@ -244,9 +244,7 @@ struct NpcOptionLocale
struct EquipmentInfo
{
uint32 entry;
- uint32 equipmodel[3];
- uint32 equipinfo[3];
- uint32 equipslot[3];
+ uint32 equipentry[3];
};
// from `creature` table
@@ -423,6 +421,7 @@ 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; }
@@ -657,11 +656,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 d7badd57892..0dc69829728 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_HASPOSITION);
+ m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION);
m_valuesCount = DYNAMICOBJECT_END;
}
diff --git a/src/game/GameObject.cpp b/src/game/GameObject.cpp
index 28c39ee5bbe..53a7d36aef4 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_HASPOSITION);
+ m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION);
m_valuesCount = GAMEOBJECT_END;
m_respawnTime = 0;
@@ -127,17 +127,33 @@ 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
- SetFloatValue (GAMEOBJECT_ROTATION, rotation0);
- SetFloatValue (GAMEOBJECT_ROTATION+1, rotation1);
- SetFloatValue (GAMEOBJECT_ROTATION+2, rotation2);
- SetFloatValue (GAMEOBJECT_ROTATION+3, rotation3);
+ 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(OBJECT_FIELD_SCALE_X, goinfo->size);
SetUInt32Value(GAMEOBJECT_FACTION, goinfo->faction);
SetUInt32Value(GAMEOBJECT_FLAGS, goinfo->flags);
- SetUInt32Value(OBJECT_FIELD_ENTRY, goinfo->id);
+ SetEntry(goinfo->id);
SetUInt32Value(GAMEOBJECT_DISPLAYID, goinfo->displayId);
@@ -146,8 +162,6 @@ 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;
@@ -264,7 +278,7 @@ void GameObject::Update(uint32 /*p_time*/)
return;
}
// respawn timer
- MapManager::Instance().GetMap(GetMapId(), this)->Add(this);
+ GetMap()->Add(this);
break;
}
}
@@ -414,7 +428,7 @@ void GameObject::Update(uint32 /*p_time*/)
//burning flags in some battlegrounds, if you find better condition, just add it
if (GetGoAnimProgress() > 0)
{
- SendObjectDeSpawnAnim(this->GetGUID());
+ SendObjectDeSpawnAnim(GetGUID());
//reset flags
SetUInt32Value(GAMEOBJECT_FLAGS, GetGOInfo()->flags);
}
@@ -451,7 +465,7 @@ void GameObject::Refresh()
return;
if(isSpawned())
- MapManager::Instance().GetMap(GetMapId(), this)->Add(this);
+ GetMap()->Add(this);
}
void GameObject::AddUniqueUse(Player* player)
@@ -504,7 +518,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)
@@ -517,34 +531,33 @@ 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_ROTATION+0);
- data.rotation1 = GetFloatValue(GAMEOBJECT_ROTATION+1);
- data.rotation2 = GetFloatValue(GAMEOBJECT_ROTATION+2);
- data.rotation3 = GetFloatValue(GAMEOBJECT_ROTATION+3);
+ 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.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 << ", "
- << GetUInt32Value (OBJECT_FIELD_ENTRY) << ", "
+ << GetEntry() << ", "
<< mapid << ", "
<< (uint32)spawnMask << ", "
<< GetFloatValue(GAMEOBJECT_POS_X) << ", "
<< GetFloatValue(GAMEOBJECT_POS_Y) << ", "
<< GetFloatValue(GAMEOBJECT_POS_Z) << ", "
<< GetFloatValue(GAMEOBJECT_FACING) << ", "
- << GetFloatValue(GAMEOBJECT_ROTATION) << ", "
- << GetFloatValue(GAMEOBJECT_ROTATION+1) << ", "
- << GetFloatValue(GAMEOBJECT_ROTATION+2) << ", "
- << GetFloatValue(GAMEOBJECT_ROTATION+3) << ", "
+ << GetFloatValue(GAMEOBJECT_PARENTROTATION) << ", "
+ << GetFloatValue(GAMEOBJECT_PARENTROTATION+1) << ", "
+ << GetFloatValue(GAMEOBJECT_PARENTROTATION+2) << ", "
+ << GetFloatValue(GAMEOBJECT_PARENTROTATION+3) << ", "
<< m_respawnDelayTime << ", "
- << GetGoAnimProgress() << ", "
- << GetGoState() << ")";
+ << (uint32)GetGoAnimProgress() << ", "
+ << (uint32)GetGoState() << ")";
WorldDatabase.BeginTransaction();
WorldDatabase.PExecuteLog("DELETE FROM gameobject WHERE guid = '%u'", m_DBTableGuid);
@@ -563,7 +576,7 @@ bool GameObject::LoadFromDB(uint32 guid, Map *map)
}
uint32 entry = data->id;
- uint32 map_id = data->mapid;
+ //uint32 map_id = data->mapid; // already used before call
float x = data->posX;
float y = data->posY;
float z = data->posZ;
@@ -576,12 +589,11 @@ 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, ArtKit) )
+ if (!Create(guid,entry, map, x, y, z, ang, rotation0, rotation1, rotation2, rotation3, animprogress, go_state) )
return false;
switch(GetGOInfo()->type)
@@ -846,14 +858,6 @@ 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)
@@ -1209,7 +1213,7 @@ void GameObject::Use(Unit* user)
Player* player = (Player*)user;
- if( player->isAllowUseBattleGroundObject() )
+ if( player->isAllowUseBattleGroundObject() )
{
// in battleground check
BattleGround *bg = player->GetBattleGround();
@@ -1247,6 +1251,26 @@ 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 afeaba98cc9..9a570eb54da 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_DO_NOT_USE_YET
+ //32 GAMEOBJECT_TYPE_BARBER_CHAIR
struct
{
- uint32 mapID; //0
- uint32 difficulty; //1
- } doNotUseYet;
+ uint32 chairheight; //0
+ uint32 heightOffset; //1
+ } barberChair;
//33 GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING
struct
{
@@ -350,6 +350,13 @@ 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
@@ -504,14 +511,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(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); }
+ 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); }
void Use(Unit* user);
diff --git a/src/game/GossipDef.cpp b/src/game/GossipDef.cpp
index 85414fa3372..90aa7304c90 100644
--- a/src/game/GossipDef.cpp
+++ b/src/game/GossipDef.cpp
@@ -417,10 +417,14 @@ 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 << Details << Objectives;
+ data << Title;
+ data << Details;
+ data << Objectives;
data << uint32(ActivateAccept);
data << uint32(pQuest->GetSuggestedPlayers());
+ data << uint8(0); // new wotlk
if (pQuest->HasFlag(QUEST_FLAGS_HIDDEN_REWARDS))
{
@@ -466,6 +470,7 @@ 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++)
@@ -542,6 +547,8 @@ 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;
@@ -590,13 +597,14 @@ 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 )
@@ -678,9 +686,10 @@ 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(0x00); // unk, NOT honor
+ data << uint32(0); // unknown
+ data << uint32(pQuest->GetBonusTalents()); // bonus talents
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 0c952f69649..b69e185c171 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.SendAuraDurationsForTarget((Unit*)(*vItr));
+ i_player.SendAurasForTarget((Unit*)(*vItr));
}
void
diff --git a/src/game/Group.h b/src/game/Group.h
index 8417a145268..5edc99f8c0c 100644
--- a/src/game/Group.h
+++ b/src/game/Group.h
@@ -66,24 +66,25 @@ enum GroupUpdateFlags
{
GROUP_UPDATE_FLAG_NONE = 0x00000000, // nothing
GROUP_UPDATE_FLAG_STATUS = 0x00000001, // uint16, flags
- GROUP_UPDATE_FLAG_CUR_HP = 0x00000002, // uint16
- GROUP_UPDATE_FLAG_MAX_HP = 0x00000004, // uint16
+ GROUP_UPDATE_FLAG_CUR_HP = 0x00000002, // uint32
+ GROUP_UPDATE_FLAG_MAX_HP = 0x00000004, // uint32
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 uint16 spellid + uint8 unk
+ GROUP_UPDATE_FLAG_AURAS = 0x00000200, // uint64 mask, for each bit set uint32 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, // uint16 pet cur health
- GROUP_UPDATE_FLAG_PET_MAX_HP = 0x00004000, // uint16 pet max health
+ 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_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 uint16 spellid + uint8 unk, pet auras...
+ 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_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 3890a9f77a6..9f807c2b525 100644
--- a/src/game/GroupHandler.cpp
+++ b/src/game/GroupHandler.cpp
@@ -162,6 +162,7 @@ void WorldSession::HandleGroupInviteOpcode( WorldPacket & recv_data )
// ok, we do it
WorldPacket data(SMSG_GROUP_INVITE, 10); // guess size
+ data << uint8(1); // ok
data << GetPlayer()->GetName();
player->GetSession()->SendPacket(&data);
@@ -688,10 +689,10 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player *player, WorldPacke
}
if (mask & GROUP_UPDATE_FLAG_CUR_HP)
- *data << (uint16) player->GetHealth();
+ *data << (uint32) player->GetHealth();
if (mask & GROUP_UPDATE_FLAG_MAX_HP)
- *data << (uint16) player->GetMaxHealth();
+ *data << (uint32) player->GetMaxHealth();
Powers powerType = player->getPowerType();
if (mask & GROUP_UPDATE_FLAG_POWER_TYPE)
@@ -720,7 +721,7 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player *player, WorldPacke
{
if(auramask & (uint64(1) << i))
{
- *data << uint16(player->GetUInt32Value(UNIT_FIELD_AURA + i));
+ *data << uint32(player->GetVisibleAura(i));
*data << uint8(1);
}
}
@@ -754,17 +755,17 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player *player, WorldPacke
if (mask & GROUP_UPDATE_FLAG_PET_CUR_HP)
{
if(pet)
- *data << (uint16) pet->GetHealth();
+ *data << (uint32) pet->GetHealth();
else
- *data << (uint16) 0;
+ *data << (uint32) 0;
}
if (mask & GROUP_UPDATE_FLAG_PET_MAX_HP)
{
if(pet)
- *data << (uint16) pet->GetMaxHealth();
+ *data << (uint32) pet->GetMaxHealth();
else
- *data << (uint16) 0;
+ *data << (uint32) 0;
}
if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE)
@@ -801,7 +802,7 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player *player, WorldPacke
{
if(auramask & (uint64(1) << i))
{
- *data << uint16(pet->GetUInt32Value(UNIT_FIELD_AURA + i));
+ *data << uint32(pet->GetVisibleAura(i));
*data << uint8(1);
}
}
@@ -824,6 +825,7 @@ 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;
@@ -834,6 +836,7 @@ 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
@@ -843,8 +846,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 << (uint16) player->GetHealth(); // GROUP_UPDATE_FLAG_CUR_HP
- data << (uint16) player->GetMaxHealth(); // GROUP_UPDATE_FLAG_MAX_HP
+ data << (uint32) player->GetHealth(); // GROUP_UPDATE_FLAG_CUR_HP
+ data << (uint32) 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
@@ -858,11 +861,11 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode( WorldPacket &recv_data )
data << (uint64) auramask; // placeholder
for(uint8 i = 0; i < MAX_AURAS; ++i)
{
- if(uint32 aura = player->GetUInt32Value(UNIT_FIELD_AURA + i))
+ if(uint32 aura = player->GetVisibleAura(i))
{
auramask |= (uint64(1) << i);
- data << uint16(aura);
- data << uint8(1);
+ data << (uint32) aura;
+ data << (uint8) 1;
}
}
data.put<uint64>(maskPos,auramask); // GROUP_UPDATE_FLAG_AURAS
@@ -873,8 +876,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 << (uint16) pet->GetHealth(); // GROUP_UPDATE_FLAG_PET_CUR_HP
- data << (uint16) pet->GetMaxHealth(); // GROUP_UPDATE_FLAG_PET_MAX_HP
+ data << (uint32) pet->GetHealth(); // GROUP_UPDATE_FLAG_PET_CUR_HP
+ data << (uint32) 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
@@ -884,10 +887,10 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode( WorldPacket &recv_data )
data << (uint64) petauramask; // placeholder
for(uint8 i = 0; i < MAX_AURAS; ++i)
{
- if(uint32 petaura = pet->GetUInt32Value(UNIT_FIELD_AURA + i))
+ if(uint32 petaura = pet->GetVisibleAura(i))
{
petauramask |= (uint64(1) << i);
- data << (uint16) petaura;
+ data << (uint32) petaura;
data << (uint8) 1;
}
}
diff --git a/src/game/Guild.cpp b/src/game/Guild.cpp
index 897110afe55..55ad071a74b 100644
--- a/src/game/Guild.cpp
+++ b/src/game/Guild.cpp
@@ -785,6 +785,7 @@ 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)" );
@@ -1602,7 +1603,21 @@ void Guild::DisplayGuildBankLogs(WorldSession *session, uint8 TabId)
{
data << uint8((*itr)->LogEntry);
data << uint64(MAKE_NEW_GUID((*itr)->PlayerGuid,0,HIGHGUID_PLAYER));
- data << uint32((*itr)->ItemOrMoney);
+ 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(time(NULL)-(*itr)->TimeStamp);
}
session->SendPacket(&data);
@@ -1618,10 +1633,21 @@ void Guild::DisplayGuildBankLogs(WorldSession *session, uint8 TabId)
{
data << uint8((*itr)->LogEntry);
data << uint64(MAKE_NEW_GUID((*itr)->PlayerGuid,0,HIGHGUID_PLAYER));
- 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
+ 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(time(NULL)-(*itr)->TimeStamp);
}
session->SendPacket(&data);
@@ -1703,7 +1729,7 @@ void Guild::AppendDisplayGuildBankSlot( WorldPacket& data, GuildBankTab const *t
// SuffixFactor +4
data << (uint32) pItem->GetItemSuffixFactor();
// +12 // ITEM_FIELD_STACK_COUNT
- data << uint8(pItem->GetCount());
+ data << uint32(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 683ff980e3a..f51ba5a6d27 100644
--- a/src/game/Guild.h
+++ b/src/game/Guild.h
@@ -56,7 +56,8 @@ 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_ALL = 0x000FF1FF
+ GR_RIGHT_CREATE_GUILD_EVENT = 0x00100000, // wotlk
+ GR_RIGHT_ALL = 0x001FF1FF
};
enum Typecommand
@@ -156,6 +157,8 @@ 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 0c264a76d8b..8b4b124669e 100644
--- a/src/game/Item.cpp
+++ b/src/game/Item.cpp
@@ -206,6 +206,10 @@ 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;
}
@@ -450,7 +454,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,SKILL_CLOTH,SKILL_LEATHER,SKILL_MAIL,SKILL_PLATE_MAIL,0,SKILL_SHIELD,0,0,0,0
};
ItemPrototype const* proto = GetProto();
@@ -765,9 +769,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 + 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);
+ 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);
SetState(ITEM_CHANGED);
}
@@ -776,7 +780,7 @@ void Item::SetEnchantmentDuration(EnchantmentSlot slot, uint32 duration)
if(GetEnchantmentDuration(slot) == duration)
return;
- SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET,duration);
+ SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET,duration);
SetState(ITEM_CHANGED);
}
@@ -785,7 +789,7 @@ void Item::SetEnchantmentCharges(EnchantmentSlot slot, uint32 charges)
if(GetEnchantmentCharges(slot) == charges)
return;
- SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET,charges);
+ SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET,charges);
SetState(ITEM_CHANGED);
}
@@ -795,7 +799,7 @@ void Item::ClearEnchantment(EnchantmentSlot slot)
return;
for(uint8 x = 0; x < 3; ++x)
- SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + x, 0);
+ SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + x, 0);
SetState(ITEM_CHANGED);
}
diff --git a/src/game/Item.h b/src/game/Item.h
index 72c09b0c1da..4be1d42a32a 100644
--- a/src/game/Item.h
+++ b/src/game/Item.h
@@ -148,29 +148,30 @@ 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,
- 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
+ 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
};
-#define MAX_VISIBLE_ITEM_OFFSET 16 // 16 fields per visible item (creator(2) + enchantments(12) + properties(1) + pad(1))
+#define MAX_VISIBLE_ITEM_OFFSET 18 // 18 fields per visible item (creator(2) + enchantments(13) + properties(1) + seed(1) + pad(1))
enum EnchantmentOffset
{
ENCHANTMENT_ID_OFFSET = 0,
ENCHANTMENT_DURATION_OFFSET = 1,
- ENCHANTMENT_CHARGES_OFFSET = 2
+ ENCHANTMENT_CHARGES_OFFSET = 2 // now here not only charges, but something new in wotlk
};
#define MAX_ENCHANTMENT_OFFSET 3
@@ -211,6 +212,7 @@ 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();
@@ -256,9 +258,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 + 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);}
+ 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);}
void SendTimeUpdate(Player* owner);
void UpdateDuration(Player* owner, uint32 diff);
diff --git a/src/game/ItemHandler.cpp b/src/game/ItemHandler.cpp
index 085c9553a30..3437495bc48 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 << uint32(-1); // new 2.0.3, not exist in wdb cache?
+ data << pProto->Unk0; // 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,11 +349,14 @@ void WorldSession::HandleItemQuerySingleOpcode( WorldPacket & recv_data )
data << pProto->MaxCount;
data << pProto->Stackable;
data << pProto->ContainerSlots;
- for(int i = 0; i < 10; i++)
+ data << pProto->StatsCount; // item stats count
+ for(int i = 0; i < pProto->StatsCount; 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;
@@ -437,7 +440,8 @@ void WorldSession::HandleItemQuerySingleOpcode( WorldPacket & recv_data )
data << pProto->GemProperties;
data << pProto->RequiredDisenchantSkill;
data << pProto->ArmorDamageModifier;
- data << uint32(0); // added in 2.4.2.8209, duration (seconds)
+ data << pProto->Duration; // added in 2.4.2.8209, duration (seconds)
+ data << pProto->ItemLimitCategory; // WotLK, ItemLimitCategory
SendPacket( &data );
}
else
@@ -845,6 +849,7 @@ 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 1ca412d246a..60c92ad2d70 100644
--- a/src/game/ItemPrototype.h
+++ b/src/game/ItemPrototype.h
@@ -57,10 +57,18 @@ 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_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
};
-#define MAX_ITEM_MOD 38
+#define MAX_ITEM_MOD 46
enum ItemSpelltriggerType
{
@@ -185,10 +193,11 @@ enum ItemClass
ITEM_CLASS_QUEST = 12,
ITEM_CLASS_KEY = 13,
ITEM_CLASS_PERMANENT = 14,
- ITEM_CLASS_JUNK = 15
+ ITEM_CLASS_MISC = 15,
+ ITEM_CLASS_GLYPH = 16
};
-#define MAX_ITEM_CLASS 16
+#define MAX_ITEM_CLASS 17
enum ItemSubclassConsumable
{
@@ -214,10 +223,11 @@ enum ItemSubclassContainer
ITEM_SUBCLASS_ENGINEERING_CONTAINER = 4,
ITEM_SUBCLASS_GEM_CONTAINER = 5,
ITEM_SUBCLASS_MINING_CONTAINER = 6,
- ITEM_SUBCLASS_LEATHERWORKING_CONTAINER = 7
+ ITEM_SUBCLASS_LEATHERWORKING_CONTAINER = 7,
+ ITEM_SUBCLASS_INSCRIPTION_CONTAINER = 8
};
-#define MAX_ITEM_SUBCLASS_CONTAINER 8
+#define MAX_ITEM_SUBCLASS_CONTAINER 9
enum ItemSubclassWeapon
{
@@ -272,10 +282,11 @@ 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_TOTEM = 9,
+ ITEM_SUBCLASS_ARMOR_SIGIL = 10
};
-#define MAX_ITEM_SUBCLASS_ARMOR 10
+#define MAX_ITEM_SUBCLASS_ARMOR 11
enum ItemSubclassReagent
{
@@ -310,10 +321,12 @@ enum ItemSubclassTradeGoods
ITEM_SUBCLASS_ELEMENTAL = 10,
ITEM_SUBCLASS_TRADE_GOODS_OTHER = 11,
ITEM_SUBCLASS_ENCHANTING = 12,
- ITEM_SUBCLASS_MATERIAL = 13 // Added in 2.4.2
+ ITEM_SUBCLASS_MATERIAL = 13,
+ ITEM_SUBCLASS_ARMOR_ENCHANTMENT = 14,
+ ITEM_SUBCLASS_WEAPON_ENCHANTMENT = 15
};
-#define MAX_ITEM_SUBCLASS_TRADE_GOODS 14
+#define MAX_ITEM_SUBCLASS_TRADE_GOODS 16
enum ItemSubclassGeneric
{
@@ -423,7 +436,8 @@ 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_JUNK,
+ MAX_ITEM_SUBCLASS_GLYPH
};
inline uint8 ItemSubClassToDurabilityMultiplierId(uint32 ItemClass, uint32 ItemSubClass)
@@ -500,7 +514,10 @@ 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;
@@ -536,12 +553,13 @@ 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
@@ -563,6 +581,46 @@ 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 be6401596ea..c7115ce9248 100644
--- a/src/game/Language.h
+++ b/src/game/Language.h
@@ -328,6 +328,8 @@ 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
@@ -642,11 +644,10 @@ enum TrinityStrings
LANG_BG_QUEUE_ANNOUNCE_SELF = 711,
LANG_BG_QUEUE_ANNOUNCE_WORLD = 712,
-
-
LANG_YOUR_ARENA_LEVEL_REQ_ERROR = 713,
-// LANG_HIS_ARENA_LEVEL_REQ_ERROR = 714, an opcode exists for this
+// = 714, not used
LANG_YOUR_BG_LEVEL_REQ_ERROR = 715,
+
// LANG_YOUR_ARENA_TEAM_FULL = 716, an opcode exists for this
LANG_BG_AV_ALLY = 717,
@@ -712,6 +713,31 @@ enum TrinityStrings
LANG_CANNOT_GO_TO_BG_GM = 1137, // "You must be in GM mode to teleport to a player in a battleground."
LANG_CANNOT_GO_TO_BG_FROM_BG = 1138, // "You cannot teleport to a battleground from another battleground. Please leave the current battleground first."
+// = 716, not used
+ LANG_BG_STARTED_ANNOUNCE_WORLD = 717,
+ LANG_ARENA_QUEUE_ANNOUNCE_WORLD_JOIN= 718,
+ LANG_ARENA_QUEUE_ANNOUNCE_WORLD_EXIT= 719,
+
+ /*LANG_BG_GROUP_TOO_LARGE = 720, // "Your group is too large for this battleground. Please regroup to join."
+ LANG_ARENA_GROUP_TOO_LARGE = 721, // "Your group is too large for this arena. Please regroup to join."
+ LANG_ARENA_YOUR_TEAM_ONLY = 722, // "Your group has members not in your arena team. Please regroup to join."
+ LANG_ARENA_NOT_ENOUGH_PLAYERS = 723, // "Your group does not have enough players to join this match."
+ LANG_ARENA_GOLD_WINS = 724, // "The Gold Team wins!"
+ LANG_ARENA_GREEN_WINS = 725, // "The Green Team wins!"
+ LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING = 726, // The battleground will end soon, because there aren't enough players. Get more ppl or win already!
+ LANG_BG_GROUP_OFFLINE_MEMBER = 727, // "Your group has an offline member. Please remove him before joining."
+ LANG_BG_GROUP_MIXED_FACTION = 728, // "Your group has players from the opposing faction. You can't join the battleground as a group."
+ LANG_BG_GROUP_MIXED_LEVELS = 729, // "Your group has players from different battleground brakets. You can't join as group."
+ LANG_BG_GROUP_MEMBER_ALREADY_IN_QUEUE = 730, // "Someone in your party is already in this battleground queue. (S)he must leave it before joining as group."
+ LANG_BG_GROUP_MEMBER_DESERTER = 731, // "Someone in your party is Deserter. You can't join as group."
+ LANG_BG_GROUP_MEMBER_NO_FREE_QUEUE_SLOTS = 732, // "Someone in your party is already in three battleground queues. You cannot join as group."
+
+ LANG_CANNOT_TELE_TO_BG = 733, // "You cannot teleport to a battleground or arena map."
+ LANG_CANNOT_SUMMON_TO_BG = 734, // "You cannot summon players to a battleground or arena map."
+ LANG_CANNOT_GO_TO_BG_GM = 735, // "You must be in GM mode to teleport to a player in a battleground."
+ LANG_CANNOT_GO_TO_BG_FROM_BG = 736, // "You cannot teleport to a battleground from another battleground. Please leave the current battleground first."*/
+ // Room for batleground/arena strings 737-799 not used
+
// in game strings
LANG_PET_INVALID_NAME = 800,
LANG_NOT_ENOUGH_GOLD = 801,
diff --git a/src/game/Level1.cpp b/src/game/Level1.cpp
index 000c7bc241e..e1373d8e8fb 100644
--- a/src/game/Level1.cpp
+++ b/src/game/Level1.cpp
@@ -123,8 +123,7 @@ bool ChatHandler::HandleNameAnnounceCommand(const char* args)
WorldPacket data;
if(!*args)
return false;
- //char str[1024];
- //sprintf(str, GetTrinityString(LANG_ANNOUNCE_COLOR), m_session->GetPlayer()->GetName(), args);
+
sWorld.SendWorldText(LANG_ANNOUNCE_COLOR, m_session->GetPlayer()->GetName(), args);
return true;
}
@@ -1761,9 +1760,9 @@ bool ChatHandler::HandleLookupAreaCommand(const char* args)
// send area in "id - [name]" format
std::ostringstream ss;
if (m_session)
- ss << areaEntry->ID << " - |cffffffff|Harea:" << areaEntry->ID << "|h[" << name << " " << localeNames[loc]<< "]|h|r";
- else
- ss << areaEntry->ID << " - " << name << " " << localeNames[loc];
+ ss << areaEntry->ID << " - |cffffffff|Harea:" << areaEntry->ID << "|h[" << name << " " << localeNames[loc]<< "]|h|r";
+ else
+ ss << areaEntry->ID << " - " << name << " " << localeNames[loc];
SendSysMessage (ss.str ().c_str());
@@ -1771,8 +1770,10 @@ bool ChatHandler::HandleLookupAreaCommand(const char* args)
}
}
}
+
if (counter == 0) // if counter == 0 then we found nth
SendSysMessage (LANG_COMMAND_NOAREAFOUND);
+
return true;
}
@@ -1801,7 +1802,7 @@ bool ChatHandler::HandleLookupTeleCommand(const char * args)
std::ostringstream reply;
- GameTeleMap const & teleMap = objmgr.GetGameTeleMap();
+ GameTeleMap const & teleMap = objmgr.GetGameTeleMap();
for(GameTeleMap::const_iterator itr = teleMap.begin(); itr != teleMap.end(); ++itr)
{
GameTele const* tele = &itr->second;
@@ -1810,9 +1811,9 @@ bool ChatHandler::HandleLookupTeleCommand(const char * args)
continue;
if (m_session)
- reply << " |cffffffff|Htele:" << itr->first << "|h[" << tele->name << "]|h|r\n";
- else
- reply << " " << itr->first << " " << tele->name << "\n";
+ reply << " |cffffffff|Htele:" << itr->first << "|h[" << tele->name << "]|h|r\n";
+ else
+ reply << " " << itr->first << " " << tele->name << "\n";
}
if(reply.str().empty())
@@ -1959,7 +1960,6 @@ bool ChatHandler::HandleSendMailCommand(const char* args)
return false;
}
- uint32 mailId = objmgr.GenerateMailID();
// from console show not existed sender
uint32 sender_guidlo = m_session ? m_session->GetPlayer()->GetGUIDLow() : 0;
@@ -2157,7 +2157,7 @@ bool ChatHandler::HandleGroupgoCommand(const char* args)
return false;
}
- Map* gmMap = MapManager::Instance().GetMap(m_session->GetPlayer()->GetMapId(),m_session->GetPlayer());
+ Map* gmMap = m_session->GetPlayer()->GetMap();
bool to_instance = gmMap->Instanceable();
// we are in instance, and can summon only player in our group with us as lead
@@ -2187,7 +2187,7 @@ bool ChatHandler::HandleGroupgoCommand(const char* args)
if (to_instance)
{
- Map* plMap = MapManager::Instance().GetMap(pl->GetMapId(),pl);
+ Map* plMap = pl->GetMap();
if ( plMap->Instanceable() && plMap->GetInstanceId() != gmMap->GetInstanceId() )
{
diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp
index 821ea1696d9..97a094585d1 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())
+ if(!unit || unit->isPet() || unit->isTotem() || unit->isVehicle())
{
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_ROTATION+2, rot2);
- obj->SetFloatValue(GAMEOBJECT_ROTATION+3, rot3);
+ obj->SetFloatValue(GAMEOBJECT_PARENTROTATION+2, rot2);
+ obj->SetFloatValue(GAMEOBJECT_PARENTROTATION+3, rot3);
map->Add(obj);
@@ -3232,6 +3232,59 @@ 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)
{
@@ -3859,6 +3912,36 @@ 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();
@@ -3915,6 +3998,72 @@ 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();
@@ -4074,7 +4223,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;
@@ -4113,4 +4262,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 123b1dceb09..ae0ea508308 100644
--- a/src/game/Level3.cpp
+++ b/src/game/Level3.cpp
@@ -299,6 +299,15 @@ 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`)" );
@@ -1748,6 +1757,10 @@ 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;
@@ -1756,8 +1769,6 @@ 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 )
@@ -3820,36 +3831,6 @@ 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, " ");
@@ -4465,7 +4446,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_UNK3 | UNIT_BYTE2_FLAG_UNK5 );
+ player->SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP );
player->SetByteValue(UNIT_FIELD_BYTES_2, 3, player->m_form);
player->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
@@ -4510,6 +4491,7 @@ bool ChatHandler::HandleResetLevelCommand(const char * args)
player->SetLevel(1);
player->InitStatsForLevel(true);
player->InitTaxiNodesForLevel();
+ player->InitGlyphsForLevel();
player->InitTalentForLevel();
player->SetUInt32Value(PLAYER_XP,0);
@@ -4553,6 +4535,7 @@ bool ChatHandler::HandleResetStatsCommand(const char * args)
player->InitStatsForLevel(true);
player->InitTaxiNodesForLevel();
+ player->InitGlyphsForLevel();
player->InitTalentForLevel();
return true;
@@ -6615,30 +6598,27 @@ 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
@@ -6650,14 +6630,19 @@ 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(new_displayId);
- player->SetNativeDisplayId(new_displayId);
+ 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);
- 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 a4a8a7a1f01..f1110ca3853 100644
--- a/src/game/LootHandler.cpp
+++ b/src/game/LootHandler.cpp
@@ -154,6 +154,7 @@ 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 );
@@ -326,7 +327,7 @@ void WorldSession::DoLootRelease( uint64 lguid )
int32 ReqValue = 175;
LockEntry const *lockInfo = sLockStore.LookupEntry(go->GetGOInfo()->chest.lockId);
if(lockInfo)
- ReqValue = lockInfo->requiredminingskill;
+ ReqValue = lockInfo->Skill[0];
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))
@@ -495,6 +496,7 @@ 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 4a34f51d672..61c626a544c 100644
--- a/src/game/LootMgr.cpp
+++ b/src/game/LootMgr.cpp
@@ -41,6 +41,7 @@ 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");
@@ -1138,6 +1139,21 @@ 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;
@@ -1230,6 +1246,7 @@ 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 1cb02c29bfc..f9fed651a1c 100644
--- a/src/game/LootMgr.h
+++ b/src/game/LootMgr.h
@@ -297,6 +297,7 @@ 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;
@@ -307,6 +308,7 @@ void LoadLootTemplates_Creature();
void LoadLootTemplates_Fishing();
void LoadLootTemplates_Gameobject();
void LoadLootTemplates_Item();
+void LoadLootTemplates_Milling();
void LoadLootTemplates_Pickpocketing();
void LoadLootTemplates_Skinning();
void LoadLootTemplates_Disenchant();
@@ -320,6 +322,7 @@ 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 00211094d4e..3d4126bd22a 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;
+ data << (uint8) item_count; // client limit is 0x10
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 < 6; ++j)
+ for(uint8 j = 0; j < 7; ++j)
{
// unsure
data << (uint32) (item ? item->GetEnchantmentCharges((EnchantmentSlot)j) : 0);
@@ -618,13 +618,15 @@ void WorldSession::HandleGetMail(WorldPacket & recv_data )
// unk
data << (uint32) (item ? item->GetItemSuffixFactor() : 0);
// stack count
- data << (uint8) (item ? item->GetCount() : 0);
+ data << (uint32) (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 81259aef1a7..c0eda2ff7ea 100644
--- a/src/game/Makefile.am
+++ b/src/game/Makefile.am
@@ -9,295 +9,276 @@
#
# 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
+# 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
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
## Process this file with automake to produce Makefile.in
## Sub-directories to parse
## CPP flags for includes, defines, etc.
-AM_CPPFLAGS =
+AM_CPPFLAGS = $(TRINI_INCLUDES) -I$(top_builddir)/src/shared -I$(srcdir) -I$(srcdir)/../../dep/include -I$(srcdir)/../framework -I$(srcdir)/../shared -I$(srcdir)/../shared/vmap -I$(srcdir)/../realmd -DSYSCONFDIR=\"$(sysconfdir)/\"
## Build MaNGOS game library as convenience library.
# All libraries will be convenience libraries. Might be changed to shared
# later.
-noinst_LIBRARIES = libgame.a
-
-libgame_a_CPPFLAGS = \
-$(MYSQL_INCLUDES) \
-$(POSTGRE_INCLUDES) \
-$(TRINI_INCLUDES) \
--I$(top_srcdir)/dep/include \
--I$(top_srcdir)/src/framework \
--I$(top_srcdir)/src/shared \
--I$(top_srcdir)/src/shared/vmap
+noinst_LIBRARIES = libmangosgame.a
# libmangossgame library will later be reused by ...
-libgame_a_SOURCES = \
-$(srcdir)/AccountMgr.cpp \
-$(srcdir)/AccountMgr.h \
-$(srcdir)/AddonHandler.cpp \
-$(srcdir)/AddonHandler.h \
-$(srcdir)/AggressorAI.cpp \
-$(srcdir)/AggressorAI.h \
-$(srcdir)/AnimalRandomMovementGenerator.h \
-$(srcdir)/ArenaTeam.cpp \
-$(srcdir)/ArenaTeam.h \
-$(srcdir)/ArenaTeamHandler.cpp \
-$(srcdir)/AuctionHouse.cpp \
-$(srcdir)/AuctionHouseObject.h \
-$(srcdir)/Bag.cpp \
-$(srcdir)/Bag.h \
-$(srcdir)/BattleGround.cpp \
-$(srcdir)/BattleGroundAA.cpp \
-$(srcdir)/BattleGroundAB.cpp \
-$(srcdir)/BattleGroundAV.cpp \
-$(srcdir)/BattleGroundBE.cpp \
-$(srcdir)/BattleGroundEY.cpp \
-$(srcdir)/BattleGroundNA.cpp \
-$(srcdir)/BattleGroundRL.cpp \
-$(srcdir)/BattleGroundWS.cpp \
-$(srcdir)/BattleGround.h \
-$(srcdir)/BattleGroundAA.h \
-$(srcdir)/BattleGroundAB.h \
-$(srcdir)/BattleGroundAV.h \
-$(srcdir)/BattleGroundBE.h \
-$(srcdir)/BattleGroundEY.h \
-$(srcdir)/BattleGroundNA.h \
-$(srcdir)/BattleGroundRL.h \
-$(srcdir)/BattleGroundWS.h \
-$(srcdir)/BattleGroundHandler.cpp \
-$(srcdir)/BattleGroundMgr.cpp \
-$(srcdir)/BattleGroundMgr.h \
-$(srcdir)/Cell.h \
-$(srcdir)/CellImpl.h \
-$(srcdir)/Channel.cpp \
-$(srcdir)/Channel.h \
-$(srcdir)/ChannelHandler.cpp \
-$(srcdir)/ChannelMgr.h \
-$(srcdir)/CharacterHandler.cpp \
-$(srcdir)/Chat.cpp \
-$(srcdir)/Chat.h \
-$(srcdir)/ChatHandler.cpp \
-$(srcdir)/CombatHandler.cpp \
-$(srcdir)/ConfusedMovementGenerator.cpp \
-$(srcdir)/ConfusedMovementGenerator.h \
-$(srcdir)/Corpse.cpp \
-$(srcdir)/Corpse.h \
-$(srcdir)/CreatureAI.cpp \
-$(srcdir)/CreatureAI.h \
-$(srcdir)/CreatureAIImpl.h \
-$(srcdir)/CreatureAIRegistry.cpp \
-$(srcdir)/CreatureAIRegistry.h \
-$(srcdir)/CreatureAISelector.cpp \
-$(srcdir)/CreatureAISelector.h \
-$(srcdir)/CreatureGroups.cpp \
-$(srcdir)/CreatureGroups.h \
-$(srcdir)/Creature.cpp \
-$(srcdir)/Creature.h \
-$(srcdir)/debugcmds.cpp \
-$(srcdir)/DestinationHolder.cpp \
-$(srcdir)/DestinationHolder.h \
-$(srcdir)/DestinationHolderImp.h \
-$(srcdir)/DuelHandler.cpp \
-$(srcdir)/DynamicObject.cpp \
-$(srcdir)/DynamicObject.h \
-$(srcdir)/FleeingMovementGenerator.cpp \
-$(srcdir)/FleeingMovementGenerator.h \
-$(srcdir)/Formulas.h \
-$(srcdir)/GameEvent.cpp \
-$(srcdir)/GameEvent.h \
-$(srcdir)/GameObject.cpp \
-$(srcdir)/GameObject.h \
-$(srcdir)/GlobalEvents.cpp \
-$(srcdir)/GlobalEvents.h \
-$(srcdir)/GMTicketHandler.cpp \
-$(srcdir)/GMTicketMgr.cpp \
-$(srcdir)/GMTicketMgr.h \
-$(srcdir)/GossipDef.cpp \
-$(srcdir)/GossipDef.h \
-$(srcdir)/GridDefines.h \
-$(srcdir)/GridNotifiers.cpp \
-$(srcdir)/GridNotifiers.h \
-$(srcdir)/GridNotifiersImpl.h \
-$(srcdir)/GridStates.cpp \
-$(srcdir)/GridStates.h \
-$(srcdir)/Group.cpp \
-$(srcdir)/Group.h \
-$(srcdir)/GroupHandler.cpp \
-$(srcdir)/GuardAI.cpp \
-$(srcdir)/GuardAI.h \
-$(srcdir)/Guild.cpp \
-$(srcdir)/Guild.h \
-$(srcdir)/GuildHandler.cpp \
-$(srcdir)/HomeMovementGenerator.cpp \
-$(srcdir)/HomeMovementGenerator.h \
-$(srcdir)/HostilRefManager.cpp \
-$(srcdir)/HostilRefManager.h \
-$(srcdir)/IdleMovementGenerator.cpp \
-$(srcdir)/IdleMovementGenerator.h \
-$(srcdir)/InstanceData.cpp \
-$(srcdir)/InstanceData.h \
-$(srcdir)/InstanceSaveMgr.cpp \
-$(srcdir)/InstanceSaveMgr.h \
-$(srcdir)/Item.cpp \
-$(srcdir)/Item.h \
-$(srcdir)/ItemEnchantmentMgr.cpp \
-$(srcdir)/ItemEnchantmentMgr.h \
-$(srcdir)/ItemHandler.cpp \
-$(srcdir)/ItemPrototype.h \
-$(srcdir)/Language.h \
-$(srcdir)/Level0.cpp \
-$(srcdir)/Level1.cpp \
-$(srcdir)/Level2.cpp \
-$(srcdir)/Level3.cpp \
-$(srcdir)/LFGHandler.cpp \
-$(srcdir)/LootHandler.cpp \
-$(srcdir)/LootMgr.cpp \
-$(srcdir)/LootMgr.h \
-$(srcdir)/Mail.cpp \
-$(srcdir)/Mail.h \
-$(srcdir)/Map.cpp \
-$(srcdir)/Map.h \
-$(srcdir)/MapInstanced.cpp \
-$(srcdir)/MapInstanced.h \
-$(srcdir)/MapManager.cpp \
-$(srcdir)/MapManager.h \
-$(srcdir)/MiscHandler.cpp \
-$(srcdir)/MotionMaster.cpp \
-$(srcdir)/MotionMaster.h \
-$(srcdir)/MovementGenerator.cpp \
-$(srcdir)/MovementGenerator.h \
-$(srcdir)/MovementGeneratorImpl.h \
-$(srcdir)/MovementHandler.cpp \
-$(srcdir)/NPCHandler.cpp \
-$(srcdir)/NPCHandler.h \
-$(srcdir)/NullCreatureAI.cpp \
-$(srcdir)/NullCreatureAI.h \
-$(srcdir)/ObjectAccessor.cpp \
-$(srcdir)/ObjectAccessor.h \
-$(srcdir)/Object.cpp \
-$(srcdir)/ObjectDefines.h \
-$(srcdir)/ObjectGridLoader.cpp \
-$(srcdir)/ObjectGridLoader.h \
-$(srcdir)/Object.h \
-$(srcdir)/ObjectMgr.cpp \
-$(srcdir)/ObjectMgr.h \
-$(srcdir)/Opcodes.cpp \
-$(srcdir)/Opcodes.h \
-$(srcdir)/OutdoorPvP.cpp \
-$(srcdir)/OutdoorPvP.h \
-$(srcdir)/OutdoorPvPEP.cpp \
-$(srcdir)/OutdoorPvPEP.h \
-$(srcdir)/OutdoorPvPHP.cpp \
-$(srcdir)/OutdoorPvPHP.h \
-$(srcdir)/OutdoorPvPMgr.cpp \
-$(srcdir)/OutdoorPvPMgr.h \
-$(srcdir)/OutdoorPvPNA.cpp \
-$(srcdir)/OutdoorPvPNA.h \
-$(srcdir)/OutdoorPvPObjectiveAI.cpp \
-$(srcdir)/OutdoorPvPObjectiveAI.h \
-$(srcdir)/OutdoorPvPSI.cpp \
-$(srcdir)/OutdoorPvPSI.h \
-$(srcdir)/OutdoorPvPTF.cpp \
-$(srcdir)/OutdoorPvPTF.h \
-$(srcdir)/OutdoorPvPZM.cpp \
-$(srcdir)/OutdoorPvPZM.h \
-$(srcdir)/Path.h \
-$(srcdir)/PetAI.cpp \
-$(srcdir)/PetAI.h \
-$(srcdir)/Pet.cpp \
-$(srcdir)/Pet.h \
-$(srcdir)/PetHandler.cpp \
-$(srcdir)/PetitionsHandler.cpp \
-$(srcdir)/Player.cpp \
-$(srcdir)/Player.h \
-$(srcdir)/PlayerDump.cpp \
-$(srcdir)/PlayerDump.h \
-$(srcdir)/PointMovementGenerator.cpp \
-$(srcdir)/PointMovementGenerator.h \
-$(srcdir)/PossessedAI.cpp \
-$(srcdir)/PossessedAI.h \
-$(srcdir)/QueryHandler.cpp \
-$(srcdir)/QuestDef.cpp \
-$(srcdir)/QuestDef.h \
-$(srcdir)/QuestHandler.cpp \
-$(srcdir)/RandomMovementGenerator.cpp \
-$(srcdir)/RandomMovementGenerator.h \
-$(srcdir)/ReactorAI.cpp \
-$(srcdir)/ReactorAI.h \
-$(srcdir)/ScriptCalls.cpp \
-$(srcdir)/ScriptCalls.h \
-$(srcdir)/SharedDefines.h \
-$(srcdir)/SkillHandler.cpp \
-$(srcdir)/SpellAuraDefines.h \
-$(srcdir)/SpellAuras.cpp \
-$(srcdir)/SpellAuras.h \
-$(srcdir)/Spell.cpp \
-$(srcdir)/SpellEffects.cpp \
-$(srcdir)/Spell.h \
-$(srcdir)/SkillDiscovery.cpp \
-$(srcdir)/SkillDiscovery.h \
-$(srcdir)/SkillExtraItems.cpp \
-$(srcdir)/SkillExtraItems.h \
-$(srcdir)/SpellHandler.cpp \
-$(srcdir)/SocialMgr.cpp \
-$(srcdir)/SocialMgr.h \
-$(srcdir)/SpellMgr.cpp \
-$(srcdir)/SpellMgr.h \
-$(srcdir)/StatSystem.cpp \
-$(srcdir)/TargetedMovementGenerator.cpp \
-$(srcdir)/TargetedMovementGenerator.h \
-$(srcdir)/TaxiHandler.cpp \
-$(srcdir)/TemporarySummon.cpp \
-$(srcdir)/TemporarySummon.h \
-$(srcdir)/tools.cpp \
-$(srcdir)/Tools.h \
-$(srcdir)/TotemAI.cpp \
-$(srcdir)/TotemAI.h \
-$(srcdir)/Totem.cpp \
-$(srcdir)/Totem.h \
-$(srcdir)/TradeHandler.cpp \
-$(srcdir)/Transports.cpp \
-$(srcdir)/Transports.h \
-$(srcdir)/ThreatManager.cpp \
-$(srcdir)/ThreatManager.h \
-$(srcdir)/Traveller.h \
-$(srcdir)/Unit.cpp \
-$(srcdir)/Unit.h \
-$(srcdir)/UnitEvents.h \
-$(srcdir)/UpdateData.cpp \
-$(srcdir)/UpdateData.h \
-$(srcdir)/UpdateFields.h \
-$(srcdir)/UpdateMask.h \
-$(srcdir)/VoiceChatHandler.cpp \
-$(srcdir)/WaypointManager.cpp \
-$(srcdir)/WaypointManager.h \
-$(srcdir)/WaypointMovementGenerator.cpp \
-$(srcdir)/WaypointMovementGenerator.h \
-$(srcdir)/Weather.cpp \
-$(srcdir)/Weather.h \
-$(srcdir)/World.cpp \
-$(srcdir)/World.h \
-$(srcdir)/WorldLog.cpp \
-$(srcdir)/WorldLog.h \
-$(srcdir)/WorldSession.cpp \
-$(srcdir)/WorldSession.h \
-$(srcdir)/WorldSocket.cpp \
-$(srcdir)/WorldSocket.h \
-$(srcdir)/WorldSocketMgr.cpp \
-$(srcdir)/WorldSocketMgr.h \
-$(srcdir)/FollowerReference.cpp \
-$(srcdir)/FollowerReference.h \
-$(srcdir)/FollowerRefManager.h \
-$(srcdir)/GroupReference.cpp \
-$(srcdir)/GroupReference.h \
-$(srcdir)/GroupRefManager.h
+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 \
+ 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
+
+## Link against shared library
+libmangosgame_a_LIBADD = ../shared/libmangosshared.a ../shared/Auth/libmangosauth.a ../shared/Config/libmangosconfig.a ../shared/Database/libmangosdatabase.a ../shared/vmap/libmangosvmaps.a
## Additional files to include when running 'make dist'
# Nothing yet.
diff --git a/src/game/Map.cpp b/src/game/Map.cpp
index c2fe5bfec74..c1673b1082d 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.00";
+const char MAP_MAGIC[] = "MAP_2.01";
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())
+ if(obj->isPet() || obj->isPossessedByPlayer() || obj->isVehicle())
{
(*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())
+ if(obj->isPet() || obj->isPossessedByPlayer() || obj->isVehicle())
{
(*grid)(cell.CellX(), cell.CellY()).RemoveWorldObject<Creature>(obj, obj->GetGUID());
}
diff --git a/src/game/Map.h b/src/game/Map.h
index c3ae4830cfb..074c859c408 100644
--- a/src/game/Map.h
+++ b/src/game/Map.h
@@ -224,6 +224,17 @@ 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 26279cb76ec..47be039d415 100644
--- a/src/game/MapManager.cpp
+++ b/src/game/MapManager.cpp
@@ -175,7 +175,8 @@ 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)
{
- player->SendTransferAborted(mapid, TRANSFER_ABORT_DIFFICULTY2); //Send aborted message
+ //Send aborted message
+ player->SendTransferAborted(mapid, TRANSFER_ABORT_DIFFICULTY, DIFFICULTY_HEROIC);
return false;
}
@@ -280,7 +281,8 @@ bool MapManager::ExistMapAndVMap(uint32 mapid, float x,float y)
bool MapManager::IsValidMAP(uint32 mapid)
{
MapEntry const* mEntry = sMapStore.LookupEntry(mapid);
- return mEntry && (!mEntry->Instanceable() || objmgr.GetInstanceTemplate(mapid));
+ return mEntry && (!mEntry->IsDungeon() || objmgr.GetInstanceTemplate(mapid));
+ // TODO: add check for battleground template
}
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 f5ee5dbcf4c..b6b224a2d6a 100644
--- a/src/game/MiscHandler.cpp
+++ b/src/game/MiscHandler.cpp
@@ -312,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_DISABLE_ROTATE);
+ GetPlayer()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
}
WorldPacket data( SMSG_LOGOUT_RESPONSE, 5 );
@@ -349,7 +349,7 @@ void WorldSession::HandleLogoutCancelOpcode( WorldPacket & /*recv_data*/ )
GetPlayer()->SetStandState(PLAYER_STATE_NONE);
//! DISABLE_ROTATE
- GetPlayer()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_ROTATE);
+ GetPlayer()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
}
sLog.outDebug( "WORLD: sent SMSG_LOGOUT_CANCEL_ACK Message" );
@@ -363,10 +363,12 @@ 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))
@@ -882,7 +884,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_DIFFICULTY2);
+ GetPlayer()->SendTransferAborted(at->target_mapId, TRANSFER_ABORT_DIFFICULTY, DIFFICULTY_HEROIC);
else if(missingQuest)
SendAreaTriggerMessage(at->requiredFailedText.c_str());
else if(missingLevel)
@@ -894,16 +896,96 @@ 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");
- //recv_data.hexlike();
+
+ 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);
}
-void WorldSession::HandleRequestAccountData(WorldPacket& /*recv_data*/)
+void WorldSession::HandleRequestAccountData(WorldPacket& recv_data)
{
sLog.outDetail("WORLD: Received CMSG_REQUEST_ACCOUNT_DATA");
- //recv_data.hexlike();
+
+ 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);
}
void WorldSession::HandleSetActionButtonOpcode(WorldPacket& recv_data)
@@ -1434,11 +1516,11 @@ void WorldSession::HandleChooseTitleOpcode( WorldPacket & recv_data )
GetPlayer()->SetUInt32Value(PLAYER_CHOSEN_TITLE, title);
}
-void WorldSession::HandleAllowMoveAckOpcode( WorldPacket & recv_data )
+void WorldSession::HandleTimeSyncResp( WorldPacket & recv_data )
{
CHECK_PACKET_SIZE(recv_data, 4+4);
- sLog.outDebug("CMSG_ALLOW_MOVE_ACK");
+ sLog.outDebug("CMSG_TIME_SYNC_RESP");
uint32 counter, time_;
recv_data >> counter >> time_;
@@ -1508,26 +1590,6 @@ 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");
@@ -1594,3 +1656,32 @@ 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(!recv_data.readPackGUID(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 0a310cddd96..29f673061b4 100644
--- a/src/game/MovementHandler.cpp
+++ b/src/game/MovementHandler.cpp
@@ -178,64 +178,12 @@ void WorldSession::HandleMoveWorldportAckOpcode()
void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
{
- CHECK_PACKET_SIZE(recv_data, 4+1+4+4+4+4+4);
+ uint32 opcode = recv_data.GetOpcode();
+ sLog.outDebug("WORLD: Recvd %s (%u, 0x%X) opcode", LookupOpcodeName(opcode), opcode, opcode);
/* extract packet */
MovementInfo 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
- }
+ ReadMovementInfo(recv_data, &movementInfo);
/*----------------*/
if(recv_data.size() != recv_data.rpos())
@@ -252,7 +200,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, MovementFlags);
+ HandlePossessedMovement(recv_data, movementInfo, movementInfo.flags);
return;
}
@@ -260,10 +208,10 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
return;
//Save movement flags
- GetPlayer()->SetUnitMovementFlags(MovementFlags);
+ GetPlayer()->SetUnitMovementFlags(movementInfo.flags);
/* handle special cases */
- if (MovementFlags & MOVEMENTFLAG_ONTRANSPORT)
+ if (movementInfo.flags & MOVEMENTFLAG_ONTRANSPORT)
{
// transports size limited
// (also received at zeppelin leave by some reason with t_* as absolute in continent coordinates, can be safely skipped)
@@ -282,9 +230,6 @@ 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;
@@ -301,13 +246,14 @@ 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 (recv_data.GetOpcode() == MSG_MOVE_FALL_LAND && !GetPlayer()->isInFlight())
+ if (opcode == MSG_MOVE_FALL_LAND && !GetPlayer()->isInFlight())
GetPlayer()->HandleFallDamage(movementInfo);
- if(((MovementFlags & MOVEMENTFLAG_SWIMMING) != 0) != GetPlayer()->IsInWater())
+ if(((movementInfo.flags & 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) );
@@ -316,14 +262,35 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data )
/*----------------------*/
/* process position-change */
- 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());
+ 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
data.append(recv_data.contents(), recv_data.size());
GetPlayer()->SendMessageToSet(&data, false);
- GetPlayer()->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o);
- GetPlayer()->m_movementInfo = movementInfo;
+ 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);
+ }
+ }
+
if (GetPlayer()->m_lastFallTime >= movementInfo.fallTime || GetPlayer()->m_lastFallZ <=movementInfo.z || recv_data.GetOpcode() == MSG_MOVE_FALL_LAND)
GetPlayer()->SetFallInformation(movementInfo.fallTime, movementInfo.z);
@@ -396,20 +363,13 @@ void WorldSession::HandlePossessedMovement(WorldPacket& recv_data, MovementInfo&
void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recv_data)
{
- CHECK_PACKET_SIZE(recv_data, 8+4+4+1+4+4+4+4+4);
+ 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);
/* extract packet */
uint64 guid;
- 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;
+ uint32 unk1;
float newspeed;
recv_data >> guid;
@@ -420,47 +380,10 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recv_data)
// continue parse packet
- 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);
+ recv_data >> unk1; // counter or moveEvent
- 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
- }
+ MovementInfo movementInfo;
+ ReadMovementInfo(recv_data, &movementInfo);
// recheck
CHECK_PACKET_SIZE(recv_data, recv_data.rpos()+4);
@@ -473,7 +396,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" };
+ static char const* move_type_name[MAX_MOVE_TYPE] = { "Walk", "Run", "RunBack", "Swim", "SwimBack", "TurnRate", "Flight", "FlightBack", "PitchRate" };
uint16 opcode = recv_data.GetOpcode();
switch(opcode)
@@ -486,6 +409,7 @@ 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;
@@ -520,20 +444,61 @@ 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;
- WorldPacket data(SMSG_TIME_SYNC_REQ, 4); // new 2.0.x, enable movement
- data << uint32(0x00000000); // on blizz it increments periodically
- SendPacket(&data);
+ 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;
+ }
}
-void WorldSession::HandleNotActiveMoverOpcode(WorldPacket& /*recv_data*/)
+void WorldSession::HandleMoveNotActiveMover(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 6bb916d9fe0..c6751512e02 100644
--- a/src/game/NPCHandler.cpp
+++ b/src/game/NPCHandler.cpp
@@ -524,13 +524,12 @@ void WorldSession::SendStablePet(uint64 guid )
data << uint32(pet->GetEntry());
data << uint32(pet->getLevel());
data << pet->GetName(); // petname
- data << uint32(pet->GetLoyaltyLevel()); // loyalty
- data << uint8(0x01); // client slot 1 == current pet (0)
+ data << uint8(0x01); // flags?, client slot 1 == current pet (0)
++num;
}
- // 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());
+ // 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());
if(result)
{
@@ -541,8 +540,7 @@ 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[6].GetString(); // name
- data << uint32(fields[5].GetUInt32()); // loyalty
+ data << fields[5].GetString(); // name
data << uint8(fields[1].GetUInt32()+1); // slot
++num;
@@ -592,7 +590,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 < 3 ORDER BY slot ",_player->GetGUIDLow());
+ 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());
if(result)
{
do
@@ -656,7 +654,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 < 3",_player->GetGUIDLow(),petnumber);
+ QueryResult *result = CharacterDatabase.PQuery("SELECT entry FROM character_pet WHERE owner = '%u' AND id = '%u' AND slot > 0 AND slot < 5",_player->GetGUIDLow(),petnumber);
if(result)
{
Field *fields = result->Fetch();
@@ -700,7 +698,7 @@ void WorldSession::HandleBuyStableSlot( WorldPacket & recv_data )
WorldPacket data(SMSG_STABLE_RESULT, 200);
- if(GetPlayer()->m_stableSlots < 2) // max slots amount = 2
+ if(GetPlayer()->m_stableSlots < 4) // max slots amount = 4
{
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 efd041f34c2..e4e5230bfb6 100644
--- a/src/game/Object.cpp
+++ b/src/game/Object.cpp
@@ -146,15 +146,9 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) c
/** lower flag1 **/
if(target == this) // building packet for oneself
- {
flags |= UPDATEFLAG_SELF;
- /*** temporary reverted - until real source of stack corruption will not found
- updatetype = UPDATETYPE_CREATE_OBJECT2;
- ****/
- }
-
- if(flags & UPDATEFLAG_HASPOSITION)
+ if(flags & UPDATEFLAG_HAS_POSITION)
{
// UPDATETYPE_CREATE_OBJECT2 dynamic objects, corpses...
if(isType(TYPEMASK_DYNAMICOBJECT) || isType(TYPEMASK_CORPSE) || isType(TYPEMASK_PLAYER))
@@ -180,6 +174,12 @@ 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,11 +251,18 @@ 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
@@ -292,12 +299,12 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2
}
*data << uint32(flags2); // movement flags
- *data << uint8(0); // unk 2.3.0
+ *data << uint16(unk_flags); // unknown 2.3.0
*data << uint32(getMSTime()); // time (in milliseconds)
}
// 0x40
- if (flags & UPDATEFLAG_HASPOSITION)
+ if (flags & UPDATEFLAG_HAS_POSITION)
{
// 0x02
if(flags & UPDATEFLAG_TRANSPORT && ((GameObject*)this)->GetGoType() == GAMEOBJECT_TYPE_MO_TRANSPORT)
@@ -330,12 +337,13 @@ 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))
+ if((flags2 & (MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_FLYING2)) || (unk_flags & 0x20))
{
if(GetTypeId() == TYPEID_PLAYER)
*data << (float)((Player*)this)->m_movementInfo.s_pitch;
@@ -384,6 +392,7 @@ 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)
@@ -485,7 +494,7 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2
break;
case TYPEID_PLAYER:
if(flags & UPDATEFLAG_SELF)
- *data << uint32(0x00000015); // unk, can be 0x15 or 0x22
+ *data << uint32(0x0000002F); // unk, can be 0x15 or 0x22
else
*data << uint32(0x00000008); // unk, can be 0x7 or 0x8
break;
@@ -508,6 +517,15 @@ 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;
@@ -515,9 +533,12 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2
}
// 0x4
- if(flags & UPDATEFLAG_FULLGUID)
+ if(flags & UPDATEFLAG_HAS_TARGET) // packed guid (current target guid)
{
- *data << uint8(0); // packed guid (probably target guid)
+ if(Unit *victim = ((Unit*)this)->getVictim())
+ data->append(victim->GetPackGUID());
+ else
+ *data << uint8(0);
}
// 0x2
@@ -525,6 +546,13 @@ 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
@@ -540,10 +568,8 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
if ( ((GameObject*)this)->ActivateToQuest(target) || target->isGameMaster())
{
IsActivateToQuest = true;
- updateMask->SetBit(GAMEOBJECT_DYN_FLAGS);
+ updateMask->SetBit(GAMEOBJECT_DYNAMIC);
}
- if (GetUInt32Value(GAMEOBJECT_ARTKIT))
- updateMask->SetBit(GAMEOBJECT_ARTKIT);
}
}
else //case UPDATETYPE_VALUES
@@ -554,8 +580,8 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
{
IsActivateToQuest = true;
}
- updateMask->SetBit(GAMEOBJECT_DYN_FLAGS);
- updateMask->SetBit(GAMEOBJECT_ANIMPROGRESS);
+ updateMask->SetBit(GAMEOBJECT_DYNAMIC);
+ updateMask->SetBit(GAMEOBJECT_BYTES_1);
}
}
@@ -572,7 +598,6 @@ 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
@@ -641,7 +666,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_DYN_FLAGS )
+ if ( index == GAMEOBJECT_DYNAMIC )
{
if(IsActivateToQuest )
{
@@ -1093,7 +1118,7 @@ uint32 WorldObject::GetAreaId() const
InstanceData* WorldObject::GetInstanceData()
{
- Map *map = MapManager::Instance().GetMap(m_mapId, this);
+ Map *map = GetMap();
return map->IsDungeon() ? ((InstanceMap*)map)->GetInstanceData() : NULL;
}
@@ -1303,7 +1328,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)
{
}
@@ -1448,7 +1473,7 @@ void WorldObject::BuildHeartBeatMsg(WorldPacket *data) const
data->Initialize(MSG_MOVE_HEARTBEAT, 32);
data->append(GetPackGUID());
*data << uint32(((Unit*)this)->GetUnitMovementFlags()); // movement flags
- *data << uint8(0); // 2.3.0
+ *data << uint16(0); // 2.3.0
*data << getMSTime(); // time
*data << m_positionX;
*data << m_positionY;
@@ -1467,7 +1492,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 << uint8(0); // 2.3.0
+ *data << uint16(0); // 2.3.0
*data << getMSTime(); // time
*data << x;
*data << y;
@@ -1620,4 +1645,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 7d51c4c0291..4e876d99418 100644
--- a/src/game/ObjectAccessor.cpp
+++ b/src/game/ObjectAccessor.cpp
@@ -134,6 +134,9 @@ 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);
}
@@ -351,6 +354,12 @@ ObjectAccessor::GetPet(uint64 guid)
return GetObjectInWorld(guid, (Pet*)NULL);
}
+Vehicle*
+ObjectAccessor::GetVehicle(uint64 guid)
+{
+ return GetObjectInWorld(guid, (Vehicle*)NULL);
+}
+
Corpse*
ObjectAccessor::GetCorpseForPlayerGUID(uint64 guid)
{
@@ -602,6 +611,7 @@ 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>;
@@ -609,6 +619,7 @@ 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 844a6b49e4d..2202748cd5a 100644
--- a/src/game/ObjectAccessor.h
+++ b/src/game/ObjectAccessor.h
@@ -33,6 +33,7 @@
#include "GridDefines.h"
#include "Object.h"
#include "Player.h"
+#include "Vehicle.h"
#include <set>
@@ -150,6 +151,7 @@ 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 88840ebd251..06072cb9917 100644
--- a/src/game/ObjectDefines.h
+++ b/src/game/ObjectDefines.h
@@ -41,6 +41,7 @@ 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)
@@ -50,6 +51,7 @@ 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) )
@@ -87,6 +89,7 @@ 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;
@@ -106,6 +109,7 @@ 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 0e2b6ae329d..e58ef1d7de5 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() && "ObjectGridRespawnMover don't must be called for pets");
+ assert((!c->isPet() || !c->isVehicle()) && "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 594cfaf0877..add9fa793af 100644
--- a/src/game/ObjectMgr.cpp
+++ b/src/game/ObjectMgr.cpp
@@ -116,6 +116,7 @@ ObjectMgr::ObjectMgr()
m_hiCharGuid = 1;
m_hiCreatureGuid = 1;
m_hiPetGuid = 1;
+ m_hiVehicleGuid = 1;
m_hiItemGuid = 1;
m_hiGoGuid = 1;
m_hiDoGuid = 1;
@@ -641,6 +642,22 @@ 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
@@ -1003,8 +1020,47 @@ 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)
@@ -1678,7 +1734,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_JUNK;
+ const_cast<ItemPrototype*>(proto)->Class = ITEM_CLASS_MISC;
}
if(proto->SubClass >= MaxItemSubclassValues[proto->Class])
@@ -1775,7 +1831,7 @@ void ObjectMgr::LoadItemPrototypes()
}
// special format
- if(proto->Spells[0].SpellId == SPELL_ID_GENERIC_LEARN)
+ if((proto->Spells[0].SpellId == SPELL_ID_GENERIC_LEARN) || (proto->Spells[0].SpellId == SPELL_ID_GENERIC_LEARN_PET))
{
// spell_1
if(proto->Spells[0].SpellTrigger != ITEM_SPELLTRIGGER_ON_USE)
@@ -1812,7 +1868,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)
+ else if((proto->Spells[1].SpellId==SPELL_ID_GENERIC_LEARN) || (proto->Spells[1].SpellId==SPELL_ID_GENERIC_LEARN_PET))
{
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;
@@ -1858,7 +1914,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)
+ else if((proto->Spells[j].SpellId==SPELL_ID_GENERIC_LEARN) || (proto->Spells[j].SpellId==SPELL_ID_GENERIC_LEARN_PET))
{
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;
@@ -1927,9 +1983,6 @@ 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()
@@ -2919,31 +2972,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
- "QuestFlags, SpecialFlags, CharTitleId, PrevQuestId, NextQuestId, ExclusiveGroup, NextQuestInChain, SrcItemId, SrcItemCount, SrcSpell,"
- // 27 28 29 30 31 32 33 34 35 36
+ // 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
"Title, Details, Objectives, OfferRewardText, RequestItemsText, EndText, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4,"
- // 37 38 39 40 41 42 43 44
+ // 39 40 41 42 43 44 45 46
"ReqItemId1, ReqItemId2, ReqItemId3, ReqItemId4, ReqItemCount1, ReqItemCount2, ReqItemCount3, ReqItemCount4,"
- // 45 46 47 48 49 50 51 52 53 54 54 55
+ // 47 48 49 50 51 52 53 54 55 56 57 58
"ReqSourceId1, ReqSourceId2, ReqSourceId3, ReqSourceId4, ReqSourceCount1, ReqSourceCount2, ReqSourceCount3, ReqSourceCount4, ReqSourceRef1, ReqSourceRef2, ReqSourceRef3, ReqSourceRef4,"
- // 57 58 59 60 61 62 63 64
+ // 59 60 61 62 63 64 65 66
"ReqCreatureOrGOId1, ReqCreatureOrGOId2, ReqCreatureOrGOId3, ReqCreatureOrGOId4, ReqCreatureOrGOCount1, ReqCreatureOrGOCount2, ReqCreatureOrGOCount3, ReqCreatureOrGOCount4,"
- // 65 66 67 68
+ // 67 68 69 70
"ReqSpellCast1, ReqSpellCast2, ReqSpellCast3, ReqSpellCast4,"
- // 69 70 71 72 73 74
+ // 71 72 73 74 75 76
"RewChoiceItemId1, RewChoiceItemId2, RewChoiceItemId3, RewChoiceItemId4, RewChoiceItemId5, RewChoiceItemId6,"
- // 75 76 77 78 79 80
+ // 77 78 79 80 81 82
"RewChoiceItemCount1, RewChoiceItemCount2, RewChoiceItemCount3, RewChoiceItemCount4, RewChoiceItemCount5, RewChoiceItemCount6,"
- // 81 82 83 84 85 86 87 88
+ // 83 84 85 86 87 88 89 90
"RewItemId1, RewItemId2, RewItemId3, RewItemId4, RewItemCount1, RewItemCount2, RewItemCount3, RewItemCount4,"
- // 89 90 91 92 93 94 95 96 97 98
+ // 91 92 93 94 95 96 97 98 99 100
"RewRepFaction1, RewRepFaction2, RewRepFaction3, RewRepFaction4, RewRepFaction5, RewRepValue1, RewRepValue2, RewRepValue3, RewRepValue4, RewRepValue5,"
- // 99 100 101 102 103 104 105 106 107 108 109
+ // 101 102 103 104 105 106 107 108 109 110 111
"RewHonorableKills, RewOrReqMoney, RewMoneyMaxLevel, RewSpell, RewSpellCast, RewMailTemplateId, RewMailDelaySecs, PointMapId, PointX, PointY, PointOpt,"
- // 110 111 112 113 114 115 116 117 118 119
+ // 112 113 114 115 116 117 118 119 120 121
"DetailsEmote1, DetailsEmote2, DetailsEmote3, DetailsEmote4,IncompleteEmote, CompleteEmote, OfferRewardEmote1, OfferRewardEmote2, OfferRewardEmote3, OfferRewardEmote4,"
- // 120 121
+ // 122 123
"StartScript, CompleteScript"
" FROM quest_template");
if(result == NULL)
@@ -4776,17 +4829,19 @@ uint16 ObjectMgr::GetTaxiMount( uint32 id, uint32 team )
TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(id);
if(node)
{
- if (team == ALLIANCE) mount_entry = node->alliance_mount_type;
- else mount_entry = node->horde_mount_type;
-
- CreatureInfo const *cinfo = GetCreatureTemplate(mount_entry);
- if (cinfo)
+ if (team == ALLIANCE)
{
- 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;
- }
+ mount_entry = node->MountCreatureID[1];
+ CreatureInfo const *ci = GetCreatureTemplate(mount_entry);
+ if(ci)
+ mount_id = ci->Modelid1;
+ }
+ if (team == HORDE)
+ {
+ mount_entry = node->MountCreatureID[0];
+ CreatureInfo const *ci = GetCreatureTemplate(mount_entry);
+ if(ci)
+ mount_id = ci->Modelid3;
}
}
@@ -5265,6 +5320,8 @@ 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 )
@@ -5418,6 +5475,14 @@ 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)
{
@@ -6380,6 +6445,23 @@ 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
@@ -6756,7 +6838,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==3580)
+ if((itr->second->GetSpellProto()->Attributes & 0x1000010) && itr->second->GetSpellProto()->SpellVisual[0]==3580)
return true;
return false;
}
@@ -6933,7 +7015,7 @@ SkillRangeType GetSkillRangeType(SkillLineEntry const *pSkill, bool racial)
return SKILL_RANGE_MONO;
case SKILL_CATEGORY_ARMOR:
case SKILL_CATEGORY_CLASS:
- if(pSkill->id != SKILL_POISONS && pSkill->id != SKILL_LOCKPICKING)
+ if(pSkill->id != SKILL_LOCKPICKING)
return SKILL_RANGE_MONO;
else
return SKILL_RANGE_LEVEL;
@@ -6948,7 +7030,7 @@ SkillRangeType GetSkillRangeType(SkillLineEntry const *pSkill, bool racial)
return SKILL_RANGE_MONO;
default:
case SKILL_CATEGORY_ATTRIBUTES: //not found in dbc
- case SKILL_CATEGORY_NOT_DISPLAYED: //only GENEREC(DND)
+ case SKILL_CATEGORY_GENERIC: //only GENERIC(DND)
return SKILL_RANGE_NONE;
}
}
diff --git a/src/game/ObjectMgr.h b/src/game/ObjectMgr.h
index 4a35f98b679..ccb3884b163 100644
--- a/src/game/ObjectMgr.h
+++ b/src/game/ObjectMgr.h
@@ -264,6 +264,8 @@ 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
@@ -588,6 +590,7 @@ class ObjectMgr
void LoadNpcTextId();
void LoadVendors();
void LoadTrainerSpell();
+ void LoadCompletedAchievements();
std::string GeneratePetName(uint32 entry);
uint32 GetBaseXP(uint32 level);
@@ -801,6 +804,10 @@ 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() : ""; }
@@ -819,6 +826,7 @@ class ObjectMgr
uint32 m_hiCharGuid;
uint32 m_hiCreatureGuid;
uint32 m_hiPetGuid;
+ uint32 m_hiVehicleGuid;
uint32 m_hiItemGuid;
uint32 m_hiGoGuid;
uint32 m_hiDoGuid;
@@ -929,6 +937,9 @@ 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 57c3c0ca879..0fa8e9573d0 100644
--- a/src/game/Opcodes.cpp
+++ b/src/game/Opcodes.cpp
@@ -28,1064 +28,1194 @@
/// 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_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 },
+ /*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_LOGGEDIN, &WorldSession::HandleGameobjectReportUse },
+ /*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 },
};
diff --git a/src/game/Opcodes.h b/src/game/Opcodes.h
index 202166a57a0..7bc3a7c0640 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_EMBLAZON_TABARD_OBSOLETE = 0x00D,
- CMSG_UNEMBLAZON_TABARD_OBSOLETE = 0x00E,
+ CMSG_MOVE_CHARACTER_CHEAT = 0x00D,
+ SMSG_MOVE_CHARACTER_CHEAT = 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_DEBUGINFOSPELLMISS_OBSOLETE = 0x01E,
+ SMSG_REFER_A_FRIEND_EXPIRED = 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,
- CMSG_PVP_PORT_OBSOLETE = 0x032,
+ SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 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_GAMEOBJ_CHAIR_USE_OBSOLETE = 0x0B2,
+ CMSG_DESTROY_ITEMS = 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 = 0x137,
+ SMSG_UPDATE_AURA_DURATION_OBSOLETE = 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_PLAYER_COMBAT_XP_GAIN_OBSOLETE = 0x14F,
+ SMSG_SPELLBREAKLOG = 0x14F,
SMSG_SPELLHEALLOG = 0x150,
SMSG_SPELLENERGIZELOG = 0x151,
- CMSG_SHEATHE_OBSOLETE = 0x152,
+ SMSG_BREAK_TARGET = 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 = 0x21E,
+ SMSG_SET_REST_START_OBSOLETE = 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_TOGGLE_HELM = 0x2B9,
- CMSG_TOGGLE_CLOAK = 0x2BA,
+ CMSG_SHOWING_HELM = 0x2B9,
+ CMSG_SHOWING_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 = 0x3A3,
- SMSG_SET_EXTRA_AURA_INFO = 0x3A4,
- SMSG_SET_EXTRA_AURA_INFO_NEED_UPDATE = 0x3A5,
- SMSG_CLEAR_EXTRA_AURA_INFO = 0x3A6,
+ 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,
MSG_MOVE_START_DESCEND = 0x3A7,
CMSG_IGNORE_REQUIREMENTS_CHEAT = 0x3A8,
SMSG_IGNORE_REQUIREMENTS_CHEAT = 0x3A9,
@@ -980,127 +980,255 @@ enum Opcodes
MSG_MOVE_UPDATE_CAN_FLY = 0x3AD,
MSG_RAID_READY_CHECK_CONFIRM = 0x3AE,
CMSG_VOICE_SESSION_ENABLE = 0x3AF,
- 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
+ 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
};
-// 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 d42ab2af746..dc2ea0820b1 100644
--- a/src/game/Pet.cpp
+++ b/src/game/Pet.cpp
@@ -41,27 +41,6 @@ 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;
@@ -71,17 +50,16 @@ 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);
@@ -126,26 +104,28 @@ void Pet::RemoveFromWorld()
Unit::RemoveFromWorld();
}
-bool Pet::LoadPetFromDB( Unit* owner, uint32 petentry, uint32 petnumber, bool current )
+bool Pet::LoadPetFromDB( Player* 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 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);
+ // 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);
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 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 );
+ // 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 );
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 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 );
+ // 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 );
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 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);
+ // 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);
if(!result)
return false;
@@ -160,7 +140,7 @@ bool Pet::LoadPetFromDB( Unit* owner, uint32 petentry, uint32 petnumber, bool cu
return false;
}
- uint32 summon_spell_id = fields[21].GetUInt32();
+ uint32 summon_spell_id = fields[19].GetUInt32();
SpellEntry const* spellInfo = sSpellStore.LookupEntry(summon_spell_id);
bool is_temporary_summoned = spellInfo && GetSpellDuration(spellInfo) > 0;
@@ -194,8 +174,8 @@ bool Pet::LoadPetFromDB( Unit* owner, uint32 petentry, uint32 petnumber, bool cu
return false;
}
- setPetType(PetType(fields[22].GetUInt8()));
- SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE,owner->getFaction());
+ setPetType(PetType(fields[20].GetUInt8()));
+ SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, owner->getFaction());
SetUInt32Value(UNIT_CREATED_BY_SPELL, summon_spell_id);
CreatureInfo const *cinfo = GetCreatureInfo();
@@ -206,72 +186,67 @@ 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);
- SetUInt64Value(UNIT_FIELD_SUMMONEDBY, owner->GetGUID());
+
+ SetOwnerGUID(owner->GetGUID());
SetDisplayId(fields[3].GetUInt32());
SetNativeDisplayId(fields[3].GetUInt32());
- uint32 petlevel=fields[4].GetUInt32();
- SetUInt32Value(UNIT_NPC_FLAGS , 0);
- SetName(fields[11].GetString());
+ uint32 petlevel = fields[4].GetUInt32();
+ SetUInt32Value(UNIT_NPC_FLAGS, 0);
+ SetName(fields[9].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[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);
+ 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);
SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
// this enables popup window (pet abandon, cancel)
- SetTP(fields[9].GetInt32());
- SetMaxPower(POWER_HAPPINESS,GetCreatePowers(POWER_HAPPINESS));
- SetPower( POWER_HAPPINESS,fields[15].GetUInt32());
+ SetMaxPower(POWER_HAPPINESS, GetCreatePowers(POWER_HAPPINESS));
+ SetPower(POWER_HAPPINESS, fields[13].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());
- SetUInt64Value(UNIT_FIELD_CREATEDBY, owner->GetGUID());
+ SetCreatorGUID(owner->GetGUID());
- m_charmInfo->SetReactState( ReactStates( fields[6].GetUInt8() ));
- m_loyaltyPoints = fields[7].GetInt32();
+ m_charmInfo->SetReactState(ReactStates(fields[6].GetUInt8()));
- uint32 savedhealth = fields[13].GetUInt32();
- uint32 savedmana = fields[14].GetUInt32();
+ uint32 savedhealth = fields[11].GetUInt32();
+ uint32 savedmana = fields[12].GetUInt32();
// set current pet as current
- if(fields[10].GetUInt32() != 0)
+ if(fields[8].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[16].GetString(), " ");
+ Tokens tokens = StrSplit(fields[14].GetString(), " ");
if(tokens.size() != 20)
{
@@ -290,11 +265,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_CAST;
+ if (spellInfo && spellInfo->AttributesEx & SPELL_ATTR_EX_UNAUTOCASTABLE_BY_PET) m_charmInfo->GetActionBarEntry(index)->Type = ACT_ENABLED;
}
//init teach spells
- tokens = StrSplit(fields[17].GetString(), " ");
+ tokens = StrSplit(fields[15].GetString(), " ");
for (iter = tokens.begin(), index = 0; index < 4; ++iter, ++index)
{
uint32 tmp = atol((*iter).c_str());
@@ -309,7 +284,10 @@ bool Pet::LoadPetFromDB( Unit* owner, uint32 petentry, uint32 petnumber, bool cu
}
// since last save (in seconds)
- uint32 timediff = (time(NULL) - fields[18].GetUInt32());
+ uint32 timediff = (time(NULL) - fields[16].GetUInt32());
+
+ m_resetTalentsCost = fields[17].GetUInt32();
+ m_resetTalentsTime = fields[18].GetUInt64();
delete result;
@@ -375,6 +353,7 @@ bool Pet::LoadPetFromDB( Unit* owner, uint32 petentry, uint32 petnumber, bool cu
}
}
+ m_loading = false;
return true;
}
@@ -417,10 +396,6 @@ 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);
@@ -437,7 +412,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, loyaltypoints, loyalty, trainpoint, 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, talentpoints, slot, name, renamed, curhealth, curmana, curhappiness, abdata, TeachSpelldata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType) "
<< "VALUES ("
<< m_charmInfo->GetPetNumber() << ", "
<< GetEntry() << ", "
@@ -446,9 +421,7 @@ void Pet::SavePetToDB(PetSaveMode mode)
<< getLevel() << ", "
<< GetUInt32Value(UNIT_FIELD_PETEXPERIENCE) << ", "
<< uint32(m_charmInfo->GetReactState()) << ", "
- << m_loyaltyPoints << ", "
- << GetLoyaltyLevel() << ", "
- << m_TrainingPoints << ", "
+ << uint32(GetFreeTalentPoints()) << ", "
<< uint32(mode) << ", '"
<< name.c_str() << "', "
<< uint32((GetByteValue(UNIT_FIELD_BYTES_2, 2) == UNIT_RENAME_ALLOWED)?0:1) << ", "
@@ -521,12 +494,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_DISABLE_ROTATE);
+ SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
}
}
else if(getDeathState()==ALIVE)
{
- RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_ROTATE);
+ RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
CastPetAuras(true);
}
}
@@ -553,6 +526,7 @@ 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;
@@ -598,14 +572,6 @@ void Pet::Update(uint32 diff)
else
m_happinessTimer -= diff;
- if(m_loyaltyTimer <= diff)
- {
- TickLoyaltyChange();
- m_loyaltyTimer = 12000;
- }
- else
- m_loyaltyTimer -= diff;
-
break;
}
default:
@@ -637,83 +603,12 @@ void Pet::LooseHappiness()
uint32 curValue = GetPower(POWER_HAPPINESS);
if (curValue <= 0)
return;
- int32 addvalue = (140 >> GetLoyaltyLevel()) * 125; //value is 70/35/17/8/4 (per min) * 1000 / 8 (timer 7.5 secs)
+ int32 addvalue = 670; //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)
@@ -724,11 +619,6 @@ 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;
@@ -765,82 +655,6 @@ 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();
@@ -903,9 +717,6 @@ void Pet::GivePetXP(uint32 xp)
}
SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, newXP);
-
- if(getPetType() == HUNTER_PET)
- KillLoyaltyBonus(level);
}
void Pet::GivePetLevel(uint32 level)
@@ -913,9 +724,7 @@ void Pet::GivePetLevel(uint32 level)
if(!level)
return;
- InitStatsForLevel( level);
-
- SetTP(m_TrainingPoints + (GetLoyaltyLevel() - 1));
+ InitStatsForLevel(level);
}
bool Pet::CreateBaseAtCreature(Creature* creature)
@@ -964,7 +773,6 @@ bool Pet::CreateBaseAtCreature(Creature* creature)
SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, 0);
SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, 0);
SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, uint32((Trinity::XP::xp_to_level(creature->getLevel()))/4));
- SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
SetUInt32Value(UNIT_NPC_FLAGS, 0);
CreatureFamilyEntry const* cFamily = sCreatureFamilyStore.LookupEntry(creature->GetCreatureInfo()->family);
@@ -973,16 +781,12 @@ 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) );
- SetLoyaltyLevel(REBELLIOUS);
+ SetUInt32Value(UNIT_MOD_CAST_SPEED, creature->GetUInt32Value(UNIT_MOD_CAST_SPEED));
}
return true;
}
@@ -1112,7 +916,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)) );
@@ -1344,10 +1148,6 @@ 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)
@@ -1488,7 +1288,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_CAST;
+ active = ACT_ENABLED;
PetSpellMap::iterator itr = m_spells.find(spell_id);
if (itr != m_spells.end())
@@ -1540,11 +1340,12 @@ bool Pet::addSpell(uint16 spell_id, uint16 active, PetSpellState state, uint16 s
ToggleAutocast(itr->first, false);
oldspell_id = itr->first;
- removeSpell(itr->first);
+ unlearnSpell(itr->first);
+ break;
}
}
- uint16 tmpslot=slot_id;
+ uint16 tmpslot = slot_id;
if (tmpslot == 0xffff)
{
@@ -1578,20 +1379,65 @@ 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::removeSpell(uint16 spell_id)
+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)
{
PetSpellMap::iterator itr = m_spells.find(spell_id);
if (itr == m_spells.end())
- return;
+ return false;
if(itr->second->state == PETSPELL_REMOVED)
- return;
+ return false;
if(itr->second->state == PETSPELL_NEW)
{
@@ -1602,6 +1448,8 @@ void Pet::removeSpell(uint16 spell_id)
itr->second->state = PETSPELL_REMOVED;
RemoveAurasDueToSpell(spell_id);
+
+ return true;
}
bool Pet::_removeSpell(uint16 spell_id)
@@ -1621,7 +1469,7 @@ void Pet::InitPetCreateSpells()
m_charmInfo->InitPetActionBar();
m_spells.clear();
- int32 usedtrainpoints = 0, petspellid;
+ int32 petspellid;
PetCreateSpellEntry const* CreateSpells = objmgr.GetPetCreateSpellEntry(GetEntry());
if(CreateSpells)
{
@@ -1650,23 +1498,12 @@ 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)
@@ -1725,7 +1562,9 @@ void Pet::ToggleAutocast(uint32 spellid, bool apply)
if(apply)
{
- for (i = 0; i < m_autospells.size() && m_autospells[i] != spellid; i++);
+ for (i = 0; i < m_autospells.size() && m_autospells[i] != spellid; i++)
+ ; // just search
+
if (i == m_autospells.size())
{
m_autospells.push_back(spellid);
@@ -1736,7 +1575,9 @@ 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++);
+ for (i = 0; i < m_autospells.size() && m_autospells[i] != spellid; i++, itr2++)
+ ; // just search
+
if (i < m_autospells.size())
{
m_autospells.erase(itr2);
@@ -1759,8 +1600,7 @@ 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, 1, UNIT_BYTE2_FLAG_UNK3 | UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5 );
+ SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE);
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 9d187b24b45..178ebfb131e 100644
--- a/src/game/Pet.h
+++ b/src/game/Pet.h
@@ -52,16 +52,6 @@ enum HappinessState
HAPPY = 3
};
-enum LoyaltyLevel
-{
- REBELLIOUS = 1,
- UNRULY = 2,
- SUBMISSIVE = 3,
- DEPENDABLE = 4,
- FAITHFUL = 5,
- BEST_FRIEND = 6
-};
-
enum PetSpellState
{
PETSPELL_UNCHANGED = 0,
@@ -122,9 +112,6 @@ 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
@@ -148,7 +135,7 @@ class Pet : public Creature
bool Create (uint32 guidlow, Map *map, uint32 Entry, uint32 pet_number);
bool CreateBaseAtCreature(Creature* creature);
- bool LoadPetFromDB( Unit* owner,uint32 petentry = 0,uint32 petnumber = 0, bool current = false );
+ bool LoadPetFromDB( Player* owner,uint32 petentry = 0,uint32 petnumber = 0, bool current = false );
void SavePetToDB(PetSaveMode mode);
void Remove(PetSaveMode mode, bool returnreagent = false);
static void DeleteFromDB(uint32 guidlow);
@@ -167,14 +154,7 @@ 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);
@@ -194,10 +174,8 @@ class Pet : public Creature
void UpdateAttackPowerAndDamage(bool ranged = false);
void UpdateDamagePhysical(WeaponAttackType attType);
- bool CanTakeMoreActiveSpells(uint32 SpellIconID);
- void ToggleAutocast(uint32 spellid, bool apply);
- bool HasTPForSpell(uint32 spellid);
- int32 GetTPForSpell(uint32 spellid);
+ bool CanTakeMoreActiveSpells(uint32 SpellIconID);
+ void ToggleAutocast(uint32 spellid, bool apply);
bool HasSpell(uint32 spell) const;
void AddTeachSpell(uint32 learned_id, uint32 source_id) { m_teachspells[learned_id] = source_id; }
@@ -215,7 +193,9 @@ 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 removeSpell(uint16 spell_id);
+ void learnLevelupSpells();
+ bool unlearnSpell(uint16 spell_id);
+ bool removeSpell(uint16 spell_id);
bool _removeSpell(uint16 spell_id);
PetSpellMap m_spells;
@@ -225,11 +205,10 @@ 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;
@@ -242,14 +221,12 @@ 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 e4269ddafd6..f059662987c 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_CAST: //0x0100
- case ACT_ENABLED: //0xc100 spell
+ case ACT_DISABLED: // 0x8100 spell (disabled), ignore
+ case ACT_PASSIVE: // 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 << uint32(spellid) << uint8(2) << uint8(result);
+ data << uint8(0) << uint32(spellid) << 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_CAST) && spell_id && !pet->HasSpell(spell_id)))
+ if(!((act_state == ACT_ENABLED || act_state == ACT_DISABLED || act_state == ACT_PASSIVE) && spell_id && !pet->HasSpell(spell_id)))
{
//sign for autocast
if(act_state == ACT_ENABLED && spell_id)
@@ -542,11 +542,10 @@ 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->removeSpell(spell_id);
+ pet->unlearnSpell(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)
@@ -616,11 +615,15 @@ void WorldSession::HandlePetCastSpellOpcode( WorldPacket& recvPacket )
{
sLog.outDetail("WORLD: CMSG_PET_CAST_SPELL");
- CHECK_PACKET_SIZE(recvPacket,8+4);
+ CHECK_PACKET_SIZE(recvPacket,8+1+4+1);
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;
- recvPacket >> guid >> spellid;
+ sLog.outDebug("WORLD: CMSG_PET_CAST_SPELL, cast_count: %u, spellid %u, unk_flags %u", cast_count, spellid, unk_flags);
// This opcode is also sent from charmed and possessed units (players and creatures)
if(!_player->GetPet() && !_player->GetCharm())
@@ -655,6 +658,7 @@ 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);
@@ -713,3 +717,132 @@ 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 8fc18b1c259..ad3893ce110 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, charter->GetGUIDLow());
- // ITEM_FIELD_ENCHANTMENT is guild/arenateam id
- // ITEM_FIELD_ENCHANTMENT+1 is current signatures count (showed on item)
+ 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->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, signs);
+ // item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1+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 4b187023be4..8fbc26ed9eb 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -64,6 +64,7 @@
#include "Spell.h"
#include "SocialMgr.h"
#include "GameEvent.h"
+#include "AchievementMgr.h"
#include <cmath>
@@ -132,7 +133,7 @@ PlayerTaxi::PlayerTaxi()
memset(m_taximask, 0, sizeof(m_taximask));
}
-void PlayerTaxi::InitTaxiNodesForLevel(uint32 race, uint32 level)
+void PlayerTaxi::InitTaxiNodesForLevel(uint32 race, uint32 chrClass, uint32 level)
{
// capital and taxi hub masks
switch(race)
@@ -149,6 +150,13 @@ void PlayerTaxi::InitTaxiNodesForLevel(uint32 race, uint32 level)
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))
{
@@ -251,7 +259,7 @@ const int32 Player::ReputationRank_Length[MAX_REPUTATION_RANK] = {36000, 3000, 3
UpdateMask Player::updateVisualBits;
-Player::Player (WorldSession *session): Unit()
+Player::Player (WorldSession *session): Unit(), m_achievementMgr(this)
{
m_transport = 0;
@@ -364,6 +372,7 @@ Player::Player (WorldSession *session): Unit()
m_canParry = false;
m_canBlock = false;
m_canDualWield = false;
+ m_canTitanGrip = false;
m_ammoDPS = 0.0f;
m_temporaryUnsummonedPetNumber = 0;
@@ -408,6 +417,9 @@ Player::Player (WorldSession *session): Unit()
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);
@@ -421,6 +433,8 @@ Player::Player (WorldSession *session): Unit()
//Default movement to run mode
m_unit_movement_flags = 0;
+ m_mover = NULL;
+
m_miniPet = 0;
m_bgAfkReportedTimer = 0;
m_contestedPvPTimer = 0;
@@ -430,6 +444,8 @@ Player::Player (WorldSession *session): Unit()
m_isActive = true;
m_farsightVision = false;
+
+ m_runes = NULL;
}
Player::~Player ()
@@ -477,6 +493,7 @@ Player::~Player ()
RemovePossess(false);
delete m_declinedname;
+ delete m_runes;
}
void Player::CleanupsBeforeDelete()
@@ -522,9 +539,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:
@@ -533,13 +550,16 @@ 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, DEFAULT_COMBAT_REACH );
+ SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, DEFAULT_WORLD_OBJECT_SIZE);
+ SetFloatValue(UNIT_FIELD_COMBATREACH, 1.5f);
switch(gender)
{
@@ -562,12 +582,14 @@ 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);
- SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_UNK3 | UNIT_BYTE2_FLAG_UNK5 );
- SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE );
+ //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);
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)));
@@ -579,17 +601,35 @@ 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)
- SetUInt32Value (UNIT_FIELD_LEVEL, sWorld.getConfig(CONFIG_START_GM_LEVEL));
- else
- SetUInt32Value (UNIT_FIELD_LEVEL, sWorld.getConfig(CONFIG_START_PLAYER_LEVEL));
+ {
+ 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 (PLAYER_FIELD_COINAGE, sWorld.getConfig(CONFIG_START_PLAYER_MONEY));
SetUInt32Value (PLAYER_FIELD_HONOR_CURRENCY, sWorld.getConfig(CONFIG_START_HONOR_POINTS));
@@ -653,6 +693,7 @@ 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
@@ -665,6 +706,14 @@ 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);
@@ -708,6 +757,11 @@ 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)
{
@@ -935,53 +989,29 @@ 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 is valid area and is not gamemaster then deal damage
- if ( ValidArea && !isGameMaster() )
+ // if not gamemaster then deal damage
+ if ( !isGameMaster() )
EnvironmentalDamage(guid, DAMAGE_LAVA, damage);
m_breathTimer = 1000;
}
-
}
- //Death timer disabled and WaterFlags reset
- else if (m_deathState == DEAD)
+ else if (m_deathState == DEAD) // Disable breath timer and reset underwater flags
{
m_breathTimer = 0;
m_isunderwater = 0;
@@ -1316,6 +1346,7 @@ 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;
@@ -1365,6 +1396,7 @@ void Player::setDeathState(DeathState s)
// passive spell
if(!ressSpellId)
ressSpellId = GetResurrectionSpellId();
+ GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP, 1);
}
Unit::setDeathState(s);
@@ -1385,13 +1417,15 @@ void Player::setDeathState(DeathState s)
void Player::BuildEnumData( QueryResult * result, WorldPacket * p_data )
{
- *p_data << GetGUID();
+ Field *fields = result->Fetch();
+
+ *p_data << uint64(GetGUID());
*p_data << m_name;
- *p_data << getRace();
+ *p_data << uint8(getRace());
uint8 pClass = getClass();
- *p_data << pClass;
- *p_data << getGender();
+ *p_data << uint8(pClass);
+ *p_data << uint8(getGender());
uint32 bytes = GetUInt32Value(PLAYER_BYTES);
*p_data << uint8(bytes);
@@ -1406,14 +1440,15 @@ 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 << zoneId;
- *p_data << GetMapId();
+ *p_data << uint32(zoneId);
+ *p_data << uint32(GetMapId());
*p_data << GetPositionX();
*p_data << GetPositionY();
*p_data << GetPositionZ();
- *p_data << (result ? result->Fetch()[13].GetUInt32() : 0);
+ // guild id
+ *p_data << (result ? fields[13].GetUInt32() : 0);
uint32 char_flags = 0;
if(HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_HELM))
@@ -1424,14 +1459,13 @@ void Player::BuildEnumData( QueryResult * result, WorldPacket * p_data )
char_flags |= CHARACTER_FLAG_GHOST;
if(HasAtLoginFlag(AT_LOGIN_RENAME))
char_flags |= CHARACTER_FLAG_RENAME;
- // 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() != ""))
+ if(sWorld.getConfig(CONFIG_DECLINED_NAMES_USED) && (fields[14].GetCppString() != ""))
char_flags |= CHARACTER_FLAG_DECLINED;
- *p_data << (uint32)char_flags; // character flags
-
- *p_data << (uint8)1; // unknown
+ *p_data << uint32(char_flags); // character flags
+ // character customize (flags?)
+ *p_data << uint32(HasAtLoginFlag(AT_LOGIN_CUSTOMIZE) ? 1 : 0);
+ *p_data << uint8(1); // unknown
// Pets info
{
@@ -1442,8 +1476,6 @@ 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)
@@ -1454,36 +1486,11 @@ 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);
@@ -1500,20 +1507,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()
@@ -1585,7 +1592,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_LVL1);
+ SendTransferAborted(mapid, TRANSFER_ABORT_INSUF_EXPAN_LVL, mEntry->Expansion());
return false; // normal client can't teleport to this map...
}
@@ -1894,13 +1901,20 @@ 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;
}
@@ -1920,11 +1934,11 @@ void Player::Regenerate(Powers power)
if (recentCast)
{
// Trinity Updates Mana in intervals of 2s, which is correct
- addvalue = GetFloatValue(PLAYER_FIELD_MOD_MANA_REGEN_INTERRUPT) * ManaIncreaseRate * 2.00f;
+ addvalue = GetFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER) * ManaIncreaseRate * 2.00f;
}
else
{
- addvalue = GetFloatValue(PLAYER_FIELD_MOD_MANA_REGEN) * ManaIncreaseRate * 2.00f;
+ addvalue = GetFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER) * ManaIncreaseRate * 2.00f;
}
} break;
case POWER_RAGE: // Regenerate rage
@@ -1935,6 +1949,17 @@ 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;
@@ -1950,7 +1975,7 @@ void Player::Regenerate(Powers power)
addvalue *= ((*i)->GetModifierValue() + 100) / 100.0f;
}
- if (power != POWER_RAGE)
+ if (power != POWER_RAGE && power != POWER_RUNIC_POWER)
{
curValue += uint32(addvalue);
if (curValue > maxValue)
@@ -2234,6 +2259,8 @@ 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)));
@@ -2257,6 +2284,7 @@ void Player::GiveLevel(uint32 level)
InitTalentForLevel();
InitTaxiNodesForLevel();
+ InitGlyphsForLevel();
UpdateAllStats();
@@ -2276,6 +2304,7 @@ 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()
@@ -2412,6 +2441,9 @@ 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);
@@ -2428,7 +2460,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_DISABLE_ROTATE | UNIT_FLAG_IN_COMBAT | UNIT_FLAG_DISARMED |
+ UNIT_FLAG_STUNNED | 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
@@ -2452,6 +2484,7 @@ 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()
@@ -2866,8 +2899,6 @@ 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 )
{
@@ -2904,6 +2935,12 @@ 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;
}
@@ -3053,8 +3090,6 @@ 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 )
{
@@ -3354,50 +3389,46 @@ 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);
- 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_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_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_FIELD_BYTES_0);
+ 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_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);
+ updateVisualBits.SetBit(UNIT_FIELD_BASEATTACKTIME + 0);
updateVisualBits.SetBit(UNIT_FIELD_BASEATTACKTIME + 1);
updateVisualBits.SetBit(UNIT_FIELD_BOUNDINGRADIUS);
updateVisualBits.SetBit(UNIT_FIELD_COMBATREACH);
@@ -3410,10 +3441,12 @@ 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);
- updateVisualBits.SetBit(PLAYER_DUEL_ARBITER+1);
+ updateVisualBits.SetBit(PLAYER_DUEL_ARBITER + 0);
+ updateVisualBits.SetBit(PLAYER_DUEL_ARBITER + 1);
updateVisualBits.SetBit(PLAYER_FLAGS);
updateVisualBits.SetBit(PLAYER_GUILDID);
updateVisualBits.SetBit(PLAYER_GUILDRANK);
@@ -3424,29 +3457,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
- //431) = 884 (0x374) = main weapon
- for(uint16 i = 0; i < EQUIPMENT_SLOT_END; i++)
+ // Players visible items are not inventory stuff
+ for(uint16 i = 0; i < EQUIPMENT_SLOT_END; ++i)
{
- // item creator
- 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);
+ uint32 offset = i * MAX_VISIBLE_ITEM_OFFSET;
- uint16 visual_base = PLAYER_VISIBLE_ITEM_1_0 + (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);
// item entry
- updateVisualBits.SetBit(visual_base + 0);
+ updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_0 + 0 + offset);
- // item enchantment IDs
- for(uint8 j = 0; j < MAX_INSPECTED_ENCHANTMENT_SLOT; ++j)
- updateVisualBits.SetBit(visual_base + 1 + j);
+ // item enchantments
+ for(uint8 j = 0; j < MAX_ENCHANTMENT_SLOT; ++j)
+ updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_0 + 1 + j + offset);
// random properties
- 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_VISIBLE_ITEM_1_PROPERTIES + offset);
+ updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_SEED + offset);
+ updateVisualBits.SetBit(PLAYER_VISIBLE_ITEM_1_PAD + offset);
}
updateVisualBits.SetBit(PLAYER_CHOSEN_TITLE);
@@ -3464,7 +3497,6 @@ 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)
@@ -3472,7 +3504,7 @@ void Player::BuildCreateUpdateBlockForPlayer( UpdateData *data, Player *target )
m_items[i]->BuildCreateUpdateBlockForPlayer( data, target );
}
- for(int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
+ for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
{
if(m_items[i] == NULL)
continue;
@@ -3505,7 +3537,7 @@ void Player::DestroyForPlayer( Player *target ) const
m_items[i]->DestroyForPlayer( target );
}
- for(int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
+ for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
{
if(m_items[i] == NULL)
continue;
@@ -3593,27 +3625,7 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC
}
// remove from arena teams
- uint32 at_id = GetArenaTeamIdFromDB(playerguid,ARENA_TEAM_2v2);
- if(at_id != 0)
- {
- ArenaTeam * at = objmgr.GetArenaTeamById(at_id);
- if(at)
- at->DelMember(playerguid);
- }
- at_id = GetArenaTeamIdFromDB(playerguid,ARENA_TEAM_3v3);
- if(at_id != 0)
- {
- ArenaTeam * at = objmgr.GetArenaTeamById(at_id);
- if(at)
- at->DelMember(playerguid);
- }
- at_id = GetArenaTeamIdFromDB(playerguid,ARENA_TEAM_5v5);
- if(at_id != 0)
- {
- ArenaTeam * at = objmgr.GetArenaTeamById(at_id);
- if(at)
- at->DelMember(playerguid);
- }
+ LeaveAllArenaTeams(playerguid);
// the player was uninvited already on logout so just remove from group
QueryResult *resultGroup = CharacterDatabase.PQuery("SELECT leaderGuid FROM group_member WHERE memberGuid='%u'", guid);
@@ -3735,6 +3747,8 @@ 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);
@@ -3765,6 +3779,10 @@ 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?)
@@ -3885,7 +3903,7 @@ void Player::ResurrectPlayer(float restore_percent, bool applySickness)
if(Aura* Aur = GetAura(SPELL_ID_PASSIVE_RESURRECTION_SICKNESS,i))
{
Aur->SetAuraDuration(delta*1000);
- Aur->UpdateAuraDuration();
+ Aur->SendAuraUpdate(false);
}
}
}
@@ -4422,7 +4440,7 @@ uint32 Player::GetShieldBlockValue() const
{
BaseModGroup modGroup = SHIELD_BLOCK_VALUE;
- float value = GetTotalBaseModValue(modGroup) + GetStat(STAT_STRENGTH)/20 - 1;
+ float value = GetTotalBaseModValue(modGroup) + GetStat(STAT_STRENGTH) * 0.5f - 10;
value = (value < 0) ? 0 : value;
@@ -4611,7 +4629,18 @@ float Player::OCTRegenMPPerSpirit()
void Player::ApplyRatingMod(CombatRating cr, int32 value, bool apply)
{
- ApplyModUInt32Value(PLAYER_FIELD_COMBAT_RATING_1 + cr, value, 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));
float RatingCoeffecient = GetRatingCoefficient(cr);
float RatingChange = 0.0f;
@@ -4634,16 +4663,13 @@ void Player::ApplyRatingMod(CombatRating cr, int32 value, bool apply)
UpdateBlockPercentage();
break;
case CR_HIT_MELEE:
- RatingChange = value / RatingCoeffecient;
- m_modMeleeHitChance += apply ? RatingChange : -RatingChange;
+ UpdateMeleeHitChances();
break;
case CR_HIT_RANGED:
- RatingChange = value / RatingCoeffecient;
- m_modRangedHitChance += apply ? RatingChange : -RatingChange;
+ UpdateRangedHitChances();
break;
case CR_HIT_SPELL:
- RatingChange = value / RatingCoeffecient;
- m_modSpellHitChance += apply ? RatingChange : -RatingChange;
+ UpdateSpellHitChances();
break;
case CR_CRIT_MELEE:
if(affectStats)
@@ -4741,6 +4767,7 @@ 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;
}
@@ -4803,6 +4830,7 @@ 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)
@@ -4865,6 +4893,7 @@ 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;
}
@@ -5052,7 +5081,10 @@ 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
@@ -5100,6 +5132,7 @@ 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);
@@ -5414,6 +5447,8 @@ 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)
{
@@ -5510,6 +5545,7 @@ 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;
@@ -5841,7 +5877,8 @@ 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;
@@ -5907,6 +5944,8 @@ 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;
@@ -6234,24 +6273,18 @@ void Player::ModifyArenaPoints( int32 value )
uint32 Player::GetGuildIdFromDB(uint64 guid)
{
- std::ostringstream ss;
- ss<<"SELECT guildid FROM guild_member WHERE guid='"<<guid<<"'";
- QueryResult *result = CharacterDatabase.Query( ss.str().c_str() );
- if( result )
- {
- uint32 v = result->Fetch()[0].GetUInt32();
- delete result;
- return v;
- }
- else
+ QueryResult* result = CharacterDatabase.PQuery("SELECT guildid FROM guild_member WHERE guid='%u'", GUID_LOPART(guid));
+ if(!result)
return 0;
+
+ uint32 id = result->Fetch()[0].GetUInt32();
+ delete result;
+ return id;
}
uint32 Player::GetRankFromDB(uint64 guid)
{
- std::ostringstream ss;
- ss<<"SELECT rank FROM guild_member WHERE guid='"<<guid<<"'";
- QueryResult *result = CharacterDatabase.Query( ss.str().c_str() );
+ QueryResult *result = CharacterDatabase.PQuery( "SELECT rank FROM guild_member WHERE guid='%u'", GUID_LOPART(guid) );
if( result )
{
uint32 v = result->Fetch()[0].GetUInt32();
@@ -6275,10 +6308,8 @@ uint32 Player::GetArenaTeamIdFromDB(uint64 guid, uint8 type)
uint32 Player::GetZoneIdFromDB(uint64 guid)
{
- std::ostringstream ss;
-
- ss<<"SELECT zone FROM characters WHERE guid='"<<GUID_LOPART(guid)<<"'";
- QueryResult *result = CharacterDatabase.Query( ss.str().c_str() );
+ uint32 guidLow = GUID_LOPART(guid);
+ QueryResult *result = CharacterDatabase.PQuery( "SELECT zone FROM characters WHERE guid='%u'", guidLow );
if (!result)
return 0;
Field* fields = result->Fetch();
@@ -6288,22 +6319,18 @@ uint32 Player::GetZoneIdFromDB(uint64 guid)
if (!zone)
{
// stored zone is zero, use generic and slow zone detection
- ss.str("");
- ss<<"SELECT map,position_x,position_y FROM characters WHERE guid='"<<GUID_LOPART(guid)<<"'";
- result = CharacterDatabase.Query(ss.str().c_str());
+ result = CharacterDatabase.PQuery("SELECT map,position_x,position_y FROM characters WHERE guid='%u'", guidLow);
if( !result )
return 0;
fields = result->Fetch();
- uint32 map = fields[0].GetUInt32();
+ uint32 map = fields[0].GetUInt32();
float posx = fields[1].GetFloat();
float posy = fields[2].GetFloat();
delete result;
zone = MapManager::Instance().GetZoneId(map,posx,posy);
- ss.str("");
- ss << "UPDATE characters SET zone='"<<zone<<"' WHERE guid='"<<GUID_LOPART(guid)<<"'";
- CharacterDatabase.Execute(ss.str().c_str());
+ CharacterDatabase.PExecute("UPDATE characters SET zone='%u' WHERE guid='%u'", zone, guidLow);
}
return zone;
@@ -6617,19 +6644,43 @@ 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++)
{
- float val = float (proto->ItemStat[i].ItemStatValue);
+ uint32 statType = 0;
+ int32 val = 0;
+
+ 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 (proto->ItemStat[i].ItemStatType)
+ switch (statType)
{
case ITEM_MOD_MANA:
HandleStatModifier(UNIT_MOD_MANA, BASE_VALUE, float(val), apply);
@@ -6747,6 +6798,9 @@ void Player::_ApplyItemBonuses(ItemPrototype const *proto,uint8 slot,bool apply)
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;
}
}
@@ -7362,6 +7416,17 @@ 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;
@@ -7557,8 +7622,8 @@ void Player::SendLoot(uint64 guid, LootType loot_type)
conditional_list = itr->second;
}
- // 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_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_type = LOOT_SKINNING;
if(loot_type == LOOT_FISHINGHOLE)
@@ -8282,7 +8347,8 @@ 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;
@@ -8291,6 +8357,8 @@ 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;
@@ -8336,6 +8404,10 @@ 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;
}
@@ -8361,14 +8433,8 @@ 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 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
+ // in case 2hand equipped weapon (without titan grip) offhand slot empty but not free
+ if(slots[i]!=EQUIPMENT_SLOT_OFFHAND || !IsTwoHandUsed())
return slots[i];
}
}
@@ -8418,7 +8484,7 @@ uint8 Player::CanUnequipItems( uint32 item, uint32 count ) const
return EQUIP_ERR_OK;
}
}
- for(int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
+ for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
{
pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && pItem->GetEntry() == item )
@@ -8460,7 +8526,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 < KEYRING_SLOT_END; i++)
+ for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
{
Item *pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && pItem != skipItem && pItem->GetEntry() == item )
@@ -8520,7 +8586,7 @@ Item* Player::GetItemByGuid( uint64 guid ) const
if( pItem && pItem->GetGUID() == guid )
return pItem;
}
- for(int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
+ for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
{
Item *pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && pItem->GetGUID() == guid )
@@ -8566,7 +8632,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 < KEYRING_SLOT_END ) )
+ if( bag == INVENTORY_SLOT_BAG_0 && ( slot < BANK_SLOT_BAG_END || slot >= KEYRING_SLOT_START && slot < QUESTBAG_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 )
@@ -8644,7 +8710,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 < KEYRING_SLOT_END ) )
+ if( bag == INVENTORY_SLOT_BAG_0 && ( slot >= KEYRING_SLOT_START && slot < QUESTBAG_SLOT_END ) )
return true;
return false;
}
@@ -8765,7 +8831,7 @@ bool Player::HasItemCount( uint32 item, uint32 count, bool inBankAlso ) const
return true;
}
}
- for(int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
+ for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
{
Item *pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && pItem->GetEntry() == item )
@@ -8887,7 +8953,7 @@ bool Player::HasItemTotemCategory( uint32 TotemCategory ) const
if( pItem && IsTotemCategoryCompatiableWith(pItem->GetProto()->TotemCategory,TotemCategory ))
return true;
}
- for(uint8 i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; ++i)
+ for(uint8 i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; ++i)
{
pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && IsTotemCategoryCompatiableWith(pItem->GetProto()->TotemCategory,TotemCategory ))
@@ -8927,6 +8993,18 @@ 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;
@@ -9171,7 +9249,7 @@ uint8 Player::_CanStoreItem( uint8 bag, uint8 slot, ItemPosCountVec &dest, uint3
{
if( bag == INVENTORY_SLOT_BAG_0 ) // inventory
{
- res = _CanStoreItem_InInventorySlots(KEYRING_SLOT_START,KEYRING_SLOT_END,dest,pProto,count,true,pItem,bag,slot);
+ res = _CanStoreItem_InInventorySlots(KEYRING_SLOT_START,QUESTBAG_SLOT_END,dest,pProto,count,true,pItem,bag,slot);
if(res!=EQUIP_ERR_OK)
{
if(no_space_count)
@@ -9258,6 +9336,66 @@ 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)
@@ -9307,7 +9445,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,KEYRING_SLOT_END,dest,pProto,count,true,pItem,bag,slot);
+ res = _CanStoreItem_InInventorySlots(KEYRING_SLOT_START,QUESTBAG_SLOT_END,dest,pProto,count,true,pItem,bag,slot);
if(res!=EQUIP_ERR_OK)
{
if(no_space_count)
@@ -9405,6 +9543,66 @@ 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++)
{
@@ -9475,10 +9673,16 @@ 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++)
{
@@ -9500,6 +9704,36 @@ 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 ))
@@ -9559,6 +9793,42 @@ 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 );
@@ -9611,6 +9881,51 @@ 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 );
@@ -9796,33 +10111,42 @@ 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;
}
-
- Item *mainItem = GetItemByPos( INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND );
- if(mainItem)
+ else if (type == INVTYPE_2HWEAPON)
{
- if(mainItem->GetProto()->InventoryType == INVTYPE_2HWEAPON)
- return EQUIP_ERR_CANT_EQUIP_WITH_TWOHANDED;
+ if(!CanDualWield() || !CanTitanGrip())
+ return EQUIP_ERR_CANT_DUAL_WIELD;
}
+
+ 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_MAINHAND)
+ if (eslot == EQUIPMENT_SLOT_OFFHAND)
+ {
+ if (!CanTitanGrip())
+ return EQUIP_ERR_ITEM_CANT_BE_EQUIPPED;
+ }
+ else if (eslot != EQUIPMENT_SLOT_MAINHAND)
return EQUIP_ERR_ITEM_CANT_BE_EQUIPPED;
- // 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;
+ 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;
+ }
}
dest = ((INVENTORY_SLOT_BAG_0 << 8) | eslot);
return EQUIP_ERR_OK;
@@ -10742,7 +11066,7 @@ void Player::DestroyItemCount( uint32 item, uint32 count, bool update, bool uneq
}
}
}
- for(int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
+ for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
{
pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && pItem->GetEntry() == item )
@@ -10845,7 +11169,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 < KEYRING_SLOT_END; i++)
+ for(int i = KEYRING_SLOT_START; i < QUESTBAG_SLOT_END; i++)
{
Item* pItem = GetItemByPos( INVENTORY_SLOT_BAG_0, i );
if( pItem && pItem->IsLimitedToAnotherMapOrZone(GetMapId(),new_zone) )
@@ -11842,6 +12166,10 @@ 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;
}
@@ -12564,7 +12892,10 @@ 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);
@@ -12577,6 +12908,8 @@ 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 )
@@ -13202,6 +13535,7 @@ void Player::ItemAddedQuestCheck( uint32 entry, uint32 count )
}
}
UpdateForQuestsGO();
+ GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM, entry);
}
void Player::ItemRemovedQuestCheck( uint32 entry, uint32 count )
@@ -13248,6 +13582,7 @@ 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);
@@ -13526,13 +13861,12 @@ 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+4+pQuest->GetRewItemsCount()*8) );
- data << questid;
- data << uint32(0x03);
+ WorldPacket data( SMSG_QUESTGIVER_QUEST_COMPLETE, (4+4+4+4+4) );
+ data << uint32(questid);
if ( getLevel() < sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL) )
{
- data << XP;
+ data << uint32(XP);
data << uint32(pQuest->GetRewOrReqMoney());
}
else
@@ -13540,16 +13874,9 @@ 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
- 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);
- }
+ data << uint32(10*Trinity::Honor::hk_honor_at_level(getLevel(), pQuest->GetRewHonorableKills()));
+ data << uint32(pQuest->GetBonusTalents()); // bonus talents
GetSession()->SendPacket( &data );
if (pQuest->GetQuestCompleteScript() != 0)
@@ -13560,8 +13887,9 @@ void Player::SendQuestFailed( uint32 quest_id )
{
if( quest_id )
{
- WorldPacket data( SMSG_QUESTGIVER_QUEST_FAILED, 4 );
+ WorldPacket data( SMSG_QUESTGIVER_QUEST_FAILED, 4+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");
}
@@ -13600,10 +13928,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, (4+4) );
+ WorldPacket data( SMSG_QUESTUPDATE_ADD_ITEM, 0 );
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 );
}
@@ -13649,7 +13977,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.",GUID_LOPART(guid));
+ sLog.outError("ERROR: Player #%d have broken data in `data` field. Can't be loaded for character list.",GUID_LOPART(guid));
if(delete_result) delete result;
return false;
}
@@ -13719,7 +14047,7 @@ void Player::_LoadArenaTeamInfo(QueryResult *result)
ArenaTeam* aTeam = objmgr.GetArenaTeamById(arenateamid);
if(!aTeam)
{
- sLog.outError("FATAL: couldn't load arenateam %u", arenateamid);
+ sLog.outError("Player::_LoadArenaTeamInfo: couldn't load arenateam %u, week %u, season %u, rating %u", arenateamid, played_week, played_season, personal_rating);
continue;
}
uint8 arenaSlot = aTeam->GetSlot();
@@ -14121,10 +14449,10 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
uint32 extraflags = fields[25].GetUInt32();
m_stableSlots = fields[26].GetUInt32();
- if(m_stableSlots > 2)
+ if(m_stableSlots > 4)
{
- sLog.outError("Player can have not more 2 stable slots, but have in DB %u",uint32(m_stableSlots));
- m_stableSlots = 2;
+ sLog.outError("Player can have not more 4 stable slots, but have in DB %u",uint32(m_stableSlots));
+ m_stableSlots = 4;
}
m_atLoginFlags = fields[27].GetUInt32();
@@ -14193,6 +14521,8 @@ 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()
@@ -14349,6 +14679,8 @@ 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;
}
@@ -14402,10 +14734,6 @@ 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)
@@ -15317,7 +15645,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_DISABLE_ROTATE);
+ RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
SetDisplayId(GetNativeDisplayId());
bool inworld = IsInWorld();
@@ -15468,7 +15796,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();
@@ -15482,7 +15810,8 @@ 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
@@ -15944,6 +16273,42 @@ 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);
@@ -15976,7 +16341,8 @@ void Player::SendAttackSwingBadFacingAttack()
void Player::SendAutoRepeatCancel()
{
- WorldPacket data(SMSG_CANCEL_AUTO_REPEAT, 0);
+ WorldPacket data(SMSG_CANCEL_AUTO_REPEAT, GetPackGUID().size());
+ data.append(GetPackGUID()); // may be it's target guid
GetSession()->SendPacket( &data );
}
@@ -16205,6 +16571,7 @@ 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())
@@ -16336,65 +16703,79 @@ void Player::PetSpellInitialize()
{
Pet* pet = GetPet();
- if(pet)
- {
- uint8 addlist = 0;
+ if(!pet)
+ return;
- sLog.outDebug("Pet Spells Groups");
+ sLog.outDebug("Pet Spells Groups");
- CreatureInfo const *cinfo = pet->GetCreatureInfo();
+ CharmInfo *charmInfo = pet->GetCharmInfo();
- if(pet->isControlled() && (pet->getPetType() == HUNTER_PET || cinfo && cinfo->type == CREATURE_TYPE_DEMON && getClass() == CLASS_WARLOCK))
- {
- for(PetSpellMap::iterator itr = pet->m_spells.begin();itr != pet->m_spells.end();++itr)
- {
- if(itr->second->state == PETSPELL_REMOVED)
- continue;
- ++addlist;
- }
- }
+ 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);
- // first line + actionbar + spellcount + spells + last adds
- WorldPacket data(SMSG_PET_SPELLS, 16+40+1+4*addlist+25);
+ // action bar loop
+ for(uint32 i = 0; i < 10; i++)
+ {
+ data << uint32(charmInfo->GetActionBarEntry(i)->Raw);
+ }
- CharmInfo *charmInfo = pet->GetCharmInfo();
+ size_t spellsCountPos = data.wpos();
- //16
- data << (uint64)pet->GetGUID() << uint32(0x00000000) << uint8(charmInfo->GetReactState()) << uint8(charmInfo->GetCommandState()) << uint16(0);
+ // spells count
+ uint8 addlist = 0;
+ data << uint8(addlist); // placeholder
- for(uint32 i = 0; i < 10; i++) //40
+ 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)
{
- data << uint16(charmInfo->GetActionBarEntry(i)->SpellOrAction) << uint16(charmInfo->GetActionBarEntry(i)->Type);
+ if(itr->second->state == PETSPELL_REMOVED)
+ continue;
+
+ data << uint16(itr->first);
+ data << uint16(itr->second->active); // pet spell active state isn't boolean
+ ++addlist;
}
+ }
- data << uint8(addlist); //1
+ data.put<uint8>(spellsCountPos, addlist);
- 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;
+ uint8 cooldownsCount = pet->m_CreatureSpellCooldowns.size() + pet->m_CreatureCategoryCooldowns.size();
+ data << uint8(cooldownsCount);
- data << uint16(itr->first);
- data << uint16(itr->second->active); // pet spell active state isn't boolean
- }
- }
+ time_t curTime = time(NULL);
- //data << uint8(0x01) << uint32(0x6010) << uint32(0x01) << uint32(0x05) << uint16(0x00); //15
- uint8 count = 3; //1+8+8+8=25
+ for(CreatureSpellCooldowns::const_iterator itr = pet->m_CreatureSpellCooldowns.begin(); itr != pet->m_CreatureSpellCooldowns.end(); ++itr)
+ {
+ time_t cooldown = 0;
- // 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
+ if(itr->second > curTime)
+ cooldown = (itr->second - curTime) * 1000;
- GetSession()->SendPacket(&data);
+ data << uint16(itr->first); // spellid
+ data << uint16(0); // spell category?
+ data << uint32(itr->second); // cooldown
+ data << uint32(0); // category cooldown
+ }
+
+ for(CreatureSpellCooldowns::const_iterator itr = pet->m_CreatureCategoryCooldowns.begin(); itr != pet->m_CreatureCategoryCooldowns.end(); ++itr)
+ {
+ time_t cooldown = 0;
+
+ if(itr->second > curTime)
+ cooldown = (itr->second - curTime) * 1000;
+
+ data << uint16(itr->first); // spellid
+ data << uint16(0); // spell category?
+ data << uint32(0); // cooldown
+ data << uint32(itr->second); // category cooldown
}
+
+ GetSession()->SendPacket(&data);
}
void Player::PossessSpellInitialize()
@@ -16416,7 +16797,10 @@ 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() << uint32(0x00000000) << uint8(0) << uint8(0) << uint16(0);
+ data << uint64(charm->GetGUID());
+ data << uint32(0x00000000);
+ data << uint32(0);
+ data << uint8(0) << uint8(0) << uint16(0);
for(uint32 i = 0; i < 10; i++) //40
{
@@ -16425,11 +16809,8 @@ void Player::PossessSpellInitialize()
data << uint8(addlist); //1
- 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
+ uint8 count = 0;
+ data << uint8(count); // cooldowns count
GetSession()->SendPacket(&data);
}
@@ -16466,13 +16847,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() << uint32(0x00000000);
-
+ data << uint64(charm->GetGUID());
+ data << uint32(0x00000000);
+ data << uint32(0);
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
@@ -16495,51 +16876,12 @@ void Player::CharmSpellInitialize()
}
}
- 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
+ uint8 count = 0;
+ data << uint8(count); // cooldowns count
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)
@@ -16557,22 +16899,25 @@ bool Player::IsAffectedBySpellmod(SpellEntry const *spellInfo, SpellModifier *mo
return false;
}
- return spellmgr.IsAffectedBySpell(spellInfo,mod->spellId,mod->effectId,mod->mask);
+ return spellmgr.IsAffectedByMod(spellInfo, mod);
}
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<64;++eff)
+ for(int eff=0;eff<96;++eff)
{
- uint64 _mask = uint64(1) << eff;
- if ( mod->mask & _mask)
+ 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)
{
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)
+ if ((*itr)->type == mod->type && ((*itr)->mask & _mask || (*itr)->mask2 & _mask2))
val += (*itr)->value;
}
val += apply ? mod->value : -(mod->value);
@@ -16671,6 +17016,27 @@ void Player::RemovePetitionsAndSigns(uint64 guid, uint32 type)
CharacterDatabase.CommitTransaction();
}
+void Player::LeaveAllArenaTeams(uint64 guid)
+{
+ QueryResult *result = CharacterDatabase.PQuery("SELECT arena_team_member.arenateamid FROM arena_team_member JOIN arena_team ON arena_team_member.arenateamid = arena_team.arenateamid WHERE guid='%u'", GUID_LOPART(guid));
+ if(!result)
+ return;
+
+ do
+ {
+ Field *fields = result->Fetch();
+ uint32 at_id = fields[0].GetUInt32();
+ if(at_id != 0)
+ {
+ ArenaTeam * at = objmgr.GetArenaTeamById(at_id);
+ if(at)
+ at->DelMember(guid);
+ }
+ } while (result->NextRow());
+
+ delete result;
+}
+
void Player::SetRestBonus (float rest_bonus_new)
{
// Prevent resting on max level
@@ -16720,7 +17086,7 @@ void Player::HandleStealthedUnitsDetection()
// send data at target visibility change (adding to client)
if((*i)!=this && (*i)->isType(TYPEMASK_UNIT))
{
- SendAuraDurationsForTarget(*i);
+ SendAurasForTarget(*i);
//if(((Unit*)(*i))->isAlive()) //should be always alive
{
if((*i)->GetTypeId()==TYPEID_UNIT)
@@ -17714,7 +18080,7 @@ void Player::UpdateVisibilityOf(WorldObject* target)
// send data at target visibility change (adding to client)
if(target!=this && target->isType(TYPEMASK_UNIT))
{
- SendAuraDurationsForTarget((Unit*)target);
+ SendAurasForTarget((Unit*)target);
if(((Unit*)target)->isAlive())
{
if(target->GetTypeId()==TYPEID_UNIT)
@@ -17893,7 +18259,7 @@ void Player::SetGroup(Group *group, int8 subgroup)
void Player::SendInitialPacketsBeforeAddToMap()
{
- WorldPacket data(SMSG_SET_REST_START, 4);
+ WorldPacket data(SMSG_SET_REST_START_OBSOLETE, 4);
data << uint32(0); // unknown, may be rest state time or experience
GetSession()->SendPacket(&data);
@@ -17921,6 +18287,7 @@ void Player::SendInitialPacketsBeforeAddToMap()
SendInitialActionButtons();
SendInitialReputations();
+ m_achievementMgr.SendAllAchievementData();
UpdateZone(GetZoneId());
SendInitWorldStates();
@@ -17931,13 +18298,23 @@ 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
@@ -17968,6 +18345,7 @@ void Player::SendInitialPacketsAfterAddToMap()
SendMessageToSet(&data,true);
}
+ SendAurasForTarget(this);
SendEnchantmentDurations(); // must be after add to map
SendItemDurations(); // must be after add to map
}
@@ -17985,11 +18363,19 @@ void Player::SendUpdateToOutOfRangeGroupMembers()
pet->ResetAuraUpdateMask();
}
-void Player::SendTransferAborted(uint32 mapid, uint16 reason)
+void Player::SendTransferAborted(uint32 mapid, uint8 reason, uint8 arg)
{
WorldPacket data(SMSG_TRANSFER_ABORTED, 4+2);
data << uint32(mapid);
- data << uint16(reason); // transfer abort reason
+ 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;
+ }
GetSession()->SendPacket(&data);
}
@@ -18199,16 +18585,51 @@ void Player::learnSkillRewardedSpells()
}
}
-void Player::SendAuraDurationsForTarget(Unit* target)
+void Player::SendAurasForTarget(Unit *target)
{
- for(Unit::AuraMap::const_iterator itr = target->GetAuras().begin(); itr != target->GetAuras().end(); ++itr)
+ 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)
{
- Aura* aura = itr->second;
- if(aura->GetAuraSlot() >= MAX_AURAS || aura->IsPassive() || aura->GetCasterGUID()!=GetGUID())
- continue;
+ 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->SendAuraDurationForCaster(this);
+ if(auraFlags & AFLAG_DURATION) // include aura duration
+ {
+ data << uint32(aura->GetAuraMaxDuration());
+ data << uint32(aura->GetAuraDuration());
+ }
+ }
+ break;
+ }
+ }
}
+
+ GetSession()->SendPacket(&data);
}
void Player::SetDailyQuestStatus( uint32 quest_id )
@@ -18270,15 +18691,15 @@ uint32 Player::GetMinLevelForBattleGroundQueueId(uint32 queue_id)
if(queue_id < 1)
return 0;
- if(queue_id >=6)
- queue_id = 6;
+ if(queue_id >=7)
+ queue_id = 7;
return 10*(queue_id+1);
}
uint32 Player::GetMaxLevelForBattleGroundQueueId(uint32 queue_id)
{
- if(queue_id >=6)
+ if(queue_id >=7)
return 255; // hardcoded max level
return 10*(queue_id+2)-1;
@@ -18290,8 +18711,8 @@ uint32 Player::GetBattleGroundQueueIdFromLevel() const
uint32 level = getLevel();
if(level <= 19)
return 0;
- else if (level > 69)
- return 6;
+ else if (level > 79)
+ return 7;
else
return level/10 - 1; // 20..29 -> 1, 30-39 -> 2, ...
/*
@@ -18437,9 +18858,8 @@ void Player::AutoUnequipOffhandIfNeed()
if(!offItem)
return;
- Item *mainItem = GetItemByPos( INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND );
-
- if(!mainItem || mainItem->GetProto()->InventoryType != INVTYPE_2HWEAPON)
+ // need unequip for 2h-weapon without TitanGrip
+ if (!IsTwoHandUsed())
return;
ItemPosCountVec off_dest;
@@ -18505,6 +18925,23 @@ 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();
@@ -18550,7 +18987,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 == 99 && (*itr)->GetSpellProto()->SpellIconID == 92 )
+ if( prio < 2 && (*itr)->GetSpellProto()->SpellVisual[0] == 99 && (*itr)->GetSpellProto()->SpellIconID == 92 )
{
switch((*itr)->GetId())
{
@@ -18709,6 +19146,9 @@ 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)
@@ -18726,8 +19166,6 @@ 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)
@@ -18741,8 +19179,8 @@ void Player::SetClientControl(Unit* target, uint8 allowMove)
void Player::UpdateZoneDependentAuras( uint32 newZone )
{
// remove new continent flight forms
- if( !isGameMaster() &&
- GetVirtualMapForMapAndZone(GetMapId(),newZone) != 530)
+ uint32 v_map = GetVirtualMapForMapAndZone(GetMapId(), newZone);
+ if( !isGameMaster() && v_map != 530 && v_map != 571)
{
RemoveSpellsCausingAura(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED);
RemoveSpellsCausingAura(SPELL_AURA_FLY);
@@ -18962,8 +19400,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;
@@ -19269,6 +19707,152 @@ 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)
@@ -19286,7 +19870,6 @@ void Player::SetTitle(CharTitlesEntry const* title)
SetFlag(PLAYER__FIELD_KNOWN_TITLES+fieldIndexOffset, flag);
}
-
/*-----------------------TRINITY--------------------------*/
bool Player::isTotalImmunity()
{
@@ -19343,3 +19926,52 @@ 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 c97f771190e..ef111762efa 100644
--- a/src/game/Player.h
+++ b/src/game/Player.h
@@ -35,6 +35,7 @@
#include "Pet.h"
#include "MapReference.h"
#include "Util.h" // for Tokens typedef
+#include "AchievementMgr.h"
#include<string>
#include<vector>
@@ -49,6 +50,8 @@ class Transport;
class UpdateMask;
class PlayerSocial;
class OutdoorPvP;
+class AchievementMgr;
+class Vehicle;
typedef std::deque<Mail*> PlayerMails;
@@ -80,15 +83,17 @@ 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;
};
@@ -224,6 +229,39 @@ 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)
@@ -392,7 +430,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_UNK = 0x00040000, // 2.0.8...
+ PLAYER_FLAGS_PVP_TIMER = 0x00040000, // 3.0.2, pvp timer active (after you disable pvp manually)
};
// used for PLAYER__FIELD_KNOWN_TITLES field (uint64), (1<<bit_index) without (-1)
@@ -481,7 +519,8 @@ 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_FISHINGHOLE = 8, // unsupported by client, sending LOOT_FISHING instead
+ LOOT_MILLING = 9 // unsupported by client, sending LOOT_SKINNING instead
};
enum MirrorTimerType
@@ -512,7 +551,8 @@ enum AtLoginFlags
AT_LOGIN_NONE = 0,
AT_LOGIN_RENAME = 1,
AT_LOGIN_RESET_SPELLS = 2,
- AT_LOGIN_RESET_TALENTS = 4
+ AT_LOGIN_RESET_TALENTS = 4,
+ AT_LOGIN_CUSTOMIZE = 8
};
typedef std::map<uint32, QuestStatusData> QuestStatusMap;
@@ -544,7 +584,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 = 118,
+ PLAYER_SLOT_END = 200,
PLAYER_SLOTS_COUNT = (PLAYER_SLOT_END - PLAYER_SLOT_START)
};
@@ -672,6 +712,24 @@ 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) {}
@@ -690,14 +748,15 @@ enum TradeSlots
enum TransferAbortReason
{
- 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.
+ 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.
};
enum InstanceResetWarningType
@@ -711,15 +770,16 @@ enum InstanceResetWarningType
struct MovementInfo
{
// common
- //uint32 flags;
- uint8 unk1;
+ uint32 flags;
+ uint16 unk1;
uint32 time;
float x, y, z, o;
// transport
uint64 t_guid;
float t_x, t_y, t_z, t_o;
uint32 t_time;
- // swimming and unk
+ int8 t_seat;
+ // swimming and unknown
float s_pitch;
// last fall time
uint32 fallTime;
@@ -730,17 +790,17 @@ struct MovementInfo
MovementInfo()
{
- //flags =
+ flags = 0;
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
@@ -813,10 +873,12 @@ enum PlayerLoginQueryIndex
PLAYER_LOGIN_QUERY_LOADDECLINEDNAMES = 16,
PLAYER_LOGIN_QUERY_LOADGUILD = 17,
PLAYER_LOGIN_QUERY_LOADARENAINFO = 18,
-
- MAX_PLAYER_LOGIN_QUERY
+ PLAYER_LOGIN_QUERY_LOADACHIEVEMENTS = 19,
+ PLAYER_LOGIN_QUERY_LOADCRITERIAPROGRESS = 20,
+ MAX_PLAYER_LOGIN_QUERY = 21
};
+
// Player summoning auto-decline time (in secs)
#define MAX_PLAYER_SUMMON_DELAY (2*MINUTE)
#define MAX_MONEY_AMOUNT (0x7FFFFFFF-1)
@@ -837,7 +899,7 @@ class TRINITY_DLL_SPEC PlayerTaxi
PlayerTaxi();
~PlayerTaxi() {}
// Nodes
- void InitTaxiNodesForLevel(uint32 race, uint32 level);
+ void InitTaxiNodesForLevel(uint32 race, uint32 chrClass, uint32 level);
void LoadTaxiMask(const char* data);
void SaveTaxiMask(const char* data);
@@ -940,7 +1002,7 @@ class TRINITY_DLL_SPEC Player : public Unit
void SendInitialPacketsBeforeAddToMap();
void SendInitialPacketsAfterAddToMap();
- void SendTransferAborted(uint32 mapid, uint16 reason);
+ void SendTransferAborted(uint32 mapid, uint8 reason, uint8 arg = 0);
void SendInstanceResetWarning(uint32 mapid, uint32 time);
bool CanInteractWithNPCs(bool alive = true) const;
@@ -953,10 +1015,12 @@ 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(),getLevel()); }
+ void InitTaxiNodesForLevel() { m_taxi.InitTaxiNodesForLevel(getRace(), getClass(), 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); }
@@ -1052,6 +1116,7 @@ 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); }
@@ -1130,6 +1195,11 @@ 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);
@@ -1285,6 +1355,7 @@ 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;
@@ -1423,6 +1494,12 @@ 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();
@@ -1431,8 +1508,6 @@ 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);
@@ -1537,6 +1612,7 @@ class TRINITY_DLL_SPEC Player : public Unit
static uint32 GetArenaTeamIdFromDB(uint64 guid, uint8 slot);
void SetArenaTeamIdInvited(uint32 ArenaTeamId) { m_ArenaTeamIdInvited = ArenaTeamId; }
uint32 GetArenaTeamIdInvited() { return m_ArenaTeamIdInvited; }
+ static void LeaveAllArenaTeams(uint64 guid);
void SetDifficulty(uint32 dungeon_difficulty) { m_dungeonDifficulty = dungeon_difficulty; }
uint8 GetDifficulty() { return m_dungeonDifficulty; }
@@ -1589,6 +1665,10 @@ 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);
@@ -1759,6 +1839,8 @@ 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; }
@@ -1792,7 +1874,7 @@ class TRINITY_DLL_SPEC Player : public Unit
void SendUpdateWorldState(uint32 Field, uint32 Value);
void SendDirectMessage(WorldPacket *data);
- void SendAuraDurationsForTarget(Unit* target);
+ void SendAurasForTarget(Unit *target);
PlayerMenu* PlayerTalkClass;
std::vector<ItemSetEffect *> ItemSetEff;
@@ -1953,6 +2035,7 @@ 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;
@@ -1970,6 +2053,9 @@ 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); }
@@ -1982,6 +2068,7 @@ 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; }
@@ -2081,6 +2168,18 @@ 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);
@@ -2217,6 +2316,7 @@ 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;
@@ -2250,7 +2350,6 @@ 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;
@@ -2269,8 +2368,10 @@ 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;
@@ -2317,6 +2418,8 @@ 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 9f9eecc2234..5b5679a81d7 100644
--- a/src/game/QueryHandler.cpp
+++ b/src/game/QueryHandler.cpp
@@ -33,6 +33,7 @@
#include "NPCHandler.h"
#include "ObjectAccessor.h"
#include "Pet.h"
+#include "MapManager.h"
void WorldSession::SendNameQueryOpcode(Player *p)
{
@@ -185,7 +186,6 @@ 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,20 +276,43 @@ void WorldSession::HandleCorpseQueryOpcode(WorldPacket & /*recv_data*/)
Corpse *corpse = GetPlayer()->GetCorpse();
- uint8 found = 1;
if(!corpse)
- found = 0;
+ {
+ WorldPacket data(MSG_CORPSE_QUERY, 1);
+ data << uint8(0); // corpse not found
+ SendPacket(&data);
+ return;
+ }
- WorldPacket data(MSG_CORPSE_QUERY, (1+found*(5*4)));
- data << uint8(found);
- if(found)
+ 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())
{
- data << corpse->GetMapId();
- data << corpse->GetPositionX();
- data << corpse->GetPositionY();
- data << corpse->GetPositionZ();
- data << _player->GetMapId();
+ 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();
+ }
}
+
+ 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 4dd202bc344..e56a3a4c982 100644
--- a/src/game/QuestDef.cpp
+++ b/src/game/QuestDef.cpp
@@ -44,88 +44,90 @@ Quest::Quest(Field * questRecord)
QuestFlags = questRecord[17].GetUInt16();
uint32 SpecialFlags = questRecord[18].GetUInt16();
CharTitleId = questRecord[19].GetUInt32();
- 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();
+ 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();
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
- ObjectiveText[i] = questRecord[33+i].GetCppString();
+ ObjectiveText[i] = questRecord[35+i].GetCppString();
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
- ReqItemId[i] = questRecord[37+i].GetUInt32();
+ ReqItemId[i] = questRecord[39+i].GetUInt32();
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
- ReqItemCount[i] = questRecord[41+i].GetUInt32();
+ ReqItemCount[i] = questRecord[43+i].GetUInt32();
for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
- ReqSourceId[i] = questRecord[45+i].GetUInt32();
+ ReqSourceId[i] = questRecord[47+i].GetUInt32();
for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
- ReqSourceCount[i] = questRecord[49+i].GetUInt32();
+ ReqSourceCount[i] = questRecord[51+i].GetUInt32();
for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
- ReqSourceRef[i] = questRecord[53+i].GetUInt32();
+ ReqSourceRef[i] = questRecord[55+i].GetUInt32();
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
- ReqCreatureOrGOId[i] = questRecord[57+i].GetInt32();
+ ReqCreatureOrGOId[i] = questRecord[59+i].GetInt32();
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
- ReqCreatureOrGOCount[i] = questRecord[61+i].GetUInt32();
+ ReqCreatureOrGOCount[i] = questRecord[63+i].GetUInt32();
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
- ReqSpell[i] = questRecord[65+i].GetUInt32();
+ ReqSpell[i] = questRecord[67+i].GetUInt32();
for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
- RewChoiceItemId[i] = questRecord[69+i].GetUInt32();
+ RewChoiceItemId[i] = questRecord[71+i].GetUInt32();
for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
- RewChoiceItemCount[i] = questRecord[75+i].GetUInt32();
+ RewChoiceItemCount[i] = questRecord[77+i].GetUInt32();
for (int i = 0; i < QUEST_REWARDS_COUNT; ++i)
- RewItemId[i] = questRecord[81+i].GetUInt32();
+ RewItemId[i] = questRecord[83+i].GetUInt32();
for (int i = 0; i < QUEST_REWARDS_COUNT; ++i)
- RewItemCount[i] = questRecord[85+i].GetUInt32();
+ RewItemCount[i] = questRecord[87+i].GetUInt32();
for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
- RewRepFaction[i] = questRecord[89+i].GetUInt32();
+ RewRepFaction[i] = questRecord[91+i].GetUInt32();
for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
- 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();
+ 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();
for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
- DetailsEmote[i] = questRecord[110+i].GetUInt32();
+ DetailsEmote[i] = questRecord[112+i].GetUInt32();
- IncompleteEmote = questRecord[114].GetUInt32();
- CompleteEmote = questRecord[115].GetUInt32();
+ IncompleteEmote = questRecord[116].GetUInt32();
+ CompleteEmote = questRecord[117].GetUInt32();
for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
- OfferRewardEmote[i] = questRecord[116+i].GetInt32();
+ OfferRewardEmote[i] = questRecord[118+i].GetInt32();
- QuestStartScript = questRecord[120].GetUInt32();
- QuestCompleteScript = questRecord[121].GetUInt32();
+ QuestStartScript = questRecord[122].GetUInt32();
+ QuestCompleteScript = questRecord[123].GetUInt32();
QuestFlags |= SpecialFlags << 16;
diff --git a/src/game/QuestDef.h b/src/game/QuestDef.h
index 52f58c2c87e..1904cbe08a8 100644
--- a/src/game/QuestDef.h
+++ b/src/game/QuestDef.h
@@ -44,30 +44,33 @@ 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 10 daily quests today
- INVALIDREASON_QUEST_FAILED_CAIS = 27, //You cannot complete quests once you have reached tired time
+ 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.
};
enum QuestShareMessages
{
- 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,
+ 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
};
enum __QuestTradeSkill
@@ -190,6 +193,8 @@ 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; }
@@ -277,6 +282,8 @@ 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 abb285e6dbb..784a2affbc0 100644
--- a/src/game/QuestHandler.cpp
+++ b/src/game/QuestHandler.cpp
@@ -451,12 +451,6 @@ 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 07840998cf2..b8a0f135ab7 100644
--- a/src/game/SharedDefines.h
+++ b/src/game/SharedDefines.h
@@ -88,7 +88,8 @@ 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_MAGE-1)) |(1<<(CLASS_WARLOCK-1))|(1<<(CLASS_DRUID-1)) | \
+ (1<<(CLASS_DEATH_KNIGHT-1)) )
#define CLASSMASK_WAND_USERS ((1<<(CLASS_PRIEST-1))|(1<<(CLASS_MAGE-1))|(1<<(CLASS_WARLOCK-1)))
@@ -134,11 +135,12 @@ enum Powers
POWER_FOCUS = 2,
POWER_ENERGY = 3,
POWER_HAPPINESS = 4,
- POWER_RUNES = 5,
+ POWER_RUNE = 5,
+ POWER_RUNIC_POWER = 6,
POWER_HEALTH = 0xFFFFFFFE // (-2 as signed value)
};
-#define MAX_POWERS 5 // not count POWER_RUNES for now
+#define MAX_POWERS 7
enum SpellSchools
{
@@ -199,10 +201,11 @@ 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_ARTIFACT = 6, //LIGHT YELLOW
+ ITEM_QUALITY_HEIRLOOM = 7
};
-#define MAX_ITEM_QUALITY 7
+#define MAX_ITEM_QUALITY 8
enum SpellCategory
{
@@ -217,7 +220,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 2.4.2
+#define SPELL_ATTR_UNK3 0x00000008 // 3 not set in 3.0.3
#define SPELL_ATTR_UNK4 0x00000010 // 4
#define SPELL_ATTR_UNK5 0x00000020 // 5 trade spells?
#define SPELL_ATTR_PASSIVE 0x00000040 // 6 Passive spell
@@ -272,7 +275,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 not set in 2.4.2
+#define SPELL_ATTR_EX_UNK25 0x02000000 // 25
#define SPELL_ATTR_EX_UNK26 0x04000000 // 26
#define SPELL_ATTR_EX_UNK27 0x08000000 // 27
#define SPELL_ATTR_EX_UNK28 0x10000000 // 28
@@ -288,14 +291,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 2.4.2
+#define SPELL_ATTR_EX2_UNK8 0x00000100 // 8 not set in 3.0.3
#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 2.4.2
+#define SPELL_ATTR_EX2_UNK15 0x00008000 // 15 not set in 3.0.3
#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
@@ -413,37 +416,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 2.4.2
+#define SPELL_ATTR_EX6_UNK1 0x00000002 // 1 not set in 3.0.3
#define SPELL_ATTR_EX6_UNK2 0x00000004 // 2
#define SPELL_ATTR_EX6_UNK3 0x00000008 // 3
-#define SPELL_ATTR_EX6_UNK4 0x00000010 // 4 not set in 2.4.2
+#define SPELL_ATTR_EX6_UNK4 0x00000010 // 4
#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 not set in 2.4.2
+#define SPELL_ATTR_EX6_UNK9 0x00000200 // 9
#define SPELL_ATTR_EX6_UNK10 0x00000400 // 10
#define SPELL_ATTR_EX6_UNK11 0x00000800 // 11
-#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
+#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
enum SheathTypes
{
@@ -566,7 +569,7 @@ enum SpellEffects
SPELL_EFFECT_SUMMON_GUARDIAN = 42,
SPELL_EFFECT_TELEPORT_UNITS_FACE_CASTER= 43,
SPELL_EFFECT_SKILL_STEP = 44,
- SPELL_EFFECT_UNDEFINED_45 = 45,
+ SPELL_EFFECT_ADD_HONOR = 45,
SPELL_EFFECT_SPAWN = 46,
SPELL_EFFECT_TRADE_SKILL = 47,
SPELL_EFFECT_STEALTH = 48,
@@ -586,16 +589,16 @@ enum SpellEffects
SPELL_EFFECT_POWER_BURN = 62,
SPELL_EFFECT_THREAT = 63,
SPELL_EFFECT_TRIGGER_SPELL = 64,
- SPELL_EFFECT_HEALTH_FUNNEL = 65,
- SPELL_EFFECT_POWER_FUNNEL = 66,
+ SPELL_EFFECT_APPLY_AREA_AURA_RAID = 65,
+ SPELL_EFFECT_CREATE_MANA_GEM = 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_SUMMON_POSSESSED = 73,
- SPELL_EFFECT_SUMMON_TOTEM = 74,
+ SPELL_EFFECT_UNTRAIN_TALENTS = 73,
+ SPELL_EFFECT_APPLY_GLYPH = 74,
SPELL_EFFECT_HEAL_MECHANICAL = 75,
SPELL_EFFECT_SUMMON_OBJECT_WILD = 76,
SPELL_EFFECT_SCRIPT_EFFECT = 77,
@@ -608,10 +611,10 @@ enum SpellEffects
SPELL_EFFECT_STUCK = 84,
SPELL_EFFECT_SUMMON_PLAYER = 85,
SPELL_EFFECT_ACTIVATE_OBJECT = 86,
- 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_WMO_DAMAGE = 87,
+ SPELL_EFFECT_WMO_REPAIR = 88,
+ SPELL_EFFECT_WMO_CHANGE = 89,
+ SPELL_EFFECT_KILL_CREDIT = 90,
SPELL_EFFECT_THREAT_ALL = 91,
SPELL_EFFECT_ENCHANT_HELD_ITEM = 92,
SPELL_EFFECT_SUMMON_PHANTASM = 93, //unused
@@ -655,19 +658,19 @@ enum SpellEffects
SPELL_EFFECT_131 = 131,
SPELL_EFFECT_132 = 132,
SPELL_EFFECT_UNLEARN_SPECIALIZATION = 133,
- SPELL_EFFECT_KILL_CREDIT = 134,
+ SPELL_EFFECT_KILL_CREDIT2 = 134,
SPELL_EFFECT_135 = 135,
SPELL_EFFECT_HEAL_PCT = 136,
SPELL_EFFECT_ENERGIZE_PCT = 137,
SPELL_EFFECT_138 = 138,
- SPELL_EFFECT_139 = 139,
+ SPELL_EFFECT_CLEAR_QUEST = 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_146 = 146,
+ SPELL_EFFECT_ACTIVATE_RUNE = 146,
SPELL_EFFECT_QUEST_FAIL = 147,
SPELL_EFFECT_148 = 148,
SPELL_EFFECT_149 = 149,
@@ -675,7 +678,13 @@ enum SpellEffects
SPELL_EFFECT_TRIGGER_SPELL_2 = 151,
SPELL_EFFECT_152 = 152,
SPELL_EFFECT_153 = 153,
- TOTAL_SPELL_EFFECTS = 154
+ 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
};
// Spell aura states
@@ -703,7 +712,8 @@ 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_HYPOTHERMIA = 19, // c |
+ AURA_STATE_HEALTH_ABOVE_75_PERCENT = 23, // C | not implemented yet
};
// Spell mechanics
@@ -711,11 +721,11 @@ enum Mechanics
{
MECHANIC_NONE = 0,
MECHANIC_CHARM = 1,
- MECHANIC_CONFUSED = 2,
+ MECHANIC_DISORIENTED = 2,
MECHANIC_DISARM = 3,
MECHANIC_DISTRACT = 4,
MECHANIC_FEAR = 5,
- MECHANIC_FUMBLE = 6,
+ MECHANIC_GRIP = 6,
MECHANIC_ROOT = 7,
MECHANIC_PACIFY = 8, //0 spells use this mechanic
MECHANIC_SILENCE = 9,
@@ -731,7 +741,7 @@ enum Mechanics
MECHANIC_SHIELD = 19,
MECHANIC_SHACKLE = 20,
MECHANIC_MOUNT = 21,
- MECHANIC_PERSUADE = 22, //0 spells use this mechanic
+ MECHANIC_INFECTED = 22,
MECHANIC_TURN = 23,
MECHANIC_HORROR = 24,
MECHANIC_INVULNERABILITY = 25,
@@ -739,12 +749,13 @@ enum Mechanics
MECHANIC_DAZE = 27,
MECHANIC_DISCOVERY = 28,
MECHANIC_IMMUNE_SHIELD = 29, // Divine (Blessing) Shield/Protection and Ice Block
- MECHANIC_SAPPED = 30
+ MECHANIC_SAPPED = 30,
+ MECHANIC_ENRAGED = 31
};
// 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_CONFUSED )|(1<<MECHANIC_FEAR )| \
+ (1<<MECHANIC_CHARM )|(1<<MECHANIC_DISORIENTED )|(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)| \
@@ -764,7 +775,8 @@ enum DispelType
DISPEL_ALL = 7,
DISPEL_SPE_NPC_ONLY = 8,
DISPEL_ENRAGE = 9,
- DISPEL_ZG_TICKET = 10
+ DISPEL_ZG_TICKET = 10,
+ DESPEL_OLD_UNUSED = 11
};
#define DISPEL_ALL_MASK ( (1<<DISPEL_MAGIC) | (1<<DISPEL_CURSE) | (1<<DISPEL_DISEASE) | (1<<DISPEL_POISON) )
@@ -977,9 +989,10 @@ 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 35 // sending to client this or greater value can crash client.
+#define MAX_GAMEOBJECT_TYPE 36 // sending to client this or greater value can crash client.
#define GAMEOBJECT_FISHINGNODE_ENTRY 35591 // Better to define it somewhere instead of hardcoding everywhere
@@ -1546,7 +1559,9 @@ enum LockType
LOCKTYPE_BLASTING = 16,
LOCKTYPE_SLOW_OPEN = 17,
LOCKTYPE_SLOW_CLOSE = 18,
- LOCKTYPE_FISHING = 19
+ LOCKTYPE_FISHING = 19,
+ LOCKTYPE_INSCRIPTION = 20,
+ LOCKTYPE_OPEN_FROM_VEHICLE = 21
};
enum TrainerType // this is important type for npcs!
@@ -1600,7 +1615,7 @@ enum CreatureFamily
CREATURE_FAMILY_IMP = 23,
CREATURE_FAMILY_BAT = 24,
CREATURE_FAMILY_HYENA = 25,
- CREATURE_FAMILY_OWL = 26,
+ CREATURE_FAMILY_BIRD_OF_PREY = 26,
CREATURE_FAMILY_WIND_SERPENT = 27,
CREATURE_FAMILY_REMOTE_CONTROL = 28,
CREATURE_FAMILY_FELGUARD = 29,
@@ -1610,7 +1625,16 @@ enum CreatureFamily
CREATURE_FAMILY_SPOREBAT = 33,
CREATURE_FAMILY_NETHER_RAY = 34,
CREATURE_FAMILY_SERPENT = 35,
- CREATURE_FAMILY_SEA_LION = 36
+ 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
};
enum CreatureTypeFlags
@@ -1642,6 +1666,8 @@ 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
@@ -1652,7 +1678,7 @@ enum QuestSort
QUEST_SORT_SEASONAL = 22,
QUEST_SORT_UNDERCITY_OLD = 23,
QUEST_SORT_HERBALISM = 24,
- QUEST_SORT_SCARLET_MONASTERY_OLD= 25,
+ QUEST_SORT_BATTLEGROUNDS = 25,
QUEST_SORT_ULDAMN_OLD = 41,
QUEST_SORT_WARLOCK = 61,
QUEST_SORT_WARRIOR = 81,
@@ -1681,22 +1707,26 @@ enum QuestSort
QUEST_SORT_REPUTATION = 367,
QUEST_SORT_INVASION = 368,
QUEST_SORT_MIDSUMMER = 369,
- QUEST_SORT_BREWFEST = 370
+ QUEST_SORT_BREWFEST = 370,
+ QUEST_SORT_INSCRIPTION = 371,
+ QUEST_SORT_DEATH_KNIGHT = 372,
+ QUEST_SORT_JEWELCRAFTING = 373
};
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_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;
}
return 0;
}
@@ -1708,7 +1738,6 @@ enum SkillType
SKILL_ARMS = 26,
SKILL_COMBAT = 38,
SKILL_SUBTLETY = 39,
- SKILL_POISONS = 40,
SKILL_SWORDS = 43,
SKILL_AXES = 44,
SKILL_BOWS = 45,
@@ -1716,8 +1745,8 @@ enum SkillType
SKILL_BEAST_MASTERY = 50,
SKILL_SURVIVAL = 51,
SKILL_MACES = 54,
- SKILL_HOLY = 56,
SKILL_2H_SWORDS = 55,
+ SKILL_HOLY = 56,
SKILL_SHADOW = 78,
SKILL_DEFENSE = 95,
SKILL_LANG_COMMON = 98,
@@ -1773,24 +1802,20 @@ enum SkillType
SKILL_PET_BOAR = 211,
SKILL_PET_CROCILISK = 212,
SKILL_PET_CARRION_BIRD = 213,
- SKILL_PET_GORILLA = 215,
SKILL_PET_CRAB = 214,
+ SKILL_PET_GORILLA = 215,
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,
@@ -1820,7 +1845,7 @@ enum SkillType
SKILL_LOCKPICKING = 633,
SKILL_PET_BAT = 653,
SKILL_PET_HYENA = 654,
- SKILL_PET_OWL = 655,
+ SKILL_PET_BIRD_OF_PREY = 655,
SKILL_PET_WIND_SERPENT = 656,
SKILL_LANG_GUTTERSPEAK = 673,
SKILL_RIDING_KODO = 713,
@@ -1840,10 +1865,27 @@ enum SkillType
SKILL_PET_WARP_STALKER = 766,
SKILL_PET_RAVAGER = 767,
SKILL_PET_SERPENT = 768,
- SKILL_INTERNAL = 769
+ 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
};
-#define MAX_SKILL_TYPE 770
+#define MAX_SKILL_TYPE 789
inline uint32 SkillByQuestSort(int32 QuestSort)
{
@@ -1858,25 +1900,27 @@ 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_NOT_DISPLAYED = 12
+ SKILL_CATEGORY_GENERIC = 12
};
enum TotemCategory
{
- TC_SKINNING_SKIFE = 1,
+ TC_SKINNING_SKIFE_OLD = 1,
TC_EARTH_TOTEM = 2,
TC_AIR_TOTEM = 3,
TC_FIRE_TOTEM = 4,
@@ -1886,15 +1930,28 @@ enum TotemCategory
TC_GOLDEN_ROD = 8,
TC_TRUESILVER_ROD = 9,
TC_ARCANITE_ROD = 10,
- TC_MINING_PICK = 11,
+ TC_MINING_PICK_OLD = 11,
TC_PHILOSOPHERS_STONE = 12,
- TC_BLACKSMITH_HAMMER = 13,
+ TC_BLACKSMITH_HAMMER_OLD = 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_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
};
enum UnitDynFlags
@@ -1904,7 +1961,8 @@ enum UnitDynFlags
UNIT_DYNFLAG_OTHER_TAGGER = 0x0004,
UNIT_DYNFLAG_ROOTED = 0x0008,
UNIT_DYNFLAG_SPECIALINFO = 0x0010,
- UNIT_DYNFLAG_DEAD = 0x0020
+ UNIT_DYNFLAG_DEAD = 0x0020,
+ UNIT_DYNFLAG_REFER_A_FRIEND = 0x0040
};
enum CorpseDynFlags
@@ -1914,6 +1972,7 @@ 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
@@ -1981,9 +2040,12 @@ 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 0x2F
+#define MAX_CHAT_MSG_TYPE 0x32
// Values from ItemPetFood (power of (value-1) used for compare with CreatureFamilyEntry.petDietMask
enum PetDiet
@@ -2152,42 +2214,45 @@ enum ResponseCodes
CHAR_CREATE_SERVER_QUEUE = 0x37,
CHAR_CREATE_ONLY_EXISTING = 0x38,
CHAR_CREATE_EXPANSION = 0x39,
-
- 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,
+ 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
};
/// Ban function modes
diff --git a/src/game/SkillHandler.cpp b/src/game/SkillHandler.cpp
index 56e48bf75c4..9f3915c30cb 100644
--- a/src/game/SkillHandler.cpp
+++ b/src/game/SkillHandler.cpp
@@ -82,10 +82,6 @@ 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 c17e5632cb9..e515c592c50 100644
--- a/src/game/Spell.cpp
+++ b/src/game/Spell.cpp
@@ -43,7 +43,6 @@
#include "CellImpl.h"
#include "Policies/SingletonImp.h"
#include "SharedDefines.h"
-#include "Tools.h"
#include "LootMgr.h"
#include "VMapFactory.h"
#include "BattleGround.h"
@@ -177,16 +176,16 @@ bool SpellCastTargets::read ( WorldPacket * data, Unit *caster )
return true;
// TARGET_FLAG_UNK2 is used for non-combat pets, maybe other?
- if( m_targetMask & (TARGET_FLAG_UNIT|TARGET_FLAG_UNK2) )
- if(!readGUID(*data, m_unitTargetGUID))
+ if( m_targetMask & ( TARGET_FLAG_UNIT | TARGET_FLAG_UNK2 ))
+ if(!data->readPackGUID(m_unitTargetGUID))
return false;
if( m_targetMask & ( TARGET_FLAG_OBJECT | TARGET_FLAG_OBJECT_UNK ))
- if(!readGUID(*data, m_GOTargetGUID))
+ if(!data->readPackGUID(m_GOTargetGUID))
return false;
if(( m_targetMask & ( TARGET_FLAG_ITEM | TARGET_FLAG_TRADE_ITEM )) && caster->GetTypeId() == TYPEID_PLAYER)
- if(!readGUID(*data, m_itemTargetGUID))
+ if(!data->readPackGUID(m_itemTargetGUID))
return false;
/*if( m_targetMask & TARGET_FLAG_SOURCE_LOCATION )
@@ -219,7 +218,7 @@ bool SpellCastTargets::read ( WorldPacket * data, Unit *caster )
}
if( m_targetMask & (TARGET_FLAG_CORPSE | TARGET_FLAG_PVP_CORPSE ) )
- if(!readGUID(*data, m_CorpseTargetGUID))
+ if(!data->readPackGUID(m_CorpseTargetGUID))
return false;
// find real units/GOs
@@ -231,7 +230,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_CORPSE | TARGET_FLAG_UNK2 ) )
+ 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)
{
@@ -351,6 +350,7 @@ 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
@@ -359,6 +359,7 @@ 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
@@ -507,6 +508,8 @@ void Spell::FillTargetMap()
case SPELL_EFFECT_CREATE_ITEM:
case SPELL_EFFECT_TRIGGER_SPELL:
case SPELL_EFFECT_SKILL_STEP:
+ case SPELL_EFFECT_PROFICIENCY:
+ case SPELL_EFFECT_SUMMON_OBJECT_WILD:
case SPELL_EFFECT_SELF_RESURRECT:
case SPELL_EFFECT_REPUTATION:
case SPELL_EFFECT_LEARN_SPELL:
@@ -539,6 +542,7 @@ 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);
@@ -552,6 +556,7 @@ 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;*/
@@ -1109,6 +1114,17 @@ 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 (unit->GetCharmerOrOwnerGUID() != m_caster->GetGUID())
@@ -1328,6 +1344,16 @@ 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;
@@ -2223,6 +2249,14 @@ 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();
@@ -2652,7 +2686,7 @@ void Spell::finish(bool ok)
{
SpellEntry const *auraSpellInfo = (*i)->GetSpellProto();
uint32 auraSpellIdx = (*i)->GetEffIndex();
- if (IsAffectedBy(auraSpellInfo, auraSpellIdx))
+ if (IsAffectedByAura((*i)))
{
for(std::list<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin();ihit != m_UniqueTargetInfo.end();++ihit)
if( ihit->effectMask & (1<<auraSpellIdx) )
@@ -2708,9 +2742,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:
@@ -2751,18 +2785,11 @@ 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()
@@ -2776,6 +2803,9 @@ 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));
@@ -2785,14 +2815,32 @@ void Spell::SendSpellStart()
data.append(m_caster->GetPackGUID());
data.append(m_caster->GetPackGUID());
- 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);
+ data << uint8(m_cast_count); // pending spell cast?
+ data << uint32(m_spellInfo->Id); // spellId
+ data << uint32(castFlags); // cast flags
+ data << uint32(m_timer); // delay?
m_targets.write(&data);
- if( castFlags & CAST_FLAG_AMMO )
+ 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 )
WriteAmmoToPacket(&data);
m_caster->SendMessageToSet(&data, true);
@@ -2812,6 +2860,13 @@ 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());
@@ -2819,17 +2874,53 @@ void Spell::SendSpellGo()
data.append(m_caster->GetPackGUID());
data.append(m_caster->GetPackGUID());
- data << uint32(m_spellInfo->Id);
- data << uint16(castFlags);
+ data << uint8(m_cast_count); // pending spell cast?
+ data << uint32(m_spellInfo->Id); // spellId
+ data << uint32(castFlags); // cast flags
data << uint32(getMSTime()); // timestamp
WriteSpellGoTargets(&data);
m_targets.write(&data);
- if( castFlags & CAST_FLAG_AMMO )
+ 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 )
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);
}
@@ -2957,30 +3048,19 @@ 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())
@@ -2999,6 +3079,13 @@ 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;
}
@@ -3012,13 +3099,16 @@ void Spell::SendInterrupted(uint8 result)
{
WorldPacket data(SMSG_SPELL_FAILURE, (8+4+1));
data.append(m_caster->GetPackGUID());
- data << m_spellInfo->Id;
- data << result;
+ data << uint8(m_cast_count);
+ data << uint32(m_spellInfo->Id);
+ data << uint8(result);
m_caster->SendMessageToSet(&data, true);
data.Initialize(SMSG_SPELL_FAILED_OTHER, (8+4));
data.append(m_caster->GetPackGUID());
- data << m_spellInfo->Id;
+ data << uint8(m_cast_count);
+ data << uint32(m_spellInfo->Id);
+ data << uint8(result);
m_caster->SendMessageToSet(&data, true);
}
@@ -3086,10 +3176,19 @@ void Spell::SendChannelStart(uint32 duration)
void Spell::SendResurrectRequest(Player* target)
{
- WorldPacket data(SMSG_RESURRECT_REQUEST, (8+4+2+4));
- data << m_caster->GetGUID();
- data << uint32(1) << uint16(0) << uint32(1);
+ // 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);
+
+ data << sentName;
+ data << uint8(0);
+ data << uint8(m_caster->GetTypeId()==TYPEID_PLAYER ?0:1);
target->GetSession()->SendPacket(&data);
}
@@ -3186,6 +3285,12 @@ 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
@@ -3193,6 +3298,116 @@ 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.
@@ -3201,11 +3416,9 @@ void Spell::TakeReagents()
if (m_caster->GetTypeId() != TYPEID_PLAYER)
return;
- 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;
+ if (p_caster->CanNoReagentCast(m_spellInfo))
+ return;
for(uint32 x=0;x<8;x++)
{
@@ -3329,12 +3542,25 @@ uint8 Spell::CanCast(bool strict)
// for now, ignore triggered spells
if( strict && !m_IsTriggeredSpell)
{
- // Cannot be used in this stance/form
- if(uint8 shapeError = GetErrorAtShapeshiftedCast(m_spellInfo, m_caster->m_form))
- return shapeError;
+ 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;
- 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
@@ -3444,8 +3670,12 @@ uint8 Spell::CanCast(bool strict)
if( m_spellInfo->AttributesEx2 == 0x100000 && (m_spellInfo->AttributesEx & 0x200) == 0x200 && target->HasInArc(M_PI, m_caster)
&& (m_spellInfo->SpellFamilyName != SPELLFAMILY_DRUID || m_spellInfo->SpellFamilyFlags != 0x0000000000020000LL))
{
- SendInterrupted(2);
- return SPELL_FAILED_NOT_BEHIND;
+ //Exclusion for Pounce: Facing Limitation was removed in 2.0.1, but it still uses the same, old Ex-Flags
+ if( m_spellInfo->SpellFamilyName != SPELLFAMILY_DRUID || m_spellInfo->SpellFamilyFlags != 0x0000000000020000LL )
+ {
+ SendInterrupted(2);
+ return SPELL_FAILED_NOT_BEHIND;
+ }
}
//Target must be facing you.
@@ -3671,7 +3901,7 @@ uint8 Spell::CanCast(bool strict)
case SPELL_EFFECT_SCHOOL_DAMAGE:
{
// Hammer of Wrath
- if(m_spellInfo->SpellVisual == 7250)
+ if(m_spellInfo->SpellVisual[0] == 7250)
{
if (!m_targets.getUnitTarget())
return SPELL_FAILED_BAD_IMPLICIT_TARGETS;
@@ -3696,15 +3926,9 @@ 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:
@@ -3719,15 +3943,9 @@ 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:
@@ -3830,27 +4048,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 < 5; ++it)
+ for(int it = 0; it < 8; ++it)
{
- switch(lockInfo->keytype[it])
+ switch(lockInfo->Type[it])
{
case LOCK_KEY_NONE:
break;
case LOCK_KEY_ITEM:
{
- if(lockInfo->key[it])
+ if(lockInfo->Index[it])
{
- if(m_CastItem && m_CastItem->GetEntry()==lockInfo->key[it])
+ if(m_CastItem && m_CastItem->GetEntry()==lockInfo->Index[it])
ok_key =true;
break;
}
}
case LOCK_KEY_SKILL:
{
- if(uint32(m_spellInfo->EffectMiscValue[i])!=lockInfo->key[it])
+ if(uint32(m_spellInfo->EffectMiscValue[i])!=lockInfo->Index[it])
break;
- switch(lockInfo->key[it])
+ switch(lockInfo->Index[it])
{
case LOCKTYPE_HERBALISM:
if(((Player*)m_caster)->HasSkill(SKILL_HERBALISM))
@@ -3908,9 +4126,9 @@ uint8 Spell::CanCast(bool strict)
{
// check for lock - key pair
bool ok = false;
- for(int it = 0; it < 5; ++it)
+ for(int it = 0; it < 8; ++it)
{
- if(lockInfo->keytype[it]==LOCK_KEY_ITEM && lockInfo->key[it] && m_CastItem && m_CastItem->GetEntry()==lockInfo->key[it])
+ if(lockInfo->Type[it]==LOCK_KEY_ITEM && lockInfo->Index[it] && m_CastItem && m_CastItem->GetEntry()==lockInfo->Index[it])
{
// if so, we're good to go
ok = true;
@@ -3921,9 +4139,9 @@ uint8 Spell::CanCast(bool strict)
break;
if (m_spellInfo->EffectMiscValue[i] == LOCKTYPE_PICKLOCK)
- ReqValue = lockInfo->requiredlockskill;
+ ReqValue = lockInfo->Skill[1];
else
- ReqValue = lockInfo->requiredminingskill;
+ ReqValue = lockInfo->Skill[0];
}
// skill doesn't meet the required value
@@ -3972,7 +4190,6 @@ 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:
{
@@ -4129,7 +4346,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_FLIGHT_EPIC || form == FORM_MOONKIN || form == FORM_METAMORPHOSIS )
return SPELL_FAILED_NOT_SHAPESHIFT;
break;
@@ -4151,8 +4368,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)
{
- if( !((Player*)m_caster)->isGameMaster() &&
- GetVirtualMapForMapAndZone(m_caster->GetMapId(),m_caster->GetZoneId()) != 530)
+ 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)))
return SPELL_FAILED_NOT_HERE;
}
@@ -4467,9 +4684,12 @@ 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;
@@ -4514,6 +4734,11 @@ 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)
@@ -4641,8 +4866,7 @@ uint8 Spell::CheckItems()
focusObject = ok; // game object found in range
}
- if (!(m_spellInfo->AttributesEx5 & SPELL_ATTR_EX5_NO_REAGENT_WHILE_PREP &&
- m_caster->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PREPARATION)))
+ if (!p_caster->CanNoReagentCast(m_spellInfo))
{
for(uint32 i=0;i<8;i++)
{
@@ -4810,13 +5034,36 @@ 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_PROSPECT_NEED_MORE;
+ return SPELL_FAILED_NEED_MORE_ITEMS;
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:
{
@@ -4989,9 +5236,9 @@ void Spell::UpdatePointers()
m_targets.Update(m_caster);
}
-bool Spell::IsAffectedBy(SpellEntry const *spellInfo, uint32 effectId)
+bool Spell::IsAffectedByAura(Aura *aura)
{
- return spellmgr.IsAffectedBySpell(m_spellInfo,spellInfo->Id,effectId,spellInfo->EffectItemType[effectId]);
+ return spellmgr.IsAffectedByMod(m_spellInfo, aura->getAuraSpellMod());
}
bool Spell::CheckTargetCreatureType(Unit* target) const
diff --git a/src/game/Spell.h b/src/game/Spell.h
index 17a103ad0c5..588d5cf01a8 100644
--- a/src/game/Spell.h
+++ b/src/game/Spell.h
@@ -47,26 +47,51 @@ 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, // ?
+ TARGET_FLAG_OBJECT_UNK = 0x00000080, // used in 7 spells only
+ TARGET_FLAG_UNIT_UNK = 0x00000100, // looks like self target (480 spells)
TARGET_FLAG_PVP_CORPSE = 0x00000200, // pguid
- 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
+ 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
};
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,
- CAST_FLAG_UNKNOWN3 = 0x00000100
+ 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
};
enum SpellRangeFlag
@@ -275,6 +300,7 @@ 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);
@@ -292,6 +318,7 @@ 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);
@@ -318,6 +345,8 @@ 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();
@@ -328,6 +357,8 @@ 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();
@@ -386,6 +417,7 @@ 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; }
@@ -422,7 +454,7 @@ class Spell
void UpdatePointers(); // must be used at call Spell code after time delay (non triggered spell cast/update spell call/etc)
- bool IsAffectedBy(SpellEntry const *spellInfo, uint32 effectId);
+ bool IsAffectedByAura(Aura *aura);
bool CheckTargetCreatureType(Unit* target) const;
@@ -449,6 +481,7 @@ 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 cf628515925..59bb8128e11 100644
--- a/src/game/SpellAuraDefines.h
+++ b/src/game/SpellAuraDefines.h
@@ -20,14 +20,19 @@
#ifndef TRINITY_SPELLAURADEFINES_H
#define TRINITY_SPELLAURADEFINES_H
-#define MAX_AURAS 56
-#define MAX_POSITIVE_AURAS 40
+#define MAX_AURAS 64 // client support up to 255, but it will cause problems with group auras updating
enum AURA_FLAGS
{
- AFLAG_NEGATIVE = 0x09,
- AFLAG_POSITIVE = 0x1F,
- AFLAG_MASK = 0xFF
+ 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
};
//m_schoolAbsorb
@@ -233,7 +238,7 @@ enum AuraType
SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED = 191,
SPELL_AURA_HASTE_MELEE = 192,
SPELL_AURA_MELEE_SLOW = 193,
- SPELL_AURA_MOD_DEPRICATED_1 = 194, // not used now, old SPELL_AURA_MOD_SPELL_DAMAGE_OF_INTELLECT
+ SPELL_AURA_MOD_IGNORE_ABSORB_SCHOOL = 194,
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,
@@ -275,7 +280,7 @@ enum AuraType
SPELL_AURA_233 = 233,
SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK = 234,
SPELL_AURA_MOD_DISPEL_RESIST = 235,
- SPELL_AURA_236 = 236,
+ SPELL_AURA_CONTROL_VEHICLE = 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,
@@ -285,28 +290,51 @@ enum AuraType
SPELL_AURA_243 = 243,
SPELL_AURA_COMPREHEND_LANGUAGE = 244,
SPELL_AURA_MOD_DURATION_OF_MAGIC_EFFECTS = 245,
- SPELL_AURA_246 = 246,
+ SPELL_AURA_MOD_DURATION_OF_EFFECTS_BY_DISPEL = 246,
SPELL_AURA_247 = 247,
SPELL_AURA_MOD_COMBAT_RESULT_CHANCE = 248,
- SPELL_AURA_249 = 249,
+ SPELL_AURA_CONVERT_RUNE = 249,
SPELL_AURA_MOD_INCREASE_HEALTH_2 = 250,
SPELL_AURA_MOD_ENEMY_DODGE = 251,
SPELL_AURA_252 = 252,
- SPELL_AURA_253 = 253,
- SPELL_AURA_254 = 254,
- SPELL_AURA_255 = 255,
- SPELL_AURA_256 = 256,
- SPELL_AURA_257 = 257,
+ 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_258 = 258,
SPELL_AURA_259 = 259,
SPELL_AURA_260 = 260,
SPELL_AURA_261 = 261,
- TOTAL_AURAS=262
+ 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
};
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 d22266f2e15..38ca4e91d4c 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::HandleNoImmediateEffect, //109 SPELL_AURA_ADD_TARGET_TRIGGER
+ &Aura::HandleAddTargetTrigger, //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 (by default intellect, dependent from SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT)
+ &Aura::HandleModSpellDamagePercentFromStat, //174 SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT implemented in Unit::SpellBaseDamageBonus
&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_DEPRICATED_1 not used now (old SPELL_AURA_MOD_SPELL_DAMAGE_OF_INTELLECT)
+ &Aura::HandleUnused, //194 SPELL_AURA_MOD_IGNORE_ABSORB_SCHOOL
&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::HandleNULL, //220 SPELL_AURA_MOD_RATING_FROM_STAT
+ &Aura::HandleModRatingFromStat, //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::HandleUnused, //236 unused
+ &Aura::HandleAuraControlVehicle, //236 SPELL_AURA_CONTROL_VEHICLE
&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,22 +300,44 @@ 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::HandleUnused, //246 unused
+ &Aura::HandleNoImmediateEffect, //246 SPELL_AURA_MOD_DURATION_OF_EFFECTS_BY_DISPEL
&Aura::HandleUnused, //247 unused
&Aura::HandleNoImmediateEffect, //248 SPELL_AURA_MOD_COMBAT_RESULT_CHANCE implemented in Unit::RollMeleeOutcomeAgainst
- &Aura::HandleNULL, //249
+ &Aura::HandleAuraConvertRune, //249 SPELL_AURA_CONVERT_RUNE
&Aura::HandleAuraModIncreaseHealth, //250 SPELL_AURA_MOD_INCREASE_HEALTH_2
&Aura::HandleNULL, //251 SPELL_AURA_MOD_ENEMY_DODGE
- &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::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::Aura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster, Item* castItem) :
@@ -446,6 +468,11 @@ 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;
@@ -612,8 +639,8 @@ void AreaAura::Update(uint32 diff)
switch(m_areaAuraType)
{
- case AREA_AURA_PARTY:
- caster->GetPartyMember(targets, m_radius);
+ case AREA_AURA_RAID:
+ caster->GetRaidMember(targets, m_radius);
break;
case AREA_AURA_FRIEND:
{
@@ -696,6 +723,24 @@ 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() )
@@ -746,47 +791,6 @@ 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())
@@ -852,22 +856,13 @@ void Aura::_AddAura()
{
if(!secondaura) // new slot need
{
- if (IsPositive()) // empty positive slot
+ if(m_target->GetVisibleAurasCount() < MAX_AURAS)
{
- for (uint8 i = 0; i < MAX_POSITIVE_AURAS; i++)
+ Unit::VisibleAuraMap const *visibleAuras = m_target->GetVisibleAuras();
+ for(uint8 i = 0; i < MAX_AURAS; ++i)
{
- 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)
+ Unit::VisibleAuraMap::const_iterator itr = visibleAuras->find(i);
+ if(itr == visibleAuras->end())
{
slot = i;
break;
@@ -880,11 +875,12 @@ void Aura::_AddAura()
// Not update fields for not first spell's aura, all data already in fields
if(slot < MAX_AURAS) // slot found
{
- SetAura(slot, false);
- SetAuraFlag(slot, true);
- SetAuraLevel(slot,caster ? caster->getLevel() : sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL));
+ 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));
UpdateAuraCharges();
-
+ SendAuraUpdate(false);
+
// update for out of range group members
m_target->UpdateAuraForGroup(slot, true);
}
@@ -942,7 +938,7 @@ void Aura::_RemoveAura()
if(slot >= MAX_AURAS) // slot not set
return;
- if(m_target->GetUInt32Value((uint16)(UNIT_FIELD_AURA + slot)) == 0)
+ if(m_target->GetVisibleAura(slot) == 0)
return;
bool samespell = false;
@@ -967,11 +963,12 @@ void Aura::_RemoveAura()
// only remove icon when the last aura of the spell is removed (current aura already removed from list)
if (!samespell)
{
- SetAura(slot, true);
- SetAuraFlag(slot, false);
- SetAuraLevel(slot,caster ? caster->getLevel() : sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL));
+ SetAura(true);
+ SetAuraFlags(AFLAG_NONE);
+ SetAuraLevel(0);
+ SetAuraCharges(0);
+ SendAuraUpdate(true);
- SetAuraApplication(slot, 0);
// update for out of range group members
m_target->UpdateAuraForGroup(slot, false);
@@ -1010,40 +1007,36 @@ void Aura::_RemoveAura()
}
}
-void Aura::SetAuraFlag(uint32 slot, bool add)
+void Aura::SendAuraUpdate(bool 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)
+ WorldPacket data(SMSG_AURA_UPDATE);
+ data.append(m_target->GetPackGUID());
+ data << uint8(GetAuraSlot());
+ data << uint32(remove ? 0 : GetId());
+
+ if(remove)
{
- if (IsPositive())
- val |= ((uint32)AFLAG_POSITIVE << byte);
- else
- val |= ((uint32)AFLAG_NEGATIVE << byte);
+ m_target->SendMessageToSet(&data, true);
+ return;
}
- m_target->SetUInt32Value(UNIT_FIELD_AURAFLAGS + index, val);
-}
-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);
-}
+ uint8 auraFlags = GetAuraFlags();
+ data << uint8(auraFlags);
+ data << uint8(GetAuraLevel());
+ data << uint8(m_procCharges >= 0 ? m_procCharges : 0);
-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);
+ if(!(auraFlags & AFLAG_NOT_CASTER))
+ {
+ data << uint8(0); // pguid
+ }
+
+ if(auraFlags & AFLAG_DURATION)
+ {
+ data << uint32(GetAuraMaxDuration());
+ data << uint32(GetAuraDuration());
+ }
+
+ m_target->SendMessageToSet(&data, true);
}
void Aura::UpdateSlotCounterAndDuration()
@@ -1056,10 +1049,26 @@ void Aura::UpdateSlotCounterAndDuration()
// Charge = 0; Stack >= 0
// Charge = 1; Stack >= 0
// Charge > 1; Stack = 0
+ //SetAuraDuration(GetAuraDuration());
if(m_procCharges < 2)
- SetAuraApplication(slot, m_stackAmount-1);
+ {
+ SetAuraCharges(m_stackAmount-1);
+ SendAuraUpdate(false);
+ }
+}
- UpdateAuraDuration();
+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;
}
/*********************************************************/
@@ -1070,10 +1079,6 @@ 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;
@@ -1084,7 +1089,10 @@ void Aura::HandleAddModifier(bool apply, bool Real)
{
case 17941: // Shadow Trance
case 22008: // Netherwind Focus
+ case 31834: // Light's Grace
+ case 34754: // Clearcasting
case 34936: // Backlash
+ case 48108: // Hot Streak
m_procCharges = 1;
break;
}
@@ -1094,15 +1102,25 @@ 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;
- uint64 spellAffectMask = spellmgr.GetSpellAffectMask(GetId(), m_effIndex);
-
- if (spellAffectMask)
- mod->mask = spellAffectMask;
+ uint32 const *ptr;
+ SpellAffectEntry const *spellAffect = spellmgr.GetSpellAffect(GetId(), m_effIndex);
+ if (spellAffect)
+ ptr = &spellAffect->SpellClassMask[0];
else
- mod->mask = spellInfo->EffectItemType[m_effIndex];
+ {
+ 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];
if (m_procCharges > 0)
mod->charges = m_procCharges;
@@ -1117,7 +1135,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(spellInfo->SpellFamilyName==SPELLFAMILY_WARRIOR && (spellFamilyMask & 0x0000100000000000LL))
+ if(m_spellProto->SpellFamilyName==SPELLFAMILY_WARRIOR && (spellFamilyMask & 0x0000100000000000LL))
{
m_target->RemoveAurasDueToSpell(45471);
@@ -1125,7 +1143,42 @@ 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();
@@ -2103,10 +2156,8 @@ 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->charges = 0;
+ mod->mask2= 0LL;
m_spellmod = mod;
}
@@ -2129,10 +2180,8 @@ 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->charges = 0;
+ mod->mask2= 0LL;
m_spellmod = mod;
}
@@ -2154,18 +2203,17 @@ 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;
}
@@ -2212,6 +2260,8 @@ void Aura::HandleAuraPeriodicDummy(bool apply, bool Real)
if(!Real)
return;
+ Unit* caster = GetCaster();
+
SpellEntry const*spell = GetSpellProto();
switch( spell->SpellFamilyName)
{
@@ -2235,6 +2285,16 @@ 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;
}
}
@@ -2407,6 +2467,9 @@ void Aura::HandleAuraModShapeshift(bool apply, bool Real)
else
modelid = 21244;
break;
+ case FORM_METAMORPHOSIS:
+ modelid = 25277;
+ break;
case FORM_AMBIENT:
case FORM_SHADOW:
case FORM_STEALTH:
@@ -2877,6 +2940,36 @@ 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)
@@ -2887,16 +2980,33 @@ void Aura::HandleModPossessPet(bool apply, bool Real)
Unit* caster = GetCaster();
if(!caster || caster->GetTypeId() != TYPEID_PLAYER)
return;
- if(caster->GetPet() != m_target)
+
+ Pet *pet = caster->GetPet();
+ if(!pet || pet != 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);
}
}
@@ -3003,6 +3113,7 @@ void Aura::HandleModCharm(bool apply, bool Real)
{
WorldPacket data(SMSG_PET_SPELLS, 8);
data << uint64(0);
+ data << uint32(0);
((Player*)caster)->GetSession()->SendPacket(&data);
}
}
@@ -3951,7 +4062,7 @@ void Aura::HandlePeriodicDamage(bool apply, bool Real)
case SPELLFAMILY_ROGUE:
{
// Deadly poison aura state
- if((m_spellProto->SpellFamilyFlags & 0x10000) && m_spellProto->SpellVisual==5100)
+ if((m_spellProto->SpellFamilyFlags & 0x10000) && m_spellProto->SpellVisual[0]==5100)
{
if(apply)
m_target->ModifyAuraState(AURA_STATE_DEADLY_POISON,true);
@@ -3963,7 +4074,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==5100)
+ if(itr_spell && itr_spell->SpellFamilyName==SPELLFAMILY_ROGUE && (itr_spell->SpellFamilyFlags & 0x10000) && itr_spell->SpellVisual[0]==5100)
{
found = true;
break;
@@ -4536,6 +4647,11 @@ 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 ***/
/********************************/
@@ -4609,13 +4725,28 @@ void Aura::HandleAuraModCritPercent(bool apply, bool Real)
void Aura::HandleModHitChance(bool apply, bool Real)
{
- m_target->m_modMeleeHitChance += apply ? GetModifierValue() : -GetModifierValue();
- m_target->m_modRangedHitChance += apply ? GetModifierValue() : -GetModifierValue();
+ 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);
+ }
}
void Aura::HandleModSpellHitChance(bool apply, bool Real)
{
- m_target->m_modSpellHitChance += apply ? GetModifierValue(): -GetModifierValue();
+ if(m_target->GetTypeId() == TYPEID_PLAYER)
+ {
+ ((Player*)m_target)->UpdateSpellHitChances();
+ }
+ else
+ {
+ m_target->m_modSpellHitChance += apply ? m_modifier.m_amount: (-m_modifier.m_amount);
+ }
}
void Aura::HandleModSpellCritChance(bool apply, bool Real)
@@ -4740,15 +4871,21 @@ void Aura::HandleAuraModRangedAttackPowerOfStatPercent(bool apply, bool Real)
if(m_target->GetTypeId() == TYPEID_PLAYER && (m_target->getClassMask() & CLASSMASK_WAND_USERS)!=0)
return;
- 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!");
+ // 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)
return;
- }
// Recalculate bonus
- ((Player*)m_target)->UpdateAttackPowerAndDamage(true);
+ ((Player*)m_target)->UpdateAttackPowerAndDamage(false);
}
/********************************/
@@ -4932,6 +5069,28 @@ 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 ***/
/*********************************************************/
@@ -4988,6 +5147,10 @@ void Aura::HandleShapeshiftBoosts(bool apply)
spellId = 40122;
spellId2 = 40121;
break;
+ case FORM_METAMORPHOSIS:
+ spellId = 54817;
+ spellId2 = 54879;
+ break;
case FORM_SPIRITOFREDEMPTION:
spellId = 27792;
spellId2 = 27795; // must be second, this important at aura remove to prevent to early iterator invalidation.
@@ -5153,6 +5316,20 @@ 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)
@@ -5462,6 +5639,7 @@ 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
@@ -5625,7 +5803,7 @@ void Aura::PeriodicTick()
return;
// heal for caster damage (must be alive)
- if(m_target != pCaster && GetSpellProto()->SpellVisual==163 && !pCaster->isAlive())
+ if(m_target != pCaster && GetSpellProto()->SpellVisual[0]==163 && !pCaster->isAlive())
return;
// ignore non positive values (can be result apply spellmods to aura damage
@@ -5652,6 +5830,7 @@ 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);
@@ -5671,7 +5850,7 @@ void Aura::PeriodicTick()
bool haveCastItem = GetCastItemGUID()!=0;
// heal for caster damage
- if(m_target!=pCaster && spellProto->SpellVisual==163)
+ if(m_target!=pCaster && spellProto->SpellVisual[0]==163)
{
uint32 dmg = spellProto->manaPerSecond;
if(pCaster->GetHealth() <= dmg && pCaster->GetTypeId()==TYPEID_PLAYER)
@@ -5892,114 +6071,136 @@ void Aura::PeriodicTick()
void Aura::PeriodicDummyTick()
{
+ Unit *caster = GetCaster();
SpellEntry const* spell = GetSpellProto();
- 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)
+ 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:
{
- if ((*i)->GetId() == GetId())
- {
- // 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;
- }
+ if (m_target->GetTypeId() != TYPEID_PLAYER)
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)
+ // 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())
{
- 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
+ // 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;
- break;
+ ((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;
+ }
+ ((Player*)m_target)->UpdateManaRegen();
+ return;*/
}
- ((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;
-// // 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)
+
+ // 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();
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
@@ -6012,6 +6213,8 @@ 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)
@@ -6060,6 +6263,8 @@ 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
@@ -6126,14 +6331,179 @@ 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;
-// // Drink Coffee
-// case 49472: break;
+// case 49555: break; // Corpse Explode
+// case 49592: break; // Temporal Rift
+// case 49957: break; // Cutting Laser
+// case 50085: break; // Slow Fall
// // 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;
}
@@ -6199,14 +6569,61 @@ void Aura::HandleArenaPreparation(bool apply, bool Real)
m_target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PREPARATION);
}
-void Aura::HandleModAttackerSpellHitChance(bool apply, bool Real)
+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)
+{
+ 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 1e9a8bd8c63..99c170d1139 100644
--- a/src/game/SpellAuras.h
+++ b/src/game/SpellAuras.h
@@ -100,6 +100,7 @@ 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);
@@ -184,10 +185,12 @@ 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);
@@ -197,6 +200,7 @@ 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);
@@ -209,6 +213,9 @@ 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();
@@ -231,6 +238,8 @@ 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();
@@ -250,13 +259,19 @@ 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 (slot < MAX_AURAS && m_procCharges >= 1 && GetSpellProto()->StackAmount==0)
- SetAuraApplication(slot, m_procCharges - 1);
+ if (m_auraSlot < MAX_AURAS && m_procCharges >= 1 && GetSpellProto()->StackAmount==0)
+ SendAuraUpdate(false);
}
bool IsPositive() { return m_positive; }
@@ -300,6 +315,9 @@ 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:
@@ -321,6 +339,8 @@ 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;
@@ -341,10 +361,6 @@ 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 85984eeaa3d..af17bf0f97e 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::EffectUnused, // 65 SPELL_EFFECT_HEALTH_FUNNEL unused
- &Spell::EffectUnused, // 66 SPELL_EFFECT_POWER_FUNNEL unused
+ &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::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::EffectSummonPossessed, // 73 SPELL_EFFECT_SUMMON_POSSESSED
- &Spell::EffectSummonTotem, // 74 SPELL_EFFECT_SUMMON_TOTEM
+ &Spell::EffectUnused, // 73 SPELL_EFFECT_UNTRAIN_TALENTS
+ &Spell::EffectApplyGlyph, // 74 SPELL_EFFECT_APPLY_GLYPH
&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::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, // 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::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
+ &Spell::EffectNULL, //132 SPELL_EFFECT_PLAY_MUSIC sound id in misc value (SoundEntries.dbc)
&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_139 unused
+ &Spell::EffectUnused, //139 SPELL_EFFECT_CLEAR_QUEST (misc - is quest ID)
&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::EffectUnused, //146 SPELL_EFFECT_146 unused
+ &Spell::EffectActivateRune, //146 SPELL_EFFECT_ACTIVATE_RUNE
&Spell::EffectQuestFail, //147 SPELL_EFFECT_QUEST_FAIL quest fail
&Spell::EffectUnused, //148 SPELL_EFFECT_148 unused
&Spell::EffectNULL, //149 SPELL_EFFECT_149 swoop
@@ -217,6 +217,12 @@ 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*/)
@@ -339,6 +345,13 @@ void Spell::SpellDamageSchoolDmg(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:
{
@@ -388,6 +401,12 @@ void Spell::SpellDamageSchoolDmg(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:
@@ -397,7 +416,7 @@ void Spell::SpellDamageSchoolDmg(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.25);
+ damage += int32(damage*0.25f);
}
// Conflagrate - consumes immolate
@@ -420,11 +439,13 @@ void Spell::SpellDamageSchoolDmg(uint32 effect_idx)
case SPELLFAMILY_DRUID:
{
// Ferocious Bite
- if((m_spellInfo->SpellFamilyFlags & 0x000800000) && m_spellInfo->SpellVisual==6587)
+ if(m_caster->GetTypeId()==TYPEID_PLAYER && (m_spellInfo->SpellFamilyFlags & 0x000800000) && m_spellInfo->SpellVisual[0]==6587)
{
- // 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];
+ // 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];
damage += int32(m_caster->GetPower(POWER_ENERGY) * multiple);
+ damage += int32(((Player*)m_caster)->GetComboPoints() * ap * 7 / 100);
m_caster->SetPower(POWER_ENERGY,0);
}
// Rake
@@ -500,7 +521,7 @@ void Spell::SpellDamageSchoolDmg(uint32 effect_idx)
{
// Deadly poison (only attacker applied)
if( (*itr)->GetSpellProto()->SpellFamilyName==SPELLFAMILY_ROGUE && ((*itr)->GetSpellProto()->SpellFamilyFlags & 0x10000) &&
- (*itr)->GetSpellProto()->SpellVisual==5100 && (*itr)->GetCasterGUID()==m_caster->GetGUID() )
+ (*itr)->GetSpellProto()->SpellVisual[0]==5100 && (*itr)->GetCasterGUID()==m_caster->GetGUID() )
{
--combo;
++doses;
@@ -526,26 +547,47 @@ void Spell::SpellDamageSchoolDmg(uint32 effect_idx)
{
if(uint32 combo = ((Player*)m_caster)->GetComboPoints())
{
- damage += int32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK) * combo * 0.03f);
+ float ap = m_caster->GetTotalAttackPowerValue(BASE_ATTACK);
+ damage += irand(int32(ap * combo * 0.03f), int32(ap * combo * 0.07f));
// 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==342)
+ 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)
{
- damage += int32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK)*0.2);
+ damage += int32(m_caster->GetTotalAttackPowerValue(BASE_ATTACK)*0.2f);
}
// Arcane Shot
else if((m_spellInfo->SpellFamilyFlags & 0x00000800) && m_spellInfo->maxLevel > 0)
{
- damage += int32(m_caster->GetTotalAttackPowerValue(RANGED_ATTACK)*0.15);
+ damage += int32(m_caster->GetTotalAttackPowerValue(RANGED_ATTACK)*0.15f);
}
// Steady Shot
else if(m_spellInfo->SpellFamilyFlags & 0x100000000LL)
@@ -570,16 +612,16 @@ void Spell::SpellDamageSchoolDmg(uint32 effect_idx)
if(found)
damage += m_spellInfo->EffectBasePoints[1];
}
- //Explosive Trap Effect
+ // Explosive Trap Effect
else if(m_spellInfo->SpellFamilyFlags & 0x00000004)
{
- damage += int32(m_caster->GetTotalAttackPowerValue(RANGED_ATTACK)*0.1);
+ damage += int32(m_caster->GetTotalAttackPowerValue(RANGED_ATTACK)*0.1f);
}
break;
}
case SPELLFAMILY_PALADIN:
{
- //Judgement of Vengeance
+ // Judgement of Vengeance
if((m_spellInfo->SpellFamilyFlags & 0x800000000LL) && m_spellInfo->SpellIconID==2292)
{
uint32 stacks = 0;
@@ -593,6 +635,38 @@ void Spell::SpellDamageSchoolDmg(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;
}
}
@@ -1192,6 +1266,12 @@ 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
@@ -1265,7 +1345,7 @@ void Spell::EffectDummy(uint32 i)
break;
case SPELLFAMILY_WARRIOR:
// Charge
- if(m_spellInfo->SpellFamilyFlags & 0x1 && m_spellInfo->SpellVisual == 867)
+ if(m_spellInfo->SpellFamilyFlags & 0x1 && m_spellInfo->SpellVisual[0] == 867)
{
int32 chargeBasePoints0 = damage;
m_caster->CastCustomSpell(m_caster,34846,&chargeBasePoints0,NULL,NULL,true);
@@ -1529,10 +1609,8 @@ 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->charges = 0;
+ mod->mask2= 0LL;
((Player*)m_caster)->AddSpellMod(mod, true);
m_caster->CastSpell(unitTarget,spell_proto,true,NULL);
@@ -2897,10 +2975,10 @@ void Spell::EffectOpenLock(uint32 /*i*/)
}
// check key
- for(int i = 0; i < 5; ++i)
+ for(int i = 0; i < 8; ++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])
+ // 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])
{
SendLoot(guid, loottype);
return;
@@ -2918,9 +2996,9 @@ void Spell::EffectOpenLock(uint32 /*i*/)
// skill bonus provided by casting spell (mostly item spells)
uint32 spellSkillBonus = uint32(damage/*m_currentBasePoints[0]+1*/);
- uint32 reqSkillValue = lockInfo->requiredminingskill;
+ uint32 reqSkillValue = lockInfo->Skill[0];
- if(lockInfo->requiredlockskill) // required pick lock skill applying
+ if(lockInfo->Skill[1]) // required pick lock skill applying
{
if(SkillId != SKILL_LOCKPICKING) // wrong skill (cheating?)
{
@@ -2928,7 +3006,7 @@ void Spell::EffectOpenLock(uint32 /*i*/)
return;
}
- reqSkillValue = lockInfo->requiredlockskill;
+ reqSkillValue = lockInfo->Skill[1];
}
else if(SkillId == SKILL_LOCKPICKING) // apply picklock skill to wrong target
{
@@ -3158,7 +3236,7 @@ void Spell::EffectSummon(uint32 i)
Pet* spawnCreature = new Pet(SUMMON_PET);
spawnCreature->setActive(m_caster->isActive());
- if(spawnCreature->LoadPetFromDB(m_caster,pet_entry))
+ if(m_caster->GetTypeId()==TYPEID_PLAYER && spawnCreature->LoadPetFromDB((Player*)m_caster,pet_entry))
{
// set timer for unsummon
int32 duration = GetSpellDuration(m_spellInfo);
@@ -3255,7 +3333,7 @@ void Spell::EffectLearnSpell(uint32 i)
Player *player = (Player*)unitTarget;
- uint32 spellToLearn = (m_spellInfo->Id==SPELL_ID_GENERIC_LEARN) ? damage : m_spellInfo->EffectTriggerSpell[i];
+ uint32 spellToLearn = ((m_spellInfo->Id==SPELL_ID_GENERIC_LEARN) || (m_spellInfo->Id==SPELL_ID_GENERIC_LEARN_PET)) ? 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() );
@@ -3897,13 +3975,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==215)
+ else if(m_spellInfo->SpellVisual[0]==215)
duration = 1800; // 30 mins
// some fishing pole bonuses
- else if(m_spellInfo->SpellVisual==563)
+ else if(m_spellInfo->SpellVisual[0]==563)
duration = 600; // 10 mins
// shaman rockbiter enchantments
- else if(m_spellInfo->SpellVisual==0)
+ else if(m_spellInfo->SpellVisual[0]==0)
duration = 1800; // 30 mins
else if(m_spellInfo->Id==29702)
duration = 300; // 5 mins
@@ -3966,14 +4044,16 @@ 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,creatureTarget->getLevel()-1);
+ pet->SetUInt32Value(UNIT_FIELD_LEVEL, level - 1);
// add to world
pet->GetMap()->Add((Creature*)pet);
// visual effect for levelup
- pet->SetUInt32Value(UNIT_FIELD_LEVEL,creatureTarget->getLevel());
+ pet->SetUInt32Value(UNIT_FIELD_LEVEL, level);
// caster have pet now
m_caster->SetPet(pet);
@@ -4026,7 +4106,7 @@ void Spell::EffectSummonPet(uint32 i)
NewSummon->setActive(m_caster->isActive());
// petentry==0 for hunter "call pet" (current pet summoned if any)
- if(NewSummon->LoadPetFromDB(m_caster,petentry))
+ if(m_caster->GetTypeId() == TYPEID_PLAYER && NewSummon->LoadPetFromDB((Player*)m_caster,petentry))
{
if(NewSummon->getPetType()==SUMMON_PET)
{
@@ -4111,7 +4191,8 @@ void Spell::EffectSummonPet(uint32 i)
// this enables pet details window (Shift+P)
// this enables popup window (pet dismiss, cancel), hunter pet additional flags set later
- NewSummon->SetUInt32Value(UNIT_FIELD_FLAGS,UNIT_FLAG_PVP_ATTACKABLE);
+ if(m_caster->GetTypeId() == TYPEID_PLAYER)
+ NewSummon->SetUInt32Value(UNIT_FIELD_FLAGS,UNIT_FLAG_PVP_ATTACKABLE);
NewSummon->InitStatsForLevel(petlevel);
NewSummon->InitPetCreateSpells();
@@ -4172,7 +4253,6 @@ 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);
@@ -4236,7 +4316,7 @@ void Spell::SpellDamageWeaponDmg(uint32 i)
case SPELLFAMILY_WARRIOR:
{
// Devastate bonus and sunder armor refresh
- if(m_spellInfo->SpellVisual == 671 && m_spellInfo->SpellIconID == 1508)
+ if(m_spellInfo->SpellVisual[0] == 671 && m_spellInfo->SpellIconID == 1508)
{
uint32 stack = 0;
@@ -4249,7 +4329,7 @@ void Spell::SpellDamageWeaponDmg(uint32 i)
{
int32 duration = GetSpellDuration(proto);
(*itr)->SetAuraDuration(duration);
- (*itr)->UpdateAuraDuration();
+ (*itr)->SendAuraUpdate(false);
stack = (*itr)->GetStackAmount();
break;
}
@@ -4961,9 +5041,69 @@ 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);
- if( m_spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN )
+ // 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 )
{
switch(m_spellInfo->SpellFamilyFlags)
{
@@ -5086,6 +5226,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
if(caster->GetMap()->Instanceable())
+ //if( mapid != 0 && mapid != 1 && mapid != 530 && mapid != 571 && mapid != 609)
{
SendCastResult(SPELL_FAILED_NO_DUELING); // Dueling isn't allowed here
return;
@@ -5224,6 +5365,45 @@ 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;
@@ -5292,7 +5472,9 @@ void Spell::EffectSummonTotem(uint32 i)
}
pTotem->SetUInt32Value(UNIT_CREATED_BY_SPELL,m_spellInfo->Id);
- pTotem->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_PVP_ATTACKABLE);
+
+ if(m_caster->GetTypeId() == TYPEID_PLAYER)
+ pTotem->SetFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_PVP_ATTACKABLE);
pTotem->ApplySpellImmune(m_spellInfo->Id,IMMUNITY_STATE,SPELL_AURA_MOD_FEAR,true);
pTotem->ApplySpellImmune(m_spellInfo->Id,IMMUNITY_STATE,SPELL_AURA_TRANSFORM,true);
@@ -5547,18 +5729,14 @@ void Spell::EffectAddExtraAttacks(uint32 /*i*/)
void Spell::EffectParry(uint32 /*i*/)
{
- if (unitTarget->GetTypeId() == TYPEID_PLAYER)
- {
+ if (unitTarget && unitTarget->GetTypeId() == TYPEID_PLAYER)
((Player*)unitTarget)->SetCanParry(true);
- }
}
void Spell::EffectBlock(uint32 /*i*/)
{
- if (unitTarget->GetTypeId() != TYPEID_PLAYER)
- return;
-
- ((Player*)unitTarget)->SetCanBlock(true);
+ if (unitTarget && unitTarget->GetTypeId() == TYPEID_PLAYER)
+ ((Player*)unitTarget)->SetCanBlock(true);
}
void Spell::EffectMomentMove(uint32 i)
@@ -5866,17 +6044,20 @@ void Spell::EffectSendTaxi(uint32 i)
uint32 mountid = 0;
switch(m_spellInfo->Id)
{
- case 31606: //Stormcrow Amulet
+ case 31606: //Stormcrow Amulet
mountid = 17447;
break;
- case 45071: //Quest - Sunwell Daily - Dead Scar Bombing Run
- case 45113: //Quest - Sunwell Daily - Ship Bombing Run
- case 45353: //Quest - Sunwell Daily - Ship Bombing Run Return
+ case 45071: //Quest - Sunwell Daily - Dead Scar Bombing Run
+ case 45113: //Quest - Sunwell Daily - Ship Bombing Run
+ case 45353: //Quest - Sunwell Daily - Ship Bombing Run Return
mountid = 22840;
break;
- case 34905: //Stealth Flight
+ case 34905: //Stealth Flight
mountid = 6851;
break;
+ case 53335: //Stormwind Harbor Flight - Peaceful
+ mountid = 6852;
+ break;
}
((Player*)unitTarget)->ActivateTaxiPathTo(nodes,mountid);
@@ -6108,9 +6289,9 @@ void Spell::EffectTransmitted(uint32 effIndex)
{
m_caster->SetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT,pGameObj->GetGUID());
// Orientation3
- pGameObj->SetFloatValue(GAMEOBJECT_ROTATION + 2, 0.88431775569915771 );
+ pGameObj->SetFloatValue(GAMEOBJECT_PARENTROTATION + 2, 0.88431775569915771 );
// Orientation4
- pGameObj->SetFloatValue(GAMEOBJECT_ROTATION + 3, -0.4668855369091033 );
+ pGameObj->SetFloatValue(GAMEOBJECT_PARENTROTATION + 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))
@@ -6205,6 +6386,28 @@ 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");
@@ -6352,6 +6555,31 @@ 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 9b77e19b30b..8648e7a76c6 100644
--- a/src/game/SpellHandler.cpp
+++ b/src/game/SpellHandler.cpp
@@ -38,15 +38,17 @@
void WorldSession::HandleUseItemOpcode(WorldPacket& recvPacket)
{
// TODO: add targets.read() check
- CHECK_PACKET_SIZE(recvPacket,1+1+1+1+8);
+ CHECK_PACKET_SIZE(recvPacket,1+1+1+4+8+4+1);
Player* pUser = _player;
uint8 bagIndex, slot;
- uint8 spell_count; // number of spells at item, not used
+ uint8 unk_flags; // flags (if 0x02 - some additional data are received)
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 >> spell_count >> cast_count >> item_guid;
+ recvPacket >> bagIndex >> slot >> cast_count >> spellid >> item_guid >> glyphIndex >> unk_flags;
Item *pItem = pUser->GetItemByPos(bagIndex, slot);
if(!pItem)
@@ -61,7 +63,7 @@ void WorldSession::HandleUseItemOpcode(WorldPacket& recvPacket)
return;
}
- 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());
+ 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());
ItemPrototype const *proto = pItem->GetProto();
if(!proto)
@@ -128,14 +130,15 @@ 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)
+ if((pItem->GetProto()->Spells[0].SpellId==SPELL_ID_GENERIC_LEARN) || (pItem->GetProto()->Spells[0].SpellId==SPELL_ID_GENERIC_LEARN_PET))
{
+ uint32 learn_spell_id = pItem->GetProto()->Spells[0].SpellId;
uint32 learning_spell_id = pItem->GetProto()->Spells[1].SpellId;
- SpellEntry const *spellInfo = sSpellStore.LookupEntry(SPELL_ID_GENERIC_LEARN);
+ SpellEntry const *spellInfo = sSpellStore.LookupEntry(learn_spell_id);
if(!spellInfo)
{
- sLog.outError("Item (Entry: %u) in have wrong spell id %u, ignoring ",proto->ItemId, SPELL_ID_GENERIC_LEARN);
+ sLog.outError("Item (Entry: %u) in have wrong spell id %u, ignoring ",proto->ItemId, learn_spell_id);
pUser->SendEquipError(EQUIP_ERR_NONE,pItem,NULL);
return;
}
@@ -172,7 +175,8 @@ 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_cast_count = cast_count; // set count of casts
+ spell->m_glyphIndex = glyphIndex; // glyph index
spell->prepare(&targets);
++count;
@@ -227,7 +231,7 @@ void WorldSession::HandleOpenItemOpcode(WorldPacket& recvPacket)
}
// required picklocking
- if(lockInfo->requiredlockskill || lockInfo->requiredminingskill)
+ if(lockInfo->Skill[1] || lockInfo->Skill[0])
{
pUser->SendEquipError(EQUIP_ERR_ITEM_LOCKED, pItem, NULL );
return;
@@ -281,17 +285,28 @@ void WorldSession::HandleGameObjectUseOpcode( WorldPacket & recv_data )
obj->Use(_player);
}
+void WorldSession::HandleGameobjectReportUse(WorldPacket& recvPacket)
+{
+ CHECK_PACKET_SIZE(recvPacket,8);
+
+ uint64 guid;
+ recvPacket >> guid;
+
+ sLog.outDebug( "WORLD: Recvd CMSG_GAMEOBJ_REPORT_USE Message [in game guid: %u]", GUID_LOPART(guid));
+}
+
void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket)
{
- CHECK_PACKET_SIZE(recvPacket,4+1+2);
+ CHECK_PACKET_SIZE(recvPacket,1+4+1);
uint32 spellId;
- uint8 cast_count;
- recvPacket >> spellId;
+ uint8 cast_count, unk_flags;
recvPacket >> cast_count;
+ recvPacket >> spellId;
+ recvPacket >> unk_flags; // flags (if 0x02 - some additional data are received)
- sLog.outDebug("WORLD: got cast spell packet, spellId - %u, cast_count: %u data length = %i",
- spellId, cast_count, recvPacket.size());
+ 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());
SpellEntry const *spellInfo = sSpellStore.LookupEntry(spellId );
@@ -334,9 +349,12 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket)
void WorldSession::HandleCancelCastOpcode(WorldPacket& recvPacket)
{
- CHECK_PACKET_SIZE(recvPacket,4);
+ CHECK_PACKET_SIZE(recvPacket,5);
+ // 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 e67030b77f2..12689654310 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
@@ -364,10 +364,10 @@ SpellSpecific GetSpellSpecific(uint32 spellId)
if ((spellInfo->SpellFamilyFlags & 0x00000820180400LL) && (spellInfo->AttributesEx3 & 0x200))
return SPELL_JUDGEMENT;
- for (int i = 0; i < 3; i++)
+ for (int i = 0; i < 3; i++) // TODO: fix it for WotLK!!!
{
// only paladin auras have this
- if (spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AREA_AURA_PARTY)
+ if (spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AREA_AURA_RAID)
return SPELL_AURA;
}
break;
@@ -385,7 +385,7 @@ SpellSpecific GetSpellSpecific(uint32 spellId)
}
// only warlock armor/skin have this (in additional to family cases)
- if( spellInfo->SpellVisual == 130 && spellInfo->SpellIconID == 89)
+ if( spellInfo->SpellVisual[0] == 130 && spellInfo->SpellIconID == 89)
{
return SPELL_WARLOCK_ARMOR;
}
@@ -874,8 +874,8 @@ void SpellMgr::LoadSpellAffects()
uint32 count = 0;
- // 0 1 2
- QueryResult *result = WorldDatabase.Query("SELECT entry, effectId, SpellFamilyMask FROM spell_affect");
+ // 0 1 2 3 4
+ QueryResult *result = WorldDatabase.Query("SELECT entry, effectId, SpellClassMask0, SpellClassMask1, SpellClassMask2 FROM spell_affect");
if( !result )
{
@@ -922,26 +922,29 @@ void SpellMgr::LoadSpellAffects()
continue;
}
- uint64 spellAffectMask = fields[2].GetUInt64();
+ SpellAffectEntry affect;
+ affect.SpellClassMask[0] = fields[2].GetUInt32();
+ affect.SpellClassMask[1] = fields[3].GetUInt32();
+ affect.SpellClassMask[2] = fields[4].GetUInt32();
- // Spell.dbc have own data for low part of SpellFamilyMask
- if( spellInfo->EffectItemType[effectId])
+ // Spell.dbc have own data
+ uint32 const *ptr = 0;
+ switch (effectId)
{
- 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;
- }
-
- // 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);
+ 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] == 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;
}
- mSpellAffectMap.insert(SpellAffectMap::value_type((entry<<8) + effectId,spellAffectMask));
+ mSpellAffectMap[(entry<<8) + effectId] = affect;
++count;
} while( result->NextRow() );
@@ -949,7 +952,7 @@ void SpellMgr::LoadSpellAffects()
delete result;
sLog.outString();
- sLog.outString( ">> Loaded %u spell affect definitions", count );
+ sLog.outString( ">> Loaded %u custom spell affect definitions", count );
for (uint32 id = 0; id < sSpellStore.GetNumRows(); ++id)
{
@@ -965,7 +968,16 @@ void SpellMgr::LoadSpellAffects()
spellInfo->EffectApplyAuraName[effectId] != SPELL_AURA_ADD_TARGET_TRIGGER) )
continue;
- if(spellInfo->EffectItemType[effectId] != 0)
+ 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])
continue;
if(mSpellAffectMap.find((id<<8) + effectId) != mSpellAffectMap.end())
@@ -976,33 +988,20 @@ void SpellMgr::LoadSpellAffects()
}
}
-bool SpellMgr::IsAffectedBySpell(SpellEntry const *spellInfo, uint32 spellId, uint8 effectId, uint64 familyFlags) const
+bool SpellMgr::IsAffectedByMod(SpellEntry const *spellInfo, SpellModifier *mod) const
{
// false for spellInfo == NULL
- if (!spellInfo)
+ if (!spellInfo || !mod)
return false;
- SpellEntry const *affect_spell = sSpellStore.LookupEntry(spellId);
- // false for affect_spell == NULL
- if (!affect_spell)
+ 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)
return false;
- // 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 (familyFlags & spellInfo->SpellFamilyFlags)
+ if (mod->mask & spellInfo->SpellFamilyFlags ||
+ mod->mask2 & spellInfo->SpellFamilyFlags2)
return true;
return false;
@@ -1296,7 +1295,7 @@ bool SpellMgr::canStackSpellRanks(SpellEntry const *spellInfo)
{
// Paladin aura Spell
if(spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN
- && spellInfo->Effect[i]==SPELL_EFFECT_APPLY_AREA_AURA_PARTY)
+ && spellInfo->Effect[i]==SPELL_EFFECT_APPLY_AREA_AURA_RAID)
return false;
// Druid form Spell
if(spellInfo->SpellFamilyName == SPELLFAMILY_DRUID
@@ -1433,7 +1432,8 @@ 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_PARTY ||
+ spellInfo->Effect[i] == SPELL_EFFECT_APPLY_AREA_AURA_RAID
) )
{
needRankSelection = true;
@@ -1565,7 +1565,7 @@ void SpellMgr::LoadSpellChains()
entry.ProcFlags=SpellInfo->procFlags;
entry.SpellFamilyFlags=SpellInfo->SpellFamilyFlags;
entry.TargetAuraState=SpellInfo->TargetAuraState;
- entry.SpellVisual=SpellInfo->SpellVisual;
+ entry.SpellVisual=SpellInfo->SpellVisual[0];
entry.ManaCost=SpellInfo->manaCost;
value.Id=spell_id;
@@ -1789,7 +1789,15 @@ void SpellMgr::LoadSpellLearnSpells()
{
SpellLearnSpellNode dbc_node;
dbc_node.spell = entry->EffectTriggerSpell[i];
- dbc_node.autoLearned = true;
+
+ // ignore learning not existed spells (broken/outdated/or generic learnig spell 483
+ if(!sSpellStore.LookupEntry(dbc_node.spell))
+ continue;
+
+ // talent or passive spells or skill-step spells auto-casted and not need dependent learning,
+ // pet teaching spells don't must be dependent learning (casted)
+ // other required explicit dependent learning
+ dbc_node.autoLearned = entry->EffectImplicitTargetA[i]==TARGET_PET || GetTalentSpellCost(spell) > 0 || IsPassiveSpell(spell) || IsSpellHaveEffect(entry,SPELL_EFFECT_SKILL_STEP);
SpellLearnSpellMap::const_iterator db_node_begin = GetBeginSpellLearnSpell(spell);
SpellLearnSpellMap::const_iterator db_node_end = GetEndSpellLearnSpell(spell);
@@ -2088,7 +2096,7 @@ void SpellMgr::LoadSpellCustomAttr()
}
}
- if(spellInfo->SpellVisual == 3879)
+ if(spellInfo->SpellVisual[0] == 3879)
mSpellCustomAttr[i] |= SPELL_ATTR_CU_CONE_BACK;
switch(i)
@@ -2192,6 +2200,187 @@ 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
@@ -2269,7 +2458,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 && spellInfo->AreaId != zone_id && spellInfo->AreaId != area_id )
+ if( spellInfo->AreaId > 0 && 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 ef5e8379341..5322f3fa16d 100644
--- a/src/game/SpellMgr.h
+++ b/src/game/SpellMgr.h
@@ -29,6 +29,9 @@
#include "Database/SQLStorage.h"
#include "Utilities/UnorderedMap.h"
+
+#include "Player.h"
+
#include <map>
class Player;
@@ -38,175 +41,188 @@ extern SQLStorage sSpellThreatStore;
enum SpellFailedReason
{
- 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,
+ 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
};
enum SpellFamilyNames
@@ -223,8 +239,12 @@ enum SpellFamilyNames
SPELLFAMILY_HUNTER = 9,
SPELLFAMILY_PALADIN = 10,
SPELLFAMILY_SHAMAN = 11,
- SPELLFAMILY_UNK2 = 12,
- SPELLFAMILY_POTION = 13
+ SPELLFAMILY_UNK2 = 12, // 2 spells (silence resistance)
+ SPELLFAMILY_POTION = 13,
+ // 14 - unused
+ SPELLFAMILY_DEATHKNIGHT = 15,
+ // 16 - unused
+ SPELLFAMILY_PET = 17
};
enum SpellDisableTypes
@@ -375,6 +395,7 @@ 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 ||
@@ -447,7 +468,11 @@ bool IsDiminishingReturnsGroupDurationLimited(DiminishingGroup group);
DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group);
// Spell affects related declarations (accessed using SpellMgr functions)
-typedef std::map<uint32, uint64> SpellAffectMap;
+struct SpellAffectEntry
+{
+ uint32 SpellClassMask[3];
+};
+typedef UNORDERED_MAP<uint32, SpellAffectEntry> SpellAffectMap;
// Spell proc event related declarations (accessed using SpellMgr functions)
enum ProcFlags
@@ -665,6 +690,9 @@ 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);
@@ -705,15 +733,15 @@ class SpellMgr
// Accessors (const or static functions)
public:
// Spell affects
- uint64 GetSpellAffectMask(uint16 spellId, uint8 effectId) const
+ SpellAffectEntry const*GetSpellAffect(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 IsAffectedBySpell(SpellEntry const *spellInfo, uint32 spellId, uint8 effectId, uint64 familyFlags) const;
+ bool IsAffectedByMod(SpellEntry const *spellInfo, SpellModifier *mod) const;
SpellElixirMap const& GetSpellElixirMap() const { return mSpellElixirs; }
@@ -916,11 +944,6 @@ 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
@@ -932,6 +955,15 @@ 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();
@@ -951,6 +983,7 @@ class SpellMgr
void LoadSpellPetAuras();
void LoadSpellCustomAttr();
void LoadSpellLinked();
+ void LoadPetLevelupSpellMap();
private:
SpellScriptTarget mSpellScriptTarget;
@@ -967,6 +1000,7 @@ 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 dd324fbc684..43faf9b3654 100644
--- a/src/game/StatSystem.cpp
+++ b/src/game/StatSystem.cpp
@@ -51,24 +51,17 @@ 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;
@@ -78,8 +71,25 @@ 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;
}
@@ -255,6 +265,7 @@ 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;
@@ -309,11 +320,20 @@ void Player::UpdateAttackPowerAndDamage(bool ranged )
float attPowerMod = GetModifierValue(unitMod, TOTAL_VALUE);
//add dynamic flat mods
- if( ranged && (getClassMask() & CLASSMASK_WAND_USERS)==0)
+ if ((getClassMask() & CLASSMASK_WAND_USERS)==0)
{
- 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);
+ 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);
+ }
}
float attPowerMultiplier = GetModifierValue(unitMod, TOTAL_PCT) - 1.0f;
@@ -554,6 +574,24 @@ 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++)
@@ -624,9 +662,9 @@ void Player::UpdateManaRegen()
int32 modManaRegenInterrupt = GetTotalAuraModifier(SPELL_AURA_MOD_MANA_REGEN_INTERRUPT);
if (modManaRegenInterrupt > 100)
modManaRegenInterrupt = 100;
- SetStatFloatValue(PLAYER_FIELD_MOD_MANA_REGEN_INTERRUPT, power_regen_mp5 + power_regen * modManaRegenInterrupt / 100.0f);
+ SetStatFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER, power_regen_mp5 + power_regen * modManaRegenInterrupt / 100.0f);
- SetStatFloatValue(PLAYER_FIELD_MOD_MANA_REGEN, power_regen_mp5 + power_regen);
+ SetStatFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER, power_regen_mp5 + power_regen);
}
void Player::_ApplyAllStatBonuses()
@@ -923,7 +961,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.125f));
+ SetBonusDamage( int32(owner->GetTotalAttackPowerValue(RANGED_ATTACK) * 0.1287f));
}
//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 640618eaebb..fa649e20f6e 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::HandleTaxiQueryAvailableNodesOpcode( WorldPacket & recv_data )
+void WorldSession::HandleTaxiQueryAvailableNodes( WorldPacket & recv_data )
{
CHECK_PACKET_SIZE(recv_data,8);
diff --git a/src/game/Transports.cpp b/src/game/Transports.cpp
index 21d3d3b1f27..be71fcc3f98 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_HASPOSITION);
+ m_updateFlag = (UPDATEFLAG_TRANSPORT | UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION);
}
bool Transport::Create(uint32 guidlow, uint32 mapid, float x, float y, float z, float ang, uint32 animprogress, uint32 dynflags)
@@ -168,9 +168,10 @@ 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(OBJECT_FIELD_ENTRY, goinfo->id);
+ //SetUInt32Value(GAMEOBJECT_FLAGS, goinfo->flags);
+ SetUInt32Value(GAMEOBJECT_FLAGS, MAKE_PAIR32(0x28, 0x64));
+ SetUInt32Value(GAMEOBJECT_LEVEL, m_period);
+ SetEntry(goinfo->id);
SetUInt32Value(GAMEOBJECT_DISPLAYID, goinfo->displayId);
@@ -179,7 +180,7 @@ bool Transport::Create(uint32 guidlow, uint32 mapid, float x, float y, float z,
SetGoAnimProgress(animprogress);
if(dynflags)
- SetUInt32Value(GAMEOBJECT_DYN_FLAGS, dynflags);
+ SetUInt32Value(GAMEOBJECT_DYNAMIC, MAKE_PAIR32(0, dynflags));
return true;
}
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 1fed4717db6..5a2503f99fe 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -60,6 +60,7 @@ 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();
@@ -154,7 +155,7 @@ Unit::Unit()
m_objectType |= TYPEMASK_UNIT;
m_objectTypeId = TYPEID_UNIT;
// 2.3.2 - 0x70
- m_updateFlag = (UPDATEFLAG_HIGHGUID | UPDATEFLAG_LIVING | UPDATEFLAG_HASPOSITION);
+ m_updateFlag = (UPDATEFLAG_LOWGUID | UPDATEFLAG_HIGHGUID | UPDATEFLAG_LIVING | UPDATEFLAG_HAS_POSITION);
m_attackTimer[BASE_ATTACK] = 0;
m_attackTimer[OFF_ATTACK] = 0;
@@ -1631,7 +1632,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->UpdateAuraDuration();
+ (*itr).second->SendAuraUpdate(false);
}
}
}
@@ -1947,7 +1948,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->UpdateAuraDuration();
+ (*itr).second->SendAuraUpdate(false);
}
}
}
@@ -2017,15 +2018,18 @@ uint32 Unit::CalcArmorReducedDamage(Unit* pVictim, const uint32 damage)
// Ignore enemy armor by SPELL_AURA_MOD_TARGET_RESISTANCE aura
armor += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, SPELL_SCHOOL_MASK_NORMAL);
- if (armor<0.0f) armor=0.0f;
+ // Apply Player CR_ARMOR_PENETRATION rating
+ if (GetTypeId()==TYPEID_PLAYER)
+ armor *= 1.0f - ((Player*)this)->GetRatingBonusValue(CR_ARMOR_PENETRATION) / 100.0f;
- float tmpvalue = 0.0f;
- if(getLevel() <= 59) //Level 1-59
- tmpvalue = armor / (armor + 400.0f + 85.0f * getLevel());
- else if(getLevel() < 70) //Level 60-69
- tmpvalue = armor / (armor - 22167.5f + 467.5f * getLevel());
- else //Level 70+
- tmpvalue = armor / (armor + 10557.5f);
+ if (armor < 0.0f) armor=0.0f;
+
+ float levelModifier = getLevel();
+ if ( levelModifier > 59 )
+ levelModifier = levelModifier + (4.5f * (levelModifier-59));
+
+ float tmpvalue = 0.1f * armor / (8.5f * levelModifier + 40);
+ tmpvalue = tmpvalue/(1.0f + tmpvalue);
if(tmpvalue < 0.0f)
tmpvalue = 0.0f;
@@ -2342,9 +2346,7 @@ void Unit::DoAttackDamage (Unit *pVictim, uint32 *damage, CleanDamage *cleanDama
case MELEE_HIT_BLOCK_CRIT:
case MELEE_HIT_CRIT:
{
- //*hitInfo = 0xEA;
- // 0xEA
- *hitInfo = HITINFO_CRITICALHIT | HITINFO_NORMALSWING2 | 0x8;
+ *hitInfo = HITINFO_CRITICALHIT | HITINFO_NORMALSWING2 | HITINFO_UNK2;
// Crit bonus calc
uint32 crit_bonus;
@@ -2581,10 +2583,62 @@ 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;
}
@@ -2633,7 +2687,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->UpdateAuraDuration();
+ (*itr).second->SendAuraUpdate(false);
}
}
}
@@ -2758,21 +2812,20 @@ 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);
-
- if( dodge_chance != 0.0f ) // if dodge chance is already 0, ignore talents for speed
+ // Ignore combat result aura
+ AuraList const& ignore = GetAurasByType(SPELL_AURA_IGNORE_COMBAT_RESULT);
+ for(AuraList::const_iterator i = ignore.begin(); i != ignore.end(); ++i)
{
- AuraList const& mCanNotBeDodge = GetAurasByType(SPELL_AURA_IGNORE_COMBAT_RESULT);
- for(AuraList::const_iterator i = mCanNotBeDodge.begin(); i != mCanNotBeDodge.end(); ++i)
+ if (!(*i)->isAffectedOnSpell(spellInfo))
+ continue;
+ switch((*i)->GetModifier()->m_miscvalue)
{
- // 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;
- }
- }
+ 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;
}
}
}
@@ -4738,7 +4791,7 @@ void Unit::DelayAura(uint32 spellId, uint32 effindex, int32 delaytime)
iter->second->SetAuraDuration(0);
else
iter->second->SetAuraDuration(iter->second->GetAuraDuration() - delaytime);
- iter->second->UpdateAuraDuration();
+ iter->second->SendAuraUpdate(false);
sLog.outDebug("Aura %u partially interrupted on unit %u, new duration: %u ms",iter->second->GetModifier()->m_auraname, GetGUIDLow(), iter->second->GetAuraDuration());
}
}
@@ -4930,6 +4983,7 @@ 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
@@ -4994,31 +5048,66 @@ 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;
+ data << uint32(HitInfo); // flags
data.append(GetPackGUID());
data.append(target->GetPackGUID());
- data << (uint32)(Damage-AbsorbDamage-Resist-BlockedAmount);
+ data << uint32(Damage-AbsorbDamage-Resist-BlockedAmount);// damage
+ data << uint32(0); // overkill value
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
- data << (uint32)TargetState;
+ if(HitInfo & (HITINFO_ABSORB | HITINFO_ABSORB2))
+ {
+ // for(i = 0; i < SwingType; ++i)
+ data << uint32(AbsorbDamage);
+ // end loop
+ }
- if( AbsorbDamage == 0 ) //also 0x3E8 = 0x3E8, check when that happens
- data << (uint32)0;
- else
- data << (uint32)-1;
+ if(HitInfo & (HITINFO_RESIST | HITINFO_RESIST2))
+ {
+ // for(i = 0; i < SwingType; ++i)
+ data << uint32(Resist);
+ // end loop
+ }
+ data << (uint8)TargetState;
+ data << (uint32)0;
data << (uint32)0;
- data << (uint32)BlockedAmount;
+
+ 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);
+ }
SendMessageToSet( &data, true );
}
@@ -5239,7 +5328,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
{
switch (dummySpell->Id)
{
- // Eye of Eye
+ // Eye for an Eye
case 9799:
case 25988:
{
@@ -5856,7 +5945,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
triggered_spell_id = 39373;
break;
}
- // Vestments of Faith (Priest Tier 3) - 4 pieces bonus
+ // Greater Heal (Vestments of Faith (Priest Tier 3) - 4 pieces bonus)
case 28809:
{
triggered_spell_id = 28810;
@@ -5993,6 +6082,7 @@ 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)
{
@@ -6089,7 +6179,8 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
}
break;
}
- //Seal of Vengeance
+ // TODO: fix basepoint calculation (changed in 3.0.3)
+ // Seal of Vengeance
case 31801:
{
if(effIndex != 0) // effect 1,2 used by seal unleashing code
@@ -6098,7 +6189,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
triggered_spell_id = 31803;
break;
}
- // Spiritual Att.
+ // Spiritual Attunement
case 31785:
case 33776:
{
@@ -6282,7 +6373,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
}
// Earth Shield
- if(dummySpell->SpellFamilyFlags==0x40000000000LL)
+ if(dummySpell->SpellFamilyFlags & 0x0000040000000000LL)
{
if(GetTypeId() != TYPEID_PLAYER)
return false;
@@ -6320,6 +6411,8 @@ 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
@@ -6327,6 +6420,8 @@ 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;
@@ -6337,21 +6432,14 @@ 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->charges = 0;
+ mod->mask2= 0LL;
((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);
@@ -6624,7 +6712,7 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggeredB
break;
}
// Shadowguard
- if((auraSpellInfo->SpellFamilyFlags & 0x80000000LL) && auraSpellInfo->SpellVisual==7958)
+ if((auraSpellInfo->SpellFamilyFlags & 0x80000000LL) && auraSpellInfo->SpellVisual[0]==7958)
{
switch(triggeredByAura->GetSpellProto()->Id)
{
@@ -6979,14 +7067,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==7358)
+ if((auraSpellInfo->SpellFamilyFlags & 0x0000002000000000LL) && auraSpellInfo->SpellVisual[0]==7358)
{
target = this;
break;
}
// Lightning Shield
- if((auraSpellInfo->SpellFamilyFlags & 0x00000400) && auraSpellInfo->SpellVisual==37)
+ if((auraSpellInfo->SpellFamilyFlags & 0x00000400) && auraSpellInfo->SpellVisual[0]==37)
{
// overwrite non existing triggered spell call in spell.dbc
switch(triggeredByAura->GetSpellProto()->Id)
@@ -7313,7 +7401,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==7958)
+ else if(auraSpellInfo->SpellFamilyFlags==0x100080000000LL && auraSpellInfo->SpellVisual[0]==7958)
{
switch(auraSpellInfo->Id)
{
@@ -7508,7 +7596,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==37)
+ if(auraSpellInfo->SpellFamilyFlags==0x00000400 && auraSpellInfo->SpellVisual[0]==37)
{
switch(auraSpellInfo->Id)
{
@@ -7720,21 +7808,21 @@ bool Unit::HandleOverrideClassScriptAuraProc(Unit *pVictim, Aura *triggeredByAur
{
case 836: // Improved Blizzard (Rank 1)
{
- if (!procSpell || procSpell->SpellVisual!=9487)
+ if (!procSpell || procSpell->SpellVisual[0]!=9487)
return false;
triggered_spell_id = 12484;
break;
}
case 988: // Improved Blizzard (Rank 2)
{
- if (!procSpell || procSpell->SpellVisual!=9487)
+ if (!procSpell || procSpell->SpellVisual[0]!=9487)
return false;
triggered_spell_id = 12485;
break;
}
case 989: // Improved Blizzard (Rank 3)
{
- if (!procSpell || procSpell->SpellVisual!=9487)
+ if (!procSpell || procSpell->SpellVisual[0]!=9487)
return false;
triggered_spell_id = 12486;
break;
@@ -8390,6 +8478,9 @@ 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)
@@ -8468,6 +8559,7 @@ 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);
@@ -8650,7 +8742,7 @@ uint32 Unit::SpellDamageBonus(Unit *pVictim, SpellEntry const *spellProto, uint3
CastingTime = 0;
}
// Darkmoon Card: Vengeance - 0.1%
- else if (spellProto->SpellVisual == 9850 && spellProto->SpellIconID == 2230)
+ else if (spellProto->SpellVisual[0] == 9850 && spellProto->SpellIconID == 2230)
{
CastingTime = 3.5;
}
@@ -8918,14 +9010,8 @@ int32 Unit::SpellBaseDamageBonus(SpellSchoolMask schoolMask)
{
if((*i)->GetModifier()->m_miscvalue & schoolMask)
{
- 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]);
-
+ // stat used stored in miscValueB for this aura
+ Stats usedStat = Stats((*i)->GetMiscBValue());
DoneAdvertisedBenefit += int32(GetStat(usedStat) * (*i)->GetModifierValue() / 100.0f);
}
}
@@ -9096,7 +9182,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 == 9180)
+ if((*i)->GetSpellProto()->SpellVisual[0] == 9180)
{
// Flash of Light
if ((spellProto->SpellFamilyFlags & 0x0000000040000000LL) && (*i)->GetEffIndex() == 1)
@@ -9676,7 +9762,7 @@ void Unit::Unmount()
if(GetTypeId() == TYPEID_PLAYER && IsInWorld() && ((Player*)this)->GetTemporaryUnsummonedPetNumber() && isAlive())
{
Pet* NewPet = new Pet;
- if(!NewPet->LoadPetFromDB(this, 0, ((Player*)this)->GetTemporaryUnsummonedPetNumber(), true))
+ if(!NewPet->LoadPetFromDB((Player*)this, 0, ((Player*)this)->GetTemporaryUnsummonedPetNumber(), true))
delete NewPet;
((Player*)this)->SetTemporaryUnsummonedPetNumber(0);
@@ -10112,38 +10198,37 @@ 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+1+4+4+4+4+4+4+4);
+ data.Initialize(MSG_MOVE_SET_WALK_SPEED, 8+4+2+4+4+4+4+4+4+4);
break;
case MOVE_RUN:
- data.Initialize(MSG_MOVE_SET_RUN_SPEED, 8+4+1+4+4+4+4+4+4+4);
+ data.Initialize(MSG_MOVE_SET_RUN_SPEED, 8+4+2+4+4+4+4+4+4+4);
break;
case MOVE_RUN_BACK:
- data.Initialize(MSG_MOVE_SET_RUN_BACK_SPEED, 8+4+1+4+4+4+4+4+4+4);
+ data.Initialize(MSG_MOVE_SET_RUN_BACK_SPEED, 8+4+2+4+4+4+4+4+4+4);
break;
case MOVE_SWIM:
- data.Initialize(MSG_MOVE_SET_SWIM_SPEED, 8+4+1+4+4+4+4+4+4+4);
+ data.Initialize(MSG_MOVE_SET_SWIM_SPEED, 8+4+2+4+4+4+4+4+4+4);
break;
case MOVE_SWIM_BACK:
- data.Initialize(MSG_MOVE_SET_SWIM_BACK_SPEED, 8+4+1+4+4+4+4+4+4+4);
+ data.Initialize(MSG_MOVE_SET_SWIM_BACK_SPEED, 8+4+2+4+4+4+4+4+4+4);
break;
case MOVE_TURN_RATE:
- data.Initialize(MSG_MOVE_SET_TURN_RATE, 8+4+1+4+4+4+4+4+4+4);
+ data.Initialize(MSG_MOVE_SET_TURN_RATE, 8+4+2+4+4+4+4+4+4+4);
break;
case MOVE_FLIGHT:
- data.Initialize(MSG_MOVE_SET_FLIGHT_SPEED, 8+4+1+4+4+4+4+4+4+4);
+ data.Initialize(MSG_MOVE_SET_FLIGHT_SPEED, 8+4+2+4+4+4+4+4+4+4);
break;
case MOVE_FLIGHT_BACK:
- data.Initialize(MSG_MOVE_SET_FLIGHT_BACK_SPEED, 8+4+1+4+4+4+4+4+4+4);
+ 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);
break;
default:
sLog.outError("Unit::SetSpeed: Unsupported move type (%d), data not sent to client.",mtype);
@@ -10151,22 +10236,26 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced)
}
data.append(GetPackGUID());
- data << uint32(0); //movement flags
- data << uint8(0); //unk
+ data << uint32(0); // movement flags
+ data << uint16(0); // unk flags
data << uint32(getMSTime());
data << float(GetPositionX());
data << float(GetPositionY());
data << float(GetPositionZ());
data << float(GetOrientation());
- data << uint32(0); //flag unk
+ data << uint32(0); // fall time
data << float(GetSpeed(mtype));
SendMessageToSet( &data, true );
}
else
{
- // 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];
+ 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];
+ }
+
switch(mtype)
{
case MOVE_WALK:
@@ -10193,6 +10282,9 @@ 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;
@@ -10282,6 +10374,10 @@ 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;
@@ -10530,6 +10626,8 @@ 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);
@@ -10731,7 +10829,9 @@ bool Unit::HandleStatModifier(UnitMods unitMod, UnitModifierType modifierType, f
case UNIT_MOD_RAGE:
case UNIT_MOD_FOCUS:
case UNIT_MOD_ENERGY:
- case UNIT_MOD_HAPPINESS: UpdateMaxPower(GetPowerTypeByAuraGroup(unitMod)); break;
+ case UNIT_MOD_HAPPINESS:
+ case UNIT_MOD_RUNE:
+ case UNIT_MOD_RUNIC_POWER: UpdateMaxPower(GetPowerTypeByAuraGroup(unitMod)); break;
case UNIT_MOD_RESISTANCE_HOLY:
case UNIT_MOD_RESISTANCE_FIRE:
@@ -10844,21 +10944,18 @@ Stats Unit::GetStatByAuraGroup(UnitMods unitMod) const
Powers Unit::GetPowerTypeByAuraGroup(UnitMods unitMod) const
{
- Powers power = POWER_MANA;
-
switch(unitMod)
{
- 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;
+ 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;
}
- return power;
+ return POWER_MANA;
}
float Unit::GetTotalAttackPowerValue(WeaponAttackType attType) const
@@ -10957,6 +11054,12 @@ 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)
{
@@ -11070,6 +11173,7 @@ 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;
@@ -11157,7 +11261,7 @@ void CharmInfo::InitEmptyActionBar(bool withAttack)
for(uint32 x = 0; x < 10; ++x)
{
- PetActionBar[x].Type = ACT_CAST;
+ PetActionBar[x].Type = ACT_PASSIVE;
PetActionBar[x].SpellOrAction = 0;
}
if (withAttack)
@@ -11173,13 +11277,20 @@ 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);
}
}
}
@@ -11223,7 +11334,7 @@ void CharmInfo::InitCharmCreateSpells()
if(onlyselfcast || !IsPositiveSpell(spellId)) //only self cast and spells versus enemies are autocastable
newstate = ACT_DISABLED;
else
- newstate = ACT_CAST;
+ newstate = ACT_PASSIVE;
AddSpellToAB(0, spellId, newstate);
}
@@ -11234,7 +11345,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_CAST) && PetActionBar[i].SpellOrAction == oldid)
+ if((PetActionBar[i].Type == ACT_DISABLED || PetActionBar[i].Type == ACT_ENABLED || PetActionBar[i].Type == ACT_PASSIVE) && PetActionBar[i].SpellOrAction == oldid)
{
PetActionBar[i].SpellOrAction = newid;
if(!oldid)
@@ -11849,8 +11960,11 @@ 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);
}
@@ -12410,7 +12524,13 @@ Pet* Unit::CreateTamedPetFrom(Creature* creatureTarget,uint32 spell_id)
pet->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, getFaction());
pet->SetUInt32Value(UNIT_CREATED_BY_SPELL, spell_id);
- if(!pet->InitStatsForLevel(creatureTarget->getLevel()))
+ if(GetTypeId()==TYPEID_PLAYER)
+ pet->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
+
+ uint32 level = (creatureTarget->getLevel() < (getLevel() - 5)) ? (getLevel() - 5) : creatureTarget->getLevel();
+ pet->SetFreeTalentPoints(pet->GetMaxTalentPointsForLevel(level));
+
+ if(!pet->InitStatsForLevel(level))
{
sLog.outError("ERROR: Pet::InitStatsForLevel() failed for creature (Entry: %u)!",creatureTarget->GetEntry());
delete pet;
@@ -12541,10 +12661,8 @@ bool Unit::HandleMeandingAuraProc( Aura* triggeredByAura )
mod->value = jumps-5; // negative
mod->type = SPELLMOD_FLAT;
mod->spellId = spellProto->Id;
- mod->effectId = effIdx;
- mod->lastAffected = NULL;
- mod->mask = spellProto->SpellFamilyFlags;
- mod->charges = 0;
+ mod->mask = spellProto->SpellFamilyFlags;
+ mod->mask2 = spellProto->SpellFamilyFlags2;
caster->AddSpellMod(mod, true);
CastCustomSpell(target,spellProto->Id,&heal,NULL,NULL,true,NULL,triggeredByAura,caster->GetGUID());
@@ -12732,6 +12850,15 @@ 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)
@@ -12801,7 +12928,7 @@ void Unit::SetStunned(bool apply)
if(apply)
{
SetUInt64Value(UNIT_FIELD_TARGET, 0);
- SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_ROTATE);
+ SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
CastStop();
// Creature specific
@@ -12819,7 +12946,7 @@ void Unit::SetStunned(bool apply)
{
if(isAlive() && getVictim())
SetUInt64Value(UNIT_FIELD_TARGET, getVictim()->GetGUID());
- RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_ROTATE);
+ RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
if(!hasUnitState(UNIT_STAT_ROOT)) // prevent allow move if have also root effect
{
@@ -13040,4 +13167,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 2f1af0c32d8..31787663968 100644
--- a/src/game/Unit.h
+++ b/src/game/Unit.h
@@ -149,6 +149,7 @@ enum ShapeshiftForm
FORM_BERSERKERSTANCE = 0x13,
FORM_TEST = 0x14,
FORM_ZOMBIE = 0x15,
+ FORM_METAMORPHOSIS = 0x16,
FORM_FLIGHT_EPIC = 0x1B,
FORM_SHADOW = 0x1C,
FORM_FLIGHT = 0x1D,
@@ -168,14 +169,14 @@ enum SheathState
// byte (1 from 0..3) of UNIT_FIELD_BYTES_2
enum UnitBytes2_Flags
{
- 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
+ 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
};
// byte (2 from 0..3) of UNIT_FIELD_BYTES_2
@@ -213,16 +214,27 @@ enum HitInfo
HITINFO_UNK1 = 0x00000001, // req correct packet structure
HITINFO_NORMALSWING2 = 0x00000002,
HITINFO_LEFTSWING = 0x00000004,
+ HITINFO_UNK2 = 0x00000008,
HITINFO_MISS = 0x00000010,
- 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
+ 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
};
//i would like to remove this: (it is defined in item.h
@@ -294,11 +306,13 @@ enum UnitMods
UNIT_MOD_STAT_INTELLECT,
UNIT_MOD_STAT_SPIRIT,
UNIT_MOD_HEALTH,
- 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_MANA, // UNIT_MOD_MANA..UNIT_MOD_RUNIC_POWER 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,
@@ -318,7 +332,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_HAPPINESS + 1
+ UNIT_MOD_POWER_END = UNIT_MOD_RUNIC_POWER + 1
};
enum BaseModGroup
@@ -383,9 +397,10 @@ enum UnitMoveType
MOVE_TURN_RATE = 5,
MOVE_FLIGHT = 6,
MOVE_FLIGHT_BACK = 7,
+ MOVE_PITCH_RATE = 8
};
-#define MAX_MOVE_TYPE 8
+#define MAX_MOVE_TYPE 9
extern float baseMoveSpeed[MAX_MOVE_TYPE];
@@ -423,10 +438,11 @@ enum CombatRating
CR_WEAPON_SKILL_MAINHAND = 20,
CR_WEAPON_SKILL_OFFHAND = 21,
CR_WEAPON_SKILL_RANGED = 22,
- CR_EXPERTISE = 23
+ CR_EXPERTISE = 23,
+ CR_ARMOR_PENETRATION = 24
};
-#define MAX_COMBAT_RATING 24
+#define MAX_COMBAT_RATING 25
enum DamageEffectType
{
@@ -460,19 +476,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,
+ UNIT_FLAG_UNKNOWN11 = 0x00000200, // 3.0.3 - makes you unable to attack everything
UNIT_FLAG_LOOTING = 0x00000400, // loot animation
UNIT_FLAG_PET_IN_COMBAT = 0x00000800, // in combat?, 2.0.8
- UNIT_FLAG_PVP = 0x00001000,
+ UNIT_FLAG_PVP = 0x00001000, // changed in 3.0.3
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,
- UNIT_FLAG_DISABLE_ROTATE = 0x00040000, // stunned, 2.1.1
+ UNIT_FLAG_PACIFIED = 0x00020000, // 3.0.3 ok
+ UNIT_FLAG_STUNNED = 0x00040000, // 3.0.3 ok
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, // disable melee spells casting..., "Required melee weapon" added to melee spells tooltip.
+ UNIT_FLAG_DISARMED = 0x00200000, // 3.0.3, 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...
@@ -487,9 +503,10 @@ 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_FEIGN_DEATH = 0x00000001,
+ UNIT_FLAG2_COMPREHEND_LANG = 0x00000008,
+ UNIT_FLAG2_FORCE_MOVE = 0x00000040,
+ UNIT_FLAG2_REGENERATE_POWER = 0x00000800
};
/// Non Player Character flags
@@ -635,8 +652,18 @@ uint32 createProcExtendMask(SpellNonMeleeDamage *damageInfo, SpellMissInfo missC
struct UnitActionBarEntry
{
- uint32 Type;
- uint32 SpellOrAction;
+ union
+ {
+ struct
+ {
+ uint16 SpellOrAction;
+ uint16 Type;
+ };
+ struct
+ {
+ uint32 Raw;
+ };
+ };
};
#define MAX_DECLINED_NAME_CASES 5
@@ -658,13 +685,12 @@ enum CurrentSpellTypes
enum ActiveStates
{
- ACT_ENABLED = 0xC100,
- ACT_DISABLED = 0x8100,
- ACT_COMMAND = 0x0700,
- ACT_REACTION = 0x0600,
- ACT_CAST = 0x0100,
- ACT_PASSIVE = 0x0000,
- ACT_DECIDE = 0x0001
+ 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?
};
enum ReactStates
@@ -754,6 +780,7 @@ 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 ( );
@@ -884,8 +911,14 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
return false;
}
- 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); }
+ 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);
+ }
uint32 GetCreatureType() const;
uint32 GetCreatureTypeMask() const
{
@@ -1255,6 +1288,30 @@ 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; }
@@ -1446,6 +1503,7 @@ 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];
@@ -1459,6 +1517,7 @@ 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 2b6282997e8..ce50a326917 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 8fdcac4b400..48c7fc35efc 100644
--- a/src/game/UpdateData.h
+++ b/src/game/UpdateData.h
@@ -38,11 +38,12 @@ enum OBJECT_UPDATE_FLAGS
UPDATEFLAG_NONE = 0x00,
UPDATEFLAG_SELF = 0x01,
UPDATEFLAG_TRANSPORT = 0x02,
- UPDATEFLAG_FULLGUID = 0x04,
+ UPDATEFLAG_HAS_TARGET = 0x04,
UPDATEFLAG_LOWGUID = 0x08,
UPDATEFLAG_HIGHGUID = 0x10,
UPDATEFLAG_LIVING = 0x20,
- UPDATEFLAG_HASPOSITION = 0x40
+ UPDATEFLAG_HAS_POSITION = 0x40,
+ UPDATEFLAG_VEHICLE = 0x80
};
class UpdateData
diff --git a/src/game/UpdateFields.h b/src/game/UpdateFields.h
index db64e0bc1dd..3810cb83429 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 2, 4, 3, 8606
+// Auto generated for version 3, 0, 3, 9183
enum EObjectFields
{
@@ -43,13 +43,37 @@ 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 = 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,
+ 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,
};
enum EContainerFields
@@ -64,93 +88,94 @@ 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_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_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_CHANNEL_OBJECT = OBJECT_END + 0x000E, // Size: 2, Type: LONG, Flags: PUBLIC
- 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,
+ 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,
PLAYER_DUEL_ARBITER = UNIT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC
PLAYER_FLAGS = UNIT_END + 0x0002, // Size: 1, Type: INT, Flags: PUBLIC
@@ -262,160 +287,184 @@ 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: 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,
+ 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,
};
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: 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_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_LEVEL = OBJECT_END + 0x0010, // Size: 1, Type: INT, Flags: PUBLIC
- 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,
+ GAMEOBJECT_BYTES_1 = OBJECT_END + 0x0011, // Size: 1, Type: BYTES, Flags: PUBLIC
+ GAMEOBJECT_END = OBJECT_END + 0x0012,
};
enum EDynamicObjectFields
diff --git a/src/game/Vehicle.cpp b/src/game/Vehicle.cpp
new file mode 100644
index 00000000000..4e1153a166b
--- /dev/null
+++ b/src/game/Vehicle.cpp
@@ -0,0 +1,102 @@
+/*
+ * 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
new file mode 100644
index 00000000000..7fd8b60c40a
--- /dev/null
+++ b/src/game/Vehicle.h
@@ -0,0 +1,58 @@
+/*
+ * 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 7769c9a7942..1bb4e91932a 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); // 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
+ 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
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); // 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 (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(GetQueuePos (sess));
sess->SendPacket (&packet);
@@ -408,24 +408,30 @@ 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) mustbe > 0. Using 1 instead.",rate_values[RATE_HEALTH]);
+ sLog.outError("Rate.Health (%f) must be > 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) mustbe > 0. Using 1 instead.",rate_values[RATE_POWER_MANA]);
+ sLog.outError("Rate.Mana (%f) must be > 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) mustbe > 0. Using 1 instead.",rate_values[RATE_POWER_RAGE_LOSS]);
+ sLog.outError("Rate.Rage.Loss (%f) must be > 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);
@@ -617,6 +623,15 @@ 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)
{
@@ -651,6 +666,20 @@ 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)
{
@@ -712,8 +741,9 @@ void World::LoadConfigSettings(bool reload)
m_configs[CONFIG_INSTANCE_IGNORE_RAID] = sConfig.GetBoolDefault("Instance.IgnoreRaid", false);
m_configs[CONFIG_BATTLEGROUND_CAST_DESERTER] = sConfig.GetBoolDefault("Battleground.CastDeserter", true);
- m_configs[CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE] = sConfig.GetBoolDefault("Battleground.QueueAnnouncer.Enable", true);
+ m_configs[CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE] = sConfig.GetBoolDefault("Battleground.QueueAnnouncer.Enable", false);
m_configs[CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY] = sConfig.GetBoolDefault("Battleground.QueueAnnouncer.PlayerOnly", false);
+ m_configs[CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE] = sConfig.GetBoolDefault("Arena.QueueAnnouncer.Enable", false);
m_configs[CONFIG_CAST_UNSTUCK] = sConfig.GetBoolDefault("CastUnstuck", true);
m_configs[CONFIG_INSTANCE_RESET_TIME_HOUR] = sConfig.GetIntDefault("Instance.ResetTimeHour", 4);
@@ -723,17 +753,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);
@@ -774,6 +804,7 @@ 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)
@@ -1060,12 +1091,18 @@ 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();
@@ -1191,6 +1228,9 @@ 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();
@@ -1670,6 +1710,9 @@ 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;
@@ -1699,6 +1742,9 @@ 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 4dab7b97b88..1b4fbe6d035 100644
--- a/src/game/World.h
+++ b/src/game/World.h
@@ -102,9 +102,12 @@ 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,
@@ -182,7 +185,9 @@ enum WorldConfigs
CONFIG_ARENA_RATING_DISCARD_TIMER,
CONFIG_ARENA_AUTO_DISTRIBUTE_POINTS,
CONFIG_ARENA_AUTO_DISTRIBUTE_INTERVAL_DAYS,
+ CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE,
CONFIG_BATTLEGROUND_PREMATURE_FINISH_TIMER,
+ CONFIG_SKILL_MILLING,
CONFIG_MAX_WHO,
CONFIG_BG_START_MUSIC,
@@ -208,6 +213,8 @@ 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,
@@ -251,7 +258,6 @@ 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 47e1334198e..d49fe1cda83 100644
--- a/src/game/WorldSession.cpp
+++ b/src/game/WorldSession.cpp
@@ -525,3 +525,90 @@ 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 0ccb8dd9fbb..034036db887 100644
--- a/src/game/WorldSession.h
+++ b/src/game/WorldSession.h
@@ -47,6 +47,16 @@ 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,
@@ -81,6 +91,8 @@ 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,...);
@@ -153,6 +165,11 @@ 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 );
@@ -309,6 +326,7 @@ class TRINITY_DLL_SPEC WorldSession
void HandleGameObjectUseOpcode(WorldPacket& recPacket);
void HandleMeetingStoneInfo(WorldPacket& recPacket);
+ void HandleGameobjectReportUse(WorldPacket& recvPacket);
void HandleNameQueryOpcode(WorldPacket& recvPacket);
@@ -324,7 +342,8 @@ class TRINITY_DLL_SPEC WorldSession
void HandleMovementOpcodes(WorldPacket& recvPacket);
void HandlePossessedMovement(WorldPacket& recv_data, MovementInfo& movementInfo, uint32& MovementFlags);
void HandleSetActiveMoverOpcode(WorldPacket &recv_data);
- void HandleNotActiveMoverOpcode(WorldPacket &recv_data);
+ void HandleMoveNotActiveMover(WorldPacket &recv_data);
+ void HandleDismissControlledVehicle(WorldPacket &recv_data);
void HandleMoveTimeSkippedOpcode(WorldPacket &recv_data);
void HandleRequestRaidInfoOpcode( WorldPacket & recv_data );
@@ -385,7 +404,7 @@ class TRINITY_DLL_SPEC WorldSession
void HandleGuildSaveEmblemOpcode(WorldPacket& recvPacket);
void HandleTaxiNodeStatusQueryOpcode(WorldPacket& recvPacket);
- void HandleTaxiQueryAvailableNodesOpcode(WorldPacket& recvPacket);
+ void HandleTaxiQueryAvailableNodes(WorldPacket& recvPacket);
void HandleActivateTaxiOpcode(WorldPacket& recvPacket);
void HandleActivateTaxiFarOpcode(WorldPacket& recvPacket);
void HandleTaxiNextDestinationOpcode(WorldPacket& recvPacket);
@@ -429,6 +448,7 @@ 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 );
@@ -543,6 +563,7 @@ 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);
@@ -579,10 +600,9 @@ 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 HandleAllowMoveAckOpcode(WorldPacket& recv_data);
+ void HandleTimeSyncResp(WorldPacket& recv_data);
void HandleWhoisOpcode(WorldPacket& recv_data);
void HandleResetInstancesOpcode(WorldPacket& recv_data);
@@ -628,6 +648,29 @@ 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[]);
@@ -650,6 +693,7 @@ 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 01d5a0e5490..2ae97819116 100644
--- a/src/game/WorldSocket.cpp
+++ b/src/game/WorldSocket.cpp
@@ -54,8 +54,48 @@
struct ServerPktHeader
{
- uint16 size;
- uint16 cmd;
+ /**
+ * 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;
};
struct ClientPktHeader
@@ -639,7 +679,7 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
// NOTE: ATM the socket is singlethread, have this in mind ...
uint8 digest[20];
uint32 clientSeed;
- uint32 unk2;
+ uint32 unk2, unk3;
uint32 BuiltNumberClient;
uint32 id, security;
//uint8 expansion = 0;
@@ -661,6 +701,7 @@ 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))
{
@@ -880,6 +921,8 @@ 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));
@@ -963,23 +1006,17 @@ int WorldSocket::HandlePing (WorldPacket& recvPacket)
int WorldSocket::iSendPacket (const WorldPacket& pct)
{
- if (m_OutBuffer->space () < pct.size () + sizeof (ServerPktHeader))
+ ServerPktHeader header(pct.size()+2, pct.GetOpcode());
+ if (m_OutBuffer->space () < pct.size () + header.getHeaderLength())
{
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 ((uint8*) & header, sizeof (header));
+ m_Crypt.EncryptSend ( header.header, header.getHeaderLength());
- if (m_OutBuffer->copy ((char*) & header, sizeof (header)) == -1)
+ if (m_OutBuffer->copy ((char*) header.header, header.getHeaderLength()) == -1)
ACE_ASSERT (false);
if (!pct.empty ())
diff --git a/src/game/debugcmds.cpp b/src/game/debugcmds.cpp
index 878c4f5a711..8ec580f0c9f 100644
--- a/src/game/debugcmds.cpp
+++ b/src/game/debugcmds.cpp
@@ -63,6 +63,7 @@ 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);
@@ -569,4 +570,54 @@ 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/game/tools.cpp b/src/game/tools.cpp
deleted file mode 100644
index 7abc016df48..00000000000
--- a/src/game/tools.cpp
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
- *
- * Copyright (C) 2008 Trinity <http://www.trinitycore.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 "Tools.h"
-
-// THIS CAN BE A LOT FASTER
-bool readGUID(WorldPacket & data, uint64& guid)
-{
- if(data.rpos()+1 > data.size())
- return false;
-
- uint8 guidmark=0;
- uint8 bit;
- uint8 shiftdata=0x1;
- uint64 Temp=0;
-
- guid = 0;
-
- data >> guidmark;
- for(int i=0;i<8;i++)
- {
- if(guidmark & shiftdata)
- {
- Temp = 0;
-
- if(data.rpos()+1 > data.size())
- return false;
-
- data >> bit;
- Temp = bit;
- Temp <<= i*8;
- guid |= Temp;
- }
- shiftdata=shiftdata<<1;
- }
-
- return true;
-}
-
-void writeGUID(WorldPacket & data, uint64 & guid)
-{
- uint8 RAWmask = 0;
- uint8 PackedGuid[8] = {0,0,0,0,0,0,0,0};
-
- int j = 1;
- uint8 * test = (uint8*)&guid;
-
- if (*test)
- {
- PackedGuid[j] = *test;
- RAWmask |= 1;
- ++j;
- }
- if (*(test+1))
- {
- PackedGuid[j] = *(test+1);
- RAWmask |= 2;
- ++j;
- }
- if (*(test+2))
- {
- PackedGuid[j] = *(test+2);
- RAWmask |= 4;
- ++j;
- }
- if (*(test+3))
- {
- PackedGuid[j] = *(test+3);
- RAWmask |= 8;
- ++j;
- }
- if (*(test+4))
- {
- PackedGuid[j] = *(test+4);
- RAWmask |= 16;
- ++j;
- }
- if (*(test+5))
- {
- PackedGuid[j] = *(test+5);
- RAWmask |= 32;
- ++j;
- }
- if (*(test+6))
- {
- PackedGuid[j] = *(test+6);
- RAWmask |= 64;
- ++j;
- }
- if (*(test+7))
- {
- PackedGuid[j] = *(test+7);
- RAWmask |= 128;
- ++j;
- }
- PackedGuid[0] = RAWmask;
-
- data.append(PackedGuid,j);
-}
diff --git a/src/trinitycore/CliRunnable.cpp b/src/mangosd/CliRunnable.cpp
index 7fe2ab784a6..7fe2ab784a6 100644
--- a/src/trinitycore/CliRunnable.cpp
+++ b/src/mangosd/CliRunnable.cpp
diff --git a/src/trinitycore/CliRunnable.h b/src/mangosd/CliRunnable.h
index c3c1792b6e8..c3c1792b6e8 100644
--- a/src/trinitycore/CliRunnable.h
+++ b/src/mangosd/CliRunnable.h
diff --git a/src/trinitycore/Main.cpp b/src/mangosd/Main.cpp
index 3767e73b844..1e4230db1a3 100644
--- a/src/trinitycore/Main.cpp
+++ b/src/mangosd/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
@@ -40,7 +40,7 @@
#ifdef WIN32
#include "ServiceWin32.h"
-char serviceName[] = "Trinityd";
+char serviceName[] = "TrinityCore";
char serviceLongName[] = "Trinity core service";
char serviceDescription[] = "Massive Network Game Object Server";
/*
diff --git a/src/trinitycore/Makefile.am b/src/mangosd/Makefile.am
index ad1b78d9033..ad1b78d9033 100644
--- a/src/trinitycore/Makefile.am
+++ b/src/mangosd/Makefile.am
diff --git a/src/trinitycore/Master.cpp b/src/mangosd/Master.cpp
index eea1606256c..eea1606256c 100644
--- a/src/trinitycore/Master.cpp
+++ b/src/mangosd/Master.cpp
diff --git a/src/trinitycore/Master.h b/src/mangosd/Master.h
index 2485dd456b1..2485dd456b1 100644
--- a/src/trinitycore/Master.h
+++ b/src/mangosd/Master.h
diff --git a/src/trinitycore/RASocket.cpp b/src/mangosd/RASocket.cpp
index f953dc3f592..f953dc3f592 100644
--- a/src/trinitycore/RASocket.cpp
+++ b/src/mangosd/RASocket.cpp
diff --git a/src/trinitycore/RASocket.h b/src/mangosd/RASocket.h
index a164c9d3aa2..a164c9d3aa2 100644
--- a/src/trinitycore/RASocket.h
+++ b/src/mangosd/RASocket.h
diff --git a/src/trinitycore/TrinityCore.ico b/src/mangosd/TrinityCore.ico
index 6f0a5721957..6f0a5721957 100644
--- a/src/trinitycore/TrinityCore.ico
+++ b/src/mangosd/TrinityCore.ico
Binary files differ
diff --git a/src/trinitycore/WorldRunnable.cpp b/src/mangosd/WorldRunnable.cpp
index b57dbc6bce2..b57dbc6bce2 100644
--- a/src/trinitycore/WorldRunnable.cpp
+++ b/src/mangosd/WorldRunnable.cpp
diff --git a/src/trinitycore/WorldRunnable.h b/src/mangosd/WorldRunnable.h
index 8891186dec4..8891186dec4 100644
--- a/src/trinitycore/WorldRunnable.h
+++ b/src/mangosd/WorldRunnable.h
diff --git a/src/mangosd/mangosd.conf.dist.in b/src/mangosd/mangosd.conf.dist.in
new file mode 100644
index 00000000000..7f94d626c26
--- /dev/null
+++ b/src/mangosd/mangosd.conf.dist.in
@@ -0,0 +1,1299 @@
+##########################################
+# Trinity Core worldd configuration file #
+##########################################
+ConfVersion=2008080101
+
+###################################################################################################################
+# CONNECTIONS AND DIRECTORIES
+#
+# RealmID
+# RealmID must match the realmlist inside the realmd database
+#
+# DataDir
+# Data directory setting.
+# Important: DataDir needs to be quoted, as it is a string which may contain space characters.
+# Example: "@prefix@/share/trinitycore"
+#
+# LogsDir
+# Logs directory setting.
+# Important: Logs dir must exists, or all logs need to be disabled
+# Default: "" - no log directory prefix, if used log names isn't absolute path
+# then logs will be stored in current directory for run program.
+#
+#
+# LoginDatabaseInfo
+# WorldDatabaseInfo
+# CharacterDatabaseInfo
+# Database connection settings for the world server.
+# Default: hostname;port;username;password;database
+# .;somenumber;username;password;database - use named pipes at Windows
+# Named pipes: mySQL required adding "enable-named-pipe" to [mysqld] section my.ini
+# .;/path/to/unix_socket;username;password;database - use Unix sockets at Unix/Linux
+# Unix sockets: experimental, not tested
+#
+# MaxPingTime
+# Settings for maximum database-ping interval (minutes between pings)
+#
+# WorldServerPort
+# Default WorldServerPort
+#
+# BindIP
+# Bind World Server to IP/hostname
+#
+###################################################################################################################
+
+RealmID = 1
+DataDir = "."
+LogsDir = ""
+LoginDatabaseInfo = "127.0.0.1;3306;trinity;trinity;realmd"
+WorldDatabaseInfo = "127.0.0.1;3306;trinity;trinity;world"
+CharacterDatabaseInfo = "127.0.0.1;3306;trinity;trinity;characters"
+MaxPingTime = 30
+WorldServerPort = 8085
+BindIP = "0.0.0.0"
+
+###################################################################################################################
+# SCRIPTING SETTINGS
+#
+# Locale
+# Setting for current (DBC) locale to use
+#
+# EventAI Error reporting
+# 0 - Only startup (Default)
+# 1 - Startup errors and Runtime event errors
+# 2 - Startup errors, Runtime event errors, and Creation errors
+###################################################################################################################
+
+Locale = 0
+EAIErrorLevel = 2
+
+###################################################################################################################
+# PERFORMANCE SETINGS
+#
+# UseProcessors
+# Used processors mask for multi-processors system (Used only at Windows)
+# Default: 0 (selected by OS)
+# number (bitmask value of selected processors)
+#
+# ProcessPriority
+# Process priority setting (Used only at Windows)
+# Default: 1 (HIGH)
+# 0 (Normal)
+#
+# Compression
+# Compression level for update packages sent to client (1..9)
+# Default: 1 (speed)
+# 9 (best compression)
+#
+# PlayerLimit
+# Maximum number of players in the world. Excluding Mods, GM's and Admins
+# Default: 100
+# 0 (for infinite players)
+# -1 (for Mods, GM's and Admins only)
+# -2 (for GM's and Admins only)
+# -3 (for Admins only)
+#
+# SaveRespawnTimeImmediately
+# Save respawn time for creatures at death and for gameobjects at use/open
+# Default: 1 (save creature/gameobject respawn time without waiting grid unload)
+# 0 (save creature/gameobject respawn time at grid unload)
+#
+# MaxOverspeedPings
+# Maximum overspeed ping count before player kick (minimum is 2, 0 used for disable check)
+# Default: 2
+#
+# GridUnload
+# Unload grids (if you have lot memory you can disable it to speed up player move to new grids second time)
+# Default: 1 (unload grids)
+# 0 (do not unload grids)
+#
+# SocketSelectTime
+# Socket select time (in milliseconds)
+# Default: 10000
+#
+# GridCleanUpDelay
+# Grid clean up delay (in milliseconds)
+# Default: 300000 (5 min)
+#
+# MapUpdateInterval
+# Map update interval (in milliseconds)
+# Default: 100
+#
+# ChangeWeatherInterval
+# Weather update interval (in milliseconds)
+# Default: 600000 (10 min)
+#
+# PlayerSaveInterval
+# Player save interval (in milliseconds)
+# Default: 900000 (15 min)
+#
+# vmap.enableLOS
+# vmap.enableHeight
+# Enable/Disable VMmap support for line of sight and height calculation
+# Default: 1 (true)
+# 0 (false)
+#
+# vmap.ignoreMapIds
+# Map id that will be ignored by VMaps
+# List of ids with delimiter ','
+# If more then one id is defined and spaces are included, the string has to be enclosed by "
+# Example: "369,0,1,530"
+#
+# vmap.ignoreSpellIds
+# These spells are ignored for LoS calculation
+# List of ids with delimiter ','
+#
+# DetectPosCollision
+# Check final move position, summon position, etc for visible collision with other objects or
+# wall (wall only if vmaps are enabled)
+# Default: 1 (enable, required more CPU power usage)
+# 0 (disable, less nice position selection but will less CPU power usage)
+#
+# TargetPosRecalculateRange
+# Max distance from movement target point (+moving unit size) and targeted object (+size)
+# after that new target movmeent point calculated. Max: melee attack range (5), min: contact range (0.5)
+# More distance let have better performence, less distance let have more sensitive reaction at target move.
+# Default: 1.5
+#
+# UpdateUptimeInterval
+# Update realm uptime period in minutes (for save data in 'uptime' table). Must be > 0
+# Default: 10 (minutes)
+#
+# MaxCoreStuckTime
+# Periodically check if the process got freezed, if this is the case force crash after the specified
+# amount of seconds. Must be > 0. Recommended > 10 secs if you use this.
+# Default: 0 (Disabled)
+#
+# AddonChannel
+# Permit/disable the use of the addon channel through the server
+# (some client side addons can stop work correctly with disabled addon channel)
+# Default: 1 (permit addon channel)
+# 0 (do not permit addon channel)
+#
+###################################################################################################################
+
+UseProcessors = 0
+ProcessPriority = 1
+Compression = 1
+PlayerLimit = 100
+SaveRespawnTimeImmediately = 1
+MaxOverspeedPings = 2
+GridUnload = 1
+SocketSelectTime = 10000
+GridCleanUpDelay = 300000
+MapUpdateInterval = 100
+ChangeWeatherInterval = 600000
+PlayerSaveInterval = 900000
+vmap.enableLOS = 0
+vmap.enableHeight = 0
+vmap.ignoreMapIds = "369"
+vmap.ignoreSpellIds = "7720"
+DetectPosCollision = 1
+TargetPosRecalculateRange = 1.5
+UpdateUptimeInterval = 10
+MaxCoreStuckTime = 0
+AddonChannel = 1
+
+###################################################################################################################
+# SERVER LOGGING
+#
+# LogSQL
+# Enable logging of GM commands - all SQL code will be written to a log file
+# All commands are written to a file: YYYY-MM-DD_logSQL.sql
+# If a new day starts (00:00:00) then a new file is created - the old file will not be deleted.
+# Default: 1 - Write SQL code to logfile
+# 0 - Do not log
+#
+# PidFile
+# World daemon PID file
+# Default: "" - do not create PID file
+# "./worldd.pid" - create PID file (recommended name)
+#
+# LogLevel
+# Server console level of logging
+# 0 = Minimum; 1 = Basic&Error; 2 = Detail; 3 = Full/Debug
+# Default: 3
+#
+# LogTime
+# Include time in server console output [hh:mm:ss]
+# Default: 0 (no time)
+# 1 (print time)
+#
+# LogFile
+# Logfile name
+# Default: "Server.log"
+# "" - Empty name disable creating log file
+#
+# LogTimestamp
+# Logfile with timestamp of server start in name
+# Default: 0 - no timestamp in name
+# 1 - add timestamp in name in form Logname_YYYY-MM-DD_HH-MM-SS.Ext for Logname.Ext
+#
+# LogFileLevel
+# Server file level of logging
+# 0 = Minimum; 1 = Error; 2 = Detail; 3 = Full/Debug
+# Default: 0
+#
+# LogFilter_TransportMoves
+# LogFilter_CreatureMoves
+# LogFilter_VisibilityChanges
+# Log filters
+# Default: 1 - not include with any log level
+# 0 - include in log if log level permit
+#
+# WorldLogFile
+# Packet logging file for the worldserver
+# Default: "world.log"
+#
+# DBErrorLogFile
+# Log file of DB errors detected at server run
+# Default: "DBErrors.log"
+#
+# CharLogFile
+# Character operations logfile name
+# Default: "Char.log"
+# "" - Empty name disable creating log file
+#
+# CharLogTimestamp
+# Logfile with timestamp of server start in name
+# Default: 0 - no timestamp in name
+# 1 - add timestamp in name in form Logname_YYYY-MM-DD_HH-MM-SS.Ext for Logname.Ext
+#
+# CharLogDump
+# Write character dump before deleting in Char.log
+# For restoration, cut character data from log starting from
+# line == START DUMP == to line == END DUMP == (without its) in file and load it using loadpdump command
+# Default: 0 - don't include dumping chars to log
+# 1 - include dumping chars to log
+#
+# GmLogFile
+# Log file of gm commands
+# Default: "gm_commands.log"
+# "" - Empty name for disable
+#
+# GmLogTimestamp
+# GM Logfile with timestamp of server start in name
+# Default: 0 - no timestamp in name
+# 1 - add timestamp in name in form Logname_YYYY-MM-DD_HH-MM-SS.Ext for Logname.Ext
+#
+# GmLogPerAccount
+# GM Logfiles with GM account id (Note: logs not created if GmLogFile not set)
+# Default: 0 - add gm log data to single log file
+# 1 - add gm log data to account specific log files with name
+# in form Logname_#ID_YYYY-MM-DD_HH-MM-SS.Ext
+# or form Logname_#ID.Ext
+#
+# RaLogFile
+# Log file of RA commands
+# Default: "Ra.log"
+# "" - Empty name for disable
+#
+# LogColors
+# Color for messages (format "normal_color details_color debug_color error_color")
+# Colors: 0 - BLACK, 1 - RED, 2 - GREEN, 3 - BROWN, 4 - BLUE, 5 - MAGENTA, 6 - CYAN, 7 - GREY,
+# 8 - YELLOW, 9 - LRED, 10 - LGREEN, 11 - LBLUE, 12 - LMAGENTA, 13 - LCYAN, 14 - WHITE
+# Default: "" - none colors
+# Example: "13 7 11 9"
+#
+###################################################################################################################
+
+LogSQL = 1
+PidFile = ""
+LogLevel = 1
+LogTime = 0
+LogFile = "Server.log"
+LogTimestamp = 0
+LogFileLevel = 0
+LogFilter_TransportMoves = 1
+LogFilter_CreatureMoves = 1
+LogFilter_VisibilityChanges = 1
+WorldLogFile = ""
+DBErrorLogFile = "db_errors.log"
+CharLogFile = "characters.log"
+CharLogTimestamp = 0
+CharLogDump = 0
+GmLogFile = "gm_commands.log"
+GmLogTimestamp = 0
+GmLogPerAccount = 0
+RaLogFile = "ra_commands.log"
+LogColors = ""
+
+###################################################################################################################
+# SERVER SETTINGS
+#
+# GameType
+# Server realm style
+# 0 = NORMAL;1 = PVP; 4 = NORMAL; 6 = RP; 8 = RPPVP
+# also custom type: 16 FFA_PVP (free for all pvp mode like arena PvP in all zones except rest
+# activated places and sanctuaries)
+#
+# RealmZone
+# Server realm zone (set allowed alphabet in character names/etc). See also Strict*Names options.
+#
+# 1 Development - any language (Default)
+# 2 United States - extended-Latin
+# 3 Oceanic - extended-Latin
+# 4 Latin America - extended-Latin
+# 5 Tournament - basic-Latin at create, any at login
+# 6 Korea - East-Asian
+# 7 Tournament - basic-Latin at create, any at login
+# 8 English - extended-Latin
+# 9 German - extended-Latin
+# 10 French - extended-Latin
+# 11 Spanish - extended-Latin
+# 12 Russian - Cyrillic
+# 13 Tournament - basic-Latin at create, any at login
+# 14 Taiwan - East-Asian
+# 15 Tournament - basic-Latin at create, any at login
+# 16 China - East-Asian
+# 17 CN1 - basic-Latin at create, any at login
+# 18 CN2 - basic-Latin at create, any at login
+# 19 CN3 - basic-Latin at create, any at login
+# 20 CN4 - basic-Latin at create, any at login
+# 21 CN5 - basic-Latin at create, any at login
+# 22 CN6 - basic-Latin at create, any at login
+# 23 CN7 - basic-Latin at create, any at login
+# 24 CN8 - basic-Latin at create, any at login
+# 25 Tournament - basic-Latin at create, any at login
+# 26 Test Server - any language
+# 27 Tournament - basic-Latin at create, any at login
+# 28 QA Server - any language
+# 29 CN9 - basic-Latin at create, any at login
+#
+# Expansion
+# Allow server use content from expansion
+# 2 - check expansion 2 maps existence, and if client support expansion 2 and account have
+# expansion 2 setting then allow visit expansion 2 maps, allow create new class character)
+# Default: 1 - check expansion 1 maps existence, and if client support expansion 1 and account have
+# expansion 1 setting then allow visit expansion 1 maps, allow create new races character)
+# 0 - not check expansion maps existence, not allow wisit its, not allow create new race or new class
+# characters, ignore account expansion setting)
+#
+# DBC.Locale
+# DBC Language Settings
+# 0 = English; 1 = Korean; 2 = French; 3 = German; 4 = Chinese; 5 = Taiwanese; 6 = Spanish; 7 = Spanish Mexico
+# 8 = Russian; 255 = Auto Detect (Default)
+#
+# DeclinedNames
+# Allow russian clients to set and use declined names
+# Default: 0 - do not use declined names, except when the Russian RealmZone is set
+# 1 - use declined names
+#
+# StrictPlayerNames
+# Limit player name to language specific symbols set, not allow create characters, and set rename request and disconnect at not allowed symbols name
+# Default: 0 disable (but limited server timezone dependent client check)
+# 1 basic latin characters (strict)
+# 2 realm zone specific (strict). See RealmZone setting.
+# Note: In any case if you want correctly see character name at client this client must have apporopriate fonts
+# (included in client by default, with active official localization or custom localization fonts in clientdir/Fonts).
+# 3 basic latin characters + server timezone specific
+#
+# StrictCharterNames
+# Limit guild/arena team charter names to language specific symbols set, not allow create charters with allowed symbols in name
+# Default: 0 disable
+# 1 basic latin characters (strict)
+# 2 realm zone specific (strict). See RealmZone setting.
+# Note: In any case if you want correctly see character name at client this client must have apporopriate fonts
+# (included in client by default, with active official localization or custom localization fonts in clientdir/Fonts).
+# 3 basic latin characters + server timezone specific
+#
+# StrictPetNames
+# Limit pet names to language specific symbols set
+# Default: 0 disable
+# 1 basic latin characters (strict)
+# 2 realm zone specific (strict). See RealmZone setting.
+# Note: In any case if you want correctly see character name at client this client must have apporopriate fonts
+# (included in client by default, with active official localization or custom localization fonts in clientdir/Fonts).
+# 3 basic latin characters + server timezone specific
+#
+# CharactersCreatingDisabled
+# Disable characters creating for specific team or any (non-player accounts not affected)
+# Default: 0 - enabled
+# 1 - disabled only for Alliance
+# 2 - disabled only for Horde
+# 3 - disabled for both teams
+#
+# MaxWhoListReturns
+# Set the maximum number of players returned in the /who list and interface.
+# Default: 49 (stable)
+#
+# CharactersPerAccount
+# Limit numbers of characters per account (at all realms).
+# Note: this setting limit character creating at _current_ realm base at characters amount at all realms
+# Default: 50
+# The number must be >= CharactersPerRealm
+#
+# CharactersPerRealm
+# Limit numbers of characters for account at realm
+# 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
+# 1 - show intro only for first character of selected race
+# 2 - disable intro show in all cases
+#
+# MaxPlayerLevel
+# Max level that can be reached by player for experience (in range from 1 to 100).
+# Change not recommended
+# Default: 80
+#
+# 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)
+# Default: 0
+#
+# MaxHonorPoints
+# Max honor points that player can have.
+# Default: 75000
+#
+# StartHonorPoints
+# Amount of honor that new players will start with
+# Default: 0
+#
+# MaxArenaPoints
+# Max arena points that player can have.
+# Default: 5000
+#
+# StartArenaPoints
+# Amount of arena points that new players will start with
+# Default: 0
+#
+# InstantLogout
+# Enable or disable instant logout for security level (0..4) or high (NOT in combat/while dueling/while falling)
+# Default: 1 (Mods/GMs/Admins)
+#
+# DisableWaterBreath
+# Disable/enable waterbreathing for security level (0..4) or high
+# Default: 4 (None)
+#
+# AllFlightPaths
+# Players will start with all flight paths (Note: ALL flight paths, not only player's team)
+# Default: 0 (true)
+# 1 (false)
+#
+# AlwaysMaxSkillForLevel
+# Players will automatically gain max level dependent (weapon/defense) skill when logging in, leveling up etc.
+# Default: 0 (false)
+# 1 (true)
+#
+# ActivateWeather
+# Activate weather system
+# Default: 1 (true)
+# 0 (false)
+#
+# Battleground.CastDeserter
+# Cast or not Deserter spell at player who leave battleground in progress
+# Default: 1 (true)
+# 0 (false)
+#
+# Battleground.QueueAnnouncer.Enable
+# Enable queue announcer posting to chat
+# Default: 0 (false)
+# 1 (true)
+#
+# Battleground.QueueAnnouncer.PlayerOnly
+# Enable queue announcer posting to chat
+# Default: 0 (false)
+# 1 (true)
+#
+# Arena.QueueAnnouncer.Enable: Enable queue announcer posting to chat
+# Default: 0 (false)
+# 1 (true)
+#
+# CastUnstuck
+# Allow cast or not Unstuck spell at .start or client Help option use
+# Default: 1 (true)
+# 0 (false)
+#
+# Instance.IgnoreLevel
+# Ignore level requirement to enter instance
+# Default: 0 (false)
+# 1 (true)
+#
+# Instance.IgnoreRaid
+# Ignore raid requirement to enter instance
+# Default: 0 (false)
+# 1 (true)
+#
+# Instance.ResetTimeHour
+# The hour of the day (0-23) when the global instance resets occur.
+# Default: 4
+#
+# Instance.UnloadDelay
+# Unload the instance map from memory after some time if no players are inside.
+# Default: 1800000 (miliseconds, i.e 30 minutes)
+# 0 (instance maps are kept in memory until they are reset)
+#
+# Quests.LowLevelHideDiff
+# Quest level difference to hide for player low level quests:
+# if player_level > quest_level + LowLevelQuestsHideDiff then quest "!" mark not show for quest giver
+# Default: 4
+# -1 (show all available quests marks)
+#
+# Quests.HighLevelHideDiff
+# Quest level difference to hide for player high level quests:
+# if player_level < quest_min_level - HighLevelQuestsHideDiff then quest "!" mark not show for quest giver
+# Default: 7
+# -1 (show all available quests marks)
+#
+# MaxPrimaryTradeSkill
+# Max count that player can learn the primary trade skill.
+# Default: 2
+# Max : 10
+#
+# MinPetitionSigns
+# Min signatures count to creating guild (0..9).
+# Default: 9
+#
+# MaxGroupXPDistance
+# Max distance to creature for group memeber to get XP at creature death.
+# Default: 74
+#
+# MailDeliveryDelay
+# Mail delivery delay time for item sending
+# 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
+# Default: 0 - no skilups
+# 1 - skilups possible
+#
+# Event.Announce
+# Default: 0 (false)
+# 1 (true)
+#
+# BeepAtStart
+# Beep at core start finished (mostly work only at Unix/Linux systems)
+# Default: 1 (true)
+# 0 (false)
+#
+# Motd
+# Message of the Day. Displayed at worldlogin for every user ('@' for a newline).
+#
+###################################################################################################################
+
+GameType = 1
+RealmZone = 1
+Expansion = 2
+DBC.Locale = 255
+DeclinedNames = 0
+StrictPlayerNames = 0
+StrictCharterNames = 0
+StrictPetNames = 0
+MaxWhoListReturns = 49
+CharactersCreatingDisabled = 0
+CharactersPerAccount = 50
+CharactersPerRealm = 10
+HeroicCharactersPerRealm = 1
+MinLevelForHeroicCharacterCreating = 55
+SkipCinematics = 0
+MaxPlayerLevel = 80
+StartPlayerLevel = 1
+StartHeroicPlayerLevel = 55
+StartPlayerMoney = 0
+MaxHonorPoints = 75000
+StartHonorPoints = 0
+MaxArenaPoints = 5000
+StartArenaPoints = 0
+InstantLogout = 1
+DisableWaterBreath = 4
+AllFlightPaths = 0
+AlwaysMaxSkillForLevel = 0
+ActivateWeather = 1
+Battleground.CastDeserter = 1
+Battleground.QueueAnnouncer.Enable = 0
+Battleground.QueueAnnouncer.PlayerOnly = 0
+Arena.QueueAnnouncer.Enable = 0
+CastUnstuck = 1
+Instance.IgnoreLevel = 0
+Instance.IgnoreRaid = 0
+Instance.ResetTimeHour = 4
+Instance.UnloadDelay = 1800000
+Quests.LowLevelHideDiff = 4
+Quests.HighLevelHideDiff = 7
+MaxPrimaryTradeSkill = 2
+MinPetitionSigns = 9
+MaxGroupXPDistance = 74
+MailDeliveryDelay = 3600
+SkillChance.Prospecting = 0
+SkillChance.Milling = 0
+Event.Announce = 0
+BeepAtStart = 1
+Motd = "Welcome to a Trinity Core server."
+
+###################################################################################################################
+# PLAYER INTERACTION
+#
+# AllowTwoSide.Accounts
+# Allow or not accounts to create characters in the 2 teams in any game type.
+# Default: 0 (Not allowed)
+# 1 (Allowed)
+#
+# AllowTwoSide.Interaction.Chat
+# AllowTwoSide.Interaction.Channel
+# AllowTwoSide.Interaction.Group
+# AllowTwoSide.Interaction.Guild
+# AllowTwoSide.Interaction.Auction
+# AllowTwoSide.Interaction.Mail
+# Allow or not common :chat(say,yell);channel(chat)group(join)guild(join);merge all auction houses for players from
+# different teams, send mail to different team.
+# Default: 0 (Not allowed)
+# 1 (Allowed)
+#
+# AllowTwoSide.WhoList
+# Allow or not show player from both team in who list.
+# Default: 0 (Not allowed)
+# 1 (Allowed)
+#
+# AllowTwoSide.AddFriend
+# Allow or not adding friends from other team in friend list.
+# Default: 0 (Not allowed)
+# 1 (Allowed)
+#
+# TalentsInspecting
+# Allow other players see character talents in inspect dialog (Characters in Gamemaster mode can
+# inspect talents always)
+# Default: 1 (allow)
+# 0 (not allow)
+#
+###################################################################################################################
+
+AllowTwoSide.Accounts = 0
+AllowTwoSide.Interaction.Chat = 0
+AllowTwoSide.Interaction.Channel = 0
+AllowTwoSide.Interaction.Group = 0
+AllowTwoSide.Interaction.Guild = 0
+AllowTwoSide.Interaction.Auction = 0
+AllowTwoSide.Interaction.Mail = 0
+AllowTwoSide.WhoList = 0
+AllowTwoSide.AddFriend = 0
+TalentsInspecting = 1
+
+###################################################################################################################
+# CREATURE SETTINGS
+#
+# ThreatRadius
+# Radius for creature to evade after being pulled away from combat start point
+# If ThreatRadius is less than creature aggro radius then aggro radius will be used
+# Default: 100 yards
+#
+# Rate.Creature.Aggro
+# Aggro radius percent or off.
+# Default: 1 - 100%
+# 1.5 - 150%
+# 0 - off (0%)
+#
+# CreatureFamilyAssistanceRadius
+# Creature family assistance radius
+# Default: 10
+# 0 - off
+#
+# CreatureFamilyAssistanceDelay
+# Reaction time for creature assistance call
+# Default: 1500 (1.5s)
+#
+# WorldBossLevelDiff
+# Difference for boss dynamic level with target
+# Default: 3
+#
+# Corpse.Decay.NORMAL
+# Corpse.Decay.RARE
+# Corpse.Decay.ELITE
+# Corpse.Decay.RAREELITE
+# Corpse.Decay.WORLDBOSS
+# Seconds until creature corpse will decay without being looted or skinned.
+# Default: 60, 300, 300, 300, 3600
+#
+# Rate.Corpse.Decay.Looted
+# Controls how long the creature corpse stays after it had been looted, as a multiplier of its Corpse.Decay.* config.
+# Default: 0.1
+#
+# Rate.Creature.Normal.Damage
+# Rate.Creature.Elite.Elite.Damage
+# Rate.Creature.Elite.RAREELITE.Damage
+# Rate.Creature.Elite.WORLDBOSS.Damage
+# Rate.Creature.Elite.RARE.Damage
+# Creature Damage Rates.
+# Examples: 2 - creatures will damage 2x, 1.7 - 1.7x.
+#
+# Rate.Creature.Normal.SpellDamage
+# Rate.Creature.Elite.Elite.SpellDamage
+# Rate.Creature.Elite.RAREELITE.SpellDamage
+# Rate.Creature.Elite.WORLDBOSS.SpellDamag
+# Rate.Creature.Elite.RARE.SpellDamage
+# Creature Spell Damage Rates.
+# Examples: 2 - creatures will damage with spells 2x, 1.7 - 1.7x.
+#
+# Rate.Creature.Normal.HP
+# Rate.Creature.Elite.Elite.HP
+# Rate.Creature.Elite.RAREELITE.HP
+# Rate.Creature.Elite.WORLDBOSS.HP
+# Rate.Creature.Elite.RARE.HP
+# Creature Health Ammount Modifier.
+# Examples: 2 - creatures have 2x health, 1.7 - 1.7x.
+#
+# ListenRange.Say
+# Distance from player to listen text that creature (or other world object) say
+# Default: 25
+#
+# ListenRange.TextEmote
+# Distance from player to listen textemote that creature (or other world object) say
+# Default: 25
+#
+# ListenRange.Yell
+# Distance from player to listen text that creature (or other world object) yell
+# Default: 300
+#
+###################################################################################################################
+
+ThreatRadius = 100
+Rate.Creature.Aggro = 1
+CreatureFamilyAssistanceRadius = 10
+CreatureFamilyAssistanceDelay = 1500
+WorldBossLevelDiff = 3
+Corpse.Decay.NORMAL = 60
+Corpse.Decay.RARE = 300
+Corpse.Decay.ELITE = 300
+Corpse.Decay.RAREELITE = 300
+Corpse.Decay.WORLDBOSS = 3600
+Rate.Corpse.Decay.Looted = 0.1
+Rate.Creature.Normal.Damage = 1
+Rate.Creature.Elite.Elite.Damage = 1
+Rate.Creature.Elite.RAREELITE.Damage = 1
+Rate.Creature.Elite.WORLDBOSS.Damage = 1
+Rate.Creature.Elite.RARE.Damage = 1
+Rate.Creature.Normal.SpellDamage = 1
+Rate.Creature.Elite.Elite.SpellDamage = 1
+Rate.Creature.Elite.RAREELITE.SpellDamage = 1
+Rate.Creature.Elite.WORLDBOSS.SpellDamage = 1
+Rate.Creature.Elite.RARE.SpellDamage = 1
+Rate.Creature.Normal.HP = 1
+Rate.Creature.Elite.Elite.HP = 1
+Rate.Creature.Elite.RAREELITE.HP = 1
+Rate.Creature.Elite.WORLDBOSS.HP = 1
+Rate.Creature.Elite.RARE.HP = 1
+ListenRange.Say = 40
+ListenRange.TextEmote = 40
+ListenRange.Yell = 300
+
+###################################################################################################################
+# CHAT SETTINGS
+#
+# ChatFakeMessagePreventing
+# Chat protection from creating fake messages using a lot spaces (other invisible symbols),
+# not applied to addon language messages, but can prevent working old addons
+# that use normal languages for sending data to another clients.
+# Default: 0 (disible fake messages preventing)
+# 1 (enabled fake messages preventing)
+#
+# ChatFlood.MessageCount
+# Chat anti-flood protection, haste message count to activate protection
+# Default: 10
+# 0 (disible anti-flood protection)
+#
+# ChatFlood.MessageDelay
+# Chat anti-flood protection, minimum message delay to count message
+# Default: 1 (in secs)
+#
+# ChatFlood.MuteTime
+# Chat anti-flood protection, mute time at activation flood protection (not saved)
+# Default: 10 (in secs)
+#
+# Channel.RestrictedLfg
+# Restrict use LookupForGroup channel only registered in LFG tool players
+# Default: 1 (allow join to channel only if active in LFG)
+# 0 (allow join to channel in any time)
+#
+# Channel.SilentlyGMJoin
+# Silently join GM characters (security level > 1) to channels
+# Default: 0 (join announcement in normal way)
+# 1 (GM join without announcement)
+#
+###################################################################################################################
+
+ChatFakeMessagePreventing = 0
+ChatFlood.MessageCount = 10
+ChatFlood.MessageDelay = 1
+ChatFlood.MuteTime = 10
+Channel.RestrictedLfg = 1
+Channel.SilentlyGMJoin = 0
+
+###################################################################################################################
+# GAME MASTER SETTINGS
+#
+# GM.LoginState
+# GM mode at login
+# Default: 2 (last save state)
+# 0 (disable)
+# 1 (enable)
+#
+# GM.AcceptTickets
+# Is GM accepting tickets from player by default or not.
+# Default: 2 (last save state)
+# 0 (disable)
+# 1 (enable)
+#
+# GM.Chat
+# GM chat mode at login
+# Default: 2 (last save state)
+# 0 (disable)
+# 1 (enable)
+#
+# GM.WhisperingTo
+# Is GM accepting whispers from player by default or not.
+# Default: 2 (last save state)
+# 0 (disable)
+# 1 (enable)
+#
+# GM.InGMList
+# Is GM showed in GM list (if visible) in non-GM state (.gmoff)
+# Default: 0 (false)
+# 1 (true)
+#
+# GM.InWhoList
+# Is GM showed in who list (if visible).
+# Default: 0 (false)
+# 1 (true)
+#
+# GM.LogTrade
+# Include GM trade and trade slot enchanting operations in GM log if it enable
+# Default: 1 (include)
+# 0 (not include)
+#
+# GM.StartLevel
+# GM starting level (1-100)
+# Default: 1
+#
+###################################################################################################################
+
+GM.LoginState = 2
+GM.AcceptTickets = 2
+GM.Chat = 2
+GM.WhisperingTo = 2
+GM.InGMList = 0
+GM.InWhoList = 0
+GM.LogTrade = 1
+GM.StartLevel = 70
+
+###################################################################################################################
+# VISIBILITY AND RADIUSES
+#
+# Visibility.GroupMode
+# Group visibility modes
+# Default: 0 (standard setting: only members from same group can 100% auto detect invisible player)
+# 1 (raid members 100% auto detect invisible player from same raid)
+# 2 (players from same team can 100% auto detect invisible player)
+#
+# Visibility.Distance.Creature
+# Visibility.Distance.Player
+# Visibility distance for different in game object
+# Max limited by active player zone: ~ 333
+# Min limit dependent from objects
+# Default: 132 (cell size)
+# Min limit is max aggro radius (45) * Rate.Creature.Aggro
+#
+# Visibility.Distance.Object
+# Visible distance for gameobject, dynobject, bodies, corpses, bones
+# Min limit is iteraction distance (5)
+#
+# Visibility.Distance.InFlight
+# Visible distance for player in flight
+# Min limit is 0 (not show any objects)
+#
+# Visibility.Distance.Grey.Unit
+# Visibility grey distance for creatures/players (fast changing objects)
+# addition to appropriate object type Visibility.Distance.* use in case visibility removing to
+# object (except corpse around distences) If � is distance and G is grey distance then object
+# make visible if distance to it <= D but make non visible if distance > D+G
+# Default: 1 (yard)
+#
+# Visibility.Distance.Grey.Object
+# Visibility grey distance for dynobjects/gameobjects/corpses/creature bodies
+# Default: 10 (yards)
+#
+#
+###################################################################################################################
+
+Visibility.GroupMode = 0
+Visibility.Distance.Creature = 132
+Visibility.Distance.Player = 132
+Visibility.Distance.Object = 132
+Visibility.Distance.InFlight = 132
+Visibility.Distance.Grey.Unit = 1
+Visibility.Distance.Grey.Object = 10
+
+###################################################################################################################
+# SERVER RATES
+#
+# Rate.Health
+# Rate.Mana
+# Rate.Rage.Income
+# Rate.Rage.Loss
+# Rate.RunicPower.Income
+# Rate.RunicPower.Loss
+# Rate.Focus
+# Health and power regeneration and rage income from damage.
+# Default: 1
+#
+# Rate.Skill.Discovery
+# Skill Discovery Rates
+# Default: 1
+#
+# Rate.Drop.Item.Poor
+# Rate.Drop.Item.Normal
+# Rate.Drop.Item.Uncommon
+# Rate.Drop.Item.Rare
+# Rate.Drop.Item.Epic
+# Rate.Drop.Item.Legendary
+# Rate.Drop.Item.Artifact
+# Rate.Drop.Item.Referenced
+# Rate.Drop.Money
+# Drop rates (items by quality and money)
+# Default: 1
+#
+# Rate.Drop.Money
+# Drop rates
+# Default: 1
+#
+# Rate.XP.Kill
+# Rate.XP.Quest
+# Rate.XP.Explore
+# XP rates
+# Default: 1
+#
+# Rate.XP.PastLevel70
+# XP needed per level past 70 (Rates below 1 not recommended)
+# Default: 1
+#
+# Rate.Rest.InGame
+# Rate.Rest.Offline.InTavernOrCity
+# Rate.Rest.Offline.InWilderness
+# Resting points grow rates (1 - normal, 2 - double rate, 0.5 - half rate, etc) from standard values
+#
+# Rate.Damage.Fall
+# Damage after fall rate. (1 - standard, 2 - double damage, 0.5 - half damage, etc)
+#
+# Rate.Auction.Time
+# Rate.Auction.Deposit
+# Rate.Auction.Cut
+# Auction rates (auction time, deposit get at auction start, auction cut from price at auction end)
+#
+# Rate.Honor
+# Honor gain rate
+#
+# Rate.Mining.Amount
+# Rate.Mining.Next
+# Mining Rates (Mining.Amount changes minimum/maximum usetimes of a deposit,
+# Mining.Next changes chance to have next use of a deposit)
+#
+# Rate.Talent
+# Talent Point rates
+# Default: 1
+#
+# Rate.Reputation.Gain
+# Reputation Gain rate
+# Default: 1
+#
+# Rate.InstanceResetTime
+# Multiplier for the number of days in between global raid/heroic instance resets.
+# Default: 1
+#
+# SkillGain.Crafting
+# SkillGain.Defense
+# SkillGain.Gathering
+# SkillGain.Weapon
+# crafting/defense/gathering/weapon skills gain at skill grow (1,2,...)
+# Default: 1
+#
+# SkillChance.Orange
+# SkillChance.Yellow
+# SkillChance.Green
+# SkillChance.Grey
+# Skill chance values (0..100)
+# Default: 100-75-25-0
+#
+# SkillChance.MiningSteps
+# SkillChance.SkinningSteps
+# For skinning and Mining chance decrease with skill level.
+# Default: 0 - no decrease
+# 75 - in 2 times each 75 skill points
+#
+# DurabilityLossChance.Damage
+# Chance lost one from equiped items durability point at damage apply or receive.
+# Default: 0.5 (100/0.5 = 200) Each 200 damage apply one from 19 possible equipped items
+#
+# DurabilityLossChance.Absorb
+# Chance lost one from armor items durability point at damage absorb.
+# Default: 0.5 (100/0.5 = 200) Each 200 absorbs apply one from 15 possible armor equipped items
+#
+# DurabilityLossChance.Parry
+# Chance lost weapon durability point at parry.
+# Default: 0.05 (100/0.05 = 2000) Each 2000 parry attacks main weapon lost point
+#
+# DurabilityLossChance.Block
+# Chance lost sheild durability point at damage block.
+# Default: 0.05 (100/0.05 = 2000) Each 2000 partly or full blocked attacks shield lost point
+#
+# Death.SicknessLevel
+# Starting Character start gain sickness at spirit resurrection (1 min)
+# Default: 11
+# -10 - character will have full time (10min) sickness at 1 level
+# maxplayerlevel+1 - chaarcter will not have sickess at any level
+#
+# Death.CorpseReclaimDelay.PvP
+# Death.CorpseReclaimDelay.PvE
+# Enabled/disabled increase corpse reclaim delay at often PvP/PvE deaths
+# Default: 1 (enabled)
+# 0 (disabled)
+#
+###################################################################################################################
+
+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.Skill.Discovery = 1
+Rate.Drop.Item.Poor = 1
+Rate.Drop.Item.Normal = 1
+Rate.Drop.Item.Uncommon = 1
+Rate.Drop.Item.Rare = 1
+Rate.Drop.Item.Epic = 1
+Rate.Drop.Item.Legendary = 1
+Rate.Drop.Item.Artifact = 1
+Rate.Drop.Item.Referenced = 1
+Rate.Drop.Money = 1
+Rate.XP.Kill = 1
+Rate.XP.Quest = 1
+Rate.XP.Explore = 1
+Rate.XP.PastLevel70 = 1
+Rate.Rest.InGame = 1
+Rate.Rest.Offline.InTavernOrCity = 1
+Rate.Rest.Offline.InWilderness = 1
+Rate.Damage.Fall = 1
+Rate.Auction.Time = 1
+Rate.Auction.Deposit = 1
+Rate.Auction.Cut = 1
+Rate.Honor = 1
+Rate.Mining.Amount = 1
+Rate.Mining.Next = 1
+Rate.Talent = 1
+Rate.Reputation.Gain = 1
+Rate.InstanceResetTime = 1
+SkillGain.Crafting = 1
+SkillGain.Defense = 1
+SkillGain.Gathering = 1
+SkillGain.Weapon = 1
+SkillChance.Orange = 100
+SkillChance.Yellow = 75
+SkillChance.Green = 25
+SkillChance.Grey = 0
+SkillChance.MiningSteps = 0
+SkillChance.SkinningSteps = 0
+DurabilityLossChance.Damage = 0.5
+DurabilityLossChance.Absorb = 0.5
+DurabilityLossChance.Parry = 0.05
+DurabilityLossChance.Block = 0.05
+Death.SicknessLevel = 11
+Death.CorpseReclaimDelay.PvP = 1
+Death.CorpseReclaimDelay.PvE = 1
+
+###################################################################################################################
+#
+# Rated arena matches config
+#
+# MaxRatingDifference: the maximum rating difference between two groups in rated matches
+# Default: 0 (disable, rating difference is discarded)
+#
+# RatingDiscardTimer: after the specified milliseconds has passed,
+# rating information will be discarded when selecting teams for matches
+# also initiates an update by this timer
+# Default: 60000
+#
+# AutoDistributePoints: set if arena points should be distributed automatically, or by GM command
+# Default: 0 (disable) (recommended): use gm command or sql query to distribute the points
+# 1 (enable): arena points are distributed automatically
+#
+# AutoDistributeInterval: how often should the distribution take place
+# if automatic distribution is enabled
+# in days
+# Default: 7 (weekly)
+#
+###################################################################################################################
+
+Arena.MaxRatingDifference = 0
+Arena.RatingDiscardTimer = 60000
+Arena.AutoDistributePoints = 0
+Arena.AutoDistributeInterval = 7
+
+###################################################################################################################
+#
+# Battleground config
+#
+# PrematureFinishTimer: the time to end the bg if there are less than minplayersperteam on one side
+# in milliseconds
+# Default: 300000
+# 0 - disable
+#
+###################################################################################################################
+
+BattleGround.PrematureFinishTimer = 300000
+
+
+###################################################################################################################
+#
+# NETWORK CONFIG
+#
+# Network.Threads
+# Number of threads for network, recommend 1 thread per 1000 connections.
+# Default: 1
+#
+# Network.OutKBuff
+# The size of the output kernel buffer used ( SO_SNDBUF socket option, tcp manual ).
+# Default: -1 (Use system default setting)
+#
+# Network.OutUBuff
+# Userspace buffer for output. This is amount of memory reserved per each connection.
+# Default: 65536
+#
+# Network.TcpNoDelay:
+# TCP Nagle algorithm setting
+# Default: 0 (enable Nagle algorithm, less traffic, more latency)
+# 1 (TCP_NO_DELAY, disable Nagle algorithm, more traffic but less latency)
+#
+###################################################################################################################
+
+Network.Threads = 1
+Network.OutKBuff = -1
+Network.OutUBuff = 65536
+Network.TcpNodelay = 1
+
+###################################################################################################################
+# CONSOLE AND REMOTE ACCESS
+#
+# Console.Enable
+# Enable console
+# Default: 1 - on
+# 0 - off
+#
+# Ra.Enable
+# Enable remote console
+# Default: 0 - off
+# 1 - on
+#
+# Ra.IP
+# Default remote console ip address, use 0.0.0.0 for every address
+#
+# Ra.Port
+# Default remote console port
+#
+# Ra.MinLevel
+# Minimum level that's required to login,3 by default
+#
+# Ra.Secure
+# Kick client on wrong pass
+#
+###################################################################################################################
+
+Console.Enable = 1
+Ra.Enable = 0
+Ra.IP = 0.0.0.0
+Ra.Port = 3443
+Ra.MinLevel = 3
+Ra.Secure = 1
+
+###################################################################################################################
+# CUSTOM SERVER OPTIONS
+#
+# PlayerStart.AllReputation
+# Players will start with most of the high level reputations that are needed for items, mounts etc.
+# If there are any reputation faction you want to be added, just tell me.
+#
+# PlayerStart.AllSpells
+# If enabled, players will start with all their class spells (not talents). Useful for instant 70 servers.
+# You must import playercreateinfo_spell_custom.sql, it's included in the SQL folder.
+# Default: 0 - off
+# 1 - on
+#
+# PlayerStart.MapsExplored
+# Players will start with all maps explored if enabled
+#
+# MusicInBattleground
+# If enabled, "L70ETC - Power of the horde" will be played when BG starts ;)
+#
+# HonorPointsAfterDuel
+# The amount of honor points the duel winner will get after a duel.
+# Default: 0 - disable
+#
+# AlwaysMaxWeaponSkill
+# Players will automatically gain max weapon/defense skill when logging in, leveling up etc.
+#
+# PvPToken.Enable
+# Enable/disable PvP Token System. Players will get a token after slaying another player that gives honor.
+#
+# PvPToken.MapAllowType
+# Where players can receive the pvp token
+# 4 - In all maps
+# 3 - In battlegrounds only
+# 2 - In FFA areas only (gurubashi arena etc)
+# 1 - In battlegrounds AND FFA areas only
+#
+# PvPToken.ItemID
+# The item players will get after killing someone if PvP Token system is enabled.
+# Default: 29434 - Badge of justice
+#
+# PvPToken.ItemCount
+# Modify the item ID count - Default: 1
+#
+# NoResetTalentsCost
+# Enable or disable no cost when reseting talents
+#
+# ForbiddenMaps
+# map ids that users below SEC_GAMEMASTER cannot enter, with delimiter ','
+# Default: ""
+# example: "538,90"
+# Note that it's HIGHLY DISCOURAGED to forbid starting maps (0, 1, 530)!
+#
+###################################################################################################################
+
+PlayerStart.AllReputation = 0
+PlayerStart.AllSpells = 0
+PlayerStart.MapsExplored = 0
+MusicInBattleground = 0
+HonorPointsAfterDuel = 0
+AlwaysMaxWeaponSkill = 0
+PvPToken.Enable = 0
+PvPToken.MapAllowType = 4
+PvPToken.ItemID = 29434
+PvPToken.ItemCount = 1
+NoResetTalentsCost = 0
+
diff --git a/src/trinitycore/TrinityCore.rc b/src/mangosd/mangosd.rc
index 4e6510c0407..4e6510c0407 100644
--- a/src/trinitycore/TrinityCore.rc
+++ b/src/mangosd/mangosd.rc
diff --git a/src/trinitycore/monitor-mangosd b/src/mangosd/monitor-mangosd
index a740ae5e8fa..a740ae5e8fa 100644
--- a/src/trinitycore/monitor-mangosd
+++ b/src/mangosd/monitor-mangosd
diff --git a/src/trinitycore/resource.h b/src/mangosd/resource.h
index 7e7d8e4b76f..7e7d8e4b76f 100644
--- a/src/trinitycore/resource.h
+++ b/src/mangosd/resource.h
diff --git a/src/trinitycore/run-mangosd b/src/mangosd/run-mangosd
index f307bd9e1ad..f307bd9e1ad 100644
--- a/src/trinitycore/run-mangosd
+++ b/src/mangosd/run-mangosd
diff --git a/src/trinityrealm/AuthCodes.h b/src/realmd/AuthCodes.h
index 768f51efb59..f322d7fea17 100644
--- a/src/trinityrealm/AuthCodes.h
+++ b/src/realmd/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 and WoW:TBC 2.4.3 client build 8606...
+// will only support WoW, WoW:TBC and WoW:WotLK 3.0.3 client build 9183...
-#define EXPECTED_TRINITY_CLIENT_BUILD {8606, 0}
+#define EXPECTED_TRINITY_CLIENT_BUILD {9183, 0}
#endif
diff --git a/src/trinityrealm/AuthSocket.cpp b/src/realmd/AuthSocket.cpp
index 7168bcf700b..7168bcf700b 100644
--- a/src/trinityrealm/AuthSocket.cpp
+++ b/src/realmd/AuthSocket.cpp
diff --git a/src/trinityrealm/AuthSocket.h b/src/realmd/AuthSocket.h
index f704283c215..f704283c215 100644
--- a/src/trinityrealm/AuthSocket.h
+++ b/src/realmd/AuthSocket.h
diff --git a/src/trinityrealm/Main.cpp b/src/realmd/Main.cpp
index 0e2f68f76c6..8ba1db3c029 100644
--- a/src/trinityrealm/Main.cpp
+++ b/src/realmd/Main.cpp
@@ -40,12 +40,12 @@
#endif
#ifndef _TRINITY_REALM_CONFIG
-# define _TRINITY_REALM_CONFIG "trinityrealm.conf"
+# define _TRINITY_REALM_CONFIG "TrinityRealm.conf"
#endif //_TRINITY_REALM_CONFIG
#ifdef WIN32
#include "ServiceWin32.h"
-char serviceName[] = "realmd";
+char serviceName[] = "TrinityRealm";
char serviceLongName[] = "Trinity realm service";
char serviceDescription[] = "Massive Network Game Object Server";
/*
diff --git a/src/trinityrealm/Makefile.am b/src/realmd/Makefile.am
index 9baeed6c2b1..9baeed6c2b1 100644
--- a/src/trinityrealm/Makefile.am
+++ b/src/realmd/Makefile.am
diff --git a/src/trinityrealm/RealmList.cpp b/src/realmd/RealmList.cpp
index 97fdfbdd91f..97fdfbdd91f 100644
--- a/src/trinityrealm/RealmList.cpp
+++ b/src/realmd/RealmList.cpp
diff --git a/src/trinityrealm/RealmList.h b/src/realmd/RealmList.h
index 9cb5380bd25..9cb5380bd25 100644
--- a/src/trinityrealm/RealmList.h
+++ b/src/realmd/RealmList.h
diff --git a/src/trinityrealm/TrinityRealm.rc b/src/realmd/Realmd.rc
index 33c7eef719a..33c7eef719a 100644
--- a/src/trinityrealm/TrinityRealm.rc
+++ b/src/realmd/Realmd.rc
diff --git a/src/trinityrealm/TrinityRealm.ico b/src/realmd/TrinityRealm.ico
index da318f48a8c..da318f48a8c 100644
--- a/src/trinityrealm/TrinityRealm.ico
+++ b/src/realmd/TrinityRealm.ico
Binary files differ
diff --git a/src/trinityrealm/trinityrealm.conf.dist b/src/realmd/realmd.conf.dist.in
index 72ef1c9012e..72ef1c9012e 100644
--- a/src/trinityrealm/trinityrealm.conf.dist
+++ b/src/realmd/realmd.conf.dist.in
diff --git a/src/trinityrealm/resource.h b/src/realmd/resource.h
index 7e7d8e4b76f..7e7d8e4b76f 100644
--- a/src/trinityrealm/resource.h
+++ b/src/realmd/resource.h
diff --git a/src/shared/Auth/AuthCrypt.cpp b/src/shared/Auth/AuthCrypt.cpp
index 7941b33ed8c..199e7192537 100644
--- a/src/shared/Auth/AuthCrypt.cpp
+++ b/src/shared/Auth/AuthCrypt.cpp
@@ -50,9 +50,8 @@ 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 < CRYPTED_SEND_LEN; t++)
+ for (size_t t = 0; t < 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 f3a0cac40fa..366cce5635f 100644
--- a/src/shared/Auth/AuthCrypt.h
+++ b/src/shared/Auth/AuthCrypt.h
@@ -32,7 +32,6 @@ 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/ByteBuffer.h b/src/shared/ByteBuffer.h
index 9bdd6067fbc..efd704a4904 100644
--- a/src/shared/ByteBuffer.h
+++ b/src/shared/ByteBuffer.h
@@ -243,6 +243,32 @@ class ByteBuffer
_rpos += len;
}
+ bool readPackGUID(uint64& guid)
+ {
+ if(rpos()+1 > size())
+ return false;
+
+ guid = 0;
+
+ uint8 guidmark=0;
+ (*this) >> guidmark;
+
+ for(int i=0;i<8;i++)
+ {
+ if(guidmark & (uint8(1) << i))
+ {
+ if(rpos()+1 > size())
+ return false;
+
+ uint8 bit;
+ (*this) >> bit;
+ guid |= (uint64(bit) << (i*8));
+ }
+ }
+
+ return true;
+ }
+
const uint8 *contents() const { return &_storage[0]; }
size_t size() const { return _storage.size(); }
diff --git a/src/shared/Database/DBCEnums.h b/src/shared/Database/DBCEnums.h
index 1d54616a2b5..4f406c9cc63 100644
--- a/src/shared/Database/DBCEnums.h
+++ b/src/shared/Database/DBCEnums.h
@@ -34,28 +34,190 @@ 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, // 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_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_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, // outland zones? (only Eye of the Storm not have this flag, but have 0x00004000 flag)
+ AREA_FLAG_OUTLAND = 0x00000400, // expansion 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 2.4.2)
- AREA_FLAG_OUTLAND2 = 0x00004000, // outland 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 3.0.3)
+ AREA_FLAG_OUTLAND2 = 0x00004000, // expansion 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 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
+ 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
};
enum FactionTemplateFlags
@@ -109,4 +271,51 @@ 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 fb132c75768..c183f8356b4 100644
--- a/src/shared/Database/DBCStores.cpp
+++ b/src/shared/Database/DBCStores.cpp
@@ -35,9 +35,12 @@ 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);
@@ -58,7 +61,10 @@ 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);
@@ -84,6 +90,8 @@ 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);
@@ -101,8 +109,10 @@ 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);
@@ -125,8 +135,11 @@ 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;
@@ -178,7 +191,7 @@ void LoadDBCStores(const std::string& dataPath)
{
std::string dbcPath = dataPath+"dbc/";
- const uint32 DBCFilesCount = 56;
+ const uint32 DBCFilesCount = 66;
barGoLink bar( DBCFilesCount );
@@ -196,16 +209,19 @@ 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 )
+ if(area->zone==0 && area->mapid != 0 && area->mapid != 1 && area->mapid != 530 && area->mapid != 571 )
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");
@@ -229,7 +245,10 @@ 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");
@@ -254,6 +273,8 @@ 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");
@@ -303,8 +324,10 @@ 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
@@ -407,7 +430,10 @@ 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))
- ++pathLength[entry->path];
+ {
+ if (pathLength[entry->path] < entry->index + 1)
+ pathLength[entry->path] = entry->index + 1;
+ }
// Set path length
sTaxiPathNodesByPath.resize(pathCount); // 0 and some other indexes not used
for(uint32 i = 1; i < sTaxiPathNodesByPath.size(); ++i)
@@ -419,8 +445,11 @@ 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 )
@@ -438,20 +467,20 @@ void LoadDBCStores(const std::string& dataPath)
exit(1);
}
- // 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) )
+ // 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) )
{
sLog.outError("\nYou have _outdated_ DBC files. Please extract correct versions from current using client.");
exit(1);
@@ -537,7 +566,7 @@ uint32 GetAreaFlagByMapId(uint32 mapid)
uint32 GetVirtualMapForMapAndZone(uint32 mapid, uint32 zoneId)
{
- if(mapid != 530) // speed for most cases
+ if(mapid != 530 || mapid != 571) // 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 98a54fbeccf..8f53fef84ef 100644
--- a/src/shared/Database/DBCStores.h
+++ b/src/shared/Database/DBCStores.h
@@ -132,9 +132,12 @@ 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;
@@ -150,7 +153,10 @@ 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;
@@ -171,6 +177,8 @@ 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;
@@ -183,9 +191,11 @@ 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;
@@ -194,8 +204,11 @@ 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 99d789f133f..c01b2f440fc 100644
--- a/src/shared/Database/DBCStructure.h
+++ b/src/shared/Database/DBCStructure.h
@@ -37,57 +37,507 @@
#pragma pack(push,1)
#endif
-struct AreaTableEntry
+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 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 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
// 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
- 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
+ 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
};
struct BankBagSlotPricesEntry
{
- uint32 ID;
- uint32 price;
+ 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
};
struct BattlemasterListEntry
{
- 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
+ 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
};
-#define MAX_OUTFIT_ITEMS 12
-// #define MAX_OUTFIT_ITEMS 24 // 12->24 in 3.0.x
+#define MAX_OUTFIT_ITEMS 24
struct CharStartOutfitEntry
{
@@ -103,20 +553,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
@@ -124,20 +574,21 @@ struct ChatChannelsEntry
struct ChrClassesEntry
{
- uint32 ClassID; // 0
- // 1-2, unused
- uint32 powerType; // 3
- // 4, unused
+ uint32 ClassID; // 0
+ // 1, unused
+ uint32 powerType; // 2
+ // 3-4, unused
//char* name[16]; // 5-20 unused
- char* name[16]; // 5-20 unused
// 21 string flag, unused
//char* nameFemale[16]; // 21-36 unused, if different from base (male) case
// 37 string flag, unused
//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
@@ -151,7 +602,7 @@ struct ChrRacesEntry
// 6-7 unused
uint32 TeamID; // 8 (7-Alliance 1-Horde)
// 9-12 unused
- uint32 startmovie; // 13 id from CinematicCamera.dbc
+ uint32 CinematicSequence; // 13 id from CinematicSequences.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
@@ -164,30 +615,43 @@ struct ChrRacesEntry
struct CreatureDisplayInfoEntry
{
- uint32 Displayid; // 0
- // 1-3,unused
- float scale; // 4
- // 5-13,unused
+ 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
};
struct CreatureFamilyEntry
{
- 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
+ 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
};
struct CreatureSpellDataEntry
{
- uint32 ID; // 0
- //uint32 spellId[4]; // 1-4 hunter pet learned spell (for later use)
+ uint32 ID; // 0 m_ID
+ //uint32 spellId[4]; // 1-4 m_spells[4]
+ //uint32 availability[4]; // 4-7 m_availability[4]
};
struct DurabilityCostsEntry
@@ -204,41 +668,35 @@ struct DurabilityQualityEntry
struct EmotesTextEntry
{
- uint32 Id;
- uint32 textid;
+ uint32 Id;
+ uint32 textid;
};
struct FactionEntry
{
- 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
+ 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
};
struct FactionTemplateEntry
{
- 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
+ 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]
//------------------------------------------------------- end structure
// helpers
@@ -246,9 +704,9 @@ struct FactionTemplateEntry
{
if(ID == entry.ID)
return true;
- if(enemyFaction1 == entry.faction || enemyFaction2 == entry.faction || enemyFaction3 == entry.faction || enemyFaction4 == entry.faction )
+ if(enemyFaction[0] == entry.faction || enemyFaction[1] == entry.faction || enemyFaction[2] == entry.faction || enemyFaction[3] == entry.faction )
return false;
- if(friendFaction1 == entry.faction || friendFaction2 == entry.faction || friendFaction3 == entry.faction || friendFaction4 == entry.faction )
+ if(friendFaction[0] == entry.faction || friendFaction[1] == entry.faction || friendFaction[2] == entry.faction || friendFaction[3] == entry.faction )
return true;
return (friendlyMask & entry.ourMask) || (ourMask & entry.friendlyMask);
}
@@ -256,14 +714,14 @@ struct FactionTemplateEntry
{
if(ID == entry.ID)
return false;
- if(enemyFaction1 == entry.faction || enemyFaction2 == entry.faction || enemyFaction3 == entry.faction || enemyFaction4 == entry.faction )
+ if(enemyFaction[0] == entry.faction || enemyFaction[1] == entry.faction || enemyFaction[2] == entry.faction || enemyFaction[3] == entry.faction )
return true;
- if(friendFaction1 == entry.faction || friendFaction2 == entry.faction || friendFaction3 == entry.faction || friendFaction4 == entry.faction )
+ if(friendFaction[0] == entry.faction || friendFaction[1] == entry.faction || friendFaction[2] == entry.faction || friendFaction[3] == 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 && enemyFaction1==0 && enemyFaction2==0 && enemyFaction3==0 && enemyFaction4==0; }
+ bool IsNeutralToAll() const { return hostileMask == 0 && friendlyMask == 0 && enemyFaction[0]==0 && enemyFaction[1]==0 && enemyFaction[2]==0 && enemyFaction[3]==0; }
bool IsContestedGuardFaction() const { return (factionFlags & FACTION_TEMPLATE_FLAG_CONTESTED_GUARD)!=0; }
};
@@ -274,9 +732,29 @@ 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;
@@ -324,24 +802,38 @@ struct GtRegenMPPerSptEntry
struct ItemEntry
{
- uint32 ID;
- uint32 DisplayId;
- uint32 InventoryType;
- uint32 Sheath;
+ uint32 ID;
+ //uint32 Class;
+ //uint32 SubClass;
+ //uint32 Unk0;
+ //uint32 Material;
+ uint32 DisplayId;
+ uint32 InventoryType;
+ uint32 Sheath;
};
struct ItemDisplayInfoEntry
{
- uint32 ID;
- uint32 randomPropertyChance;
+ 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
};
//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
@@ -356,47 +848,42 @@ struct ItemExtendedCostEntry
struct ItemRandomPropertiesEntry
{
- 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
+ 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
};
struct ItemRandomSuffixEntry
{
- 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
+ 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
};
struct ItemSetEntry
{
- //uint32 id // 0 item set ID
- char* name[16]; // 1-16
+ //uint32 id // 0 m_ID
+ char* name[16]; // 1-16 m_name_lang
// 17 string flags, unused
- // 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
+ //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
};
struct LockEntry
{
- 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
+ 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
};
struct MailTemplateEntry
@@ -409,35 +896,34 @@ struct MailTemplateEntry
struct MapEntry
{
- uint32 MapID; // 0
+ uint32 MapID; // 0
//char* internalname; // 1 unused
- uint32 map_type; // 2
- // 3 unused
- char* name[16]; // 4-19
+ uint32 map_type; // 2
+ // 3 0 or 1 for battlegrounds (not arenas)
+ char* name[16]; // 4-19
// 20 name flags, unused
- // 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)
+ 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?
// Helpers
uint32 Expansion() const { return addon; }
@@ -454,17 +940,22 @@ struct MapEntry
bool IsMountAllowed() const
{
- return !IsDungeon() ||
+ return !IsDungeon() ||
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, sort id
- //char* name[16]; // 1-16, unused
- // 17 name flags, unused
+ uint32 id; // 0 m_ID
+ //char* name[16]; // 1-16 m_SortName_lang
+ // 17 name flags
};
struct RandomPropertiesPointsEntry
@@ -476,172 +967,201 @@ 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 hidden key
-// char* name[16]; // 1 - 17 Category name
-// // 18 string flag
-// uint32 displayOrder; // Display order in character tab
+// uint32 id; // 0 m_ID
+// char* name[16]; // 1-17 m_name_lang
+// // 18 string flag
+// uint32 displayOrder; // 19 m_sortIndex
//};
//struct SkillRaceClassInfoEntry{
-// 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
+// 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
//};
//struct SkillTiersEntry{
-// uint32 id; // 0
-// uint32 skillValue[16]; // 1-17 unknown possibly add value on learn?
-// uint32 maxSkillValue[16]; // Max value for rank
+// uint32 id; // 0 m_ID
+// uint32 skillValue[16]; // 1-17 m_cost
+// uint32 maxSkillValue[16]; // 18-32 m_valueMax
//};
struct SkillLineEntry
{
- 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
+ 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
};
struct SkillLineAbilityEntry
{
- 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
+ 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]
};
struct SoundEntriesEntry
{
- 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
+ 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
};
struct SpellEntry
{
- 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
+ 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
private:
// prevent creating custom entries (copy data from original in fact)
@@ -690,6 +1210,16 @@ 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
@@ -722,26 +1252,31 @@ struct SpellDurationEntry
struct SpellItemEnchantmentEntry
{
- 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
+ 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
};
struct SpellItemEnchantmentConditionEntry
{
- uint32 ID;
- uint8 Color[5];
- uint8 Comparator[5];
- uint8 CompareColor[5];
- uint32 Value[5];
+ 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]
};
struct StableSlotPricesEntry
@@ -750,6 +1285,16 @@ 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
@@ -761,53 +1306,59 @@ struct TalentEntry
uint32 DependsOn; // 13 index in Talent.dbc (TalentEntry)
// 14-15 not used
uint32 DependsOnRank; // 16
- // 17-19 not used
- uint32 DependsOnSpell; // 20 req.spell
+ // 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
};
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 tabpage; // 21
- //char* internalname; // 22
+ uint32 ClassMask; // 20
+ uint32 petTalentMask; // 21
+ uint32 tabpage; // 22
+ //char* internalname; // 23
};
struct TaxiNodesEntry
{
- 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
+ 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]
};
struct TaxiPathEntry
{
- uint32 ID;
- uint32 from;
- uint32 to;
- uint32 price;
+ uint32 ID; // 0 m_ID
+ uint32 from; // 1 m_FromTaxiNode
+ uint32 to; // 2 m_ToTaxiNode
+ uint32 price; // 3 m_Cost
};
struct TaxiPathNodeEntry
{
- uint32 path;
- uint32 index;
- uint32 mapid;
- float x;
- float y;
- float z;
- uint32 actionFlag;
- uint32 delay;
+ // 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
};
struct TotemCategoryEntry
@@ -819,16 +1370,100 @@ 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)
};
@@ -843,6 +1478,12 @@ 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()
@@ -888,6 +1529,6 @@ struct TaxiPathNode
typedef std::vector<TaxiPathNode> TaxiPathNodeList;
typedef std::vector<TaxiPathNodeList> TaxiPathNodesByPath;
-#define TaxiMaskSize 16
+#define TaxiMaskSize 12
typedef uint32 TaxiMask[TaxiMaskSize];
#endif
diff --git a/src/shared/Database/DBCfmt.cpp b/src/shared/Database/DBCfmt.cpp
index 57a81921d62..edcf7e2b2be 100644
--- a/src/shared/Database/DBCfmt.cpp
+++ b/src/shared/Database/DBCfmt.cpp
@@ -10,29 +10,29 @@
*
* 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
+ * 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
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-const char AreaTableEntryfmt[]="iiinixxxxxissssssssssssssssxixxxxxx";
+const char Achievementfmt[]="niixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiixixxxxxxxxxxxxxxxxxxxi";
+const char AchievementCriteriafmt[]="niiiiiiiixxxxxxxxxxxxxxxxxiixix";
+const char AreaTableEntryfmt[]="iiinixxxxxissssssssssssssssxixxxxxxx";
const char AreaTriggerEntryfmt[]="niffffffff";
const char BankBagSlotPricesEntryfmt[]="ni";
-const char BattlemasterListEntryfmt[]="niiixxxxxiiiixxssssssssssssssssxx";
-const char CharStartOutfitEntryfmt[]="diiiiiiiiiiiiixxxxxxxxxxxxxxxxxxxxxxxxxxx";
-// 3*12 new item fields in 3.0.x
-//const char CharStartOutfitEntryfmt[]="diiiiiiiiiiiiiiiiiiiiiiiiixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
+const char BarberShopStyleEntryfmt[]="nixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiii";
+const char BattlemasterListEntryfmt[]="niiiiiiiiiiiixxxssssssssssssssssxx";
+const char CharStartOutfitEntryfmt[]="diiiiiiiiiiiiiiiiiiiiiiiiixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const char CharTitlesEntryfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxi";
const char ChatChannelsEntryfmt[]="iixssssssssssssssssxxxxxxxxxxxxxxxxxx";
// ChatChannelsEntryfmt, index not used (more compact store)
-//const char ChrClassesEntryfmt[]="nxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxix";
-const char ChrClassesEntryfmt[]="nxixssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxix";
+const char ChrClassesEntryfmt[]="nxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxixii";
const char ChrRacesEntryfmt[]="nxixiixxixxxxissssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxi";
-const char CreatureDisplayInfofmt[]="nxxxfxxxxxxxxx";
-const char CreatureFamilyfmt[]="nfifiiiissssssssssssssssxx";
+const char CreatureDisplayInfofmt[]="nxxxfxxxxxxxxxxx";
+const char CreatureFamilyfmt[]="nfifiiiiixssssssssssssssssxx";
const char CreatureSpellDatafmt[]="nxxxxxxxx";
const char DurabilityCostsfmt[]="niiiiiiiiiiiiiiiiiiiiiiiiiiiii";
const char DurabilityQualityfmt[]="nf";
@@ -40,6 +40,9 @@ 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";
@@ -49,36 +52,44 @@ const char GtOCTRegenHPfmt[]="f";
//const char GtOCTRegenMPfmt[]="f";
const char GtRegenHPPerSptfmt[]="f";
const char GtRegenMPPerSptfmt[]="f";
-const char Itemfmt[]="niii";
+const char Itemfmt[]="nxxxxiii";
//const char ItemDisplayTemplateEntryfmt[]="nxxxxxxxxxxixxxxxxxxxxx";
//const char ItemCondExtCostsEntryfmt[]="xiii";
-const char ItemExtendedCostEntryfmt[]="niiiiiiiiiiiii";
-const char ItemRandomPropertiesfmt[]="nxiiixxxxxxxxxxxxxxxxxxx";
-const char ItemRandomSuffixfmt[]="nxxxxxxxxxxxxxxxxxxiiiiii";
+const char ItemExtendedCostEntryfmt[]="niiiiiiiiiiiiix";
+const char ItemRandomPropertiesfmt[]="nxiiiiixxxxxxxxxxxxxxxxx";
+const char ItemRandomSuffixfmt[]="nxxxxxxxxxxxxxxxxxxiiiiiiiiii";
const char ItemSetEntryfmt[]="dssssssssssssssssxxxxxxxxxxxxxxxxxxiiiiiiiiiiiiiiiiii";
-const char LockEntryfmt[]="niiiiixxxiiiiixxxiixxxxxxxxxxxxxx";
+const char LockEntryfmt[]="niiiiiiiiiiiiiiiiiiiiiiiixxxxxxxx";
const char MailTemplateEntryfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
-const char MapEntryfmt[]="nxixssssssssssssssssxxxxxxxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiffiixxi";
+const char MapEntryfmt[]="nxixssssssssssssssssxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiffiixxix";
const char QuestSortEntryfmt[]="nxxxxxxxxxxxxxxxxx";
const char RandomPropertiesPointsfmt[]="niiiiiiiiiiiiiii";
-const char SkillLinefmt[]="nixssssssssssssssssxxxxxxxxxxxxxxxxxxi";
-const char SkillLineAbilityfmt[]="niiiixxiiiiixxi";
+const char ScalingStatDistributionfmt[]="niiiiiiiiiiiiiiiiiiiii";
+const char ScalingStatValuesfmt[]="iniiiiiiiiiiiiiiiii";
+const char SkillLinefmt[]="nixssssssssssssssssxxxxxxxxxxxxxxxxxxixxxxxxxxxxxxxxxxxx";
+const char SkillLineAbilityfmt[]="niiiixxiiiiixx";
const char SoundEntriesfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const char SpellCastTimefmt[]="nixx";
const char SpellDurationfmt[]="niii";
-const char SpellEntryfmt[]="nixiiiiiiiixiiiiiiiiiiiiiiiiiiiiiiiiiiiiifxiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffffffiiiiiiiiiiiiiiiiiiiiifffiiiiiiiiiiiiiiifffixiixssssssssssssssssxssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiiiiiiiiiixfffxxxiiii";
+const char SpellEntryfmt[]="niiiiiiiiixiiiiiiiiiixxxxiiiiiiiiiiiiiiiiiiifxiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffffffiiiiiiiiiiiiiiiiiiiiifffiiiiiiiiiiiiiiifffiiiiiiiiiiiiixssssssssssssssssxssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiiiiiiiiiiixfffxxxiiiiix";
const char SpellFocusObjectfmt[]="nxxxxxxxxxxxxxxxxx";
-const char SpellItemEnchantmentfmt[]="niiiiiixxxiiissssssssssssssssxiiii";
+const char SpellItemEnchantmentfmt[]="nxiiiiiixxxiiissssssssssssssssxiiiixx";
const char SpellItemEnchantmentConditionfmt[]="nbbbbbxxxxxbbbbbbbbbbiiiiiXXXXX";
const char SpellRadiusfmt[]="nfxf";
-const char SpellRangefmt[]="nffixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
+const char SpellRangefmt[]="nfxfxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
+const char SpellRuneCostfmt[]="niiii";
const char SpellShapeshiftfmt[]="nxxxxxxxxxxxxxxxxxxiixixxxxxxxxxxxx";
const char StableSlotPricesfmt[] = "ni";
-const char TalentEntryfmt[]="niiiiiiiixxxxixxixxxi";
-const char TalentTabEntryfmt[]="nxxxxxxxxxxxxxxxxxxxiix";
+//const char SummonPropertiesfmt[] = "niiiii";
+const char TalentEntryfmt[]="niiiiiiiixxxxixxixxxxxx";
+const char TalentTabEntryfmt[]="nxxxxxxxxxxxxxxxxxxxiiix";
const char TaxiNodesEntryfmt[]="nifffxxxxxxxxxxxxxxxxxii";
const char TaxiPathEntryfmt[]="niii";
const char TaxiPathNodeEntryfmt[]="diiifffiixx";
const char TotemCategoryEntryfmt[]="nxxxxxxxxxxxxxxxxxii";
-const char WorldMapAreaEntryfmt[]="xinxffffi";
+const char VehicleEntryfmt[]="niffffiiiiiiiiffffiiiiiifffffffffffssssfifi";
+const char VehicleSeatEntryfmt[]="niiffffffffffiiiiiifffffffiiifffiiiiiiiffiiiii";
+const char WorldMapAreaEntryfmt[]="xinxffffix";
const char WorldSafeLocsEntryfmt[]="nifffxxxxxxxxxxxxxxxxx";
+const char WorldMapOverlayEntryfmt[]="nxixxxxxxxxxxxxxx";
+
diff --git a/src/shared/Database/Database.h b/src/shared/Database/Database.h
index 30d7193801e..dd6d02d36dd 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 1024
+#define MAX_QUERY_LEN 32*1024
class TRINITY_DLL_SPEC Database
{
diff --git a/src/shared/Database/SQLStorage.cpp b/src/shared/Database/SQLStorage.cpp
index 4845841b6d6..64ef4e3d6ad 100644
--- a/src/shared/Database/SQLStorage.cpp
+++ b/src/shared/Database/SQLStorage.cpp
@@ -32,11 +32,11 @@ const char CreatureInfodstfmt[]="iiiiiisssiiiiiiiiiiffiffiiiiiiiiiiiffiiiiiiiiii
const char CreatureDataAddonInfofmt[]="iiiiiiiis";
const char CreatureModelfmt[]="iffbi";
const char CreatureInfoAddonInfofmt[]="iiiiiiiis";
-const char EquipmentInfofmt[]="iiiiiiiiii";
+const char EquipmentInfofmt[]="iiii";
const char GameObjectInfosrcfmt[]="iiissiifiiiiiiiiiiiiiiiiiiiiiiiis";
const char GameObjectInfodstfmt[]="iiissiifiiiiiiiiiiiiiiiiiiiiiiiii";
-const char ItemPrototypesrcfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiffiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifsiiiii";
-const char ItemPrototypedstfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiffiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiiiii";
+const char ItemPrototypesrcfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiffiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiisiiii";
+const char ItemPrototypedstfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiffiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiiiiii";
const char PageTextfmt[]="isi";
const char SpellThreatfmt[]="ii";
const char InstanceTemplatesrcfmt[]="iiiiiiffffs";
diff --git a/src/shared/Makefile.am b/src/shared/Makefile.am
index 54aef015e46..9c87d7bab40 100644
--- a/src/shared/Makefile.am
+++ b/src/shared/Makefile.am
@@ -18,93 +18,49 @@
## Process this file with automake to produce Makefile.in
-## TODO move vmaps in src dir instead of src/shared
-
## Sub-directories to parse
-SUBDIRS = vmap
+SUBDIRS = Auth Config Database vmap
+
+## CPP flags for includes, defines, etc.
+AM_CPPFLAGS = $(MANGOS_INCLUDES) -I$(top_builddir)/src/shared -I$(srcdir) -I$(srcdir)/../../dep/include -I$(srcdir)/../framework -I$(srcdir)/../shared -I$(srcdir)/../../dep/include/g3dlite -DSYSCONFDIR=\"$(sysconfdir)/\"
+## AM_CPPFLAGS += -I$(srcdir)/../game -I$(srcdir)/../realmd
## Build MaNGOS shared library and its parts as convenience library.
# All libraries will be convenience libraries. Might be changed to shared
# later.
-noinst_LIBRARIES = libshared.a
-
-libshared_a_CPPFLAGS = \
-$(MYSQL_INCLUDES) \
-$(POSTGRE_INCLUDES) \
-$(TRINI_INCLUDES) \
--I$(top_srcdir)/dep/include \
--I$(top_srcdir)/src/framework
+noinst_LIBRARIES = libmangosshared.a
# libmangosshared library will later be reused by ...
-libshared_a_SOURCES = \
-$(srcdir)/Base.cpp \
-$(srcdir)/Base.h \
-$(srcdir)/ByteBuffer.h \
-$(srcdir)/Common.cpp \
-$(srcdir)/Common.h \
-$(srcdir)/Errors.h \
-$(srcdir)/Log.cpp \
-$(srcdir)/Log.h \
-$(srcdir)/Mthread.cpp \
-$(srcdir)/Mthread.h \
-$(srcdir)/ProgressBar.cpp \
-$(srcdir)/ProgressBar.h \
-$(srcdir)/Timer.h \
-$(srcdir)/Util.cpp \
-$(srcdir)/Util.h \
-$(srcdir)/WorldPacket.h \
-$(srcdir)/SystemConfig.h \
-$(srcdir)../game/IRCConf.h \
-$(srcdir)/Auth/AuthCrypt.cpp \
-$(srcdir)/Auth/AuthCrypt.h \
-$(srcdir)/Auth/BigNumber.cpp \
-$(srcdir)/Auth/BigNumber.h \
-$(srcdir)/Auth/Hmac.cpp \
-$(srcdir)/Auth/Hmac.h \
-$(srcdir)/Auth/Sha1.cpp \
-$(srcdir)/Auth/Sha1.h \
-$(srcdir)/Auth/md5.c \
-$(srcdir)/Auth/md5.h \
-$(srcdir)/Config/dotconfpp/dotconfpp.cpp \
-$(srcdir)/Config/dotconfpp/dotconfpp.h \
-$(srcdir)/Config/dotconfpp/mempool.cpp \
-$(srcdir)/Config/dotconfpp/mempool.h \
-$(srcdir)/Config/Config.cpp \
-$(srcdir)/Config/Config.h \
-$(srcdir)/Config/ConfigEnv.h \
-$(srcdir)/Database/DBCStores.cpp \
-$(srcdir)/Database/DBCStores.h \
-$(srcdir)/Database/DBCStructure.h \
-$(srcdir)/Database/DBCfmt.cpp \
-$(srcdir)/Database/Database.cpp \
-$(srcdir)/Database/Database.h \
-$(srcdir)/Database/DatabaseEnv.h \
-$(srcdir)/Database/DatabaseImpl.h \
-$(srcdir)/Database/DatabaseMysql.cpp \
-$(srcdir)/Database/DatabasePostgre.cpp \
-$(srcdir)/Database/DatabaseMysql.h \
-$(srcdir)/Database/DatabasePostgre.h \
-$(srcdir)/Database/DatabaseSqlite.cpp \
-$(srcdir)/Database/DatabaseSqlite.h \
-$(srcdir)/Database/Field.cpp \
-$(srcdir)/Database/Field.h \
-$(srcdir)/Database/MySQLDelayThread.h \
-$(srcdir)/Database/PGSQLDelayThread.h \
-$(srcdir)/Database/QueryResult.h \
-$(srcdir)/Database/QueryResultMysql.cpp \
-$(srcdir)/Database/QueryResultMysql.h \
-$(srcdir)/Database/QueryResultPostgre.cpp \
-$(srcdir)/Database/QueryResultPostgre.h \
-$(srcdir)/Database/QueryResultSqlite.cpp \
-$(srcdir)/Database/QueryResultSqlite.h \
-$(srcdir)/Database/SQLStorage.cpp \
-$(srcdir)/Database/SQLStorage.h \
-$(srcdir)/Database/SqlDelayThread.cpp \
-$(srcdir)/Database/SqlDelayThread.h \
-$(srcdir)/Database/SqlOperations.cpp \
-$(srcdir)/Database/SqlOperations.h \
-$(srcdir)/Database/dbcfile.cpp \
-$(srcdir)/Database/dbcfile.h
+libmangosshared_a_SOURCES = \
+ Base.cpp \
+ Base.h \
+ ByteBuffer.h \
+ Common.cpp \
+ Common.h \
+ Errors.h \
+ Log.cpp \
+ Log.h \
+ MemoryLeaks.cpp \
+ MemoryLeaks.h \
+ ProgressBar.cpp \
+ ProgressBar.h \
+ Timer.h \
+ Util.cpp \
+ Util.h \
+ WorldPacket.h \
+ revision_nr.h \
+ revision.h
+
+# Get revision (git or svn)
+REVISION_FILE = revision.h
+
+BUILT_SOURCES = $(REVISION_FILE)
+CLEANFILES = $(REVISION_FILE)
+
+FORCE:
+
+$(REVISION_FILE) : $(top_builddir)/src/tools/genrevision/genrevision FORCE
+ $(top_builddir)/src/tools/genrevision/genrevision $(top_srcdir)
## Additional files to include when running 'make dist'
# Disabled packet logger
diff --git a/src/shared/MemoryLeaks.h b/src/shared/MemoryLeaks.h
new file mode 100644
index 00000000000..fceb9d6f444
--- /dev/null
+++ b/src/shared/MemoryLeaks.h
@@ -0,0 +1,48 @@
+/*
+ * 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 262aa9e6355..51209d0454b 100644
--- a/src/shared/SystemConfig.h.in
+++ b/src/shared/SystemConfig.h.in
@@ -11,23 +11,66 @@
*
* 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
+ * 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
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-// THIS FILE IS DEPRECATED
-
#ifndef TRINITY_SYSTEMCONFIG_H
#define TRINITY_SYSTEMCONFIG_H
+#ifndef _PACKAGENAME
+#define _PACKAGENAME "Trinity"
+#endif
+
#include "Platform/Define.h"
-// 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
#define DEFAULT_PLAYER_LIMIT 100
#define DEFAULT_WORLDSERVER_PORT 8085 //8129
diff --git a/src/shared/Util.h b/src/shared/Util.h
index b99cdb13bde..95bc8ec1028 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[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; \
+#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; \
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
new file mode 100644
index 00000000000..08976dc2423
--- /dev/null
+++ b/src/shared/revision_nr.h
@@ -0,0 +1,4 @@
+#ifndef __REVISION_NR_H__
+#define __REVISION_NR_H__
+ #define REVISION_NR "6957"
+#endif // __REVISION_NR_H__
diff --git a/src/shared/vmap/TileAssembler.cpp b/src/shared/vmap/TileAssembler.cpp
index 198806601fa..c8f0b10e76d 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,7 +142,6 @@ namespace VMAP
//=================================================================
bool TileAssembler::convertWorld()
{
-
#ifdef _ASSEMBLER_DEBUG
# ifdef _DEBUG
::g_df = fopen("../TileAssembler_debug.txt", "wb");
diff --git a/src/tools/Makefile.am b/src/tools/Makefile.am
new file mode 100644
index 00000000000..7b68544e185
--- /dev/null
+++ b/src/tools/Makefile.am
@@ -0,0 +1,23 @@
+# 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
+
+## Process this file with automake to produce Makefile.in
+
+## Sub-directories to parse
+SUBDIRS = genrevision
+
+## Additional files to include when running 'make dist'
+# Nothing yet.
diff --git a/src/tools/genrevision/Makefile.am b/src/tools/genrevision/Makefile.am
new file mode 100644
index 00000000000..814c6079010
--- /dev/null
+++ b/src/tools/genrevision/Makefile.am
@@ -0,0 +1,35 @@
+# 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
+
+## Process this file with automake to produce Makefile.in
+
+## CPP flags for includes, defines, etc.
+AM_CPPFLAGS = -I$(srcdir)
+
+## Build world list daemon as standalone program
+bin_PROGRAMS = genrevision
+genrevision_SOURCES = \
+ genrevision.cpp
+
+## Link world daemon against the shared library
+genrevision_LDADD =
+genrevision_LDFLAGS = -L$(libdir)
+
+## Additional files to include when running 'make dist'
+# Include world daemon configuration
+#EXTRA_DIST =
+
+## Additional files to install
diff --git a/src/tools/genrevision/genrevision.cpp b/src/tools/genrevision/genrevision.cpp
new file mode 100644
index 00000000000..a9e39d93c26
--- /dev/null
+++ b/src/tools/genrevision/genrevision.cpp
@@ -0,0 +1,308 @@
+/*
+ * 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 <fstream>
+#include <sstream>
+#include <time.h>
+#include <stdio.h>
+#include <string.h>
+
+#pragma warning(disable:4996)
+
+struct RawData
+{
+ char rev_str[200];
+ char date_str[200];
+ char time_str[200];
+};
+
+void extractDataFromSvn(FILE* EntriesFile, bool url, RawData& data)
+{
+ char buf[200];
+
+ char repo_str[200];
+ char num_str[200];
+
+ fgets(buf,200,EntriesFile);
+ fgets(buf,200,EntriesFile);
+ fgets(buf,200,EntriesFile);
+ fgets(buf,200,EntriesFile); sscanf(buf,"%s",num_str);
+ fgets(buf,200,EntriesFile); sscanf(buf,"%s",repo_str);
+ fgets(buf,200,EntriesFile);
+ fgets(buf,200,EntriesFile);
+ fgets(buf,200,EntriesFile);
+ fgets(buf,200,EntriesFile);
+ fgets(buf,200,EntriesFile); sscanf(buf,"%10sT%8s",data.date_str,data.time_str);
+
+ if(url)
+ sprintf(data.rev_str,"%s at %s",num_str,repo_str);
+ else
+ strcpy(data.rev_str,num_str);
+}
+
+void extractDataFromGit(FILE* EntriesFile, std::string path, bool url, RawData& data)
+{
+ char buf[200];
+
+ char hash_str[200];
+ char branch_str[200];
+ char url_str[200];
+
+ bool found = false;
+ while(fgets(buf,200,EntriesFile))
+ {
+ if(sscanf(buf,"%s\t\tbranch %s of %s",hash_str,branch_str,url_str)==3)
+ {
+ found = true;
+ break;
+ }
+ }
+
+ if(!found)
+ {
+ strcpy(data.rev_str,"*");
+ strcpy(data.date_str,"*");
+ strcpy(data.time_str,"*");
+ return;
+ }
+
+ if(url)
+ {
+ char* host_str = NULL;
+ char* acc_str = NULL;
+ char* repo_str = NULL;
+
+ // parse URL like git@github.com:mangos/mangos
+ char url_buf[200];
+ int res = sscanf(url_str,"git@%s",url_buf);
+ if(res)
+ {
+ host_str = strtok(url_buf,":");
+ acc_str = strtok(NULL,"/");
+ repo_str = strtok(NULL," ");
+ }
+ else
+ {
+ res = sscanf(url_str,"git://%s",url_buf);
+ if(res)
+ {
+ host_str = strtok(url_buf,"/");
+ acc_str = strtok(NULL,"/");
+ repo_str = strtok(NULL,".");
+ }
+ }
+
+ // can generate nice link
+ if(res)
+ sprintf(data.rev_str,"http://%s/%s/%s/commit/%s",host_str,acc_str,repo_str,hash_str);
+ // unknonw URL format, use as-is
+ else
+ sprintf(data.rev_str,"%s at %s",hash_str,url_str);
+ }
+ else
+ strcpy(data.rev_str,hash_str);
+
+ time_t rev_time = 0;
+ // extracting date/time
+ FILE* LogFile = fopen((path+".git/logs/HEAD").c_str(), "r");
+ if(LogFile)
+ {
+ while(fgets(buf,200,LogFile))
+ {
+ char buf2[200];
+ char new_hash[200];
+ int unix_time = 0;
+ int res2 = sscanf(buf,"%s %s %s %s %i",buf2,new_hash,buf2,buf2,&unix_time);
+ if(res2!=5)
+ continue;
+
+ if(strcmp(hash_str,new_hash))
+ continue;
+
+ rev_time = unix_time;
+ break;
+ }
+
+ fclose(LogFile);
+
+ if(rev_time)
+ {
+ tm* aTm = localtime(&rev_time);
+ // YYYY year
+ // MM month (2 digits 01-12)
+ // DD day (2 digits 01-31)
+ // HH hour (2 digits 00-23)
+ // MM minutes (2 digits 00-59)
+ // SS seconds (2 digits 00-59)
+ sprintf(data.date_str,"%04d-%02d-%02d",aTm->tm_year+1900,aTm->tm_mon+1,aTm->tm_mday);
+ sprintf(data.time_str,"%02d:%02d:%02d",aTm->tm_hour,aTm->tm_min,aTm->tm_sec);
+ }
+ else
+ {
+ strcpy(data.date_str,"*");
+ strcpy(data.time_str,"*");
+ }
+ }
+ else
+ {
+ strcpy(data.date_str,"*");
+ strcpy(data.time_str,"*");
+ }
+}
+
+bool extractDataFromSvn(std::string filename, bool url, RawData& data)
+{
+ FILE* EntriesFile = fopen(filename.c_str(), "r");
+ if(!EntriesFile)
+ return false;
+
+ extractDataFromSvn(EntriesFile,url,data);
+ fclose(EntriesFile);
+ return true;
+}
+
+bool extractDataFromGit(std::string filename, std::string path, bool url, RawData& data)
+{
+ FILE* EntriesFile = fopen(filename.c_str(), "r");
+ if(!EntriesFile)
+ return false;
+
+ extractDataFromGit(EntriesFile,path,url,data);
+ fclose(EntriesFile);
+ return true;
+}
+
+std::string generateHeader(char const* rev_str, char const* date_str, char const* time_str)
+{
+ std::ostringstream newData;
+ newData << "#ifndef __REVISION_H__" << std::endl;
+ newData << "#define __REVISION_H__" << std::endl;
+ newData << " #define REVISION_ID \"" << rev_str << "\"" << std::endl;
+ newData << " #define REVISION_DATE \"" << date_str << "\"" << std::endl;
+ newData << " #define REVISION_TIME \"" << time_str << "\""<< std::endl;
+ newData << "#endif // __REVISION_H__" << std::endl;
+ return newData.str();
+}
+
+int main(int argc, char **argv)
+{
+ bool use_url = false;
+ bool svn_prefered = false;
+ std::string path;
+
+ // Call: tool {options} [path]
+ // -g use git prefered (default)
+ // -s use svn prefered
+ // -r use only revision (without repo URL) (default)
+ // -u include repositire URL as commit URL or "rev at URL"
+ for(int k = 1; k <= argc; ++k)
+ {
+ if(!argv[k] || !*argv[k])
+ break;
+
+ if(argv[k][0]!='-')
+ {
+ path = argv[k];
+ if(path.size() > 0 && (path[path.size()-1]!='/' || path[path.size()-1]!='\\'))
+ path += '/';
+ break;
+ }
+
+ switch(argv[k][1])
+ {
+ case 'g':
+ svn_prefered = false;
+ continue;
+ case 'r':
+ use_url = false;
+ continue;
+ case 's':
+ svn_prefered = true;
+ continue;
+ case 'u':
+ use_url = true;
+ continue;
+ default:
+ printf("Unknown option %s",argv[k]);
+ return 1;
+ }
+ }
+
+ /// new data extraction
+ std::string newData;
+
+ {
+ RawData data;
+
+ bool res = false;
+
+ if(svn_prefered)
+ {
+ /// SVN data
+ res = extractDataFromSvn(path+".svn/entries",use_url,data);
+ if (!res)
+ res = extractDataFromSvn(path+"_svn/entries",use_url,data);
+ // GIT data
+ if (!res)
+ res = extractDataFromGit(path+".git/FETCH_HEAD",path,use_url,data);
+ }
+ else
+ {
+ // GIT data
+ res = extractDataFromGit(path+".git/FETCH_HEAD",path,use_url,data);
+ /// SVN data
+ if (!res)
+ res = extractDataFromSvn(path+".svn/entries",use_url,data);
+ if (!res)
+ res = extractDataFromSvn(path+"_svn/entries",use_url,data);
+ }
+
+ if(res)
+ newData = generateHeader(data.rev_str,data.date_str,data.time_str);
+ else
+ newData = generateHeader("*", "*", "*");
+ }
+
+ /// get existed header data for compare
+ std::string oldData;
+
+ if(FILE* HeaderFile = fopen("revision.h","rb"))
+ {
+ while(!feof(HeaderFile))
+ {
+ int c = fgetc(HeaderFile);
+ if(c < 0)
+ break;
+ oldData += (char)c;
+ }
+
+ fclose(HeaderFile);
+ }
+
+ /// update header only if different data
+ if(newData != oldData)
+ {
+ if(FILE* OutputFile = fopen("revision.h","wb"))
+ {
+ fprintf(OutputFile,"%s",newData.c_str());
+ fclose(OutputFile);
+ }
+ }
+
+ return 0;
+}
diff --git a/win/TrinityCore&Script VC80.sln b/win/TrinityCore&Script VC80.sln
index e5f59ada33c..fa8800b4355 100644
--- a/win/TrinityCore&Script VC80.sln
+++ b/win/TrinityCore&Script VC80.sln
@@ -24,7 +24,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "g3dlite", "VC80\g3dlite.vcp
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sockets", "VC80\sockets.vcproj", "{04BAF755-0D67-46F8-B1C6-77AE5368F3CB}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityCore", "VC80\TrinityCore.vcproj", "{A3A04E47-43A2-4C08-90B3-029CEF558594}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityCore", "VC80\mangosd.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", "VC80\Trinity
{1DC6C4DA-A028-41F3-877D-D5400C594F88} = {1DC6C4DA-A028-41F3-877D-D5400C594F88}
EndProjectSection
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityRealm", "VC80\TrinityRealm.vcproj", "{563E9905-3657-460C-AE63-0AC39D162E23}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityRealm", "VC80\realmd.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/TrinityCore&Script VC90.sln b/win/TrinityCore&Script VC90.sln
index f320ab3f99f..b38ef17d80e 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\TrinityCore.vcproj", "{A3A04E47-43A2-4C08-90B3-029CEF558594}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityCore", "VC90\mangosd.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\Trinity
{1DC6C4DA-A028-41F3-877D-D5400C594F88} = {1DC6C4DA-A028-41F3-877D-D5400C594F88}
EndProjectSection
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityRealm", "VC90\TrinityRealm.vcproj", "{563E9905-3657-460C-AE63-0AC39D162E23}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrinityRealm", "VC90\realmd.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/game.vcproj b/win/VC71/game.vcproj
index 923845a7612..83506f0d820 100644
--- a/win/VC71/game.vcproj
+++ b/win/VC71/game.vcproj
@@ -136,6 +136,14 @@
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
@@ -211,6 +219,9 @@
RelativePath="..\..\src\game\BattleGroundWS.h">
</File>
<File
+ RelativePath="..\..\src\game\CalendarHandler.cpp">
+ </File>
+ <File
RelativePath="..\..\src\game\Cell.h">
</File>
<File
@@ -554,6 +565,12 @@
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
@@ -828,6 +845,12 @@
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
@@ -905,12 +928,6 @@
<File
RelativePath="..\..\src\game\PlayerDump.h">
</File>
- <File
- RelativePath="..\..\src\game\tools.cpp">
- </File>
- <File
- RelativePath="..\..\src\game\Tools.h">
- </File>
</Filter>
<Filter
Name="References"
diff --git a/win/VC71/TrinityCore.vcproj b/win/VC71/mangosd.vcproj
index 03ef53ab66c..a008f365030 100644
--- a/win/VC71/TrinityCore.vcproj
+++ b/win/VC71/mangosd.vcproj
@@ -23,8 +23,13 @@
<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"
@@ -94,8 +99,13 @@ 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/TrinityRealm.vcproj b/win/VC71/realmd.vcproj
index 02f8993705d..f8ae9d10542 100644
--- a/win/VC71/TrinityRealm.vcproj
+++ b/win/VC71/realmd.vcproj
@@ -24,7 +24,11 @@
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"
@@ -92,7 +96,11 @@
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/VC80/game.vcproj b/win/VC80/game.vcproj
index e456ebbf235..4d6219d1677 100644
--- a/win/VC80/game.vcproj
+++ b/win/VC80/game.vcproj
@@ -52,7 +52,6 @@
MinimalRebuild="false"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
- FloatingPointModel="2"
RuntimeTypeInfo="true"
UsePrecompiledHeader="0"
PrecompiledHeaderFile=".\game__$(PlatformName)_$(ConfigurationName)\game.pch"
@@ -126,7 +125,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalOptions="/MP"
+ AdditionalOptions="/MP /bigobj"
Optimization="0"
AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\shared\vmap;..\..\dep\ACE_wrappers"
PreprocessorDefinitions="WIN32;_DEBUG;MANGOS_DEBUG;_LIB;"
@@ -134,7 +133,6 @@
MinimalRebuild="false"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
- FloatingPointModel="2"
RuntimeTypeInfo="true"
UsePrecompiledHeader="0"
PrecompiledHeaderFile=".\game__$(PlatformName)_$(ConfigurationName)\game.pch"
@@ -215,7 +213,6 @@
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
EnableEnhancedInstructionSet="1"
- FloatingPointModel="2"
RuntimeTypeInfo="true"
UsePrecompiledHeader="0"
PrecompiledHeaderFile=".\game__$(PlatformName)_$(ConfigurationName)\game.pch"
@@ -289,7 +286,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalOptions="/MP"
+ AdditionalOptions="/MP /bigobj"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\shared\vmap;..\..\dep\ACE_wrappers"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;"
@@ -297,7 +294,6 @@
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
EnableEnhancedInstructionSet="0"
- FloatingPointModel="2"
RuntimeTypeInfo="true"
UsePrecompiledHeader="0"
PrecompiledHeaderFile=".\game__$(PlatformName)_$(ConfigurationName)\game.pch"
@@ -359,6 +355,14 @@
>
</File>
<File
+ RelativePath="..\..\src\game\AchievementMgr.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\AchievementMgr.h"
+ >
+ </File>
+ <File
RelativePath="..\..\src\game\AddonHandler.cpp"
>
</File>
@@ -459,6 +463,10 @@
>
</File>
<File
+ RelativePath="..\..\src\game\CalendarHandler.cpp"
+ >
+ </File>
+ <File
RelativePath="..\..\src\game\Cell.h"
>
</File>
@@ -627,14 +635,6 @@
>
</File>
<File
- RelativePath="..\..\src\game\MapReference.h"
- >
- </File>
- <File
- RelativePath="..\..\src\game\MapRefManager.h"
- >
- </File>
- <File
RelativePath="..\..\src\game\MiscHandler.cpp"
>
</File>
@@ -895,6 +895,14 @@
>
</File>
<File
+ RelativePath="..\..\src\game\Calendar.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\Calendar.h"
+ >
+ </File>
+ <File
RelativePath="..\..\src\game\ConfusedMovementGenerator.cpp"
>
</File>
@@ -1255,6 +1263,14 @@
>
</File>
<File
+ RelativePath="..\..\src\game\Vehicle.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\Vehicle.h"
+ >
+ </File>
+ <File
RelativePath="..\..\src\game\WaypointMovementGenerator.cpp"
>
</File>
@@ -1358,14 +1374,6 @@
RelativePath="..\..\src\game\PlayerDump.h"
>
</File>
- <File
- RelativePath="..\..\src\game\tools.cpp"
- >
- </File>
- <File
- RelativePath="..\..\src\game\Tools.h"
- >
- </File>
</Filter>
<Filter
Name="References"
@@ -1403,6 +1411,14 @@
>
</File>
<File
+ RelativePath="..\..\src\game\MapReference.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\MapRefManager.h"
+ >
+ </File>
+ <File
RelativePath="..\..\src\game\ThreatManager.cpp"
>
</File>
diff --git a/win/VC90/TrinityCore.vcproj b/win/VC80/mangosd.vcproj
index 39d09f277be..ad44e1fbcc7 100644
--- a/win/VC90/TrinityCore.vcproj
+++ b/win/VC80/mangosd.vcproj
@@ -1,11 +1,10 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="9,00"
+ Version="8,00"
Name="TrinityCore"
ProjectGUID="{A3A04E47-43A2-4C08-90B3-029CEF558594}"
RootNamespace="mangosd"
- TargetFrameworkVersion="131072"
>
<Platforms>
<Platform
@@ -48,8 +47,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/MP"
InlineFunctionExpansion="1"
- 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"
StringPooling="true"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
@@ -61,7 +60,7 @@
ProgramDataBaseFileName=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
WarningLevel="3"
SuppressStartupBanner="true"
- Detect64BitPortabilityProblems="false"
+ Detect64BitPortabilityProblems="true"
DebugInformationFormat="3"
CompileAs="0"
/>
@@ -91,8 +90,6 @@
SubSystem="1"
LargeAddressAware="2"
LinkTimeCodeGeneration="0"
- RandomizedBaseAddress="1"
- DataExecutionPrevention="0"
ImportLibrary="$(OutDir)\TrinityCore.lib"
/>
<Tool
@@ -114,8 +111,14 @@
Name="VCAppVerifierTool"
/>
<Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
Name="VCPostBuildEventTool"
- 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;"
+ CommandLine="copy ..\..\dep\lib\$(PlatformName)_$(ConfigurationName)\*.dll ..\..\bin\$(PlatformName)_$(ConfigurationName)&#x0D;
+ &#x0A;
+ copy ..\..\src\mangosd\mangosd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.conf&#x0D;
+ &#x0A;"
/>
</Configuration>
<Configuration
@@ -149,8 +152,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/MP"
InlineFunctionExpansion="1"
- 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"
StringPooling="true"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
@@ -162,7 +165,7 @@
ProgramDataBaseFileName=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
WarningLevel="3"
SuppressStartupBanner="true"
- Detect64BitPortabilityProblems="false"
+ Detect64BitPortabilityProblems="true"
DebugInformationFormat="3"
CompileAs="0"
/>
@@ -212,8 +215,14 @@
Name="VCAppVerifierTool"
/>
<Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
Name="VCPostBuildEventTool"
- 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;"
+ CommandLine="copy ..\..\dep\lib\$(PlatformName)_$(ConfigurationName)\*.dll ..\..\bin\$(PlatformName)_$(ConfigurationName)&#x0D;
+ &#x0A;
+ copy ..\..\src\mangosd\mangosd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.conf&#x0D;
+ &#x0A;"
/>
</Configuration>
<Configuration
@@ -246,8 +255,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/MP"
Optimization="0"
- 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"
IgnoreStandardIncludePath="false"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
@@ -258,7 +267,7 @@
ProgramDataBaseFileName=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
WarningLevel="3"
SuppressStartupBanner="true"
- Detect64BitPortabilityProblems="false"
+ Detect64BitPortabilityProblems="true"
DebugInformationFormat="3"
CompileAs="0"
/>
@@ -288,10 +297,8 @@
MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.map"
SubSystem="1"
LargeAddressAware="2"
- RandomizedBaseAddress="1"
- FixedBaseAddress="1"
- DataExecutionPrevention="0"
ImportLibrary="$(OutDir)\TrinityCore.lib"
+ FixedBaseAddress="1"
/>
<Tool
Name="VCALinkTool"
@@ -312,8 +319,14 @@
Name="VCAppVerifierTool"
/>
<Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
Name="VCPostBuildEventTool"
- 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;"
+ CommandLine="copy ..\..\dep\lib\$(PlatformName)_$(ConfigurationName)\*.dll ..\..\bin\$(PlatformName)_$(ConfigurationName)&#x0D;
+ &#x0A;
+ copy ..\..\src\mangosd\mangosd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.conf&#x0D;
+ &#x0A;"
/>
</Configuration>
<Configuration
@@ -347,8 +360,8 @@
Name="VCCLCompilerTool"
AdditionalOptions="/MP"
Optimization="0"
- 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"
IgnoreStandardIncludePath="false"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
@@ -359,7 +372,7 @@
ProgramDataBaseFileName=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
WarningLevel="3"
SuppressStartupBanner="true"
- Detect64BitPortabilityProblems="false"
+ Detect64BitPortabilityProblems="true"
DebugInformationFormat="3"
CompileAs="0"
/>
@@ -387,9 +400,9 @@
GenerateMapFile="true"
MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.map"
SubSystem="1"
- FixedBaseAddress="1"
ImportLibrary="$(OutDir)\TrinityCore.lib"
TargetMachine="17"
+ FixedBaseAddress="1"
/>
<Tool
Name="VCALinkTool"
@@ -410,8 +423,14 @@
Name="VCAppVerifierTool"
/>
<Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
Name="VCPostBuildEventTool"
- 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;"
+ CommandLine="copy ..\..\dep\lib\$(PlatformName)_$(ConfigurationName)\*.dll ..\..\bin\$(PlatformName)_$(ConfigurationName)&#x0D;
+ &#x0A;
+ copy ..\..\src\mangosd\mangosd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.conf&#x0D;
+ &#x0A;"
/>
</Configuration>
</Configurations>
@@ -451,39 +470,35 @@
</File>
</Filter>
<File
- RelativePath="..\..\src\trinitycore\CliRunnable.cpp"
- >
- </File>
- <File
- RelativePath="..\..\src\trinitycore\CliRunnable.h"
+ RelativePath="..\..\src\mangosd\CliRunnable.cpp"
>
</File>
<File
- RelativePath="..\..\src\trinitycore\Main.cpp"
+ RelativePath="..\..\src\mangosd\CliRunnable.h"
>
</File>
<File
- RelativePath="..\..\src\trinitycore\Master.cpp"
+ RelativePath="..\..\src\mangosd\Main.cpp"
>
</File>
<File
- RelativePath="..\..\src\trinitycore\Master.h"
+ RelativePath="..\..\src\mangosd\mangosd.rc"
>
</File>
<File
- RelativePath="..\..\src\trinitycore\RASocket.cpp"
+ RelativePath="..\..\src\mangosd\Master.cpp"
>
</File>
<File
- RelativePath="..\..\src\trinitycore\RASocket.h"
+ RelativePath="..\..\src\mangosd\Master.h"
>
</File>
<File
- RelativePath="..\..\src\trinitycore\resource.h"
+ RelativePath="..\..\src\mangosd\RASocket.cpp"
>
</File>
<File
- RelativePath="..\..\src\trinitycore\TrinityCore.rc"
+ RelativePath="..\..\src\mangosd\RASocket.h"
>
</File>
<File
@@ -495,11 +510,11 @@
>
</File>
<File
- RelativePath="..\..\src\trinitycore\WorldRunnable.cpp"
+ RelativePath="..\..\src\mangosd\WorldRunnable.cpp"
>
</File>
<File
- RelativePath="..\..\src\trinitycore\WorldRunnable.h"
+ RelativePath="..\..\src\mangosd\WorldRunnable.h"
>
</File>
</Files>
diff --git a/win/VC80/TrinityRealm.vcproj b/win/VC80/realmd.vcproj
index b6c91e47eb8..9e156713485 100644
--- a/win/VC80/TrinityRealm.vcproj
+++ b/win/VC80/realmd.vcproj
@@ -48,7 +48,7 @@
AdditionalOptions="/MP"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\realmd;..\..\dep\ACE_wrappers"
- PreprocessorDefinitions="VERSION=&quot;0.12.0-SVN&quot;,WIN32,NDEBUG,_CONSOLE"
+ PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;,WIN32,NDEBUG,_CONSOLE"
StringPooling="true"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
@@ -113,7 +113,7 @@
/>
<Tool
Name="VCPostBuildEventTool"
- CommandLine="copy ..\..\src\trinityrealm\trinityrealm.conf.dist ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf.dist"
+ CommandLine="copy ..\..\src\realmd\realmd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf"
/>
</Configuration>
<Configuration
@@ -148,7 +148,7 @@
AdditionalOptions="/MP"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\realmd;..\..\dep\ACE_wrappers"
- PreprocessorDefinitions="VERSION=&quot;0.12.0-SVN&quot;,WIN32,NDEBUG,_CONSOLE"
+ PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;,WIN32,NDEBUG,_CONSOLE"
StringPooling="true"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
@@ -212,7 +212,7 @@
/>
<Tool
Name="VCPostBuildEventTool"
- CommandLine="copy ..\..\src\trinityrealm\trinityrealm.conf.dist ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf.dist"
+ CommandLine="copy ..\..\src\realmd\realmd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf"
/>
</Configuration>
<Configuration
@@ -246,7 +246,7 @@
AdditionalOptions="/MP"
Optimization="0"
AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\realmd;..\..\dep\ACE_wrappers"
- 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"
IgnoreStandardIncludePath="false"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
@@ -311,7 +311,7 @@
/>
<Tool
Name="VCPostBuildEventTool"
- CommandLine="copy ..\..\src\trinityrealm\trinityrealm.conf.dist ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf.dist"
+ CommandLine="copy ..\..\src\realmd\realmd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf"
/>
</Configuration>
<Configuration
@@ -346,7 +346,7 @@
AdditionalOptions="/MP"
Optimization="0"
AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\realmd;..\..\dep\ACE_wrappers"
- 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"
IgnoreStandardIncludePath="false"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
@@ -410,7 +410,7 @@
/>
<Tool
Name="VCPostBuildEventTool"
- CommandLine="copy ..\..\src\trinityrealm\trinityrealm.conf.dist ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf.dist"
+ CommandLine="copy ..\..\src\realmd\realmd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf"
/>
</Configuration>
</Configurations>
@@ -418,35 +418,31 @@
</References>
<Files>
<File
- RelativePath="..\..\src\trinityrealm\AuthCodes.h"
+ RelativePath="..\..\src\realmd\AuthCodes.h"
>
</File>
<File
- RelativePath="..\..\src\trinityrealm\AuthSocket.cpp"
+ RelativePath="..\..\src\realmd\AuthSocket.cpp"
>
</File>
<File
- RelativePath="..\..\src\trinityrealm\AuthSocket.h"
+ RelativePath="..\..\src\realmd\AuthSocket.h"
>
</File>
<File
- RelativePath="..\..\src\trinityrealm\Main.cpp"
+ RelativePath="..\..\src\realmd\Main.cpp"
>
</File>
<File
- RelativePath="..\..\src\trinityrealm\RealmList.cpp"
+ RelativePath="..\..\src\realmd\realmd.rc"
>
</File>
<File
- RelativePath="..\..\src\trinityrealm\RealmList.h"
+ RelativePath="..\..\src\realmd\RealmList.cpp"
>
</File>
<File
- RelativePath="..\..\src\trinityrealm\resource.h"
- >
- </File>
- <File
- RelativePath="..\..\src\trinityrealm\TrinityRealm.rc"
+ RelativePath="..\..\src\realmd\RealmList.h"
>
</File>
<File
diff --git a/win/VC90/game.vcproj b/win/VC90/game.vcproj
index a6497190443..261803e8cb0 100644
--- a/win/VC90/game.vcproj
+++ b/win/VC90/game.vcproj
@@ -5,7 +5,8 @@
Name="game"
ProjectGUID="{1DC6C4DA-A028-41F3-877D-D5400C594F88}"
RootNamespace="game"
- TargetFrameworkVersion="131072"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="0"
>
<Platforms>
<Platform
@@ -23,7 +24,6 @@
OutputDirectory=".\game__$(PlatformName)_$(ConfigurationName)"
IntermediateDirectory=".\game__$(PlatformName)_$(ConfigurationName)"
ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
@@ -80,7 +80,6 @@
/>
<Tool
Name="VCLibrarianTool"
- AdditionalDependencies=".\shared__$(PlatformName)_$(ConfigurationName)\shared.lib"
OutputFile=".\game__$(PlatformName)_$(ConfigurationName)\game.lib"
SuppressStartupBanner="true"
/>
@@ -105,7 +104,6 @@
OutputDirectory=".\game__$(PlatformName)_$(ConfigurationName)"
IntermediateDirectory=".\game__$(PlatformName)_$(ConfigurationName)"
ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
@@ -128,7 +126,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalOptions="/MP"
+ AdditionalOptions="/MP /bigobj"
Optimization="0"
AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\shared\vmap;..\..\dep\ACE_wrappers"
PreprocessorDefinitions="WIN32;_DEBUG;MANGOS_DEBUG;_LIB;"
@@ -188,7 +186,6 @@
OutputDirectory=".\game__$(PlatformName)_$(ConfigurationName)"
IntermediateDirectory=".\game__$(PlatformName)_$(ConfigurationName)"
ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
@@ -218,7 +215,6 @@
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
EnableEnhancedInstructionSet="1"
- FloatingPointModel="2"
RuntimeTypeInfo="true"
UsePrecompiledHeader="0"
PrecompiledHeaderFile=".\game__$(PlatformName)_$(ConfigurationName)\game.pch"
@@ -245,7 +241,6 @@
/>
<Tool
Name="VCLibrarianTool"
- AdditionalDependencies=".\shared__$(PlatformName)_$(ConfigurationName)\shared.lib"
OutputFile=".\game__$(PlatformName)_$(ConfigurationName)\game.lib"
SuppressStartupBanner="true"
/>
@@ -270,7 +265,6 @@
OutputDirectory=".\game__$(PlatformName)_$(ConfigurationName)"
IntermediateDirectory=".\game__$(PlatformName)_$(ConfigurationName)"
ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
@@ -293,7 +287,7 @@
/>
<Tool
Name="VCCLCompilerTool"
- AdditionalOptions="/MP"
+ AdditionalOptions="/MP /bigobj"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..\..\dep\include;..\..\src\framework;..\..\src\shared;..\..\src\shared\vmap;..\..\dep\ACE_wrappers"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;"
@@ -301,7 +295,6 @@
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
EnableEnhancedInstructionSet="0"
- FloatingPointModel="2"
RuntimeTypeInfo="true"
UsePrecompiledHeader="0"
PrecompiledHeaderFile=".\game__$(PlatformName)_$(ConfigurationName)\game.pch"
@@ -364,6 +357,14 @@
>
</File>
<File
+ RelativePath="..\..\src\game\AchievementMgr.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\AchievementMgr.h"
+ >
+ </File>
+ <File
RelativePath="..\..\src\game\AddonHandler.cpp"
>
</File>
@@ -464,6 +465,10 @@
>
</File>
<File
+ RelativePath="..\..\src\game\CalendarHandler.cpp"
+ >
+ </File>
+ <File
RelativePath="..\..\src\game\Cell.h"
>
</File>
@@ -632,14 +637,6 @@
>
</File>
<File
- RelativePath="..\..\src\game\MapReference.h"
- >
- </File>
- <File
- RelativePath="..\..\src\game\MapRefManager.h"
- >
- </File>
- <File
RelativePath="..\..\src\game\MiscHandler.cpp"
>
</File>
@@ -900,6 +897,14 @@
>
</File>
<File
+ RelativePath="..\..\src\game\Calendar.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\Calendar.h"
+ >
+ </File>
+ <File
RelativePath="..\..\src\game\ConfusedMovementGenerator.cpp"
>
</File>
@@ -1260,6 +1265,14 @@
>
</File>
<File
+ RelativePath="..\..\src\game\Vehicle.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\Vehicle.h"
+ >
+ </File>
+ <File
RelativePath="..\..\src\game\WaypointMovementGenerator.cpp"
>
</File>
@@ -1363,14 +1376,6 @@
RelativePath="..\..\src\game\PlayerDump.h"
>
</File>
- <File
- RelativePath="..\..\src\game\tools.cpp"
- >
- </File>
- <File
- RelativePath="..\..\src\game\Tools.h"
- >
- </File>
</Filter>
<Filter
Name="References"
@@ -1408,6 +1413,14 @@
>
</File>
<File
+ RelativePath="..\..\src\game\MapReference.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\game\MapRefManager.h"
+ >
+ </File>
+ <File
RelativePath="..\..\src\game\ThreatManager.cpp"
>
</File>
diff --git a/win/VC90/mangosd.vcproj b/win/VC90/mangosd.vcproj
new file mode 100644
index 00000000000..bb8971612cb
--- /dev/null
+++ b/win/VC90/mangosd.vcproj
@@ -0,0 +1,523 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9,00"
+ Name="TrinityCore"
+ ProjectGUID="{A3A04E47-43A2-4C08-90B3-029CEF558594}"
+ RootNamespace="mangosd"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="0"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ IntermediateDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ ConfigurationType="1"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TypeLibraryName=".\..\..\bin\Release\mangosd.tlb"
+ />
+ <Tool
+ 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"
+ StringPooling="true"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ EnableEnhancedInstructionSet="1"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\trinitycore.pch"
+ AssemblerListingLocation=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ObjectFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ProgramDataBaseFileName=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ CallingConvention="0"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/MACHINE:I386"
+ AdditionalDependencies="libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib advapi32.lib dbghelp.lib MSVCPRT.LIB msvcrt.lib"
+ OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\dep\lib\$(PlatformName)_$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.pdb"
+ GenerateMapFile="true"
+ MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.map"
+ SubSystem="1"
+ LargeAddressAware="2"
+ LinkTimeCodeGeneration="0"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(OutDir)\TrinityCore.lib"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy ..\..\dep\lib\$(PlatformName)_$(ConfigurationName)\*.dll ..\..\bin\$(PlatformName)_$(ConfigurationName)&#x0D;
+ &#x0A;
+ copy ..\..\src\mangosd\mangosd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.conf&#x0D;
+ &#x0A;"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ IntermediateDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ ConfigurationType="1"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ TypeLibraryName=".\..\..\bin\Release\mangosd.tlb"
+ />
+ <Tool
+ 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"
+ StringPooling="true"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ EnableEnhancedInstructionSet="0"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\trinitycore.pch"
+ AssemblerListingLocation=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ObjectFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ProgramDataBaseFileName=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ CallingConvention="0"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib advapi32.lib dbghelp.lib MSVCPRT.LIB msvcrt.lib"
+ OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.exe"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\dep\lib\$(PlatformName)_$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.pdb"
+ GenerateMapFile="true"
+ MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.map"
+ SubSystem="1"
+ LinkTimeCodeGeneration="0"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(OutDir)\TrinityCore.lib"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy ..\..\dep\lib\$(PlatformName)_$(ConfigurationName)\*.dll ..\..\bin\$(PlatformName)_$(ConfigurationName)&#x0D;
+ &#x0A;
+ copy ..\..\src\mangosd\mangosd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.conf&#x0D;
+ &#x0A;"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ IntermediateDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ ConfigurationType="1"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TypeLibraryName=".\mangosd__$(PlatformName)_$(ConfigurationName)\mangosd.tlb"
+ />
+ <Tool
+ 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"
+ IgnoreStandardIncludePath="false"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ EnableFunctionLevelLinking="true"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\trinitycore.pch"
+ AssemblerListingLocation=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ObjectFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ProgramDataBaseFileName=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ CallingConvention="0"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/MACHINE:I386"
+ AdditionalDependencies="libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib advapi32.lib dbghelp.lib MSVCPRTD.LIB msvcrtd.lib"
+ OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.exe"
+ Version=""
+ LinkIncremental="2"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\dep\lib\$(PlatformName)_$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.pdb"
+ GenerateMapFile="true"
+ MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.map"
+ SubSystem="1"
+ LargeAddressAware="2"
+ RandomizedBaseAddress="1"
+ FixedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(OutDir)\TrinityCore.lib"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy ..\..\dep\lib\$(PlatformName)_$(ConfigurationName)\*.dll ..\..\bin\$(PlatformName)_$(ConfigurationName)&#x0D;
+ &#x0A;
+ copy ..\..\src\mangosd\mangosd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.conf&#x0D;
+ &#x0A;"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ IntermediateDirectory=".\trinitycore__$(PlatformName)_$(ConfigurationName)"
+ ConfigurationType="1"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ TypeLibraryName=".\mangosd__$(PlatformName)_$(ConfigurationName)\mangosd.tlb"
+ />
+ <Tool
+ 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"
+ IgnoreStandardIncludePath="false"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ EnableFunctionLevelLinking="true"
+ RuntimeTypeInfo="true"
+ PrecompiledHeaderFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\trinitycore.pch"
+ AssemblerListingLocation=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ObjectFile=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ ProgramDataBaseFileName=".\trinitycore__$(PlatformName)_$(ConfigurationName)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ Detect64BitPortabilityProblems="false"
+ DebugInformationFormat="3"
+ CallingConvention="0"
+ CompileAs="0"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1033"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="libmySQL.lib libeay32.lib ws2_32.lib winmm.lib odbc32.lib odbccp32.lib advapi32.lib dbghelp.lib MSVCPRTD.LIB msvcrtd.lib"
+ OutputFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.exe"
+ Version=""
+ LinkIncremental="2"
+ SuppressStartupBanner="true"
+ AdditionalLibraryDirectories="..\..\dep\lib\$(PlatformName)_$(ConfigurationName)"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.pdb"
+ GenerateMapFile="true"
+ MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.map"
+ SubSystem="1"
+ RandomizedBaseAddress="1"
+ FixedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(OutDir)\TrinityCore.lib"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ CommandLine="copy ..\..\dep\lib\$(PlatformName)_$(ConfigurationName)\*.dll ..\..\bin\$(PlatformName)_$(ConfigurationName)&#x0D;
+ &#x0A;
+ copy ..\..\src\mangosd\mangosd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityCore.conf&#x0D;
+ &#x0A;"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="doc"
+ >
+ <File
+ RelativePath="..\..\Authors"
+ >
+ </File>
+ <File
+ RelativePath="..\..\ChangeLog"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Copying"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Install"
+ >
+ </File>
+ <File
+ RelativePath="..\..\News"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Readme"
+ >
+ </File>
+ <File
+ RelativePath="..\..\Thanks"
+ >
+ </File>
+ </Filter>
+ <File
+ RelativePath="..\..\src\mangosd\CliRunnable.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mangosd\CliRunnable.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mangosd\Main.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mangosd\mangosd.rc"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mangosd\Master.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mangosd\Master.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mangosd\RASocket.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mangosd\RASocket.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\shared\WheatyExceptionReport.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\shared\WheatyExceptionReport.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mangosd\WorldRunnable.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\src\mangosd\WorldRunnable.h"
+ >
+ </File>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/win/VC90/TrinityRealm.vcproj b/win/VC90/realmd.vcproj
index 80ba6157e8b..69dbb97ea94 100644
--- a/win/VC90/TrinityRealm.vcproj
+++ b/win/VC90/realmd.vcproj
@@ -5,7 +5,8 @@
Name="TrinityRealm"
ProjectGUID="{563E9905-3657-460C-AE63-0AC39D162E23}"
RootNamespace="realmd"
- TargetFrameworkVersion="131072"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="0"
>
<Platforms>
<Platform
@@ -23,7 +24,6 @@
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.12.0-SVN&quot;,WIN32,NDEBUG,_CONSOLE"
+ PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;,WIN32,NDEBUG,_CONSOLE"
StringPooling="true"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
@@ -63,6 +63,7 @@
SuppressStartupBanner="true"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
+ CallingConvention="0"
CompileAs="0"
/>
<Tool
@@ -113,7 +114,7 @@
/>
<Tool
Name="VCPostBuildEventTool"
- CommandLine="copy ..\..\src\trinityrealm\trinityrealm.conf.dist ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf.dist"
+ CommandLine="copy ..\..\src\realmd\realmd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf"
/>
</Configuration>
<Configuration
@@ -121,7 +122,6 @@
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.12.0-SVN&quot;,WIN32,NDEBUG,_CONSOLE"
+ PreprocessorDefinitions="VERSION=&quot;0.13.0-DEV&quot;,WIN32,NDEBUG,_CONSOLE"
StringPooling="true"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
@@ -162,6 +162,7 @@
SuppressStartupBanner="true"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
+ CallingConvention="0"
CompileAs="0"
/>
<Tool
@@ -187,6 +188,8 @@
GenerateMapFile="true"
MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.map"
SubSystem="1"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
TargetMachine="17"
/>
<Tool
@@ -209,7 +212,7 @@
/>
<Tool
Name="VCPostBuildEventTool"
- CommandLine="copy ..\..\src\trinityrealm\trinityrealm.conf.dist ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf.dist"
+ CommandLine="copy ..\..\src\realmd\realmd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf"
/>
</Configuration>
<Configuration
@@ -217,7 +220,6 @@
OutputDirectory=".\trinityrealm__$(PlatformName)_$(ConfigurationName)"
IntermediateDirectory=".\trinityrealm__$(PlatformName)_$(ConfigurationName)"
ConfigurationType="1"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
@@ -247,6 +249,7 @@
IgnoreStandardIncludePath="false"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
+ EnableFunctionLevelLinking="true"
RuntimeTypeInfo="true"
PrecompiledHeaderFile=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\realmd.pch"
AssemblerListingLocation=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
@@ -256,6 +259,7 @@
SuppressStartupBanner="true"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
+ CallingConvention="0"
CompileAs="0"
/>
<Tool
@@ -307,7 +311,7 @@
/>
<Tool
Name="VCPostBuildEventTool"
- CommandLine="copy ..\..\src\trinityrealm\trinityrealm.conf.dist ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf.dist"
+ CommandLine="copy ..\..\src\realmd\realmd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf"
/>
</Configuration>
<Configuration
@@ -346,6 +350,7 @@
IgnoreStandardIncludePath="false"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
+ EnableFunctionLevelLinking="true"
RuntimeTypeInfo="true"
PrecompiledHeaderFile=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\realmd.pch"
AssemblerListingLocation=".\trinityrealm__$(PlatformName)_$(ConfigurationName)\"
@@ -355,6 +360,7 @@
SuppressStartupBanner="true"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
+ CallingConvention="0"
CompileAs="0"
/>
<Tool
@@ -380,7 +386,9 @@
GenerateMapFile="true"
MapFileName="..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.map"
SubSystem="1"
+ RandomizedBaseAddress="1"
FixedBaseAddress="1"
+ DataExecutionPrevention="0"
TargetMachine="17"
/>
<Tool
@@ -403,7 +411,7 @@
/>
<Tool
Name="VCPostBuildEventTool"
- CommandLine="copy ..\..\src\trinityrealm\trinityrealm.conf.dist ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf.dist"
+ CommandLine="copy ..\..\src\realmd\realmd.conf.dist.in ..\..\bin\$(PlatformName)_$(ConfigurationName)\TrinityRealm.conf"
/>
</Configuration>
</Configurations>
@@ -411,31 +419,31 @@
</References>
<Files>
<File
- RelativePath="..\..\src\trinityrealm\AuthCodes.h"
+ RelativePath="..\..\src\realmd\AuthCodes.h"
>
</File>
<File
- RelativePath="..\..\src\trinityrealm\AuthSocket.cpp"
+ RelativePath="..\..\src\realmd\AuthSocket.cpp"
>
</File>
<File
- RelativePath="..\..\src\trinityrealm\AuthSocket.h"
+ RelativePath="..\..\src\realmd\AuthSocket.h"
>
</File>
<File
- RelativePath="..\..\src\trinityrealm\Main.cpp"
+ RelativePath="..\..\src\realmd\Main.cpp"
>
</File>
<File
- RelativePath="..\..\src\trinityrealm\RealmList.cpp"
+ RelativePath="..\..\src\realmd\realmd.rc"
>
</File>
<File
- RelativePath="..\..\src\trinityrealm\RealmList.h"
+ RelativePath="..\..\src\realmd\RealmList.cpp"
>
</File>
<File
- RelativePath="..\..\src\trinityrealm\TrinityRealm.rc"
+ RelativePath="..\..\src\realmd\RealmList.h"
>
</File>
<File