diff --git a/common/database/database_update_manifest_bots.cpp b/common/database/database_update_manifest_bots.cpp index a57a6f075..96627d814 100644 --- a/common/database/database_update_manifest_bots.cpp +++ b/common/database/database_update_manifest_bots.cpp @@ -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 diff --git a/common/ruletypes.h b/common/ruletypes.h index 8096c037b..32c8378fb 100644 --- a/common/ruletypes.h +++ b/common/ruletypes.h @@ -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() diff --git a/common/spdat.cpp b/common/spdat.cpp index 7b0e54089..a691d5197 100644 --- a/common/spdat.cpp +++ b/common/spdat.cpp @@ -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; +} diff --git a/common/spdat.h b/common/spdat.h index 4c1b52eca..cefac6784 100644 --- a/common/spdat.h +++ b/common/spdat.h @@ -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 diff --git a/common/version.h b/common/version.h index 7cf293612..d9d57e7ca 100644 --- a/common/version.h +++ b/common/version.h @@ -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 diff --git a/zone/bot.cpp b/zone/bot.cpp index 988c0d4e3..56736942e 100644 --- a/zone/bot.cpp +++ b/zone/bot.cpp @@ -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; +} diff --git a/zone/bot.h b/zone/bot.h index 8e85448e0..2360d73b4 100644 --- a/zone/bot.h +++ b/zone/bot.h @@ -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 GetBotSpellsForSpellEffect(Bot* botCaster, uint16 spellType, int spellEffect); static std::list GetBotSpellsForSpellEffectAndTargetType(Bot* botCaster, uint16 spellType, int spellEffect, SpellTargetType targetType); static std::list GetBotSpellsBySpellType(Bot* botCaster, uint16 spellType); - static std::list GetPrioritizedBotSpellsBySpellType(Bot* botCaster, uint16 spellType, Mob* tar, bool AE = false); + static std::list 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); diff --git a/zone/bot_command.cpp b/zone/bot_command.cpp index 15ea7eba8..7af4109f5 100644 --- a/zone/bot_command.cpp +++ b/zone/bot_command.cpp @@ -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" diff --git a/zone/bot_command.h b/zone/bot_command.h index 8e200bd6b..56be99680 100644 --- a/zone/bot_command.h +++ b/zone/bot_command.h @@ -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); diff --git a/zone/bot_commands/bind_affinity.cpp b/zone/bot_commands/bind_affinity.cpp deleted file mode 100644 index a59c5947a..000000000 --- a/zone/bot_commands/bind_affinity.cpp +++ /dev/null @@ -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: () %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 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); -} diff --git a/zone/bot_commands/cast.cpp b/zone/bot_commands/cast.cpp index ab02eb950..49112b869 100644 --- a/zone/bot_commands/cast.cpp +++ b/zone/bot_commands/cast.cpp @@ -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 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; } diff --git a/zone/bot_commands/charm.cpp b/zone/bot_commands/charm.cpp deleted file mode 100644 index 2df4694b6..000000000 --- a/zone/bot_commands/charm.cpp +++ /dev/null @@ -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: %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 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 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); -} diff --git a/zone/bot_commands/cure.cpp b/zone/bot_commands/cure.cpp deleted file mode 100644 index 4452f8088..000000000 --- a/zone/bot_commands/cure.cpp +++ /dev/null @@ -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: () %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 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); -} diff --git a/zone/bot_commands/escape.cpp b/zone/bot_commands/escape.cpp deleted file mode 100644 index 31fde82a6..000000000 --- a/zone/bot_commands/escape.cpp +++ /dev/null @@ -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: () %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 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); -} diff --git a/zone/bot_commands/identify.cpp b/zone/bot_commands/identify.cpp deleted file mode 100644 index 7ac90a4e4..000000000 --- a/zone/bot_commands/identify.cpp +++ /dev/null @@ -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: () %s", sep->arg[0]); - helper_send_usage_required_bots(c, BCEnum::SpT_Identify); - return; - } - - ActionableTarget::Types actionable_targets; - Bot* my_bot = nullptr; - std::list 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); -} diff --git a/zone/bot_commands/invisibility.cpp b/zone/bot_commands/invisibility.cpp deleted file mode 100644 index dd826ebc8..000000000 --- a/zone/bot_commands/invisibility.cpp +++ /dev/null @@ -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: () %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 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); -} diff --git a/zone/bot_commands/levitation.cpp b/zone/bot_commands/levitation.cpp deleted file mode 100644 index d4b5cee28..000000000 --- a/zone/bot_commands/levitation.cpp +++ /dev/null @@ -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: () %s", sep->arg[0]); - helper_send_usage_required_bots(c, BCEnum::SpT_Levitation); - return; - } - - ActionableTarget::Types actionable_targets; - Bot* my_bot = nullptr; - std::list 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); -} diff --git a/zone/bot_commands/mesmerize.cpp b/zone/bot_commands/mesmerize.cpp deleted file mode 100644 index d86fba9f7..000000000 --- a/zone/bot_commands/mesmerize.cpp +++ /dev/null @@ -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: %s", sep->arg[0]); - helper_send_usage_required_bots(c, BCEnum::SpT_Mesmerize); - return; - } - - bool isSuccess = false; - std::list sbl; - MyBots::PopulateSBL_BySpawnedBots(c, sbl); - - for (auto bot_iter : sbl) { - std::list 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); - } -} diff --git a/zone/bot_commands/movement_speed.cpp b/zone/bot_commands/movement_speed.cpp deleted file mode 100644 index d1b884154..000000000 --- a/zone/bot_commands/movement_speed.cpp +++ /dev/null @@ -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: () %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 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); -} diff --git a/zone/bot_commands/resistance.cpp b/zone/bot_commands/resistance.cpp deleted file mode 100644 index 0b84b4b88..000000000 --- a/zone/bot_commands/resistance.cpp +++ /dev/null @@ -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: () %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 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); -} diff --git a/zone/bot_commands/resurrect.cpp b/zone/bot_commands/resurrect.cpp deleted file mode 100644 index 0b15ef3e1..000000000 --- a/zone/bot_commands/resurrect.cpp +++ /dev/null @@ -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: %s ([option: aoe])", sep->arg[0]); - c->Message(Chat::White, "usage: %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 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); -} diff --git a/zone/bot_commands/rune.cpp b/zone/bot_commands/rune.cpp deleted file mode 100644 index 71b1cf572..000000000 --- a/zone/bot_commands/rune.cpp +++ /dev/null @@ -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: () %s", sep->arg[0]); - helper_send_usage_required_bots(c, BCEnum::SpT_Rune); - return; - } - - ActionableTarget::Types actionable_targets; - Bot* my_bot = nullptr; - std::list 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); -} diff --git a/zone/bot_commands/send_home.cpp b/zone/bot_commands/send_home.cpp deleted file mode 100644 index 6950e2bee..000000000 --- a/zone/bot_commands/send_home.cpp +++ /dev/null @@ -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: () %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 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); -} diff --git a/zone/bot_commands/size.cpp b/zone/bot_commands/size.cpp deleted file mode 100644 index 69e2fd1a2..000000000 --- a/zone/bot_commands/size.cpp +++ /dev/null @@ -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: () %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 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); -} diff --git a/zone/bot_commands/water_breathing.cpp b/zone/bot_commands/water_breathing.cpp deleted file mode 100644 index cb9b792c4..000000000 --- a/zone/bot_commands/water_breathing.cpp +++ /dev/null @@ -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: () %s", sep->arg[0]); - helper_send_usage_required_bots(c, BCEnum::SpT_WaterBreathing); - return; - } - - ActionableTarget::Types actionable_targets; - Bot* my_bot = nullptr; - std::list 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); -} diff --git a/zone/botspellsai.cpp b/zone/botspellsai.cpp index 0138d58ad..241854dfa 100644 --- a/zone/botspellsai.cpp +++ b/zone/botspellsai.cpp @@ -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 botSpellList = GetPrioritizedBotSpellsBySpellType(this, spellType, tar, IsAEBotSpellType(spellType)); + std::list 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 Bot::GetBotSpellsBySpellType(Bot* botCaster, uint16 spellTyp return result; } -std::list Bot::GetPrioritizedBotSpellsBySpellType(Bot* botCaster, uint16 spellType, Mob* tar, bool AE) { +std::list Bot::GetPrioritizedBotSpellsBySpellType(Bot* botCaster, uint16 spellType, Mob* tar, bool AE, uint16 subTargetType, uint16 subType) { std::list result; if (botCaster && botCaster->AI_HasSpells()) { @@ -1001,6 +1018,16 @@ std::list 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 {} [#{}]" diff --git a/zone/mob.cpp b/zone/mob.cpp index ef6659bed..4c1635655 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -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: diff --git a/zone/mob.h b/zone/mob.h index 662798af5..865e768ba 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -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);