implement commanded cast types

This commit is contained in:
nytmyr
2024-11-26 13:17:36 -06:00
parent 1f82e12b34
commit b200bdd04e
28 changed files with 1395 additions and 994 deletions
+744 -157
View File
@@ -312,7 +312,7 @@ UPDATE `bot_spells_entries` SET `type` = 21 WHERE `type` = 2097152;
.sql = R"(
UPDATE bot_spells_entries b, spells_new s
SET b.`type` = 22
WHERE b.spellid = s.id
WHERE b.spell_id = s.id
AND (
s.`effectid1` = 23 OR
s.`effectid2` = 23 OR
@@ -332,177 +332,764 @@ AND (
ManifestEntry{
.version = 9049,
.description = "2024_05_18_correct_bot_spell_entries_types.sql",
.check = "SELECT * FROM `bot_spells_entries` where `npc_spells_id` = 3002 AND `spellid` = 14312",
.check = "SELECT * FROM `bot_spells_entries` where `npc_spells_id` = 3002 AND `spell_id` = 14312",
.condition = "empty",
.match = "",
.sql = R"(
-- Class fixes
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3002 WHERE b.`spellid` = 14312;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3002 WHERE b.`spellid` = 14313;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3002 WHERE b.`spellid` = 14314;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3005 WHERE b.`spellid` = 15186;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3005 WHERE b.`spellid` = 15187;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3005 WHERE b.`spellid` = 15188;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3006 WHERE b.`spellid` = 14446;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3006 WHERE b.`spellid` = 14447;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3006 WHERE b.`spellid` = 14467;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3006 WHERE b.`spellid` = 14468;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3006 WHERE b.`spellid` = 14469;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3003 WHERE b.`spellid` = 14955;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3003 WHERE b.`spellid` = 14956;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3006 WHERE b.`spellid` = 14387;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3006 WHERE b.`spellid` = 14388;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3006 WHERE b.`spellid` = 14389;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3002 WHERE b.`spell_id` = 14312;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3002 WHERE b.`spell_id` = 14313;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3002 WHERE b.`spell_id` = 14314;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3005 WHERE b.`spell_id` = 15186;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3005 WHERE b.`spell_id` = 15187;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3005 WHERE b.`spell_id` = 15188;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3006 WHERE b.`spell_id` = 14446;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3006 WHERE b.`spell_id` = 14447;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3006 WHERE b.`spell_id` = 14467;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3006 WHERE b.`spell_id` = 14468;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3006 WHERE b.`spell_id` = 14469;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3003 WHERE b.`spell_id` = 14955;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3003 WHERE b.`spell_id` = 14956;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3006 WHERE b.`spell_id` = 14387;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3006 WHERE b.`spell_id` = 14388;
UPDATE bot_spells_entries b SET b.`npc_spells_id` = 3006 WHERE b.`spell_id` = 14389;
-- Minlevel fixes
UPDATE bot_spells_entries SET `minlevel` = 34 WHERE `spellid` = 1445 AND `npc_spells_id` = 3002;
UPDATE bot_spells_entries SET `minlevel` = 2 WHERE `spellid` = 229 AND `npc_spells_id` = 3011;
UPDATE bot_spells_entries SET `minlevel` = 13 WHERE `spellid` = 333 AND `npc_spells_id` = 3013;
UPDATE bot_spells_entries SET `minlevel` = 29 WHERE `spellid` = 106 AND `npc_spells_id` = 3013;
UPDATE bot_spells_entries SET `minlevel` = 38 WHERE `spellid` = 754 AND `npc_spells_id` = 3010;
UPDATE bot_spells_entries SET `minlevel` = 58 WHERE `spellid` = 2589 AND `npc_spells_id` = 3003;
UPDATE bot_spells_entries SET `minlevel` = 67 WHERE `spellid` = 5305 AND `npc_spells_id` = 3004;
UPDATE bot_spells_entries SET `minlevel` = 79 WHERE `spellid` = 14267 AND `npc_spells_id` = 3002;
UPDATE bot_spells_entries SET `minlevel` = 79 WHERE `spellid` = 14268 AND `npc_spells_id` = 3002;
UPDATE bot_spells_entries SET `minlevel` = 79 WHERE `spellid` = 14269 AND `npc_spells_id` = 3002;
UPDATE bot_spells_entries SET `minlevel` = 23 WHERE `spellid` = 738 AND `npc_spells_id` = 3008;
UPDATE bot_spells_entries SET `minlevel` = 51 WHERE `spellid` = 1751 AND `npc_spells_id` = 3008;
UPDATE bot_spells_entries SET `minlevel` = 7 WHERE `spellid` = 734 AND `npc_spells_id` = 3008;
UPDATE bot_spells_entries SET `minlevel` = 5 WHERE `spellid` = 717 AND `npc_spells_id` = 3008;
UPDATE bot_spells_entries SET `minlevel` = 79 WHERE `spellid` = 15186 AND `npc_spells_id` = 3005;
UPDATE bot_spells_entries SET `minlevel` = 79 WHERE `spellid` = 15187 AND `npc_spells_id` = 3005;
UPDATE bot_spells_entries SET `minlevel` = 79 WHERE `spellid` = 15188 AND `npc_spells_id` = 3005;
UPDATE bot_spells_entries SET `minlevel` = 80 WHERE `spellid` = 14446 AND `npc_spells_id` = 3006;
UPDATE bot_spells_entries SET `minlevel` = 80 WHERE `spellid` = 14447 AND `npc_spells_id` = 3006;
UPDATE bot_spells_entries SET `minlevel` = 79 WHERE `spellid` = 14467 AND `npc_spells_id` = 3006;
UPDATE bot_spells_entries SET `minlevel` = 79 WHERE `spellid` = 14468 AND `npc_spells_id` = 3006;
UPDATE bot_spells_entries SET `minlevel` = 79 WHERE `spellid` = 14469 AND `npc_spells_id` = 3006;
UPDATE bot_spells_entries SET `minlevel` = 77 WHERE `spellid` = 14955 AND `npc_spells_id` = 3003;
UPDATE bot_spells_entries SET `minlevel` = 77 WHERE `spellid` = 14956 AND `npc_spells_id` = 3003;
UPDATE bot_spells_entries SET `minlevel` = 78 WHERE `spellid` = 14387 AND `npc_spells_id` = 3006;
UPDATE bot_spells_entries SET `minlevel` = 77 WHERE `spellid` = 14388 AND `npc_spells_id` = 3006;
UPDATE bot_spells_entries SET `minlevel` = 77 WHERE `spellid` = 14389 AND `npc_spells_id` = 3006;
UPDATE bot_spells_entries SET `minlevel` = 77 WHERE `spellid` = 14312 AND `npc_spells_id` = 3002;
UPDATE bot_spells_entries SET `minlevel` = 77 WHERE `spellid` = 14313 AND `npc_spells_id` = 3002;
UPDATE bot_spells_entries SET `minlevel` = 77 WHERE `spellid` = 14314 AND `npc_spells_id` = 3002;
UPDATE bot_spells_entries SET `minlevel` = 34 WHERE `spell_id` = 1445 AND `npc_spells_id` = 3002;
UPDATE bot_spells_entries SET `minlevel` = 2 WHERE `spell_id` = 229 AND `npc_spells_id` = 3011;
UPDATE bot_spells_entries SET `minlevel` = 13 WHERE `spell_id` = 333 AND `npc_spells_id` = 3013;
UPDATE bot_spells_entries SET `minlevel` = 29 WHERE `spell_id` = 106 AND `npc_spells_id` = 3013;
UPDATE bot_spells_entries SET `minlevel` = 38 WHERE `spell_id` = 754 AND `npc_spells_id` = 3010;
UPDATE bot_spells_entries SET `minlevel` = 58 WHERE `spell_id` = 2589 AND `npc_spells_id` = 3003;
UPDATE bot_spells_entries SET `minlevel` = 67 WHERE `spell_id` = 5305 AND `npc_spells_id` = 3004;
UPDATE bot_spells_entries SET `minlevel` = 79 WHERE `spell_id` = 14267 AND `npc_spells_id` = 3002;
UPDATE bot_spells_entries SET `minlevel` = 79 WHERE `spell_id` = 14268 AND `npc_spells_id` = 3002;
UPDATE bot_spells_entries SET `minlevel` = 79 WHERE `spell_id` = 14269 AND `npc_spells_id` = 3002;
UPDATE bot_spells_entries SET `minlevel` = 23 WHERE `spell_id` = 738 AND `npc_spells_id` = 3008;
UPDATE bot_spells_entries SET `minlevel` = 51 WHERE `spell_id` = 1751 AND `npc_spells_id` = 3008;
UPDATE bot_spells_entries SET `minlevel` = 7 WHERE `spell_id` = 734 AND `npc_spells_id` = 3008;
UPDATE bot_spells_entries SET `minlevel` = 5 WHERE `spell_id` = 717 AND `npc_spells_id` = 3008;
UPDATE bot_spells_entries SET `minlevel` = 79 WHERE `spell_id` = 15186 AND `npc_spells_id` = 3005;
UPDATE bot_spells_entries SET `minlevel` = 79 WHERE `spell_id` = 15187 AND `npc_spells_id` = 3005;
UPDATE bot_spells_entries SET `minlevel` = 79 WHERE `spell_id` = 15188 AND `npc_spells_id` = 3005;
UPDATE bot_spells_entries SET `minlevel` = 80 WHERE `spell_id` = 14446 AND `npc_spells_id` = 3006;
UPDATE bot_spells_entries SET `minlevel` = 80 WHERE `spell_id` = 14447 AND `npc_spells_id` = 3006;
UPDATE bot_spells_entries SET `minlevel` = 79 WHERE `spell_id` = 14467 AND `npc_spells_id` = 3006;
UPDATE bot_spells_entries SET `minlevel` = 79 WHERE `spell_id` = 14468 AND `npc_spells_id` = 3006;
UPDATE bot_spells_entries SET `minlevel` = 79 WHERE `spell_id` = 14469 AND `npc_spells_id` = 3006;
UPDATE bot_spells_entries SET `minlevel` = 77 WHERE `spell_id` = 14955 AND `npc_spells_id` = 3003;
UPDATE bot_spells_entries SET `minlevel` = 77 WHERE `spell_id` = 14956 AND `npc_spells_id` = 3003;
UPDATE bot_spells_entries SET `minlevel` = 78 WHERE `spell_id` = 14387 AND `npc_spells_id` = 3006;
UPDATE bot_spells_entries SET `minlevel` = 77 WHERE `spell_id` = 14388 AND `npc_spells_id` = 3006;
UPDATE bot_spells_entries SET `minlevel` = 77 WHERE `spell_id` = 14389 AND `npc_spells_id` = 3006;
UPDATE bot_spells_entries SET `minlevel` = 77 WHERE `spell_id` = 14312 AND `npc_spells_id` = 3002;
UPDATE bot_spells_entries SET `minlevel` = 77 WHERE `spell_id` = 14313 AND `npc_spells_id` = 3002;
UPDATE bot_spells_entries SET `minlevel` = 77 WHERE `spell_id` = 14314 AND `npc_spells_id` = 3002;
-- Maxlevel fixes
UPDATE bot_spells_entries SET `maxlevel` = 83 WHERE `spellid` = 14267 AND `npc_spells_id` = 3002;
UPDATE bot_spells_entries SET `maxlevel` = 83 WHERE `spellid` = 14268 AND `npc_spells_id` = 3002;
UPDATE bot_spells_entries SET `maxlevel` = 83 WHERE `spellid` = 14269 AND `npc_spells_id` = 3002;
UPDATE bot_spells_entries SET `maxlevel` = 84 WHERE `spellid` = 14446 AND `npc_spells_id` = 3006;
UPDATE bot_spells_entries SET `maxlevel` = 84 WHERE `spellid` = 14447 AND `npc_spells_id` = 3006;
UPDATE bot_spells_entries SET `maxlevel` = 84 WHERE `spellid` = 14467 AND `npc_spells_id` = 3006;
UPDATE bot_spells_entries SET `maxlevel` = 84 WHERE `spellid` = 14468 AND `npc_spells_id` = 3006;
UPDATE bot_spells_entries SET `maxlevel` = 84 WHERE `spellid` = 14469 AND `npc_spells_id` = 3006;
UPDATE bot_spells_entries SET `maxlevel` = 81 WHERE `spellid` = 14312 AND `npc_spells_id` = 3002;
UPDATE bot_spells_entries SET `maxlevel` = 81 WHERE `spellid` = 14313 AND `npc_spells_id` = 3002;
UPDATE bot_spells_entries SET `maxlevel` = 81 WHERE `spellid` = 14314 AND `npc_spells_id` = 3002;
UPDATE bot_spells_entries SET `maxlevel` = 83 WHERE `spell_id` = 14267 AND `npc_spells_id` = 3002;
UPDATE bot_spells_entries SET `maxlevel` = 83 WHERE `spell_id` = 14268 AND `npc_spells_id` = 3002;
UPDATE bot_spells_entries SET `maxlevel` = 83 WHERE `spell_id` = 14269 AND `npc_spells_id` = 3002;
UPDATE bot_spells_entries SET `maxlevel` = 84 WHERE `spell_id` = 14446 AND `npc_spells_id` = 3006;
UPDATE bot_spells_entries SET `maxlevel` = 84 WHERE `spell_id` = 14447 AND `npc_spells_id` = 3006;
UPDATE bot_spells_entries SET `maxlevel` = 84 WHERE `spell_id` = 14467 AND `npc_spells_id` = 3006;
UPDATE bot_spells_entries SET `maxlevel` = 84 WHERE `spell_id` = 14468 AND `npc_spells_id` = 3006;
UPDATE bot_spells_entries SET `maxlevel` = 84 WHERE `spell_id` = 14469 AND `npc_spells_id` = 3006;
UPDATE bot_spells_entries SET `maxlevel` = 81 WHERE `spell_id` = 14312 AND `npc_spells_id` = 3002;
UPDATE bot_spells_entries SET `maxlevel` = 81 WHERE `spell_id` = 14313 AND `npc_spells_id` = 3002;
UPDATE bot_spells_entries SET `maxlevel` = 81 WHERE `spell_id` = 14314 AND `npc_spells_id` = 3002;
-- Type fixes
UPDATE bot_spells_entries SET `type` = 14 WHERE `spellid` = 201;
UPDATE bot_spells_entries SET `type` = 17 WHERE `spellid` = 752;
UPDATE bot_spells_entries SET `type` = 17 WHERE `spellid` = 2117;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spellid` = 2542;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spellid` = 2544;
UPDATE bot_spells_entries SET `type` = 6 WHERE `spellid` = 2115;
UPDATE bot_spells_entries SET `type` = 8 WHERE `spellid` = 1403;
UPDATE bot_spells_entries SET `type` = 8 WHERE `spellid` = 1405;
UPDATE bot_spells_entries SET `type` = 9 WHERE `spellid` = 289;
UPDATE bot_spells_entries SET `type` = 8 WHERE `spellid` = 294;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spellid` = 302;
UPDATE bot_spells_entries SET `type` = 8 WHERE `spellid` = 521;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spellid` = 185;
UPDATE bot_spells_entries SET `type` = 8 WHERE `spellid` = 450;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spellid` = 186;
UPDATE bot_spells_entries SET `type` = 3 WHERE `spellid` = 4074;
UPDATE bot_spells_entries SET `type` = 8 WHERE `spellid` = 195;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spellid` = 1712;
UPDATE bot_spells_entries SET `type` = 8 WHERE `spellid` = 1703;
UPDATE bot_spells_entries SET `type` = 17 WHERE `spellid` = 3229;
UPDATE bot_spells_entries SET `type` = 8 WHERE `spellid` = 3345;
UPDATE bot_spells_entries SET `type` = 8 WHERE `spellid` = 5509;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spellid` = 6826;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spellid` = 270;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spellid` = 281;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spellid` = 505;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spellid` = 526;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spellid` = 110;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spellid` = 506;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spellid` = 162;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spellid` = 111;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spellid` = 507;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spellid` = 527;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spellid` = 163;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spellid` = 112;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spellid` = 1588;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spellid` = 1573;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spellid` = 1592;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spellid` = 1577;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spellid` = 1578;
UPDATE bot_spells_entries SET `type` = 1 WHERE `spellid` = 1576;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spellid` = 3386;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spellid` = 3387;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spellid` = 4900;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spellid` = 3395;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spellid` = 5394;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spellid` = 5392;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spellid` = 6827;
UPDATE bot_spells_entries SET `type` = 1 WHERE `spellid` = 5416;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spellid` = 1437;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spellid` = 1436;
UPDATE bot_spells_entries SET `type` = 8 WHERE `spellid` = 5348;
UPDATE bot_spells_entries SET `type` = 3 WHERE `spellid` = 8008;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spellid` = 2571;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spellid` = 370;
UPDATE bot_spells_entries SET `type` = 17 WHERE `spellid` = 1741;
UPDATE bot_spells_entries SET `type` = 17 WHERE `spellid` = 1296;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spellid` = 270;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spellid` = 2634;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spellid` = 2942;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spellid` = 3462;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spellid` = 6828;
UPDATE bot_spells_entries SET `type` = 4 WHERE `spellid` = 14312;
UPDATE bot_spells_entries SET `type` = 4 WHERE `spellid` = 14313;
UPDATE bot_spells_entries SET `type` = 4 WHERE `spellid` = 14314;
UPDATE bot_spells_entries SET `type` = 8 WHERE `spellid` = 18392;
UPDATE bot_spells_entries SET `type` = 8 WHERE `spellid` = 18393;
UPDATE bot_spells_entries SET `type` = 8 WHERE `spellid` = 18394;
UPDATE bot_spells_entries SET `type` = 10 WHERE `spellid` = 15186;
UPDATE bot_spells_entries SET `type` = 3 WHERE `spellid` = 15187;
UPDATE bot_spells_entries SET `type` = 3 WHERE `spellid` = 15188;
UPDATE bot_spells_entries SET `type` = 1 WHERE `spellid` = 14446;
UPDATE bot_spells_entries SET `type` = 1 WHERE `spellid` = 14447;
UPDATE bot_spells_entries SET `type` = 3 WHERE `spellid` = 14467;
UPDATE bot_spells_entries SET `type` = 3 WHERE `spellid` = 14468;
UPDATE bot_spells_entries SET `type` = 3 WHERE `spellid` = 14469;
UPDATE bot_spells_entries SET `type` = 0 WHERE `spellid` = 14267;
UPDATE bot_spells_entries SET `type` = 0 WHERE `spellid` = 14268;
UPDATE bot_spells_entries SET `type` = 0 WHERE `spellid` = 14269;
UPDATE bot_spells_entries SET `type` = 10 WHERE `spellid` = 14955;
UPDATE bot_spells_entries SET `type` = 10 WHERE `spellid` = 14956;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spellid` = 14387;
UPDATE bot_spells_entries SET `type` = 3 WHERE `spellid` = 14388;
UPDATE bot_spells_entries SET `type` = 3 WHERE `spellid` = 14389;
UPDATE bot_spells_entries SET `type` = 4 WHERE `spellid` = 10436;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spell_id` = 201;
UPDATE bot_spells_entries SET `type` = 17 WHERE `spell_id` = 752;
UPDATE bot_spells_entries SET `type` = 17 WHERE `spell_id` = 2117;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spell_id` = 2542;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spell_id` = 2544;
UPDATE bot_spells_entries SET `type` = 6 WHERE `spell_id` = 2115;
UPDATE bot_spells_entries SET `type` = 8 WHERE `spell_id` = 1403;
UPDATE bot_spells_entries SET `type` = 8 WHERE `spell_id` = 1405;
UPDATE bot_spells_entries SET `type` = 9 WHERE `spell_id` = 289;
UPDATE bot_spells_entries SET `type` = 8 WHERE `spell_id` = 294;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spell_id` = 302;
UPDATE bot_spells_entries SET `type` = 8 WHERE `spell_id` = 521;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spell_id` = 185;
UPDATE bot_spells_entries SET `type` = 8 WHERE `spell_id` = 450;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spell_id` = 186;
UPDATE bot_spells_entries SET `type` = 3 WHERE `spell_id` = 4074;
UPDATE bot_spells_entries SET `type` = 8 WHERE `spell_id` = 195;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spell_id` = 1712;
UPDATE bot_spells_entries SET `type` = 8 WHERE `spell_id` = 1703;
UPDATE bot_spells_entries SET `type` = 17 WHERE `spell_id` = 3229;
UPDATE bot_spells_entries SET `type` = 8 WHERE `spell_id` = 3345;
UPDATE bot_spells_entries SET `type` = 8 WHERE `spell_id` = 5509;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spell_id` = 6826;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spell_id` = 270;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spell_id` = 281;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spell_id` = 505;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spell_id` = 526;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spell_id` = 110;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spell_id` = 506;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spell_id` = 162;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spell_id` = 111;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spell_id` = 507;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spell_id` = 527;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spell_id` = 163;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spell_id` = 112;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spell_id` = 1588;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spell_id` = 1573;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spell_id` = 1592;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spell_id` = 1577;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spell_id` = 1578;
UPDATE bot_spells_entries SET `type` = 1 WHERE `spell_id` = 1576;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spell_id` = 3386;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spell_id` = 3387;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spell_id` = 4900;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spell_id` = 3395;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spell_id` = 5394;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spell_id` = 5392;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spell_id` = 6827;
UPDATE bot_spells_entries SET `type` = 1 WHERE `spell_id` = 5416;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spell_id` = 1437;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spell_id` = 1436;
UPDATE bot_spells_entries SET `type` = 8 WHERE `spell_id` = 5348;
UPDATE bot_spells_entries SET `type` = 3 WHERE `spell_id` = 8008;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spell_id` = 2571;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spell_id` = 370;
UPDATE bot_spells_entries SET `type` = 17 WHERE `spell_id` = 1741;
UPDATE bot_spells_entries SET `type` = 17 WHERE `spell_id` = 1296;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spell_id` = 270;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spell_id` = 2634;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spell_id` = 2942;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spell_id` = 3462;
UPDATE bot_spells_entries SET `type` = 13 WHERE `spell_id` = 6828;
UPDATE bot_spells_entries SET `type` = 4 WHERE `spell_id` = 14312;
UPDATE bot_spells_entries SET `type` = 4 WHERE `spell_id` = 14313;
UPDATE bot_spells_entries SET `type` = 4 WHERE `spell_id` = 14314;
UPDATE bot_spells_entries SET `type` = 8 WHERE `spell_id` = 18392;
UPDATE bot_spells_entries SET `type` = 8 WHERE `spell_id` = 18393;
UPDATE bot_spells_entries SET `type` = 8 WHERE `spell_id` = 18394;
UPDATE bot_spells_entries SET `type` = 10 WHERE `spell_id` = 15186;
UPDATE bot_spells_entries SET `type` = 3 WHERE `spell_id` = 15187;
UPDATE bot_spells_entries SET `type` = 3 WHERE `spell_id` = 15188;
UPDATE bot_spells_entries SET `type` = 1 WHERE `spell_id` = 14446;
UPDATE bot_spells_entries SET `type` = 1 WHERE `spell_id` = 14447;
UPDATE bot_spells_entries SET `type` = 3 WHERE `spell_id` = 14467;
UPDATE bot_spells_entries SET `type` = 3 WHERE `spell_id` = 14468;
UPDATE bot_spells_entries SET `type` = 3 WHERE `spell_id` = 14469;
UPDATE bot_spells_entries SET `type` = 0 WHERE `spell_id` = 14267;
UPDATE bot_spells_entries SET `type` = 0 WHERE `spell_id` = 14268;
UPDATE bot_spells_entries SET `type` = 0 WHERE `spell_id` = 14269;
UPDATE bot_spells_entries SET `type` = 10 WHERE `spell_id` = 14955;
UPDATE bot_spells_entries SET `type` = 10 WHERE `spell_id` = 14956;
UPDATE bot_spells_entries SET `type` = 14 WHERE `spell_id` = 14387;
UPDATE bot_spells_entries SET `type` = 3 WHERE `spell_id` = 14388;
UPDATE bot_spells_entries SET `type` = 3 WHERE `spell_id` = 14389;
UPDATE bot_spells_entries SET `type` = 4 WHERE `spell_id` = 10436;
-- UPDATE bot_spells_entries SET `type` = 14 WHERE `spellid` = 3440; -- Ro's Illumination [#3440] from DoT [#8] to Debuff [#14] [Should be 0]
-- UPDATE bot_spells_entries SET `type` = 14 WHERE `spellid` = 303; -- Whirl till you hurl [#303] from Nuke [#0] to Debuff [#14] [Should be 0]
-- UPDATE bot_spells_entries SET `type` = 14 WHERE `spellid` = 619; -- Dyn's Dizzying Draught [#619] from Nuke [#0] to Debuff [#14] [Should be 0]
-- UPDATE bot_spells_entries SET `type` = 14 WHERE `spell_id` = 3440; -- Ro's Illumination [#3440] from DoT [#8] to Debuff [#14] [Should be 0]
-- UPDATE bot_spells_entries SET `type` = 14 WHERE `spell_id` = 303; -- Whirl till you hurl [#303] from Nuke [#0] to Debuff [#14] [Should be 0]
-- UPDATE bot_spells_entries SET `type` = 14 WHERE `spell_id` = 619; -- Dyn's Dizzying Draught [#619] from Nuke [#0] to Debuff [#14] [Should be 0]
-- UPDATE bot_spells_entries SET `type` = 14 WHERE `spellid` = 74; -- Mana Sieve [#74] from Nuke [#0] to Debuff [#14]
-- UPDATE bot_spells_entries SET `type` = 6 WHERE `spellid` = 1686; -- Theft of Thought [#1686] from Nuke [#0] to Lifetap [#6]
-- UPDATE bot_spells_entries SET `type` = 14 WHERE `spell_id` = 74; -- Mana Sieve [#74] from Nuke [#0] to Debuff [#14]
-- UPDATE bot_spells_entries SET `type` = 6 WHERE `spell_id` = 1686; -- Theft of Thought [#1686] from Nuke [#0] to Lifetap [#6]
-- UPDATE bot_spells_entries SET `type` = 1 WHERE `spellid` = 3694; -- Stoicism [#3694] from In-Combat Buff [#10] to Regular Heal [#1]
-- UPDATE bot_spells_entries SET `type` = 1 WHERE `spellid` = 4899; -- Breath of Trushar [#4899] from In-Combat Buff [#10] to Regular Heal [#1]
-- UPDATE bot_spells_entries SET `type` = 1 WHERE `spell_id` = 3694; -- Stoicism [#3694] from In-Combat Buff [#10] to Regular Heal [#1]
-- UPDATE bot_spells_entries SET `type` = 1 WHERE `spell_id` = 4899; -- Breath of Trushar [#4899] from In-Combat Buff [#10] to Regular Heal [#1]
-- UPDATE bot_spells_entries SET `type` = 7 WHERE `spellid` = 738; -- Selo's Consonant Chain [#738] from Slow [#13] to Snare [#7]
-- UPDATE bot_spells_entries SET `type` = 7 WHERE `spellid` = 1751; -- Largo's Assonant Binding [#1751] from Slow [#13] to Snare [#7]
-- UPDATE bot_spells_entries SET `type` = 8 WHERE `spellid` = 1748; -- Angstlich's Assonance [#1748] from Slow [#13] to DoT [#8]
-- UPDATE bot_spells_entries SET `type` = 7 WHERE `spellid` = 738; -- Selo's Consonant Chain [#738] from Slow [#13] to Snare [#7]
-- UPDATE bot_spells_entries SET `type` = 7 WHERE `spellid` = 1751; -- Largo's Assonant Binding [#1751] from Slow [#13] to Snare [#7]
-- UPDATE bot_spells_entries SET `type` = 7 WHERE `spellid` = 738; -- Selo's Consonant Chain [#738] from Slow [#13] to Snare [#7]
-- UPDATE bot_spells_entries SET `type` = 7 WHERE `spell_id` = 738; -- Selo's Consonant Chain [#738] from Slow [#13] to Snare [#7]
-- UPDATE bot_spells_entries SET `type` = 7 WHERE `spell_id` = 1751; -- Largo's Assonant Binding [#1751] from Slow [#13] to Snare [#7]
-- UPDATE bot_spells_entries SET `type` = 8 WHERE `spell_id` = 1748; -- Angstlich's Assonance [#1748] from Slow [#13] to DoT [#8]
-- UPDATE bot_spells_entries SET `type` = 7 WHERE `spell_id` = 738; -- Selo's Consonant Chain [#738] from Slow [#13] to Snare [#7]
-- UPDATE bot_spells_entries SET `type` = 7 WHERE `spell_id` = 1751; -- Largo's Assonant Binding [#1751] from Slow [#13] to Snare [#7]
-- UPDATE bot_spells_entries SET `type` = 7 WHERE `spell_id` = 738; -- Selo's Consonant Chain [#738] from Slow [#13] to Snare [#7]
)"
},
ManifestEntry{
.version = 9050,
.description = "2024_11_26_add_commanded_spelltypes.sql",
.check = "SELECT * FROM `bot_spells_entries` where `type` = 100",
.condition = "empty",
.match = "",
.sql = R"(
INSERT INTO `bot_spells_entries` (`npc_spells_id`, `spell_id`, `type`, `minlevel`, `maxlevel`)
VALUES
(3006, 9957, 100, 20, 254),
(3006, 9956, 100, 20, 254),
(3006, 552, 100, 25, 254),
(3006, 550, 100, 25, 254),
(3006, 553, 100, 25, 254),
(3006, 2432, 100, 26, 254),
(3006, 2020, 100, 26, 254),
(3006, 551, 100, 27, 254),
(3006, 3792, 100, 28, 254),
(3006, 2419, 100, 29, 254),
(3006, 554, 100, 30, 254),
(3006, 557, 100, 31, 254),
(3006, 1434, 100, 32, 254),
(3006, 555, 100, 32, 254),
(3006, 25898, 100, 32, 254),
(3006, 25904, 100, 32, 254),
(3006, 556, 100, 32, 254),
(3006, 25698, 100, 33, 254),
(3006, 1517, 100, 33, 254),
(3006, 2424, 100, 33, 254),
(3006, 25689, 100, 33, 254),
(3006, 25899, 100, 34, 254),
(3006, 25690, 100, 35, 254),
(3006, 25903, 100, 35, 254),
(3006, 25900, 100, 35, 254),
(3006, 558, 100, 36, 254),
(3006, 2429, 100, 37, 254),
(3006, 1438, 100, 38, 254),
(3006, 3184, 100, 38, 254),
(3006, 25697, 100, 38, 254),
(3006, 25902, 100, 39, 254),
(3006, 25695, 100, 39, 254),
(3006, 25901, 100, 40, 254),
(3006, 25694, 100, 40, 254),
(3006, 1398, 100, 40, 254),
(3006, 25905, 100, 41, 254),
(3006, 25696, 100, 42, 254),
(3006, 1440, 100, 42, 254),
(3006, 25906, 100, 43, 254),
(3006, 25693, 100, 44, 254),
(3006, 25699, 100, 45, 254),
(3006, 24773, 100, 46, 254),
(3006, 8965, 100, 52, 254),
(3006, 24771, 100, 52, 254),
(3006, 8235, 100, 52, 254),
(3006, 24775, 100, 52, 254),
(3006, 4966, 100, 54, 254),
(3006, 6184, 100, 55, 254),
(3006, 5731, 100, 55, 254),
(3006, 24776, 100, 56, 254),
(3006, 25700, 100, 56, 254),
(3006, 25691, 100, 57, 254),
(3006, 24772, 100, 57, 254),
(3006, 25692, 100, 57, 254),
(3006, 11981, 100, 59, 254),
(3006, 9953, 100, 60, 254),
(3006, 9954, 100, 60, 254),
(3006, 11980, 100, 64, 254),
(3006, 6179, 100, 64, 254),
(3006, 24774, 100, 67, 254),
(3006, 9950, 100, 70, 254),
(3006, 9951, 100, 70, 254),
(3006, 15886, 100, 75, 254),
(3006, 15887, 100, 75, 254),
(3006, 21989, 100, 80, 254),
(3006, 20539, 100, 80, 254),
(3006, 21984, 100, 80, 254),
(3006, 20538, 100, 80, 254),
(3006, 17883, 100, 85, 254),
(3006, 17884, 100, 85, 254),
(3006, 28997, 100, 90, 254),
(3006, 28998, 100, 90, 254),
(3006, 29000, 100, 92, 254),
(3006, 29001, 100, 92, 254),
(3006, 34832, 100, 95, 254),
(3006, 40217, 100, 95, 254),
(3006, 34833, 100, 95, 254),
(3006, 40216, 100, 95, 254),
(3012, 10881, 100, 20, 254),
(3012, 10880, 100, 20, 254),
(3012, 562, 100, 25, 254),
(3012, 563, 100, 27, 254),
(3012, 3793, 100, 27, 254),
(3012, 561, 100, 28, 254),
(3012, 2420, 100, 29, 254),
(3012, 2944, 100, 29, 254),
(3012, 564, 100, 32, 254),
(3012, 565, 100, 33, 254),
(3012, 1418, 100, 33, 254),
(3012, 2425, 100, 33, 254),
(3012, 1516, 100, 34, 254),
(3012, 1338, 100, 35, 254),
(3012, 3833, 100, 35, 254),
(3012, 566, 100, 35, 254),
(3012, 1336, 100, 36, 254),
(3012, 2943, 100, 36, 254),
(3012, 1423, 100, 36, 254),
(3012, 567, 100, 36, 254),
(3012, 568, 100, 37, 254),
(3012, 1337, 100, 37, 254),
(3012, 3180, 100, 38, 254),
(3012, 1339, 100, 38, 254),
(3012, 2421, 100, 39, 254),
(3012, 2430, 100, 39, 254),
(3012, 1372, 100, 40, 254),
(3012, 2426, 100, 41, 254),
(3012, 1371, 100, 41, 254),
(3012, 1399, 100, 42, 254),
(3012, 1374, 100, 42, 254),
(3012, 1373, 100, 43, 254),
(3012, 1425, 100, 43, 254),
(3012, 1375, 100, 44, 254),
(3012, 3181, 100, 45, 254),
(3012, 2022, 100, 45, 254),
(3012, 666, 100, 46, 254),
(3012, 3849, 100, 46, 254),
(3012, 674, 100, 46, 254),
(3012, 2023, 100, 46, 254),
(3012, 2024, 100, 47, 254),
(3012, 2025, 100, 48, 254),
(3012, 2431, 100, 49, 254),
(3012, 8966, 100, 51, 254),
(3012, 8236, 100, 51, 254),
(3012, 4965, 100, 54, 254),
(3012, 8969, 100, 55, 254),
(3012, 8239, 100, 55, 254),
(3012, 6183, 100, 55, 254),
(3012, 5732, 100, 55, 254),
(3012, 4964, 100, 57, 254),
(3012, 6182, 100, 58, 254),
(3012, 5735, 100, 60, 254),
(3012, 10877, 100, 60, 254),
(3012, 10878, 100, 60, 254),
(3012, 6178, 100, 64, 254),
(3012, 6177, 100, 67, 254),
(3012, 11984, 100, 69, 254),
(3012, 10874, 100, 70, 254),
(3012, 10875, 100, 70, 254),
(3012, 11983, 100, 74, 254),
(3012, 15889, 100, 75, 254),
(3012, 15890, 100, 75, 254),
(3012, 21988, 100, 80, 254),
(3012, 20542, 100, 80, 254),
(3012, 21985, 100, 80, 254),
(3012, 20541, 100, 80, 254),
(3012, 17886, 100, 85, 254),
(3012, 17887, 100, 85, 254),
(3012, 29840, 100, 90, 254),
(3012, 29841, 100, 90, 254),
(3012, 29843, 100, 92, 254),
(3012, 29844, 100, 92, 254),
(3012, 40443, 100, 95, 254),
(3012, 35715, 100, 95, 254),
(3012, 40442, 100, 95, 254),
(3012, 35714, 100, 95, 254),
(3002, 208, 101, 1, 4),
(3002, 501, 101, 5, 14),
(3002, 47, 101, 15, 35),
(3002, 45, 101, 36, 64),
(3002, 1541, 101, 55, 254),
(3002, 3197, 101, 65, 254),
(3002, 5274, 101, 70, 70),
(3002, 9798, 101, 71, 75),
(3002, 9799, 101, 71, 75),
(3002, 9797, 101, 71, 75),
(3002, 14288, 101, 76, 80),
(3002, 14289, 101, 76, 80),
(3002, 14290, 101, 76, 80),
(3002, 18309, 101, 81, 85),
(3002, 18310, 101, 81, 85),
(3002, 18311, 101, 81, 85),
(3002, 25103, 101, 86, 90),
(3002, 25101, 101, 86, 90),
(3002, 25102, 101, 86, 90),
(3002, 28102, 101, 91, 95),
(3002, 28100, 101, 91, 95),
(3002, 28101, 101, 91, 95),
(3002, 34096, 101, 96, 254),
(3002, 34094, 101, 96, 254),
(3002, 34095, 101, 96, 254),
(3003, 208, 101, 10, 24),
(3003, 501, 101, 25, 42),
(3003, 47, 101, 43, 48),
(3003, 45, 101, 49, 254),
(3003, 25294, 101, 86, 90),
(3003, 25295, 101, 86, 90),
(3003, 25296, 101, 86, 90),
(3003, 28340, 101, 91, 95),
(3003, 28338, 101, 91, 95),
(3003, 28339, 101, 91, 95),
(3003, 34346, 101, 96, 254),
(3003, 34344, 101, 96, 254),
(3003, 34345, 101, 96, 254),
(3004, 240, 101, 4, 30),
(3004, 250, 101, 22, 254),
(3004, 513, 101, 31, 254),
(3004, 3601, 101, 39, 254),
(3004, 5316, 101, 68, 70),
(3004, 10112, 101, 71, 75),
(3004, 10110, 101, 71, 75),
(3004, 10111, 101, 71, 75),
(3004, 15037, 101, 76, 80),
(3004, 15035, 101, 76, 80),
(3004, 15036, 101, 76, 80),
(3004, 19168, 101, 81, 85),
(3004, 19169, 101, 81, 85),
(3004, 19167, 101, 81, 85),
(3004, 25417, 101, 86, 87),
(3004, 25418, 101, 86, 90),
(3004, 25419, 101, 86, 90),
(3004, 25466, 101, 88, 90),
(3004, 25467, 101, 88, 90),
(3004, 25465, 101, 88, 90),
(3004, 28479, 101, 91, 92),
(3004, 28480, 101, 91, 95),
(3004, 28481, 101, 91, 95),
(3004, 28542, 101, 93, 95),
(3004, 28543, 101, 93, 95),
(3004, 28544, 101, 93, 95),
(3004, 34500, 101, 96, 97),
(3004, 34502, 101, 96, 254),
(3004, 34501, 101, 96, 254),
(3004, 34565, 101, 98, 254),
(3004, 34563, 101, 98, 254),
(3004, 34564, 101, 98, 254),
(3005, 347, 101, 9, 51),
(3005, 448, 101, 52, 254),
(3006, 240, 101, 1, 14),
(3006, 250, 101, 5, 254),
(3006, 513, 101, 15, 254),
(3006, 3601, 101, 29, 254),
(3006, 5347, 101, 67, 70),
(3006, 9851, 101, 71, 75),
(3006, 9852, 101, 71, 75),
(3006, 9853, 101, 71, 75),
(3006, 14369, 101, 76, 80),
(3006, 14367, 101, 76, 80),
(3006, 14368, 101, 76, 80),
(3006, 18409, 101, 81, 85),
(3006, 18407, 101, 81, 85),
(3006, 18408, 101, 81, 85),
(3006, 25736, 101, 86, 90),
(3006, 25734, 101, 86, 90),
(3006, 25735, 101, 86, 90),
(3006, 28831, 101, 91, 95),
(3006, 28832, 101, 91, 95),
(3006, 28830, 101, 91, 95),
(3006, 34863, 101, 96, 254),
(3006, 34864, 101, 96, 254),
(3006, 34862, 101, 96, 254),
(3007, 4614, 101, 35, 49),
(3007, 4683, 101, 50, 56),
(3007, 4684, 101, 57, 63),
(3007, 4698, 101, 64, 64),
(3007, 5019, 101, 65, 254),
(3007, 5020, 101, 65, 254),
(3007, 6175, 101, 69, 70),
(3007, 10949, 101, 71, 75),
(3007, 10947, 101, 71, 75),
(3007, 10948, 101, 71, 75),
(3007, 14800, 101, 76, 80),
(3007, 14801, 101, 76, 80),
(3007, 14799, 101, 76, 80),
(3007, 18905, 101, 81, 85),
(3007, 18906, 101, 81, 85),
(3007, 18904, 101, 81, 85),
(3007, 25912, 101, 86, 90),
(3007, 25913, 101, 86, 90),
(3007, 25911, 101, 86, 90),
(3007, 29006, 101, 91, 95),
(3007, 29007, 101, 91, 95),
(3007, 29008, 101, 91, 95),
(3007, 35047, 101, 96, 254),
(3007, 35048, 101, 96, 254),
(3007, 35049, 101, 96, 254),
(3008, 728, 101, 8, 60),
(3008, 3361, 101, 61, 254),
(3008, 5370, 101, 66, 70),
(3008, 10403, 101, 71, 75),
(3008, 10401, 101, 71, 75),
(3008, 10402, 101, 71, 75),
(3008, 14002, 101, 76, 80),
(3008, 14000, 101, 76, 80),
(3008, 14001, 101, 76, 80),
(3008, 18001, 101, 81, 85),
(3008, 18002, 101, 81, 85),
(3008, 18000, 101, 81, 85),
(3008, 25978, 101, 86, 90),
(3008, 25979, 101, 86, 90),
(3008, 25977, 101, 86, 90),
(3008, 29079, 101, 91, 95),
(3008, 29080, 101, 91, 95),
(3008, 29078, 101, 91, 95),
(3008, 35131, 101, 96, 254),
(3008, 35132, 101, 96, 254),
(3008, 35133, 101, 96, 254),
(3011, 347, 101, 2, 22),
(3011, 448, 101, 23, 254),
(3014, 208, 101, 1, 5),
(3014, 501, 101, 6, 17),
(3014, 47, 101, 18, 34),
(3014, 45, 101, 35, 61),
(3014, 1541, 101, 51, 254),
(3014, 3197, 101, 62, 254),
(3014, 5506, 101, 67, 71),
(3014, 10601, 101, 72, 76),
(3014, 10599, 101, 72, 76),
(3014, 10600, 101, 72, 76),
(3014, 14510, 101, 77, 81),
(3014, 14511, 101, 77, 81),
(3014, 14509, 101, 77, 81),
(3014, 18568, 101, 82, 86),
(3014, 18569, 101, 82, 86),
(3014, 18567, 101, 82, 86),
(3014, 26921, 101, 87, 91),
(3014, 26922, 101, 87, 91),
(3014, 26920, 101, 87, 91),
(3014, 30054, 101, 92, 96),
(3014, 30055, 101, 92, 96),
(3014, 30056, 101, 92, 96),
(3014, 36116, 101, 97, 254),
(3014, 36117, 101, 97, 254),
(3014, 36118, 101, 97, 254),
(3006, 2183, 102, 18, 56),
(3006, 1567, 102, 57, 254),
(3012, 2184, 102, 18, 56),
(3012, 2558, 102, 56, 64),
(3012, 1628, 102, 57, 254),
(3012, 3244, 102, 65, 254),
(3002, 35, 103, 10, 254),
(3006, 35, 103, 12, 254),
(3010, 35, 103, 14, 254),
(3011, 35, 103, 12, 254),
(3012, 35, 103, 12, 254),
(3013, 35, 103, 12, 254),
(3014, 35, 103, 12, 254),
(3008, 737, 104, 14, 254),
(3011, 305, 104, 17, 254),
(3012, 305, 104, 14, 254),
(3013, 305, 104, 13, 254),
(3014, 305, 104, 15, 254),
(3004, 261, 105, 35, 64),
(3004, 2517, 105, 65, 254),
(3006, 261, 105, 14, 49),
(3006, 2894, 105, 50, 53),
(3006, 2517, 105, 54, 254),
(3006, 3185, 105, 62, 254),
(3008, 718, 105, 31, 50),
(3008, 1750, 105, 51, 254),
(3010, 261, 105, 10, 50),
(3010, 2894, 105, 51, 254),
(3011, 457, 105, 41, 254),
(3011, 1391, 105, 45, 254),
(3012, 261, 105, 22, 49),
(3012, 2894, 105, 50, 254),
(3014, 261, 105, 15, 50),
(3014, 2894, 105, 51, 254),
(3015, 261, 105, 32, 254),
(3003, 1743, 106, 55, 254),
(3008, 714, 106, 41, 254),
(3008, 748, 106, 47, 57),
(3008, 1450, 106, 49, 254),
(3008, 1752, 106, 52, 254),
(3008, 1763, 106, 58, 72),
(3008, 11881, 106, 73, 77),
(3008, 11879, 106, 73, 77),
(3008, 11880, 106, 73, 77),
(3008, 14055, 106, 78, 82),
(3008, 14056, 106, 78, 82),
(3008, 14054, 106, 78, 82),
(3008, 18040, 106, 83, 87),
(3008, 18041, 106, 83, 87),
(3008, 18039, 106, 83, 87),
(3008, 26026, 106, 88, 92),
(3008, 26027, 106, 88, 92),
(3008, 26025, 106, 88, 92),
(3008, 29120, 106, 93, 97),
(3008, 29121, 106, 93, 97),
(3008, 29122, 106, 93, 97),
(3008, 35170, 106, 98, 254),
(3008, 35171, 106, 98, 254),
(3008, 35172, 106, 98, 254),
(3012, 2559, 106, 58, 254),
(3014, 481, 106, 13, 21),
(3014, 21, 106, 19, 21),
(3014, 482, 106, 22, 32),
(3014, 483, 106, 33, 39),
(3014, 648, 106, 38, 39),
(3014, 484, 106, 40, 57),
(3014, 176, 106, 47, 57),
(3014, 1689, 106, 52, 57),
(3014, 1713, 106, 58, 60),
(3014, 3343, 106, 61, 66),
(3014, 6739, 106, 61, 68),
(3014, 3351, 106, 63, 66),
(3014, 5504, 106, 67, 70),
(3014, 5514, 106, 69, 70),
(3014, 6671, 106, 69, 254),
(3014, 10598, 106, 71, 75),
(3014, 10596, 106, 71, 75),
(3014, 10597, 106, 71, 75),
(3014, 10643, 106, 74, 75),
(3014, 10641, 106, 74, 75),
(3014, 10642, 106, 74, 75),
(3014, 11887, 106, 74, 78),
(3014, 11885, 106, 74, 78),
(3014, 11886, 106, 74, 78),
(3014, 14507, 106, 76, 80),
(3014, 14508, 106, 76, 80),
(3014, 14506, 106, 76, 80),
(3014, 14543, 106, 79, 80),
(3014, 14544, 106, 79, 80),
(3014, 14542, 106, 79, 80),
(3014, 14582, 106, 79, 83),
(3014, 14583, 106, 79, 83),
(3014, 14581, 106, 79, 83),
(3014, 18564, 106, 81, 85),
(3014, 18565, 106, 81, 85),
(3014, 18566, 106, 81, 85),
(3014, 18600, 106, 84, 85),
(3014, 18601, 106, 84, 85),
(3014, 18602, 106, 84, 85),
(3014, 18641, 106, 84, 88),
(3014, 18639, 106, 84, 88),
(3014, 18640, 106, 84, 88),
(3014, 26901, 106, 86, 90),
(3014, 26899, 106, 86, 90),
(3014, 26900, 106, 86, 90),
(3014, 26999, 106, 89, 90),
(3014, 26997, 106, 89, 90),
(3014, 26998, 106, 89, 90),
(3014, 27025, 106, 89, 93),
(3014, 27026, 106, 89, 93),
(3014, 27024, 106, 89, 93),
(3014, 30028, 106, 91, 95),
(3014, 30029, 106, 91, 95),
(3014, 30027, 106, 91, 95),
(3014, 30132, 106, 93, 95),
(3014, 30133, 106, 93, 95),
(3014, 30131, 106, 93, 95),
(3014, 30140, 106, 94, 95),
(3014, 30141, 106, 94, 95),
(3014, 30142, 106, 94, 95),
(3014, 30167, 106, 94, 98),
(3014, 30168, 106, 94, 98),
(3014, 30169, 106, 94, 98),
(3014, 36091, 106, 96, 254),
(3014, 36089, 106, 96, 254),
(3014, 36090, 106, 96, 254),
(3014, 36189, 106, 98, 254),
(3014, 36187, 106, 98, 254),
(3014, 36188, 106, 98, 254),
(3014, 36216, 106, 99, 254),
(3014, 36196, 106, 99, 254),
(3014, 36217, 106, 99, 254),
(3014, 36194, 106, 99, 254),
(3014, 36215, 106, 99, 254),
(3014, 36195, 106, 99, 254),
(3004, 86, 107, 20, 254),
(3006, 86, 107, 6, 49),
(3006, 2881, 107, 50, 254),
(3008, 729, 107, 16, 254),
(3010, 86, 107, 12, 50),
(3010, 2881, 107, 51, 254),
(3011, 457, 107, 41, 254),
(3011, 1391, 107, 45, 254),
(3014, 86, 107, 12, 43),
(3014, 3696, 107, 44, 50),
(3014, 2881, 107, 51, 254),
(3015, 86, 107, 25, 254),
(3010, 345, 108, 15, 254),
(3010, 2522, 108, 16, 254),
(3015, 345, 108, 23, 254),
(3002, 235, 109, 11, 254),
(3002, 1726, 109, 51, 254),
(3002, 6125, 109, 66, 254),
(3002, 14348, 109, 77, 81),
(3002, 14346, 109, 77, 81),
(3002, 14347, 109, 77, 81),
(3002, 18369, 109, 82, 254),
(3002, 18367, 109, 82, 254),
(3002, 18368, 109, 82, 254),
(3003, 235, 109, 17, 254),
(3004, 247, 109, 14, 46),
(3004, 80, 109, 32, 64),
(3004, 34, 109, 47, 254),
(3004, 2517, 109, 65, 254),
(3005, 235, 109, 4, 254),
(3006, 247, 109, 4, 17),
(3006, 255, 109, 8, 254),
(3006, 80, 109, 13, 53),
(3006, 34, 109, 18, 254),
(3006, 2516, 109, 52, 254),
(3006, 4058, 109, 52, 254),
(3006, 2517, 109, 54, 254),
(3006, 3185, 109, 62, 254),
(3006, 6123, 109, 68, 254),
(3008, 719, 109, 19, 50),
(3008, 735, 109, 24, 254),
(3008, 1750, 109, 51, 254),
(3010, 79, 109, 7, 55),
(3010, 255, 109, 10, 254),
(3010, 42, 109, 27, 254),
(3010, 1575, 109, 56, 254),
(3010, 2886, 109, 58, 254),
(3011, 235, 109, 1, 254),
(3011, 457, 109, 41, 254),
(3011, 1391, 109, 45, 254),
(3011, 6124, 109, 68, 254),
(3012, 80, 109, 4, 39),
(3012, 42, 109, 16, 254),
(3012, 3811, 109, 40, 254),
(3012, 6120, 109, 67, 254),
(3012, 15513, 109, 76, 80),
(3012, 15511, 109, 76, 80),
(3012, 15512, 109, 76, 80),
(3012, 19701, 109, 81, 254),
(3012, 19699, 109, 81, 254),
(3012, 19700, 109, 81, 254),
(3013, 42, 109, 8, 254),
(3013, 80, 109, 16, 254),
(3014, 42, 109, 4, 254),
(3014, 80, 109, 6, 43),
(3014, 235, 109, 14, 254),
(3014, 3696, 109, 44, 254),
(3014, 6122, 109, 66, 254),
(3015, 79, 109, 29, 64),
(3015, 42, 109, 43, 254),
(3015, 1575, 109, 65, 254),
(3004, 278, 110, 28, 64),
(3004, 4054, 110, 41, 64),
(3004, 4055, 110, 49, 254),
(3004, 2517, 110, 65, 254),
(3006, 278, 110, 10, 53),
(3006, 424, 110, 26, 254),
(3006, 4054, 110, 30, 53),
(3006, 169, 110, 35, 61),
(3006, 4055, 110, 35, 254),
(3006, 3579, 110, 45, 254),
(3006, 4058, 110, 52, 254),
(3006, 1554, 110, 53, 254),
(3006, 2517, 110, 54, 254),
(3006, 3185, 110, 62, 254),
(3008, 717, 110, 5, 48),
(3008, 4395, 110, 25, 48),
(3008, 2605, 110, 49, 50),
(3008, 1750, 110, 51, 254),
(3010, 278, 110, 9, 254),
(3010, 424, 110, 22, 254),
(3010, 4054, 110, 29, 254),
(3010, 4055, 110, 34, 254),
(3010, 2524, 110, 36, 254),
(3010, 1554, 110, 52, 254),
(3015, 278, 110, 24, 254),
(3015, 4054, 110, 39, 254),
(3015, 4055, 110, 44, 254),
(3012, 1422, 111, 50, 254),
(3012, 1334, 111, 52, 254),
(3005, 2213, 112, 12, 34),
(3005, 3, 112, 35, 56),
(3005, 1773, 112, 57, 70),
(3005, 10042, 112, 71, 75),
(3005, 14823, 112, 76, 80),
(3005, 18928, 112, 81, 85),
(3005, 25555, 112, 86, 90),
(3005, 28632, 112, 91, 95),
(3005, 34662, 112, 96, 254),
(3011, 2213, 112, 12, 34),
(3011, 3, 112, 35, 56),
(3011, 1773, 112, 57, 70),
(3011, 10042, 112, 71, 75),
(3011, 14823, 112, 76, 80),
(3011, 18928, 112, 81, 85),
(3011, 25555, 112, 86, 90),
(3011, 28632, 112, 91, 95),
(3011, 34662, 112, 96, 254);
)"
}
// -- template; copy/paste this when you need to create a new entry
+4
View File
@@ -871,6 +871,10 @@ RULE_INT(Bots, DefaultFollowDistance, 20, "Default 20. Distance a bot will follo
RULE_INT(Bots, MaxFollowDistance, 300, "Default 300. Max distance a bot can be set to follow behind.")
RULE_INT(Bots, MaxDistanceRanged, 300, "Default 300. Max distance a bot can be set to ranged.")
RULE_BOOL(Bots, AllowAIMez, true, "If enabled bots will automatically mez/AE mez eligible targets.")
RULE_BOOL(Bots, AllowCommandedCharm, true, "If enabled bots can be commanded to charm NPCs.")
RULE_BOOL(Bots, AllowCommandedMez, true, "If enabled bots can be commanded to mez NPCs.")
RULE_BOOL(Bots, AllowCommandedResurrect, true, "If enabled bots can be commanded to resurrect players.")
RULE_BOOL(Bots, AllowCommandedSummonCorpse, true, "If enabled bots can be commanded to summon other's corpses.")
RULE_INT(Bots, CampTimer, 25, "Number of seconds after /camp has begun before bots camp out.")
RULE_BOOL(Bots, SendClassRaceOnHelp, true, "If enabled a reminder of how to check class/race IDs will be sent when using compatible commands.")
RULE_CATEGORY_END()
+57
View File
@@ -2842,6 +2842,7 @@ bool BOT_SPELL_TYPES_DETRIMENTAL(uint16 spellType, uint8 cls) {
case BotSpellTypes::AEDoT:
case BotSpellTypes::AELifetap:
case BotSpellTypes::PBAENuke:
case BotSpellTypes::Lull:
return true;
case BotSpellTypes::InCombatBuff:
if (cls == Class::ShadowKnight) {
@@ -2885,6 +2886,18 @@ bool BOT_SPELL_TYPES_BENEFICIAL(uint16 spellType, uint8 cls) {
case BotSpellTypes::PetResistBuffs:
case BotSpellTypes::ResistBuffs:
case BotSpellTypes::Resurrect:
case BotSpellTypes::Teleport:
case BotSpellTypes::Succor:
case BotSpellTypes::BindAffinity:
case BotSpellTypes::Identify:
case BotSpellTypes::Levitate:
case BotSpellTypes::Rune:
case BotSpellTypes::WaterBreathing:
case BotSpellTypes::Size:
case BotSpellTypes::Invisibility:
case BotSpellTypes::MovementSpeed:
case BotSpellTypes::SendHome:
case BotSpellTypes::SummonCorpse:
return true;
case BotSpellTypes::InCombatBuff:
if (cls == Class::ShadowKnight) {
@@ -2922,6 +2935,18 @@ bool BOT_SPELL_TYPES_OTHER_BENEFICIAL(uint16 spellType) {
case BotSpellTypes::PetBuffs:
case BotSpellTypes::ResistBuffs:
case BotSpellTypes::PetResistBuffs:
case BotSpellTypes::Teleport:
case BotSpellTypes::Succor:
case BotSpellTypes::BindAffinity:
case BotSpellTypes::Identify:
case BotSpellTypes::Levitate:
case BotSpellTypes::Rune:
case BotSpellTypes::WaterBreathing:
case BotSpellTypes::Size:
case BotSpellTypes::Invisibility:
case BotSpellTypes::MovementSpeed:
case BotSpellTypes::SendHome:
case BotSpellTypes::SummonCorpse:
return true;
default:
return false;
@@ -2953,6 +2978,7 @@ bool BOT_SPELL_TYPES_INNATE(uint16 spellType) {
case BotSpellTypes::Stun:
case BotSpellTypes::AEMez:
case BotSpellTypes::Mez:
case BotSpellTypes::Lull:
return true;
default:
return false;
@@ -3234,3 +3260,34 @@ bool IsDamageShieldOnlySpell(uint16 spell_id) {
return true;
}
bool IsCommandedSpellType(uint16 spellType) {
switch (spellType) {
case BotSpellTypes::Lull:
case BotSpellTypes::Teleport:
case BotSpellTypes::Succor:
case BotSpellTypes::BindAffinity:
case BotSpellTypes::Identify:
case BotSpellTypes::Levitate:
case BotSpellTypes::Rune:
case BotSpellTypes::WaterBreathing:
case BotSpellTypes::Size:
case BotSpellTypes::Invisibility:
case BotSpellTypes::MovementSpeed:
case BotSpellTypes::SendHome:
case BotSpellTypes::SummonCorpse:
//case BotSpellTypes::Charm:
//case BotSpellTypes::Resurrect:
//case BotSpellTypes::Cure:
//case BotSpellTypes::GroupCures:
//case BotSpellTypes::DamageShields:
//case BotSpellTypes::PetDamageShields:
//case BotSpellTypes::ResistBuffs:
//case BotSpellTypes::PetResistBuffs:
return true;
default:
return false;
}
return false;
}
+18
View File
@@ -708,9 +708,26 @@ namespace BotSpellTypes
constexpr uint16 ResistBuffs = 52;
constexpr uint16 PetDamageShields = 53;
constexpr uint16 PetResistBuffs = 54;
// Command Spell Types
constexpr uint16 Teleport = 100; // this is handled by ^depart so uses other logic
constexpr uint16 Lull = 101;
constexpr uint16 Succor = 102;
constexpr uint16 BindAffinity = 103;
constexpr uint16 Identify = 104;
constexpr uint16 Levitate = 105;
constexpr uint16 Rune = 106;
constexpr uint16 WaterBreathing = 107;
constexpr uint16 Size = 108;
constexpr uint16 Invisibility = 109;
constexpr uint16 MovementSpeed = 110;
constexpr uint16 SendHome = 111;
constexpr uint16 SummonCorpse = 112;
constexpr uint16 START = BotSpellTypes::Nuke; // Do not remove or change this
constexpr uint16 END = BotSpellTypes::PetResistBuffs; // Do not remove this, increment as needed
constexpr uint16 COMMANDED_START = BotSpellTypes::Lull; // Do not remove or change this
constexpr uint16 COMMANDED_END = BotSpellTypes::SummonCorpse; // Do not remove this, increment as needed
}
const uint32 SPELL_TYPES_DETRIMENTAL = (SpellType_Nuke | SpellType_Root | SpellType_Lifetap | SpellType_Snare | SpellType_DOT | SpellType_Dispel | SpellType_Mez | SpellType_Charm | SpellType_Debuff | SpellType_Slow);
@@ -730,6 +747,7 @@ bool IsClientBotSpellType(uint16 spellType);
bool IsHealBotSpellType(uint16 spellType);
bool SpellTypeRequiresLoS(uint16 spellType, uint16 cls = 0);
bool SpellTypeRequiresTarget(uint16 spellType, uint16 cls = 0);
bool IsCommandedSpellType(uint16 spellType);
// These should not be used to determine spell category..
// They are a graphical affects (effects?) index only
+1 -1
View File
@@ -43,7 +43,7 @@
*/
#define CURRENT_BINARY_DATABASE_VERSION 9284
#define CURRENT_BINARY_BOTS_DATABASE_VERSION 9049 //TODO update as needed
#define CURRENT_BINARY_BOTS_DATABASE_VERSION 9050 //TODO update as needed
#endif
+181
View File
@@ -9538,6 +9538,17 @@ bool Bot::CanCastSpellType(uint16 spellType, uint16 spell_id, Mob* tar) {
case BotSpellTypes::PetDamageShields:
case BotSpellTypes::ResistBuffs:
case BotSpellTypes::PetResistBuffs:
case BotSpellTypes::Teleport:
case BotSpellTypes::Succor:
case BotSpellTypes::BindAffinity:
case BotSpellTypes::Identify:
case BotSpellTypes::Levitate:
case BotSpellTypes::Rune:
case BotSpellTypes::WaterBreathing:
case BotSpellTypes::Size:
case BotSpellTypes::Invisibility:
case BotSpellTypes::MovementSpeed:
case BotSpellTypes::SendHome:
if (
!(
spells[spell_id].target_type == ST_Target ||
@@ -10904,6 +10915,18 @@ uint16 Bot::GetSpellListSpellType(uint16 spellType) {
case BotSpellTypes::PetDamageShields:
case BotSpellTypes::ResistBuffs:
case BotSpellTypes::PetResistBuffs:
case BotSpellTypes::Teleport:
case BotSpellTypes::Succor:
case BotSpellTypes::BindAffinity:
case BotSpellTypes::Identify:
case BotSpellTypes::Levitate:
case BotSpellTypes::Rune:
case BotSpellTypes::WaterBreathing:
case BotSpellTypes::Size:
case BotSpellTypes::Invisibility:
case BotSpellTypes::MovementSpeed:
case BotSpellTypes::SendHome:
case BotSpellTypes::SummonCorpse:
return BotSpellTypes::Buff;
case BotSpellTypes::AEMez:
case BotSpellTypes::Mez:
@@ -10945,6 +10968,7 @@ uint16 Bot::GetSpellListSpellType(uint16 spellType) {
case BotSpellTypes::PreCombatBuff:
case BotSpellTypes::PreCombatBuffSong:
case BotSpellTypes::Resurrect:
case BotSpellTypes::Lull:
default:
return spellType;
}
@@ -11007,6 +11031,84 @@ bool Bot::IsValidSpellTypeBySpellID(uint16 spellType, uint16 spell_id) {
return true;
}
return false;
case BotSpellTypes::Lull:
if (!IsHarmonySpell(spell_id)) {
return true;
}
return false;
case BotSpellTypes::Teleport:
if (IsBeneficialSpell(spell_id) && (IsEffectInSpell(spell_id, SE_Teleport) || IsEffectInSpell(spell_id, SE_Translocate))) {
return true;
}
return false;
case BotSpellTypes::Succor:
if (IsBeneficialSpell(spell_id) && IsEffectInSpell(spell_id, SE_Succor)) {
return true;
}
return false;
case BotSpellTypes::BindAffinity:
if (IsEffectInSpell(spell_id, SE_BindAffinity)) {
return true;
}
return false;
case BotSpellTypes::Identify:
if (IsEffectInSpell(spell_id, SE_Identify)) {
return true;
}
return false;
case BotSpellTypes::Levitate:
if (IsBeneficialSpell(spell_id) && (IsEffectInSpell(spell_id, SE_Levitate))) {
return true;
}
return false;
case BotSpellTypes::Rune:
if (IsEffectInSpell(spell_id, SE_AbsorbMagicAtt) || IsEffectInSpell(spell_id, SE_Rune)) {
return true;
}
return false;
case BotSpellTypes::WaterBreathing:
if (IsEffectInSpell(spell_id, SE_WaterBreathing)) {
return true;
}
return false;
case BotSpellTypes::Size:
if (IsBeneficialSpell(spell_id) && (IsEffectInSpell(spell_id, SE_ModelSize) || IsEffectInSpell(spell_id, SE_ChangeHeight))) {
return true;
}
return false;
case BotSpellTypes::Invisibility:
if (IsEffectInSpell(spell_id, SE_SeeInvis) || IsInvisibleSpell(spell_id)) {
return true;
}
return false;
case BotSpellTypes::MovementSpeed:
if (IsBeneficialSpell(spell_id) && IsEffectInSpell(spell_id, SE_MovementSpeed)) {
return true;
}
return false;
case BotSpellTypes::SendHome:
if (IsBeneficialSpell(spell_id) && IsEffectInSpell(spell_id, SE_GateToHomeCity)) {
return true;
}
return false;
case BotSpellTypes::SummonCorpse:
if (IsEffectInSpell(spell_id, SE_SummonCorpse)) {
return true;
}
return false;
default:
return true;
@@ -11502,3 +11604,82 @@ bool Bot::BotPassiveCheck() {
return false;
}
bool Bot::IsValidSpellTypeSubType(uint16 spellType, uint16 subType, uint16 spell_id) {
if (subType == UINT16_MAX) {
return true;
}
switch (subType) {
case CommandedSubTypes::SingleTarget:
if (!IsAnyAESpell(spell_id) && !IsGroupSpell(spell_id)) {
return true;
}
break;
case CommandedSubTypes::GroupTarget:
if (IsGroupSpell(spell_id)) {
return true;
}
break;
case CommandedSubTypes::AETarget:
if (IsAnyAESpell(spell_id)) {
return true;
}
break;
case CommandedSubTypes::SeeInvis:
if (IsEffectInSpell(spell_id, SE_SeeInvis)) {
return true;
}
break;
case CommandedSubTypes::Invis:
if (IsEffectInSpell(spell_id, SE_Invisibility) || IsEffectInSpell(spell_id, SE_Invisibility2)) {
return true;
}
break;
case CommandedSubTypes::InvisUndead:
if (IsEffectInSpell(spell_id, SE_InvisVsUndead) || IsEffectInSpell(spell_id, SE_InvisVsUndead2)) {
return true;
}
break;
case CommandedSubTypes::InvisAnimals:
if (IsEffectInSpell(spell_id, SE_InvisVsAnimals) || IsEffectInSpell(spell_id, SE_ImprovedInvisAnimals)) {
return true;
}
break;
case CommandedSubTypes::Shrink:
if (
(IsEffectInSpell(spell_id, SE_ModelSize) && CalcSpellEffectValue(spell_id, GetSpellEffectIndex(spell_id, SE_ModelSize), GetLevel()) < 100) ||
(IsEffectInSpell(spell_id, SE_ChangeHeight) && CalcSpellEffectValue(spell_id, GetSpellEffectIndex(spell_id, SE_ChangeHeight), GetLevel()) < 100)
) {
return true;
}
break;
case CommandedSubTypes::Grow:
if (
(IsEffectInSpell(spell_id, SE_ModelSize) && CalcSpellEffectValue(spell_id, GetSpellEffectIndex(spell_id, SE_ModelSize), GetLevel()) > 100) ||
(IsEffectInSpell(spell_id, SE_ChangeHeight) && CalcSpellEffectValue(spell_id, GetSpellEffectIndex(spell_id, SE_ChangeHeight), GetLevel()) > 100)
) {
return true;
}
break;
case CommandedSubTypes::Selo:
if (IsBeneficialSpell(spell_id) && IsEffectInSpell(spell_id, SE_MovementSpeed) && IsBardSong(spell_id)) {
return true;
}
break;
default:
break;
}
return false;
}
+16 -2
View File
@@ -147,6 +147,19 @@ namespace BotBaseSettings {
constexpr uint16 END = BotBaseSettings::ManaWhenToMed; // Increment as needed
};
namespace CommandedSubTypes {
constexpr uint16 SingleTarget = 1;
constexpr uint16 GroupTarget = 2;
constexpr uint16 AETarget = 3;
constexpr uint16 SeeInvis = 4;
constexpr uint16 Invis = 5;
constexpr uint16 InvisUndead = 6;
constexpr uint16 InvisAnimals = 7;
constexpr uint16 Shrink = 8;
constexpr uint16 Grow = 9;
constexpr uint16 Selo = 10;
};
class Bot : public NPC {
friend class Mob;
public:
@@ -387,7 +400,7 @@ public:
void AI_Bot_Event_SpellCastFinished(bool iCastSucceeded, uint16 slot);
// AI Methods
bool AICastSpell(Mob* tar, uint8 iChance, uint16 spellType);
bool AICastSpell(Mob* tar, uint8 iChance, uint16 spellType, uint16 subTargetType = UINT16_MAX, uint16 subType = UINT16_MAX);
bool AttemptAICastSpell(uint16 spellType);
bool AI_EngagedCastCheck() override;
bool AI_PursueCastCheck() override;
@@ -523,6 +536,7 @@ public:
bool IsValidSpellTypeBySpellID(uint16 spellType, uint16 spell_id);
inline uint16 GetCastedSpellType() const { return _castedSpellType; }
void SetCastedSpellType(uint16 spellType);
bool IsValidSpellTypeSubType(uint16 spellType, uint16 subType, uint16 spell_id);
bool HasValidAETarget(Bot* botCaster, uint16 spell_id, uint16 spellType, Mob* tar);
@@ -577,7 +591,7 @@ public:
static std::list<BotSpell> GetBotSpellsForSpellEffect(Bot* botCaster, uint16 spellType, int spellEffect);
static std::list<BotSpell> GetBotSpellsForSpellEffectAndTargetType(Bot* botCaster, uint16 spellType, int spellEffect, SpellTargetType targetType);
static std::list<BotSpell> GetBotSpellsBySpellType(Bot* botCaster, uint16 spellType);
static std::list<BotSpell_wPriority> GetPrioritizedBotSpellsBySpellType(Bot* botCaster, uint16 spellType, Mob* tar, bool AE = false);
static std::list<BotSpell_wPriority> GetPrioritizedBotSpellsBySpellType(Bot* botCaster, uint16 spellType, Mob* tar, bool AE = false, uint16 subTargetType = UINT16_MAX, uint16 subType = UINT16_MAX);
static BotSpell GetFirstBotSpellBySpellType(Bot* botCaster, uint16 spellType);
static BotSpell GetBestBotSpellForVeryFastHeal(Bot* botCaster, Mob* tar, uint16 spellType = BotSpellTypes::RegularHeal);
+4 -34
View File
@@ -1251,7 +1251,6 @@ int bot_command_init(void)
bot_command_add("applypoison", "Applies cursor-held poison to a rogue bot's weapon", AccountStatus::Player, bot_command_apply_poison) ||
bot_command_add("attack", "Orders bots to attack a designated target", AccountStatus::Player, bot_command_attack) ||
bot_command_add("behindmob", "Toggles whether or not your bot tries to stay behind a mob", AccountStatus::Player, bot_command_behind_mob) ||
bot_command_add("bindaffinity", "Orders a bot to attempt an affinity binding", AccountStatus::Player, bot_command_bind_affinity) ||
bot_command_add("bot", "Lists the available bot management [subcommands]", AccountStatus::Player, bot_command_bot) ||
bot_command_add("botappearance", "Lists the available bot appearance [subcommands]", AccountStatus::Player, bot_command_appearance) ||
bot_command_add("botbeardcolor", "Changes the beard color of a bot", AccountStatus::Player, bot_command_beard_color) ||
@@ -1286,16 +1285,13 @@ int bot_command_init(void)
bot_command_add("botwoad", "Changes the Barbarian woad of a bot", AccountStatus::Player, bot_command_woad) ||
bot_command_add("cast", "Tells the first found specified bot to cast the given spell type", AccountStatus::Player, bot_command_cast) ||
bot_command_add("distanceranged", "Controls the range casters and ranged will try to stay away from a mob", AccountStatus::Player, bot_command_distance_ranged) ||
bot_command_add("charm", "Attempts to have a bot charm your target", AccountStatus::Player, bot_command_charm) ||
bot_command_add("classracelist", "Lists the classes and races and their appropriate IDs", AccountStatus::Player, bot_command_class_race_list) ||
bot_command_add("clickitem", "Orders your targeted bot to click the item in the provided inventory slot.", AccountStatus::Player, bot_command_click_item) ||
bot_command_add("copysettings", "Copies settings from one bot to another", AccountStatus::Player, bot_command_copy_settings) ||
bot_command_add("cure", "Orders a bot to remove any ailments", AccountStatus::Player, bot_command_cure) ||
bot_command_add("defaultsettings", "Restores a bot back to default settings", AccountStatus::Player, bot_command_default_settings) ||
bot_command_add("defensive", "Orders a bot to use a defensive discipline", AccountStatus::Player, bot_command_defensive) ||
bot_command_add("depart", "Orders a bot to open a magical doorway to a specified destination", AccountStatus::Player, bot_command_depart) ||
bot_command_add("depart", "Orders a bot to open a magical doorway to a specified destination", AccountStatus::Player, bot_command_depart) || //TODO bot rewrite - deleteme
bot_command_add("enforcespellsettings", "Toggles your Bot to cast only spells in their spell settings list.", AccountStatus::Player, bot_command_enforce_spell_list) ||
bot_command_add("escape", "Orders a bot to send a target group to a safe location within the zone", AccountStatus::Player, bot_command_escape) ||
bot_command_add("findaliases", "Find available aliases for a bot command", AccountStatus::Player, bot_command_find_aliases) ||
bot_command_add("follow", "Orders bots to follow a designated target (option 'chain' auto-links eligible spawned bots)", AccountStatus::Player, bot_command_follow) ||
bot_command_add("guard", "Orders bots to guard their current positions", AccountStatus::Player, bot_command_guard) ||
@@ -1322,20 +1318,15 @@ int bot_command_init(void)
bot_command_add("healrotationstop", "Stops a heal rotation", AccountStatus::Player, bot_command_heal_rotation_stop) ||
bot_command_add("help", "List available commands and their description - specify partial command as argument to search", AccountStatus::Player, bot_command_help) ||
bot_command_add("hold", "Prevents a bot from attacking until released", AccountStatus::Player, bot_command_hold) ||
bot_command_add("identify", "Orders a bot to cast an item identification spell", AccountStatus::Player, bot_command_identify) ||
bot_command_add("illusionblock", "Control whether or not illusion effects will land on the bot if casted by another player or bot", AccountStatus::Player, bot_command_illusion_block) ||
bot_command_add("inventory", "Lists the available bot inventory [subcommands]", AccountStatus::Player, bot_command_inventory) ||
bot_command_add("inventorygive", "Gives the item on your cursor to a bot", AccountStatus::Player, bot_command_inventory_give) ||
bot_command_add("inventorylist", "Lists all items in a bot's inventory", AccountStatus::Player, bot_command_inventory_list) ||
bot_command_add("inventoryremove", "Removes an item from a bot's inventory", AccountStatus::Player, bot_command_inventory_remove) ||
bot_command_add("inventorywindow", "Displays all items in a bot's inventory in a pop-up window", AccountStatus::Player, bot_command_inventory_window) ||
bot_command_add("invisibility", "Orders a bot to cast a cloak of invisibility, or allow them to be seen", AccountStatus::Player, bot_command_invisibility) ||
bot_command_add("itemuse", "Elicits a report from spawned bots that can use the item on your cursor (option 'empty' yields only empty slots)", AccountStatus::Player, bot_command_item_use) ||
bot_command_add("levitation", "Orders a bot to cast a levitation spell", AccountStatus::Player, bot_command_levitation) ||
bot_command_add("lull", "Orders a bot to cast a pacification spell", AccountStatus::Player, bot_command_lull) ||
bot_command_add("lull", "Orders a bot to cast a pacification spell", AccountStatus::Player, bot_command_lull) || //TODO bot rewrite - IMPLEMENT
bot_command_add("maxmeleerange", "Toggles whether your bot is at max melee range or not. This will disable all special abilities, including taunt.", AccountStatus::Player, bot_command_max_melee_range) ||
bot_command_add("mesmerize", "Orders a bot to cast a mesmerization spell", AccountStatus::Player, bot_command_mesmerize) ||
bot_command_add("movementspeed", "Orders a bot to cast a movement speed enhancement spell", AccountStatus::Player, bot_command_movement_speed) ||
bot_command_add("owneroption", "Sets options available to bot owners", AccountStatus::Player, bot_command_owner_option) ||
bot_command_add("pet", "Lists the available bot pet [subcommands]", AccountStatus::Player, bot_command_pet) ||
bot_command_add("petgetlost", "Orders a bot to remove its summoned pet", AccountStatus::Player, bot_command_pet_get_lost) ||
@@ -1346,14 +1337,9 @@ int bot_command_init(void)
bot_command_add("precombat", "Sets flag used to determine pre-combat behavior", AccountStatus::Player, bot_command_precombat) ||
bot_command_add("pull", "Orders a designated bot to 'pull' an enemy", AccountStatus::Player, bot_command_pull) ||
bot_command_add("release", "Releases a suspended bot's AI processing (with hate list wipe)", AccountStatus::Player, bot_command_release) ||
bot_command_add("resistance", "Orders a bot to cast a specified resistance buff", AccountStatus::Player, bot_command_resistance) ||
bot_command_add("resurrect", "Orders a bot to resurrect a player's (players') corpse(s)", AccountStatus::Player, bot_command_resurrect) ||
bot_command_add("rune", "Orders a bot to cast a rune of protection", AccountStatus::Player, bot_command_rune) ||
bot_command_add("sendhome", "Orders a bot to open a magical doorway home", AccountStatus::Player, bot_command_send_home) ||
bot_command_add("sithppercent", "HP threshold for a bot to start sitting in combat if allowed", AccountStatus::Player, bot_command_sit_hp_percent) ||
bot_command_add("sitincombat", "Toggles whether or a not a bot will attempt to med or sit to heal in combat", AccountStatus::Player, bot_command_sit_in_combat) ||
bot_command_add("sitmanapercent", "Mana threshold for a bot to start sitting in combat if allowed", AccountStatus::Player, bot_command_sit_mana_percent) ||
bot_command_add("size", "Orders a bot to change a player's size", AccountStatus::Player, bot_command_size) ||
bot_command_add("spellaggrochecks", "Toggles whether or not bots will cast a spell type if they think it will get them aggro", AccountStatus::Player, bot_command_spell_aggro_checks) ||
bot_command_add("spellengagedpriority", "Controls the order of casts by spell type when engaged in combat", AccountStatus::Player, bot_command_spell_engaged_priority) ||
bot_command_add("spelldelays", "Controls the delay between casts for a specific spell type", AccountStatus::Player, bot_command_spell_delays) ||
@@ -1374,15 +1360,14 @@ int bot_command_init(void)
bot_command_add("spellsettingsdelete", "Delete a bot spell setting entry", AccountStatus::Player, bot_command_spell_settings_delete) ||
bot_command_add("spellsettingstoggle", "Toggle a bot spell use", AccountStatus::Player, bot_command_spell_settings_toggle) ||
bot_command_add("spellsettingsupdate", "Update a bot spell setting entry", AccountStatus::Player, bot_command_spell_settings_update) ||
bot_command_add("summoncorpse", "Orders a bot to summon a corpse to its feet", AccountStatus::Player, bot_command_summon_corpse) ||
bot_command_add("spelltypeids", "Lists spelltypes by ID", AccountStatus::Player, bot_command_spelltype_ids) ||
bot_command_add("spelltypenames", "Lists spelltypes by shortname", AccountStatus::Player, bot_command_spelltype_names) ||
bot_command_add("summoncorpse", "Orders a bot to summon a corpse to its feet", AccountStatus::Player, bot_command_summon_corpse) || //TODO bot rewrite - IMPLEMENT
bot_command_add("suspend", "Suspends a bot's AI processing until released", AccountStatus::Player, bot_command_suspend) ||
bot_command_add("taunt", "Toggles taunt use by a bot", AccountStatus::Player, bot_command_taunt) ||
bot_command_add("timer", "Checks or clears timers of the chosen type.", AccountStatus::GMMgmt, bot_command_timer) ||
bot_command_add("track", "Orders a capable bot to track enemies", AccountStatus::Player, bot_command_track) ||
bot_command_add("viewcombos", "Views bot race class combinations", AccountStatus::Player, bot_command_view_combos) ||
bot_command_add("waterbreathing", "Orders a bot to cast a water breathing spell", AccountStatus::Player, bot_command_water_breathing)
bot_command_add("viewcombos", "Views bot race class combinations", AccountStatus::Player, bot_command_view_combos)
) {
bot_command_deinit();
return -1;
@@ -2266,36 +2251,27 @@ void SendSpellTypeWindow(Client *c, const Seperator* sep) {
#include "bot_commands/apply_potion.cpp"
#include "bot_commands/attack.cpp"
#include "bot_commands/behind_mob.cpp"
#include "bot_commands/bind_affinity.cpp"
#include "bot_commands/bot.cpp"
#include "bot_commands/bot_settings.cpp"
#include "bot_commands/cast.cpp"
#include "bot_commands/charm.cpp"
#include "bot_commands/class_race_list.cpp"
#include "bot_commands/click_item.cpp"
#include "bot_commands/copy_settings.cpp"
#include "bot_commands/cure.cpp"
#include "bot_commands/default_settings.cpp"
#include "bot_commands/defensive.cpp"
#include "bot_commands/depart.cpp"
#include "bot_commands/distance_ranged.cpp"
#include "bot_commands/escape.cpp"
#include "bot_commands/find_aliases.cpp"
#include "bot_commands/follow.cpp"
#include "bot_commands/guard.cpp"
#include "bot_commands/heal_rotation.cpp"
#include "bot_commands/help.cpp"
#include "bot_commands/hold.cpp"
#include "bot_commands/identify.cpp"
#include "bot_commands/illusion_block.cpp"
#include "bot_commands/inventory.cpp"
#include "bot_commands/invisibility.cpp"
#include "bot_commands/item_use.cpp"
#include "bot_commands/levitation.cpp"
#include "bot_commands/lull.cpp"
#include "bot_commands/max_melee_range.cpp"
#include "bot_commands/mesmerize.cpp"
#include "bot_commands/movement_speed.cpp"
#include "bot_commands/name.cpp"
#include "bot_commands/owner_option.cpp"
#include "bot_commands/pet.cpp"
@@ -2304,14 +2280,9 @@ void SendSpellTypeWindow(Client *c, const Seperator* sep) {
#include "bot_commands/precombat.cpp"
#include "bot_commands/pull.cpp"
#include "bot_commands/release.cpp"
#include "bot_commands/resistance.cpp"
#include "bot_commands/resurrect.cpp"
#include "bot_commands/rune.cpp"
#include "bot_commands/send_home.cpp"
#include "bot_commands/sit_hp_percent.cpp"
#include "bot_commands/sit_in_combat.cpp"
#include "bot_commands/sit_mana_percent.cpp"
#include "bot_commands/size.cpp"
#include "bot_commands/spell.cpp"
#include "bot_commands/spell_aggro_checks.cpp"
#include "bot_commands/spell_delays.cpp"
@@ -2334,4 +2305,3 @@ void SendSpellTypeWindow(Client *c, const Seperator* sep) {
#include "bot_commands/timer.cpp"
#include "bot_commands/track.cpp"
#include "bot_commands/view_combos.cpp"
#include "bot_commands/water_breathing.cpp"
-15
View File
@@ -1669,36 +1669,27 @@ void bot_command_apply_poison(Client *c, const Seperator *sep);
void bot_command_apply_potion(Client* c, const Seperator* sep);
void bot_command_attack(Client *c, const Seperator *sep);
void bot_command_behind_mob(Client* c, const Seperator* sep);
void bot_command_bind_affinity(Client *c, const Seperator *sep);
void bot_command_bot(Client *c, const Seperator *sep);
void bot_command_bot_settings(Client* c, const Seperator* sep);
void bot_command_cast(Client* c, const Seperator* sep);
void bot_command_distance_ranged(Client* c, const Seperator* sep);
void bot_command_charm(Client *c, const Seperator *sep);
void bot_command_class_race_list(Client* c, const Seperator* sep);
void bot_command_click_item(Client* c, const Seperator* sep);
void bot_command_copy_settings(Client* c, const Seperator* sep);
void bot_command_cure(Client *c, const Seperator *sep);
void bot_command_default_settings(Client* c, const Seperator* sep);
void bot_command_defensive(Client *c, const Seperator *sep);
void bot_command_depart(Client *c, const Seperator *sep);
void bot_command_escape(Client *c, const Seperator *sep);
void bot_command_find_aliases(Client *c, const Seperator *sep);
void bot_command_follow(Client *c, const Seperator *sep);
void bot_command_guard(Client *c, const Seperator *sep);
void bot_command_heal_rotation(Client *c, const Seperator *sep);
void bot_command_help(Client *c, const Seperator *sep);
void bot_command_hold(Client *c, const Seperator *sep);
void bot_command_identify(Client *c, const Seperator *sep);
void bot_command_illusion_block(Client* c, const Seperator* sep);
void bot_command_inventory(Client *c, const Seperator *sep);
void bot_command_invisibility(Client *c, const Seperator *sep);
void bot_command_item_use(Client *c, const Seperator *sep);
void bot_command_levitation(Client *c, const Seperator *sep);
void bot_command_lull(Client *c, const Seperator *sep);
void bot_command_max_melee_range(Client* c, const Seperator* sep);
void bot_command_mesmerize(Client *c, const Seperator *sep);
void bot_command_movement_speed(Client *c, const Seperator *sep);
void bot_command_owner_option(Client *c, const Seperator *sep);
void bot_command_pet(Client *c, const Seperator *sep);
void bot_command_pick_lock(Client *c, const Seperator *sep);
@@ -1706,14 +1697,9 @@ void bot_command_pickpocket(Client* c, const Seperator* sep);
void bot_command_precombat(Client* c, const Seperator* sep);
void bot_command_pull(Client *c, const Seperator *sep);
void bot_command_release(Client *c, const Seperator *sep);
void bot_command_resistance(Client *c, const Seperator *sep);
void bot_command_resurrect(Client *c, const Seperator *sep);
void bot_command_rune(Client *c, const Seperator *sep);
void bot_command_send_home(Client *c, const Seperator *sep);
void bot_command_sit_hp_percent(Client* c, const Seperator* sep);
void bot_command_sit_in_combat(Client* c, const Seperator* sep);
void bot_command_sit_mana_percent(Client* c, const Seperator* sep);
void bot_command_size(Client *c, const Seperator *sep);
void bot_command_spell_aggro_checks(Client* c, const Seperator* sep);
void bot_command_spell_delays(Client* c, const Seperator* sep);
void bot_command_spell_engaged_priority(Client* c, const Seperator* sep);
@@ -1743,7 +1729,6 @@ void bot_command_taunt(Client *c, const Seperator *sep);
void bot_command_timer(Client* c, const Seperator* sep);
void bot_command_track(Client *c, const Seperator *sep);
void bot_command_view_combos(Client *c, const Seperator *sep);
void bot_command_water_breathing(Client *c, const Seperator *sep);
// Bot Subcommands
void bot_command_appearance(Client *c, const Seperator *sep);
-42
View File
@@ -1,42 +0,0 @@
#include "../bot_command.h"
void bot_command_bind_affinity(Client *c, const Seperator *sep)
{
bcst_list* local_list = &bot_command_spells[BCEnum::SpT_BindAffinity];
if (helper_spell_list_fail(c, local_list, BCEnum::SpT_BindAffinity) || helper_command_alias_fail(c, "bot_command_bind_affinity", sep->arg[0], "bindaffinity"))
return;
if (helper_is_help_or_usage(sep->arg[1])) {
c->Message(Chat::White, "usage: (<friendly_target>) %s", sep->arg[0]);
c->Message(Chat::White, "note: Orders a bot to attempt an affinity binding", sep->arg[0]);
helper_send_usage_required_bots(c, BCEnum::SpT_BindAffinity);
return;
}
ActionableTarget::Types actionable_targets;
Bot* my_bot = nullptr;
std::list<Bot*> sbl;
MyBots::PopulateSBL_BySpawnedBots(c, sbl);
for (auto list_iter : *local_list) {
auto local_entry = list_iter;
if (helper_spell_check_fail(local_entry))
continue;
auto target_mob = actionable_targets.Select(c, local_entry->target_type, FRIENDLY);
if (!target_mob)
continue;
my_bot = ActionableBots::Select_ByMinLevelAndClass(c, local_entry->target_type, sbl, local_entry->spell_level, local_entry->caster_class, target_mob);
if (!my_bot)
continue;
// Cast effect message is not being generated
if (helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id))
c->Message(Chat::White, "Successfully bound %s to this location", target_mob->GetCleanName());
else
c->Message(Chat::White, "Failed to bind %s to this location", target_mob->GetCleanName());
break;
}
helper_no_available_bots(c, my_bot);
}
+193 -37
View File
@@ -99,8 +99,8 @@ void bot_command_cast(Client* c, const Seperator* sep)
c->Message(
Chat::Yellow,
fmt::format(
"Use {} for information about race/class IDs.",
Saylink::Silent("^classracelist")
"Use help after any command type for more subtypes to use, for example: {}.",
Saylink::Silent("^cast invisibility help")
).c_str()
);
@@ -118,9 +118,58 @@ void bot_command_cast(Client* c, const Seperator* sep)
}
std::string arg1 = sep->arg[1];
std::string arg2 = sep->arg[2];
if (!arg1.compare("listid") || !arg1.compare("listname")) {
c->CastToBot()->SendSpellTypesWindow(c, sep->arg[0], sep->arg[1], sep->arg[2]);
//Commanded type help prompts
if (!arg2.compare("help")) {
c->Message(Chat::Yellow, "You can also use [single], [group], [ae]. Ex: ^cast movementspeed group.", sep->arg[0]);
}
if (!arg1.compare("invisibility") && !arg2.compare("help")) {
c->Message(
Chat::Yellow,
fmt::format(
"Available options for {} are: {}, {}, {}, {}.",
sep->arg[0],
Saylink::Silent("^cast invisibility see", "see"),
Saylink::Silent("^cast invisibility invis", "invis"),
Saylink::Silent("^cast invisibility undead", "undead"),
Saylink::Silent("^cast invisibility animals", "animals")
).c_str()
);
return;
}
if (!arg1.compare("size") && !arg2.compare("help")) {
c->Message(
Chat::Yellow,
fmt::format(
"Available options for {} are: {}, {}.",
sep->arg[0],
Saylink::Silent("^cast size grow", "grow"),
Saylink::Silent("^cast size shrink", "shrink")
).c_str()
);
return;
}
if (!arg1.compare("movementspeed") && !arg2.compare("help")) {
c->Message(
Chat::Yellow,
fmt::format(
"Available options for {} are: {}, {}.",
sep->arg[0],
Saylink::Silent("^cast movementspeed selo"), "selo"
).c_str()
);
return;
}
if (!arg2.compare("help")) {
c->Message(Chat::Yellow, "There are no additional options for {}.", sep->arg[0]);
return;
}
@@ -131,8 +180,16 @@ void bot_command_cast(Client* c, const Seperator* sep)
if (sep->IsNumber(1)) {
spellType = atoi(sep->arg[1]);
if (spellType < BotSpellTypes::START || spellType > BotSpellTypes::END) {
c->Message(Chat::Yellow, "You must choose a valid spell type. Spell types range from %i to %i", BotSpellTypes::START, BotSpellTypes::END);
if (spellType < BotSpellTypes::START || (spellType > BotSpellTypes::END && spellType < BotSpellTypes::COMMANDED_START) || spellType > BotSpellTypes::COMMANDED_END) {
c->Message(
Chat::Yellow,
fmt::format(
"You must choose a valid spell type. Use {} for information regarding this command.",
Saylink::Silent(
fmt::format("{} help", sep->arg[0])
)
).c_str()
);
return;
}
@@ -156,6 +213,88 @@ void bot_command_cast(Client* c, const Seperator* sep)
}
}
switch (spellType) { //Allowed command checks
case BotSpellTypes::Charm:
if (!RuleB(Bots, AllowCommandedCharm)) {
c->Message(Chat::Yellow, "This commanded type is currently disabled.");
return;
}
break;
case BotSpellTypes::AEMez:
case BotSpellTypes::Mez:
if (!RuleB(Bots, AllowCommandedMez)) {
c->Message(Chat::Yellow, "This commanded type is currently disabled.");
return;
}
break;
case BotSpellTypes::Resurrect:
if (!RuleB(Bots, AllowCommandedResurrect)) {
c->Message(Chat::Yellow, "This commanded type is currently disabled.");
return;
}
break;
case BotSpellTypes::SummonCorpse:
if (!RuleB(Bots, AllowCommandedSummonCorpse)) {
c->Message(Chat::Yellow, "This commanded type is currently disabled.");
return;
}
break;
default:
break;
}
std::string argString = sep->arg[ab_arg];
uint16 subType = UINT16_MAX;
uint16 subTargetType = UINT16_MAX;
if (!argString.compare("shrink")) {
subType = CommandedSubTypes::Shrink;
++ab_arg;
}
else if (!argString.compare("grow")) {
subType = CommandedSubTypes::Grow;
++ab_arg;
}
else if (!argString.compare("see")) {
subType = CommandedSubTypes::SeeInvis;
++ab_arg;
}
else if (!argString.compare("invis")) {
subType = CommandedSubTypes::Invis;
++ab_arg;
}
else if (!argString.compare("undead")) {
subType = CommandedSubTypes::InvisUndead;
++ab_arg;
}
else if (!argString.compare("animals")) {
subType = CommandedSubTypes::InvisAnimals;
++ab_arg;
}
else if (!argString.compare("selo")) {
subType = CommandedSubTypes::Selo;
++ab_arg;
}
argString = sep->arg[ab_arg];
if (!argString.compare("single")) {
subTargetType = CommandedSubTypes::SingleTarget;
++ab_arg;
}
else if (!argString.compare("group")) {
subTargetType = CommandedSubTypes::GroupTarget;
++ab_arg;
}
else if (!argString.compare("ae")) {
subTargetType = CommandedSubTypes::AETarget;
++ab_arg;
}
if (
spellType == BotSpellTypes::PetBuffs ||
spellType == BotSpellTypes::PetCompleteHeals ||
@@ -169,47 +308,63 @@ void bot_command_cast(Client* c, const Seperator* sep)
}
Mob* tar = c->GetTarget();
LogTestDebug("{}: Attempting {} on {}", __LINE__, c->GetSpellTypeNameByID(spellType), (tar ? tar->GetCleanName() : "NOBODY")); //deleteme
if (spellType != BotSpellTypes::Escape && spellType != BotSpellTypes::Pet) {
if (!tar) {
LogTestDebug("{}: 'Attempting {} [{}] on {}'", __LINE__, c->GetSpellTypeNameByID(spellType), (subType != UINT16_MAX ? c->GetSubTypeNameByID(subType) : "Standard"), (tar ? tar->GetCleanName() : "NOBODY")); //deleteme
if (!tar) {
if (spellType != BotSpellTypes::Escape && spellType != BotSpellTypes::Pet) {
c->Message(Chat::Yellow, "You need a target for that.");
return;
}
if (BOT_SPELL_TYPES_DETRIMENTAL(spellType) && !c->IsAttackAllowed(tar)) {
c->Message(Chat::Yellow, "You cannot attack [%s].", tar->GetCleanName());
return;
}
if (BOT_SPELL_TYPES_BENEFICIAL(spellType)) {
if (!tar->IsOfClientBot() && !(tar->IsPet() && tar->GetOwner() && tar->GetOwner()->IsOfClientBot())) {
c->Message(Chat::Yellow, "[%s] is an invalid target.", tar->GetCleanName());
return;
}
}
}
LogTestDebug("{}: Attempting {} on {}", __LINE__, c->GetSpellTypeNameByID(spellType), (tar ? tar->GetCleanName() : "NOBODY")); //deleteme
switch (spellType) {
case BotSpellTypes::Stun:
case BotSpellTypes::AEStun:
if (tar->GetSpecialAbility(SpecialAbility::StunImmunity)) {
c->Message(Chat::Yellow, "[%s] is immune to stuns.", tar->GetCleanName());
return;
}
break;
switch (spellType) { //Target Checks
case BotSpellTypes::Resurrect:
if (!tar->IsCorpse() || !tar->CastToCorpse()->IsPlayerCorpse()) {
c->Message(Chat::Yellow, "[%s] is an invalid target. I can only resurrect player corpses.", tar->GetCleanName());
c->Message(Chat::Yellow, "[%s] is not a player's corpse.", tar->GetCleanName());
return;
}
break;
case BotSpellTypes::Identify:
case BotSpellTypes::SendHome:
case BotSpellTypes::BindAffinity:
case BotSpellTypes::SummonCorpse:
if (!tar->IsClient() || !c->IsInGroupOrRaid(tar)) {
c->Message(Chat::Yellow, "[%s] is an invalid target. Only players in your group or raid are eligible targets.", tar->GetCleanName());
return;
}
break;
default:
if (BOT_SPELL_TYPES_DETRIMENTAL(spellType) && !c->IsAttackAllowed(tar)) {
c->Message(Chat::Yellow, "You cannot attack [%s].", tar->GetCleanName());
return;
}
if (BOT_SPELL_TYPES_BENEFICIAL(spellType)) {
if (
(!tar->IsOfClientBot() && !(tar->IsPet() && tar->GetOwner() && tar->GetOwner()->IsOfClientBot())) ||
((tar->IsOfClientBot() && !c->IsInGroupOrRaid(tar)) || (tar->GetOwner() && tar->GetOwner()->IsOfClientBot() && !c->IsInGroupOrRaid(tar->GetOwner())))
) {
c->Message(Chat::Yellow, "[%s] is an invalid target. Only players in your group or raid are eligible targets.", tar->GetCleanName());
return;
}
}
break;
}
const int ab_mask = ActionableBots::ABM_Type1;
std::string actionableArg = sep->arg[ab_arg];
if (actionableArg.empty()) {
actionableArg = "spawned";
}
std::string class_race_arg = sep->arg[ab_arg];
bool class_race_check = false;
@@ -219,7 +374,7 @@ void bot_command_cast(Client* c, const Seperator* sep)
std::list<Bot*> sbl;
if (ActionableBots::PopulateSBL(c, sep->arg[ab_arg], sbl, ab_mask, !class_race_check ? sep->arg[ab_arg + 1] : nullptr, class_race_check ? atoi(sep->arg[ab_arg + 1]) : 0) == ActionableBots::ABT_None) {
if (ActionableBots::PopulateSBL(c, actionableArg, sbl, ab_mask, !class_race_check ? sep->arg[ab_arg + 1] : nullptr, class_race_check ? atoi(sep->arg[ab_arg + 1]) : 0) == ActionableBots::ABT_None) {
return;
}
@@ -240,7 +395,8 @@ void bot_command_cast(Client* c, const Seperator* sep)
/*
TODO bot rewrite -
FIX: Snares, Group Cures, OOC Song, Precombat, HateRedux, Fear/AE Fear
FIX: Depart, SummonCorpse, Lull,
Group Cures, Precombat, Fear/AE Fear
ICB (SK) casting hate on friendly but not hostile?
NEED TO CHECK: precombat, AE Dispel, AE Lifetap
DO I NEED A PBAE CHECK???
@@ -250,7 +406,7 @@ void bot_command_cast(Client* c, const Seperator* sep)
}
Mob* newTar = tar;
LogTestDebug("{}: Attempting {} on {}", __LINE__, c->GetSpellTypeNameByID(spellType), (newTar ? newTar->GetCleanName() : "NOBODY")); //deleteme
LogTestDebug("{}: {} says, 'Attempting {} [{}] on {}'", __LINE__, bot_iter->GetCleanName(), c->GetSpellTypeNameByID(spellType), (subType != UINT16_MAX ? c->GetSubTypeNameByID(subType) : "Standard"), (newTar ? newTar->GetCleanName() : "NOBODY")); //deleteme
if (!SpellTypeRequiresTarget(spellType, bot_iter->GetClass())) {
newTar = bot_iter;
}
@@ -279,11 +435,11 @@ void bot_command_cast(Client* c, const Seperator* sep)
continue;
}
LogTestDebug("{}: Attempting {} on {}", __LINE__, c->GetSpellTypeNameByID(spellType), (newTar ? newTar->GetCleanName() : "NOBODY")); //deleteme
LogTestDebug("{}: {} says, 'Attempting {} [{}] on {}'", __LINE__, bot_iter->GetCleanName(), c->GetSpellTypeNameByID(spellType), (subType != UINT16_MAX ? c->GetSubTypeNameByID(subType) : "Standard"), (newTar ? newTar->GetCleanName() : "NOBODY")); //deleteme
bot_iter->SetCommandedSpell(true);
if (bot_iter->AICastSpell(newTar, 100, spellType)) {
if (bot_iter->AICastSpell(newTar, 100, spellType, subTargetType, subType)) {
if (!firstFound) {
firstFound = bot_iter;
}
-54
View File
@@ -1,54 +0,0 @@
#include "../bot_command.h"
void bot_command_charm(Client *c, const Seperator *sep)
{
auto local_list = &bot_command_spells[BCEnum::SpT_Charm];
if (helper_spell_list_fail(c, local_list, BCEnum::SpT_Charm) || helper_command_alias_fail(c, "bot_command_charm", sep->arg[0], "charm"))
return;
if (helper_is_help_or_usage(sep->arg[1])) {
c->Message(Chat::White, "usage: <enemy_target> %s ([option: dire])", sep->arg[0]);
helper_send_usage_required_bots(c, BCEnum::SpT_Charm);
return;
}
bool dire = false;
std::string dire_arg = sep->arg[1];
if (!dire_arg.compare("dire"))
dire = true;
ActionableTarget::Types actionable_targets;
Bot* my_bot = nullptr;
std::list<Bot*> sbl;
MyBots::PopulateSBL_BySpawnedBots(c, sbl);
for (auto list_iter : *local_list) {
auto local_entry = list_iter->SafeCastToCharm();
if (helper_spell_check_fail(local_entry))
continue;
if (local_entry->dire != dire)
continue;
auto target_mob = actionable_targets.Select(c, local_entry->target_type, ENEMY);
if (!target_mob)
continue;
if (target_mob->IsCharmed()) {
c->Message(Chat::White, "Your <target> is already charmed");
return;
}
if (spells[local_entry->spell_id].max_value[EFFECTIDTOINDEX(1)] < target_mob->GetLevel())
continue;
my_bot = ActionableBots::Select_ByMinLevelAndClass(c, local_entry->target_type, sbl, local_entry->spell_level, local_entry->caster_class, target_mob, true);
if (!my_bot)
continue;
uint32 dont_root_before = 0;
if (helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id, true, &dont_root_before))
target_mob->SetDontRootMeBefore(dont_root_before);
break;
}
helper_no_available_bots(c, my_bot);
}
-71
View File
@@ -1,71 +0,0 @@
#include "../bot_command.h"
void bot_command_cure(Client *c, const Seperator *sep)
{
bcst_list* local_list = &bot_command_spells[BCEnum::SpT_Cure];
if (helper_spell_list_fail(c, local_list, BCEnum::SpT_Cure) || helper_command_alias_fail(c, "bot_command_cure", sep->arg[0], "cure"))
return;
if (helper_is_help_or_usage(sep->arg[1])) {
c->Message(Chat::White, "usage: (<friendly_target>) %s [ailment: blindness | disease | poison | curse | corruption]", sep->arg[0]);
helper_send_usage_required_bots(c, BCEnum::SpT_Cure);
return;
}
std::string ailment_arg = sep->arg[1];
auto ailment_type = BCEnum::AT_None;
if (!ailment_arg.compare("blindness"))
ailment_type = BCEnum::AT_Blindness;
else if (!ailment_arg.compare("disease"))
ailment_type = BCEnum::AT_Disease;
else if (!ailment_arg.compare("poison"))
ailment_type = BCEnum::AT_Poison;
else if (!ailment_arg.compare("curse"))
ailment_type = BCEnum::AT_Curse;
else if (!ailment_arg.compare("corruption"))
ailment_type = BCEnum::AT_Corruption;
if (ailment_type == BCEnum::AT_None) {
c->Message(Chat::White, "You must specify a cure [ailment] to use this command");
return;
}
local_list->sort([ailment_type](STBaseEntry* l, STBaseEntry* r) {
auto _l = l->SafeCastToCure(), _r = r->SafeCastToCure();
if (_l->cure_value[AILMENTIDTOINDEX(ailment_type)] < _r->cure_value[AILMENTIDTOINDEX(ailment_type)])
return true;
if (_l->cure_value[AILMENTIDTOINDEX(ailment_type)] == _r->cure_value[AILMENTIDTOINDEX(ailment_type)] && spells[_l->spell_id].mana < spells[_r->spell_id].mana)
return true;
if (_l->cure_value[AILMENTIDTOINDEX(ailment_type)] == _r->cure_value[AILMENTIDTOINDEX(ailment_type)] && spells[_l->spell_id].mana == spells[_r->spell_id].mana && _l->cure_total < _r->cure_total)
return true;
return false;
});
ActionableTarget::Types actionable_targets;
Bot* my_bot = nullptr;
std::list<Bot*> sbl;
MyBots::PopulateSBL_BySpawnedBots(c, sbl);
bool cast_success = false;
for (auto list_iter : *local_list) {
auto local_entry = list_iter->SafeCastToCure();
if (helper_spell_check_fail(local_entry))
continue;
if (!local_entry->cure_value[AILMENTIDTOINDEX(ailment_type)])
continue;
auto target_mob = actionable_targets.Select(c, local_entry->target_type, FRIENDLY);
if (!target_mob)
continue;
my_bot = ActionableBots::Select_ByMinLevelAndClass(c, local_entry->target_type, sbl, local_entry->spell_level, local_entry->caster_class, target_mob);
if (!my_bot)
continue;
cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id);
break;
}
helper_no_available_bots(c, my_bot);
}
-44
View File
@@ -1,44 +0,0 @@
#include "../bot_command.h"
void bot_command_escape(Client *c, const Seperator *sep)
{
bcst_list* local_list = &bot_command_spells[BCEnum::SpT_Escape];
if (helper_spell_list_fail(c, local_list, BCEnum::SpT_Escape) || helper_command_alias_fail(c, "bot_command_escape", sep->arg[0], "escape"))
return;
if (helper_is_help_or_usage(sep->arg[1])) {
c->Message(Chat::White, "usage: (<friendly_target>) %s ([option: lesser])", sep->arg[0]);
helper_send_usage_required_bots(c, BCEnum::SpT_Escape);
return;
}
bool use_lesser = false;
if (!strcasecmp(sep->arg[1], "lesser"))
use_lesser = true;
ActionableTarget::Types actionable_targets;
Bot* my_bot = nullptr;
std::list<Bot*> sbl;
MyBots::PopulateSBL_BySpawnedBots(c, sbl);
bool cast_success = false;
for (auto list_iter : *local_list) {
auto local_entry = list_iter->SafeCastToEscape();
if (helper_spell_check_fail(local_entry))
continue;
if (local_entry->lesser != use_lesser)
continue;
auto target_mob = actionable_targets.Select(c, local_entry->target_type, FRIENDLY);
if (!target_mob)
continue;
my_bot = ActionableBots::Select_ByMinLevelAndClass(c, local_entry->target_type, sbl, local_entry->spell_level, local_entry->caster_class, target_mob);
if (!my_bot)
continue;
cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id);
break;
}
helper_no_available_bots(c, my_bot);
}
-38
View File
@@ -1,38 +0,0 @@
#include "../bot_command.h"
void bot_command_identify(Client *c, const Seperator *sep)
{
bcst_list* local_list = &bot_command_spells[BCEnum::SpT_Identify];
if (helper_spell_list_fail(c, local_list, BCEnum::SpT_Identify) || helper_command_alias_fail(c, "bot_command_identify", sep->arg[0], "identify"))
return;
if (helper_is_help_or_usage(sep->arg[1])) {
c->Message(Chat::White, "usage: (<friendly_target>) %s", sep->arg[0]);
helper_send_usage_required_bots(c, BCEnum::SpT_Identify);
return;
}
ActionableTarget::Types actionable_targets;
Bot* my_bot = nullptr;
std::list<Bot*> sbl;
MyBots::PopulateSBL_BySpawnedBots(c, sbl);
bool cast_success = false;
for (auto list_iter : *local_list) {
auto local_entry = list_iter;
if (helper_spell_check_fail(local_entry))
continue;
auto target_mob = actionable_targets.Select(c, local_entry->target_type, FRIENDLY);
if (!target_mob)
continue;
my_bot = ActionableBots::Select_ByMinLevelAndClass(c, local_entry->target_type, sbl, local_entry->spell_level, local_entry->caster_class, target_mob);
if (!my_bot)
continue;
cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id);
break;
}
helper_no_available_bots(c, my_bot);
}
-57
View File
@@ -1,57 +0,0 @@
#include "../bot_command.h"
void bot_command_invisibility(Client *c, const Seperator *sep)
{
bcst_list* local_list = &bot_command_spells[BCEnum::SpT_Invisibility];
if (helper_spell_list_fail(c, local_list, BCEnum::SpT_Invisibility) || helper_command_alias_fail(c, "bot_command_invisibility", sep->arg[0], "invisibility"))
return;
if (helper_is_help_or_usage(sep->arg[1])) {
c->Message(Chat::White, "usage: (<friendly_target>) %s [invisibility: living | undead | animal | see]", sep->arg[0]);
helper_send_usage_required_bots(c, BCEnum::SpT_Invisibility);
return;
}
std::string invisibility = sep->arg[1];
BCEnum::IType invisibility_type = BCEnum::IT_None;
if (!invisibility.compare("living"))
invisibility_type = BCEnum::IT_Living;
else if (!invisibility.compare("undead"))
invisibility_type = BCEnum::IT_Undead;
else if (!invisibility.compare("animal"))
invisibility_type = BCEnum::IT_Animal;
else if (!invisibility.compare("see"))
invisibility_type = BCEnum::IT_See;
if (invisibility_type == BCEnum::IT_None) {
c->Message(Chat::White, "You must specify an [invisibility]");
return;
}
ActionableTarget::Types actionable_targets;
Bot* my_bot = nullptr;
std::list<Bot*> sbl;
MyBots::PopulateSBL_BySpawnedBots(c, sbl);
bool cast_success = false;
for (auto list_iter : *local_list) {
auto local_entry = list_iter->SafeCastToInvisibility();
if (helper_spell_check_fail(local_entry))
continue;
if (local_entry->invis_type != invisibility_type)
continue;
auto target_mob = actionable_targets.Select(c, local_entry->target_type, FRIENDLY);
if (!target_mob)
continue;
my_bot = ActionableBots::Select_ByMinLevelAndClass(c, local_entry->target_type, sbl, local_entry->spell_level, local_entry->caster_class, target_mob);
if (!my_bot)
continue;
cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id);
break;
}
helper_no_available_bots(c, my_bot);
}
-38
View File
@@ -1,38 +0,0 @@
#include "../bot_command.h"
void bot_command_levitation(Client *c, const Seperator *sep)
{
bcst_list* local_list = &bot_command_spells[BCEnum::SpT_Levitation];
if (helper_spell_list_fail(c, local_list, BCEnum::SpT_Levitation) || helper_command_alias_fail(c, "bot_command_levitation", sep->arg[0], "levitation"))
return;
if (helper_is_help_or_usage(sep->arg[1])) {
c->Message(Chat::White, "usage: (<friendly_target>) %s", sep->arg[0]);
helper_send_usage_required_bots(c, BCEnum::SpT_Levitation);
return;
}
ActionableTarget::Types actionable_targets;
Bot* my_bot = nullptr;
std::list<Bot*> sbl;
MyBots::PopulateSBL_BySpawnedBots(c, sbl);
bool cast_success = false;
for (auto list_iter : *local_list) {
auto local_entry = list_iter;
if (helper_spell_check_fail(local_entry))
continue;
auto target_mob = actionable_targets.Select(c, local_entry->target_type, FRIENDLY);
if (!target_mob)
continue;
my_bot = ActionableBots::Select_ByMinLevelAndClass(c, local_entry->target_type, sbl, local_entry->spell_level, local_entry->caster_class, target_mob);
if (!my_bot)
continue;
cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id);
break;
}
helper_no_available_bots(c, my_bot);
}
-41
View File
@@ -1,41 +0,0 @@
#include "../bot_command.h"
void bot_command_mesmerize(Client *c, const Seperator *sep)
{
if (helper_is_help_or_usage(sep->arg[1])) {
c->Message(Chat::White, "usage: <enemy_target> %s", sep->arg[0]);
helper_send_usage_required_bots(c, BCEnum::SpT_Mesmerize);
return;
}
bool isSuccess = false;
std::list<Bot*> sbl;
MyBots::PopulateSBL_BySpawnedBots(c, sbl);
for (auto bot_iter : sbl) {
std::list<BotSpell_wPriority> botSpellList = bot_iter->GetPrioritizedBotSpellsBySpellType(bot_iter, BotSpellTypes::Mez, c->GetTarget(), IsAEBotSpellType(BotSpellTypes::Mez));
for (const auto& s : botSpellList) {
if (!IsValidSpell(s.SpellId)) {
continue;
}
if (!bot_iter->IsInGroupOrRaid(c)) {
continue;
}
if (!bot_iter->CastChecks(s.SpellId, c->GetTarget(), BotSpellTypes::Mez, false, false)) {
continue;
}
if (bot_iter->CommandedDoSpellCast(s.SpellIndex, c->GetTarget(), s.ManaCost)) {
bot_iter->BotGroupSay(bot_iter, "Casting %s [%s] on %s.", GetSpellName(s.SpellId), bot_iter->GetSpellTypeNameByID(BotSpellTypes::Mez), c->GetTarget()->GetCleanName());
isSuccess = true;
}
}
}
if (!isSuccess) {
helper_no_available_bots(c);
}
}
-50
View File
@@ -1,50 +0,0 @@
#include "../bot_command.h"
void bot_command_movement_speed(Client *c, const Seperator *sep)
{
bcst_list* local_list = &bot_command_spells[BCEnum::SpT_MovementSpeed];
if (helper_spell_list_fail(c, local_list, BCEnum::SpT_MovementSpeed) || helper_command_alias_fail(c, "bot_command_movement_speed", sep->arg[0], "movementspeed"))
return;
if (helper_is_help_or_usage(sep->arg[1])) {
c->Message(Chat::White, "usage: (<friendly_target>) %s ([group | sow])", sep->arg[0]);
helper_send_usage_required_bots(c, BCEnum::SpT_MovementSpeed);
return;
}
bool group = false;
bool sow = false;
std::string arg1 = sep->arg[1];
if (!arg1.compare("group"))
group = true;
else if (!arg1.compare("sow"))
sow = true;
ActionableTarget::Types actionable_targets;
Bot* my_bot = nullptr;
std::list<Bot*> sbl;
MyBots::PopulateSBL_BySpawnedBots(c, sbl);
bool cast_success = false;
for (auto list_iter : *local_list) {
auto local_entry = list_iter->SafeCastToMovementSpeed();
if (helper_spell_check_fail(local_entry))
continue;
if (!sow && (local_entry->group != group))
continue;
if (sow && (local_entry->spell_id != 278)) // '278' = single-target "Spirit of Wolf"
continue;
auto target_mob = actionable_targets.Select(c, local_entry->target_type, FRIENDLY);
if (!target_mob)
continue;
my_bot = ActionableBots::Select_ByMinLevelAndClass(c, local_entry->target_type, sbl, local_entry->spell_level, local_entry->caster_class, target_mob);
if (!my_bot)
continue;
cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id);
break;
}
helper_no_available_bots(c, my_bot);
}
-73
View File
@@ -1,73 +0,0 @@
#include "../bot_command.h"
void bot_command_resistance(Client *c, const Seperator *sep)
{
bcst_list* local_list = &bot_command_spells[BCEnum::SpT_Resistance];
if (helper_spell_list_fail(c, local_list, BCEnum::SpT_Resistance) || helper_command_alias_fail(c, "bot_command_resistance", sep->arg[0], "resistance"))
return;
if (helper_is_help_or_usage(sep->arg[1])) {
c->Message(Chat::White, "usage: (<friendly_target>) %s [resistance: fire | cold | poison | disease | magic | corruption]", sep->arg[0]);
helper_send_usage_required_bots(c, BCEnum::SpT_Resistance);
return;
}
std::string resistance_arg = sep->arg[1];
auto resistance_type = BCEnum::RT_None;
if (!resistance_arg.compare("fire"))
resistance_type = BCEnum::RT_Fire;
else if (!resistance_arg.compare("cold"))
resistance_type = BCEnum::RT_Cold;
else if (!resistance_arg.compare("poison"))
resistance_type = BCEnum::RT_Poison;
else if (!resistance_arg.compare("disease"))
resistance_type = BCEnum::RT_Disease;
else if (!resistance_arg.compare("magic"))
resistance_type = BCEnum::RT_Magic;
else if (!resistance_arg.compare("corruption"))
resistance_type = BCEnum::RT_Corruption;
if (resistance_type == BCEnum::RT_None) {
c->Message(Chat::White, "You must specify a [resistance]");
return;
}
local_list->sort([resistance_type](STBaseEntry* l, STBaseEntry* r) {
auto _l = l->SafeCastToResistance(), _r = r->SafeCastToResistance();
if (_l->resist_value[RESISTANCEIDTOINDEX(resistance_type)] > _r->resist_value[RESISTANCEIDTOINDEX(resistance_type)])
return true;
if (_l->resist_value[RESISTANCEIDTOINDEX(resistance_type)] == _r->resist_value[RESISTANCEIDTOINDEX(resistance_type)] && spells[_l->spell_id].mana < spells[_r->spell_id].mana)
return true;
if (_l->resist_value[RESISTANCEIDTOINDEX(resistance_type)] == _r->resist_value[RESISTANCEIDTOINDEX(resistance_type)] && spells[_l->spell_id].mana == spells[_r->spell_id].mana && _l->resist_total > _r->resist_total)
return true;
return false;
});
ActionableTarget::Types actionable_targets;
Bot* my_bot = nullptr;
std::list<Bot*> sbl;
MyBots::PopulateSBL_BySpawnedBots(c, sbl);
bool cast_success = false;
for (auto list_iter : *local_list) {
auto local_entry = list_iter->SafeCastToResistance();
if (helper_spell_check_fail(local_entry))
continue;
if (!local_entry->resist_value[RESISTANCEIDTOINDEX(resistance_type)])
continue;
auto target_mob = actionable_targets.Select(c, local_entry->target_type, FRIENDLY);
if (!target_mob)
continue;
my_bot = ActionableBots::Select_ByMinLevelAndClass(c, local_entry->target_type, sbl, local_entry->spell_level, local_entry->caster_class, target_mob);
if (!my_bot)
continue;
cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id);
break;
}
helper_no_available_bots(c, my_bot);
}
-57
View File
@@ -1,57 +0,0 @@
#include "../bot_command.h"
void bot_command_resurrect(Client *c, const Seperator *sep)
{
// Obscure bot spell code prohibits the aoe portion from working correctly...
bcst_list* local_list = &bot_command_spells[BCEnum::SpT_Resurrect];
if (helper_spell_list_fail(c, local_list, BCEnum::SpT_Resurrect) || helper_command_alias_fail(c, "bot_command_resurrect", sep->arg[0], "resurrect"))
return;
if (helper_is_help_or_usage(sep->arg[1])) {
//c->Message(Chat::White, "usage: <corpse_target> %s ([option: aoe])", sep->arg[0]);
c->Message(Chat::White, "usage: <corpse_target> %s", sep->arg[0]);
helper_send_usage_required_bots(c, BCEnum::SpT_Resurrect);
return;
}
bool aoe = false;
//std::string aoe_arg = sep->arg[1];
//if (!aoe_arg.compare("aoe"))
// aoe = true;
ActionableTarget::Types actionable_targets;
Bot* my_bot = nullptr;
std::list<Bot*> sbl;
MyBots::PopulateSBL_BySpawnedBots(c, sbl);
for (auto list_iter : *local_list) {
auto local_entry = list_iter->SafeCastToResurrect();
if (helper_spell_check_fail(local_entry))
continue;
//if (local_entry->aoe != aoe)
// continue;
if (local_entry->aoe)
continue;
auto target_mob = actionable_targets.Select(c, local_entry->target_type, FRIENDLY);
//if (!target_mob && !local_entry->aoe)
// continue;
if (!target_mob)
continue;
my_bot = ActionableBots::Select_ByMinLevelAndClass(c, local_entry->target_type, sbl, local_entry->spell_level, local_entry->caster_class, target_mob);
if (!my_bot)
continue;
//if (local_entry->aoe)
// target_mob = my_bot;
uint32 dont_root_before = 0;
if (helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id, true, &dont_root_before))
target_mob->SetDontRootMeBefore(dont_root_before);
break;
}
helper_no_available_bots(c, my_bot);
}
-38
View File
@@ -1,38 +0,0 @@
#include "../bot_command.h"
void bot_command_rune(Client *c, const Seperator *sep)
{
bcst_list* local_list = &bot_command_spells[BCEnum::SpT_Rune];
if (helper_spell_list_fail(c, local_list, BCEnum::SpT_Rune) || helper_command_alias_fail(c, "bot_command_rune", sep->arg[0], "rune"))
return;
if (helper_is_help_or_usage(sep->arg[1])) {
c->Message(Chat::White, "usage: (<friendly_target>) %s", sep->arg[0]);
helper_send_usage_required_bots(c, BCEnum::SpT_Rune);
return;
}
ActionableTarget::Types actionable_targets;
Bot* my_bot = nullptr;
std::list<Bot*> sbl;
MyBots::PopulateSBL_BySpawnedBots(c, sbl);
bool cast_success = false;
for (auto list_iter : *local_list) {
auto local_entry = list_iter;
if (helper_spell_check_fail(local_entry))
continue;
auto target_mob = actionable_targets.Select(c, local_entry->target_type, FRIENDLY);
if (!target_mob)
continue;
my_bot = ActionableBots::Select_ByMinLevelAndClass(c, local_entry->target_type, sbl, local_entry->spell_level, local_entry->caster_class, target_mob);
if (!my_bot)
continue;
cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id);
break;
}
helper_no_available_bots(c, my_bot);
}
-47
View File
@@ -1,47 +0,0 @@
#include "../bot_command.h"
void bot_command_send_home(Client *c, const Seperator *sep)
{
// Obscure bot spell code prohibits the aoe portion from working correctly...
bcst_list* local_list = &bot_command_spells[BCEnum::SpT_SendHome];
if (helper_spell_list_fail(c, local_list, BCEnum::SpT_SendHome) || helper_command_alias_fail(c, "bot_command_send_home", sep->arg[0], "sendhome"))
return;
if (helper_is_help_or_usage(sep->arg[1])) {
c->Message(Chat::White, "usage: (<friendly_target>) %s ([option: group])", sep->arg[0]);
helper_send_usage_required_bots(c, BCEnum::SpT_SendHome);
return;
}
bool group = false;
std::string group_arg = sep->arg[1];
if (!group_arg.compare("group"))
group = true;
ActionableTarget::Types actionable_targets;
Bot* my_bot = nullptr;
std::list<Bot*> sbl;
MyBots::PopulateSBL_BySpawnedBots(c, sbl);
bool cast_success = false;
for (auto list_iter : *local_list) {
auto local_entry = list_iter->SafeCastToSendHome();
if (helper_spell_check_fail(local_entry))
continue;
if (local_entry->group != group)
continue;
auto target_mob = actionable_targets.Select(c, local_entry->target_type, FRIENDLY);
if (!target_mob)
continue;
my_bot = ActionableBots::Select_ByMinLevelAndClass(c, local_entry->target_type, sbl, local_entry->spell_level, local_entry->caster_class, target_mob);
if (!my_bot)
continue;
cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id);
break;
}
helper_no_available_bots(c, my_bot);
}
-50
View File
@@ -1,50 +0,0 @@
#include "../bot_command.h"
void bot_command_size(Client *c, const Seperator *sep)
{
bcst_list* local_list = &bot_command_spells[BCEnum::SpT_Size];
if (helper_spell_list_fail(c, local_list, BCEnum::SpT_Size) || helper_command_alias_fail(c, "bot_command_size", sep->arg[0], "size"))
return;
if (helper_is_help_or_usage(sep->arg[1])) {
c->Message(Chat::White, "usage: (<friendly_target>) %s [grow | shrink]", sep->arg[0]);
helper_send_usage_required_bots(c, BCEnum::SpT_Size);
return;
}
std::string size_arg = sep->arg[1];
auto size_type = BCEnum::SzT_Reduce;
if (!size_arg.compare("grow")) {
size_type = BCEnum::SzT_Enlarge;
}
else if (size_arg.compare("shrink")) {
c->Message(Chat::White, "This command requires a [grow | shrink] argument");
return;
}
ActionableTarget::Types actionable_targets;
Bot* my_bot = nullptr;
std::list<Bot*> sbl;
MyBots::PopulateSBL_BySpawnedBots(c, sbl);
bool cast_success = false;
for (auto list_iter : *local_list) {
auto local_entry = list_iter->SafeCastToSize();
if (helper_spell_check_fail(local_entry))
continue;
if (local_entry->size_type != size_type)
continue;
auto target_mob = actionable_targets.Select(c, local_entry->target_type, FRIENDLY);
if (!target_mob)
continue;
my_bot = ActionableBots::Select_ByMinLevelAndClass(c, local_entry->target_type, sbl, local_entry->spell_level, local_entry->caster_class, target_mob);
if (!my_bot)
continue;
cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id);
break;
}
helper_no_available_bots(c, my_bot);
}
-38
View File
@@ -1,38 +0,0 @@
#include "../bot_command.h"
void bot_command_water_breathing(Client *c, const Seperator *sep)
{
bcst_list* local_list = &bot_command_spells[BCEnum::SpT_WaterBreathing];
if (helper_spell_list_fail(c, local_list, BCEnum::SpT_WaterBreathing) || helper_command_alias_fail(c, "bot_command_water_breathing", sep->arg[0], "waterbreathing"))
return;
if (helper_is_help_or_usage(sep->arg[1])) {
c->Message(Chat::White, "usage: (<friendly_target>) %s", sep->arg[0]);
helper_send_usage_required_bots(c, BCEnum::SpT_WaterBreathing);
return;
}
ActionableTarget::Types actionable_targets;
Bot* my_bot = nullptr;
std::list<Bot*> sbl;
MyBots::PopulateSBL_BySpawnedBots(c, sbl);
bool cast_success = false;
for (auto list_iter : *local_list) {
auto local_entry = list_iter;
if (helper_spell_check_fail(local_entry))
continue;
auto target_mob = actionable_targets.Select(c, local_entry->target_type, FRIENDLY);
if (!target_mob)
continue;
my_bot = ActionableBots::Select_ByMinLevelAndClass(c, local_entry->target_type, sbl, local_entry->spell_level, local_entry->caster_class, target_mob);
if (!my_bot)
continue;
cast_success = helper_cast_standard_spell(my_bot, target_mob, local_entry->spell_id);
break;
}
helper_no_available_bots(c, my_bot);
}
+50 -9
View File
@@ -21,7 +21,7 @@
#include "../common/repositories/bot_spells_entries_repository.h"
#include "../common/repositories/npc_spells_repository.h"
bool Bot::AICastSpell(Mob* tar, uint8 iChance, uint16 spellType) {
bool Bot::AICastSpell(Mob* tar, uint8 iChance, uint16 spellType, uint16 subTargetType, uint16 subType) {
if (!tar) {
return false;
}
@@ -48,7 +48,7 @@ bool Bot::AICastSpell(Mob* tar, uint8 iChance, uint16 spellType) {
return false;
}
if (spellType != BotSpellTypes::Resurrect && tar->GetAppearance() == eaDead) {
if ((spellType != BotSpellTypes::Resurrect && spellType != BotSpellTypes::SummonCorpse) && tar->GetAppearance() == eaDead) {
if (!((tar->IsClient() && tar->CastToClient()->GetFeigned()) || tar->IsBot())) {
return false;
}
@@ -83,7 +83,12 @@ bool Bot::AICastSpell(Mob* tar, uint8 iChance, uint16 spellType) {
}
break;
//SpecialAbility::PacifyImmunity -- TODO bot rewrite
case BotSpellTypes::Lull:
if (tar->GetSpecialAbility(SpecialAbility::PacifyImmunity)) {
return false;
}
break;
case BotSpellTypes::Fear:
if (tar->GetSpecialAbility(SpecialAbility::FearImmunity)) {
return false;
@@ -128,6 +133,17 @@ bool Bot::AICastSpell(Mob* tar, uint8 iChance, uint16 spellType) {
case BotSpellTypes::PetDamageShields:
case BotSpellTypes::ResistBuffs:
case BotSpellTypes::PetResistBuffs:
case BotSpellTypes::Teleport:
case BotSpellTypes::Succor:
case BotSpellTypes::BindAffinity:
case BotSpellTypes::Identify:
case BotSpellTypes::Levitate:
case BotSpellTypes::Rune:
case BotSpellTypes::WaterBreathing:
case BotSpellTypes::Size:
case BotSpellTypes::Invisibility:
case BotSpellTypes::MovementSpeed:
case BotSpellTypes::SendHome:
if (!tar->IsOfClientBot() && !(tar->IsPet() && tar->GetOwner() && tar->GetOwner()->IsOfClientBot())) {
return false;
}
@@ -182,6 +198,7 @@ bool Bot::AICastSpell(Mob* tar, uint8 iChance, uint16 spellType) {
return BotCastPet(tar, botClass, botSpell, spellType);
case BotSpellTypes::Resurrect:
case BotSpellTypes::SummonCorpse:
if (!tar->IsCorpse() || !tar->CastToCorpse()->IsPlayerCorpse()) {
return false;
}
@@ -197,7 +214,7 @@ bool Bot::AICastSpell(Mob* tar, uint8 iChance, uint16 spellType) {
break;
}
std::list<BotSpell_wPriority> botSpellList = GetPrioritizedBotSpellsBySpellType(this, spellType, tar, IsAEBotSpellType(spellType));
std::list<BotSpell_wPriority> botSpellList = GetPrioritizedBotSpellsBySpellType(this, spellType, tar, IsAEBotSpellType(spellType), subTargetType, subType);
for (const auto& s : botSpellList) {
@@ -643,7 +660,7 @@ bool Bot::AI_PursueCastCheck() {
continue;
}
if (currentCast.spellType == BotSpellTypes::Resurrect || currentCast.spellType == BotSpellTypes::Charm) { // Unsupported by AI currently.
if (IsCommandedSpellType(currentCast.spellType) || currentCast.spellType == BotSpellTypes::Resurrect || currentCast.spellType == BotSpellTypes::Charm) { // Unsupported by AI currently.
continue;
}
@@ -706,7 +723,7 @@ bool Bot::AI_IdleCastCheck() {
continue;
}
if (currentCast.spellType == BotSpellTypes::Resurrect || currentCast.spellType == BotSpellTypes::Charm) { // Unsupported by AI currently.
if (IsCommandedSpellType(currentCast.spellType) || currentCast.spellType == BotSpellTypes::Resurrect || currentCast.spellType == BotSpellTypes::Charm) { // Unsupported by AI currently.
continue;
}
@@ -756,7 +773,7 @@ bool Bot::AI_EngagedCastCheck() {
continue;
}
if (currentCast.spellType == BotSpellTypes::Resurrect || currentCast.spellType == BotSpellTypes::Charm) { // Unsupported by AI currently.
if (IsCommandedSpellType(currentCast.spellType) || currentCast.spellType == BotSpellTypes::Resurrect || currentCast.spellType == BotSpellTypes::Charm) { // Unsupported by AI currently.
continue;
}
@@ -979,7 +996,7 @@ std::list<BotSpell> Bot::GetBotSpellsBySpellType(Bot* botCaster, uint16 spellTyp
return result;
}
std::list<BotSpell_wPriority> Bot::GetPrioritizedBotSpellsBySpellType(Bot* botCaster, uint16 spellType, Mob* tar, bool AE) {
std::list<BotSpell_wPriority> Bot::GetPrioritizedBotSpellsBySpellType(Bot* botCaster, uint16 spellType, Mob* tar, bool AE, uint16 subTargetType, uint16 subType) {
std::list<BotSpell_wPriority> result;
if (botCaster && botCaster->AI_HasSpells()) {
@@ -1001,6 +1018,16 @@ std::list<BotSpell_wPriority> Bot::GetPrioritizedBotSpellsBySpellType(Bot* botCa
(botSpellList[i].type == spellType || botSpellList[i].type == botCaster->GetSpellListSpellType(spellType)) &&
botCaster->IsValidSpellTypeBySpellID(spellType, botSpellList[i].spellid)
) {
if (
botCaster->IsCommandedSpell() &&
(
!botCaster->IsValidSpellTypeSubType(spellType, subTargetType, botSpellList[i].spellid) ||
!botCaster->IsValidSpellTypeSubType(spellType, subType, botSpellList[i].spellid)
)
) {
continue;
}
if (!AE && IsAnyAESpell(botSpellList[i].spellid) && !IsGroupSpell(botSpellList[i].spellid)) {
continue;
}
@@ -2040,7 +2067,7 @@ BotSpell Bot::GetBestBotSpellForCure(Bot* botCaster, Mob* tar, uint16 spellType)
return result;
}
uint8 Bot::GetChanceToCastBySpellType(uint16 spellType) //TODO bot rewrite - adjust, move AEs to own rule?
uint8 Bot::GetChanceToCastBySpellType(uint16 spellType)
{
switch (spellType) {
case BotSpellTypes::AENukes:
@@ -2072,6 +2099,18 @@ uint8 Bot::GetChanceToCastBySpellType(uint16 spellType) //TODO bot rewrite - adj
case BotSpellTypes::PetResistBuffs:
case BotSpellTypes::DamageShields:
case BotSpellTypes::PetDamageShields:
case BotSpellTypes::Teleport:
case BotSpellTypes::Succor:
case BotSpellTypes::BindAffinity:
case BotSpellTypes::Identify:
case BotSpellTypes::Levitate:
case BotSpellTypes::Rune:
case BotSpellTypes::WaterBreathing:
case BotSpellTypes::Size:
case BotSpellTypes::Invisibility:
case BotSpellTypes::MovementSpeed:
case BotSpellTypes::SendHome:
case BotSpellTypes::SummonCorpse:
return RuleI(Bots, PercentChanceToCastBuff);
case BotSpellTypes::Escape:
return RuleI(Bots, PercentChanceToCastEscape);
@@ -2949,6 +2988,7 @@ void Bot::CheckBotSpells() {
break;
}
break;
//TODO bot rewrite - add commanded types
default:
break;
@@ -3044,6 +3084,7 @@ void Bot::CheckBotSpells() {
else if (IsEffectInSpell(spell_id, SE_Revive)) {
correctType = BotSpellTypes::Resurrect;
}
//TODO bot rewrite - add commanded types
if (!valid || (correctType == UINT16_MAX) || (s.type != correctType)) {
LogBotSpellTypeChecks("{} [#{}] is incorrect. It is currently set as {} [#{}] and should be {} [#{}]"
+125
View File
@@ -8720,6 +8720,12 @@ uint16 Mob::GetSpellTypeIDByShortName(std::string spellTypeString) {
}
}
for (int i = BotSpellTypes::COMMANDED_START; i <= BotSpellTypes::COMMANDED_END; ++i) {
if (!Strings::ToLower(spellTypeString).compare(GetSpellTypeShortNameByID(i))) {
return i;
}
}
return UINT16_MAX;
}
@@ -8892,6 +8898,45 @@ std::string Mob::GetSpellTypeNameByID(uint16 spellType) {
case BotSpellTypes::PetResistBuffs:
spellTypeName = "Pet Resist Buff";
break;
case BotSpellTypes::Lull:
spellTypeName = "Lull";
break;
case BotSpellTypes::Teleport:
spellTypeName = "Teleport";
break;
case BotSpellTypes::Succor:
spellTypeName = "Succor";
break;
case BotSpellTypes::BindAffinity:
spellTypeName = "Bind Affinity";
break;
case BotSpellTypes::Identify:
spellTypeName = "Identify";
break;
case BotSpellTypes::Levitate:
spellTypeName = "Levitate";
break;
case BotSpellTypes::Rune:
spellTypeName = "Rune";
break;
case BotSpellTypes::WaterBreathing:
spellTypeName = "Water Breathing";
break;
case BotSpellTypes::Size:
spellTypeName = "Size";
break;
case BotSpellTypes::Invisibility:
spellTypeName = "Invisibility";
break;
case BotSpellTypes::MovementSpeed:
spellTypeName = "Movement Speed";
break;
case BotSpellTypes::SendHome:
spellTypeName = "Send Home";
break;
case BotSpellTypes::SummonCorpse:
spellTypeName = "Summon Corpse";
break;
default:
break;
}
@@ -9068,6 +9113,45 @@ std::string Mob::GetSpellTypeShortNameByID(uint16 spellType) {
case BotSpellTypes::PetResistBuffs:
spellTypeName = "petresistbuffs";
break;
case BotSpellTypes::Lull:
spellTypeName = "lull";
break;
case BotSpellTypes::Teleport:
spellTypeName = "teleport";
break;
case BotSpellTypes::Succor:
spellTypeName = "succor";
break;
case BotSpellTypes::BindAffinity:
spellTypeName = "bindaffinity";
break;
case BotSpellTypes::Identify:
spellTypeName = "identify";
break;
case BotSpellTypes::Levitate:
spellTypeName = "levitate";
break;
case BotSpellTypes::Rune:
spellTypeName = "rune";
break;
case BotSpellTypes::WaterBreathing:
spellTypeName = "waterbreathing";
break;
case BotSpellTypes::Size:
spellTypeName = "size";
break;
case BotSpellTypes::Invisibility:
spellTypeName = "invisibility";
break;
case BotSpellTypes::MovementSpeed:
spellTypeName = "movementspeed";
break;
case BotSpellTypes::SendHome:
spellTypeName = "sendhome";
break;
case BotSpellTypes::SummonCorpse:
spellTypeName = "summoncorpse";
break;
default:
break;
}
@@ -9075,6 +9159,47 @@ std::string Mob::GetSpellTypeShortNameByID(uint16 spellType) {
return spellTypeName;
}
std::string Mob::GetSubTypeNameByID(uint16 subType) {
std::string subTypeName = "null";
switch (subType) {
case CommandedSubTypes::SingleTarget:
subTypeName = "SingleTarget";
break;
case CommandedSubTypes::GroupTarget:
subTypeName = "GroupTarget";
break;
case CommandedSubTypes::AETarget:
subTypeName = "AETarget";
break;
case CommandedSubTypes::SeeInvis:
subTypeName = "SeeInvis";
break;
case CommandedSubTypes::Invis:
subTypeName = "Invis";
break;
case CommandedSubTypes::InvisUndead:
subTypeName = "InvisUndead";
break;
case CommandedSubTypes::InvisAnimals:
subTypeName = "InvisAnimals";
break;
case CommandedSubTypes::Shrink:
subTypeName = "Shrink";
break;
case CommandedSubTypes::Grow:
subTypeName = "Grow";
break;
case CommandedSubTypes::Selo:
subTypeName = "Selo";
break;
default:
break;
}
return subTypeName;
}
bool Mob::GetDefaultSpellHold(uint16 spellType, uint8 stance) {
switch (spellType) {
case BotSpellTypes::Nuke:
+2 -1
View File
@@ -435,7 +435,8 @@ public:
uint16 GetSpellTypeIDByShortName(std::string spellTypeString);
std::string GetSpellTypeNameByID(uint16 spellType);
std::string GetSpellTypeShortNameByID(uint16 spellType);
std::string GetSpellTypeShortNameByID(uint16 spellType);
std::string GetSubTypeNameByID(uint16 subType);
bool GetDefaultSpellHold(uint16 spellType, uint8 stance = Stance::Balanced);
uint16 GetDefaultSpellDelay(uint16 spellType, uint8 stance = Stance::Balanced);