mirror of
https://github.com/EQEmu/Server.git
synced 2026-05-19 13:28:25 +00:00
implement commanded cast types
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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"
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user