diff options
author | Vincent-Michael <Vincent_Michael@gmx.de> | 2014-07-05 14:28:58 +0200 |
---|---|---|
committer | Vincent-Michael <Vincent_Michael@gmx.de> | 2014-07-05 14:28:58 +0200 |
commit | a508ce1976caaf8ede6afcea7e8a857399f548ef (patch) | |
tree | a74648a065e92da70251066a99ecda387a9fe1a2 | |
parent | 6d93a0a810c9d092797a5016738576d03005d1b7 (diff) | |
parent | d28b66bca88de621fd00495e4edc7e4d9d01e7eb (diff) |
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
Conflicts:
src/server/game/Entities/Player/Player.cpp
src/server/game/Entities/Unit/Unit.cpp
src/server/game/Globals/ObjectMgr.cpp
37 files changed, 541 insertions, 195 deletions
diff --git a/sql/updates/characters/2014_07_01_00_characters_character_skills.sql b/sql/updates/characters/2014_07_01_00_characters_character_skills.sql new file mode 100644 index 00000000000..1987adb064c --- /dev/null +++ b/sql/updates/characters/2014_07_01_00_characters_character_skills.sql @@ -0,0 +1,4 @@ +-- Set fist weapon skill equal to current unarmed skill value +UPDATE character_skills cs_unarmed INNER JOIN character_skills cs_fist ON cs_unarmed.guid = cs_fist.guid +SET cs_fist.value = cs_unarmed.value, cs_fist.max = cs_unarmed.max +WHERE cs_unarmed.skill = 162 AND cs_fist.skill = 473; diff --git a/sql/updates/world/2014_04_21_06_world_locales_broadcast_text.sql b/sql/updates/world/2014_04_21_06_world_locales_broadcast_text.sql index 214a80e72ca..a1401a2eefe 100644 --- a/sql/updates/world/2014_04_21_06_world_locales_broadcast_text.sql +++ b/sql/updates/world/2014_04_21_06_world_locales_broadcast_text.sql @@ -1,3 +1,5 @@ +SET NAMES 'utf8'; + DROP TABLE IF EXISTS `locales_broadcast_text`; CREATE TABLE IF NOT EXISTS `locales_broadcast_text` ( `ID` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0', @@ -73832,3 +73834,5 @@ INSERT INTO `locales_broadcast_text` (`ID`, `MaleText_loc1`, `MaleText_loc2`, `M (77369, '', '|TInterface\\Icons\\inv_misc_bomb_05:20|tVous êtes |cFFFF0000|Hspell:145996|h[Prêt à exploser]|h|r ! Utilisez |cFFFF0000|Hspell:146364|h[Larguer la bombe]|h|r pour les larguer !', '|TInterface\\Icons\\inv_misc_bomb_05:20|t Ihr wurdet |cFFFF0000|Hspell:145996|h[scharfgemacht]|h|r! Benutzt |cFFFF0000|Hspell:146364|h[Bombe werfen]|h|r, um sie loszuwerden!', '', '', '|TInterface\\Icons\\inv_misc_bomb_05:20|tTienes |cFFFF0000|Hspell:145996|h[Listo para explotar]|h|r! Utiliza |cFFFF0000|Hspell:146364|h[Lanzar bomba]|h|r para lanzarlas!', '', '|TInterface\\Icons\\inv_misc_bomb_05:20|tВы использовали способность|cFFFF0000|Hspell:145996|h[Готовность к взрыву]|h|r! Используйте |cFFFF0000|Hspell:146364|h[Бросок бомбы]|h|r, чтобы метнуть заряд в цель.', '', '', '', '', '', '', '', ''), (77371, '', 'Pour Hurlenfer, c’est la fin.$b$b<Vol’jin vous regarde avec méfiance.>$b$bQue voulez-vous d’autre, $r ?', 'Das ist das Ende von Höllschrei.$b$b<Vol''jin beäugt Euch misstrauisch.>$b$bWas jetzt, $R?', '', '', 'Eh''te es el final de Grito Infernal.$b$b<Vol''jin te mira con cautela.>$b$b¿Y ahora qué, $r?', '', 'С Адским Криком покончено.$b$b<Вол''джин тревожно смотрит на вас.>$b$bЧто будет дальше, $r?', '', '', '', '', '', '', '', ''), (77865, '', '|TInterface\\Icons\\achievement_arena_2v2_5:20|t$n a accepté de commencer le combat. Joueurs supplémentaires requis pour commencer : $8589w.', '|TInterface\\Icons\\achievement_arena_2v2_5:20|t$n hat zugestimmt, die Begegnung zu starten. Zusätzliche Spieler benötigt, um zu beginnen: $8589w.', '', '', '|TInterface\\Icons\\achievement_arena_2v2_5:20|t$n ha aceptado el encuentro. Jugadores adicionales necesarios para comenzar: $8589w.', '', '|TInterface\\Icons\\achievement_arena_2v2_5:20|t$n $gсогласился:согласилась; начать бой. Число недостающих игроков: $8589w.', '', '', '', '', '', '', '', ''); + +SET NAMES 'latin1'; diff --git a/sql/updates/world/2014_04_21_07_world_locales_item.sql b/sql/updates/world/2014_04_21_07_world_locales_item.sql index 26fcbb6cdc0..c3cdea25531 100644 --- a/sql/updates/world/2014_04_21_07_world_locales_item.sql +++ b/sql/updates/world/2014_04_21_07_world_locales_item.sql @@ -1,3 +1,5 @@ +SET NAMES 'utf8'; + TRUNCATE `locales_item`; INSERT INTO `locales_item` (`entry`, `name_loc1`, `name_loc2`, `name_loc3`, `name_loc4`, `name_loc5`, `name_loc6`, `name_loc7`, `name_loc8`, `description_loc1`, `description_loc2`, `description_loc3`, `description_loc4`, `description_loc5`, `description_loc6`, `description_loc7`, `description_loc8`) VALUES @@ -38287,3 +38289,5 @@ INSERT INTO `locales_item` (`entry`, `name_loc1`, `name_loc2`, `name_loc3`, `nam (54857, '', 'Petite lance de Bourbimus', 'Murkimus'' kleiner Speer', '', '', 'Pequeña lanza de Murkimus', '', 'Маленькое копье Мурчалия', '', 'Vous apprend à invoquer cette mascotte.', 'Lehrt Euch, wie man dieses Haustier beschwört.', '', '', 'Te enseña a invocar este compañero.', '', 'Учит призывать этого спутника.'), (54860, '', 'Fusée de tourisme X-53', 'X-53 Reiserakete', '', '', 'Cohete de paseo X-53', '', 'Прогулочная ракета X-53', '', 'Vous apprend à invoquer cette monture. Elle change selon l''endroit où vous vous trouvez et votre compétence de monte.', 'Lehrt Euch, wie man dieses Reittier beschwört. Dieses Reittier passt sich Eurer Reitfertigkeit und Eurem Aufenthaltsort an.', '', '', 'Te enseña a invocar esta montura. Cambia según tu habilidad en equitación y la zona en la que estés.', '', 'Обучает управлению этим средством передвижения. Свойства этого транспортного средства могут меняться в зависимости от вашего навыка верховой езды и местонахождения.'), (56806, '', 'Mini Thor', 'Mini-Thor', '', '', 'Mini thor', '', 'Игрушечный Тор', '', 'Vous apprend à invoquer le mini Thor.', 'Lehrt Euch, wie man einen winzigen Thor beschwört.', '', '', 'Te enseña a invocar un mini thor.', '', 'Учит призывать игрушечного Тора.'); + +SET NAMES 'latin1'; diff --git a/sql/updates/world/2014_04_21_08_world_locales_item_set_names.sql b/sql/updates/world/2014_04_21_08_world_locales_item_set_names.sql index 5b55ca6d060..83fbc7c349f 100644 --- a/sql/updates/world/2014_04_21_08_world_locales_item_set_names.sql +++ b/sql/updates/world/2014_04_21_08_world_locales_item_set_names.sql @@ -1,3 +1,5 @@ +SET NAMES 'utf8'; + TRUNCATE `locales_item_set_names`; INSERT INTO `locales_item_set_names` (`entry`, `name_loc1`, `name_loc2`, `name_loc3`, `name_loc4`, `name_loc5`, `name_loc6`, `name_loc7`, `name_loc8`) VALUES @@ -2490,3 +2492,5 @@ INSERT INTO `locales_item_set_names` (`entry`, `name_loc1`, `name_loc2`, `name_l (51774, '', 'Grand heaume de seigneur ymirjar', 'Großhelm des Ymirjarfürsten', '', '', 'Gran yelmo de señor Ymirjar', '', 'Великий шлем имирьярского повелителя'), (51775, '', 'Garde-jambes de seigneur ymirjar', 'Beinschützer des Ymirjarfürsten', '', '', 'Musleras de señor Ymirjar', '', 'Набедренники имирьярского повелителя'), (51776, '', 'Espauliers de seigneur ymirjar', 'Schulterstücke des Ymirjarfürsten', '', '', 'Espaldares de señor Ymirjar', '', 'Наплечье имирьярского повелителя'); + +SET NAMES 'latin1'; diff --git a/sql/updates/world/2014_04_22_00_world_locales_gameobject.sql b/sql/updates/world/2014_04_22_00_world_locales_gameobject.sql index 7640918784e..fd4c09ae488 100644 --- a/sql/updates/world/2014_04_22_00_world_locales_gameobject.sql +++ b/sql/updates/world/2014_04_22_00_world_locales_gameobject.sql @@ -1,3 +1,5 @@ +SET NAMES 'utf8'; + TRUNCATE `locales_gameobject`; INSERT INTO `locales_gameobject` (`entry`, `name_loc1`, `name_loc2`, `name_loc3`, `name_loc4`, `name_loc5`, `name_loc6`, `name_loc7`, `name_loc8`, `castbarcaption_loc1`, `castbarcaption_loc2`, `castbarcaption_loc3`, `castbarcaption_loc4`, `castbarcaption_loc5`, `castbarcaption_loc6`, `castbarcaption_loc7`, `castbarcaption_loc8`) VALUES @@ -19727,3 +19729,5 @@ INSERT INTO `locales_gameobject` (`entry`, `name_loc1`, `name_loc2`, `name_loc3` (203079, '', 'Œuf de dragon rouge (grand)', 'Großes Rotdrachenei', '', '', 'Huevo de dragón Rojo (grande)', '', 'Большое яйцо красного дракона', '', '', '', '', '', '', '', ''), (203080, '', 'Œuf de dragon rouge brisé (grand)', 'Zerbrochenes großes Rotdrachenei', '', '', 'Huevo de dragón Rojo roto (grande)', '', 'Большое разбитое яйцо красного дракона', '', '', '', '', '', '', '', ''), (203624, '', 'Anneau du Crépuscule d''Halion', 'Zwielichtring von Halion', '', '', 'Anillo Crepuscular de Halion', '', 'Сумеречное кольцо Халиона', '', '', '', '', '', '', '', ''); + +SET NAMES 'latin1'; diff --git a/sql/updates/world/2014_04_22_01_world_locales_creature.sql b/sql/updates/world/2014_04_22_01_world_locales_creature.sql index a0576578eb4..2cfe1c35eac 100644 --- a/sql/updates/world/2014_04_22_01_world_locales_creature.sql +++ b/sql/updates/world/2014_04_22_01_world_locales_creature.sql @@ -1,3 +1,5 @@ +SET NAMES 'utf8'; + TRUNCATE `locales_creature`; INSERT INTO `locales_creature` (`entry`, `name_loc1`, `name_loc2`, `name_loc3`, `name_loc4`, `name_loc5`, `name_loc6`, `name_loc7`, `name_loc8`, `subname_loc1`, `subname_loc2`, `subname_loc3`, `subname_loc4`, `subname_loc5`, `subname_loc6`, `subname_loc7`, `subname_loc8`) VALUES @@ -27350,3 +27352,5 @@ INSERT INTO `locales_creature` (`entry`, `name_loc1`, `name_loc2`, `name_loc3`, (40870, '', 'Dragon rubis', 'Rubindrache', '', '', 'Dragón rubí', '', 'Рубиновый дракон', '', '', '', '', '', '', '', ''), (41839, '', '[DND] Controller', '[DND] Controller', '', '', '[DND] Controller', '', '[DND] Controller', '', '', '', '', '', '', '', ''), (42078, '', 'Mini Thor', 'Mini-Thor', '', '', 'Mini thor', '', 'Игрушечный Тор', '', 'Le destructeur', 'Der Zerstörer', '', '', 'El Destructor', '', 'Разрушитель'); + +SET NAMES 'latin1'; diff --git a/sql/updates/world/2014_04_23_01_world_locales_quest.sql b/sql/updates/world/2014_04_23_01_world_locales_quest.sql index b191439ea52..b19d251a4dd 100644 --- a/sql/updates/world/2014_04_23_01_world_locales_quest.sql +++ b/sql/updates/world/2014_04_23_01_world_locales_quest.sql @@ -1,3 +1,5 @@ +SET NAMES 'utf8'; + TRUNCATE `locales_quest`; INSERT INTO `locales_quest` (`Id`, `Title_loc1`, `Title_loc2`, `Title_loc3`, `Title_loc4`, `Title_loc5`, `Title_loc6`, `Title_loc7`, `Title_loc8`, `Details_loc1`, `Details_loc2`, `Details_loc3`, `Details_loc4`, `Details_loc5`, `Details_loc6`, `Details_loc7`, `Details_loc8`, `Objectives_loc1`, `Objectives_loc2`, `Objectives_loc3`, `Objectives_loc4`, `Objectives_loc5`, `Objectives_loc6`, `Objectives_loc7`, `Objectives_loc8`, `OfferRewardText_loc1`, `OfferRewardText_loc2`, `OfferRewardText_loc3`, `OfferRewardText_loc4`, `OfferRewardText_loc5`, `OfferRewardText_loc6`, `OfferRewardText_loc7`, `OfferRewardText_loc8`, `RequestItemsText_loc1`, `RequestItemsText_loc2`, `RequestItemsText_loc3`, `RequestItemsText_loc4`, `RequestItemsText_loc5`, `RequestItemsText_loc6`, `RequestItemsText_loc7`, `RequestItemsText_loc8`, `EndText_loc1`, `EndText_loc2`, `EndText_loc3`, `EndText_loc4`, `EndText_loc5`, `EndText_loc6`, `EndText_loc7`, `EndText_loc8`, `CompletedText_loc1`, `CompletedText_loc2`, `CompletedText_loc3`, `CompletedText_loc4`, `CompletedText_loc5`, `CompletedText_loc6`, `CompletedText_loc7`, `CompletedText_loc8`, `ObjectiveText1_loc1`, `ObjectiveText1_loc2`, `ObjectiveText1_loc3`, `ObjectiveText1_loc4`, `ObjectiveText1_loc5`, `ObjectiveText1_loc6`, `ObjectiveText1_loc7`, `ObjectiveText1_loc8`, `ObjectiveText2_loc1`, `ObjectiveText2_loc2`, `ObjectiveText2_loc3`, `ObjectiveText2_loc4`, `ObjectiveText2_loc5`, `ObjectiveText2_loc6`, `ObjectiveText2_loc7`, `ObjectiveText2_loc8`, `ObjectiveText3_loc1`, `ObjectiveText3_loc2`, `ObjectiveText3_loc3`, `ObjectiveText3_loc4`, `ObjectiveText3_loc5`, `ObjectiveText3_loc6`, `ObjectiveText3_loc7`, `ObjectiveText3_loc8`, `ObjectiveText4_loc1`, `ObjectiveText4_loc2`, `ObjectiveText4_loc3`, `ObjectiveText4_loc4`, `ObjectiveText4_loc5`, `ObjectiveText4_loc6`, `ObjectiveText4_loc7`, `ObjectiveText4_loc8`) VALUES @@ -10178,3 +10180,5 @@ INSERT INTO `locales_quest` (`Id`, `Title_loc1`, `Title_loc2`, `Title_loc3`, `Ti (26013, '', 'Assaut sur le sanctum', 'Angriff auf das Sanktum', '', '', 'Asalto al Sagrario', 'Asalto al Sagrario', 'Нападение на святилище', '', '$R, quelque chose de terrible est survenu dans le sanctum Rubis, sous le temple.$B$BL’entrée du sanctum a été saccagée, et ses gardiens sauvagement assassinés. Nous avons envoyé des éclaireurs pour comprendre ce qui s’est passé, mais aucun d’entre eux n’est revenu. Je crains malheureusement le pire.$B$BEntrez dans le sanctum Rubis et découvrez ce qui est arrivé au foyer de mon Vol. Quand nous aurons plus d’informations, nous pourrons préparer nos plans.', '$R, etwas Schreckliches ist im Rubinsanktum unterhalb des Tempels geschehen.$B$BDer Eingang zum Sanktum liegt in Ruinen und seine Wächter sind auf grausame Art und Weise erschlagen worden. Wir haben Kundschafter ausgesandt, um der Sache auf den Grund zu gehen, aber sie sind nicht zurückgekommen. Nun befürchte ich das Schlimmste.$B$BBetretet das Rubinsanktum und bringt in Erfahrung, was in der Heimat meines Schwarmes passiert ist. Sobald wir mehr Informationen haben, können wir unsere nächsten Schritte entsprechend planen.', '', '', '$R, algo terrible ha ocurrido dentro del Sagrario Rubí, bajo el templo.$B$BLa entrada al Sagrario está en ruinas y sus guardianes han muerto de forma violenta. Enviamos exploradores a investigar, pero no han regresado. No puedo evitar temerme lo peor.$B$BEntra al Sagrario Rubí y descubre qué ha sucedido en el hogar de mi Vuelo. Una vez que tengamos más información, podremos planear nuestros siguientes pasos.', '$R, algo terrible ha ocurrido dentro del Sagrario Rubí, bajo el templo.$B$BLa entrada al Sagrario está en ruinas y sus guardianes han muerto de forma violenta. Enviamos exploradores a investigar, pero no han regresado. No puedo evitar temerme lo peor.$B$BEntra al Sagrario Rubí y descubre qué ha sucedido en el hogar de mi Vuelo. Una vez que tengamos más información, podremos planear nuestros siguientes pasos.', '$R, в Рубиновом святилище под храмом произошло нечто ужасное!$B$BГлавный вход разрушен, стражи мертвы... Мы послали туда разведчиков, но никто не вернулся живым. Боюсь, нам надо готовиться к худшему.$B$BОтправляйся в Рубиновое святилище и выясни, кто осмелился поднять руку на дом моего племени. Как только у нас будет больше информации, мы сможем спланировать дальнейшие действия.', '', 'Menez une enquête au Sanctum Rubis, sous le Temple du Repos du ver.', 'Untersucht das Rubinsanktum unterhalb des Wyrmruhtempels.', '', '', 'Investiga el Sagrario Rubí bajo el Templo del Reposo del Dragón.', 'Investiga el Sagrario Rubí bajo el Templo del Reposo del Dragón.', 'Осмотрите Рубиновое святилище под храмом Драконьего Покоя.', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'Menez une enquête au sanctum Rubis, sous le temple du Repos du ver.', 'Untersucht das Rubinsanktum unterhalb des Wyrmruhtempels.', '', '', 'Investiga el Sagrario Rubí bajo el Templo del Reposo del Dragón.', 'Investiga el Sagrario Rubí bajo el Templo del Reposo del Dragón.', 'Осмотрите Рубиновое святилище под храмом Драконьего Покоя.', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''); INSERT INTO `locales_quest` (`Id`, `Title_loc1`, `Title_loc2`, `Title_loc3`, `Title_loc4`, `Title_loc5`, `Title_loc6`, `Title_loc7`, `Title_loc8`, `Details_loc1`, `Details_loc2`, `Details_loc3`, `Details_loc4`, `Details_loc5`, `Details_loc6`, `Details_loc7`, `Details_loc8`, `Objectives_loc1`, `Objectives_loc2`, `Objectives_loc3`, `Objectives_loc4`, `Objectives_loc5`, `Objectives_loc6`, `Objectives_loc7`, `Objectives_loc8`, `OfferRewardText_loc1`, `OfferRewardText_loc2`, `OfferRewardText_loc3`, `OfferRewardText_loc4`, `OfferRewardText_loc5`, `OfferRewardText_loc6`, `OfferRewardText_loc7`, `OfferRewardText_loc8`, `RequestItemsText_loc1`, `RequestItemsText_loc2`, `RequestItemsText_loc3`, `RequestItemsText_loc4`, `RequestItemsText_loc5`, `RequestItemsText_loc6`, `RequestItemsText_loc7`, `RequestItemsText_loc8`, `EndText_loc1`, `EndText_loc2`, `EndText_loc3`, `EndText_loc4`, `EndText_loc5`, `EndText_loc6`, `EndText_loc7`, `EndText_loc8`, `CompletedText_loc1`, `CompletedText_loc2`, `CompletedText_loc3`, `CompletedText_loc4`, `CompletedText_loc5`, `CompletedText_loc6`, `CompletedText_loc7`, `CompletedText_loc8`, `ObjectiveText1_loc1`, `ObjectiveText1_loc2`, `ObjectiveText1_loc3`, `ObjectiveText1_loc4`, `ObjectiveText1_loc5`, `ObjectiveText1_loc6`, `ObjectiveText1_loc7`, `ObjectiveText1_loc8`, `ObjectiveText2_loc1`, `ObjectiveText2_loc2`, `ObjectiveText2_loc3`, `ObjectiveText2_loc4`, `ObjectiveText2_loc5`, `ObjectiveText2_loc6`, `ObjectiveText2_loc7`, `ObjectiveText2_loc8`, `ObjectiveText3_loc1`, `ObjectiveText3_loc2`, `ObjectiveText3_loc3`, `ObjectiveText3_loc4`, `ObjectiveText3_loc5`, `ObjectiveText3_loc6`, `ObjectiveText3_loc7`, `ObjectiveText3_loc8`, `ObjectiveText4_loc1`, `ObjectiveText4_loc2`, `ObjectiveText4_loc3`, `ObjectiveText4_loc4`, `ObjectiveText4_loc5`, `ObjectiveText4_loc6`, `ObjectiveText4_loc7`, `ObjectiveText4_loc8`) VALUES (26034, '', 'Le destructeur du Crépuscule', 'Der Zwielichtzerstörer', '', '', 'El Destructor del Crepúsculo', 'El Destructor del Crepúsculo', 'Сумеречный разрушитель', '', 'Ce n’était pas une attaque téméraire, mais plutôt une frappe soigneusement orchestrée contre le cœur du Vol draconique rouge.$B$BZarithrian, sur ce piton, là-bas, supervise l’assaut, mais le véritable chef de cette force est un dragon du Crépuscule arrogant et puissant nommé Halion. On n''avait plus vu de rejeton adulte issu des expériences malsaines de Sinestra depuis Dargonax.$B$BTuez-le, $n, et quand l’invasion aura été complètement repoussée, allez raconter à Krasus tout ce que vous avez vu ici.', 'Dies war kein leichtfertiger Angriff, sondern vielmehr ein sorgsam inszenierter Schlag gegen das Herz des roten Drachenschwarms.$B$BZarithrian, der sich auf dem Felsvorsprung dort drüben befindet, überwacht den Angriff, doch ist der wahre Anführer ein dreister und mächtiger Zwielichtdrache namens Halion. Seit Dargonax ist kein ausgewachsenes Exemplar der Brut aus Sinestras verdorbenen Experimenten mehr gesichtet worden.$B$BTötet ihn, $n. Sobald es Euch gelungen ist, diese Invasion zurückzudrängen, meldet Ihr Euch bei Krasus und berichtet ihm, was Ihr hier gesehen habt.', '', '', 'No se trató de un ataque imprudente, sino de un ataque bien organizado contra el corazón del Vuelo Rojo.$B$BZarithrian, en la cima de ahí arriba, está vigilando el asalto, pero el verdadero líder de esta fuerza es un dragón Crepuscular valiente y poderoso llamado Halion. Desde Dargonax no se había visto a ningún engendro adulto de los experimentos retorcidos de Sinestra.$B$BMátalo, $n, y cuando se haya repelido totalmente la invasión, informa a Krasus sobre todo lo que has visto aquí.', 'No se trató de un ataque imprudente, sino de un ataque bien organizado contra el corazón del Vuelo Rojo.$B$BZarithrian, en la cima de ahí arriba, está vigilando el asalto, pero el verdadero líder de esta fuerza es un dragón Crepuscular valiente y poderoso llamado Halion. Desde Dargonax no se había visto a ningún engendro adulto de los experimentos retorcidos de Sinestra.$B$BMátalo, $n, y cuando se haya repelido totalmente la invasión, informa a Krasus sobre todo lo que has visto aquí.', 'Нет, это было не случайное нападение, а организованная атака на род красных драконов.$B$BЯ вижу Заритриана, наблюдающего за битвой с вершины холма, но истинный лидер захватчиков – могущественный сумеречный дракон Халион. В первый раз после появления Даргонакса мы столкнулись со взрослым отпрыском Зловестины.$B$BУбей его, $n, изгони захватчиков и сообщи Красу обо всем, что ты здесь $Gвидел:видела;.', '', 'Détruisez Halion et repoussez les envahisseurs qui ont investi le Sanctum Rubis.', 'Besiegt Halion und drängt die Invasion des Rubinsanktums zurück.', '', '', 'Derrota a Halion y repele la invasión del Sagrario Rubí.', 'Derrota a Halion y repele la invasión del Sagrario Rubí.', 'Победите Халиона и отразите нападение на Рубиновое святилище.', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'Faites votre rapport à Krasus, au sommet du temple du Repos du ver.', 'Erstattet Krasus auf dem Dach des Wyrmruhtempels Bericht.', '', '', 'Informa a: Krasus. Zona: Parte superior del Templo del Reposo del Dragón.', 'Informa a: Krasus. Zona: Parte superior del Templo del Reposo del Dragón.', 'Вернитесь к Красу на вершину храма Драконьего Покоя.', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''); + +SET NAMES 'latin1'; diff --git a/sql/updates/world/2014_04_23_04_world_locales_item.sql b/sql/updates/world/2014_04_23_04_world_locales_item.sql index 5b0e08d531b..f4b7831b8dd 100644 --- a/sql/updates/world/2014_04_23_04_world_locales_item.sql +++ b/sql/updates/world/2014_04_23_04_world_locales_item.sql @@ -1,3 +1,5 @@ +SET NAMES 'utf8'; + UPDATE `locales_item` SET `name_loc1`='마틴 퓨리', `name_loc4`='马丁之怒', `name_loc5`='馬汀烈怒', `name_loc7`='Martin Furia' WHERE `entry`=17; UPDATE `locales_item` SET `name_loc1`='낡은 쇼트소드', `name_loc4`='破损的短剑', `name_loc5`='破損的短劍', `name_loc7`='Espada corta desgastada' WHERE `entry`=25; UPDATE `locales_item` SET `name_loc1`='구부러진 지팡이', `name_loc4`='弯曲的法杖', `name_loc5`='彎曲法杖', `name_loc7`='Bastón doblado' WHERE `entry`=35; @@ -38109,3 +38111,5 @@ UPDATE `locales_item` SET `name_loc1`='꼬마 해체자', `name_loc4`='小拆', UPDATE `locales_item` SET `name_loc1`='머키무스의 작은 창', `name_loc4`='莫叽姆斯的小矛', `name_loc5`='魚人穆斯的小矛', `name_loc7`='Pequeña lanza de Murkimus', `description_loc1`='애완동물 친구를 소환하는 법을 배웁니다.', `description_loc4`='教你学会召唤这种小伙伴。', `description_loc5`='教你學會如何召喚這個夥伴。', `description_loc7`='Te enseña a invocar este compañero.' WHERE `entry`=54857; UPDATE `locales_item` SET `name_loc1`='X-53 관광 로켓', `name_loc4`='X-53型观光火箭', `name_loc5`='X-53型觀光火箭', `name_loc7`='Cohete de paseo X-53', `description_loc1`='탈것 소환하는 법을 배웁니다. 타기 숙련도와 위치에 따라 달라지는 탈것입니다.', `description_loc4`='教你学会召唤这种坐骑。这种坐骑的速度会根据你的骑术等级和所在区域改变。', `description_loc5`='教你學會如何召喚這個坐騎。此坐騎將隨著你的騎術技能和地點而改變。', `description_loc7`='Te enseña a invocar esta montura. Cambia según tu habilidad en equitación y la zona en la que estés.' WHERE `entry`=54860; UPDATE `locales_item` SET `name_loc1`='꼬마 토르', `name_loc4`='迷你雷神', `name_loc5`='迷你雷神', `name_loc7`='Mini thor', `description_loc1`='꼬마 토르 소환하는 법을 배웁니다.', `description_loc4`='教会你如何召唤迷你雷神。', `description_loc5`='教你學會如何召喚迷你雷神。', `description_loc7`='Te enseña a invocar un mini thor.' WHERE `entry`=56806; + +SET NAMES 'latin1'; diff --git a/sql/updates/world/2014_04_24_00_world_locales_broadcast_text.sql b/sql/updates/world/2014_04_24_00_world_locales_broadcast_text.sql index abb838cd62c..92c0e75fd8a 100644 --- a/sql/updates/world/2014_04_24_00_world_locales_broadcast_text.sql +++ b/sql/updates/world/2014_04_24_00_world_locales_broadcast_text.sql @@ -1,3 +1,5 @@ +SET NAMES 'utf8'; + UPDATE `locales_broadcast_text` SET `MaleText_loc1`='제발, 제발 좀 도와주시오! 난 여기 갇혀 있소!', `MaleText_loc4`='救命啊!我动不了了!', `MaleText_loc5`='救命啊!我動不了了!', `MaleText_loc7`='¡Socorro! ¡Socorro! ¡Soy víctima de represión!' WHERE `ID`=1; UPDATE `locales_broadcast_text` SET `MaleText_loc1`='중대.. 제자리에 서! ... 정렬!', `MaleText_loc4`='全队……立正!……集合!', `MaleText_loc5`='全體...立正!...集合!', `MaleText_loc7`='Compañía... ¡ALTO! ¡Formen FILAS!' WHERE `ID`=3; UPDATE `locales_broadcast_text` SET `MaleText_loc1`='앞으로... 가!', `MaleText_loc4`='前进……前进!', `MaleText_loc5`='起步...走!!', `MaleText_loc7`='Adelante... ¡¡MARCHEN!!' WHERE `ID`=4; @@ -78650,3 +78652,5 @@ UPDATE `locales_broadcast_text` SET `MaleText_loc1`='볼진은 정말 보통이 UPDATE `locales_broadcast_text` SET `MaleText_loc1`='|TInterface\\Icons\\inv_misc_bomb_05:20|t |cFFFF0000|Hspell:145996|h[폭파 준비 완료]|h|r! |cFFFF0000|Hspell:146364|h[폭탄 투척]|h|r으로 폭탄을 던지십시오!', `MaleText_loc4`='|TInterface\\Icons\\inv_misc_bomb_05:20|t你身后被|cFFFF0000|Hspell:145996|h[设置炸弹]|h|r了!快使用|cFFFF0000|Hspell:146364|h[投掷炸弹]|h|r扔掉它们!', `MaleText_loc5`='|TInterface\\Icons\\inv_misc_bomb_05:20|t你獲得|cFFFF0000|Hspell:145996|h[引爆]|h|r!使用|cFFFF0000|Hspell:146364|h[投擲炸彈]|h|r來投擲炸彈!', `MaleText_loc7`='|TInterfaceIconsinv_misc_bomb_05:20|tTienes |cFFFF0000|Hspell:145996|h[Listo para explotar]|h|r! Utiliza |cFFFF0000|Hspell:146364|h[Lanzar bomba]|h|r para lanzarlas!' WHERE `ID`=77369; UPDATE `locales_broadcast_text` SET `MaleText_loc1`='헬스크림의 최후로군.$b$b<경계하는 눈길로 당신을 바라보는 볼진>$b$b$r|1이여;여;, 앞으로는 어쩔 셈인가?', `MaleText_loc4`='地狱咆哮已经完蛋了。$b$b<沃金警惕地看着你。>$b$b接下来呢,$r?', `MaleText_loc5`='這就是地獄吼最終的下場。$b$b<沃金小心翼翼地看著你。>$b$b下一步是什麼,$r?', `MaleText_loc7`='Eh''te es el final de Grito Infernal.$b$b<Vol''jin te mira con cautela.>$b$b¿Y ahora qué, $r?' WHERE `ID`=77371; UPDATE `locales_broadcast_text` SET `MaleText_loc1`='|TInterface\\Icons\\achievement_arena_2v2_5:20|t$n|1이;가; 전투를 시작하려고 합니다. 전투 시작에 필요한 추가 인원: $8589w', `MaleText_loc4`='|TInterface\\Icons\\achievement_arena_2v2_5:20|t$n已同意开始战斗。另外还需要$8589w名玩家才可开始。', `MaleText_loc5`='|TInterface\\Icons\\achievement_arena_2v2_5:20|t$n同意進行戰鬥。另外還需要$8589w名玩家才可開始。', `MaleText_loc7`='|TInterfaceIconsachievement_arena_2v2_5:20|t$n ha aceptado el encuentro. Jugadores adicionales necesarios para comenzar: $8589w.' WHERE `ID`=77865; + +SET NAMES 'latin1'; diff --git a/sql/updates/world/2014_04_24_01_world_locales_gameobject.sql b/sql/updates/world/2014_04_24_01_world_locales_gameobject.sql index 3ab380a7a9e..b929eb0eed5 100644 --- a/sql/updates/world/2014_04_24_01_world_locales_gameobject.sql +++ b/sql/updates/world/2014_04_24_01_world_locales_gameobject.sql @@ -1,3 +1,5 @@ +SET NAMES 'utf8'; + UPDATE `locales_gameobject` SET `name_loc1`='오래된 사자상', `name_loc4`='陈旧的石狮子', `name_loc5`='老舊獅子雕像', `name_loc7`='Estatua de león antigua' WHERE `entry`=31; UPDATE `locales_gameobject` SET `name_loc1`='가라앉은 상자', `name_loc4`='沉没的箱子', `name_loc5`='沉沒的箱子', `name_loc7`='Cofre sumergido' WHERE `entry`=32; UPDATE `locales_gameobject` SET `name_loc1`='잠긴 궤짝', `name_loc4`='锁住的箱子', `name_loc5`='鎖住的箱子', `name_loc7`='Cofre cerrado' WHERE `entry`=33; @@ -19666,3 +19668,5 @@ UPDATE `locales_gameobject` SET `name_loc1`='불타는 나무', `name_loc4`='燃 UPDATE `locales_gameobject` SET `name_loc1`='붉은 용 알 (대형)', `name_loc4`='Red Dragon Egg (Large)', `name_loc5`='紅龍蛋(大)', `name_loc7`='Huevo de dragón Rojo (grande)' WHERE `entry`=203079; UPDATE `locales_gameobject` SET `name_loc1`='깨진 붉은용 알 (대형)', `name_loc4`='Broken Red Dragon Egg (Large)', `name_loc5`='破掉的紅龍蛋(大)', `name_loc7`='Huevo de dragón Rojo roto (grande)' WHERE `entry`=203080; UPDATE `locales_gameobject` SET `name_loc1`='할리온 황혼의 고리', `name_loc4`='海里昂暮光之环', `name_loc5`='海萊恩暮光環', `name_loc7`='Anillo Crepuscular de Halion' WHERE `entry`=203624; + +SET NAMES 'latin1'; diff --git a/sql/updates/world/2014_04_26_01_world_locales_creature.sql b/sql/updates/world/2014_04_26_01_world_locales_creature.sql index c49e37f0bf3..4e718cd8ed3 100644 --- a/sql/updates/world/2014_04_26_01_world_locales_creature.sql +++ b/sql/updates/world/2014_04_26_01_world_locales_creature.sql @@ -1,3 +1,5 @@ +SET NAMES 'utf8'; + UPDATE `locales_creature` SET `name_loc1`='굶주린 시체', `name_loc4`='食腐者', `name_loc5`='食腐者', `name_loc7`='Comecarnes' WHERE `entry`=3; UPDATE `locales_creature` SET `name_loc1`='코볼트 졸개', `name_loc4`='狗头人歹徒', `name_loc5`='狗頭人惡黨', `name_loc7`='Alimaña kóbold' WHERE `entry`=6; UPDATE `locales_creature` SET `name_loc1`='퀘스트기버 베니', `name_loc4`='Benny Questgiver', `name_loc5`='本尼任務給予者', `name_loc7`='Asignador Benny', `subname_loc1`='시험용', `subname_loc4`='NPC', `subname_loc5`='測試', `subname_loc7`='PNJ' WHERE `entry`=19; @@ -27245,3 +27247,5 @@ UPDATE `locales_creature` SET `name_loc1`='루비 비룡', `name_loc4`='红玉 UPDATE `locales_creature` SET `name_loc1`='루비 용', `name_loc4`='红玉巨龙', `name_loc5`='晶紅龍', `name_loc7`='Dragón rubí' WHERE `entry`=40870; UPDATE `locales_creature` SET `name_loc1`='[DND] 제어기', `name_loc4`='[DND] Controller', `name_loc5`='[DND]控制器', `name_loc7`='[DND] Controller' WHERE `entry`=41839; UPDATE `locales_creature` SET `name_loc1`='꼬마 토르', `name_loc4`='迷你雷神', `name_loc5`='迷你雷神', `name_loc7`='Mini thor', `subname_loc1`='파괴자', `subname_loc4`='无坚不摧', `subname_loc5`='毀滅者', `subname_loc7`='El Destructor' WHERE `entry`=42078; + +SET NAMES 'latin1'; diff --git a/sql/updates/world/2014_06_20_01_world_spell_dbc.sql b/sql/updates/world/2014_06_20_01_world_creature_text.sql index 5f11bd036db..5f11bd036db 100644 --- a/sql/updates/world/2014_06_20_01_world_spell_dbc.sql +++ b/sql/updates/world/2014_06_20_01_world_creature_text.sql diff --git a/sql/updates/world/2014_06_22_00_world_locales_creature.sql b/sql/updates/world/2014_06_22_00_world_locales_creature.sql index d24a4dd1f33..5dc00dfa692 100644 --- a/sql/updates/world/2014_06_22_00_world_locales_creature.sql +++ b/sql/updates/world/2014_06_22_00_world_locales_creature.sql @@ -1,3 +1,5 @@ +SET NAMES 'utf8'; + -- Male frFR UPDATE `locales_creature` SET `name_loc2`='Contrebandier défias' WHERE `entry`=95; UPDATE `locales_creature` SET `name_loc2`='Eclaireur défias' WHERE `entry`=121; @@ -3774,3 +3776,5 @@ UPDATE `locales_creature` SET `name_loc7`='Espía creciente de la muerte captura -- ruRU UPDATE `locales_creature` SET `name_loc8`='Жрец Алого ордена' WHERE `entry`=10608; UPDATE `locales_creature` SET `name_loc8`='Разведчик Похитителей Солнца' WHERE `entry`=30233; + +SET NAMES 'latin1'; diff --git a/sql/updates/world/2014_06_29_02_world_misc.sql b/sql/updates/world/2014_06_29_02_world_misc.sql new file mode 100644 index 00000000000..dd99a1f4bed --- /dev/null +++ b/sql/updates/world/2014_06_29_02_world_misc.sql @@ -0,0 +1,27 @@ +-- +SET NAMES 'utf8'; +DELETE FROM `trinity_string` WHERE entry IN (453, 548, 549, 550, 714, 716, 749, 752, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 871, 879); +INSERT INTO `trinity_string` (entry, content_default) VALUES +(453,'│Player %s %s (guid: %u)'), +(548,'│ GM Mode active, Phase: -1'), +(549,'├─ Banned: (Type: %s, Reason: %s, Time: %s, By: %s)'), +(550,'├─ Muted: (Reason: %s, Time: %s, By: %s)'), +(714,'│ Account: %s (ID: %u), GMLevel: %u'), +(716,'│ Last Login: %s (Failed Logins: %u)'), +(749,'│ OS: %s - Latency: %u ms'), +(752,'│ Last IP: %s (Locked: %s)'), +(843,'│ Level: %u (%u/%u XP (%u XP left))'), +(844,'│ Race: %s %s, %s'), +(845,'│ Alive ?: %s'), +(846,'│ Phase: %u'), +(847,'│ Money: %ug%us%uc'), +(848,'│ Map: %s, Area: %s, Zone: %s'), +(849,'│ Guild: %s (ID: %u)'), +(850,'├─ Rank: %s'), +(851,'├─ Note: %s'), +(852,'├─ O. Note: %s'), +(853,'│ Played time: %s'), +(854,'│ Mails: %d Read/%u Total'), +(871,'│ Level: %u'), +(879,'└ Registration Email: %s - Email: %s'); +SET NAMES 'latin1'; diff --git a/sql/updates/world/2014_07_01_00_world_misc.sql b/sql/updates/world/2014_07_01_00_world_misc.sql new file mode 100644 index 00000000000..ae9ffafe986 --- /dev/null +++ b/sql/updates/world/2014_07_01_00_world_misc.sql @@ -0,0 +1,75 @@ +-- +SET @Guid := 14218; + +UPDATE `gameobject_template` SET `AIName`='SmartGameObjectAI', `ScriptName`='' WHERE `entry`IN(181045,181051); +DELETE FROM `smart_scripts` WHERE `source_type`=1 AND `entryorguid`IN(181045,181051); + +DELETE FROM `gameobject` WHERE `id` IN(181096,181048); +INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES +(@Guid,181096,429,1,1,263.38,-452.69,-119.96,0,0,0,0,0,180,0,1), +(@Guid+1,181096,229,1,1,-23.97,-451.98,-18.64,0,0,0,0,0,180,0,1), +(@Guid+2,181096,289,1,1,-3.82,141.88,83.9,0,0,0,0,0,180,0,1), +(@Guid+3,181096,229,1,1,25.92,-537.7,110.93,0,0,0,0,0,180,0,1), +(@Guid+4,181096,329,1,1,3423.47,-3055.73,136.499,6.00568,0,0,0.138306,-0.990389,300,0,1), +(@Guid+5, 181048, 329, 1, 1, 3423.47, -3055.73, 136.499, 6.00568, 0, 0, 0.138306, -0.990389, 300, 0, 1); + +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(181045, 1, 0 ,0, 11, 0, 100, 0, 0, 0, 0,0,45,1,1,0,0,0,0,10,45841,16044,0,0,0,0,0, 'Brazier of Beckoning - On Spawn - Set Data Mor Grayhoof Trigger'), +(181045, 1, 1 ,0, 11, 0, 100, 0, 0, 0, 0,0,45,1,1,0,0,0,0,10,48937,16047,0,0,0,0,0, 'Brazier of Beckoning - On Spawn - Set Data Kormok Trigger'), +(181045, 1, 2 ,0, 11, 0, 100, 0, 0, 0, 0,0,45,1,1,0,0,0,0,10,84386,16045,0,0,0,0,0, 'Brazier of Beckoning - On Spawn - Set Data Isalien Trigger'), +(181045, 1, 3 ,0, 11, 0, 100, 0, 0, 0, 0,0,45,1,1,0,0,0,0,10,53937,16046,0,0,0,0,0, 'Brazier of Beckoning - On Spawn - Set Data Jarien and Sothos Trigger'), +(181045, 1, 4 ,0, 11, 0, 100, 0, 0, 0, 0,0,45,1,1,0,0,0,0,10,137927,16048,0,0,0,0,0, 'Brazier of Beckoning - On Spawn - Set Data Lord Valthalak Trigger'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry`=181045; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(22, 1, 181045, 1, 0, 23, 1, 1583, 0, 0, 0, 0, 0, '', 'Brazier of Beckoning only run SAI in Blackrock Spire'), +(22, 2, 181045, 1, 0, 23, 1, 2057, 0, 0, 0, 0, 0, '', 'Brazier of Beckoning only run SAI in Scholomance'), +(22, 3, 181045, 1, 0, 23, 1, 2557, 0, 0, 0, 0, 0, '', 'Brazier of Beckoning only run SAI in Dire Maul'), +(22, 4, 181045, 1, 0, 23, 1, 2017, 0, 0, 0, 0, 0, '', 'Brazier of Beckoning only run SAI in Stratholme'), +(22, 5, 181045, 1, 0, 23, 1, 1583, 0, 0, 0, 0, 0, '', 'Brazier of Beckoning only run SAI in Blackrock Spire'); + +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(181051, 1, 0 ,0, 11, 0, 100, 0, 0, 0, 0,0,45,1,1,0,0,0,0,10,45841,16044,0,0,0,0,0, 'Brazier of Invocation - On Spawn - Set Data Mor Grayhoof Trigger'), +(181051, 1, 1 ,0, 11, 0, 100, 0, 0, 0, 0,0,45,1,1,0,0,0,0,10,48937,16047,0,0,0,0,0, 'Brazier of Invocation - On Spawn - Set Data Kormok Trigger'), +(181051, 1, 2 ,0, 11, 0, 100, 0, 0, 0, 0,0,45,1,1,0,0,0,0,10,84386,16045,0,0,0,0,0, 'Brazier of Invocation - On Spawn - Set Data Isalien Trigger'), +(181051, 1, 3 ,0, 11, 0, 100, 0, 0, 0, 0,0,45,1,1,0,0,0,0,10,53937,16046,0,0,0,0,0, 'Brazier of Invocation - On Spawn - Set Data Jarien and Sothos Trigger'), +(181051, 1, 4 ,0, 11, 0, 100, 0, 0, 0, 0,0,45,1,1,0,0,0,0,10,137927,16048,0,0,0,0,0, 'Brazier of Invocation - On Spawn - Set Data Lord Valthalak Trigger'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry`=181051; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(22, 1, 181051, 1, 0, 23, 1, 1583, 0, 0, 0, 0, 0, '', 'Brazier of Invocation only run SAI in Blackrock Spire'), +(22, 2, 181051, 1, 0, 23, 1, 2057, 0, 0, 0, 0, 0, '', 'Brazier of Invocation only run SAI in Scholomance'), +(22, 3, 181051, 1, 0, 23, 1, 2557, 0, 0, 0, 0, 0, '', 'Brazier of Invocation only run SAI in Dire Maul'), +(22, 4, 181051, 1, 0, 23, 1, 2017, 0, 0, 0, 0, 0, '', 'Brazier of Invocation only run SAI in Stratholme'), +(22, 5, 181051, 1, 0, 23, 1, 1583, 0, 0, 0, 0, 0, '', 'Brazier of Invocation only run SAI in Blackrock Spire'); + +UPDATE `creature_template` SET `AIName`= 'SmartAI' WHERE `entry`=16044; + +DELETE FROM `smart_scripts` WHERE `entryorguid` =16044; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(16044, 0, 0, 0, 38, 0, 100, 1, 1, 1, 0, 0, 12, 16080, 8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Mor Grayhoof Trigger - On Data Set - Spawn Mor Grayhoof'); + +UPDATE `creature_template` SET `AIName`= 'SmartAI' WHERE `entry`=16045; + +DELETE FROM `smart_scripts` WHERE `entryorguid` =16045; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(16045, 0, 0, 0, 38, 0, 100, 1, 1, 1, 0, 0, 12, 16097, 8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Isalien Trigger - On Data Set - Spawn Isalien'); + +UPDATE `creature_template` SET `AIName`= 'SmartAI' WHERE `entry`=16046; + +DELETE FROM `smart_scripts` WHERE `entryorguid` =16046; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(16046, 0, 0, 1, 38, 0, 100, 1, 1, 1, 0, 0, 12, 16101, 8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Jarien and Sothos Trigger - On Data Set - Spawn Jarien'), +(16046, 0, 1, 0, 61, 0, 100, 1, 1, 1, 0, 0, 12, 16102, 8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Jarien and Sothos Trigger - Linked with Previous Event - Spawn Sothos'); + +UPDATE `creature_template` SET `AIName`= 'SmartAI' WHERE `entry`=16047; + +DELETE FROM `smart_scripts` WHERE `entryorguid` =16047; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(16047, 0, 0, 0, 38, 0, 100, 1, 1, 1, 0, 0, 12, 16118, 8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Kormok Trigger - On Data Set - Spawn Kormok'); + +UPDATE `creature_template` SET `AIName`= 'SmartAI' WHERE `entry`=16048; + +DELETE FROM `smart_scripts` WHERE `entryorguid` =16048; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(16048, 0, 0, 0, 38, 0, 100, 1, 1, 1, 0, 0, 12, 16042, 8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lord Valthalak Trigger - On Data Set - Spawn Lord Valthalak'); diff --git a/sql/updates/world/2014_07_01_01_world_misc.sql b/sql/updates/world/2014_07_01_01_world_misc.sql new file mode 100644 index 00000000000..9806235da58 --- /dev/null +++ b/sql/updates/world/2014_07_01_01_world_misc.sql @@ -0,0 +1,7 @@ +-- +UPDATE `smart_scripts` SET `action_type`=11, `action_param1`=48830 WHERE `entryorguid`=27225 AND `source_type`=0 AND `id`=0 AND `link`=1; +UPDATE `smart_scripts` SET `action_type`=11, `action_param1`=48829 WHERE `entryorguid`=27226 AND `source_type`=0 AND `id`=0 AND `link`=1; +UPDATE `smart_scripts` SET `action_type`=11, `action_param1`=48832 WHERE `entryorguid`=27229 AND `source_type`=0 AND `id`=0 AND `link`=1; +UPDATE `smart_scripts` SET `action_type`=11, `action_param1`=48831 WHERE `entryorguid`=27224 AND `source_type`=0 AND `id`=0 AND `link`=1; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceGroup`=1 AND `SourceEntry`=49734 AND `SourceId`=0 AND `ElseGroup`=0 AND `ConditionTypeOrReference`=31 AND `ConditionTarget`=0 AND `ConditionValue1`=3 AND `ConditionValue2`=27851 AND `ConditionValue3`=0; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (69548,69542,69544,69543); diff --git a/sql/updates/world/2014_07_01_02_world_playercreateinfo_skills.sql b/sql/updates/world/2014_07_01_02_world_playercreateinfo_skills.sql new file mode 100644 index 00000000000..ad85276527b --- /dev/null +++ b/sql/updates/world/2014_07_01_02_world_playercreateinfo_skills.sql @@ -0,0 +1,90 @@ +DROP TABLE IF EXISTS `playercreateinfo_spell`; + +DROP TABLE IF EXISTS `playercreateinfo_skills`; +CREATE TABLE `playercreateinfo_skills` ( + `raceMask` int(10) unsigned NOT NULL, + `classMask` int(10) unsigned NOT NULL, + `skill` smallint(5) unsigned NOT NULL, + `rank` smallint(5) unsigned NOT NULL DEFAULT '0', + `comment` varchar(255) DEFAULT NULL, + PRIMARY KEY (`raceMask`,`classMask`,`skill`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT INTO `playercreateinfo_skills` VALUES +(0,0,95,0,'Defense'), +(0,0,162,0,'Unarmed'), +(0,0,183,0,'GENERIC (DND)'), +(0,0,415,0,'Cloth'), +(0,0,777,0,'Mounts'), +(0,0,778,0,'Companion Pets'), +(0,1,26,0,'Warrior - Arms'), +(0,1,256,0,'Warrior - Fury'), +(0,1,257,0,'Warrior - Protection'), +(0,2,184,0,'Paladin - Retribution'), +(0,2,267,0,'Paladin - Protection'), +(0,2,594,0,'Paladin - Holy'), +(0,4,50,0,'Hunter - Beast Mastery'), +(0,4,51,0,'Hunter - Survival'), +(0,4,163,0,'Hunter - Marksmanship'), +(0,8,38,0,'Rogue - Combat'), +(0,8,39,0,'Rogue - Subtlety'), +(0,8,176,0,'Thrown'), +(0,8,253,0,'Rogue - Assassination'), +(0,16,56,0,'Priest - Holy'), +(0,16,78,0,'Priest - Shadow'), +(0,16,613,0,'Priest - Discipline'), +(0,32,129,4,'Death Knight - First Aid'), +(0,32,229,0,'Polearms'), +(0,32,293,0,'Plate'), +(0,32,762,0,'Death Knight - Riding'), +(0,32,770,0,'Death Knight - Blood'), +(0,32,771,0,'Death Knight - Frost'), +(0,32,772,0,'Death Knight - Unholy'), +(0,35,55,0,'Two-Handed Swords'), +(0,35,413,0,'Mail'), +(0,37,44,0,'Axes'), +(0,37,172,0,'Two-Handed Axes'), +(0,39,43,0,'Swords'), +(0,40,118,0,'Dual Wield'), +(0,64,373,0,'Shaman - Enhancement'), +(0,64,374,0,'Shaman - Restoration'), +(0,64,375,0,'Shaman - Elemental'), +(0,67,433,0,'Shield'), +(0,128,6,0,'Mage - Frost'), +(0,128,8,0,'Mage - Fire'), +(0,128,237,0,'Mage - Arcane'), +(0,256,354,0,'Warlock - Demonology'), +(0,256,355,0,'Warlock - Affliction'), +(0,256,593,0,'Warlock - Destruction'), +(0,400,228,0,'Wands'), +(0,1024,134,0,'Druid - Feral'), +(0,1024,573,0,'Druid - Restoration'), +(0,1024,574,0,'Druid - Balance'), +(0,1107,54,0,'Maces'), +(0,1135,414,0,'Leather'), +(0,1488,136,0,'Staves'), +(1,0,754,0,'Human - Racial'), +(2,0,125,0,'Orc - Racial'), +(4,0,101,0,'Dwarf - Racial'), +(4,0,111,0,'Language: Dwarven'), +(8,0,126,0,'Night Elf - Racial'), +(8,0,137,0,'Language: Thalassian'), +(16,0,220,0,'Undead - Racial'), +(16,0,673,0,'Language: Forsaken'), +(32,0,113,0,'Language: Darnassian'), +(32,0,124,0,'Tauren - Racial'), +(36,4,46,0,'Guns'), +(64,0,313,0,'Language: Gnomish'), +(64,0,753,0,'Gnome - Racial'), +(128,0,315,0,'Language: Troll'), +(128,0,733,0,'Troll - Racial'), +(512,0,115,0,'Language: Taurahe'), +(512,0,756,0,'Blood Elf - Racial'), +(650,4,45,0,'Bows'), +(690,0,109,0,'Language: Orcish'), +(735,1293,173,0,'Daggers'), +(1024,0,759,0,'Language: Draenei'), +(1024,0,760,0,'Draenei - Racial'), +(1024,4,226,0,'Crossbows'), +(1061,3,160,0,'Two-Handed Maces'), +(1101,0,98,0,'Language: Common'); diff --git a/sql/updates/world/2014_07_02_00_world_misc.sql b/sql/updates/world/2014_07_02_00_world_misc.sql new file mode 100644 index 00000000000..03c2df0347d --- /dev/null +++ b/sql/updates/world/2014_07_02_00_world_misc.sql @@ -0,0 +1,5 @@ +-- +UPDATE `smart_scripts` SET `link`=0 WHERE `entryorguid`=32790 AND `source_type`=0 AND `id`=1 AND `link`=2; +UPDATE `smart_scripts` SET `link`=0 WHERE `entryorguid`=30630 AND `source_type`=0 AND `id`=0 AND `link`=1; +-- The below is also related to same quest for moonglade portal and return from moonglade portal same quest, these gained trigger flags resulting in the portals becoming non clickable. +UPDATE`creature_template` SET `flags_extra`=0 WHERE `entry`IN(32790,32788); diff --git a/sql/updates/world/2014_07_02_01_world_misc.sql b/sql/updates/world/2014_07_02_01_world_misc.sql new file mode 100644 index 00000000000..ad5679406d3 --- /dev/null +++ b/sql/updates/world/2014_07_02_01_world_misc.sql @@ -0,0 +1,5 @@ +UPDATE `smart_scripts` SET `event_flags`=0,`event_type`=38, `event_param1`=1, `event_param2`=1, `target_param2`=200, `comment`='Cosmetic Trigger - LAB - On Data Set - Cast \'Cosmetic Chains\'' WHERE `entryorguid`IN(-103996,-103997,-103998,-103999,-104000,-104001,-104002,-104003,-104004,-104005,-104006,-104007,-104008)AND `source_type`=0 AND `id`=0 AND `link`=0; + +DELETE FROM `smart_scripts` WHERE `entryorguid`=29352 AND `id`=1; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(29352, 0, 1, 0, 25, 0, 100, 0, 0, 0, 0, 0, 45, 1, 1, 0, 0, 0, 0, 11, 24921, 200, 0, 0, 0, 0, 0, 'Kirgaraak - On Respawn - Set Data Cosmetic Trigger'); diff --git a/sql/updates/world/2014_07_02_02_world_misc.sql b/sql/updates/world/2014_07_02_02_world_misc.sql new file mode 100644 index 00000000000..5226606dc7c --- /dev/null +++ b/sql/updates/world/2014_07_02_02_world_misc.sql @@ -0,0 +1,2 @@ +-- +UPDATE `item_template` SET `flagsCustom`=1 WHERE `entry` IN(34000,34001,20562,20392,20565,20563,20569,20571,20567,20574,34002,34003,20561,20391,20566,20564,20570,20572,20568,20573,37585,37583,37582,37584,33226,44835, 44839, 44853,44840,46797,44836,46784,46796,44838,44855,46793,44854.44844,44812,46888,46887,44837,34412,34191,21711,21812,22261,18598,18597,31180,31181,46297,46396,34494,34684); diff --git a/sql/updates/world/2014_07_02_03_world_npc_vendor.sql b/sql/updates/world/2014_07_02_03_world_npc_vendor.sql new file mode 100644 index 00000000000..40003053b0d --- /dev/null +++ b/sql/updates/world/2014_07_02_03_world_npc_vendor.sql @@ -0,0 +1,2 @@ +-- +INSERT INTO `npc_vendor` (`entry`, `item`) VALUES (30431, 50369); diff --git a/sql/updates/world/2014_07_03_00_world_misc.sql b/sql/updates/world/2014_07_03_00_world_misc.sql new file mode 100644 index 00000000000..507b306342f --- /dev/null +++ b/sql/updates/world/2014_07_03_00_world_misc.sql @@ -0,0 +1,2 @@ +UPDATE `item_template` SET `flagsCustom`=0 WHERE `entry` IN(31180,31181,46297); +UPDATE `item_template` SET `flagsCustom`=1 WHERE `entry` IN(31880,31881,46397); diff --git a/sql/updates/world/2014_07_03_01_world_spell_proc_event.sql b/sql/updates/world/2014_07_03_01_world_spell_proc_event.sql new file mode 100644 index 00000000000..3ae38f82698 --- /dev/null +++ b/sql/updates/world/2014_07_03_01_world_spell_proc_event.sql @@ -0,0 +1,7 @@ +DELETE FROM `spell_linked_spell` WHERE `spell_effect`=71757; + +DELETE FROM `spell_proc_event` WHERE `entry`=71761; +INSERT INTO `spell_proc_event` (`entry`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`procFlags`,`procEx`,`ppmRate`,`CustomChance`,`Cooldown`) VALUES +(71761, 0, 3, 0, 0x100000, 0, 0, 0x100, 0, 0, 0); -- Deep Freeze + +UPDATE `spell_proc_event` SET `procEx`=`procEx`|0x100 WHERE `entry`=74396; diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index e9cc810e11a..2ba5a236f95 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -393,8 +393,8 @@ enum MapFlags enum AbilytyLearnType { - ABILITY_LEARNED_ON_GET_PROFESSION_SKILL = 1, - ABILITY_LEARNED_ON_GET_RACE_OR_CLASS_SKILL = 2 + SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE = 1, // Spell state will update depending on skill value + SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN = 2 // Spell will be learned/removed together with entire skill }; enum ItemEnchantmentType @@ -439,7 +439,7 @@ enum SkillRaceClassInfoFlags SKILL_FLAG_UNLEARNABLE = 0x20, // Skill can be unlearned SKILL_FLAG_INCLUDE_IN_SORT = 0x80, // Spells belonging to a skill with this flag will additionally compare skill ids when sorting spellbook in client SKILL_FLAG_NOT_TRAINABLE = 0x100, - SKILL_FLAG_MONO_VALUE = 0x400 // Skill always has value 1 + SKILL_FLAG_MONO_VALUE = 0x400 // Skill always has value 1 - clientside display flag, real value can be different }; enum SpellCategoryFlags diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp index a16577cdf0e..09efd81a51b 100644 --- a/src/server/game/DataStores/DBCStores.cpp +++ b/src/server/game/DataStores/DBCStores.cpp @@ -601,7 +601,7 @@ void LoadDBCStores(const std::string& dataPath) if (skillLine->skillId != cFamily->skillLine[0] && skillLine->skillId != cFamily->skillLine[1]) continue; - if (skillLine->learnOnGetSkill != ABILITY_LEARNED_ON_GET_RACE_OR_CLASS_SKILL) + if (skillLine->AutolearnType != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN) continue; sPetFamilySpellsStore[i].insert(spellInfo->Id); diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index c4c078718f1..26a35457bc3 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -1704,7 +1704,7 @@ struct SkillLineAbilityEntry //uint32 classmaskNot; // 6 m_excludeClass uint32 req_skill_value; // 7 m_minSkillLineRank uint32 forward_spellid; // 8 m_supercededBySpell - uint32 learnOnGetSkill; // 9 m_acquireMethod + uint32 AutolearnType; // 9 m_acquireMethod uint32 max_value; // 10 m_trivialSkillLineRankHigh uint32 min_value; // 11 m_trivialSkillLineRankLow uint32 character_points[2]; // 12-13 m_characterPoints diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index cb0b6dee782..ab9d7c40f7d 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -1146,7 +1146,8 @@ bool Player::Create(uint32 guidlow, CharacterCreateInfo* createInfo) } // original spells - learnDefaultSpells(); + LearnDefaultSkills(); + LearnCustomSpells(); // original action bar for (PlayerCreateInfoActions::const_iterator action_itr = info->action.begin(); action_itr != info->action.end(); ++action_itr) @@ -3889,39 +3890,6 @@ bool Player::addSpell(uint32 spellId, bool active, bool learning, bool dependent SetSkill(spellLearnSkill->skill, spellLearnSkill->step, skill_value, skill_max_value); } - else - { - // not ranked skills - for (SkillLineAbilityMap::const_iterator _spell_idx = skill_bounds.first; _spell_idx != skill_bounds.second; ++_spell_idx) - { - SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(_spell_idx->second->skillId); - if (!pSkill) - continue; - - if (HasSkill(pSkill->id)) - continue; - - if (_spell_idx->second->learnOnGetSkill == ABILITY_LEARNED_ON_GET_RACE_OR_CLASS_SKILL || - // lockpicking/runeforging special case, not have ABILITY_LEARNED_ON_GET_RACE_OR_CLASS_SKILL - ((pSkill->id == SKILL_LOCKPICKING || pSkill->id == SKILL_RUNEFORGING) && _spell_idx->second->max_value == 0)) - { - switch (GetSkillRangeType(pSkill, _spell_idx->second->racemask != 0)) - { - case SKILL_RANGE_LANGUAGE: - SetSkill(pSkill->id, GetSkillStep(pSkill->id), 300, 300); - break; - case SKILL_RANGE_LEVEL: - SetSkill(pSkill->id, GetSkillStep(pSkill->id), 1, GetMaxSkillValueForLevel()); - break; - case SKILL_RANGE_MONO: - SetSkill(pSkill->id, GetSkillStep(pSkill->id), 1, 1); - break; - default: - break; - } - } - } - } // learn dependent spells SpellLearnSpellMapBounds spell_bounds = sSpellMgr->GetSpellLearnSpellMapBounds(spellId); @@ -4150,31 +4118,6 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool learn_low_rank) } } } - else - { - // not ranked skills - SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spell_id); - - for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx) - { - SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(_spell_idx->second->skillId); - if (!pSkill) - continue; - - if ((_spell_idx->second->learnOnGetSkill == ABILITY_LEARNED_ON_GET_RACE_OR_CLASS_SKILL && - pSkill->categoryId != SKILL_CATEGORY_CLASS) ||// not unlearn class skills (spellbook/talent pages) - // lockpicking/runeforging special case, not have ABILITY_LEARNED_ON_GET_RACE_OR_CLASS_SKILL - ((pSkill->id == SKILL_LOCKPICKING || pSkill->id == SKILL_RUNEFORGING) && _spell_idx->second->max_value == 0)) - { - // not reset skills for professions and racial abilities - if ((pSkill->categoryId == SKILL_CATEGORY_SECONDARY || pSkill->categoryId == SKILL_CATEGORY_PROFESSION) && - (IsProfessionSkill(pSkill->id) || _spell_idx->second->racemask != 0)) - continue; - - SetSkill(pSkill->id, GetSkillStep(pSkill->id), 0, 0); - } - } - } // remove dependent spells SpellLearnSpellMapBounds spell_bounds = sSpellMgr->GetSpellLearnSpellMapBounds(spell_id); @@ -6058,9 +6001,6 @@ bool Player::UpdateSkill(uint32 skill_id, uint32 step) if (!skill_id) return false; - if (skill_id == SKILL_FIST_WEAPONS) - skill_id = SKILL_UNARMED; - SkillStatusMap::iterator itr = mSkillStatus.find(skill_id); if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED) return false; @@ -6076,7 +6016,7 @@ bool Player::UpdateSkill(uint32 skill_id, uint32 step) if (value < max) { - uint16 new_value = value + step; + uint32 new_value = value + step; if (new_value > max) new_value = max; @@ -6261,14 +6201,14 @@ void Player::UpdateSkillsForLevel() continue; uint32 pskill = itr->first; - SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(pskill); - if (!pSkill) + SkillRaceClassInfoEntry const* rcEntry = GetSkillRaceClassInfo(pskill, getRace(), getClass()); + if (!rcEntry) continue; - if (GetSkillRangeType(pSkill, false) != SKILL_RANGE_LEVEL) + if (GetSkillRangeType(rcEntry) != SKILL_RANGE_LEVEL) continue; - if (IsWeaponSkill(pSkill->id)) + if (IsWeaponSkill(rcEntry->SkillId)) continue; uint16 field = itr->second.pos / 2; @@ -6296,10 +6236,14 @@ void Player::UpdateSkillsToMaxSkillsForLevel() continue; uint32 pskill = itr->first; - if (IsProfessionOrRidingSkill(pskill)) + SkillRaceClassInfoEntry const* rcEntry = GetSkillRaceClassInfo(pskill, getRace(), getClass()); + if (!rcEntry) + continue; + + if (IsProfessionOrRidingSkill(rcEntry->SkillId)) continue; - if (IsWeaponSkill(pskill)) + if (IsWeaponSkill(rcEntry->SkillId)) continue; uint16 field = itr->second.pos / 2; @@ -17784,7 +17728,8 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) // after spell and quest load InitTalentForLevel(); - learnDefaultSpells(); + LearnDefaultSkills(); + LearnCustomSpells(); // must be before inventory (some items required reputation check) m_reputationMgr->LoadFromDB(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_REPUTATION)); @@ -23648,15 +23593,19 @@ void Player::resetSpells(bool myClassOnly) for (PlayerSpellMap::const_iterator iter = smap.begin(); iter != smap.end(); ++iter) removeSpell(iter->first, false, false); // only iter->first can be accessed, object by iter->second can be deleted already - learnDefaultSpells(); + LearnDefaultSkills(); + LearnCustomSpells(); learnQuestRewardedSpells(); } -void Player::learnDefaultSpells() +void Player::LearnCustomSpells() { + if (!sWorld->getBoolConfig(CONFIG_START_ALL_SPELLS)) + return; + // learn default race/class spells PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass()); - for (PlayerCreateInfoSpells::const_iterator itr = info->spell.begin(); itr != info->spell.end(); ++itr) + for (PlayerCreateInfoSpells::const_iterator itr = info->customSpells.begin(); itr != info->customSpells.end(); ++itr) { uint32 tspell = *itr; TC_LOG_DEBUG("entities.player.loading", "PLAYER (Class: %u Race: %u): Adding initial spell, id = %u", uint32(getClass()), uint32(getRace()), tspell); @@ -23667,6 +23616,68 @@ void Player::learnDefaultSpells() } } +void Player::LearnDefaultSkills() +{ + // learn default race/class skills + PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass()); + for (PlayerCreateInfoSkills::const_iterator itr = info->skills.begin(); itr != info->skills.end(); ++itr) + { + uint32 skillId = itr->SkillId; + if (HasSkill(skillId)) + continue; + + LearnDefaultSkill(skillId, itr->Rank); + } +} + +void Player::LearnDefaultSkill(uint32 skillId, uint16 rank) +{ + SkillRaceClassInfoEntry const* rcInfo = GetSkillRaceClassInfo(skillId, getRace(), getClass()); + if (!rcInfo) + return; + + TC_LOG_DEBUG("entities.player.loading", "PLAYER (Class: %u Race: %u): Adding initial skill, id = %u", uint32(getClass()), uint32(getRace()), skillId); + switch (GetSkillRangeType(rcInfo)) + { + case SKILL_RANGE_LANGUAGE: + SetSkill(skillId, 0, 300, 300); + break; + case SKILL_RANGE_LEVEL: + { + uint16 skillValue = 1; + uint16 maxValue = GetMaxSkillValueForLevel(); + if (rcInfo->Flags & SKILL_FLAG_ALWAYS_MAX_VALUE) + skillValue = maxValue; + else if (getClass() == CLASS_DEATH_KNIGHT) + skillValue = std::min(std::max<uint16>({ 1, uint16((getLevel() - 1) * 5) }), maxValue); + + SetSkill(skillId, 0, skillValue, maxValue); + break; + } + case SKILL_RANGE_MONO: + SetSkill(skillId, 0, 1, 1); + break; + case SKILL_RANGE_RANK: + { + if (!rank) + break; + + SkillTiersEntry const* tier = sSkillTiersStore.LookupEntry(rcInfo->SkillTier); + uint16 maxValue = tier->MaxSkill[std::max<int32>(rank - 1, 0)]; + uint16 skillValue = 1; + if (rcInfo->Flags & SKILL_FLAG_ALWAYS_MAX_VALUE) + skillValue = maxValue; + else if (getClass() == CLASS_DEATH_KNIGHT) + skillValue = std::min(std::max<uint16>({ uint16(1), uint16((getLevel() - 1) * 5) }), maxValue); + + SetSkill(skillId, rank, skillValue, maxValue); + break; + } + default: + break; + } +} + void Player::learnQuestRewardedSpells(Quest const* quest) { int32 spell_id = quest->GetRewSpellCast(); @@ -23764,29 +23775,35 @@ void Player::learnSkillRewardedSpells(uint32 skill_id, uint32 skill_value) { uint32 raceMask = getRaceMask(); uint32 classMask = getClassMask(); - for (uint32 j=0; j<sSkillLineAbilityStore.GetNumRows(); ++j) + for (uint32 j = 0; j < sSkillLineAbilityStore.GetNumRows(); ++j) { SkillLineAbilityEntry const* pAbility = sSkillLineAbilityStore.LookupEntry(j); - if (!pAbility || pAbility->skillId != skill_id || pAbility->learnOnGetSkill != ABILITY_LEARNED_ON_GET_PROFESSION_SKILL) + if (!pAbility || pAbility->skillId != skill_id) + continue; + + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(pAbility->spellId); + if (!spellInfo) + continue; + + if (pAbility->AutolearnType != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE && pAbility->AutolearnType != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN) continue; + // Check race if set if (pAbility->racemask && !(pAbility->racemask & raceMask)) continue; + // Check class if set if (pAbility->classmask && !(pAbility->classmask & classMask)) continue; - if (sSpellMgr->GetSpellInfo(pAbility->spellId)) - { - // need unlearn spell - if (skill_value < pAbility->req_skill_value) - removeSpell(pAbility->spellId); - // need learn - else if (!IsInWorld()) - addSpell(pAbility->spellId, true, true, true, false); - else - learnSpell(pAbility->spellId, true); - } + // need unlearn spell + if (skill_value < pAbility->req_skill_value && pAbility->AutolearnType == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE) + removeSpell(pAbility->spellId); + // need learn + else if (!IsInWorld()) + addSpell(pAbility->spellId, true, true, true, false); + else + learnSpell(pAbility->spellId, true); } } @@ -25517,15 +25534,15 @@ void Player::_LoadSkills(PreparedQueryResult result) uint16 value = fields[1].GetUInt16(); uint16 max = fields[2].GetUInt16(); - SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(skill); - if (!pSkill) + SkillRaceClassInfoEntry const* rcEntry = GetSkillRaceClassInfo(skill, getRace(), getClass()); + if (!rcEntry) { TC_LOG_ERROR("entities.player", "Character %u has skill %u that does not exist.", GetGUIDLow(), skill); continue; } // set fixed skill ranges - switch (GetSkillRangeType(pSkill, false)) + switch (GetSkillRangeType(rcEntry)) { case SKILL_RANGE_LANGUAGE: // 300..300 value = max = 300; @@ -25533,9 +25550,12 @@ void Player::_LoadSkills(PreparedQueryResult result) case SKILL_RANGE_MONO: // 1..1, grey monolite bar value = max = 1; break; + case SKILL_RANGE_LEVEL: + max = GetMaxSkillValueForLevel(); default: break; } + if (value == 0) { TC_LOG_ERROR("entities.player", "Character %u has skill %u with value 0. Will be deleted.", GetGUIDLow(), skill); @@ -25556,15 +25576,19 @@ void Player::_LoadSkills(PreparedQueryResult result) SetUInt16Value(PLAYER_SKILL_LINEID_0 + field, offset, skill); uint16 step = 0; - if (pSkill->categoryId == SKILL_CATEGORY_SECONDARY) - step = max / 75; - - if (pSkill->categoryId == SKILL_CATEGORY_PROFESSION) + SkillLineEntry const* skillLine = sSkillLineStore.LookupEntry(rcEntry->SkillId); + if (skillLine) { - step = max / 75; + if (skillLine->categoryId == SKILL_CATEGORY_SECONDARY) + step = max / 75; + + if (skillLine->categoryId == SKILL_CATEGORY_PROFESSION) + { + step = max / 75; - if (professionCount < 2) - SetUInt32Value(PLAYER_PROFESSION_SKILL_LINE_1 + professionCount++, skill); + if (professionCount < 2) + SetUInt32Value(PLAYER_PROFESSION_SKILL_LINE_1 + professionCount++, skill); + } } SetUInt16Value(PLAYER_SKILL_STEP_0 + field, offset, step); @@ -25600,34 +25624,6 @@ void Player::_LoadSkills(PreparedQueryResult result) SetUInt16Value(PLAYER_SKILL_MODIFIER_0 + field, offset, 0); SetUInt16Value(PLAYER_SKILL_TALENT_0 + field, offset, 0); } - - // special settings - if (getClass() == CLASS_DEATH_KNIGHT) - { - uint8 base_level = std::min(getLevel(), uint8(sWorld->getIntConfig(CONFIG_START_HEROIC_PLAYER_LEVEL))); - if (base_level < 1) - base_level = 1; - uint16 base_skill = (base_level-1)*5; // 270 at starting level 55 - if (base_skill < 1) - base_skill = 1; // skill mast be known and then > 0 in any case - - if (GetPureSkillValue(SKILL_FIRST_AID) < base_skill) - SetSkill(SKILL_FIRST_AID, 4 /*artisan*/, base_skill, 300); - if (GetPureSkillValue(SKILL_AXES) < base_skill) - SetSkill(SKILL_AXES, 0, base_skill, base_skill); - if (GetPureSkillValue(SKILL_DEFENSE) < base_skill) - SetSkill(SKILL_DEFENSE, 0, base_skill, base_skill); - if (GetPureSkillValue(SKILL_POLEARMS) < base_skill) - SetSkill(SKILL_POLEARMS, 0, base_skill, base_skill); - if (GetPureSkillValue(SKILL_SWORDS) < base_skill) - SetSkill(SKILL_SWORDS, 0, base_skill, base_skill); - if (GetPureSkillValue(SKILL_2H_AXES) < base_skill) - SetSkill(SKILL_2H_AXES, 0, base_skill, base_skill); - if (GetPureSkillValue(SKILL_2H_SWORDS) < base_skill) - SetSkill(SKILL_2H_SWORDS, 0, base_skill, base_skill); - if (GetPureSkillValue(SKILL_UNARMED) < base_skill) - SetSkill(SKILL_UNARMED, 0, base_skill, base_skill); - } } InventoryResult Player::CanEquipUniqueItem(Item* pItem, uint8 eslot, uint32 limit_count) const diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index f60cf38cbc8..243ba8e725f 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -384,6 +384,14 @@ struct PlayerCreateInfoAction typedef std::list<PlayerCreateInfoAction> PlayerCreateInfoActions; +struct PlayerCreateInfoSkill +{ + uint16 SkillId; + uint16 Rank; +}; + +typedef std::list<PlayerCreateInfoSkill> PlayerCreateInfoSkills; + struct PlayerInfo { // existence checked by displayId != 0 @@ -398,8 +406,9 @@ struct PlayerInfo uint16 displayId_m; uint16 displayId_f; PlayerCreateInfoItems item; - PlayerCreateInfoSpells spell; + PlayerCreateInfoSpells customSpells; PlayerCreateInfoActions action; + PlayerCreateInfoSkills skills; PlayerLevelInfo* levelInfo; //[level-1] 0..MaxPlayerLevel-1 }; @@ -1761,7 +1770,9 @@ class Player : public Unit, public GridObject<Player> void learnSpell(uint32 spell_id, bool dependent); void removeSpell(uint32 spell_id, bool disabled = false, bool learn_low_rank = true); void resetSpells(bool myClassOnly = false); - void learnDefaultSpells(); + void LearnCustomSpells(); + void LearnDefaultSkills(); + void LearnDefaultSkill(uint32 skillId, uint16 rank); void learnQuestRewardedSpells(); void learnQuestRewardedSpells(Quest const* quest); void learnSpellHighRank(uint32 spellid); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 1d8e8122e30..e41243e5337 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -6668,7 +6668,8 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : NULL; // Try handle unknown trigger spells - if (sSpellMgr->GetSpellInfo(trigger_spell_id) == NULL) + // triggered spells exists only in serverside spell_dbc + /// @todo: reverify and move these spells to spellscripts { switch (auraSpellInfo->SpellFamilyName) { @@ -13686,7 +13687,7 @@ void Unit::Kill(Unit* victim, bool durabilityLoss) group->SendLooter(creature, NULL); // Update round robin looter only if the creature had loot - if (!creature->loot.empty()) + if (!loot->empty()) group->UpdateLooterGuid(creature); } } @@ -13793,7 +13794,7 @@ void Unit::Kill(Unit* victim, bool durabilityLoss) creature->DeleteThreatList(); // must be after setDeathState which resets dynamic flags - if (!creature->loot.empty()) + if (!creature->loot.isLooted()) creature->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); else creature->AllLootRemovedFromCorpse(); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 068f9513268..72621865465 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -3250,17 +3250,91 @@ void ObjectMgr::LoadPlayerInfo() } } + + // Load playercreate skills + TC_LOG_INFO("server.loading", "Loading Player Create Skill Data..."); + { + uint32 oldMSTime = getMSTime(); + + QueryResult result = WorldDatabase.PQuery("SELECT raceMask, classMask, skill, rank FROM playercreateinfo_skills"); + + if (!result) + { + TC_LOG_ERROR("server.loading", ">> Loaded 0 player create skills. DB table `playercreateinfo_skills` is empty."); + } + else + { + uint32 count = 0; + + do + { + Field* fields = result->Fetch(); + uint32 raceMask = fields[0].GetUInt32(); + uint32 classMask = fields[1].GetUInt32(); + PlayerCreateInfoSkill skill; + skill.SkillId = fields[2].GetUInt16(); + skill.Rank = fields[3].GetUInt16(); + + if (skill.Rank >= MAX_SKILL_STEP) + { + TC_LOG_ERROR("sql.sql", "Skill rank value %hu set for skill %hu raceMask %u classMask %u is too high, max allowed value is %d", skill.Rank, skill.SkillId, raceMask, classMask, MAX_SKILL_STEP); + continue; + } + + if (raceMask != 0 && !(raceMask & RACEMASK_ALL_PLAYABLE)) + { + TC_LOG_ERROR("sql.sql", "Wrong race mask %u in `playercreateinfo_skills` table, ignoring.", raceMask); + continue; + } + + if (classMask != 0 && !(classMask & CLASSMASK_ALL_PLAYABLE)) + { + TC_LOG_ERROR("sql.sql", "Wrong class mask %u in `playercreateinfo_skills` table, ignoring.", classMask); + continue; + } + + if (!sSkillLineStore.LookupEntry(skill.SkillId)) + { + TC_LOG_ERROR("sql.sql", "Wrong skill id %u in `playercreateinfo_skills` table, ignoring.", skill.SkillId); + continue; + } + + for (uint32 raceIndex = RACE_HUMAN; raceIndex < MAX_RACES; ++raceIndex) + { + if (raceMask == 0 || ((1 << (raceIndex - 1)) & raceMask)) + { + for (uint32 classIndex = CLASS_WARRIOR; classIndex < MAX_CLASSES; ++classIndex) + { + if (classMask == 0 || ((1 << (classIndex - 1)) & classMask)) + { + if (!GetSkillRaceClassInfo(skill.SkillId, raceIndex, classIndex)) + continue; + + if (PlayerInfo* info = _playerInfo[raceIndex][classIndex]) + { + info->skills.push_back(skill); + ++count; + } + } + } + } + } + } while (result->NextRow()); + + TC_LOG_INFO("server.loading", ">> Loaded %u player create skills in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + } + } + // Load playercreate spells TC_LOG_INFO("server.loading", "Loading Player Create Spell Data..."); { uint32 oldMSTime = getMSTime(); - std::string tableName = sWorld->getBoolConfig(CONFIG_START_ALL_SPELLS) ? "playercreateinfo_spell_custom" : "playercreateinfo_spell"; - QueryResult result = WorldDatabase.PQuery("SELECT racemask, classmask, Spell FROM %s", tableName.c_str()); + QueryResult result = WorldDatabase.PQuery("SELECT racemask, classmask, Spell FROM playercreateinfo_spell_custom"); if (!result) { - TC_LOG_ERROR("server.loading", ">> Loaded 0 player create spells. DB table `%s` is empty.", tableName.c_str()); + TC_LOG_ERROR("server.loading", ">> Loaded 0 player create spells. DB table `playercreateinfo_spell_custom` is empty."); } else { @@ -3275,13 +3349,13 @@ void ObjectMgr::LoadPlayerInfo() if (raceMask != 0 && !(raceMask & RACEMASK_ALL_PLAYABLE)) { - TC_LOG_ERROR("sql.sql", "Wrong race mask %u in `%s` table, ignoring.", raceMask, tableName.c_str()); + TC_LOG_ERROR("sql.sql", "Wrong race mask %u in `playercreateinfo_spell_custom` table, ignoring.", raceMask); continue; } if (classMask != 0 && !(classMask & CLASSMASK_ALL_PLAYABLE)) { - TC_LOG_ERROR("sql.sql", "Wrong class mask %u in `%s` table, ignoring.", classMask, tableName.c_str()); + TC_LOG_ERROR("sql.sql", "Wrong class mask %u in `playercreateinfo_spell_custom` table, ignoring.", classMask); continue; } @@ -3295,7 +3369,7 @@ void ObjectMgr::LoadPlayerInfo() { if (PlayerInfo* info = _playerInfo[raceIndex][classIndex]) { - info->spell.push_back(spellId); + info->customSpells.push_back(spellId); ++count; } // We need something better here, the check is not accounting for spells used by multiple races/classes but not all of them. @@ -3309,7 +3383,7 @@ void ObjectMgr::LoadPlayerInfo() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u player create spells in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u custom player create spells in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -7847,34 +7921,27 @@ int32 ObjectMgr::GetBaseReputationOf(FactionEntry const* factionEntry, uint8 rac return 0; } -SkillRangeType GetSkillRangeType(SkillLineEntry const* pSkill, bool racial) +SkillRangeType GetSkillRangeType(SkillRaceClassInfoEntry const* rcEntry) { - switch (pSkill->categoryId) + SkillLineEntry const* skill = sSkillLineStore.LookupEntry(rcEntry->SkillId); + if (!skill) + return SKILL_RANGE_NONE; + + if (sSkillTiersStore.LookupEntry(rcEntry->SkillTier)) + return SKILL_RANGE_RANK; + + if (rcEntry->SkillId == SKILL_RUNEFORGING) + return SKILL_RANGE_MONO; + + switch (skill->categoryId) { + case SKILL_CATEGORY_ARMOR: + return SKILL_RANGE_MONO; case SKILL_CATEGORY_LANGUAGES: return SKILL_RANGE_LANGUAGE; - case SKILL_CATEGORY_WEAPON: - return SKILL_RANGE_LEVEL; - case SKILL_CATEGORY_ARMOR: - case SKILL_CATEGORY_CLASS: - if (pSkill->id != SKILL_LOCKPICKING) - return SKILL_RANGE_MONO; - else - return SKILL_RANGE_LEVEL; - case SKILL_CATEGORY_SECONDARY: - case SKILL_CATEGORY_PROFESSION: - // not set skills for professions and racial abilities - if (IsProfessionSkill(pSkill->id)) - return SKILL_RANGE_RANK; - else if (racial) - return SKILL_RANGE_NONE; - else - return SKILL_RANGE_MONO; - default: - case SKILL_CATEGORY_ATTRIBUTES: //not found in dbc - case SKILL_CATEGORY_GENERIC: //only GENERIC(DND) - return SKILL_RANGE_NONE; } + + return SKILL_RANGE_LEVEL; } void ObjectMgr::LoadGameTele() diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 006bdfeaebf..a6e2ce9b067 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -670,7 +670,7 @@ enum SkillRangeType SKILL_RANGE_NONE // 0..0 always }; -SkillRangeType GetSkillRangeType(SkillLineEntry const* pSkill, bool racial); +SkillRangeType GetSkillRangeType(SkillRaceClassInfoEntry const* rcEntry); #define MAX_PLAYER_NAME 12 // max allowed by client name length #define MAX_INTERNAL_PLAYER_NAME 15 // max server internal player name length (> MAX_PLAYER_NAME for support declined names) diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 56ae9061033..7a4d4904cc1 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -2271,7 +2271,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target) m_spellAura = NULL; // Set aura to null for every target-make sure that pointer is not used for unit without aura applied //Spells with this flag cannot trigger if effect is cast on self - bool canEffectTrigger = !(m_spellInfo->AttributesEx3 & SPELL_ATTR3_CANT_TRIGGER_PROC) && unitTarget->CanProc() && CanExecuteTriggersOnHit(mask); + bool canEffectTrigger = !(m_spellInfo->AttributesEx3 & SPELL_ATTR3_CANT_TRIGGER_PROC) && unitTarget->CanProc() && (CanExecuteTriggersOnHit(mask) || missInfo == SPELL_MISS_IMMUNE || missInfo == SPELL_MISS_IMMUNE2); Unit* spellHitTarget = NULL; if (missInfo == SPELL_MISS_NONE) // In case spell hit target, do all effect on that target @@ -2317,15 +2317,8 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target) if (m_damage > 0) positive = false; else if (!m_healing) - { - for (uint8 i = 0; i< MAX_SPELL_EFFECTS; ++i) - // If at least one effect negative spell is negative hit - if (mask & (1<<i) && !m_spellInfo->IsPositiveEffect(i)) - { - positive = false; - break; - } - } + positive = m_spellInfo->IsPositive(); + switch (m_spellInfo->DmgClass) { case SPELL_DAMAGE_CLASS_MAGIC: @@ -2527,9 +2520,14 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA } } + uint8 aura_effmask = 0; + for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + if (effectMask & (1 << i) && m_spellInfo->Effects[i].IsUnitOwnedAuraEffect()) + aura_effmask |= 1 << i; + // Get Data Needed for Diminishing Returns, some effects may have multiple auras, so this must be done on spell hit, not aura add m_diminishGroup = GetDiminishingReturnsGroupForSpell(m_spellInfo, m_triggeredByAuraSpell); - if (m_diminishGroup) + if (m_diminishGroup && aura_effmask) { m_diminishLevel = unit->GetDiminishing(m_diminishGroup); DiminishingReturnsType type = GetDiminishingReturnsGroupType(m_diminishGroup); @@ -2540,11 +2538,6 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA unit->IncrDiminishing(m_diminishGroup); } - uint8 aura_effmask = 0; - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - if (effectMask & (1 << i) && m_spellInfo->Effects[i].IsUnitOwnedAuraEffect()) - aura_effmask |= 1 << i; - if (aura_effmask) { // Select rank for aura with level requirements only in specific cases diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index ebd0a269223..98ee85dce84 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -531,14 +531,6 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex) } break; } - case SPELLFAMILY_MAGE: - { - // Deep Freeze should deal damage to permanently stun-immune targets. - if (m_spellInfo->Id == 71757) - if (unitTarget->GetTypeId() != TYPEID_UNIT || !(unitTarget->IsImmunedToSpellEffect(sSpellMgr->GetSpellInfo(44572), 0))) - return; - break; - } } if (m_originalCaster && damage > 0 && apply_direct_bonus) diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 040f1df3cf5..d19c79cef41 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1130,7 +1130,7 @@ bool SpellInfo::IsAbilityLearnedWithProfession() const for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx) { SkillLineAbilityEntry const* pAbility = _spell_idx->second; - if (!pAbility || pAbility->learnOnGetSkill != ABILITY_LEARNED_ON_GET_PROFESSION_SKILL) + if (!pAbility || pAbility->AutolearnType != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE) continue; if (pAbility->req_skill_value > 0) diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 09bb154106b..fa43176fd0b 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -2437,7 +2437,7 @@ void SpellMgr::LoadPetLevelupSpellMap() if (skillLine->skillId != creatureFamily->skillLine[j]) continue; - if (skillLine->learnOnGetSkill != ABILITY_LEARNED_ON_GET_RACE_OR_CLASS_SKILL) + if (skillLine->AutolearnType != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN) continue; SpellInfo const* spell = GetSpellInfo(skillLine->spellId); diff --git a/src/server/scripts/Commands/cs_learn.cpp b/src/server/scripts/Commands/cs_learn.cpp index 41d740de3c2..3cb0d4c7d3f 100644 --- a/src/server/scripts/Commands/cs_learn.cpp +++ b/src/server/scripts/Commands/cs_learn.cpp @@ -332,7 +332,8 @@ public: if (!handler->extractPlayerTarget((char*)args, &target)) return false; - target->learnDefaultSpells(); + target->LearnDefaultSkills(); + target->LearnCustomSpells(); target->learnQuestRewardedSpells(); handler->PSendSysMessage(LANG_COMMAND_LEARN_ALL_DEFAULT_AND_QUEST, handler->GetNameLink(target).c_str()); diff --git a/src/tools/vmap4_extractor/model.cpp b/src/tools/vmap4_extractor/model.cpp index 0f1bde7712d..692939cf288 100644 --- a/src/tools/vmap4_extractor/model.cpp +++ b/src/tools/vmap4_extractor/model.cpp @@ -98,8 +98,19 @@ bool Model::ConvertToVMAPModel(const char * outfilename) wsize = sizeof(uint32) + sizeof(unsigned short) * nIndexes; fwrite(&wsize, sizeof(int), 1, output); fwrite(&nIndexes, sizeof(uint32), 1, output); - if (nIndexes >0) + if (nIndexes > 0) + { + for (uint32 i = 0; i < nIndexes; ++i) + { + if ((i % 3) - 1 == 0 && i + 1 < nIndexes) + { + uint16 tmp = indices[i]; + indices[i] = indices[i + 1]; + indices[i + 1] = tmp; + } + } fwrite(indices, sizeof(unsigned short), nIndexes, output); + } fwrite("VERT", 4, 1, output); wsize = sizeof(int) + sizeof(float) * 3 * nVertices; @@ -107,8 +118,12 @@ bool Model::ConvertToVMAPModel(const char * outfilename) fwrite(&nVertices, sizeof(int), 1, output); if (nVertices >0) { - for(uint32 vpos=0; vpos <nVertices; ++vpos) - std::swap(vertices[vpos].y, vertices[vpos].z); + for (uint32 vpos = 0; vpos < nVertices; ++vpos) + { + float tmp = vertices[vpos].y; + vertices[vpos].y = -vertices[vpos].z; + vertices[vpos].z = tmp; + } fwrite(vertices, sizeof(float)*3, nVertices, output); } |