diff --git a/sql/mangos.sql b/sql/mangos.sql index 7be058b7e..c9553fb49 100644 --- a/sql/mangos.sql +++ b/sql/mangos.sql @@ -23,7 +23,7 @@ DROP TABLE IF EXISTS `db_version`; CREATE TABLE `db_version` ( `version` varchar(120) default NULL, `creature_ai_version` varchar(120) default NULL, - `required_7886_01_mangos_petcreateinfo_spell` bit(1) default NULL + `required_7893_01_mangos_command` bit(1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes'; -- @@ -340,9 +340,9 @@ INSERT INTO `command` VALUES ('gps',1,'Syntax: .gps [$name|$shift-link]\r\n\r\nDisplay the position information for a selected character or creature (also if player name $name provided then for named player, or if creature/gameobject shift-link provided then pointed creature/gameobject if it loaded). Position information includes X, Y, Z, and orientation, map Id and zone Id'), ('groupgo',1,'Syntax: .groupgo [$charactername]\r\n\r\nTeleport the given character and his group to you. Teleported only online characters but original selected group member can be offline.'), ('guid',2,'Syntax: .guid\r\n\r\nDisplay the GUID for the selected character.'), -('guild create',2,'Syntax: .guild create [$GuildLeaderName] $GuildName\r\n\r\nCreate a guild named $GuildName with the player $GuildLeaderName (or selected) as leader.'), -('guild delete',2,'Syntax: .guild delete $GuildName\r\n\r\nDelete guild $GuildName.'), -('guild invite',2,'Syntax: .guild invite [$CharacterName] $GuildName\r\n\r\nAdd player $CharacterName (or selected) into a guild $GuildName.'), +('guild create',2,'Syntax: .guild create [$GuildLeaderName] "$GuildName"\r\n\r\nCreate a guild named $GuildName with the player $GuildLeaderName (or selected) as leader. Guild name must in quotes.'), +('guild delete',2,'Syntax: .guild delete "$GuildName"\r\n\r\nDelete guild $GuildName. Guild name must in quotes.'), +('guild invite',2,'Syntax: .guild invite [$CharacterName] "$GuildName"\r\n\r\nAdd player $CharacterName (or selected) into a guild $GuildName. Guild name must in quotes.'), ('guild rank',2,'Syntax: .guild rank $CharacterName #Rank\r\n\r\nSet for $CharacterName rank #Rank in a guild.'), ('guild uninvite',2,'Syntax: .guild uninvite [$CharacterName]\r\n\r\nRemove player $CharacterName (or selected) from a guild.'), ('help',0,'Syntax: .help [$command]\r\n\r\nDisplay usage instructions for the given $command. If no $command provided show list available commands.'), diff --git a/sql/updates/7893_01_mangos_command.sql b/sql/updates/7893_01_mangos_command.sql new file mode 100644 index 000000000..8b21a405e --- /dev/null +++ b/sql/updates/7893_01_mangos_command.sql @@ -0,0 +1,10 @@ +ALTER TABLE db_version CHANGE COLUMN required_7886_01_mangos_petcreateinfo_spell required_7893_01_mangos_command bit; + +DELETE FROM `command` WHERE `name` IN ( + 'guild create','guild delete','guild invite' +); + +INSERT INTO `command` VALUES +('guild create',2,'Syntax: .guild create [$GuildLeaderName] "$GuildName"\r\n\r\nCreate a guild named $GuildName with the player $GuildLeaderName (or selected) as leader. Guild name must in quotes.'), +('guild invite',2,'Syntax: .guild invite [$CharacterName] "$GuildName"\r\n\r\nAdd player $CharacterName (or selected) into a guild $GuildName. Guild name must in quotes.'), +('guild delete',2,'Syntax: .guild delete "$GuildName"\r\n\r\nDelete guild $GuildName. Guild name must in quotes.'); diff --git a/sql/updates/Makefile.am b/sql/updates/Makefile.am index 81cb82750..3470dcb72 100644 --- a/sql/updates/Makefile.am +++ b/sql/updates/Makefile.am @@ -199,6 +199,7 @@ pkgdata_DATA = \ 7884_05_characters_character_action.sql \ 7886_01_mangos_petcreateinfo_spell.sql \ 7887_01_characters_character_pet.sql \ + 7893_01_mangos_command.sql \ README ## Additional files to include when running 'make dist' @@ -378,4 +379,5 @@ EXTRA_DIST = \ 7884_05_characters_character_action.sql \ 7886_01_mangos_petcreateinfo_spell.sql \ 7887_01_characters_character_pet.sql \ + 7893_01_mangos_command.sql \ README diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp index e779c7edb..fcaa70569 100644 --- a/src/game/Chat.cpp +++ b/src/game/Chat.cpp @@ -1574,6 +1574,22 @@ void ChatHandler::extractOptFirstArg(char* args, char** arg1, char** arg2) *arg2 = p2; } +char* ChatHandler::extractQuotedArg( char* args ) +{ + if(!*args) + return NULL; + + if(*args=='"') + return strtok(args+1, "\""); + else + { + char* space = strtok(args, "\""); + if(!space) + return false; + return strtok(NULL, "\""); + } +} + bool ChatHandler::needReportToTarget(Player* chr) const { Player* pl = m_session->GetPlayer(); diff --git a/src/game/Chat.h b/src/game/Chat.h index 9f7370401..d5e5c2619 100644 --- a/src/game/Chat.h +++ b/src/game/Chat.h @@ -497,6 +497,7 @@ class ChatHandler // if args have single value then it return in arg2 and arg1 == NULL void extractOptFirstArg(char* args, char** arg1, char** arg2); + char* extractQuotedArg(char* args); uint32 extractSpellIdFromLink(char* text); uint64 extractGuidFromLink(char* text); diff --git a/src/game/Level1.cpp b/src/game/Level1.cpp index 591f7b447..9c9623268 100644 --- a/src/game/Level1.cpp +++ b/src/game/Level1.cpp @@ -1962,17 +1962,7 @@ bool ChatHandler::HandleSendMailCommand(const char* args) if(!tail1) return false; - char* msgSubject; - if(*tail1=='"') - msgSubject = strtok(tail1+1, "\""); - else - { - char* space = strtok(tail1, "\""); - if(!space) - return false; - msgSubject = strtok(NULL, "\""); - } - + char* msgSubject = extractQuotedArg(tail1); if (!msgSubject) return false; @@ -1980,17 +1970,7 @@ bool ChatHandler::HandleSendMailCommand(const char* args) if(!tail2) return false; - char* msgText; - if(*tail2=='"') - msgText = strtok(tail2+1, "\""); - else - { - char* space = strtok(tail2, "\""); - if(!space) - return false; - msgText = strtok(NULL, "\""); - } - + char* msgText = extractQuotedArg(tail2); if (!msgText) return false; diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp index e7dd57d00..3426b6bc3 100644 --- a/src/game/Level3.cpp +++ b/src/game/Level3.cpp @@ -3169,14 +3169,20 @@ bool ChatHandler::HandleLookupTaxiNodeCommand(const char * args) */ bool ChatHandler::HandleGuildCreateCommand(const char* args) { - char* nameStr; - char* guildStr; - extractOptFirstArg((char*)args,&nameStr,&guildStr); - if(!guildStr) + if(!*args) + return false; + + // if not guild name only (in "") then player name + Player* target; + if(!extractPlayerTarget(*args!='"' ? (char*)args : NULL, &target)) return false; - Player* target; - if(!extractPlayerTarget(nameStr,&target)) + char* tailStr = *args!='"' ? strtok(NULL, "") : (char*)args; + if(!tailStr) + return false; + + char* guildStr = extractQuotedArg(tailStr); + if(!guildStr) return false; std::string guildname = guildStr; @@ -3202,17 +3208,23 @@ bool ChatHandler::HandleGuildCreateCommand(const char* args) bool ChatHandler::HandleGuildInviteCommand(const char *args) { - char* nameStr; - char* guildNameStr; - extractOptFirstArg((char*)args,&nameStr,&guildNameStr); - if(!guildNameStr) - return false; + if(!*args) + return false; + // if not guild name only (in "") then player name uint64 target_guid; - if(!extractPlayerTarget(nameStr,NULL,&target_guid)) + if(!extractPlayerTarget(*args!='"' ? (char*)args : NULL, NULL, &target_guid)) return false; - std::string glName = guildNameStr; + char* tailStr = *args!='"' ? strtok(NULL, "") : (char*)args; + if(!tailStr) + return false; + + char* guildStr = extractQuotedArg(tailStr); + if(!guildStr) + return false; + + std::string glName = guildStr; Guild* targetGuild = objmgr.GetGuildByName (glName); if (!targetGuild) return false; @@ -3278,11 +3290,11 @@ bool ChatHandler::HandleGuildDeleteCommand(const char* args) if (!*args) return false; - char* par1 = strtok ((char*)args, " "); - if (!par1) + char* guildStr = extractQuotedArg((char*)args); + if(!guildStr) return false; - std::string gld = par1; + std::string gld = guildStr; Guild* targetGuild = objmgr.GetGuildByName (gld); if (!targetGuild) @@ -6296,17 +6308,7 @@ bool ChatHandler::HandleSendItemsCommand(const char* args) if(!tail1) return false; - char* msgSubject; - if(*tail1=='"') - msgSubject = strtok(tail1+1, "\""); - else - { - char* space = strtok(tail1, "\""); - if(!space) - return false; - msgSubject = strtok(NULL, "\""); - } - + char* msgSubject = extractQuotedArg(tail1); if (!msgSubject) return false; @@ -6314,17 +6316,7 @@ bool ChatHandler::HandleSendItemsCommand(const char* args) if(!tail2) return false; - char* msgText; - if(*tail2=='"') - msgText = strtok(tail2+1, "\""); - else - { - char* space = strtok(tail2, "\""); - if(!space) - return false; - msgText = strtok(NULL, "\""); - } - + char* msgText = extractQuotedArg(tail2); if (!msgText) return false; @@ -6427,17 +6419,7 @@ bool ChatHandler::HandleSendMoneyCommand(const char* args) if (!tail1) return false; - char* msgSubject; - if (*tail1=='"') - msgSubject = strtok(tail1+1, "\""); - else - { - char* space = strtok(tail1, "\""); - if (!space) - return false; - msgSubject = strtok(NULL, "\""); - } - + char* msgSubject = extractQuotedArg(tail1); if (!msgSubject) return false; @@ -6445,17 +6427,7 @@ bool ChatHandler::HandleSendMoneyCommand(const char* args) if (!tail2) return false; - char* msgText; - if (*tail2=='"') - msgText = strtok(tail2+1, "\""); - else - { - char* space = strtok(tail2, "\""); - if (!space) - return false; - msgText = strtok(NULL, "\""); - } - + char* msgText = extractQuotedArg(tail2); if (!msgText) return false; diff --git a/src/game/LootMgr.cpp b/src/game/LootMgr.cpp index fc8d66666..e975fe78b 100644 --- a/src/game/LootMgr.cpp +++ b/src/game/LootMgr.cpp @@ -46,7 +46,7 @@ LootStore LootTemplates_Prospecting( "prospecting_loot_template", "item entry LootStore LootTemplates_QuestMail( "quest_mail_loot_template", "quest id (with mail template)",false); LootStore LootTemplates_Reference( "reference_loot_template", "reference id", false); LootStore LootTemplates_Skinning( "skinning_loot_template", "creature skinning id", true); -LootStore LootTemplates_Spell( "spell_loot_template", "spell id (explicitly discovering ability)",false); +LootStore LootTemplates_Spell( "spell_loot_template", "spell id (random item creating)",false); class LootTemplate::LootGroup // A set of loot definitions for items (refs are not allowed) { diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 657f2102d..ecfdb2779 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -13937,7 +13937,10 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder ) // load home bind and check in same time class/race pair, it used later for restore broken positions if(!_LoadHomeBind(holder->GetResult(PLAYER_LOGIN_QUERY_LOADHOMEBIND))) + { + delete result; return false; + } InitPrimaryProffesions(); // to max set before any spell loaded diff --git a/src/game/QuestHandler.cpp b/src/game/QuestHandler.cpp index 96a9a4138..69a2d7c46 100644 --- a/src/game/QuestHandler.cpp +++ b/src/game/QuestHandler.cpp @@ -598,9 +598,6 @@ uint32 WorldSession::getDialogStatus(Player *pPlayer, Object* questgiver, uint32 result = result2; } - if(questgiver->GetTypeId()==TYPEID_UNIT && ((Creature*)questgiver)->isCanTrainingAndResetTalentsOf(pPlayer) && result < DIALOG_STATUS_CHAT) - result = DIALOG_STATUS_CHAT; - return result; } diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h index 72683217b..3c2e12d32 100644 --- a/src/game/SharedDefines.h +++ b/src/game/SharedDefines.h @@ -1817,8 +1817,6 @@ enum CreatureFamily CREATURE_FAMILY_SPIRIT_BEAST = 46 }; -#define MAX_CREATURE_FAMILY 47 - enum CreatureTypeFlags { CREATURE_TYPEFLAGS_TAMEABLE = 0x0001, diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 1ac4071bf..15e5eeb4f 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -3848,8 +3848,11 @@ SpellCastResult Spell::CheckCast(bool strict) //Must be behind the target. if( m_spellInfo->AttributesEx2 == 0x100000 && (m_spellInfo->AttributesEx & 0x200) == 0x200 && target->HasInArc(M_PI, m_caster) ) { - //Exclusion for Pounce: Facing Limitation was removed in 2.0.1, but it still uses the same, old Ex-Flags - if( m_spellInfo->SpellFamilyName != SPELLFAMILY_DRUID || m_spellInfo->SpellFamilyFlags != 0x0000000000020000LL ) + //Exclusion for Pounce: Facing Limitation was removed in 2.0.1, but it still uses the same, old Ex-Flags + //Exclusion for Mutilate:Facing Limitation was removed in 2.0.1 and 3.0.3, but they still use the same, old Ex-Flags + if( (m_spellInfo->SpellFamilyName != SPELLFAMILY_DRUID || m_spellInfo->SpellFamilyFlags != 0x0000000000020000LL) && + (m_spellInfo->SpellFamilyName != SPELLFAMILY_ROGUE || m_spellInfo->SpellFamilyFlags != 0x0020000000000000LL) + ) { SendInterrupted(2); return SPELL_FAILED_NOT_BEHIND; diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp index 9fa8cf51b..8626f133d 100644 --- a/src/game/SpellMgr.cpp +++ b/src/game/SpellMgr.cpp @@ -2126,56 +2126,6 @@ void SpellMgr::LoadSpellPetAuras() sLog.outString( ">> Loaded %u spell pet auras", count ); } -static uint32 family2skillline[MAX_CREATURE_FAMILY][2] = { - /* ----------------------------- = 0 */ {0, 0 }, - /*CREATURE_FAMILY_WOLF = 1 */ {208, 270}, - /*CREATURE_FAMILY_CAT = 2 */ {209, 270}, - /*CREATURE_FAMILY_SPIDER = 3 */ {203, 270}, - /*CREATURE_FAMILY_BEAR = 4 */ {210, 270}, - /*CREATURE_FAMILY_BOAR = 5 */ {211, 270}, - /*CREATURE_FAMILY_CROCOLISK = 6 */ {212, 270}, - /*CREATURE_FAMILY_CARRION_BIRD = 7 */ {213, 270}, - /*CREATURE_FAMILY_CRAB = 8 */ {214, 270}, - /*CREATURE_FAMILY_GORILLA = 9 */ {215, 270}, - /*CREATURE_FAMILY_HORSE_CUSTOM = 10*/ {0, 0 }, - /*CREATURE_FAMILY_RAPTOR = 11*/ {217, 270}, - /*CREATURE_FAMILY_TALLSTRIDER = 12*/ {218, 270}, - /* ----------------------------- = 13*/ {0, 0 }, - /* ----------------------------- = 14*/ {0, 0 }, - /*CREATURE_FAMILY_FELHUNTER = 15*/ {189, 0 }, - /*CREATURE_FAMILY_VOIDWALKER = 16*/ {204, 0 }, - /*CREATURE_FAMILY_SUCCUBUS = 17*/ {205, 0 }, - /* ----------------------------- = 18*/ {0, 0 }, - /*CREATURE_FAMILY_DOOMGUARD = 19*/ {207, 0 }, - /*CREATURE_FAMILY_SCORPID = 20*/ {236, 270}, - /*CREATURE_FAMILY_TURTLE = 21*/ {251, 270}, - /* ----------------------------- = 22*/ {0, 0 }, - /*CREATURE_FAMILY_IMP = 23*/ {188, 0 }, - /*CREATURE_FAMILY_BAT = 24*/ {653, 270}, - /*CREATURE_FAMILY_HYENA = 25*/ {654, 270}, - /*CREATURE_FAMILY_BIRD_OF_PREY = 26*/ {655, 270}, - /*CREATURE_FAMILY_WIND_SERPENT = 27*/ {656, 270}, - /*CREATURE_FAMILY_REMOTE_CONTROL = 28*/ {758, 0 }, - /*CREATURE_FAMILY_FELGUARD = 29*/ {761, 0 }, - /*CREATURE_FAMILY_DRAGONHAWK = 30*/ {763, 270}, - /*CREATURE_FAMILY_RAVAGER = 31*/ {767, 270}, - /*CREATURE_FAMILY_WARP_STALKER = 32*/ {766, 270}, - /*CREATURE_FAMILY_SPOREBAT = 33*/ {765, 270}, - /*CREATURE_FAMILY_NETHER_RAY = 34*/ {764, 270}, - /*CREATURE_FAMILY_SERPENT = 35*/ {768, 270}, - /* ----------------------------- = 36*/ {0, 0 }, - /*CREATURE_FAMILY_MOTH = 37*/ {775, 270}, - /*CREATURE_FAMILY_CHIMAERA = 38*/ {780, 270}, - /*CREATURE_FAMILY_DEVILSAUR = 39*/ {781, 270}, - /*CREATURE_FAMILY_GHOUL = 40*/ {782, 0 }, - /*CREATURE_FAMILY_SILITHID = 41*/ {783, 270}, - /*CREATURE_FAMILY_WORM = 42*/ {784, 270}, - /*CREATURE_FAMILY_RHINO = 43*/ {786, 270}, - /*CREATURE_FAMILY_WASP = 44*/ {785, 270}, - /*CREATURE_FAMILY_CORE_HOUND = 45*/ {787, 270}, - /*CREATURE_FAMILY_SPIRIT_BEAST = 46*/ {788, 270} -}; - void SpellMgr::LoadPetLevelupSpellMap() { uint32 count = 0; @@ -2187,20 +2137,14 @@ void SpellMgr::LoadPetLevelupSpellMap() if(!creatureFamily) // not exist continue; - if(i >= MAX_CREATURE_FAMILY) - continue; - - if(!family2skillline[i][0]) - continue; - for (uint32 j = 0; j < sSkillLineAbilityStore.GetNumRows(); ++j) { SkillLineAbilityEntry const *skillLine = sSkillLineAbilityStore.LookupEntry(j); if( !skillLine ) continue; - if (skillLine->skillId!=family2skillline[i][0] && - (!family2skillline[i][1] || skillLine->skillId!=family2skillline[i][1])) + if (skillLine->skillId!=creatureFamily->skillLine[0] && + (!creatureFamily->skillLine[1] || skillLine->skillId!=creatureFamily->skillLine[1])) continue; if(skillLine->learnOnGetSkill != ABILITY_LEARNED_ON_GET_RACE_OR_CLASS_SKILL) diff --git a/src/game/Unit.h b/src/game/Unit.h index 10a64b3e7..50ee9594f 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -317,7 +317,7 @@ enum DamageTypeToSchool enum AuraRemoveMode { AURA_REMOVE_BY_DEFAULT, - AURA_REMOVE_BY_STACK, // at replace by semillar aura + AURA_REMOVE_BY_STACK, // at replace by similar aura AURA_REMOVE_BY_CANCEL, AURA_REMOVE_BY_DISPEL, AURA_REMOVE_BY_DEATH diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 5653b1fe1..b97904974 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7887" + #define REVISION_NR "7894" #endif // __REVISION_NR_H__