From ce387d853552cef4e1d7912e2e9fb45f2c776b1f Mon Sep 17 00:00:00 2001 From: Wyk3d Date: Thu, 27 Nov 2008 00:22:03 +0200 Subject: [PATCH 01/56] [6850] Use the HashMapHolder instead of MapReference in Map::Update for now (the refs can get invalidated during the loop). --- src/game/Map.cpp | 13 +++++++++++-- src/shared/revision_nr.h | 2 +- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/game/Map.cpp b/src/game/Map.cpp index 606d53df6..924901864 100644 --- a/src/game/Map.cpp +++ b/src/game/Map.cpp @@ -573,12 +573,21 @@ void Map::Update(const uint32 &t_diff) // for pets TypeContainerVisitor world_object_update(updater); - for(MapRefManager::iterator iter = m_mapRefManager.begin(); iter != m_mapRefManager.end(); ++iter) + //TODO: Player guard + HashMapHolder::MapType& playerMap = HashMapHolder::GetContainer(); + for(HashMapHolder::MapType::iterator iter = playerMap.begin(); iter != playerMap.end(); ++iter) { - Player* plr = iter->getSource(); + Player* plr = iter->second; + if(!plr->IsInWorld()) continue; + if(plr->GetMapId() != GetId()) + continue; + + if(plr->GetInstanceId() != GetInstanceId()) + continue; + CellPair standing_cell(MaNGOS::ComputeCellPair(plr->GetPositionX(), plr->GetPositionY())); // Check for correctness of standing_cell, it also avoids problems with update_cell diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 4cca1495f..fe6de2022 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 "6849" + #define REVISION_NR "6850" #endif // __REVISION_NR_H__ From b83cd2a2a901139eeef26534a7850183b2039573 Mon Sep 17 00:00:00 2001 From: arrai Date: Wed, 26 Nov 2008 23:59:10 +0100 Subject: [PATCH 02/56] [6851] Removed level dependant scaling for warlock pets. Only hunter pets are supposed to behave in that way. --- src/game/Pet.cpp | 2 +- src/shared/revision_nr.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/Pet.cpp b/src/game/Pet.cpp index e72e29e64..40cdd9f75 100644 --- a/src/game/Pet.cpp +++ b/src/game/Pet.cpp @@ -1006,7 +1006,7 @@ bool Pet::InitStatsForLevel(uint32 petlevel) SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0); CreatureFamilyEntry const* cFamily = sCreatureFamilyStore.LookupEntry(cinfo->family); - if(cFamily && cFamily->minScale > 0.0f) + if(cFamily && cFamily->minScale > 0.0f && getPetType()==HUNTER_PET) { float scale; if (getLevel() >= cFamily->maxScaleLevel) diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index fe6de2022..fb11e456c 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 "6850" + #define REVISION_NR "6851" #endif // __REVISION_NR_H__ From 51a0f996ecc11546b6180e5e1c6c6f6f0a9ca6af Mon Sep 17 00:00:00 2001 From: ApoC Date: Thu, 27 Nov 2008 16:49:32 +0100 Subject: [PATCH 03/56] [6852] Fixed some queries in AccountMgr.cpp for work with PGSQL Signed-off-by: ApoC --- src/game/AccountMgr.cpp | 8 ++++---- src/shared/revision_nr.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/game/AccountMgr.cpp b/src/game/AccountMgr.cpp index 459cdbeac..3060554a9 100644 --- a/src/game/AccountMgr.cpp +++ b/src/game/AccountMgr.cpp @@ -55,7 +55,7 @@ AccountOpResult AccountMgr::CreateAccount(std::string username, std::string pass return AOR_NAME_ALREDY_EXIST; // username does already exist } - if(!loginDatabase.PExecute("INSERT INTO account(username,sha_pass_hash,joindate) VALUES('%s',SHA1(CONCAT('%s',':','%s')),NOW())", username.c_str(), username.c_str(), password.c_str())) + if(!loginDatabase.PExecute("INSERT INTO account(username,sha_pass_hash,joindate) VALUES('%s',SHA1("_CONCAT3_("'%s'","':'","'%s'")"),NOW())", username.c_str(), username.c_str(), password.c_str())) return AOR_DB_INTERNAL_ERROR; // unexpected error loginDatabase.Execute("INSERT INTO realmcharacters (realmid, acctid, numchars) SELECT realmlist.id, account.id, 0 FROM realmlist,account LEFT JOIN realmcharacters ON acctid=account.id WHERE acctid IS NULL"); @@ -127,7 +127,7 @@ AccountOpResult AccountMgr::ChangeUsername(uint32 accid, std::string new_uname, loginDatabase.escape_string(new_uname); loginDatabase.escape_string(new_passwd); - if(!loginDatabase.PExecute("UPDATE account SET username='%s',sha_pass_hash=SHA1(CONCAT('%s',':','%s')) WHERE id='%d'", new_uname.c_str(), new_uname.c_str(), new_passwd.c_str(), accid)) + if(!loginDatabase.PExecute("UPDATE account SET username='%s',sha_pass_hash=SHA1("_CONCAT3_("'%s'","':'","'%s'")") WHERE id='%d'", new_uname.c_str(), new_uname.c_str(), new_passwd.c_str(), accid)) return AOR_DB_INTERNAL_ERROR; // unexpected error return AOR_OK; @@ -146,7 +146,7 @@ AccountOpResult AccountMgr::ChangePassword(uint32 accid, std::string new_passwd) normilizeString(new_passwd); loginDatabase.escape_string(new_passwd); - if(!loginDatabase.PExecute("UPDATE account SET sha_pass_hash=SHA1(CONCAT(username,':','%s')) WHERE id='%d'", new_passwd.c_str(), accid)) + if(!loginDatabase.PExecute("UPDATE account SET sha_pass_hash=SHA1("_CONCAT3_("username","':'","'%s'")") WHERE id='%d'", new_passwd.c_str(), accid)) return AOR_DB_INTERNAL_ERROR; // unexpected error return AOR_OK; @@ -197,7 +197,7 @@ bool AccountMgr::CheckPassword(uint32 accid, std::string passwd) normilizeString(passwd); loginDatabase.escape_string(passwd); - QueryResult *result = loginDatabase.PQuery("SELECT 1 FROM account WHERE id='%d' AND sha_pass_hash=SHA1(CONCAT(username,':','%s'))", accid, passwd.c_str()); + QueryResult *result = loginDatabase.PQuery("SELECT 1 FROM account WHERE id='%d' AND sha_pass_hash=SHA1("_CONCAT3_("username","':'","'%s'")")", accid, passwd.c_str()); if (result) { delete result; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index fb11e456c..284a5cac6 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 "6851" + #define REVISION_NR "6852" #endif // __REVISION_NR_H__ From a0f45f295eea9b9f3a7c034b0d47326f6c19e738 Mon Sep 17 00:00:00 2001 From: Blaymoira Date: Wed, 19 Nov 2008 19:18:46 +0100 Subject: [PATCH 04/56] SpellEffect Fix for 40802, 43723 (cherry picked from commit 90ec5bed9a29a06190c72851a6bd6e57c3b9bdbc) Signed-off-by: Blaymoira 40802: use exiting function instead code duplication. 43723: added in commented state (impossible propertly fix without hacks until targeting mode 7 implementation) Signed-off-by: VladimirMangos --- src/game/SpellEffects.cpp | 47 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index 72654285e..409a56437 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -608,7 +608,7 @@ void Spell::EffectDummy(uint32 i) switch(m_spellInfo->SpellFamilyName) { case SPELLFAMILY_GENERIC: - // Gnomish Poultryizer trinket + { switch(m_spellInfo->Id ) { case 8063: // Deviate Fish @@ -992,6 +992,50 @@ void Spell::EffectDummy(uint32 i) if(unitTarget) m_caster->CastSpell(unitTarget,37675,true); return; + case 40802: // Mingo's Fortune Generator (Mingo's Fortune Giblets) + { + // selecting one from Bloodstained Fortune item + uint32 newitemid; + switch(urand(1,20)) + { + case 1: newitemid = 32688; break; + case 2: newitemid = 32689; break; + case 3: newitemid = 32690; break; + case 4: newitemid = 32691; break; + case 5: newitemid = 32692; break; + case 6: newitemid = 32693; break; + case 7: newitemid = 32700; break; + case 8: newitemid = 32701; break; + case 9: newitemid = 32702; break; + case 10: newitemid = 32703; break; + case 11: newitemid = 32704; break; + case 12: newitemid = 32705; break; + case 13: newitemid = 32706; break; + case 14: newitemid = 32707; break; + case 15: newitemid = 32708; break; + case 16: newitemid = 32709; break; + case 17: newitemid = 32710; break; + case 18: newitemid = 32711; break; + case 19: newitemid = 32712; break; + case 20: newitemid = 32713; break; + default: + return; + } + + DoCreateItem(i,newitemid); + return; + } + // Demon Broiled Surprise + /* FIX ME: Required for correct work implementing implicit target 7 (in pair (22,7)) + case 43723: + { + if (m_caster->GetTypeId() != TYPEID_PLAYER) + return; + + ((Player*)m_caster)->CastSpell(unitTarget, 43753, true); + return; + } + */ case 44875: // Complete Raptor Capture { if(!unitTarget || unitTarget->GetTypeId() != TYPEID_UNIT) @@ -1139,6 +1183,7 @@ void Spell::EffectDummy(uint32 i) } } break; + } case SPELLFAMILY_MAGE: switch(m_spellInfo->Id ) { From 9fc7dd9eada4e6d21a2c94d762d5f62b43afaee8 Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Fri, 28 Nov 2008 02:14:36 +0300 Subject: [PATCH 05/56] [6853] [2008_11_27_01_mangos_playercreateinfo_item.sql] Use DBC data for creating initial character items. Thanks to WCell team for DBC structure research. `playercreateinfo_item` content removed from mangos.sql and table can be used now only for custom additional initial items. --- sql/mangos.sql | 431 +----------------- ..._11_27_01_mangos_playercreateinfo_item.sql | 3 + sql/updates/Makefile.am | 2 + src/game/ObjectMgr.cpp | 5 +- src/game/Player.cpp | 109 +++-- src/game/Player.h | 1 + src/shared/Database/DBCStores.cpp | 3 + src/shared/Database/DBCStores.h | 1 + src/shared/Database/DBCStructure.h | 15 + src/shared/Database/DBCfmt.cpp | 3 + src/shared/revision_nr.h | 2 +- 11 files changed, 114 insertions(+), 461 deletions(-) create mode 100644 sql/updates/2008_11_27_01_mangos_playercreateinfo_item.sql diff --git a/sql/mangos.sql b/sql/mangos.sql index 5b9a11518..fa1273f60 100644 --- a/sql/mangos.sql +++ b/sql/mangos.sql @@ -22,7 +22,7 @@ DROP TABLE IF EXISTS `db_version`; CREATE TABLE `db_version` ( `version` varchar(120) default NULL, - `required_2008_11_18_02_mangos_mangos_string` bit(1) default NULL + `required_2008_11_27_01_mangos_playercreateinfo_item` bit(1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes'; -- @@ -8073,435 +8073,6 @@ CREATE TABLE `playercreateinfo_item` ( LOCK TABLES `playercreateinfo_item` WRITE; /*!40000 ALTER TABLE `playercreateinfo_item` DISABLE KEYS */; -INSERT INTO `playercreateinfo_item` VALUES -(1,1,38,1), -(1,1,39,1), -(1,1,40,1), -(1,1,25,1), -(1,1,2362,1), -(1,1,117,4), -(1,1,6948,1), -(1,1,14646,1), -(1,2,45,1), -(1,2,44,1), -(1,2,43,1), -(1,2,2361,1), -(1,2,6948,1), -(1,2,159,2), -(1,2,2070,4), -(1,2,14646,1), -(1,4,49,1), -(1,4,48,1), -(1,4,47,1), -(1,4,2092,1), -(1,4,2947,100), -(1,4,2070,4), -(1,4,6948,1), -(1,4,14646,1), -(1,5,53,1), -(1,5,6098,1), -(1,5,52,1), -(1,5,51,1), -(1,5,36,1), -(1,5,159,2), -(1,5,2070,4), -(1,5,6948,1), -(1,5,14646,1), -(1,8,6096,1), -(1,8,56,1), -(1,8,1395,1), -(1,8,55,1), -(1,8,35,1), -(1,8,2070,4), -(1,8,159,2), -(1,8,6948,1), -(1,8,14646,1), -(1,9,6097,1), -(1,9,57,1), -(1,9,1396,1), -(1,9,59,1), -(1,9,2092,1), -(1,9,4604,4), -(1,9,159,2), -(1,9,6948,1), -(1,9,14646,1), -(2,1,6125,1), -(2,1,139,1), -(2,1,140,1), -(2,1,12282,1), -(2,1,6948,1), -(2,1,117,4), -(2,1,14649,1), -(2,3,127,1), -(2,3,6126,1), -(2,3,6127,1), -(2,3,37,1), -(2,3,2504,1), -(2,3,159,2), -(2,3,117,4), -(2,3,6948,1), -(2,3,14649,1), -(2,3,2512,200), -(2,3,2101,1), -(2,4,2105,1), -(2,4,120,1), -(2,4,121,1), -(2,4,2092,1), -(2,4,25861,100), -(2,4,117,4), -(2,4,6948,1), -(2,4,14649,1), -(2,7,154,1), -(2,7,153,1), -(2,7,36,1), -(2,7,6948,1), -(2,7,117,4), -(2,7,159,2), -(2,7,14649,1), -(2,9,6129,1), -(2,9,1396,1), -(2,9,59,1), -(2,9,2092,1), -(2,9,6948,1), -(2,9,117,4), -(2,9,159,2), -(2,9,14649,1), -(3,1,38,1), -(3,1,39,1), -(3,1,40,1), -(3,1,12282,1), -(3,1,6948,1), -(3,1,117,4), -(3,1,14647,1), -(3,2,45,1), -(3,2,44,1), -(3,2,43,1), -(3,2,2361,1), -(3,2,4540,4), -(3,2,159,2), -(3,2,6948,1), -(3,2,14647,1), -(3,3,148,1), -(3,3,147,1), -(3,3,129,1), -(3,3,37,1), -(3,3,2508,1), -(3,3,159,2), -(3,3,117,4), -(3,3,6948,1), -(3,3,14647,1), -(3,3,2516,200), -(3,3,2102,1), -(3,4,49,1), -(3,4,48,1), -(3,4,47,1), -(3,4,2092,1), -(3,4,25861,100), -(3,4,4540,4), -(3,4,6948,1), -(3,4,14647,1), -(3,5,53,1), -(3,5,6098,1), -(3,5,52,1), -(3,5,51,1), -(3,5,36,1), -(3,5,159,2), -(3,5,4540,4), -(3,5,6948,1), -(3,5,14647,1), -(4,1,38,1), -(4,1,39,1), -(4,1,40,1), -(4,1,25,1), -(4,1,2362,1), -(4,1,117,4), -(4,1,6948,1), -(4,1,14648,1), -(4,3,148,1), -(4,3,147,1), -(4,3,129,1), -(4,3,2092,1), -(4,3,2504,1), -(4,3,159,2), -(4,3,117,4), -(4,3,6948,1), -(4,3,14648,1), -(4,3,2512,200), -(4,3,2101,1), -(4,4,49,1), -(4,4,48,1), -(4,4,47,1), -(4,4,2092,1), -(4,4,2947,100), -(4,4,4540,4), -(4,4,6948,1), -(4,4,14648,1), -(4,5,53,1), -(4,5,6119,1), -(4,5,52,1), -(4,5,51,1), -(4,5,36,1), -(4,5,2070,4), -(4,5,159,2), -(4,5,6948,1), -(4,5,14648,1), -(4,11,6123,1), -(4,11,44,1), -(4,11,3661,1), -(4,11,159,2), -(4,11,4536,4), -(4,11,6948,1), -(4,11,14648,1), -(5,1,6125,1), -(5,1,139,1), -(5,1,140,1), -(5,1,25,1), -(5,1,2362,1), -(5,1,4604,4), -(5,1,6948,1), -(5,1,14651,1), -(5,4,2105,1), -(5,4,120,1), -(5,4,121,1), -(5,4,2092,1), -(5,4,2947,100), -(5,4,4604,4), -(5,4,6948,1), -(5,4,14651,1), -(5,5,53,1), -(5,5,6144,1), -(5,5,52,1), -(5,5,51,1), -(5,5,36,1), -(5,5,4604,4), -(5,5,159,2), -(5,5,6948,1), -(5,5,14651,1), -(5,8,6096,1), -(5,8,6140,1), -(5,8,1395,1), -(5,8,55,1), -(5,8,35,1), -(5,8,4604,4), -(5,8,159,2), -(5,8,6948,1), -(5,8,14651,1), -(5,9,6129,1), -(5,9,1396,1), -(5,9,59,1), -(5,9,2092,1), -(5,9,4604,4), -(5,9,159,2), -(5,9,6948,1), -(5,9,14651,1), -(6,1,6125,1), -(6,1,139,1), -(6,1,2361,1), -(6,1,6948,1), -(6,1,4540,4), -(6,1,14650,1), -(6,3,127,1), -(6,3,6126,1), -(6,3,37,1), -(6,3,2508,1), -(6,3,159,2), -(6,3,117,4), -(6,3,6948,1), -(6,3,14650,1), -(6,3,2516,200), -(6,3,2102,1), -(6,7,154,1), -(6,7,153,1), -(6,7,36,1), -(6,7,6948,1), -(6,7,4604,4), -(6,7,159,2), -(6,7,14650,1), -(6,11,6139,1), -(6,11,6124,1), -(6,11,35,1), -(6,11,159,2), -(6,11,4536,4), -(6,11,6948,1), -(6,11,14650,1), -(7,1,38,1), -(7,1,39,1), -(7,1,40,1), -(7,1,25,1), -(7,1,2362,1), -(7,1,117,4), -(7,1,6948,1), -(7,1,14647,1), -(7,4,49,1), -(7,4,48,1), -(7,4,47,1), -(7,4,2092,1), -(7,4,2947,100), -(7,4,117,4), -(7,4,6948,1), -(7,4,14647,1), -(7,8,6096,1), -(7,8,56,1), -(7,8,1395,1), -(7,8,55,1), -(7,8,35,1), -(7,8,4536,4), -(7,8,159,2), -(7,8,6948,1), -(7,8,14647,1), -(7,9,6097,1), -(7,9,57,1), -(7,9,1396,1), -(7,9,59,1), -(7,9,2092,1), -(7,9,159,2), -(7,9,4604,4), -(7,9,6948,1), -(7,9,14647,1), -(8,1,6125,1), -(8,1,139,1), -(8,1,140,1), -(8,1,37,1), -(8,1,2362,1), -(8,1,25861,100), -(8,1,117,4), -(8,1,6948,1), -(8,1,14649,1), -(8,3,127,1), -(8,3,6126,1), -(8,3,6127,1), -(8,3,37,1), -(8,3,2504,1), -(8,3,4604,4), -(8,3,159,2), -(8,3,2512,200), -(8,3,2101,1), -(8,3,14649,1), -(8,3,6948,1), -(8,4,2105,1), -(8,4,120,1), -(8,4,121,1), -(8,4,2092,1), -(8,4,25861,100), -(8,4,117,4), -(8,4,6948,1), -(8,4,14649,1), -(8,5,53,1), -(8,5,6144,1), -(8,5,52,1), -(8,5,36,1), -(8,5,4540,4), -(8,5,159,2), -(8,5,6948,1), -(8,5,14649,1), -(8,7,6134,1), -(8,7,6135,1), -(8,7,36,1), -(8,7,117,4), -(8,7,159,2), -(8,7,6948,1), -(8,7,14649,1), -(8,8,6096,1), -(8,8,6140,1), -(8,8,1395,1), -(8,8,55,1), -(8,8,35,1), -(8,8,117,4), -(8,8,159,2), -(8,8,6948,1), -(8,8,14649,1), -(10,2,159,5), -(10,2,2070,5), -(10,2,6948,1), -(10,2,23346,1), -(10,2,24143,1), -(10,2,24145,1), -(10,2,24146,1), -(10,3,159,5), -(10,3,2101,1), -(10,3,2512,200), -(10,3,6948,1), -(10,3,20857,5), -(10,3,20899,1), -(10,3,20900,1), -(10,3,20901,1), -(10,3,20980,1), -(10,3,20982,1), -(10,4,3111,100), -(10,4,6948,1), -(10,4,20857,10), -(10,4,20896,1), -(10,4,20897,1), -(10,4,20898,1), -(10,4,20982,1), -(10,5,51,1), -(10,5,52,1), -(10,5,53,1), -(10,5,159,5), -(10,5,6948,1), -(10,5,20891,1), -(10,5,20981,5), -(10,8,35,1), -(10,8,159,5), -(10,8,6096,1), -(10,8,6948,1), -(10,8,20857,5), -(10,8,20893,1), -(10,8,20894,1), -(10,8,20895,1), -(10,9,59,1), -(10,9,159,5), -(10,9,1396,1), -(10,9,6948,1), -(10,9,20857,5), -(10,9,20892,1), -(10,9,20983,1), -(11,1,4540,5), -(11,1,6948,1), -(11,1,23346,1), -(11,1,23473,1), -(11,1,23474,1), -(11,1,23475,1), -(11,2,159,5), -(11,2,2361,1), -(11,2,4540,5), -(11,2,6948,1), -(11,2,23476,1), -(11,2,23476,1), -(11,2,23477,1), -(11,3,25,1), -(11,3,159,5), -(11,3,2101,1), -(11,3,2504,1), -(11,3,2512,200), -(11,3,4540,5), -(11,3,6948,1), -(11,3,23344,1), -(11,3,23345,1), -(11,3,23348,1), -(11,5,36,1), -(11,5,59,1), -(11,5,159,5), -(11,5,1396,1), -(11,5,4540,5), -(11,5,6097,1), -(11,5,6948,1), -(11,5,23322,1), -(11,7,36,1), -(11,7,159,5), -(11,7,4540,5), -(11,7,6948,1), -(11,7,23344,1), -(11,7,23345,1), -(11,7,23348,1), -(11,8,35,1), -(11,8,159,5), -(11,8,4540,5), -(11,8,6948,1), -(11,8,23473,1), -(11,8,23475,1), -(11,8,23478,1), -(11,8,23479,1); /*!40000 ALTER TABLE `playercreateinfo_item` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/updates/2008_11_27_01_mangos_playercreateinfo_item.sql b/sql/updates/2008_11_27_01_mangos_playercreateinfo_item.sql new file mode 100644 index 000000000..48d50dd91 --- /dev/null +++ b/sql/updates/2008_11_27_01_mangos_playercreateinfo_item.sql @@ -0,0 +1,3 @@ +ALTER TABLE db_version CHANGE COLUMN required_2008_11_18_02_mangos_mangos_string required_2008_11_27_01_mangos_playercreateinfo_item bit; + +TRUNCATE TABLE playercreateinfo_item; diff --git a/sql/updates/Makefile.am b/sql/updates/Makefile.am index 13245d807..d363373f1 100644 --- a/sql/updates/Makefile.am +++ b/sql/updates/Makefile.am @@ -137,6 +137,7 @@ pkgdata_DATA = \ 2008_11_16_01_mangos_command.sql \ 2008_11_18_01_mangos_creature_movement.sql \ 2008_11_18_02_mangos_mangos_string.sql \ + 2008_11_27_01_mangos_playercreateinfo_item.sql \ README ## Additional files to include when running 'make dist' @@ -255,4 +256,5 @@ EXTRA_DIST = \ 2008_11_16_01_mangos_command.sql \ 2008_11_18_01_mangos_creature_movement.sql \ 2008_11_18_02_mangos_mangos_string.sql \ + 2008_11_27_01_mangos_playercreateinfo_item.sql \ README diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index d0c75aa8b..5394289e2 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -2090,8 +2090,7 @@ void ObjectMgr::LoadPlayerInfo() barGoLink bar( 1 ); sLog.outString(); - sLog.outString( ">> Loaded %u player create items", count ); - sLog.outErrorDb( "Error loading `playercreateinfo_item` table or empty table."); + sLog.outString( ">> Loaded %u custom player create items", count ); } else { @@ -2143,7 +2142,7 @@ void ObjectMgr::LoadPlayerInfo() delete result; sLog.outString(); - sLog.outString( ">> Loaded %u player create items", count ); + sLog.outString( ">> Loaded %u custom player create items", count ); } } diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 889b6177b..dfb957093 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -553,7 +553,9 @@ bool Player::Create( uint32 guidlow, std::string name, uint8 race, uint8 class_, setFactionForRace(m_race); - SetUInt32Value(UNIT_FIELD_BYTES_0, ( ( race ) | ( class_ << 8 ) | ( gender << 16 ) | ( powertype << 24 ) ) ); + uint32 RaceClassGender = ( race ) | ( class_ << 8 ) | ( gender << 16 ); + + SetUInt32Value(UNIT_FIELD_BYTES_0, ( RaceClassGender | ( powertype << 24 ) ) ); SetUInt32Value(UNIT_FIELD_BYTES_1, unitfield); SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_UNK3 | UNIT_BYTE2_FLAG_UNK5 ); SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE ); @@ -600,8 +602,10 @@ bool Player::Create( uint32 guidlow, std::string name, uint8 race, uint8 class_, SetPower(POWER_MANA,GetMaxPower(POWER_MANA)); } + // original spells learnDefaultSpells(true); + // original action bar std::list::const_iterator action_itr[4]; for(int i=0; i<4; i++) action_itr[i] = info->action[i].begin(); @@ -618,37 +622,59 @@ bool Player::Create( uint32 guidlow, std::string name, uint8 race, uint8 class_, ++action_itr[i]; } - for (PlayerCreateInfoItems::const_iterator item_id_itr = info->item.begin(); item_id_itr!=info->item.end(); ++item_id_itr++) + // original items + CharStartOutfitEntry const* oEntry = NULL; + for (uint32 i = 1; i < sCharStartOutfitStore.GetNumRows(); ++i) { - uint32 titem_id = item_id_itr->item_id; - uint32 titem_amount = item_id_itr->item_amount; - - sLog.outDebug("STORAGE: Creating initial item, itemId = %u, count = %u",titem_id, titem_amount); - - // attempt equip - uint16 eDest; - uint8 msg = CanEquipNewItem( NULL_SLOT, eDest, titem_id, titem_amount, false ); - if( msg == EQUIP_ERR_OK ) + if(CharStartOutfitEntry const* entry = sCharStartOutfitStore.LookupEntry(i)) { - EquipNewItem( eDest, titem_id, titem_amount, true); - AutoUnequipOffhandIfNeed(); - continue; // equipped, to next + if(entry->RaceClassGender == RaceClassGender) + { + oEntry = entry; + break; + } } - - // attempt store - ItemPosCountVec sDest; - // store in main bag to simplify second pass (special bags can be not equipped yet at this moment) - msg = CanStoreNewItem( INVENTORY_SLOT_BAG_0, NULL_SLOT, sDest, titem_id, titem_amount ); - if( msg == EQUIP_ERR_OK ) - { - StoreNewItem( sDest, titem_id, true, Item::GenerateItemRandomPropertyId(titem_id) ); - continue; // stored, to next - } - - // item can't be added - sLog.outError("STORAGE: Can't equip or store initial item %u for race %u class %u , error msg = %u",titem_id,race,class_,msg); } + if(oEntry) + { + for(int j = 0; j < MAX_OUTFIT_ITEMS; ++j) + { + if(oEntry->ItemId[j] <= 0) + continue; + + uint32 item_id = oEntry->ItemId[j]; + + ItemPrototype const* iProto = objmgr.GetItemPrototype(item_id); + if(!iProto) + { + sLog.outErrorDb("Initial item id %u (race %u class %u) from CharStartOutfit.dbc not listed in `item_template`, ignoring.",item_id,getRace(),getClass()); + continue; + } + + uint32 count = iProto->Stackable; // max stack by default (mostly 1) + if(iProto->Class==ITEM_CLASS_CONSUMABLE && iProto->SubClass==ITEM_SUBCLASS_FOOD) + { + switch(iProto->Spells[0].SpellCategory) + { + case 11: // food + if(iProto->Stackable > 4) + count = 4; + break; + case 59: // drink + if(iProto->Stackable > 2) + count = 2; + break; + } + } + + StoreNewItemInBestSlot(item_id, count); + } + } + + for (PlayerCreateInfoItems::const_iterator item_id_itr = info->item.begin(); item_id_itr!=info->item.end(); ++item_id_itr++) + StoreNewItemInBestSlot(item_id_itr->item_id, item_id_itr->item_amount); + // bags and main-hand weapon must equipped at this moment // now second pass for not equipped (offhand weapon/shield if it attempt equipped before main-hand weapon) // or ammo not equipped in special bag @@ -687,6 +713,35 @@ bool Player::Create( uint32 guidlow, std::string name, uint8 race, uint8 class_, return true; } +bool Player::StoreNewItemInBestSlot(uint32 titem_id, uint32 titem_amount) +{ + sLog.outDebug("STORAGE: Creating initial item, itemId = %u, count = %u",titem_id, titem_amount); + + // attempt equip + uint16 eDest; + uint8 msg = CanEquipNewItem( NULL_SLOT, eDest, titem_id, titem_amount, false ); + if( msg == EQUIP_ERR_OK ) + { + EquipNewItem( eDest, titem_id, titem_amount, true); + AutoUnequipOffhandIfNeed(); + return true; // equipped + } + + // attempt store + ItemPosCountVec sDest; + // store in main bag to simplify second pass (special bags can be not equipped yet at this moment) + msg = CanStoreNewItem( INVENTORY_SLOT_BAG_0, NULL_SLOT, sDest, titem_id, titem_amount ); + if( msg == EQUIP_ERR_OK ) + { + StoreNewItem( sDest, titem_id, true, Item::GenerateItemRandomPropertyId(titem_id) ); + return true; // stored + } + + // item can't be added + sLog.outError("STORAGE: Can't equip or store initial item %u for race %u class %u , error msg = %u",titem_id,getRace(),getClass(),msg); + return false; +} + void Player::StartMirrorTimer(MirrorTimerType Type, uint32 MaxValue) { uint32 BreathRegen = (uint32)-1; diff --git a/src/game/Player.h b/src/game/Player.h index ec8f4f3cc..d38c4c2cd 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -1067,6 +1067,7 @@ class MANGOS_DLL_SPEC Player : public Unit Item* EquipNewItem( uint16 pos, uint32 item, uint32 count, bool update ); Item* EquipItem( uint16 pos, Item *pItem, bool update ); void AutoUnequipOffhandIfNeed(); + bool StoreNewItemInBestSlot(uint32 item_id, uint32 item_count); uint8 _CanTakeMoreSimilarItems(uint32 entry, uint32 count, Item* pItem, uint32* no_space_count = NULL) const; uint8 _CanStoreItem( uint8 bag, uint8 slot, ItemPosCountVec& dest, uint32 entry, uint32 count, Item *pItem = NULL, bool swap = false, uint32* no_space_count = NULL ) const; diff --git a/src/shared/Database/DBCStores.cpp b/src/shared/Database/DBCStores.cpp index 0c0af078b..c7c508004 100644 --- a/src/shared/Database/DBCStores.cpp +++ b/src/shared/Database/DBCStores.cpp @@ -36,6 +36,7 @@ static AreaFlagByMapID sAreaFlagByMapID; // for instances wit DBCStorage sAreaTriggerStore(AreaTriggerEntryfmt); DBCStorage sBankBagSlotPricesStore(BankBagSlotPricesEntryfmt); DBCStorage sBattlemasterListStore(BattlemasterListEntryfmt); +DBCStorage sCharStartOutfitStore(CharStartOutfitEntryfmt); DBCStorage sCharTitlesStore(CharTitlesEntryfmt); DBCStorage sChatChannelsStore(ChatChannelsEntryfmt); DBCStorage sChrClassesStore(ChrClassesEntryfmt); @@ -201,6 +202,8 @@ void LoadDBCStores(std::string dataPath) LoadDBC(availableDbcLocales,bar,bad_dbc_files,sAreaTriggerStore, dbcPath,"AreaTrigger.dbc"); LoadDBC(availableDbcLocales,bar,bad_dbc_files,sBankBagSlotPricesStore, dbcPath,"BankBagSlotPrices.dbc"); LoadDBC(availableDbcLocales,bar,bad_dbc_files,sBattlemasterListStore, dbcPath,"BattlemasterList.dbc"); + LoadDBC(availableDbcLocales,bar,bad_dbc_files,sCharStartOutfitStore, dbcPath,"CharStartOutfit.dbc"); + LoadDBC(availableDbcLocales,bar,bad_dbc_files,sCharTitlesStore, dbcPath,"CharTitles.dbc"); LoadDBC(availableDbcLocales,bar,bad_dbc_files,sChatChannelsStore, dbcPath,"ChatChannels.dbc"); LoadDBC(availableDbcLocales,bar,bad_dbc_files,sChrClassesStore, dbcPath,"ChrClasses.dbc"); diff --git a/src/shared/Database/DBCStores.h b/src/shared/Database/DBCStores.h index 041281e5a..54850f40a 100644 --- a/src/shared/Database/DBCStores.h +++ b/src/shared/Database/DBCStores.h @@ -134,6 +134,7 @@ extern DBCStorage sAreaTriggerStore; extern DBCStorage sBankBagSlotPricesStore; extern DBCStorage sBattlemasterListStore; //extern DBCStorage sChatChannelsStore; -- accessed using function, no usable index +extern DBCStorage sCharStartOutfitStore; extern DBCStorage sCharTitlesStore; extern DBCStorage sChrClassesStore; extern DBCStorage sChrRacesStore; diff --git a/src/shared/Database/DBCStructure.h b/src/shared/Database/DBCStructure.h index b45f9c977..59d5d18c4 100644 --- a/src/shared/Database/DBCStructure.h +++ b/src/shared/Database/DBCStructure.h @@ -84,6 +84,21 @@ struct BattlemasterListEntry // 32 unused }; +#define MAX_OUTFIT_ITEMS 12 +// #define MAX_OUTFIT_ITEMS 24 // 12->24 in 3.0.x + +struct CharStartOutfitEntry +{ + //uint32 Id; // 0 + uint32 RaceClassGender; // 1 (UNIT_FIELD_BYTES_0 & 0x00FFFFFF) comparable (0 byte = race, 1 byte = class, 2 byte = gender) + int32 ItemId[MAX_OUTFIT_ITEMS]; // 2-13 + //int32 ItemDisplayId[MAX_OUTFIT_ITEMS]; // 14-25 not required at server side + //int32 ItemInventorySlot[MAX_OUTFIT_ITEMS]; // 26-37 not required at server side + //uint32 Unknown1; // 38, unique values (index-like with gaps ordered in other way as ids) + //uint32 Unknown2; // 39 + //uint32 Unknown3; // 40 +}; + struct CharTitlesEntry { uint32 ID; // 0, title ids, for example in Quest::GetCharTitleId() diff --git a/src/shared/Database/DBCfmt.cpp b/src/shared/Database/DBCfmt.cpp index a8f37f68c..82f2da489 100644 --- a/src/shared/Database/DBCfmt.cpp +++ b/src/shared/Database/DBCfmt.cpp @@ -20,6 +20,9 @@ const char AreaTableEntryfmt[]="iiinixxxxxissssssssssssssssxixxxxxx"; const char AreaTriggerEntryfmt[]="niffffffff"; const char BankBagSlotPricesEntryfmt[]="ni"; const char BattlemasterListEntryfmt[]="niiixxxxxiiiixxssssssssssssssssxx"; +const char CharStartOutfitEntryfmt[]="diiiiiiiiiiiiixxxxxxxxxxxxxxxxxxxxxxxxxxx"; +// 3*12 new item fields in 3.0.x +//const char CharStartOutfitEntryfmt[]="diiiiiiiiiiiiiiiiiiiiiiiiixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; const char CharTitlesEntryfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxi"; const char ChatChannelsEntryfmt[]="iixssssssssssssssssxxxxxxxxxxxxxxxxxx"; // ChatChannelsEntryfmt, index not used (more compact store) diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 284a5cac6..c2dd4a599 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 "6852" + #define REVISION_NR "6853" #endif // __REVISION_NR_H__ From d922ea27b97720fa2cec7a426efe062f9d548379 Mon Sep 17 00:00:00 2001 From: ApoC Date: Fri, 28 Nov 2008 00:32:08 +0100 Subject: [PATCH 06/56] [6854] Prevent pets attack through obstructions. Signed-off-by: ApoC --- src/game/PetHandler.cpp | 5 ++++- src/shared/revision_nr.h | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/game/PetHandler.cpp b/src/game/PetHandler.cpp index 787b08661..0ef5f1c01 100644 --- a/src/game/PetHandler.cpp +++ b/src/game/PetHandler.cpp @@ -99,7 +99,10 @@ void WorldSession::HandlePetAction( WorldPacket & recv_data ) return; // not let attack friendly units. - if( GetPlayer()->IsFriendlyTo(TargetUnit)) + if(GetPlayer()->IsFriendlyTo(TargetUnit)) + return; + // Not let attack through obstructions + if(!pet->IsWithinLOSInMap(TargetUnit)) return; if(pet->getVictim()) diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index c2dd4a599..2ca2e69e8 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 "6853" + #define REVISION_NR "6854" #endif // __REVISION_NR_H__ From 316acd590cc4660d311362b8a2e659de727be0c8 Mon Sep 17 00:00:00 2001 From: Wyk3d Date: Thu, 27 Nov 2008 20:48:19 +0200 Subject: [PATCH 07/56] Fixed a bug with setting the reset schedul when removing players from the map --- src/game/Map.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/game/Map.cpp b/src/game/Map.cpp index 924901864..4da16004b 100644 --- a/src/game/Map.cpp +++ b/src/game/Map.cpp @@ -1625,6 +1625,8 @@ bool InstanceMap::Add(Player *player) } if(i_data) i_data->OnPlayerEnter(player); + // for normal instances cancel the reset schedule when the + // first player enters (no players yet) SetResetSchedule(false); player->SendInitWorldStates(); @@ -1651,11 +1653,12 @@ void InstanceMap::Update(const uint32& t_diff) void InstanceMap::Remove(Player *player, bool remove) { sLog.outDetail("MAP: Removing player '%s' from instance '%u' of map '%s' before relocating to other map", player->GetName(), GetInstanceId(), GetMapName()); - SetResetSchedule(true); //if last player set unload timer if(!m_unloadTimer && m_mapRefManager.getSize() == 1) m_unloadTimer = m_unloadWhenEmpty ? MIN_UNLOAD_DELAY : std::max(sWorld.getConfig(CONFIG_INSTANCE_UNLOAD_DELAY), (uint32)MIN_UNLOAD_DELAY); Map::Remove(player, remove); + // for normal instances schedule the reset after all players have left + SetResetSchedule(true); } void InstanceMap::CreateInstanceData(bool load) From 8b707ca072d78f4c70c6e91797d8026134e468e8 Mon Sep 17 00:00:00 2001 From: Wyk3d Date: Fri, 28 Nov 2008 08:01:37 +0200 Subject: [PATCH 08/56] [6855] Fixed the MapReference loop on map update by storing the iterator in the map. --- src/framework/Utilities/LinkedList.h | 30 +++++++++++++++++++ .../Utilities/LinkedReference/Reference.h | 12 ++++++-- src/game/Map.cpp | 21 ++++++------- src/game/Map.h | 1 + src/game/MapReference.h | 2 ++ src/shared/revision_nr.h | 2 +- 6 files changed, 54 insertions(+), 14 deletions(-) diff --git a/src/framework/Utilities/LinkedList.h b/src/framework/Utilities/LinkedList.h index 7ca217fe7..97fbce4ae 100644 --- a/src/framework/Utilities/LinkedList.h +++ b/src/framework/Utilities/LinkedList.h @@ -44,6 +44,11 @@ class LinkedListElement LinkedListElement * prev() { return hasPrev() ? iPrev : NULL; } LinkedListElement const* prev() const { return hasPrev() ? iPrev : NULL; } + LinkedListElement * nocheck_next() { return iNext; } + LinkedListElement const* nocheck_next() const { return iNext; } + LinkedListElement * nocheck_prev() { return iPrev; } + LinkedListElement const* nocheck_prev() const { return iPrev; } + void delink() { if(isInList()) @@ -134,7 +139,10 @@ class LinkedListHead typedef ptrdiff_t difference_type; typedef ptrdiff_t distance_type; typedef _Ty* pointer; + typedef _Ty const* const_pointer; typedef _Ty& reference; + typedef _Ty const & const_reference; + Iterator() : _Ptr(0) { // construct with null node pointer @@ -144,6 +152,17 @@ class LinkedListHead { // construct with node pointer _Pnode } + Iterator& operator=(Iterator const &_Right) + { + return (*this) = _Right._Ptr; + } + + Iterator& operator=(const_pointer const &_Right) + { + _Ptr = (pointer)_Right; + return (*this); + } + reference operator*() { // return designated value return *_Ptr; @@ -200,6 +219,17 @@ class LinkedListHead return (!(*this == _Right)); } + bool operator==(const_reference _Right) const + { // test for reference equality + return (_Ptr == &_Right); + } + + bool operator!=(const_reference _Right) const + { // test for reference equality + return (_Ptr != &_Right)); + } + + pointer _Mynode() { // return node pointer return (_Ptr); diff --git a/src/framework/Utilities/LinkedReference/Reference.h b/src/framework/Utilities/LinkedReference/Reference.h index a3c879709..3c84704dc 100644 --- a/src/framework/Utilities/LinkedReference/Reference.h +++ b/src/framework/Utilities/LinkedReference/Reference.h @@ -71,9 +71,15 @@ template class Reference : public LinkedListElement return iRefTo != NULL; } - Reference* next() { return((Reference*)LinkedListElement::next()); } - Referenceconst* next() const { return((Reference const*)LinkedListElement::next()); } - Reference* prev() { return((Reference*)LinkedListElement::prev()); } + Reference * next() { return((Reference *) LinkedListElement::next()); } + Reference const * next() const { return((Reference const *) LinkedListElement::next()); } + Reference * prev() { return((Reference *) LinkedListElement::prev()); } + Reference const * prev() const { return((Reference const *) LinkedListElement::prev()); } + + Reference * nocheck_next() { return((Reference *) LinkedListElement::nocheck_next()); } + Reference const * nocheck_next() const { return((Reference const *) LinkedListElement::nocheck_next()); } + Reference * nocheck_prev() { return((Reference *) LinkedListElement::nocheck_prev()); } + Reference const * nocheck_prev() const { return((Reference const *) LinkedListElement::nocheck_prev()); } inline TO* operator ->() const { return iRefTo; } inline TO* getTarget() const { return iRefTo; } diff --git a/src/game/Map.cpp b/src/game/Map.cpp index 4da16004b..d782f6cba 100644 --- a/src/game/Map.cpp +++ b/src/game/Map.cpp @@ -573,21 +573,15 @@ void Map::Update(const uint32 &t_diff) // for pets TypeContainerVisitor world_object_update(updater); - //TODO: Player guard - HashMapHolder::MapType& playerMap = HashMapHolder::GetContainer(); - for(HashMapHolder::MapType::iterator iter = playerMap.begin(); iter != playerMap.end(); ++iter) + // the player iterator is stored in the map object + // to make sure calls to Map::Remove don't invalidate it + for(m_mapRefIter = m_mapRefManager.begin(); m_mapRefIter != m_mapRefManager.end(); ++m_mapRefIter) { - Player* plr = iter->second; + Player* plr = m_mapRefIter->getSource(); if(!plr->IsInWorld()) continue; - if(plr->GetMapId() != GetId()) - continue; - - if(plr->GetInstanceId() != GetInstanceId()) - continue; - CellPair standing_cell(MaNGOS::ComputeCellPair(plr->GetPositionX(), plr->GetPositionY())); // Check for correctness of standing_cell, it also avoids problems with update_cell @@ -640,6 +634,13 @@ void Map::Update(const uint32 &t_diff) void Map::Remove(Player *player, bool remove) { + // this may be called during Map::Update + // after decrement+unlink, ++m_mapRefIter will continue correctly + // when the first element of the list is being removed + // nocheck_prev will return the padding element of the RefManager + // instead of NULL in the case of prev + if(m_mapRefIter == player->GetMapRef()) + m_mapRefIter = m_mapRefIter->nocheck_prev(); player->GetMapRef().unlink(); CellPair p = MaNGOS::ComputeCellPair(player->GetPositionX(), player->GetPositionY()); if(p.x_coord >= TOTAL_NUMBER_OF_CELLS_PER_MAP || p.y_coord >= TOTAL_NUMBER_OF_CELLS_PER_MAP) diff --git a/src/game/Map.h b/src/game/Map.h index d24523e84..1fe978754 100644 --- a/src/game/Map.h +++ b/src/game/Map.h @@ -292,6 +292,7 @@ class MANGOS_DLL_SPEC Map : public GridRefManager, public MaNGOS::Obj uint32 m_unloadTimer; MapRefManager m_mapRefManager; + MapRefManager::iterator m_mapRefIter; private: typedef GridReadGuard ReadGuard; typedef GridWriteGuard WriteGuard; diff --git a/src/game/MapReference.h b/src/game/MapReference.h index 4ab1d116d..e58e06cf8 100644 --- a/src/game/MapReference.h +++ b/src/game/MapReference.h @@ -46,5 +46,7 @@ class MANGOS_DLL_SPEC MapReference : public Reference ~MapReference() { unlink(); } MapReference *next() { return (MapReference*)Reference::next(); } MapReference const *next() const { return (MapReference const*)Reference::next(); } + MapReference *nockeck_prev() { return (MapReference*)Reference::nocheck_prev(); } + MapReference const *nocheck_prev() const { return (MapReference const*)Reference::nocheck_prev(); } }; #endif diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 2ca2e69e8..4ffc9d5e7 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 "6854" + #define REVISION_NR "6855" #endif // __REVISION_NR_H__ From 9aa0578770f93dfc0b95397e4fb6abad336cb62f Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Fri, 28 Nov 2008 16:13:30 +0300 Subject: [PATCH 09/56] [6856] Fixed typo in not used function. This let build mangos with VS90/GCC. --- src/framework/Utilities/LinkedList.h | 2 +- src/shared/revision_nr.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/framework/Utilities/LinkedList.h b/src/framework/Utilities/LinkedList.h index 97fbce4ae..9e6f9249c 100644 --- a/src/framework/Utilities/LinkedList.h +++ b/src/framework/Utilities/LinkedList.h @@ -226,7 +226,7 @@ class LinkedListHead bool operator!=(const_reference _Right) const { // test for reference equality - return (_Ptr != &_Right)); + return (_Ptr != &_Right); } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 4ffc9d5e7..0fc59aede 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 "6855" + #define REVISION_NR "6856" #endif // __REVISION_NR_H__ From 8cb9e2becbfa1688b52da7ba1cc230e9bb8fc3c8 Mon Sep 17 00:00:00 2001 From: arrai Date: Fri, 28 Nov 2008 21:04:24 +0100 Subject: [PATCH 10/56] [6857] Fixed crash in ObjectMgr::CheckScripts --- src/game/ObjectMgr.cpp | 2 +- src/shared/revision_nr.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index 5394289e2..0fcedab16 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -7256,7 +7256,7 @@ void ObjectMgr::CheckScripts(ScriptMapMap const& scripts,std::set& ids) if(itrM->second.dataint) { if(!GetMangosStringLocale (itrM->second.dataint)) - sLog.outErrorDb( "Table `db_script_string` has not existed string id %u", *itrM); + sLog.outErrorDb( "Table `db_script_string` has not existed string id %u", itrM->first); if(ids.count(itrM->second.dataint)) ids.erase(itrM->second.dataint); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 0fc59aede..2aeb8cbf2 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 "6856" + #define REVISION_NR "6857" #endif // __REVISION_NR_H__ From 874339ecee1e86d6c3f0f20860312a05cf4b962c Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Sat, 29 Nov 2008 03:09:39 +0300 Subject: [PATCH 11/56] Fixed path to source file in VC80/VC90 framework.vcproj --- win/VC80/framework.vcproj | 2 +- win/VC90/framework.vcproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/win/VC80/framework.vcproj b/win/VC80/framework.vcproj index 9b41a6692..b9cda2773 100644 --- a/win/VC80/framework.vcproj +++ b/win/VC80/framework.vcproj @@ -422,7 +422,7 @@ > Date: Sat, 29 Nov 2008 08:00:27 +0300 Subject: [PATCH 12/56] [6858] Prevent cheating with ignore waiting in login queue. Cheating preventing at reconect for queued session and sending unexpected packets to server. Removed unneeded after ACE related changes kicked sessions list. --- src/game/WaypointMovementGenerator.cpp | 3 +- src/game/World.cpp | 80 +++++++++++++------------- src/game/World.h | 4 +- src/game/WorldSession.cpp | 9 ++- src/game/WorldSession.h | 4 ++ src/mangosd/WorldRunnable.cpp | 1 - src/shared/revision_nr.h | 2 +- 7 files changed, 56 insertions(+), 47 deletions(-) diff --git a/src/game/WaypointMovementGenerator.cpp b/src/game/WaypointMovementGenerator.cpp index 179581ba3..77a9a2eb3 100644 --- a/src/game/WaypointMovementGenerator.cpp +++ b/src/game/WaypointMovementGenerator.cpp @@ -50,7 +50,8 @@ WaypointMovementGenerator::LoadPath(Creature &c) i_path = WaypointMgr.GetPath(c.GetDBTableGUIDLow()); if(!i_path) { - sLog.outErrorDb("WaypointMovementGenerator::LoadPath: creature %s(%d) doesn't have waypoint path", c.GetName(), c.GetDBTableGUIDLow()); + sLog.outErrorDb("WaypointMovementGenerator::LoadPath: creature %s (Entry: %u GUID: %d) doesn't have waypoint path", + c.GetName(), c.GetEntry(), c.GetDBTableGUIDLow()); return; } diff --git a/src/game/World.cpp b/src/game/World.cpp index cb50c09f4..ba5f0aee4 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -112,10 +112,12 @@ World::World() World::~World() { ///- Empty the kicked session set - for (std::set::iterator itr = m_kicked_sessions.begin(); itr != m_kicked_sessions.end(); ++itr) - delete *itr; - - m_kicked_sessions.clear(); + while (!m_sessions.empty()) + { + // not remove from queue, prevent loading new sessions + delete m_sessions.begin()->second; + m_sessions.erase(m_sessions.begin()); + } ///- Empty the WeatherMap for (WeatherMap::iterator itr = m_weathers.begin(); itr != m_weathers.end(); ++itr) @@ -195,17 +197,26 @@ World::AddSession_ (WorldSession* s) if (!RemoveSession (s->GetAccountId ())) { s->KickPlayer (); - m_kicked_sessions.insert (s); + delete s; // session not added yet in session list, so not listed in queue return; } + // decrease session counts only at not reconnection case + bool decrease_session = true; + // if session already exist, prepare to it deleting at next world update // NOTE - KickPlayer() should be called on "old" in RemoveSession() { - SessionMap::const_iterator old = m_sessions.find(s->GetAccountId ()); + SessionMap::const_iterator old = m_sessions.find(s->GetAccountId ()); - if(old != m_sessions.end()) - m_kicked_sessions.insert (old->second); + if(old != m_sessions.end()) + { + // prevent decrease sessions count if session queued + if(RemoveQueuedPlayer(old->second)) + decrease_session = false; + // not remove replaced session form queue if listed + delete old->second; + } } m_sessions[s->GetAccountId ()] = s; @@ -213,9 +224,11 @@ World::AddSession_ (WorldSession* s) uint32 Sessions = GetActiveAndQueuedSessionCount (); uint32 pLimit = GetPlayerAmountLimit (); uint32 QueueSize = GetQueueSize (); //number of players in the queue + //so we don't count the user trying to //login as a session and queue the socket that we are using - --Sessions; + if(decrease_session) + --Sessions; if (pLimit > 0 && Sessions >= pLimit && s->GetSecurity () == SEC_PLAYER ) { @@ -259,6 +272,7 @@ int32 World::GetQueuePos(WorldSession* sess) void World::AddQueuedPlayer(WorldSession* sess) { + sess->SetInQueue(true); m_QueuedPlayer.push_back (sess); // The 1st SMSG_AUTH_RESPONSE needs to contain other info too. @@ -274,7 +288,7 @@ void World::AddQueuedPlayer(WorldSession* sess) //sess->SendAuthWaitQue (GetQueuePos (sess)); } -void World::RemoveQueuedPlayer(WorldSession* sess) +bool World::RemoveQueuedPlayer(WorldSession* sess) { // sessions count including queued to remove (if removed_session set) uint32 sessions = GetActiveSessionCount(); @@ -282,16 +296,16 @@ void World::RemoveQueuedPlayer(WorldSession* sess) uint32 position = 1; Queue::iterator iter = m_QueuedPlayer.begin(); - // if session not queued then we need decrease sessions count (Remove socked callet before session removing from session list) - bool decrease_session = true; - // search to remove and count skipped positions + bool found = false; + for(;iter != m_QueuedPlayer.end(); ++iter, ++position) { if(*iter==sess) { + sess->SetInQueue(false); iter = m_QueuedPlayer.erase(iter); - decrease_session = false; // removing queued session + found = true; // removing queued session break; } } @@ -299,15 +313,16 @@ void World::RemoveQueuedPlayer(WorldSession* sess) // iter point to next socked after removed or end() // position store position of removed socket and then new position next socket after removed - // decrease for case session queued for removing - if(decrease_session && sessions) + // if session not queued then we need decrease sessions count + if(!found && sessions) --sessions; // accept first in queue if( (!m_playerLimit || sessions < m_playerLimit) && !m_QueuedPlayer.empty() ) { - WorldSession * socket = m_QueuedPlayer.front(); - socket->SendAuthWaitQue(0); + WorldSession* pop_sess = m_QueuedPlayer.front(); + pop_sess->SetInQueue(false); + pop_sess->SendAuthWaitQue(0); m_QueuedPlayer.pop_front(); // update iter to point first queued socket or end() if queue is empty now @@ -319,6 +334,8 @@ void World::RemoveQueuedPlayer(WorldSession* sess) // iter point to first not updated socket, position store new position for(; iter != m_QueuedPlayer.end(); ++iter, ++position) (*iter)->SendAuthWaitQue(position); + + return found; } /// Find a Weather object by the given zoneid @@ -2170,6 +2187,8 @@ void World::SendZoneText(uint32 zone, const char* text, WorldSession *self, uint /// Kick (and save) all players void World::KickAll() { + m_QueuedPlayer.clear(); // prevent send queue update packet and login queued sessions + // session not removed at kick and will removed in next update tick for (SessionMap::iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr) itr->second->KickPlayer(); @@ -2184,18 +2203,6 @@ void World::KickAllLess(AccountTypes sec) itr->second->KickPlayer(); } -/// Kick all queued players -void World::KickAllQueued() -{ - // session not removed at kick and will removed in next update tick - //TODO here -// for (Queue::iterator itr = m_QueuedPlayer.begin(); itr != m_QueuedPlayer.end(); ++itr) -// if(WorldSession* session = (*itr)->GetSession()) -// session->KickPlayer(); - - m_QueuedPlayer.empty(); -} - /// Kick (and save) the designated player bool World::KickPlayer(std::string playerName) { @@ -2426,20 +2433,13 @@ void World::SendServerMessage(uint32 type, const char *text, Player* player) void World::UpdateSessions( time_t diff ) { + ///- Add new sessions while(!addSessQueue.empty()) { - WorldSession* sess = addSessQueue.next (); - AddSession_ (sess); + WorldSession* sess = addSessQueue.next (); + AddSession_ (sess); } - ///- Delete kicked sessions at add new session - for (std::set::iterator itr = m_kicked_sessions.begin(); itr != m_kicked_sessions.end(); ++itr) - { - RemoveQueuedPlayer (*itr); - delete *itr; - } - m_kicked_sessions.clear(); - ///- Then send an update signal to remaining ones for (SessionMap::iterator itr = m_sessions.begin(), next; itr != m_sessions.end(); itr = next) { diff --git a/src/game/World.h b/src/game/World.h index 0b2693ba1..4988cd232 100644 --- a/src/game/World.h +++ b/src/game/World.h @@ -350,7 +350,7 @@ class World //player Queue typedef std::list Queue; void AddQueuedPlayer(WorldSession*); - void RemoveQueuedPlayer(WorldSession*); + bool RemoveQueuedPlayer(WorldSession* session); int32 GetQueuePos(WorldSession*); uint32 GetQueueSize() const { return m_QueuedPlayer.size(); } @@ -433,7 +433,6 @@ class World bool KickPlayer(std::string playerName); void KickAll(); void KickAllLess(AccountTypes sec); - void KickAllQueued(); BanReturn BanAccount(BanMode mode, std::string nameOrIP, std::string duration, std::string reason, std::string author); bool RemoveBanAccount(BanMode mode, std::string nameOrIP); @@ -491,7 +490,6 @@ class World WeatherMap m_weathers; typedef UNORDERED_MAP SessionMap; SessionMap m_sessions; - std::set m_kicked_sessions; uint32 m_maxActiveSessionCount; uint32 m_maxQueuedSessionCount; diff --git a/src/game/WorldSession.cpp b/src/game/WorldSession.cpp index 49266910f..65b93645a 100644 --- a/src/game/WorldSession.cpp +++ b/src/game/WorldSession.cpp @@ -45,7 +45,7 @@ WorldSession::WorldSession(uint32 id, WorldSocket *sock, uint32 sec, uint8 expan LookingForGroup_auto_join(false), LookingForGroup_auto_add(false), m_muteTime(mute_time), _player(NULL), m_Socket(sock),_security(sec), _accountId(id), m_expansion(expansion), m_sessionDbcLocale(sWorld.GetAvailableDbcLocale(locale)), m_sessionDbLocaleIndex(objmgr.GetIndexForLocale(locale)), -_logoutTime(0), m_playerLoading(false), m_playerLogout(false), m_playerRecentlyLogout(false), m_latency(0) +_logoutTime(0), m_inQueue(false), m_playerLoading(false), m_playerLogout(false), m_playerRecentlyLogout(false), m_latency(0) { if (sock) { @@ -205,6 +205,13 @@ bool WorldSession::Update(uint32 /*diff*/) (this->*opHandle.handler)(*packet); break; case STATUS_AUTHED: + // prevent cheating with skip queue wait + if(m_inQueue) + { + logUnexpectedOpcode(packet, "the player not pass queue yet"); + break; + } + m_playerRecentlyLogout = false; (this->*opHandle.handler)(*packet); break; diff --git a/src/game/WorldSession.h b/src/game/WorldSession.h index bfa9437e2..6bc8fc967 100644 --- a/src/game/WorldSession.h +++ b/src/game/WorldSession.h @@ -95,6 +95,9 @@ class MANGOS_DLL_SPEC WorldSession void SetPlayer(Player *plr) { _player = plr; } uint8 Expansion() const { return m_expansion; } + /// Session in auth.queue currently + void SetInQueue(bool state) { m_inQueue = state; } + /// Is the user engaged in a log out process? bool isLogingOut() const { return _logoutTime || m_playerLogout; } @@ -635,6 +638,7 @@ class MANGOS_DLL_SPEC WorldSession uint8 m_expansion; time_t _logoutTime; + bool m_inQueue; // session wait in auth.queue bool m_playerLoading; // code processed in LoginPlayer bool m_playerLogout; // code processed in LogoutPlayer bool m_playerRecentlyLogout; diff --git a/src/mangosd/WorldRunnable.cpp b/src/mangosd/WorldRunnable.cpp index 7ebe95fc7..87d7e78a9 100644 --- a/src/mangosd/WorldRunnable.cpp +++ b/src/mangosd/WorldRunnable.cpp @@ -72,7 +72,6 @@ void WorldRunnable::run() prevSleepTime = 0; } - sWorld.KickAllQueued(); // kick all queued players (and prevent its login at kick in game players) sWorld.KickAll(); // save and kick all players sWorld.UpdateSessions( 1 ); // real players unload required UpdateSessions call diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 2aeb8cbf2..5f89bdf21 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 "6857" + #define REVISION_NR "6858" #endif // __REVISION_NR_H__ From 3dc2428af2e1946a0b13b8bab719050aeeb15c6e Mon Sep 17 00:00:00 2001 From: hunuza Date: Sat, 29 Nov 2008 10:11:10 +0100 Subject: [PATCH 13/56] Fixed typo in MapRefManager. Thanks to arrai and megamage. --- src/game/MapRefManager.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/MapRefManager.h b/src/game/MapRefManager.h index 05d93903c..bfd0ca12e 100644 --- a/src/game/MapRefManager.h +++ b/src/game/MapRefManager.h @@ -39,6 +39,6 @@ class MapRefManager : public RefManager iterator rbegin() { return iterator(getLast()); } iterator rend() { return iterator(NULL); } const_iterator begin() const { return const_iterator(getFirst()); } - const_iterator end() const { return const_iterator(getLast()); } + const_iterator end() const { return const_iterator(NULL); } }; #endif From eef8369ed6d425d4713b19317d13eff1c9c010be Mon Sep 17 00:00:00 2001 From: Backbone Date: Sun, 30 Nov 2008 00:40:22 +0300 Subject: [PATCH 14/56] [6859] Fixed item 29301 triggerring at ranged hit. Signed-off-by: VladimirMangos --- sql/mangos.sql | 4 ++-- sql/updates/2008_11_29_01_mangos_spell_proc_event.sql | 5 +++++ sql/updates/Makefile.am | 2 ++ src/shared/revision_nr.h | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 sql/updates/2008_11_29_01_mangos_spell_proc_event.sql diff --git a/sql/mangos.sql b/sql/mangos.sql index fa1273f60..4cc2eecf5 100644 --- a/sql/mangos.sql +++ b/sql/mangos.sql @@ -22,7 +22,7 @@ DROP TABLE IF EXISTS `db_version`; CREATE TABLE `db_version` ( `version` varchar(120) default NULL, - `required_2008_11_27_01_mangos_playercreateinfo_item` bit(1) default NULL + `required_2008_11_29_01_mangos_spell_proc_event` bit(1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes'; -- @@ -14731,7 +14731,7 @@ INSERT INTO `spell_proc_event` VALUES (34950,0,0,0,0,0x0000000000000000,0x00400000,0,0), (34954,0,0,0,0,0x0000000000000000,0x00400000,0,0), (35077,0,0,0,0,0x0000000000000000,0x00008000,0,60), -(35080,0,0,0,0,0x0000000000000000,0x00000001,0,60), +(35080,0,0,0,0,0x0000000000000000,0x00080001,0,60), (35083,0,0,0,0,0x0000000000000000,0x00020000,0,60), (35086,0,0,0,0,0x0000000000000000,0x08020000,0,60), (35100,0,0,0,0,0x0000000000000000,0x00080000,0,0), diff --git a/sql/updates/2008_11_29_01_mangos_spell_proc_event.sql b/sql/updates/2008_11_29_01_mangos_spell_proc_event.sql new file mode 100644 index 000000000..339ae216d --- /dev/null +++ b/sql/updates/2008_11_29_01_mangos_spell_proc_event.sql @@ -0,0 +1,5 @@ +ALTER TABLE db_version CHANGE COLUMN required_2008_11_27_01_mangos_playercreateinfo_item required_2008_11_29_01_mangos_spell_proc_event bit; + +DELETE FROM spell_proc_event where entry = 35080; +INSERT INTO spell_proc_event (entry, SchoolMask, Category, SkillID, SpellFamilyName, SpellFamilyMask, procFlags, ppmRate, cooldown) VALUES +(35080,0,0,0,0,0x0000000000000000,0x00080001,0,60); diff --git a/sql/updates/Makefile.am b/sql/updates/Makefile.am index d363373f1..934dfb636 100644 --- a/sql/updates/Makefile.am +++ b/sql/updates/Makefile.am @@ -138,6 +138,7 @@ pkgdata_DATA = \ 2008_11_18_01_mangos_creature_movement.sql \ 2008_11_18_02_mangos_mangos_string.sql \ 2008_11_27_01_mangos_playercreateinfo_item.sql \ + 2008_11_29_01_mangos_spell_proc_event.sql \ README ## Additional files to include when running 'make dist' @@ -257,4 +258,5 @@ EXTRA_DIST = \ 2008_11_18_01_mangos_creature_movement.sql \ 2008_11_18_02_mangos_mangos_string.sql \ 2008_11_27_01_mangos_playercreateinfo_item.sql \ + 2008_11_29_01_mangos_spell_proc_event.sql \ README diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 5f89bdf21..998d4c81d 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 "6858" + #define REVISION_NR "6859" #endif // __REVISION_NR_H__ From 5f33f4abf4d8263855bae89be56d9c0501c5d0c2 Mon Sep 17 00:00:00 2001 From: Malah Date: Sun, 30 Nov 2008 04:07:37 +0300 Subject: [PATCH 15/56] [6860] Implement correct effects stacking and zone limitations for item 34537. Signed-off-by: Malah C++ code part rewrited for more correct work. Signed-off-by: VladimirMangos --- sql/mangos.sql | 3 +- .../2008_11_29_02_mangos_spell_elixir.sql | 5 ++++ sql/updates/Makefile.am | 2 ++ src/game/Spell.cpp | 24 ++++++++++----- src/game/SpellMgr.cpp | 30 +++++++++---------- src/shared/revision_nr.h | 2 +- 6 files changed, 41 insertions(+), 25 deletions(-) create mode 100644 sql/updates/2008_11_29_02_mangos_spell_elixir.sql diff --git a/sql/mangos.sql b/sql/mangos.sql index 4cc2eecf5..7c5817f30 100644 --- a/sql/mangos.sql +++ b/sql/mangos.sql @@ -22,7 +22,7 @@ DROP TABLE IF EXISTS `db_version`; CREATE TABLE `db_version` ( `version` varchar(120) default NULL, - `required_2008_11_29_01_mangos_spell_proc_event` bit(1) default NULL + `required_2008_11_29_02_mangos_spell_elixir` bit(1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes'; -- @@ -13741,6 +13741,7 @@ INSERT INTO `spell_elixir` VALUES (41610,0xB), (41611,0xB), (42735,0x3), +(45373,0x1), (46837,0xB), (46839,0xB); /*!40000 ALTER TABLE `spell_elixir` ENABLE KEYS */; diff --git a/sql/updates/2008_11_29_02_mangos_spell_elixir.sql b/sql/updates/2008_11_29_02_mangos_spell_elixir.sql new file mode 100644 index 000000000..7d6d353a2 --- /dev/null +++ b/sql/updates/2008_11_29_02_mangos_spell_elixir.sql @@ -0,0 +1,5 @@ +ALTER TABLE db_version CHANGE COLUMN required_2008_11_29_01_mangos_spell_proc_event required_2008_11_29_02_mangos_spell_elixir bit; + +DELETE FROM `spell_elixir` WHERE `entry` = 45373; +INSERT INTO `spell_elixir` VALUES +(45373,0x1); diff --git a/sql/updates/Makefile.am b/sql/updates/Makefile.am index 934dfb636..17c5d931a 100644 --- a/sql/updates/Makefile.am +++ b/sql/updates/Makefile.am @@ -139,6 +139,7 @@ pkgdata_DATA = \ 2008_11_18_02_mangos_mangos_string.sql \ 2008_11_27_01_mangos_playercreateinfo_item.sql \ 2008_11_29_01_mangos_spell_proc_event.sql \ + 2008_11_29_02_mangos_spell_elixir.sql \ README ## Additional files to include when running 'make dist' @@ -259,4 +260,5 @@ EXTRA_DIST = \ 2008_11_18_02_mangos_mangos_string.sql \ 2008_11_27_01_mangos_playercreateinfo_item.sql \ 2008_11_29_01_mangos_spell_proc_event.sql \ + 2008_11_29_02_mangos_spell_elixir.sql \ README diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index cff2fade4..900e7ed55 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -2571,13 +2571,23 @@ void Spell::SendCastResult(uint8 result) break; case SPELL_FAILED_REQUIRES_AREA: // hardcode areas limitation case - if( m_spellInfo->Id==41618 || m_spellInfo->Id==41620 ) - data << uint32(3842); - else if( m_spellInfo->Id==41617 || m_spellInfo->Id==41619 ) - data << uint32(3905); - // normal case - else - data << uint32(m_spellInfo->AreaId); + switch(m_spellInfo->Id) + { + case 41617: // Cenarion Mana Salve + case 41619: // Cenarion Healing Salve + data << uint32(3905); + break; + case 41618: // Bottled Nethergon Energy + case 41620: // Bottled Nethergon Vapor + data << uint32(3842); + break; + case 45373: // Bloodberry Elixir + data << uint32(4075); + break; + default: // default case + data << uint32(m_spellInfo->AreaId); + break; + } break; case SPELL_FAILED_TOTEMS: if(m_spellInfo->Totem[0]) diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp index 044b3272f..605336504 100644 --- a/src/game/SpellMgr.cpp +++ b/src/game/SpellMgr.cpp @@ -2052,6 +2052,11 @@ bool IsSpellAllowedInLocation(SpellEntry const *spellInfo,uint32 map_id,uint32 z { if(uint32 mask = spellmgr.GetSpellElixirMask(spellInfo->Id)) { + if(mask & ELIXIR_BATTLE_MASK) + { + if(spellInfo->Id==45373) // Bloodberry Elixir + return zone_id==4075; + } if(mask & ELIXIR_UNSTABLE_MASK) { // in the Blade's Edge Mountains Plateaus and Gruul's Lair. @@ -2059,9 +2064,8 @@ bool IsSpellAllowedInLocation(SpellEntry const *spellInfo,uint32 map_id,uint32 z } if(mask & ELIXIR_SHATTRATH_MASK) { - // in Tempest Keep, Serpentshrine Cavern, Caverns of Time: Mount Hyjal, Black Temple - // TODO: and the Sunwell Plateau - if(zone_id ==3607 || map_id==534 || map_id==564) + // in Tempest Keep, Serpentshrine Cavern, Caverns of Time: Mount Hyjal, Black Temple, Sunwell Plateau + if(zone_id ==3607 || map_id==534 || map_id==564 || zone_id==4075) return true; MapEntry const* mapEntry = sMapStore.LookupEntry(map_id); @@ -2079,8 +2083,8 @@ bool IsSpellAllowedInLocation(SpellEntry const *spellInfo,uint32 map_id,uint32 z // special cases zone check (maps checked by multimap common id) switch(spellInfo->Id) { - case 41618: - case 41620: + case 41618: // Bottled Nethergon Energy + case 41620: // Bottled Nethergon Vapor { MapEntry const* mapEntry = sMapStore.LookupEntry(map_id); if(!mapEntry) @@ -2088,9 +2092,8 @@ bool IsSpellAllowedInLocation(SpellEntry const *spellInfo,uint32 map_id,uint32 z return mapEntry->multimap_id==206; } - - case 41617: - case 41619: + case 41617: // Cenarion Mana Salve + case 41619: // Cenarion Healing Salve { MapEntry const* mapEntry = sMapStore.LookupEntry(map_id); if(!mapEntry) @@ -2098,14 +2101,9 @@ bool IsSpellAllowedInLocation(SpellEntry const *spellInfo,uint32 map_id,uint32 z return mapEntry->multimap_id==207; } - // Dragonmaw Illusion - case 40216: - case 42016: - { - if ( area_id != 3759 && area_id != 3966 && area_id != 3939 ) - return false; - break; - } + case 40216: // Dragonmaw Illusion + case 42016: // Dragonmaw Illusion + return area_id == 3759 || area_id == 3966 || area_id == 3939; } return true; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 998d4c81d..82bf61c38 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 "6859" + #define REVISION_NR "6860" #endif // __REVISION_NR_H__ From 8dfbcf7ee65b4e16c36dad112f0d21c944bf8d5c Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Sun, 30 Nov 2008 05:17:34 +0300 Subject: [PATCH 16/56] [6861] Add and use function for more fast way to get areflag by area id. --- src/shared/Database/DBCStores.cpp | 13 +++++++++++-- src/shared/Database/DBCStores.h | 1 + src/shared/revision_nr.h | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/shared/Database/DBCStores.cpp b/src/shared/Database/DBCStores.cpp index c7c508004..e733551d2 100644 --- a/src/shared/Database/DBCStores.cpp +++ b/src/shared/Database/DBCStores.cpp @@ -495,13 +495,22 @@ uint32 GetTalentSpellCost(uint32 spellId) return 0; } -AreaTableEntry const* GetAreaEntryByAreaID(uint32 area_id) +int32 GetAreaFlagByAreaID(uint32 area_id) { AreaFlagByAreaID::iterator i = sAreaFlagByAreaID.find(area_id); if(i == sAreaFlagByAreaID.end()) + return -1; + + return i->second; +} + +AreaTableEntry const* GetAreaEntryByAreaID(uint32 area_id) +{ + int32 areaflag = GetAreaFlagByAreaID(area_id); + if(areaflag < 0) return NULL; - return sAreaStore.LookupEntry(i->second); + return sAreaStore.LookupEntry(areaflag ); } AreaTableEntry const* GetAreaEntryByAreaFlagAndMap(uint32 area_flag,uint32 map_id) diff --git a/src/shared/Database/DBCStores.h b/src/shared/Database/DBCStores.h index 54850f40a..7811286c0 100644 --- a/src/shared/Database/DBCStores.h +++ b/src/shared/Database/DBCStores.h @@ -33,6 +33,7 @@ char* GetPetName(uint32 petfamily, uint32 dbclang); uint32 GetTalentSpellCost(uint32 spellId); TalentSpellPos const* GetTalentSpellPos(uint32 spellId); +int32 GetAreaFlagByAreaID(uint32 area_id); // -1 if not found AreaTableEntry const* GetAreaEntryByAreaID(uint32 area_id); AreaTableEntry const* GetAreaEntryByAreaFlagAndMap(uint32 area_flag,uint32 map_id); uint32 GetAreaFlagByMapId(uint32 mapid); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 82bf61c38..e78354a59 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 "6860" + #define REVISION_NR "6861" #endif // __REVISION_NR_H__ From 7ea5f922eaf12d6d4548c3e74612caf764dc7042 Mon Sep 17 00:00:00 2001 From: dythzer Date: Sun, 30 Nov 2008 10:08:18 +0300 Subject: [PATCH 17/56] [6862] Some additional mangosd.conf options for player startup and gameplay customizing. Signed-off-by: dythzer Some implementations rewrited. And suggested option names changed. Also now gm not allowed logout instant in case fight/duel to prevent unexpected death. Signed-off-by: VladimirMangos --- src/game/CharacterHandler.cpp | 3 ++ src/game/MiscHandler.cpp | 12 ++---- src/game/Player.cpp | 36 +++++++++++----- src/game/Player.h | 2 +- src/game/World.cpp | 74 ++++++++++++++++++++++++++++++++ src/game/World.h | 8 ++++ src/mangosd/mangosd.conf.dist.in | 59 +++++++++++++++++++++---- src/shared/revision_nr.h | 2 +- 8 files changed, 166 insertions(+), 30 deletions(-) diff --git a/src/game/CharacterHandler.cpp b/src/game/CharacterHandler.cpp index 33f653dae..843d11319 100644 --- a/src/game/CharacterHandler.cpp +++ b/src/game/CharacterHandler.cpp @@ -745,6 +745,9 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder) if(sWorld.IsShutdowning()) sWorld.ShutdownMsg(true,pCurrChar); + if(sWorld.getConfig(CONFIG_ALL_TAXI_PATHS)) + pCurrChar->SetTaxiCheater(true); + if(pCurrChar->isGameMaster()) SendNotification(LANG_GM_ON); diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp index 97ad299bf..5c038759f 100644 --- a/src/game/MiscHandler.cpp +++ b/src/game/MiscHandler.cpp @@ -274,13 +274,6 @@ void WorldSession::HandleLogoutRequestOpcode( WorldPacket & /*recv_data*/ ) if (uint64 lguid = GetPlayer()->GetLootGUID()) DoLootRelease(lguid); - //instant logout for admins, gm's, mod's - if( GetSecurity() > SEC_PLAYER ) - { - LogoutPlayer(true); - return; - } - //Can not logout if... if( GetPlayer()->isInCombat() || //...is in combat GetPlayer()->duel || //...is in Duel @@ -296,8 +289,9 @@ void WorldSession::HandleLogoutRequestOpcode( WorldPacket & /*recv_data*/ ) return; } - //instant logout in taverns/cities or on taxi - if(GetPlayer()->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING) || GetPlayer()->isInFlight()) + //instant logout in taverns/cities or on taxi or for admins, gm's, mod's if its enabled in mangosd.conf + if (GetPlayer()->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING) || GetPlayer()->isInFlight() || + GetSecurity() >= sWorld.getConfig(CONFIG_INSTANT_LOGOUT)) { LogoutPlayer(true); return; diff --git a/src/game/Player.cpp b/src/game/Player.cpp index dfb957093..f7574b06f 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -580,7 +580,14 @@ bool Player::Create( uint32 guidlow, std::string name, uint8 race, uint8 class_, SetUInt32Value( PLAYER_FIELD_YESTERDAY_CONTRIBUTION, 0 ); // set starting level - SetUInt32Value( UNIT_FIELD_LEVEL, sWorld.getConfig(CONFIG_START_PLAYER_LEVEL) ); + if (GetSession()->GetSecurity() >= SEC_MODERATOR) + SetUInt32Value (UNIT_FIELD_LEVEL, sWorld.getConfig(CONFIG_START_GM_LEVEL)); + else + SetUInt32Value (UNIT_FIELD_LEVEL, sWorld.getConfig(CONFIG_START_PLAYER_LEVEL)); + + SetUInt32Value (PLAYER_FIELD_COINAGE, sWorld.getConfig(CONFIG_START_PLAYER_MONEY)); + SetUInt32Value (PLAYER_FIELD_HONOR_CURRENCY, sWorld.getConfig(CONFIG_START_HONOR_POINTS)); + SetUInt32Value (PLAYER_FIELD_ARENA_CURRENCY, sWorld.getConfig(CONFIG_START_ARENA_POINTS)); // Played time m_Last_tick = time(NULL); @@ -809,8 +816,8 @@ void Player::HandleDrowning() if(!m_isunderwater) return; - //if have water breath , then remove bar - if(waterbreath || isGameMaster() || !isAlive()) + //if player is GM, have waterbreath, is dead or if breathing is disabled then return + if(waterbreath || isGameMaster() || !isAlive() || GetSession()->GetSecurity() >= sWorld.getConfig(CONFIG_DISABLE_BREATHING)) { StopMirrorTimer(BREATH_TIMER); m_isunderwater = 0; @@ -2149,7 +2156,7 @@ void Player::GiveLevel(uint32 level) if(getLevel()!= level) m_Played_time[1] = 0; // Level Played Time reset SetLevel(level); - UpdateMaxSkills(); + UpdateSkillsForLevel (); // save base values (bonuses already included in stored stats for(int i = STAT_STRENGTH; i < MAX_STATS; ++i) @@ -2222,7 +2229,7 @@ void Player::InitStatsForLevel(bool reapplyMods) SetUInt32Value(PLAYER_FIELD_MAX_LEVEL, sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL) ); SetUInt32Value(PLAYER_NEXT_LEVEL_XP, MaNGOS::XP::xp_to_level(getLevel())); - UpdateMaxSkills (); + UpdateSkillsForLevel (); // set default cast time multiplier SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f); @@ -3729,7 +3736,7 @@ void Player::ResurrectPlayer(float restore_percent, bool applySickness) // some items limited to specific map DestroyZoneLimitedItem( true, GetZoneId()); - if(!applySickness || getLevel() <= 10) + if(!applySickness) return; //Characters from level 1-10 are not affected by resurrection sickness. @@ -4849,9 +4856,12 @@ void Player::ModifySkillBonus(uint32 skillid,int32 val, bool talent) } } -void Player::UpdateMaxSkills() +void Player::UpdateSkillsForLevel() { uint16 maxconfskill = sWorld.GetConfigMaxSkillValue(); + uint32 maxSkill = GetMaxSkillValueForLevel(); + + bool alwaysMaxSkill = sWorld.getConfig(CONFIG_ALWAYS_MAX_SKILL_FOR_LEVEL); for (uint16 i=0; i < PLAYER_MAX_SKILLS; i++) if (GetUInt32Value(PLAYER_SKILL_INDEX(i))) @@ -4869,11 +4879,15 @@ void Player::UpdateMaxSkills() uint32 max = SKILL_MAX(data); uint32 val = SKILL_VALUE(data); - // update only level dependent max skill values - if(max!=1 && max != maxconfskill) + /// update only level dependent max skill values + if(max!=1) { - uint32 max_Skill = GetMaxSkillValueForLevel(); - SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(i),MAKE_SKILL_VALUE(val,max_Skill)); + /// miximize skill always + if(alwaysMaxSkill) + SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(i),MAKE_SKILL_VALUE(maxSkill,maxSkill)); + /// update max skill value if current max skill not maximized + else if(max != maxconfskill) + SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(i),MAKE_SKILL_VALUE(val,maxSkill)); } } } diff --git a/src/game/Player.h b/src/game/Player.h index d38c4c2cd..4e4979ab5 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -1713,7 +1713,7 @@ class MANGOS_DLL_SPEC Player : public Unit void SetFactionVisible(FactionState* faction); void SetFactionVisibleForFactionTemplateId(uint32 FactionTemplateId); void SetFactionVisibleForFactionId(uint32 FactionId); - void UpdateMaxSkills(); + void UpdateSkillsForLevel(); void UpdateSkillsToMaxSkillsForLevel(); // for .levelup void ModifySkillBonus(uint32 skillid,int32 val, bool talent); diff --git a/src/game/World.cpp b/src/game/World.cpp index ba5f0aee4..8ee55172b 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -664,8 +664,63 @@ void World::LoadConfigSettings(bool reload) sLog.outError("StartPlayerLevel (%i) must be in range 1..MaxPlayerLevel(%u). Set to %u.",m_configs[CONFIG_START_PLAYER_LEVEL],m_configs[CONFIG_MAX_PLAYER_LEVEL],m_configs[CONFIG_MAX_PLAYER_LEVEL]); m_configs[CONFIG_START_PLAYER_LEVEL] = m_configs[CONFIG_MAX_PLAYER_LEVEL]; } + + m_configs[CONFIG_START_PLAYER_MONEY] = sConfig.GetIntDefault("StartPlayerMoney", 0); + if(m_configs[CONFIG_START_PLAYER_MONEY] < 0) + { + sLog.outError("StartPlayerMoney (%i) must be in range 0..%u. Set to %u.",m_configs[CONFIG_START_PLAYER_MONEY],MAX_MONEY_AMOUNT,0); + m_configs[CONFIG_START_PLAYER_MONEY] = 0; + } + else if(m_configs[CONFIG_START_PLAYER_MONEY] > MAX_MONEY_AMOUNT) + { + sLog.outError("StartPlayerMoney (%i) must be in range 0..%u. Set to %u.", + m_configs[CONFIG_START_PLAYER_MONEY],MAX_MONEY_AMOUNT,MAX_MONEY_AMOUNT); + m_configs[CONFIG_START_PLAYER_MONEY] = MAX_MONEY_AMOUNT; + } + m_configs[CONFIG_MAX_HONOR_POINTS] = sConfig.GetIntDefault("MaxHonorPoints", 75000); + if(m_configs[CONFIG_MAX_HONOR_POINTS] < 0) + { + sLog.outError("MaxHonorPoints (%i) can't be negative. Set to 0.",m_configs[CONFIG_MAX_HONOR_POINTS]); + m_configs[CONFIG_MAX_HONOR_POINTS] = 0; + } + + m_configs[CONFIG_START_HONOR_POINTS] = sConfig.GetIntDefault("StartHonorPoints", 0); + if(m_configs[CONFIG_START_HONOR_POINTS] < 0) + { + sLog.outError("StartHonorPoints (%i) must be in range 0..MaxHonorPoints(%u). Set to %u.", + m_configs[CONFIG_START_HONOR_POINTS],m_configs[CONFIG_MAX_HONOR_POINTS],0); + m_configs[CONFIG_MAX_HONOR_POINTS] = 0; + } + else if(m_configs[CONFIG_START_HONOR_POINTS] > m_configs[CONFIG_MAX_HONOR_POINTS]) + { + sLog.outError("StartHonorPoints (%i) must be in range 0..MaxHonorPoints(%u). Set to %u.", + m_configs[CONFIG_START_HONOR_POINTS],m_configs[CONFIG_MAX_HONOR_POINTS],m_configs[CONFIG_MAX_HONOR_POINTS]); + m_configs[CONFIG_START_HONOR_POINTS] = m_configs[CONFIG_MAX_HONOR_POINTS]; + } + m_configs[CONFIG_MAX_ARENA_POINTS] = sConfig.GetIntDefault("MaxArenaPoints", 5000); + if(m_configs[CONFIG_MAX_ARENA_POINTS] < 0) + { + sLog.outError("MaxArenaPoints (%i) can't be negative. Set to 0.",m_configs[CONFIG_MAX_ARENA_POINTS]); + m_configs[CONFIG_MAX_ARENA_POINTS] = 0; + } + + m_configs[CONFIG_START_ARENA_POINTS] = sConfig.GetIntDefault("StartArenaPoints", 0); + if(m_configs[CONFIG_START_ARENA_POINTS] < 0) + { + sLog.outError("StartArenaPoints (%i) must be in range 0..MaxArenaPoints(%u). Set to %u.", + m_configs[CONFIG_START_ARENA_POINTS],m_configs[CONFIG_MAX_ARENA_POINTS],0); + m_configs[CONFIG_MAX_ARENA_POINTS] = 0; + } + else if(m_configs[CONFIG_START_ARENA_POINTS] > m_configs[CONFIG_MAX_ARENA_POINTS]) + { + sLog.outError("StartArenaPoints (%i) must be in range 0..MaxArenaPoints(%u). Set to %u.", + m_configs[CONFIG_START_ARENA_POINTS],m_configs[CONFIG_MAX_ARENA_POINTS],m_configs[CONFIG_MAX_ARENA_POINTS]); + m_configs[CONFIG_START_ARENA_POINTS] = m_configs[CONFIG_MAX_ARENA_POINTS]; + } + + m_configs[CONFIG_ALL_TAXI_PATHS] = sConfig.GetBoolDefault("AllFlightPaths", false); m_configs[CONFIG_INSTANCE_IGNORE_LEVEL] = sConfig.GetBoolDefault("Instance.IgnoreLevel", false); m_configs[CONFIG_INSTANCE_IGNORE_RAID] = sConfig.GetBoolDefault("Instance.IgnoreRaid", false); @@ -695,6 +750,19 @@ void World::LoadConfigSettings(bool reload) m_configs[CONFIG_GM_IN_WHO_LIST] = sConfig.GetBoolDefault("GM.InWhoList",false); m_configs[CONFIG_GM_LOG_TRADE] = sConfig.GetBoolDefault("GM.LogTrade", false); + m_configs[CONFIG_START_GM_LEVEL] = sConfig.GetIntDefault("GM.StartLevel", 1); + if(m_configs[CONFIG_START_GM_LEVEL] < m_configs[CONFIG_START_PLAYER_LEVEL]) + { + sLog.outError("GM.StartLevel (%i) must be in range StartPlayerLevel(%u)..255. Set to %u.", + m_configs[CONFIG_START_GM_LEVEL],m_configs[CONFIG_START_PLAYER_LEVEL],m_configs[CONFIG_START_PLAYER_LEVEL]); + m_configs[CONFIG_START_GM_LEVEL] = m_configs[CONFIG_START_PLAYER_LEVEL]; + } + else if(m_configs[CONFIG_START_GM_LEVEL] > 255) + { + sLog.outError("GM.StartLevel (%i) must be in range 1..255. Set to %u.",m_configs[CONFIG_START_GM_LEVEL],255); + m_configs[CONFIG_START_GM_LEVEL] = 255; + } + m_configs[CONFIG_GROUP_VISIBILITY] = sConfig.GetIntDefault("Visibility.GroupMode",0); m_configs[CONFIG_MAIL_DELIVERY_DELAY] = sConfig.GetIntDefault("MailDeliveryDelay",HOUR); @@ -759,6 +827,10 @@ void World::LoadConfigSettings(bool reload) m_configs[CONFIG_SAVE_RESPAWN_TIME_IMMEDIATLY] = sConfig.GetBoolDefault("SaveRespawnTimeImmediately",true); m_configs[CONFIG_WEATHER] = sConfig.GetBoolDefault("ActivateWeather",true); + m_configs[CONFIG_DISABLE_BREATHING] = sConfig.GetIntDefault("DisableWaterBreath", SEC_CONSOLE); + + m_configs[CONFIG_ALWAYS_MAX_SKILL_FOR_LEVEL] = sConfig.GetBoolDefault("AlwaysMaxSkillForLevel", false); + if(reload) { uint32 val = sConfig.GetIntDefault("Expansion",1); @@ -815,6 +887,8 @@ void World::LoadConfigSettings(bool reload) m_configs[CONFIG_LISTEN_RANGE_TEXTEMOTE] = sConfig.GetIntDefault("ListenRange.TextEmote", 25); m_configs[CONFIG_LISTEN_RANGE_YELL] = sConfig.GetIntDefault("ListenRange.Yell", 300); + m_configs[CONFIG_INSTANT_LOGOUT] = sConfig.GetIntDefault("InstantLogout", SEC_MODERATOR); + m_VisibleUnitGreyDistance = sConfig.GetFloatDefault("Visibility.Distance.Grey.Unit", 1); if(m_VisibleUnitGreyDistance > MAX_VISIBILITY_DISTANCE) { diff --git a/src/game/World.h b/src/game/World.h index 4988cd232..2f3c0be57 100644 --- a/src/game/World.h +++ b/src/game/World.h @@ -103,8 +103,11 @@ enum WorldConfigs CONFIG_SKIP_CINEMATICS, CONFIG_MAX_PLAYER_LEVEL, CONFIG_START_PLAYER_LEVEL, + CONFIG_START_PLAYER_MONEY, CONFIG_MAX_HONOR_POINTS, + CONFIG_START_HONOR_POINTS, CONFIG_MAX_ARENA_POINTS, + CONFIG_START_ARENA_POINTS, CONFIG_INSTANCE_IGNORE_LEVEL, CONFIG_INSTANCE_IGNORE_RAID, CONFIG_BATTLEGROUND_CAST_DESERTER, @@ -122,6 +125,7 @@ enum WorldConfigs CONFIG_GM_IN_GM_LIST, CONFIG_GM_IN_WHO_LIST, CONFIG_GM_LOG_TRADE, + CONFIG_START_GM_LEVEL, CONFIG_GROUP_VISIBILITY, CONFIG_MAIL_DELIVERY_DELAY, CONFIG_UPTIME_UPDATE, @@ -138,6 +142,7 @@ enum WorldConfigs CONFIG_SKILL_GAIN_WEAPON, CONFIG_MAX_OVERSPEED_PINGS, CONFIG_SAVE_RESPAWN_TIME_IMMEDIATLY, + CONFIG_ALWAYS_MAX_SKILL_FOR_LEVEL, CONFIG_WEATHER, CONFIG_EXPANSION, CONFIG_CHATFLOOD_MESSAGE_COUNT, @@ -164,6 +169,9 @@ enum WorldConfigs CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP, CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE, CONFIG_THREAT_RADIUS, + CONFIG_INSTANT_LOGOUT, + CONFIG_DISABLE_BREATHING, + CONFIG_ALL_TAXI_PATHS, CONFIG_DECLINED_NAMES_USED, CONFIG_LISTEN_RANGE_SAY, CONFIG_LISTEN_RANGE_TEXTEMOTE, diff --git a/src/mangosd/mangosd.conf.dist.in b/src/mangosd/mangosd.conf.dist.in index 4ef2cb967..f57e25d5a 100644 --- a/src/mangosd/mangosd.conf.dist.in +++ b/src/mangosd/mangosd.conf.dist.in @@ -419,17 +419,48 @@ LogColors = "" # Change not recommended # Default: 70 # +# StartPlayerLevel +# Staring level that have character at creating (in range 1 to MaxPlayerLevel) +# Default: 1 +# +# StartPlayerMoney +# Amount of money that new players will start with. +# If you want to start with silver, use for example 100 (100 copper = 1 silver) +# Default: 0 +# # MaxHonorPoints # Max honor points that player can have. # Default: 75000 # +# StartHonorPoints +# Amount of honor that new players will start with +# Default: 0 +# # MaxArenaPoints # Max arena points that player can have. # Default: 5000 # -# StartPlayerLevel -# Staring level that have character at creating (in range 1 to MaxPlayerLevel) -# Default: 1 +# StartArenaPoints +# Amount of arena points that new players will start with +# Default: 0 +# +# InstantLogout +# Enable or disable instant logout for security level (0..4) or high (NOT in combat/while dueling/while falling) +# Default: 1 (Mods/GMs/Admins) +# +# DisableWaterBreath +# Disable/enable waterbreathing for security level (0..4) or high +# Default: 4 (None) +# +# AllFlightPaths +# Players will start with all flight paths (Note: ALL flight paths, not only player's team) +# Default: 0 (true) +# 1 (false) +# +# AlwaysMaxSkillForLevel +# Players will automatically gain max level dependent (weapon/defense) skill when logging in, leveling up etc. +# Default: 0 (true) +# 1 (false) # # ActivateWeather # Activate weather system @@ -536,9 +567,16 @@ CharactersPerAccount = 50 CharactersPerRealm = 10 SkipCinematics = 0 MaxPlayerLevel = 70 -MaxHonorPoints = 75000 -MaxArenaPoints = 5000 StartPlayerLevel = 1 +StartPlayerMoney = 0 +MaxHonorPoints = 75000 +StartHonorPoints = 0 +MaxArenaPoints = 5000 +StartArenaPoints = 0 +InstantLogout = 1 +DisableWaterBreath = 4 +AllFlightPaths = 0 +AlwaysMaxSkillForLevel = 0 ActivateWeather = 1 Battleground.CastDeserter = 1 Battleground.QueueAnnouncer.Enable = 1 @@ -798,15 +836,20 @@ Channel.SilentlyGMJoin = 0 # Default: 1 (include) # 0 (not include) # +# GM.StartLevel +# GM starting level (1-255) +# Default: 1 +# ################################################################################################################### GM.LoginState = 2 GM.AcceptTickets = 2 GM.Chat = 2 GM.WhisperingTo = 2 -GM.InGMList = 0 -GM.InWhoList = 0 -GM.LogTrade = 1 +GM.InGMList = 0 +GM.InWhoList = 0 +GM.LogTrade = 1 +GM.StartLevel = 1 ################################################################################################################### # VISIBILITY AND RADIUSES diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index e78354a59..55347926a 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 "6861" + #define REVISION_NR "6862" #endif // __REVISION_NR_H__ From e19433fa7331c9295b75ca59432853955d729874 Mon Sep 17 00:00:00 2001 From: hunuza Date: Tue, 18 Nov 2008 11:41:55 +0100 Subject: [PATCH 18/56] [6863] Arena team related clean ups and adding parts of w12x's arena patch. --- src/game/ArenaTeam.cpp | 156 +++++++++++++++++++++----------------- src/game/ArenaTeam.h | 41 ++++++---- src/game/BattleGround.cpp | 21 +++-- src/game/MiscHandler.cpp | 4 + src/game/Player.cpp | 12 +++ src/shared/revision_nr.h | 2 +- 6 files changed, 143 insertions(+), 93 deletions(-) diff --git a/src/game/ArenaTeam.cpp b/src/game/ArenaTeam.cpp index 88ed21ebf..0b9808c3b 100644 --- a/src/game/ArenaTeam.cpp +++ b/src/game/ArenaTeam.cpp @@ -22,21 +22,21 @@ ArenaTeam::ArenaTeam() { - Id = 0; - Type = 0; - Name = ""; - CaptainGuid = 0; - BackgroundColor = 0; // background - EmblemStyle = 0; // icon - EmblemColor = 0; // icon color - BorderStyle = 0; // border - BorderColor = 0; // border color - stats.games = 0; - stats.played = 0; - stats.rank = 0; - stats.rating = 1500; - stats.wins = 0; - stats.wins2 = 0; + Id = 0; + Type = 0; + Name = ""; + CaptainGuid = 0; + BackgroundColor = 0; // background + EmblemStyle = 0; // icon + EmblemColor = 0; // icon color + BorderStyle = 0; // border + BorderColor = 0; // border color + stats.games_week = 0; + stats.games_season = 0; + stats.rank = 0; + stats.rating = 1500; + stats.wins_week = 0; + stats.wins_season = 0; } ArenaTeam::~ArenaTeam() @@ -51,7 +51,7 @@ bool ArenaTeam::create(uint64 captainGuid, uint32 type, std::string ArenaTeamNam if(objmgr.GetArenaTeamByName(ArenaTeamName)) // arena team with this name already exist return false; - sLog.outDebug("GUILD: creating arena team %s to leader: %u", ArenaTeamName.c_str(), GUID_LOPART(CaptainGuid)); + sLog.outDebug("GUILD: creating arena team %s to leader: %u", ArenaTeamName.c_str(), GUID_LOPART(captainGuid)); CaptainGuid = captainGuid; Name = ArenaTeamName; @@ -69,7 +69,7 @@ bool ArenaTeam::create(uint64 captainGuid, uint32 type, std::string ArenaTeamNam "VALUES('%u','%s','%u','%u','%u','%u','%u','%u','%u')", Id, ArenaTeamName.c_str(), GUID_LOPART(CaptainGuid), Type, BackgroundColor,EmblemStyle,EmblemColor,BorderStyle,BorderColor); CharacterDatabase.PExecute("INSERT INTO arena_team_stats (arenateamid, rating, games, wins, played, wins2, rank) VALUES " - "('%u', '%u', '%u', '%u', '%u', '%u', '%u')", Id,stats.rating,stats.games,stats.wins,stats.played,stats.wins2,stats.rank); + "('%u', '%u', '%u', '%u', '%u', '%u', '%u')", Id,stats.rating,stats.games_week,stats.wins_week,stats.games_season,stats.wins_season,stats.rank); CharacterDatabase.CommitTransaction(); @@ -122,13 +122,14 @@ bool ArenaTeam::AddMember(uint64 PlayerGuid) Player::RemovePetitionsAndSigns(PlayerGuid, GetType()); ArenaTeamMember newmember; - newmember.name = plName; - newmember.guid = PlayerGuid; - newmember.Class = plClass; - newmember.played_season = 0; - newmember.played_week = 0; - newmember.wons_season = 0; - newmember.wons_week = 0; + newmember.name = plName; + newmember.guid = PlayerGuid; + newmember.Class = plClass; + newmember.games_season = 0; + newmember.games_week = 0; + newmember.wins_season = 0; + newmember.wins_week = 0; + newmember.personal_rating = 1500; members.push_back(newmember); CharacterDatabase.PExecute("INSERT INTO arena_team_member (arenateamid,guid) VALUES ('%u', '%u')", Id, GUID_LOPART(newmember.guid)); @@ -192,12 +193,12 @@ void ArenaTeam::LoadStatsFromDB(uint32 ArenaTeamId) Field *fields = result->Fetch(); - stats.rating = fields[0].GetUInt32(); - stats.games = fields[1].GetUInt32(); - stats.wins = fields[2].GetUInt32(); - stats.played = fields[3].GetUInt32(); - stats.wins2 = fields[4].GetUInt32(); - stats.rank = fields[5].GetUInt32(); + stats.rating = fields[0].GetUInt32(); + stats.games_week = fields[1].GetUInt32(); + stats.wins_week = fields[2].GetUInt32(); + stats.games_season = fields[3].GetUInt32(); + stats.wins_season = fields[4].GetUInt32(); + stats.rank = fields[5].GetUInt32(); delete result; } @@ -206,7 +207,7 @@ void ArenaTeam::LoadMembersFromDB(uint32 ArenaTeamId) { Field *fields; - QueryResult *result = CharacterDatabase.PQuery("SELECT guid,played_week,wons_week,played_season,wons_season FROM arena_team_member WHERE arenateamid = '%u'", ArenaTeamId); + QueryResult *result = CharacterDatabase.PQuery("SELECT guid,games_week,wins_week,games_season,wins_season FROM arena_team_member WHERE arenateamid = '%u'", ArenaTeamId); if(!result) return; @@ -216,10 +217,10 @@ void ArenaTeam::LoadMembersFromDB(uint32 ArenaTeamId) ArenaTeamMember newmember; newmember.guid = MAKE_NEW_GUID(fields[0].GetUInt32(), 0, HIGHGUID_PLAYER); LoadPlayerStats(&newmember); - newmember.played_week = fields[1].GetUInt32(); - newmember.wons_week = fields[2].GetUInt32(); - newmember.played_season = fields[3].GetUInt32(); - newmember.wons_season = fields[4].GetUInt32(); + newmember.games_week = fields[1].GetUInt32(); + newmember.wins_week = fields[2].GetUInt32(); + newmember.games_season = fields[3].GetUInt32(); + newmember.wins_season = fields[4].GetUInt32(); members.push_back(newmember); }while( result->NextRow() ); delete result; @@ -337,11 +338,11 @@ void ArenaTeam::Roster(WorldSession *session) data << uint32(itr->guid == GetCaptain() ? 0 : 1);// unknown data << uint8(pl->getLevel()); // unknown, probably level data << uint8(pl->getClass()); // class - data << uint32(itr->played_week); // played this week - data << uint32(itr->wons_week); // wins this week - data << uint32(itr->played_season); // played this season - data << uint32(itr->wons_season); // wins this season - data << uint32(0); // personal rating? + data << uint32(itr->games_week); // played this week + data << uint32(itr->wins_week); // wins this week + data << uint32(itr->games_season); // played this season + data << uint32(itr->wins_season); // wins this season + data << uint32(itr->personal_rating); // personal rating } else { @@ -351,11 +352,11 @@ void ArenaTeam::Roster(WorldSession *session) data << uint32(itr->guid == GetCaptain() ? 0 : 1);// unknown data << uint8(0); // unknown, level? data << uint8(itr->Class); // class - data << uint32(itr->played_week); // played this week - data << uint32(itr->wons_week); // wins this week - data << uint32(itr->played_season); // played this season - data << uint32(itr->wons_season); // wins this season - data << uint32(0); // personal rating? + data << uint32(itr->games_week); // played this week + data << uint32(itr->wins_week); // wins this week + data << uint32(itr->games_season); // played this season + data << uint32(itr->wins_season); // wins this season + data << uint32(itr->personal_rating); // personal rating } } session->SendPacket(&data); @@ -382,25 +383,29 @@ void ArenaTeam::Stats(WorldSession *session) WorldPacket data(SMSG_ARENA_TEAM_STATS, 4*7); data << uint32(GetId()); // arena team id data << uint32(stats.rating); // rating - data << uint32(stats.games); // games - data << uint32(stats.wins); // wins - data << uint32(stats.played); // played - data << uint32(stats.wins2); // wins(again o_O) + data << uint32(stats.games_week); // games this week + data << uint32(stats.wins_week); // wins this week + data << uint32(stats.games_season); // played this season + data << uint32(stats.wins_season); // wins this season data << uint32(stats.rank); // rank session->SendPacket(&data); } void ArenaTeam::InspectStats(WorldSession *session, uint64 guid) { + ArenaTeamMember* member = GetMember(guid); + if(!member) + return; + WorldPacket data(MSG_INSPECT_ARENA_TEAMS, 8+1+4*6); data << uint64(guid); // player guid data << uint8(GetSlot()); // slot (0...2) data << uint32(GetId()); // arena team id data << uint32(stats.rating); // rating - data << uint32(stats.games); // games - data << uint32(stats.wins); // wins - data << uint32(stats.played); // played (count of all games, that played...) - data << uint32(0); // 2.3.3 personal rating? + data << uint32(stats.games_season); // season played + data << uint32(stats.wins_season); // season wins + data << member->games_season; // played (count of all games, that the inspected member participated...) + data << member->personal_rating; // personal rating session->SendPacket(&data); } @@ -423,20 +428,20 @@ void ArenaTeam::SetStats(uint32 stat_type, uint32 value) stats.rating = value; CharacterDatabase.PExecute("UPDATE arena_team_stats SET rating = '%u' WHERE arenateamid = '%u'", value, GetId()); break; - case STAT_TYPE_GAMES: - stats.games = value; + case STAT_TYPE_GAMES_WEEK: + stats.games_week = value; CharacterDatabase.PExecute("UPDATE arena_team_stats SET games = '%u' WHERE arenateamid = '%u'", value, GetId()); break; - case STAT_TYPE_WINS: - stats.wins = value; + case STAT_TYPE_WINS_WEEK: + stats.wins_week = value; CharacterDatabase.PExecute("UPDATE arena_team_stats SET wins = '%u' WHERE arenateamid = '%u'", value, GetId()); break; - case STAT_TYPE_PLAYED: - stats.played = value; + case STAT_TYPE_GAMES_SEASON: + stats.games_season = value; CharacterDatabase.PExecute("UPDATE arena_team_stats SET played = '%u' WHERE arenateamid = '%u'", value, GetId()); break; - case STAT_TYPE_WINS2: - stats.wins2 = value; + case STAT_TYPE_WINS_SEASON: + stats.wins_season = value; CharacterDatabase.PExecute("UPDATE arena_team_stats SET wins2 = '%u' WHERE arenateamid = '%u'", value, GetId()); break; case STAT_TYPE_RANK: @@ -493,24 +498,35 @@ bool ArenaTeam::HaveMember( uint64 guid ) const return false; } +void ArenaTeam::FinishWeek() +{ + stats.games_week = 0; // played this week + stats.wins_week = 0; // wins this week + for(MemberList::iterator itr = members.begin(); itr != members.end(); ++itr) + { + itr->games_week = 0; + itr->wins_week = 0; + } +} + /* arenateam fields (id from 2.3.3 client): 1414 - arena team id 2v2 1415 - 0=captain, 1=member -1416 - played this season -1417 - played this week +1416 - played this week +1417 - played this season 1418 - unk -1419 - unk +1419 - personal arena rating 1420 - arena team id 3v3 1421 - 0=captain, 1=member -1422 - played this season -1423 - played this week +1422 - played this week +1423 - played this season 1424 - unk -1425 - unk +1425 - personal arena rating 1426 - arena team id 5v5 1427 - 0=captain, 1=member -1428 - played this season -1429 - played this week +1428 - played this week +1429 - played this season 1430 - unk -1431 - unk +1431 - personal arena rating */ diff --git a/src/game/ArenaTeam.h b/src/game/ArenaTeam.h index 0d26b00cf..b12b759a8 100644 --- a/src/game/ArenaTeam.h +++ b/src/game/ArenaTeam.h @@ -66,12 +66,12 @@ ERR_ARENA_TEAM_LEVEL_TOO_LOW_I enum ArenaTeamStatTypes { - STAT_TYPE_RATING = 0, - STAT_TYPE_GAMES = 1, - STAT_TYPE_WINS = 2, - STAT_TYPE_PLAYED = 3, - STAT_TYPE_WINS2 = 4, - STAT_TYPE_RANK = 5 + STAT_TYPE_RATING = 0, + STAT_TYPE_GAMES_WEEK = 1, + STAT_TYPE_WINS_WEEK = 2, + STAT_TYPE_GAMES_SEASON = 3, + STAT_TYPE_WINS_SEASON = 4, + STAT_TYPE_RANK = 5 }; enum ArenaTeamTypes @@ -88,19 +88,20 @@ struct ArenaTeamMember //uint32 unk2; //uint8 unk1; uint8 Class; - uint32 played_week; - uint32 wons_week; - uint32 played_season; - uint32 wons_season; + uint32 games_week; + uint32 wins_week; + uint32 games_season; + uint32 wins_season; + uint32 personal_rating; }; struct ArenaTeamStats { uint32 rating; - uint32 games; - uint32 wins; - uint32 played; - uint32 wins2; + uint32 games_week; + uint32 wins_week; + uint32 games_season; + uint32 wins_season; uint32 rank; }; @@ -123,7 +124,7 @@ class ArenaTeam static uint8 GetSlotByType(uint32 type); const uint64& GetCaptain() const { return CaptainGuid; } std::string GetName() const { return Name; } - ArenaTeamStats GetStats() const { return stats; } + const ArenaTeamStats& GetStats() const { return stats; } void SetStats(uint32 stat_type, uint32 value); uint32 GetRating() const { return stats.rating; } @@ -143,6 +144,14 @@ class ArenaTeam MemberList::iterator membersbegin(){ return members.begin(); } MemberList::iterator membersEnd(){ return members.end(); } bool HaveMember(uint64 guid) const; + ArenaTeamMember* GetMember(uint64 guid) + { + for (MemberList::iterator itr = members.begin(); itr != members.end(); ++itr) + if(itr->guid==guid) + return &(*itr); + + return NULL; + } bool LoadArenaTeamFromDB(uint32 ArenaTeamId); void LoadMembersFromDB(uint32 ArenaTeamId); @@ -156,6 +165,8 @@ class ArenaTeam void Stats(WorldSession *session); void InspectStats(WorldSession *session, uint64 guid); + void FinishWeek(); + protected: uint32 Id; diff --git a/src/game/BattleGround.cpp b/src/game/BattleGround.cpp index 2781ef6e2..7e84a3065 100644 --- a/src/game/BattleGround.cpp +++ b/src/game/BattleGround.cpp @@ -709,14 +709,21 @@ void BattleGround::AddPlayer(Player *plr) plr->RemoveArenaSpellCooldowns(); //plr->RemoveArenaAuras(); plr->RemoveAllEnchantments(TEMP_ENCHANTMENT_SLOT); - if(team == ALLIANCE && plr->GetTeam() == ALLIANCE) - plr->CastSpell(plr,SPELL_ALLIANCE_GOLD_FLAG,true); - else if(team == HORDE && plr->GetTeam() == ALLIANCE) - plr->CastSpell(plr,SPELL_ALLIANCE_GREEN_FLAG,true); - else if(team == ALLIANCE && plr->GetTeam() == HORDE) - plr->CastSpell(plr,SPELL_HORDE_GOLD_FLAG,true); + if(team == ALLIANCE) // gold + { + if(plr->GetTeam() == HORDE) + plr->CastSpell(plr, SPELL_HORDE_GOLD_FLAG,true); + else + plr->CastSpell(plr, SPELL_ALLIANCE_GOLD_FLAG,true); + } else - plr->CastSpell(plr,SPELL_HORDE_GREEN_FLAG,true); + { + if(plr->GetTeam() == HORDE) // green + plr->CastSpell(plr, SPELL_HORDE_GREEN_FLAG,true); + else + plr->CastSpell(plr, SPELL_ALLIANCE_GREEN_FLAG,true); + } + plr->DestroyConjuredItems(true); if(GetStatus() == STATUS_WAIT_JOIN) // not started yet diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp index 5c038759f..2949ceb11 100644 --- a/src/game/MiscHandler.cpp +++ b/src/game/MiscHandler.cpp @@ -655,6 +655,10 @@ void WorldSession::HandleCorpseReclaimOpcode(WorldPacket &recv_data) if (GetPlayer()->isAlive()) return; + // do not allow corpse reclaim in arena + if (GetPlayer()->InArena()) + return; + // body not released yet if(!GetPlayer()->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST)) return; diff --git a/src/game/Player.cpp b/src/game/Player.cpp index f7574b06f..9b4733429 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -5910,6 +5910,18 @@ void Player::UpdateHonorFields() ///An exact honor value can also be given (overriding the calcs) bool Player::RewardHonor(Unit *uVictim, uint32 groupsize, float honor) { + // do not reward honor in arenas, but enable onkill spellproc + if(InArena()) + { + if(!uVictim || uVictim == this || uVictim->GetTypeId() != TYPEID_PLAYER) + return false; + + if( GetBGTeam() == ((Player*)uVictim)->GetBGTeam() ) + return false; + + return true; + } + // 'Inactive' this aura prevents the player from gaining honor points and battleground tokens if(GetDummyAura(SPELL_AURA_PLAYER_INACTIVE)) return false; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 55347926a..dd5528e2c 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 "6862" + #define REVISION_NR "6863" #endif // __REVISION_NR_H__ From d0ea9cbb23ace76d52e9e8292878ca0080dce462 Mon Sep 17 00:00:00 2001 From: hunuza Date: Sun, 30 Nov 2008 12:36:33 +0100 Subject: [PATCH 19/56] [6864] Fixed typos in [6863]. --- src/game/ArenaTeam.cpp | 2 +- src/game/BattleGround.cpp | 4 ++-- src/shared/revision_nr.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/game/ArenaTeam.cpp b/src/game/ArenaTeam.cpp index 0b9808c3b..ffd667d3a 100644 --- a/src/game/ArenaTeam.cpp +++ b/src/game/ArenaTeam.cpp @@ -207,7 +207,7 @@ void ArenaTeam::LoadMembersFromDB(uint32 ArenaTeamId) { Field *fields; - QueryResult *result = CharacterDatabase.PQuery("SELECT guid,games_week,wins_week,games_season,wins_season FROM arena_team_member WHERE arenateamid = '%u'", ArenaTeamId); + QueryResult *result = CharacterDatabase.PQuery("SELECT guid,played_week,wons_week,played_season,wons_season FROM arena_team_member WHERE arenateamid = '%u'", ArenaTeamId); if(!result) return; diff --git a/src/game/BattleGround.cpp b/src/game/BattleGround.cpp index 7e84a3065..1a3d70fb6 100644 --- a/src/game/BattleGround.cpp +++ b/src/game/BattleGround.cpp @@ -716,9 +716,9 @@ void BattleGround::AddPlayer(Player *plr) else plr->CastSpell(plr, SPELL_ALLIANCE_GOLD_FLAG,true); } - else + else // green { - if(plr->GetTeam() == HORDE) // green + if(plr->GetTeam() == HORDE) plr->CastSpell(plr, SPELL_HORDE_GREEN_FLAG,true); else plr->CastSpell(plr, SPELL_ALLIANCE_GREEN_FLAG,true); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index dd5528e2c..756b89053 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 "6863" + #define REVISION_NR "6864" #endif // __REVISION_NR_H__ From 1ad9adc4674540ac9826a31689f2092729cd8eaa Mon Sep 17 00:00:00 2001 From: hunuza Date: Sun, 30 Nov 2008 13:15:05 +0100 Subject: [PATCH 20/56] [6865] Improve db access in guild and arena team code. Note: Using SetUInt32ValueInDB() is still not safe, because it's executed async. Three possible solutions: 1) remove data field 2) get rid of SetUInt32ValueInDB() calls (probably not possible) 3) make SaveValuesArrayInDB() executed directly --- src/game/ArenaTeam.cpp | 22 +++++++++++++--------- src/game/CharacterHandler.cpp | 3 +-- src/game/Guild.cpp | 18 ++++++++++++++---- src/shared/revision_nr.h | 2 +- 4 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/game/ArenaTeam.cpp b/src/game/ArenaTeam.cpp index ffd667d3a..b35ce1e36 100644 --- a/src/game/ArenaTeam.cpp +++ b/src/game/ArenaTeam.cpp @@ -138,19 +138,23 @@ bool ArenaTeam::AddMember(uint64 PlayerGuid) { pl->SetInArenaTeam(Id, GetSlot()); pl->SetArenaTeamIdInvited(0); + + // hide promote/remove buttons + if(CaptainGuid != PlayerGuid) + pl->SetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + 1 + (GetSlot() * 6), 1); } else { - Player::SetUInt32ValueInDB(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (GetSlot() * 6), Id, PlayerGuid); - } + Tokens tokens; + if(Player::LoadValuesArrayFromDB(tokens,PlayerGuid)) + { + Player::SetUInt32ValueInArray(tokens,PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (GetSlot() * 6), Id); + // hide promote/remove buttons + if(CaptainGuid != PlayerGuid) + Player::SetUInt32ValueInArray(tokens,PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + 1 + (GetSlot() * 6), 1); - // hide promote/remove buttons - if(CaptainGuid != PlayerGuid) - { - if(pl) - pl->SetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + 1 + (GetSlot() * 6), 1); - else - Player::SetUInt32ValueInDB(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + 1 + (GetSlot() * 6), 1, PlayerGuid); + Player::SaveValuesArrayInDB(tokens,PlayerGuid); + } } return true; } diff --git a/src/game/CharacterHandler.cpp b/src/game/CharacterHandler.cpp index 843d11319..66db349ef 100644 --- a/src/game/CharacterHandler.cpp +++ b/src/game/CharacterHandler.cpp @@ -567,8 +567,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder) { // remove wrong guild data sLog.outError("Player %s (GUID: %u) marked as member not existed guild (id: %u), removing guild membership for player.",pCurrChar->GetName(),pCurrChar->GetGUIDLow(),pCurrChar->GetGuildId()); - pCurrChar->SetUInt32Value(PLAYER_GUILDID,0); - pCurrChar->SetUInt32ValueInDB(PLAYER_GUILDID,0,pCurrChar->GetGUID()); + pCurrChar->SetInGuild(0); } } diff --git a/src/game/Guild.cpp b/src/game/Guild.cpp index 77bce20b0..75451fc4c 100644 --- a/src/game/Guild.cpp +++ b/src/game/Guild.cpp @@ -151,8 +151,13 @@ bool Guild::AddMember(uint64 plGuid, uint32 plRank) } else { - Player::SetUInt32ValueInDB(PLAYER_GUILDID, Id, plGuid); - Player::SetUInt32ValueInDB(PLAYER_GUILDRANK, newmember.RankId, plGuid); + Tokens tokens; + if(Player::LoadValuesArrayFromDB(tokens,plGuid)) + { + Player::SetUInt32ValueInArray(tokens, PLAYER_GUILDID, Id); + Player::SetUInt32ValueInArray(tokens, PLAYER_GUILDRANK, newmember.RankId); + Player::SaveValuesArrayInDB(tokens, plGuid); + } } return true; } @@ -481,8 +486,13 @@ void Guild::DelMember(uint64 guid, bool isDisbanding) } else { - Player::SetUInt32ValueInDB(PLAYER_GUILDID, 0, guid); - Player::SetUInt32ValueInDB(PLAYER_GUILDRANK, GR_GUILDMASTER, guid); + Tokens tokens; + if(Player::LoadValuesArrayFromDB(tokens,guid)) + { + Player::SetUInt32ValueInArray(tokens, PLAYER_GUILDID, 0); + Player::SetUInt32ValueInArray(tokens, PLAYER_GUILDRANK, GR_GUILDMASTER); + Player::SaveValuesArrayInDB(tokens, guid); + } } CharacterDatabase.PExecute("DELETE FROM guild_member WHERE guid = '%u'", GUID_LOPART(guid)); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 756b89053..00be33fd6 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 "6864" + #define REVISION_NR "6865" #endif // __REVISION_NR_H__ From 8347cba4933893b0b2466b108176a4f0eafec03e Mon Sep 17 00:00:00 2001 From: balrok Date: Thu, 13 Nov 2008 18:21:35 +0100 Subject: [PATCH 21/56] [6866] Fixed: Only dungeons, not all instancable maps should modify aggro-behaviour. This has no functional effect until the battlegrounds are instanced. Signed-off-by: hunuza --- src/game/Creature.cpp | 2 +- src/shared/revision_nr.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index 8def022a8..c832804f5 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -1775,7 +1775,7 @@ bool Creature::IsOutOfThreatArea(Unit* pVictim) const if(!pVictim->isInAccessablePlaceFor(this)) return true; - if(sMapStore.LookupEntry(GetMapId())->Instanceable()) + if(sMapStore.LookupEntry(GetMapId())->IsDungeon()) return false; float length = pVictim->GetDistance(CombatStartX,CombatStartY,CombatStartZ); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 00be33fd6..5068d1d69 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 "6865" + #define REVISION_NR "6866" #endif // __REVISION_NR_H__ From 571221148abcd3d904d84b79745716e5b26f79f0 Mon Sep 17 00:00:00 2001 From: ApoC Date: Sun, 30 Nov 2008 16:32:51 +0100 Subject: [PATCH 22/56] [6867] Optimized working with DB in Guild code. No need of parsing/saving players data fields anymore. Signed-off-by: ApoC --- src/game/CharacterHandler.cpp | 42 ++++++++++++++++++----------------- src/game/Guild.cpp | 30 +++++-------------------- src/game/Player.cpp | 4 ++-- src/game/Player.h | 4 ++-- src/shared/revision_nr.h | 2 +- 5 files changed, 32 insertions(+), 50 deletions(-) diff --git a/src/game/CharacterHandler.cpp b/src/game/CharacterHandler.cpp index 66db349ef..cd0b86b0e 100644 --- a/src/game/CharacterHandler.cpp +++ b/src/game/CharacterHandler.cpp @@ -156,18 +156,20 @@ void WorldSession::HandleCharEnumOpcode( WorldPacket & /*recv_data*/ ) // ------- Query Without Declined Names -------- // 0 1 2 3 4 5 6 7 8 "SELECT characters.guid, characters.data, characters.name, characters.position_x, characters.position_y, characters.position_z, characters.map, characters.totaltime, characters.leveltime, " - // 9 10 11 12 - "characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level " + // 9 10 11 12 13 + "characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, guild_member.guildid " "FROM characters LEFT JOIN character_pet ON characters.guid=character_pet.owner AND character_pet.slot='0' " + "LEFT JOIN guild_member ON characters.guid = guild_member.guid " "WHERE characters.account = '%u' ORDER BY characters.guid" : // --------- Query With Declined Names --------- // 0 1 2 3 4 5 6 7 8 "SELECT characters.guid, characters.data, characters.name, characters.position_x, characters.position_y, characters.position_z, characters.map, characters.totaltime, characters.leveltime, " - // 9 10 11 12 13 - "characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, genitive " + // 9 10 11 12 13 14 + "characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, guild_member.guildid, genitive " "FROM characters LEFT JOIN character_pet ON characters.guid = character_pet.owner AND character_pet.slot='0' " "LEFT JOIN character_declinedname ON characters.guid = character_declinedname.guid " + "LEFT JOIN guild_member ON characters.guid = guild_member.guid " "WHERE characters.account = '%u' ORDER BY characters.guid", GetAccountId()); } @@ -540,6 +542,22 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder) DEBUG_LOG( "WORLD: Sent motd (SMSG_MOTD)" ); } + //QueryResult *result = CharacterDatabase.PQuery("SELECT guildid,rank FROM guild_member WHERE guid = '%u'",pCurrChar->GetGUIDLow()); + QueryResult *resultGuild = holder->GetResult(PLAYER_LOGIN_QUERY_LOADGUILD); + + if(resultGuild) + { + Field *fields = resultGuild->Fetch(); + pCurrChar->SetInGuild(fields[0].GetUInt32()); + pCurrChar->SetRank(fields[1].GetUInt32()); + delete resultGuild; + } + else if(pCurrChar->GetGuildId()) // clear guild related fields in case wrong data about non existed membership + { + pCurrChar->SetInGuild(0); + pCurrChar->SetRank(0); + } + if(pCurrChar->GetGuildId() != 0) { Guild* guild = objmgr.GetGuildById(pCurrChar->GetGuildId()); @@ -590,22 +608,6 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder) } } - //QueryResult *result = CharacterDatabase.PQuery("SELECT guildid,rank FROM guild_member WHERE guid = '%u'",pCurrChar->GetGUIDLow()); - QueryResult *resultGuild = holder->GetResult(PLAYER_LOGIN_QUERY_LOADGUILD); - - if(resultGuild) - { - Field *fields = resultGuild->Fetch(); - pCurrChar->SetInGuild(fields[0].GetUInt32()); - pCurrChar->SetRank(fields[1].GetUInt32()); - delete resultGuild; - } - else if(pCurrChar->GetGuildId()) // clear guild related fields in case wrong data about non existed membership - { - pCurrChar->SetInGuild(0); - pCurrChar->SetRank(0); - } - if (!pCurrChar->GetMap()->Add(pCurrChar)) { AreaTrigger const* at = objmgr.GetGoBackTrigger(pCurrChar->GetMapId()); diff --git a/src/game/Guild.cpp b/src/game/Guild.cpp index 75451fc4c..84b6c6965 100644 --- a/src/game/Guild.cpp +++ b/src/game/Guild.cpp @@ -143,22 +143,13 @@ bool Guild::AddMember(uint64 plGuid, uint32 plRank) CharacterDatabase.PExecute("INSERT INTO guild_member (guildid,guid,rank,pnote,offnote) VALUES ('%u', '%u', '%u','%s','%s')", Id, GUID_LOPART(plGuid), newmember.RankId, dbPnote.c_str(), dbOFFnote.c_str()); + // If player not in game data in data field will be loaded from guild tables, no need to update it!! if(pl) { pl->SetInGuild(Id); pl->SetRank(newmember.RankId); pl->SetGuildIdInvited(0); } - else - { - Tokens tokens; - if(Player::LoadValuesArrayFromDB(tokens,plGuid)) - { - Player::SetUInt32ValueInArray(tokens, PLAYER_GUILDID, Id); - Player::SetUInt32ValueInArray(tokens, PLAYER_GUILDRANK, newmember.RankId); - Player::SaveValuesArrayInDB(tokens, plGuid); - } - } return true; } @@ -439,16 +430,15 @@ void Guild::DelMember(uint64 guid, bool isDisbanding) SetLeader(newLeaderGUID); newLeader = objmgr.GetPlayer(newLeaderGUID); + + // If player not online data in data field will be loaded from guild tabs no need to update it !! if(newLeader) { newLeader->SetRank(GR_GUILDMASTER); newLeaderName = newLeader->GetName(); } else - { - Player::SetUInt32ValueInDB(PLAYER_GUILDRANK, GR_GUILDMASTER, newLeaderGUID); objmgr.GetPlayerNameByGUID(newLeaderGUID, newLeaderName); - } // when leader non-exist (at guild load with deleted leader only) not send broadcasts if(objmgr.GetPlayerNameByGUID(guid, oldLeaderName)) @@ -479,21 +469,12 @@ void Guild::DelMember(uint64 guid, bool isDisbanding) members.erase(GUID_LOPART(guid)); Player *player = objmgr.GetPlayer(guid); + // If player not online data in data field will be loaded from guild tabs no need to update it !! if(player) { player->SetInGuild(0); player->SetRank(0); } - else - { - Tokens tokens; - if(Player::LoadValuesArrayFromDB(tokens,guid)) - { - Player::SetUInt32ValueInArray(tokens, PLAYER_GUILDID, 0); - Player::SetUInt32ValueInArray(tokens, PLAYER_GUILDRANK, GR_GUILDMASTER); - Player::SaveValuesArrayInDB(tokens, guid); - } - } CharacterDatabase.PExecute("DELETE FROM guild_member WHERE guid = '%u'", GUID_LOPART(guid)); } @@ -505,10 +486,9 @@ void Guild::ChangeRank(uint64 guid, uint32 newRank) itr->second.RankId = newRank; Player *player = objmgr.GetPlayer(guid); + // If player not online data in data field will be loaded from guild tabs no need to update it !! if(player) player->SetRank(newRank); - else - Player::SetUInt32ValueInDB(PLAYER_GUILDRANK, newRank, guid); CharacterDatabase.PExecute( "UPDATE guild_member SET rank='%u' WHERE guid='%u'", newRank, GUID_LOPART(guid) ); } diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 9b4733429..5d470c924 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -1347,7 +1347,7 @@ void Player::BuildEnumData( QueryResult * result, WorldPacket * p_data ) *p_data << GetPositionY(); *p_data << GetPositionZ(); - *p_data << GetUInt32Value(PLAYER_GUILDID); // guild id + *p_data << (result ? result->Fetch()[13].GetUInt32() : 0); uint32 char_flags = 0; if(HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_HELM)) @@ -1360,7 +1360,7 @@ void Player::BuildEnumData( QueryResult * result, WorldPacket * p_data ) char_flags |= CHARACTER_FLAG_RENAME; // always send the flag if declined names aren't used // to let the client select a default method of declining the name - if(!sWorld.getConfig(CONFIG_DECLINED_NAMES_USED) || (result && result->Fetch()[13].GetCppString() != "")) + if(!sWorld.getConfig(CONFIG_DECLINED_NAMES_USED) || (result && result->Fetch()[14].GetCppString() != "")) char_flags |= CHARACTER_FLAG_DECLINED; *p_data << (uint32)char_flags; // character flags diff --git a/src/game/Player.h b/src/game/Player.h index 4e4979ab5..659d8c57e 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -1503,8 +1503,8 @@ class MANGOS_DLL_SPEC Player : public Unit void RemoveFromGroup() { RemoveFromGroup(GetGroup(),GetGUID()); } void SendUpdateToOutOfRangeGroupMembers(); - void SetInGuild(uint32 GuildId) { SetUInt32Value(PLAYER_GUILDID, GuildId); Player::SetUInt32ValueInDB(PLAYER_GUILDID, GuildId, GetGUID()); } - void SetRank(uint32 rankId){ SetUInt32Value(PLAYER_GUILDRANK, rankId); Player::SetUInt32ValueInDB(PLAYER_GUILDRANK, rankId, GetGUID()); } + void SetInGuild(uint32 GuildId) { SetUInt32Value(PLAYER_GUILDID, GuildId); } + void SetRank(uint32 rankId){ SetUInt32Value(PLAYER_GUILDRANK, rankId); } void SetGuildIdInvited(uint32 GuildId) { m_GuildIdInvited = GuildId; } uint32 GetGuildId() { return GetUInt32Value(PLAYER_GUILDID); } static uint32 GetGuildIdFromDB(uint64 guid); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 5068d1d69..a005c5b9a 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 "6866" + #define REVISION_NR "6867" #endif // __REVISION_NR_H__ From 818c3788548c218d52bd72ff171f64156b3734f8 Mon Sep 17 00:00:00 2001 From: hunuza Date: Sun, 30 Nov 2008 18:30:00 +0100 Subject: [PATCH 23/56] [6868] Don't load data field from DB to save money or arena team id. Signed-off-by: hunuza --- src/game/GuildHandler.cpp | 4 ++-- src/game/Mail.cpp | 2 +- src/game/Player.cpp | 17 ++++++++++++++++- src/game/Player.h | 4 ++-- src/shared/revision_nr.h | 2 +- 5 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/game/GuildHandler.cpp b/src/game/GuildHandler.cpp index 80417c0f3..d40bb9b4d 100644 --- a/src/game/GuildHandler.cpp +++ b/src/game/GuildHandler.cpp @@ -977,7 +977,7 @@ void WorldSession::HandleGuildBankDeposit( WorldPacket & recv_data ) pGuild->SetBankMoney(pGuild->GetGuildBankMoney()+money); GetPlayer()->ModifyMoney(-int(money)); - GetPlayer()->SaveGoldToDB(); + GetPlayer()->SaveDataFieldToDB(); //contains money CharacterDatabase.CommitTransaction(); @@ -1033,7 +1033,7 @@ void WorldSession::HandleGuildBankWithdraw( WorldPacket & recv_data ) } GetPlayer()->ModifyMoney(money); - GetPlayer()->SaveGoldToDB(); + GetPlayer()->SaveDataFieldToDB(); // contains money CharacterDatabase.CommitTransaction(); diff --git a/src/game/Mail.cpp b/src/game/Mail.cpp index aafcdfa93..06499d15b 100644 --- a/src/game/Mail.cpp +++ b/src/game/Mail.cpp @@ -517,7 +517,7 @@ void WorldSession::HandleTakeMoney(WorldPacket & recv_data ) // save money and mail to prevent cheating CharacterDatabase.BeginTransaction(); - pl->SetUInt32ValueInDB(PLAYER_FIELD_COINAGE,pl->GetMoney(),pl->GetGUID()); + pl->SaveDataFieldToDB(); // contains money pl->_SaveMail(); CharacterDatabase.CommitTransaction(); } diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 5d470c924..2c02327c6 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -14993,7 +14993,8 @@ void Player::SaveToDB() void Player::SaveInventoryAndGoldToDB() { _SaveInventory(); - SetUInt32ValueInDB(PLAYER_FIELD_COINAGE,GetMoney(),GetGUID()); + //money is in data field + SaveDataFieldToDB(); } void Player::_SaveActions() @@ -15384,6 +15385,20 @@ void Player::SavePositionInDB(uint32 mapid, float x,float y,float z,float o,uint CharacterDatabase.Execute(ss.str().c_str()); } +void Player::SaveDataFieldToDB() +{ + std::ostringstream ss; + ss<<"UPDATE characters SET data='"; + + for(uint16 i = 0; i < m_valuesCount; i++ ) + { + ss << GetUInt32Value(i) << " "; + } + ss<<"' WHERE guid='"<< GUID_LOPART(GetGUIDLow()) <<"'"; + + CharacterDatabase.Execute(ss.str().c_str()); +} + bool Player::SaveValuesArrayInDB(Tokens const& tokens, uint64 guid) { std::ostringstream ss2; diff --git a/src/game/Player.h b/src/game/Player.h index 659d8c57e..88fbe8009 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -1264,7 +1264,7 @@ class MANGOS_DLL_SPEC Player : public Unit void SaveToDB(); void SaveInventoryAndGoldToDB(); // fast save function for item/money cheating preventing - void SaveGoldToDB() { SetUInt32ValueInDB(PLAYER_FIELD_COINAGE,GetMoney(),GetGUID()); } + void SaveDataFieldToDB(); static bool SaveValuesArrayInDB(Tokens const& data,uint64 guid); static void SetUInt32ValueInArray(Tokens& data,uint16 index, uint32 value); static void SetFloatValueInArray(Tokens& data,uint16 index, float value); @@ -1517,7 +1517,7 @@ class MANGOS_DLL_SPEC Player : public Unit void SetInArenaTeam(uint32 ArenaTeamId, uint8 slot) { SetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (slot * 6), ArenaTeamId); - SetUInt32ValueInDB(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (slot * 6), ArenaTeamId, GetGUID()); + SaveDataFieldToDB(); // needed? } uint32 GetArenaTeamId(uint8 slot) { return GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (slot * 6)); } static uint32 GetArenaTeamIdFromDB(uint64 guid, uint8 slot); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index a005c5b9a..4828f0151 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 "6867" + #define REVISION_NR "6868" #endif // __REVISION_NR_H__ From af6a55bcb583f4846bbef50e0174e1674249583d Mon Sep 17 00:00:00 2001 From: hunuza Date: Sun, 30 Nov 2008 19:24:38 +0100 Subject: [PATCH 24/56] [6869] Avoid DB access in 2 arena team handlers. Signed-off-by: hunuza --- src/game/ArenaTeam.h | 8 +++++ src/game/ArenaTeamHandler.cpp | 60 +++++++++++++---------------------- src/shared/revision_nr.h | 2 +- 3 files changed, 31 insertions(+), 39 deletions(-) diff --git a/src/game/ArenaTeam.h b/src/game/ArenaTeam.h index b12b759a8..43adca888 100644 --- a/src/game/ArenaTeam.h +++ b/src/game/ArenaTeam.h @@ -152,6 +152,14 @@ class ArenaTeam return NULL; } + ArenaTeamMember* GetMember(std::string& name) + { + for (MemberList::iterator itr = members.begin(); itr != members.end(); ++itr) + if(itr->name==name) + return &(*itr); + + return NULL; + } bool LoadArenaTeamFromDB(uint32 ArenaTeamId); void LoadMembersFromDB(uint32 ArenaTeamId); diff --git a/src/game/ArenaTeamHandler.cpp b/src/game/ArenaTeamHandler.cpp index c6b9059e7..7cab8d085 100644 --- a/src/game/ArenaTeamHandler.cpp +++ b/src/game/ArenaTeamHandler.cpp @@ -289,25 +289,8 @@ void WorldSession::HandleArenaTeamRemoveFromTeamOpcode(WorldPacket & recv_data) recv_data >> name; ArenaTeam *at = objmgr.GetArenaTeamById(ArenaTeamId); - if(!at) - { - // arena team not found + if(!at) // arena team not found return; - } - - uint64 guid = objmgr.GetPlayerGUIDByName(name); - if(!guid) - { - // player guid not found - return; - } - - if(at->GetCaptain() == guid) - { - // unsure - SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", "", ERR_ARENA_TEAM_PERMISSIONS); - return; - } if(at->GetCaptain() != _player->GetGUID()) { @@ -315,13 +298,20 @@ void WorldSession::HandleArenaTeamRemoveFromTeamOpcode(WorldPacket & recv_data) return; } - if(at->GetCaptain() == guid) + if(!normalizePlayerName(name)) + return; + + ArenaTeamMember* member = at->GetMember(name); + if(!member) // member not found + return; + + if(at->GetCaptain() == member->guid) { SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", "", ERR_ARENA_TEAM_LEADER_LEAVE_S); return; } - at->DelMember(guid); + at->DelMember(member->guid); // event WorldPacket data; @@ -343,24 +333,8 @@ void WorldSession::HandleArenaTeamPromoteToCaptainOpcode(WorldPacket & recv_data recv_data >> name; ArenaTeam *at = objmgr.GetArenaTeamById(ArenaTeamId); - if(!at) - { - // arena team not found + if(!at) // arena team not found return; - } - - uint64 guid = objmgr.GetPlayerGUIDByName(name); - if(!guid) - { - // player guid not found - return; - } - - if(at->GetCaptain() == guid) - { - // target player already captain - return; - } if(at->GetCaptain() != _player->GetGUID()) { @@ -368,7 +342,17 @@ void WorldSession::HandleArenaTeamPromoteToCaptainOpcode(WorldPacket & recv_data return; } - at->SetCaptain(guid); + if(!normalizePlayerName(name)) + return; + + ArenaTeamMember* member = at->GetMember(name); + if(!member) // member not found + return; + + if(at->GetCaptain() == member->guid) // target player already captain + return; + + at->SetCaptain(member->guid); // event WorldPacket data; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 4828f0151..ffac4a159 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 "6868" + #define REVISION_NR "6869" #endif // __REVISION_NR_H__ From d6b8b1fa134e464736672cee4db454e342f90261 Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Sun, 30 Nov 2008 22:22:51 +0300 Subject: [PATCH 25/56] [6870] Not output error message at loading empty `db_script_string` table. --- src/game/ObjectMgr.cpp | 4 ++-- src/shared/revision_nr.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index 0fcedab16..e1ab90d18 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -6320,7 +6320,7 @@ bool ObjectMgr::LoadMangosStrings(DatabaseType& db, char const* table, int32 min bar.step(); sLog.outString(""); - if(min_value > 0) // error only in case internal strings + if(min_value == MIN_MANGOS_STRING_ID) // error only in case internal strings sLog.outErrorDb(">> Loaded 0 mangos strings. DB table `%s` is empty. Cannot continue.",table); else sLog.outString(">> Loaded 0 string templates. DB table `%s` is empty.",table); @@ -6386,7 +6386,7 @@ bool ObjectMgr::LoadMangosStrings(DatabaseType& db, char const* table, int32 min delete result; sLog.outString(); - if(min_value > 0) // internal mangos strings + if(min_value == MIN_MANGOS_STRING_ID) // error only in case internal strings sLog.outString( ">> Loaded %u MaNGOS strings from table %s", count,table); else sLog.outString( ">> Loaded %u string templates from %s", count,table); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index ffac4a159..518ac001f 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 "6869" + #define REVISION_NR "6870" #endif // __REVISION_NR_H__ From d5da240913cbc88ac3561151f16aca6496dd0ab9 Mon Sep 17 00:00:00 2001 From: ApoC Date: Tue, 2 Dec 2008 21:57:49 +0100 Subject: [PATCH 26/56] [6871] Fixed BG Queue need players count announce. Signed-off-by: ApoC --- src/game/BattleGroundMgr.cpp | 4 ++-- src/shared/revision_nr.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/game/BattleGroundMgr.cpp b/src/game/BattleGroundMgr.cpp index 5cee001fa..9c3350bd1 100644 --- a/src/game/BattleGroundMgr.cpp +++ b/src/game/BattleGroundMgr.cpp @@ -103,13 +103,13 @@ void BattleGroundQueue::AddPlayer(Player *plr, uint32 bgTypeId) if(sWorld.getConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY)) { ChatHandler(plr).PSendSysMessage(LANG_BG_QUEUE_ANNOUNCE_SELF, - bgName, q_min_level, q_max_level, qAlliance, MinPlayers - qAlliance, qHorde, MinPlayers - qHorde); + bgName, q_min_level, q_max_level, qAlliance, (MinPlayers > qAlliance) ? (MinPlayers - qAlliance) : 0, qHorde, (MinPlayers > qHorde) ? (MinPlayers - qHorde) : 0); } // System message else { sWorld.SendWorldText(LANG_BG_QUEUE_ANNOUNCE_WORLD, - bgName, q_min_level, q_max_level, qAlliance, MinPlayers - qAlliance, qHorde, MinPlayers - qHorde); + bgName, q_min_level, q_max_level, qAlliance, (MinPlayers > qAlliance) ? (MinPlayers - qAlliance) : 0, qHorde, (MinPlayers > qHorde) ? (MinPlayers - qHorde) : 0); } } } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 518ac001f..b43a4db2d 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 "6870" + #define REVISION_NR "6871" #endif // __REVISION_NR_H__ From 8f355d8e3ac67cd36e1888472ad5774d84dadead Mon Sep 17 00:00:00 2001 From: hunuza Date: Wed, 3 Dec 2008 17:45:25 +0100 Subject: [PATCH 27/56] [6872] Make guid key in guild_member table unique. Signed-off-by: hunuza --- sql/characters.sql | 2 +- sql/updates/2008_12_03_01_character_guild_member.sql | 2 ++ src/shared/revision_nr.h | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 sql/updates/2008_12_03_01_character_guild_member.sql diff --git a/sql/characters.sql b/sql/characters.sql index e26bff136..f5fa4217b 100644 --- a/sql/characters.sql +++ b/sql/characters.sql @@ -938,7 +938,7 @@ CREATE TABLE `guild_member` ( `BankRemSlotsTab5` int(11) unsigned NOT NULL default '0', KEY `guildid_key` (`guildid`), KEY `guildid_rank_key` (`guildid`,`rank`), - KEY `guid_key` (`guid`) + UNIQUE KEY `guid_key` (`guid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Guild System'; -- diff --git a/sql/updates/2008_12_03_01_character_guild_member.sql b/sql/updates/2008_12_03_01_character_guild_member.sql new file mode 100644 index 000000000..483b991e1 --- /dev/null +++ b/sql/updates/2008_12_03_01_character_guild_member.sql @@ -0,0 +1,2 @@ +ALTER TABLE `guild_member` DROP INDEX `guid_key` , +ADD UNIQUE `guid_key` ( `guid` ); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index b43a4db2d..5c5d8cc55 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 "6871" + #define REVISION_NR "6872" #endif // __REVISION_NR_H__ From d44b1bc81bd4762bec3dd916d11d94fbe21d50e6 Mon Sep 17 00:00:00 2001 From: hunuza Date: Wed, 3 Dec 2008 17:54:30 +0100 Subject: [PATCH 28/56] Add missing part of last commit. Update makefile and characters required_* field. Signed-off-by: hunuza --- sql/characters.sql | 2 +- sql/updates/2008_12_03_01_character_guild_member.sql | 1 + sql/updates/Makefile.am | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/sql/characters.sql b/sql/characters.sql index f5fa4217b..733f4d3a4 100644 --- a/sql/characters.sql +++ b/sql/characters.sql @@ -21,7 +21,7 @@ DROP TABLE IF EXISTS `character_db_version`; CREATE TABLE `character_db_version` ( - `required_2008_11_12_01_character_character_aura` bit(1) default NULL + `required_2008_12_03_01_character_guild_member` bit(1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Last applied sql update to DB'; -- diff --git a/sql/updates/2008_12_03_01_character_guild_member.sql b/sql/updates/2008_12_03_01_character_guild_member.sql index 483b991e1..f339d6b45 100644 --- a/sql/updates/2008_12_03_01_character_guild_member.sql +++ b/sql/updates/2008_12_03_01_character_guild_member.sql @@ -1,2 +1,3 @@ +ALTER TABLE character_db_version CHANGE COLUMN required_2008_11_12_01_character_character_aura required_2008_12_03_01_character_guild_member bit; ALTER TABLE `guild_member` DROP INDEX `guid_key` , ADD UNIQUE `guid_key` ( `guid` ); diff --git a/sql/updates/Makefile.am b/sql/updates/Makefile.am index 17c5d931a..c4ca950f1 100644 --- a/sql/updates/Makefile.am +++ b/sql/updates/Makefile.am @@ -140,6 +140,7 @@ pkgdata_DATA = \ 2008_11_27_01_mangos_playercreateinfo_item.sql \ 2008_11_29_01_mangos_spell_proc_event.sql \ 2008_11_29_02_mangos_spell_elixir.sql \ + 2008_12_03_01_character_guild_member.sql \ README ## Additional files to include when running 'make dist' @@ -261,4 +262,5 @@ EXTRA_DIST = \ 2008_11_27_01_mangos_playercreateinfo_item.sql \ 2008_11_29_01_mangos_spell_proc_event.sql \ 2008_11_29_02_mangos_spell_elixir.sql \ + 2008_12_03_01_character_guild_member.sql \ README From 9254ca19e66c4acd570a3a3723e7233a0059d43e Mon Sep 17 00:00:00 2001 From: Neo2003 Date: Thu, 4 Dec 2008 21:51:09 +0100 Subject: [PATCH 29/56] [6873] make gameobjects scriptable. Patch provided by NoFantasy. Signed-off-by: Neo2003 --- src/game/SpellEffects.cpp | 4 ++++ src/shared/revision_nr.h | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index 409a56437..0090fc4b7 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -53,6 +53,7 @@ #include "SocialMgr.h" #include "Util.h" #include "TemporarySummon.h" +#include "ScriptCalls.h" pEffect SpellEffects[TOTAL_SPELL_EFFECTS]= { @@ -2794,6 +2795,9 @@ void Spell::SendLoot(uint64 guid, LootType loottype) if (gameObjTarget) { + if (Script->GOHello(player, gameObjTarget)) + return; + switch (gameObjTarget->GetGoType()) { case GAMEOBJECT_TYPE_DOOR: diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 5c5d8cc55..169735a48 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 "6872" + #define REVISION_NR "6873" #endif // __REVISION_NR_H__ From d00a4538631693d30ff63424d04d39d0815b2b6d Mon Sep 17 00:00:00 2001 From: tomrus88 Date: Fri, 5 Dec 2008 17:42:46 +0300 Subject: [PATCH 30/56] Reduced number of cells (doubled max visibility distance). Use 2D distance for visibility checks. --- src/game/Corpse.cpp | 2 +- src/game/DynamicObject.cpp | 2 +- src/game/GameObject.cpp | 2 +- src/game/GridDefines.h | 4 ++-- src/game/Object.cpp | 10 +++++++--- src/game/Object.h | 2 +- src/game/Unit.cpp | 16 ++++++++-------- src/game/Unit.h | 2 +- src/mangosd/mangosd.conf.dist.in | 12 ++++++------ 9 files changed, 28 insertions(+), 24 deletions(-) diff --git a/src/game/Corpse.cpp b/src/game/Corpse.cpp index b1c096281..cacd7deac 100644 --- a/src/game/Corpse.cpp +++ b/src/game/Corpse.cpp @@ -209,5 +209,5 @@ bool Corpse::LoadFromDB(uint32 guid, Field *fields) bool Corpse::isVisibleForInState(Player const* u, bool inVisibleList) const { - return IsInWorld() && u->IsInWorld() && IsWithinDistInMap(u,World::GetMaxVisibleDistanceForObject()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f)); + return IsInWorld() && u->IsInWorld() && IsWithinDistInMap(u,World::GetMaxVisibleDistanceForObject()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f), false); } diff --git a/src/game/DynamicObject.cpp b/src/game/DynamicObject.cpp index 7e6d2a88f..a73ffecc8 100644 --- a/src/game/DynamicObject.cpp +++ b/src/game/DynamicObject.cpp @@ -148,5 +148,5 @@ void DynamicObject::Delay(int32 delaytime) bool DynamicObject::isVisibleForInState(Player const* u, bool inVisibleList) const { - return IsInWorld() && u->IsInWorld() && IsWithinDistInMap(u,World::GetMaxVisibleDistanceForObject()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f)); + return IsInWorld() && u->IsInWorld() && IsWithinDistInMap(u,World::GetMaxVisibleDistanceForObject()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f), false); } diff --git a/src/game/GameObject.cpp b/src/game/GameObject.cpp index a1677f972..8a192716a 100644 --- a/src/game/GameObject.cpp +++ b/src/game/GameObject.cpp @@ -723,7 +723,7 @@ bool GameObject::isVisibleForInState(Player const* u, bool inVisibleList) const // check distance return IsWithinDistInMap(u,World::GetMaxVisibleDistanceForObject() + - (inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f) ); + (inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f), false); } void GameObject::Respawn() diff --git a/src/game/GridDefines.h b/src/game/GridDefines.h index 0942c5c31..ced42871b 100644 --- a/src/game/GridDefines.h +++ b/src/game/GridDefines.h @@ -41,10 +41,10 @@ class Player; #define MIN_GRID_DELAY MINUTE*1000 #define MIN_MAP_UPDATE_DELAY 50 -#define MAX_NUMBER_OF_CELLS 8 +#define MAX_NUMBER_OF_CELLS 4 #define SIZE_OF_GRID_CELL (SIZE_OF_GRIDS/MAX_NUMBER_OF_CELLS) -#define CENTER_GRID_CELL_ID 256 +#define CENTER_GRID_CELL_ID 128 #define CENTER_GRID_CELL_OFFSET (SIZE_OF_GRID_CELL/2) #define TOTAL_NUMBER_OF_CELLS_PER_MAP (MAX_NUMBER_OF_GRIDS*MAX_NUMBER_OF_CELLS) diff --git a/src/game/Object.cpp b/src/game/Object.cpp index 41709664b..d9c3677cf 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -1027,14 +1027,18 @@ float WorldObject::GetDistanceZ(const WorldObject* obj) const return ( dist > 0 ? dist : 0); } -bool WorldObject::IsWithinDistInMap(const WorldObject* obj, const float dist2compare) const +bool WorldObject::IsWithinDistInMap(const WorldObject* obj, const float dist2compare, const bool is3D) const { if (!obj || !IsInMap(obj)) return false; float dx = GetPositionX() - obj->GetPositionX(); float dy = GetPositionY() - obj->GetPositionY(); - float dz = GetPositionZ() - obj->GetPositionZ(); - float distsq = dx*dx + dy*dy + dz*dz; + float distsq = dx*dx + dy*dy; + if(is3D) + { + float dz = GetPositionZ() - obj->GetPositionZ(); + distsq += dz*dz; + } float sizefactor = GetObjectSize() + obj->GetObjectSize(); float maxdist = dist2compare + sizefactor; diff --git a/src/game/Object.h b/src/game/Object.h index 1e7c12cd4..ae88004dd 100644 --- a/src/game/Object.h +++ b/src/game/Object.h @@ -399,7 +399,7 @@ class MANGOS_DLL_SPEC WorldObject : public Object float GetDistance2d(const float x, const float y) const; float GetDistanceZ(const WorldObject* obj) const; bool IsInMap(const WorldObject* obj) const { return GetMapId()==obj->GetMapId() && GetInstanceId()==obj->GetInstanceId(); } - bool IsWithinDistInMap(const WorldObject* obj, const float dist2compare) const; + bool IsWithinDistInMap(const WorldObject* obj, const float dist2compare, const bool is3D = true) const; bool IsWithinLOS(const float x, const float y, const float z ) const; bool IsWithinLOSInMap(const WorldObject* obj) const; diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index d1259d089..82e55049b 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -8500,7 +8500,7 @@ int32 Unit::ModifyPower(Powers power, int32 dVal) return gain; } -bool Unit::isVisibleForOrDetect(Unit const* u, bool detect, bool inVisibleList) const +bool Unit::isVisibleForOrDetect(Unit const* u, bool detect, bool inVisibleList, bool is3dDistance) const { if(!u) return false; @@ -8551,12 +8551,12 @@ bool Unit::isVisibleForOrDetect(Unit const* u, bool detect, bool inVisibleList) if(u->isInFlight()) // what see player in flight { // use object grey distance for all (only see objects any way) - if (!IsWithinDistInMap(u,World::GetMaxVisibleDistanceInFlight()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f))) + if (!IsWithinDistInMap(u,World::GetMaxVisibleDistanceInFlight()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f), is3dDistance)) return false; } else if(!isAlive()) // distance for show body { - if (!IsWithinDistInMap(u,World::GetMaxVisibleDistanceForObject()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f))) + if (!IsWithinDistInMap(u,World::GetMaxVisibleDistanceForObject()+(inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f), is3dDistance)) return false; } else if(GetTypeId()==TYPEID_PLAYER) // distance for show player @@ -8564,26 +8564,26 @@ bool Unit::isVisibleForOrDetect(Unit const* u, bool detect, bool inVisibleList) if(u->GetTypeId()==TYPEID_PLAYER) { // Players far than max visible distance for player or not in our map are not visible too - if (!at_same_transport && !IsWithinDistInMap(u,World::GetMaxVisibleDistanceForPlayer()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f))) + if (!at_same_transport && !IsWithinDistInMap(u,World::GetMaxVisibleDistanceForPlayer()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f), is3dDistance)) return false; } else { // Units far than max visible distance for creature or not in our map are not visible too - if (!IsWithinDistInMap(u,World::GetMaxVisibleDistanceForCreature()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f))) + if (!IsWithinDistInMap(u,World::GetMaxVisibleDistanceForCreature()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f), is3dDistance)) return false; } } else if(GetCharmerOrOwnerGUID()) // distance for show pet/charmed { // Pet/charmed far than max visible distance for player or not in our map are not visible too - if (!IsWithinDistInMap(u,World::GetMaxVisibleDistanceForPlayer()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f))) + if (!IsWithinDistInMap(u,World::GetMaxVisibleDistanceForPlayer()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f), is3dDistance)) return false; } else // distance for show creature { // Units far than max visible distance for creature or not in our map are not visible too - if (!IsWithinDistInMap(u,World::GetMaxVisibleDistanceForCreature()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f))) + if (!IsWithinDistInMap(u,World::GetMaxVisibleDistanceForCreature()+(inVisibleList ? World::GetVisibleUnitGreyDistance() : 0.0f), is3dDistance)) return false; } @@ -9391,7 +9391,7 @@ Unit* Unit::GetUnit(WorldObject& object, uint64 guid) bool Unit::isVisibleForInState( Player const* u, bool inVisibleList ) const { - return isVisibleForOrDetect(u,false,inVisibleList); + return isVisibleForOrDetect(u, false, inVisibleList, false); } uint32 Unit::GetCreatureType() const diff --git a/src/game/Unit.h b/src/game/Unit.h index a81308c51..298023665 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -1102,7 +1102,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject void SetVisibility(UnitVisibility x); // common function for visibility checks for player/creatures with detection code - bool isVisibleForOrDetect(Unit const* u, bool detect, bool inVisibleList = false) const; + bool isVisibleForOrDetect(Unit const* u, bool detect, bool inVisibleList = false, bool is3dDistance = true) const; bool canDetectInvisibilityOf(Unit const* u) const; // virtual functions for all world objects types diff --git a/src/mangosd/mangosd.conf.dist.in b/src/mangosd/mangosd.conf.dist.in index f57e25d5a..a7c0be700 100644 --- a/src/mangosd/mangosd.conf.dist.in +++ b/src/mangosd/mangosd.conf.dist.in @@ -863,9 +863,9 @@ GM.StartLevel = 1 # Visibility.Distance.Creature # Visibility.Distance.Player # Visibility distance for different in game object -# Max limited by active player zone: ~ 166 +# Max limited by active player zone: ~ 333 # Min limit dependent from objects -# Default: 66 (cell size) +# Default: 132 (cell size) # Min limit is max aggro radius (45) * Rate.Creature.Aggro # # Visibility.Distance.Object @@ -891,10 +891,10 @@ GM.StartLevel = 1 ################################################################################################################### Visibility.GroupMode = 0 -Visibility.Distance.Creature = 66 -Visibility.Distance.Player = 66 -Visibility.Distance.Object = 66 -Visibility.Distance.InFlight = 66 +Visibility.Distance.Creature = 132 +Visibility.Distance.Player = 132 +Visibility.Distance.Object = 132 +Visibility.Distance.InFlight = 132 Visibility.Distance.Grey.Unit = 1 Visibility.Distance.Grey.Object = 10 From d3b4b341a0f0b257ef33184ddc45426752f08d69 Mon Sep 17 00:00:00 2001 From: DiSlord Date: Sat, 6 Dec 2008 01:24:55 +0300 Subject: [PATCH 31/56] [6874] * Not remove spell mods for not finished spells * Ignore self miss in drop combopoints (problems vs 5171 and ranks still exist) * Allow cast spell on immune if spell can removeit by dispell --- src/game/Spell.cpp | 13 +++++++------ src/game/Unit.cpp | 3 ++- src/shared/revision_nr.h | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 900e7ed55..2a0ac63c9 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -2483,14 +2483,14 @@ void Spell::finish(bool ok) m_spellState = SPELL_STATE_FINISHED; - //remove spell mods - if (m_caster->GetTypeId() == TYPEID_PLAYER) - ((Player*)m_caster)->RemoveSpellMods(this); - // other code related only to successfully finished spells if(!ok) return; + //remove spell mods + if (m_caster->GetTypeId() == TYPEID_PLAYER) + ((Player*)m_caster)->RemoveSpellMods(this); + //handle SPELL_AURA_ADD_TARGET_TRIGGER auras Unit::AuraList const& targetTriggers = m_caster->GetAurasByType(SPELL_AURA_ADD_TARGET_TRIGGER); for(Unit::AuraList::const_iterator i = targetTriggers.begin(); i != targetTriggers.end(); ++i) @@ -2529,10 +2529,11 @@ void Spell::finish(bool ok) // Clear combo at finish state if(m_caster->GetTypeId() == TYPEID_PLAYER && NeedsComboPoints(m_spellInfo)) { - // Not drop combopoints if any miss exist + // Not drop combopoints if negative spell and if any miss on enemy exist bool needDrop = true; + if (!IsPositiveSpell(m_spellInfo->Id)) for(std::list::iterator ihit= m_UniqueTargetInfo.begin();ihit != m_UniqueTargetInfo.end();++ihit) - if (ihit->missCondition != SPELL_MISS_NONE) + if (ihit->missCondition != SPELL_MISS_NONE && ihit->targetGUID!=m_caster->GetGUID()) { needDrop = false; break; diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 82e55049b..671634b9b 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -8017,7 +8017,8 @@ bool Unit::IsImmunedToSpell(SpellEntry const* spellInfo, bool useCharges) if(itr->type == spellInfo->Dispel) return true; - if( !(spellInfo->AttributesEx & SPELL_ATTR_EX_UNAFFECTED_BY_SCHOOL_IMMUNE)) // unaffected by school immunity + if( !(spellInfo->AttributesEx & SPELL_ATTR_EX_UNAFFECTED_BY_SCHOOL_IMMUNE) && // unaffected by school immunity + !(spellInfo->AttributesEx & SPELL_ATTR_EX_DISPEL_AURAS_ON_IMMUNITY)) // can remove immune (by dispell or immune it) { // not have spells with charges currently SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL]; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 169735a48..1b521491b 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 "6873" + #define REVISION_NR "6874" #endif // __REVISION_NR_H__ From 2907868b80a2114ecaaf72352f404d726c2b273d Mon Sep 17 00:00:00 2001 From: DiSlord Date: Sat, 6 Dec 2008 02:44:39 +0300 Subject: [PATCH 32/56] [6875] Skip utf8 header (if exist) for mangosd.conf file --- src/shared/Config/dotconfpp/dotconfpp.cpp | 5 +++++ src/shared/revision_nr.h | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/shared/Config/dotconfpp/dotconfpp.cpp b/src/shared/Config/dotconfpp/dotconfpp.cpp index 60008747a..1c5e667b1 100644 --- a/src/shared/Config/dotconfpp/dotconfpp.cpp +++ b/src/shared/Config/dotconfpp/dotconfpp.cpp @@ -340,6 +340,11 @@ int DOTCONFDocument::setContent(const char * _fileName) error(0, NULL, "failed to open file '%s': %s", fileName, strerror(errno)); return -1; } + // Try read utf8 header and skip it if exist + uint32 utf8header = 0; + fgets((char*)&utf8header, 4, file); // Try read header + if (utf8header!=0x00BFBBEF) // If not exist + fseek(file, 0, SEEK_SET); // Reset read position ret = parseFile(); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 1b521491b..2c90a0670 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 "6874" + #define REVISION_NR "6875" #endif // __REVISION_NR_H__ From 223fe7321f8ac21d183adfe5bcf796968157dd53 Mon Sep 17 00:00:00 2001 From: DiSlord Date: Sat, 6 Dec 2008 04:38:31 +0300 Subject: [PATCH 33/56] [6876] * Not drop charge for 1120 and ranks (fix SPELL_AURA_CHANNEL_DEATH_ITEM aura work) --- src/game/Unit.cpp | 11 ++++------- src/shared/revision_nr.h | 2 +- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 671634b9b..21d6aa831 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -5974,17 +5974,14 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggeredB { int32 value2 = CalculateSpellDamage((*i)->GetSpellProto(),2,(*i)->GetSpellProto()->EffectBasePoints[2],this); basepoints0 = value2 * GetMaxPower(POWER_MANA) / 100; - // Drain Soul - triggered_spell_id = 18371; - target = this; - found = true; + CastCustomSpell(this, 18371, &basepoints0, NULL, NULL, true, castItem, triggeredByAura); break; } } - if(!found) - return false; - break; // fall through to normal cast + // Not remove charge (aura removed on death in any cases) + // Need for correct work Drain Soul SPELL_AURA_CHANNEL_DEATH_ITEM aura + return false; } break; } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 2c90a0670..a20708ae8 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 "6875" + #define REVISION_NR "6876" #endif // __REVISION_NR_H__ From 3c67ea6f67240314e4ea669060bef126b8035ebb Mon Sep 17 00:00:00 2001 From: megamage Date: Sat, 6 Dec 2008 04:48:39 +0300 Subject: [PATCH 34/56] [6877] Fix Prayer of Mending. Use original caster's healing bonus. --- src/game/SpellEffects.cpp | 2 +- src/shared/revision_nr.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index 0090fc4b7..bec0756b8 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -2195,7 +2195,7 @@ void Spell::EffectApplyAura(uint32 i) // Prayer of Mending (jump animation), we need formal caster instead original for correct animation if( m_spellInfo->SpellFamilyName == SPELLFAMILY_PRIEST && (m_spellInfo->SpellFamilyFlags & 0x00002000000000LL)) - m_caster->CastSpell(unitTarget,41637,true,NULL,Aur); + m_caster->CastSpell(unitTarget, 41637, true, NULL, Aur, m_originalCasterGUID); } void Spell::EffectUnlearnSpecialization( uint32 i ) diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index a20708ae8..c2c949764 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 "6876" + #define REVISION_NR "6877" #endif // __REVISION_NR_H__ From 31a052d468fea84c34759def016680dea45e9aef Mon Sep 17 00:00:00 2001 From: Neo2003 Date: Sat, 6 Dec 2008 00:28:09 +0100 Subject: [PATCH 35/56] [6878] Fixed a typo in VC for ACE_Wrappers Signed-off-by: freghar (cherry picked from commit d94f03b0aeec431ec6cee4f469d45d3209434fe7) Signed-off-by: VladimirMangos --- src/shared/revision_nr.h | 2 +- win/mangosdVC71.sln | 2 +- win/mangosdVC80.sln | 2 +- win/mangosdVC90.sln | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index c2c949764..53d0f4b8d 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 "6877" + #define REVISION_NR "6878" #endif // __REVISION_NR_H__ diff --git a/win/mangosdVC71.sln b/win/mangosdVC71.sln index 9b71ab7df..3d5ba3ccb 100644 --- a/win/mangosdVC71.sln +++ b/win/mangosdVC71.sln @@ -61,7 +61,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "genrevision", "VC71\genrevi ProjectSection(ProjectDependencies) = postProject EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ACE_Wraper", "VC71\ACE_vc71.vcproj", "{7C74F49E-FECA-1BAD-6757-8A6348EA12C8}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ACE_Wrappers", "VC71\ACE_vc71.vcproj", "{7C74F49E-FECA-1BAD-6757-8A6348EA12C8}" ProjectSection(ProjectDependencies) = postProject EndProjectSection EndProject diff --git a/win/mangosdVC80.sln b/win/mangosdVC80.sln index 664fe3f6b..4440cd0b8 100644 --- a/win/mangosdVC80.sln +++ b/win/mangosdVC80.sln @@ -46,7 +46,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sockets", "VC80\sockets.vcp EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "genrevision", "VC80\genrevision.vcproj", "{803F488E-4C5A-4866-8D5C-1E6C03C007C2}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ACEWraper", "VC80\ACE_vc8.vcproj", "{AD537C9A-FECA-1BAD-6757-8A6348EA12C8}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ACE_Wrappers", "VC80\ACE_vc8.vcproj", "{AD537C9A-FECA-1BAD-6757-8A6348EA12C8}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/win/mangosdVC90.sln b/win/mangosdVC90.sln index 5c3ba4c1d..02a13a939 100644 --- a/win/mangosdVC90.sln +++ b/win/mangosdVC90.sln @@ -46,7 +46,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sockets", "VC90\sockets.vcp EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "genrevision", "VC90\genrevision.vcproj", "{803F488E-4C5A-4866-8D5C-1E6C03C007C2}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ACEWraper", "VC90\ACE_vc9.vcproj", "{BD537C9A-FECA-1BAD-6757-8A6348EA12C8}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ACE_Wrappers", "VC90\ACE_vc9.vcproj", "{BD537C9A-FECA-1BAD-6757-8A6348EA12C8}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution From aef154279248c1a560c4b0c209c81ddaaa1eba13 Mon Sep 17 00:00:00 2001 From: thenecromancer Date: Sat, 6 Dec 2008 08:03:42 +0300 Subject: [PATCH 36/56] Set correct base damage for spell 37674 Signed-off-by: VladimirMangos --- src/game/SpellEffects.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index bec0756b8..f9c30d791 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -990,9 +990,14 @@ void Spell::EffectDummy(uint32 i) return; } case 37674: // Chaos Blast - if(unitTarget) - m_caster->CastSpell(unitTarget,37675,true); + { + if(!unitTarget) + return; + + int32 basepoints0 = 100; + m_caster->CastCustomSpell(unitTarget,37675,&basepoints0,NULL,NULL,true); return; + } case 40802: // Mingo's Fortune Generator (Mingo's Fortune Giblets) { // selecting one from Bloodstained Fortune item From 43f713f660107bf9c8c17306f555b416c3b9f6ca Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Sat, 6 Dec 2008 08:05:00 +0300 Subject: [PATCH 37/56] [6879] Not apply casting time spell bonuses mods to creature (non-pets) casted spells with 0 cast time. --- src/game/Unit.cpp | 4 ++++ src/shared/revision_nr.h | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 21d6aa831..f58e54e7d 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -10552,6 +10552,10 @@ void Unit::ApplyCastTimePercentMod(float val, bool apply ) uint32 Unit::GetCastingTimeForBonus( SpellEntry const *spellProto, DamageEffectType damagetype, uint32 CastingTime ) { + // Not apply this to creature casted spells with casttime==0 + if(CastingTime==0 && GetTypeId()==TYPEID_UNIT && !((Creature*)this)->isPet()) + return 3500; + if (CastingTime > 7000) CastingTime = 7000; if (CastingTime < 1500) CastingTime = 1500; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 53d0f4b8d..cfb991ff2 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 "6878" + #define REVISION_NR "6879" #endif // __REVISION_NR_H__ From 3f90b661257433913f07a88a02c3cf6d36d2ec5b Mon Sep 17 00:00:00 2001 From: DasBlub Date: Sat, 6 Dec 2008 14:25:00 +0100 Subject: [PATCH 38/56] [6880] fixed spell 26275 for game object 180797 Signed-off-by: arrai --- src/game/SpellEffects.cpp | 32 ++++++++++++++++++++++++++++++++ src/shared/revision_nr.h | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index f9c30d791..767cd8ea7 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -4587,6 +4587,38 @@ void Spell::EffectScriptEffect(uint32 effIndex) // by spell id switch(m_spellInfo->Id) { + // PX-238 Winter Wondervolt TRAP + case 26275: + { + if( unitTarget->HasAura(26272,0) + || unitTarget->HasAura(26157,0) + || unitTarget->HasAura(26273,0) + || unitTarget->HasAura(26274,0)) + return; + + uint32 iTmpSpellId; + + switch(urand(0,3)) + { + case 0: + iTmpSpellId = 26272; + break; + case 1: + iTmpSpellId = 26157; + break; + case 2: + iTmpSpellId = 26273; + break; + case 3: + iTmpSpellId = 26274; + break; + } + + unitTarget->CastSpell(unitTarget, iTmpSpellId, true); + + return; + } + // Bending Shinbone case 8856: { diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index cfb991ff2..c726f0830 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 "6879" + #define REVISION_NR "6880" #endif // __REVISION_NR_H__ From 4df03b85611afe5a395aed0a33bf6e6903f28887 Mon Sep 17 00:00:00 2001 From: GalaxyMan Date: Sat, 6 Dec 2008 21:40:36 +0300 Subject: [PATCH 39/56] [6881] Fix typo in log string. Signed-off-by: VladimirMangos --- src/game/WorldSocketMgr.cpp | 2 +- src/shared/revision_nr.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/WorldSocketMgr.cpp b/src/game/WorldSocketMgr.cpp index 9bb11f8fe..610d0ac57 100644 --- a/src/game/WorldSocketMgr.cpp +++ b/src/game/WorldSocketMgr.cpp @@ -242,7 +242,7 @@ WorldSocketMgr::StartReactiveIO (ACE_UINT16 port, const char* address) m_NetThreads = new ReactorRunnable[m_NetThreadsCount]; - sLog.outBasic ("Max alowed socket connections %d",ACE::max_handles ()); + sLog.outBasic ("Max allowed socket connections %d",ACE::max_handles ()); // -1 means use default m_SockOutKBuff = sConfig.GetIntDefault ("Network.OutKBuff", -1); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index c726f0830..3cb4a4262 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 "6880" + #define REVISION_NR "6881" #endif // __REVISION_NR_H__ From e81af0b7393821a6a5472c46d314098d9db79b75 Mon Sep 17 00:00:00 2001 From: hunuza Date: Sun, 7 Dec 2008 13:19:16 +0100 Subject: [PATCH 40/56] [6882] Make corpse erase async. --- src/game/GlobalEvents.cpp | 79 ++++++++++++++++++++------------------- src/shared/revision_nr.h | 2 +- 2 files changed, 42 insertions(+), 39 deletions(-) diff --git a/src/game/GlobalEvents.cpp b/src/game/GlobalEvents.cpp index 14ad25607..697c55b1f 100644 --- a/src/game/GlobalEvents.cpp +++ b/src/game/GlobalEvents.cpp @@ -29,49 +29,52 @@ #include "ObjectDefines.h" #include "Corpse.h" +static void CorpsesEraseCallBack(QueryResult *result, bool bones) +{ + if(!result) + return; + + do + { + Field *fields = result->Fetch(); + uint32 guidlow = fields[0].GetUInt32(); + float positionX = fields[1].GetFloat(); + float positionY = fields[2].GetFloat(); + uint32 mapid = fields[3].GetUInt32(); + uint64 player_guid = MAKE_NEW_GUID(fields[4].GetUInt32(), 0, HIGHGUID_PLAYER); + + uint64 guid = MAKE_NEW_GUID(guidlow, 0, HIGHGUID_CORPSE); + + sLog.outDebug("[Global event] Removing %s %u (X:%f Y:%f Map:%u).",(bones?"bones":"corpse"),guidlow,positionX,positionY,mapid); + + /// Resurrectable - convert corpses to bones + if(!bones) + { + if(!ObjectAccessor::Instance().ConvertCorpseForPlayer(player_guid)) + { + sLog.outDebug("Corpse %u not found in world. Delete from DB.",guidlow); + CharacterDatabase.PExecute("DELETE FROM corpse WHERE guid = '%u'",guidlow); + } + } + else + ///- or delete bones + { + MapManager::Instance().RemoveBonesFromMap(mapid, guid, positionX, positionY); + + ///- remove bones from the database + CharacterDatabase.PExecute("DELETE FROM corpse WHERE guid = '%u'",guidlow); + } + } while (result->NextRow()); + + delete result; +} + /// Handle periodic erase of corpses and bones static void CorpsesErase(bool bones,uint32 delay) { ///- Get the list of eligible corpses/bones to be removed //No SQL injection (uint32 and enum) - QueryResult *result = CharacterDatabase.PQuery("SELECT guid,position_x,position_y,map,player FROM corpse WHERE UNIX_TIMESTAMP()-time > '%u' AND corpse_type %s '0'", delay, (bones ? "=" : "<>") ); - - if(result) - { - do - { - Field *fields = result->Fetch(); - uint32 guidlow = fields[0].GetUInt32(); - float positionX = fields[1].GetFloat(); - float positionY = fields[2].GetFloat(); - uint32 mapid = fields[3].GetUInt32(); - uint64 player_guid = MAKE_NEW_GUID(fields[4].GetUInt32(), 0, HIGHGUID_PLAYER); - - uint64 guid = MAKE_NEW_GUID(guidlow, 0, HIGHGUID_CORPSE); - - sLog.outDebug("[Global event] Removing %s %u (X:%f Y:%f Map:%u).",(bones?"bones":"corpse"),guidlow,positionX,positionY,mapid); - - /// Resurrectable - convert corpses to bones - if(!bones) - { - if(!ObjectAccessor::Instance().ConvertCorpseForPlayer(player_guid)) - { - sLog.outDebug("Corpse %u not found in world. Delete from DB.",guidlow); - CharacterDatabase.PExecute("DELETE FROM corpse WHERE guid = '%u'",guidlow); - } - } - else - ///- or delete bones - { - MapManager::Instance().RemoveBonesFromMap(mapid, guid, positionX, positionY); - - ///- remove bones from the database - CharacterDatabase.PExecute("DELETE FROM corpse WHERE guid = '%u'",guidlow); - } - } while (result->NextRow()); - - delete result; - } + CharacterDatabase.AsyncPQuery(&CorpsesEraseCallBack, bones, "SELECT guid,position_x,position_y,map,player FROM corpse WHERE UNIX_TIMESTAMP()-time > '%u' AND corpse_type %s '0'", delay, (bones ? "=" : "<>")); } /// not thread guarded variant for call from other thread diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 3cb4a4262..1311b2733 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 "6881" + #define REVISION_NR "6882" #endif // __REVISION_NR_H__ From 66c98859cf2a6abe5b82e58d55219a19827ae1b1 Mon Sep 17 00:00:00 2001 From: hunuza Date: Sun, 7 Dec 2008 15:41:05 +0100 Subject: [PATCH 41/56] [6883] Avoid DB access on deleting guild member. --- src/game/GlobalEvents.cpp | 1 + src/game/Guild.cpp | 76 +++++++++++++++++++-------------------- src/shared/revision_nr.h | 2 +- 3 files changed, 40 insertions(+), 39 deletions(-) diff --git a/src/game/GlobalEvents.cpp b/src/game/GlobalEvents.cpp index 697c55b1f..219086c61 100644 --- a/src/game/GlobalEvents.cpp +++ b/src/game/GlobalEvents.cpp @@ -22,6 +22,7 @@ #include "Log.h" #include "Database/DatabaseEnv.h" +#include "Database/DatabaseImpl.h" #include "Platform/Define.h" #include "MapManager.h" #include "ObjectAccessor.h" diff --git a/src/game/Guild.cpp b/src/game/Guild.cpp index 84b6c6965..19f6214b8 100644 --- a/src/game/Guild.cpp +++ b/src/game/Guild.cpp @@ -417,53 +417,53 @@ void Guild::DelMember(uint64 guid, bool isDisbanding) { if(leaderGuid == guid && !isDisbanding) { - QueryResult *result = CharacterDatabase.PQuery("SELECT guid FROM guild_member WHERE guildid='%u' AND guid != '%u' ORDER BY rank ASC LIMIT 1", Id, GUID_LOPART(leaderGuid)); - if( result ) + MemberSlot* oldLeader = NULL; + MemberSlot* best = NULL; + uint64 newLeaderGUID = 0; + for(Guild::MemberList::iterator i = members.begin(); i != members.end(); ++i) { - uint64 newLeaderGUID; - Player *newLeader; - std::string newLeaderName, oldLeaderName; - - newLeaderGUID = (*result)[0].GetUInt64(); - delete result; - - SetLeader(newLeaderGUID); - - newLeader = objmgr.GetPlayer(newLeaderGUID); - - // If player not online data in data field will be loaded from guild tabs no need to update it !! - if(newLeader) + if(i->first == GUID_LOPART(guid)) { - newLeader->SetRank(GR_GUILDMASTER); - newLeaderName = newLeader->GetName(); - } - else - objmgr.GetPlayerNameByGUID(newLeaderGUID, newLeaderName); - - // when leader non-exist (at guild load with deleted leader only) not send broadcasts - if(objmgr.GetPlayerNameByGUID(guid, oldLeaderName)) - { - WorldPacket data(SMSG_GUILD_EVENT, (1+1+oldLeaderName.size()+1+newLeaderName.size()+1)); - data << (uint8)GE_LEADER_CHANGED; - data << (uint8)2; - data << oldLeaderName; - data << newLeaderName; - BroadcastPacket(&data); - - data.Initialize(SMSG_GUILD_EVENT, (1+1+oldLeaderName.size()+1)); - data << (uint8)GE_LEFT; - data << (uint8)1; - data << oldLeaderName; - BroadcastPacket(&data); + oldLeader = &(i->second); + continue; } - sLog.outDebug( "WORLD: Sent (SMSG_GUILD_EVENT)" ); + if(!best || best->RankId > i->second.RankId) + { + best = &(i->second); + newLeaderGUID = i->first; + } } - else + if(!best) { Disband(); return; } + + SetLeader(newLeaderGUID); + + // If player not online data in data field will be loaded from guild tabs no need to update it !! + if(Player *newLeader = objmgr.GetPlayer(newLeaderGUID)) + newLeader->SetRank(GR_GUILDMASTER); + + // when leader non-exist (at guild load with deleted leader only) not send broadcasts + if(oldLeader) + { + WorldPacket data(SMSG_GUILD_EVENT, (1+1+(oldLeader->name).size()+1+(best->name).size()+1)); + data << (uint8)GE_LEADER_CHANGED; + data << (uint8)2; + data << oldLeader->name; + data << best->name; + BroadcastPacket(&data); + + data.Initialize(SMSG_GUILD_EVENT, (1+1+(oldLeader->name).size()+1)); + data << (uint8)GE_LEFT; + data << (uint8)1; + data << oldLeader->name; + BroadcastPacket(&data); + } + + sLog.outDebug( "WORLD: Sent (SMSG_GUILD_EVENT)" ); } members.erase(GUID_LOPART(guid)); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 1311b2733..c66531390 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 "6882" + #define REVISION_NR "6883" #endif // __REVISION_NR_H__ From 2e08a63da71703107ffb99262b84e88f8fe70b1d Mon Sep 17 00:00:00 2001 From: balrok Date: Sun, 7 Dec 2008 00:39:22 +0100 Subject: [PATCH 42/56] [6884] Replaced iterator++ with ++iterator in for-loop-headers i used this script for i in ls *.[ch]*; do cat $i | sed -r 's/(.*for.*iterator.*;\ *)([a-z0-9\_\*]+)\ *\+\+(.*)/\1++\2\3/' > /tmp/mangos/$i; done for i in ls *.[ch]*; do cp /tmp/mangos/$i $i; done and rechecked it with my eyes, if everything is right i took only for-loops cause they can be gathered easier with a script Signed-off-by: hunuza --- src/game/ArenaTeam.cpp | 2 +- src/game/Creature.cpp | 4 ++-- src/game/GossipDef.cpp | 2 +- src/game/Group.cpp | 2 +- src/game/InstanceSaveMgr.cpp | 2 +- src/game/LootMgr.cpp | 8 ++++---- src/game/MapInstanced.cpp | 10 +++++----- src/game/ObjectMgr.cpp | 18 +++++++++--------- src/game/Pet.cpp | 2 +- src/game/Player.cpp | 18 +++++++++--------- src/game/Spell.cpp | 4 ++-- src/game/SpellAuras.cpp | 2 +- src/game/ThreatManager.cpp | 4 ++-- src/shared/revision_nr.h | 2 +- 14 files changed, 40 insertions(+), 40 deletions(-) diff --git a/src/game/ArenaTeam.cpp b/src/game/ArenaTeam.cpp index b35ce1e36..72ed8d679 100644 --- a/src/game/ArenaTeam.cpp +++ b/src/game/ArenaTeam.cpp @@ -472,7 +472,7 @@ uint8 ArenaTeam::GetSlot() const void ArenaTeam::BroadcastPacket(WorldPacket *packet) { - for (MemberList::iterator itr = members.begin(); itr != members.end(); itr++) + for (MemberList::iterator itr = members.begin(); itr != members.end(); ++itr) { Player *player = objmgr.GetPlayer(itr->guid); if(player) diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index c832804f5..00aed3c0e 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -689,7 +689,7 @@ void Creature::prepareGossipMenu( Player *pPlayer,uint32 gossipid ) // lazy loading single time at use LoadGossipOptions(); - for( GossipOptionList::iterator i = m_goptions.begin( ); i != m_goptions.end( ); i++ ) + for( GossipOptionList::iterator i = m_goptions.begin( ); i != m_goptions.end( ); ++i ) { GossipOption* gso=&*i; if(gso->GossipId == gossipid) @@ -1009,7 +1009,7 @@ uint32 Creature::GetNpcTextId() GossipOption const* Creature::GetGossipOption( uint32 id ) const { - for( GossipOptionList::const_iterator i = m_goptions.begin( ); i != m_goptions.end( ); i++ ) + for( GossipOptionList::const_iterator i = m_goptions.begin( ); i != m_goptions.end( ); ++i ) { if(i->Action==id ) return &*i; diff --git a/src/game/GossipDef.cpp b/src/game/GossipDef.cpp index 173e69f66..fc0671b55 100644 --- a/src/game/GossipDef.cpp +++ b/src/game/GossipDef.cpp @@ -332,7 +332,7 @@ void QuestMenu::AddMenuItem( uint32 QuestId, uint8 Icon) bool QuestMenu::HasItem( uint32 questid ) { - for (QuestMenuItemList::iterator i = m_qItems.begin(); i != m_qItems.end(); i++) + for (QuestMenuItemList::iterator i = m_qItems.begin(); i != m_qItems.end(); ++i) { if(i->m_qId==questid) { diff --git a/src/game/Group.cpp b/src/game/Group.cpp index cb03edabd..9cf107f06 100644 --- a/src/game/Group.cpp +++ b/src/game/Group.cpp @@ -1109,7 +1109,7 @@ void Group::_setLeader(const uint64 &guid) void Group::_removeRolls(const uint64 &guid) { - for (Rolls::iterator it = RollId.begin(); it < RollId.end(); it++) + for (Rolls::iterator it = RollId.begin(); it < RollId.end(); ++it) { Roll* roll = *it; Roll::PlayerVote::iterator itr2 = roll->playerVote.find(guid); diff --git a/src/game/InstanceSaveMgr.cpp b/src/game/InstanceSaveMgr.cpp index 2f1833480..8fa06c3cb 100644 --- a/src/game/InstanceSaveMgr.cpp +++ b/src/game/InstanceSaveMgr.cpp @@ -339,7 +339,7 @@ void InstanceSaveManager::PackInstances() uint32 InstanceNumber = 1; // we do assume std::set is sorted properly on integer value - for (std::set< uint32 >::iterator i = InstanceSet.begin(); i != InstanceSet.end(); i++) + for (std::set< uint32 >::iterator i = InstanceSet.begin(); i != InstanceSet.end(); ++i) { if (*i != InstanceNumber) { diff --git a/src/game/LootMgr.cpp b/src/game/LootMgr.cpp index c61e22b7e..44e9d5982 100644 --- a/src/game/LootMgr.cpp +++ b/src/game/LootMgr.cpp @@ -910,7 +910,7 @@ void LootTemplate::Process(Loot& loot, LootStore const& store, uint8 groupId) co } // Rolling non-grouped items - for (LootStoreItemList::const_iterator i = Entries.begin() ; i != Entries.end() ; i++ ) + for (LootStoreItemList::const_iterator i = Entries.begin() ; i != Entries.end() ; ++i ) { if ( !i->Roll() ) continue; // Bad luck for the entry @@ -930,7 +930,7 @@ void LootTemplate::Process(Loot& loot, LootStore const& store, uint8 groupId) co } // Now processing groups - for (LootGroups::const_iterator i = Groups.begin( ) ; i != Groups.end( ) ; i++ ) + for (LootGroups::const_iterator i = Groups.begin( ) ; i != Groups.end( ) ; ++i ) i->Process(loot); } @@ -959,7 +959,7 @@ bool LootTemplate::HasQuestDrop(LootTemplateMap const& store, uint8 groupId) con } // Now processing groups - for (LootGroups::const_iterator i = Groups.begin() ; i != Groups.end() ; i++ ) + for (LootGroups::const_iterator i = Groups.begin() ; i != Groups.end() ; ++i ) if (i->HasQuestDrop()) return true; @@ -977,7 +977,7 @@ bool LootTemplate::HasQuestDropForPlayer(LootTemplateMap const& store, Player co } // Checking non-grouped entries - for (LootStoreItemList::const_iterator i = Entries.begin() ; i != Entries.end() ; i++ ) + for (LootStoreItemList::const_iterator i = Entries.begin() ; i != Entries.end() ; ++i ) { if (i->mincountOrRef < 0) // References processing { diff --git a/src/game/MapInstanced.cpp b/src/game/MapInstanced.cpp index 79a8b88d4..8037e907d 100644 --- a/src/game/MapInstanced.cpp +++ b/src/game/MapInstanced.cpp @@ -57,7 +57,7 @@ void MapInstanced::Update(const uint32& t) void MapInstanced::MoveAllCreaturesInMoveList() { - for (InstancedMaps::iterator i = m_InstancedMaps.begin(); i != m_InstancedMaps.end(); i++) + for (InstancedMaps::iterator i = m_InstancedMaps.begin(); i != m_InstancedMaps.end(); ++i) { i->second->MoveAllCreaturesInMoveList(); } @@ -67,7 +67,7 @@ void MapInstanced::MoveAllCreaturesInMoveList() void MapInstanced::RemoveAllObjectsInRemoveList() { - for (InstancedMaps::iterator i = m_InstancedMaps.begin(); i != m_InstancedMaps.end(); i++) + for (InstancedMaps::iterator i = m_InstancedMaps.begin(); i != m_InstancedMaps.end(); ++i) { i->second->RemoveAllObjectsInRemoveList(); } @@ -79,7 +79,7 @@ bool MapInstanced::RemoveBones(uint64 guid, float x, float y) { bool remove_result = false; - for (InstancedMaps::iterator i = m_InstancedMaps.begin(); i != m_InstancedMaps.end(); i++) + for (InstancedMaps::iterator i = m_InstancedMaps.begin(); i != m_InstancedMaps.end(); ++i) { remove_result = remove_result || i->second->RemoveBones(guid, x, y); } @@ -90,11 +90,11 @@ bool MapInstanced::RemoveBones(uint64 guid, float x, float y) void MapInstanced::UnloadAll(bool pForce) { // Unload instanced maps - for (InstancedMaps::iterator i = m_InstancedMaps.begin(); i != m_InstancedMaps.end(); i++) + for (InstancedMaps::iterator i = m_InstancedMaps.begin(); i != m_InstancedMaps.end(); ++i) i->second->UnloadAll(pForce); // Delete the maps only after everything is unloaded to prevent crashes - for (InstancedMaps::iterator i = m_InstancedMaps.begin(); i != m_InstancedMaps.end(); i++) + for (InstancedMaps::iterator i = m_InstancedMaps.begin(); i != m_InstancedMaps.end(); ++i) delete i->second; m_InstancedMaps.clear(); diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index e1ab90d18..a936c0cc2 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -192,7 +192,7 @@ Group * ObjectMgr::GetGroupByLeader(const uint64 &guid) const Guild * ObjectMgr::GetGuildById(const uint32 GuildId) const { - for(GuildSet::const_iterator itr = mGuildSet.begin(); itr != mGuildSet.end(); itr++) + for(GuildSet::const_iterator itr = mGuildSet.begin(); itr != mGuildSet.end(); ++itr) if ((*itr)->GetId() == GuildId) return *itr; @@ -201,7 +201,7 @@ Guild * ObjectMgr::GetGuildById(const uint32 GuildId) const Guild * ObjectMgr::GetGuildByName(std::string guildname) const { - for(GuildSet::const_iterator itr = mGuildSet.begin(); itr != mGuildSet.end(); itr++) + for(GuildSet::const_iterator itr = mGuildSet.begin(); itr != mGuildSet.end(); ++itr) if ((*itr)->GetName() == guildname) return *itr; @@ -210,7 +210,7 @@ Guild * ObjectMgr::GetGuildByName(std::string guildname) const std::string ObjectMgr::GetGuildNameById(const uint32 GuildId) const { - for(GuildSet::const_iterator itr = mGuildSet.begin(); itr != mGuildSet.end(); itr++) + for(GuildSet::const_iterator itr = mGuildSet.begin(); itr != mGuildSet.end(); ++itr) if ((*itr)->GetId() == GuildId) return (*itr)->GetName(); @@ -228,7 +228,7 @@ Guild* ObjectMgr::GetGuildByLeader(const uint64 &guid) const ArenaTeam* ObjectMgr::GetArenaTeamById(const uint32 ArenaTeamId) const { - for(ArenaTeamSet::const_iterator itr = mArenaTeamSet.begin(); itr != mArenaTeamSet.end(); itr++) + for(ArenaTeamSet::const_iterator itr = mArenaTeamSet.begin(); itr != mArenaTeamSet.end(); ++itr) if ((*itr)->GetId() == ArenaTeamId) return *itr; @@ -237,7 +237,7 @@ ArenaTeam* ObjectMgr::GetArenaTeamById(const uint32 ArenaTeamId) const ArenaTeam* ObjectMgr::GetArenaTeamByName(std::string arenateamname) const { - for(ArenaTeamSet::const_iterator itr = mArenaTeamSet.begin(); itr != mArenaTeamSet.end(); itr++) + for(ArenaTeamSet::const_iterator itr = mArenaTeamSet.begin(); itr != mArenaTeamSet.end(); ++itr) if ((*itr)->GetName() == arenateamname) return *itr; @@ -246,7 +246,7 @@ ArenaTeam* ObjectMgr::GetArenaTeamByName(std::string arenateamname) const ArenaTeam* ObjectMgr::GetArenaTeamByCapitan(uint64 const& guid) const { - for(ArenaTeamSet::const_iterator itr = mArenaTeamSet.begin(); itr != mArenaTeamSet.end(); itr++) + for(ArenaTeamSet::const_iterator itr = mArenaTeamSet.begin(); itr != mArenaTeamSet.end(); ++itr) if ((*itr)->GetCaptain() == guid) return *itr; @@ -2862,7 +2862,7 @@ void ObjectMgr::LoadQuests() delete result; // Post processing - for (QuestMap::iterator iter = mQuestTemplates.begin(); iter != mQuestTemplates.end(); iter++) + for (QuestMap::iterator iter = mQuestTemplates.begin(); iter != mQuestTemplates.end(); ++iter) { Quest * qinfo = iter->second; @@ -4081,7 +4081,7 @@ void ObjectMgr::LoadPageTexts() { std::ostringstream ss; ss<< "The text page(s) "; - for (std::set::iterator itr= checkedPages.begin();itr!=checkedPages.end(); itr++) + for (std::set::iterator itr= checkedPages.begin();itr!=checkedPages.end(); ++itr) ss << *itr << " "; ss << "create(s) a circular reference, which can cause the server to freeze. Changing Next_Page of page " << pageItr->Page_ID <<" to 0"; @@ -5065,7 +5065,7 @@ AreaTrigger const* ObjectMgr::GetGoBackTrigger(uint32 Map) const { const MapEntry *mapEntry = sMapStore.LookupEntry(Map); if(!mapEntry) return NULL; - for (AreaTriggerMap::const_iterator itr = mAreaTriggers.begin(); itr != mAreaTriggers.end(); itr++) + for (AreaTriggerMap::const_iterator itr = mAreaTriggers.begin(); itr != mAreaTriggers.end(); ++itr) { if(itr->second.target_mapId == mapEntry->entrance_map) { diff --git a/src/game/Pet.cpp b/src/game/Pet.cpp index 40cdd9f75..4bd8a1934 100644 --- a/src/game/Pet.cpp +++ b/src/game/Pet.cpp @@ -1493,7 +1493,7 @@ bool Pet::addSpell(uint16 spell_id, uint16 active, PetSpellState state, uint16 s uint32 chainstart = spellmgr.GetFirstSpellInChain(spell_id); - for (PetSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end(); itr++) + for (PetSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr) { if(itr->second->state == PETSPELL_REMOVED) continue; diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 2c02327c6..a6989dd82 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -2390,7 +2390,7 @@ void Player::SendInitialSpells() uint16 spellCooldowns = m_spellCooldowns.size(); data << uint16(spellCooldowns); - for(SpellCooldowns::const_iterator itr=m_spellCooldowns.begin(); itr!=m_spellCooldowns.end(); itr++) + for(SpellCooldowns::const_iterator itr=m_spellCooldowns.begin(); itr!=m_spellCooldowns.end(); ++itr) { SpellEntry const *sEntry = sSpellStore.LookupEntry(itr->first); if(!sEntry) @@ -3212,7 +3212,7 @@ bool Player::_removeSpell(uint16 spell_id) Mail* Player::GetMail(uint32 id) { - for(PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); itr++) + for(PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr) { if ((*itr)->messageID == id) { @@ -5400,7 +5400,7 @@ void Player::SendInitialReputations() RepListID a = 0; - for (FactionStateList::const_iterator itr = m_factions.begin(); itr != m_factions.end(); itr++) + for (FactionStateList::const_iterator itr = m_factions.begin(); itr != m_factions.end(); ++itr) { // fill in absent fields for (; a != itr->first; a++) @@ -6353,7 +6353,7 @@ void Player::DuelComplete(DuelCompleteType type) /* remove auras */ std::vector auras2remove; AuraMap const& vAuras = duel->opponent->GetAuras(); - for (AuraMap::const_iterator i = vAuras.begin(); i != vAuras.end(); i++) + for (AuraMap::const_iterator i = vAuras.begin(); i != vAuras.end(); ++i) { if (!i->second->IsPositive() && i->second->GetCasterGUID() == GetGUID() && i->second->GetAuraApplyTime() >= duel->startTime) auras2remove.push_back(i->second->GetId()); @@ -6364,7 +6364,7 @@ void Player::DuelComplete(DuelCompleteType type) auras2remove.clear(); AuraMap const& auras = GetAuras(); - for (AuraMap::const_iterator i = auras.begin(); i != auras.end(); i++) + for (AuraMap::const_iterator i = auras.begin(); i != auras.end(); ++i) { if (!i->second->IsPositive() && i->second->GetCasterGUID() == duel->opponent->GetGUID() && i->second->GetAuraApplyTime() >= duel->startTime) auras2remove.push_back(i->second->GetId()); @@ -14662,13 +14662,13 @@ void Player::SendRaidInfo() uint32 counter = 0, i; for(i = 0; i < TOTAL_DIFFICULTIES; i++) - for (BoundInstancesMap::iterator itr = m_boundInstances[i].begin(); itr != m_boundInstances[i].end(); itr++) + for (BoundInstancesMap::iterator itr = m_boundInstances[i].begin(); itr != m_boundInstances[i].end(); ++itr) if(itr->second.perm) counter++; data << counter; for(i = 0; i < TOTAL_DIFFICULTIES; i++) { - for (BoundInstancesMap::iterator itr = m_boundInstances[i].begin(); itr != m_boundInstances[i].end(); itr++) + for (BoundInstancesMap::iterator itr = m_boundInstances[i].begin(); itr != m_boundInstances[i].end(); ++itr) { if(itr->second.perm) { @@ -15165,7 +15165,7 @@ void Player::_SaveMail() if (!m_mailsLoaded) return; - for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); itr++) + for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr) { Mail *m = (*itr); if (m->state == MAIL_STATE_CHANGED) @@ -15846,7 +15846,7 @@ void Player::PetSpellInitialize() if(pet->isControlled() && (pet->getPetType() == HUNTER_PET || cinfo && cinfo->type == CREATURE_TYPE_DEMON && getClass() == CLASS_WARLOCK)) { - for(PetSpellMap::iterator itr = pet->m_spells.begin();itr != pet->m_spells.end();itr++) + for(PetSpellMap::iterator itr = pet->m_spells.begin();itr != pet->m_spells.end();++itr) { if(itr->second->state == PETSPELL_REMOVED) continue; diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 2a0ac63c9..f1fa68b8a 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -637,7 +637,7 @@ void Spell::FillTargetMap() if(m_caster->GetTypeId() == TYPEID_PLAYER) { Player *me = (Player*)m_caster; - for (std::list::const_iterator itr = tmpUnitMap.begin(); itr != tmpUnitMap.end(); itr++) + for (std::list::const_iterator itr = tmpUnitMap.begin(); itr != tmpUnitMap.end(); ++itr) { Unit *owner = (*itr)->GetOwner(); Unit *u = owner ? owner : (*itr); @@ -4150,7 +4150,7 @@ uint8 Spell::CheckCasterAuras() const { //Checking auras is needed now, because you are prevented by some state but the spell grants immunity. Unit::AuraMap const& auras = m_caster->GetAuras(); - for(Unit::AuraMap::const_iterator itr = auras.begin(); itr != auras.end(); itr++) + for(Unit::AuraMap::const_iterator itr = auras.begin(); itr != auras.end(); ++itr) { if(itr->second) { diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index b4741b435..8cb0bcb3c 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -2141,7 +2141,7 @@ void Aura::HandleAuraDummy(bool apply, bool Real) // have a look if there is still some other Lifebloom dummy aura Unit::AuraList auras = m_target->GetAurasByType(SPELL_AURA_DUMMY); - for(Unit::AuraList::iterator itr = auras.begin(); itr!=auras.end(); itr++) + for(Unit::AuraList::iterator itr = auras.begin(); itr!=auras.end(); ++itr) if((*itr)->GetSpellProto()->SpellFamilyName == SPELLFAMILY_DRUID && (*itr)->GetSpellProto()->SpellFamilyFlags & 0x1000000000LL) return; diff --git a/src/game/ThreatManager.cpp b/src/game/ThreatManager.cpp index 537e0e4d9..069115493 100644 --- a/src/game/ThreatManager.cpp +++ b/src/game/ThreatManager.cpp @@ -192,7 +192,7 @@ Unit* HostilReference::getSourceUnit() void ThreatContainer::clearReferences() { - for(std::list::iterator i = iThreatList.begin(); i != iThreatList.end(); i++) + for(std::list::iterator i = iThreatList.begin(); i != iThreatList.end(); ++i) { (*i)->unlink(); delete (*i); @@ -206,7 +206,7 @@ HostilReference* ThreatContainer::getReferenceByTarget(Unit* pVictim) { HostilReference* result = NULL; uint64 guid = pVictim->GetGUID(); - for(std::list::iterator i = iThreatList.begin(); i != iThreatList.end(); i++) + for(std::list::iterator i = iThreatList.begin(); i != iThreatList.end(); ++i) { if((*i)->getUnitGuid() == guid) { diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index c66531390..430e9c2b3 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 "6883" + #define REVISION_NR "6884" #endif // __REVISION_NR_H__ From a3a57a539004e5bb9b4f5c12e226c8f24f9c1ef5 Mon Sep 17 00:00:00 2001 From: arrai Date: Sun, 7 Dec 2008 21:26:47 +0100 Subject: [PATCH 43/56] [6885] In dungeons even fighting creatures are supposed to put nearby players in combat. 3rd party scripting libraries might have to be updated --- src/game/AggressorAI.cpp | 14 +++++++++++--- src/game/GridNotifiersImpl.h | 6 +++--- src/shared/revision_nr.h | 2 +- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/game/AggressorAI.cpp b/src/game/AggressorAI.cpp index 637410c1f..25244e7a2 100644 --- a/src/game/AggressorAI.cpp +++ b/src/game/AggressorAI.cpp @@ -47,15 +47,23 @@ AggressorAI::MoveInLineOfSight(Unit *u) if( !i_creature.canFly() && i_creature.GetDistanceZ(u) > CREATURE_Z_ATTACK_RANGE ) return; - if( !i_creature.getVictim() && !i_creature.hasUnitState(UNIT_STAT_STUNNED) && u->isTargetableForAttack() && + if( !i_creature.hasUnitState(UNIT_STAT_STUNNED) && u->isTargetableForAttack() && ( i_creature.IsHostileTo( u ) /*|| u->getVictim() && i_creature.IsFriendlyTo( u->getVictim() )*/ ) && u->isInAccessablePlaceFor(&i_creature) ) { float attackRadius = i_creature.GetAttackDistance(u); if(i_creature.IsWithinDistInMap(u, attackRadius) && i_creature.IsWithinLOSInMap(u) ) { - AttackStart(u); - u->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH); + if(!i_creature.getVictim()) + { + AttackStart(u); + u->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH); + } + else if(sMapStore.LookupEntry(i_creature.GetMapId())->IsDungeon()) + { + u->SetInCombatWith(&i_creature); + i_creature.AddThreat(u, 0.0f); + } } } } diff --git a/src/game/GridNotifiersImpl.h b/src/game/GridNotifiersImpl.h index 05eb46197..602d3d247 100644 --- a/src/game/GridNotifiersImpl.h +++ b/src/game/GridNotifiersImpl.h @@ -70,7 +70,7 @@ inline void PlayerCreatureRelocationWorker(Player* pl, Creature* c) pl->UpdateVisibilityOf(c); // Creature AI reaction - if(!c->hasUnitState(UNIT_STAT_CHASE | UNIT_STAT_SEARCHING | UNIT_STAT_FLEEING)) + if(!c->hasUnitState(UNIT_STAT_SEARCHING | UNIT_STAT_FLEEING)) { if( c->AI() && c->AI()->IsVisible(pl) && !c->IsInEvadeMode() ) c->AI()->MoveInLineOfSight(pl); @@ -79,13 +79,13 @@ inline void PlayerCreatureRelocationWorker(Player* pl, Creature* c) inline void CreatureCreatureRelocationWorker(Creature* c1, Creature* c2) { - if(!c1->hasUnitState(UNIT_STAT_CHASE | UNIT_STAT_SEARCHING | UNIT_STAT_FLEEING)) + if(!c1->hasUnitState(UNIT_STAT_SEARCHING | UNIT_STAT_FLEEING)) { if( c1->AI() && c1->AI()->IsVisible(c2) && !c1->IsInEvadeMode() ) c1->AI()->MoveInLineOfSight(c2); } - if(!c2->hasUnitState(UNIT_STAT_CHASE | UNIT_STAT_SEARCHING | UNIT_STAT_FLEEING)) + if(!c2->hasUnitState(UNIT_STAT_SEARCHING | UNIT_STAT_FLEEING)) { if( c2->AI() && c2->AI()->IsVisible(c1) && !c2->IsInEvadeMode() ) c2->AI()->MoveInLineOfSight(c1); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 430e9c2b3..6a19ed4cf 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 "6884" + #define REVISION_NR "6885" #endif // __REVISION_NR_H__ From 8eccdbc0469c9e6a39743b56fed481f7b6606329 Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Sun, 7 Dec 2008 23:47:28 +0300 Subject: [PATCH 44/56] [6886] Prevent some memory losses at server shutdown. --- src/game/World.cpp | 3 +++ src/shared/revision_nr.h | 2 +- src/shared/vmap/VMapFactory.cpp | 6 ++++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/game/World.cpp b/src/game/World.cpp index 8ee55172b..2c2e87a3d 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -125,6 +125,9 @@ World::~World() m_weathers.clear(); + while (!cliCmdQueue.empty()) + delete cliCmdQueue.next(); + VMAP::VMapFactory::clear(); if(m_resultQueue) delete m_resultQueue; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 6a19ed4cf..936d41044 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 "6885" + #define REVISION_NR "6886" #endif // __REVISION_NR_H__ diff --git a/src/shared/vmap/VMapFactory.cpp b/src/shared/vmap/VMapFactory.cpp index 172aa9b25..5a5af7b45 100644 --- a/src/shared/vmap/VMapFactory.cpp +++ b/src/shared/vmap/VMapFactory.cpp @@ -97,8 +97,14 @@ namespace VMAP void VMapFactory::clear() { if(iIgnoreSpellIds) + { delete iIgnoreSpellIds; + iIgnoreSpellIds = NULL; + } if(gVMapManager) + { delete gVMapManager; + gVMapManager = NULL; + } } } From 211f987aa9d4a13d80da5994e5d42e0297979111 Mon Sep 17 00:00:00 2001 From: Neo2003 Date: Sun, 7 Dec 2008 00:26:07 +0100 Subject: [PATCH 45/56] Make flying creatures fall on ground when killed. Fix also fly speed computation for creatures. Signed-off-by: Neo2003 --- src/game/Creature.cpp | 30 ++++++++++++++++++++++++++++++ src/game/Creature.h | 1 + src/game/Traveller.h | 7 ++++++- src/game/Unit.h | 3 ++- 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index 00aed3c0e..5a1a80f2e 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -446,6 +446,11 @@ void Creature::Update(uint32 diff) m_regenTimer = 2000; break; } + case DEAD_FALLING: + { + if (!FallGround()) + setDeathState(JUST_DIED); + } default: break; } @@ -1487,6 +1492,9 @@ void Creature::setDeathState(DeathState s) if(sWorld.getConfig(CONFIG_SAVE_RESPAWN_TIME_IMMEDIATLY) || isWorldBoss()) SaveRespawnTime(); + if (canFly() && FallGround()) + return; + if(!IsStopped()) StopMoving(); } @@ -1501,6 +1509,9 @@ void Creature::setDeathState(DeathState s) if ( LootTemplates_Skinning.HaveLootFor(GetCreatureInfo()->SkinLootId) ) SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); + if (canFly() && FallGround()) + return; + Unit::setDeathState(CORPSE); } if(s == JUST_ALIVED) @@ -1520,6 +1531,25 @@ void Creature::setDeathState(DeathState s) } } +bool Creature::FallGround() +{ + // Let's abort after we called this function one time + if (getDeathState() == DEAD_FALLING) + return false; + + // Let's do with no vmap because no way to get far distance with vmap high call + float tz = GetMap()->GetHeight(GetPositionX(), GetPositionY(), GetPositionZ(), false); + + // Abort too if the ground is very near + if (fabs(GetPositionZ() - tz) < 0.1f) + return false; + + Unit::setDeathState(DEAD_FALLING); + GetMotionMaster()->MovePoint(0, GetPositionX(), GetPositionY(), tz); + Relocate(GetPositionX(), GetPositionY(), tz); + return true; +} + void Creature::Respawn() { RemoveCorpse(); diff --git a/src/game/Creature.h b/src/game/Creature.h index 98f54017e..3c7825706 100644 --- a/src/game/Creature.h +++ b/src/game/Creature.h @@ -521,6 +521,7 @@ class MANGOS_DLL_SPEC Creature : public Unit const char* GetNameForLocaleIdx(int32 locale_idx) const; void setDeathState(DeathState s); // overwrite virtual Unit::setDeathState + bool FallGround(); bool LoadFromDB(uint32 guid, Map *map); void SaveToDB(); diff --git a/src/game/Traveller.h b/src/game/Traveller.h index 1d50d488a..9256b9162 100644 --- a/src/game/Traveller.h +++ b/src/game/Traveller.h @@ -59,7 +59,12 @@ struct MANGOS_DLL_DECL Traveller template<> inline float Traveller::Speed() { - return i_traveller.GetSpeed( i_traveller.HasUnitMovementFlag(MOVEMENTFLAG_WALK_MODE) ? MOVE_WALK : MOVE_RUN); + if(i_traveller.HasUnitMovementFlag(MOVEMENTFLAG_WALK_MODE)) + return i_traveller.GetSpeed(MOVE_WALK); + else if(i_traveller.HasUnitMovementFlag(MOVEMENTFLAG_FLYING2)) + return i_traveller.GetSpeed(MOVE_FLY); + else + return i_traveller.GetSpeed(MOVE_RUN); } template<> diff --git a/src/game/Unit.h b/src/game/Unit.h index 298023665..e4df75950 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -339,7 +339,8 @@ enum DeathState JUST_DIED = 1, CORPSE = 2, DEAD = 3, - JUST_ALIVED = 4 + JUST_ALIVED = 4, + DEAD_FALLING= 5 }; enum UnitState From 09c27ec667e7d9bf3c9e0213abacb98797ebcaf8 Mon Sep 17 00:00:00 2001 From: Neo2003 Date: Sun, 7 Dec 2008 13:03:24 +0100 Subject: [PATCH 46/56] [6887] Position dead flying creatures on ground at creature loading. Signed-off-by: Neo2003 --- src/game/Creature.cpp | 8 ++++++++ src/shared/revision_nr.h | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index 5a1a80f2e..880427b81 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -1345,7 +1345,15 @@ bool Creature::LoadFromDB(uint32 guid, Map *map) m_respawnTime = objmgr.GetCreatureRespawnTime(m_DBTableGuid,GetInstanceId()); if(m_respawnTime > time(NULL)) // not ready to respawn + { m_deathState = DEAD; + if(canFly()) + { + float tz = GetMap()->GetHeight(data->posX,data->posY,data->posZ,false); + if(data->posZ - tz > 0.1) + Relocate(data->posX,data->posY,tz); + } + } else if(m_respawnTime) // respawn time set but expired { m_respawnTime = 0; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 936d41044..e5caac4b2 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 "6886" + #define REVISION_NR "6887" #endif // __REVISION_NR_H__ From 480a935216c0b3d4139b5441f0153756312f5f32 Mon Sep 17 00:00:00 2001 From: KAPATEJIb Date: Mon, 8 Dec 2008 11:34:20 +0300 Subject: [PATCH 47/56] [6888] Add to character.sql not added changes from 2008_11_12_01_character_character_aura.sql Signed-off-by: VladimirMangos --- sql/characters.sql | 2 ++ src/shared/revision_nr.h | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/sql/characters.sql b/sql/characters.sql index 733f4d3a4..f73ca3c78 100644 --- a/sql/characters.sql +++ b/sql/characters.sql @@ -249,6 +249,7 @@ CREATE TABLE `character_aura` ( `caster_guid` bigint(20) unsigned NOT NULL default '0' COMMENT 'Full Global Unique Identifier', `spell` int(11) unsigned NOT NULL default '0', `effect_index` int(11) unsigned NOT NULL default '0', + `stackcount` int(11) NOT NULL default '1', `amount` int(11) NOT NULL default '0', `maxduration` int(11) NOT NULL default '0', `remaintime` int(11) NOT NULL default '0', @@ -1125,6 +1126,7 @@ CREATE TABLE `pet_aura` ( `caster_guid` bigint(20) unsigned NOT NULL default '0' COMMENT 'Full Global Unique Identifier', `spell` int(11) unsigned NOT NULL default '0', `effect_index` int(11) unsigned NOT NULL default '0', + `stackcount` int(11) NOT NULL default '1', `amount` int(11) NOT NULL default '0', `maxduration` int(11) NOT NULL default '0', `remaintime` int(11) NOT NULL default '0', diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index e5caac4b2..934202b1d 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 "6887" + #define REVISION_NR "6888" #endif // __REVISION_NR_H__ From 3da9f3f4cc17f128a83ada0f0f3782722d9b764f Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Tue, 9 Dec 2008 14:05:23 +0300 Subject: [PATCH 48/56] [6889] Backport some not client version specific changes and fixes from 303 branch. --- contrib/extractor/.gitignore | 1 + contrib/extractor/System.cpp | 28 +- contrib/extractor/VC71_ad.vcproj | 4 +- contrib/extractor/VC80_ad.vcproj | 4 +- contrib/extractor/VC90_ad.vcproj | 4 +- contrib/vmap_assembler/.gitignore | 16 + contrib/vmap_assembler/VC71/.gitignore | 13 + contrib/vmap_assembler/VC80/.gitignore | 13 + contrib/vmap_assembler/VC90/.gitignore | 13 + .../vmap_assembler/VC90/vmap_assembler.vcproj | 455 ++++++++ contrib/vmap_assembler/vmap_assemblerVC90.sln | 19 + .../vmap_extractor_v2/vmapExtractor_VC90.sln | 19 + .../vmapExtractor_VC90.vcproj | 999 ++++++++++++++++++ dep/include/mersennetwister/MersenneTwister.h | 4 +- src/game/CharacterHandler.cpp | 1 - src/game/Creature.h | 2 +- src/game/GameObject.cpp | 2 +- src/game/GossipDef.cpp | 26 +- src/game/ItemHandler.cpp | 2 +- src/game/ItemPrototype.h | 20 +- src/game/Level1.cpp | 6 +- src/game/Map.cpp | 8 +- src/game/MiscHandler.cpp | 6 +- src/game/MovementHandler.cpp | 18 +- src/game/NPCHandler.cpp | 12 +- src/game/Object.cpp | 62 +- src/game/Object.h | 20 +- src/game/ObjectAccessor.cpp | 3 +- src/game/ObjectAccessor.h | 2 +- src/game/ObjectGridLoader.cpp | 2 +- src/game/ObjectMgr.h | 1 + src/game/Opcodes.cpp | 2 +- src/game/Pet.cpp | 67 +- src/game/Pet.h | 3 +- src/game/PetHandler.cpp | 10 +- src/game/Player.cpp | 96 +- src/game/Player.h | 13 +- src/game/QuestDef.h | 32 +- src/game/SharedDefines.h | 25 +- src/game/Spell.cpp | 53 +- src/game/SpellAuras.cpp | 27 +- src/game/SpellEffects.cpp | 51 +- src/game/SpellHandler.cpp | 2 +- src/game/StatSystem.cpp | 1 + src/game/TaxiHandler.cpp | 2 +- src/game/Totem.cpp | 7 +- src/game/Traveller.h | 2 +- src/game/Unit.cpp | 70 +- src/game/Unit.h | 26 +- src/game/WaypointMovementGenerator.cpp | 32 +- src/game/WorldSession.cpp | 38 +- src/game/WorldSession.h | 2 +- src/game/WorldSocket.cpp | 10 +- src/game/debugcmds.cpp | 15 +- src/mangosd/RASocket.h | 2 +- src/shared/revision_nr.h | 2 +- 56 files changed, 1998 insertions(+), 377 deletions(-) create mode 100644 contrib/vmap_assembler/.gitignore create mode 100644 contrib/vmap_assembler/VC71/.gitignore create mode 100644 contrib/vmap_assembler/VC80/.gitignore create mode 100644 contrib/vmap_assembler/VC90/.gitignore create mode 100644 contrib/vmap_assembler/VC90/vmap_assembler.vcproj create mode 100644 contrib/vmap_assembler/vmap_assemblerVC90.sln create mode 100644 contrib/vmap_extractor_v2/vmapExtractor_VC90.sln create mode 100644 contrib/vmap_extractor_v2/vmapExtractor_VC90.vcproj diff --git a/contrib/extractor/.gitignore b/contrib/extractor/.gitignore index bbf017c83..908bb677d 100644 --- a/contrib/extractor/.gitignore +++ b/contrib/extractor/.gitignore @@ -17,3 +17,4 @@ debug release *.user +*.ilk diff --git a/contrib/extractor/System.cpp b/contrib/extractor/System.cpp index 39bf1d5b1..19c0e7159 100644 --- a/contrib/extractor/System.cpp +++ b/contrib/extractor/System.cpp @@ -39,7 +39,7 @@ enum Extract }; int extract = EXTRACT_MAP | EXTRACT_DBC; -static char* const langs[]={"enGB", "enUS", "deDE", "esES", "frFR", "koKR", "zhCN", "zhTW", "enCN", "enTW", "esMX", "ruRU" }; +static char* const langs[] = {"enGB", "enUS", "deDE", "esES", "frFR", "koKR", "zhCN", "zhTW", "enCN", "enTW", "esMX", "ruRU" }; #define LANG_COUNT 12 #define ADT_RES 64 @@ -55,9 +55,9 @@ void CreateDir( const std::string& Path ) bool FileExists( const char* FileName ) { - if( FILE* fp = fopen( FileName, "rb" ) ) + if(FILE* fp = fopen( FileName, "rb" )) { - fclose( fp ); + fclose(fp); return true; } @@ -222,15 +222,15 @@ void ExtractDBCFiles(int locale, bool basicLocale) string filename = path; filename += (iter->c_str() + strlen("DBFilesClient\\")); - FILE *output=fopen(filename.c_str(),"wb"); + FILE *output=fopen(filename.c_str(), "wb"); if(!output) { - printf("Can't create the output file '%s'\n",filename.c_str()); + printf("Can't create the output file '%s'\n", filename.c_str()); continue; } MPQFile m(iter->c_str()); if(!m.isEof()) - fwrite(m.getPointer(),1,m.getSize(),output); + fwrite(m.getPointer(), 1, m.getSize(), output); fclose(output); ++count; @@ -242,7 +242,7 @@ void LoadLocaleMPQFiles(int const locale) { char filename[512]; - sprintf(filename,"%s/Data/%s/locale-%s.MPQ",input_path,langs[locale],langs[locale]); + sprintf(filename,"%s/Data/%s/locale-%s.MPQ", input_path, langs[locale], langs[locale]); new MPQArchive(filename); for(int i = 1; i < 5; ++i) @@ -251,7 +251,7 @@ void LoadLocaleMPQFiles(int const locale) if(i > 1) sprintf(ext, "-%i", i); - sprintf(filename,"%s/Data/%s/patch-%s%s.MPQ",input_path,langs[locale],langs[locale],ext); + sprintf(filename,"%s/Data/%s/patch-%s%s.MPQ", input_path, langs[locale], langs[locale], ext); if(FileExists(filename)) new MPQArchive(filename); } @@ -261,9 +261,9 @@ void LoadCommonMPQFiles() { char filename[512]; - sprintf(filename,"%s/Data/common.MPQ",input_path); + sprintf(filename,"%s/Data/common-2.MPQ", input_path); new MPQArchive(filename); - sprintf(filename,"%s/Data/expansion.MPQ",input_path); + sprintf(filename,"%s/Data/expansion.MPQ", input_path); new MPQArchive(filename); for(int i = 1; i < 5; ++i) @@ -272,7 +272,7 @@ void LoadCommonMPQFiles() if(i > 1) sprintf(ext, "-%i", i); - sprintf(filename,"%s/Data/patch%s.MPQ",input_path,ext); + sprintf(filename,"%s/Data/patch%s.MPQ", input_path, ext); if(FileExists(filename)) new MPQArchive(filename); } @@ -306,12 +306,12 @@ int main(int argc, char * arg[]) if((extract & EXTRACT_DBC) == 0) { - FirstLocale=i; + FirstLocale = i; break; } //Extract DBC files - if(FirstLocale<0) + if(FirstLocale < 0) { ExtractDBCFiles(i, true); FirstLocale = i; @@ -324,7 +324,7 @@ int main(int argc, char * arg[]) } } - if(FirstLocale<0) + if(FirstLocale < 0) { printf("No locales detected\n"); return 0; diff --git a/contrib/extractor/VC71_ad.vcproj b/contrib/extractor/VC71_ad.vcproj index 2bd27e526..fd2d16120 100644 --- a/contrib/extractor/VC71_ad.vcproj +++ b/contrib/extractor/VC71_ad.vcproj @@ -76,7 +76,7 @@ Name="VCLinkerTool" AdditionalDependencies="zlib.lib" OutputFile="ad debug.exe" - LinkIncremental="1" + LinkIncremental="0" SuppressStartupBanner="true" AdditionalLibraryDirectories="./debug/" IgnoreDefaultLibraryNames="LIBCD.lib" @@ -171,7 +171,7 @@ Name="VCLinkerTool" AdditionalDependencies="zlib.lib" OutputFile="./ad.exe" - LinkIncremental="1" + LinkIncremental="0" SuppressStartupBanner="true" AdditionalLibraryDirectories="./release/" IgnoreDefaultLibraryNames="LIBC.lib" diff --git a/contrib/extractor/VC80_ad.vcproj b/contrib/extractor/VC80_ad.vcproj index 30657907f..fedab5b89 100644 --- a/contrib/extractor/VC80_ad.vcproj +++ b/contrib/extractor/VC80_ad.vcproj @@ -79,7 +79,7 @@ Name="VCLinkerTool" AdditionalDependencies="zlib.lib" OutputFile="ad debug.exe" - LinkIncremental="1" + LinkIncremental="0" SuppressStartupBanner="true" AdditionalLibraryDirectories="./debug" IgnoreDefaultLibraryNames="LIBCD.lib" @@ -176,7 +176,7 @@ Name="VCLinkerTool" AdditionalDependencies="zlib.lib" OutputFile="./ad.exe" - LinkIncremental="1" + LinkIncremental="0" SuppressStartupBanner="true" AdditionalLibraryDirectories="./release" IgnoreDefaultLibraryNames="LIBC.lib" diff --git a/contrib/extractor/VC90_ad.vcproj b/contrib/extractor/VC90_ad.vcproj index 14aa824a0..59fdf6d21 100644 --- a/contrib/extractor/VC90_ad.vcproj +++ b/contrib/extractor/VC90_ad.vcproj @@ -80,7 +80,7 @@ Name="VCLinkerTool" AdditionalDependencies="zlib.lib" OutputFile="ad debug.exe" - LinkIncremental="1" + LinkIncremental="0" SuppressStartupBanner="true" AdditionalLibraryDirectories="./debug/" IgnoreDefaultLibraryNames="LIBCD.lib" @@ -175,7 +175,7 @@ Name="VCLinkerTool" AdditionalDependencies="zlib.lib" OutputFile="./ad.exe" - LinkIncremental="1" + LinkIncremental="0" SuppressStartupBanner="true" AdditionalLibraryDirectories="./release/" IgnoreDefaultLibraryNames="LIBC.lib" diff --git a/contrib/vmap_assembler/.gitignore b/contrib/vmap_assembler/.gitignore new file mode 100644 index 000000000..267442f37 --- /dev/null +++ b/contrib/vmap_assembler/.gitignore @@ -0,0 +1,16 @@ +# +# NOTE! Don't add files that are generated in specific +# subdirectories here. Add them in the ".gitignore" file +# in that subdirectory instead. +# +# NOTE! Please use 'git-ls-files -i --exclude-standard' +# command after changing this file, to see if there are +# any tracked files which get ignored after the change. +# +# MaNGOS generated files at Windows build +# + +*.ncb +*.suo +Release +Debug diff --git a/contrib/vmap_assembler/VC71/.gitignore b/contrib/vmap_assembler/VC71/.gitignore new file mode 100644 index 000000000..7835e14b5 --- /dev/null +++ b/contrib/vmap_assembler/VC71/.gitignore @@ -0,0 +1,13 @@ +# +# NOTE! Don't add files that are generated in specific +# subdirectories here. Add them in the ".gitignore" file +# in that subdirectory instead. +# +# NOTE! Please use 'git-ls-files -i --exclude-standard' +# command after changing this file, to see if there are +# any tracked files which get ignored after the change. +# +# MaNGOS generated files at Windows build +# + +*.user diff --git a/contrib/vmap_assembler/VC80/.gitignore b/contrib/vmap_assembler/VC80/.gitignore new file mode 100644 index 000000000..7835e14b5 --- /dev/null +++ b/contrib/vmap_assembler/VC80/.gitignore @@ -0,0 +1,13 @@ +# +# NOTE! Don't add files that are generated in specific +# subdirectories here. Add them in the ".gitignore" file +# in that subdirectory instead. +# +# NOTE! Please use 'git-ls-files -i --exclude-standard' +# command after changing this file, to see if there are +# any tracked files which get ignored after the change. +# +# MaNGOS generated files at Windows build +# + +*.user diff --git a/contrib/vmap_assembler/VC90/.gitignore b/contrib/vmap_assembler/VC90/.gitignore new file mode 100644 index 000000000..7835e14b5 --- /dev/null +++ b/contrib/vmap_assembler/VC90/.gitignore @@ -0,0 +1,13 @@ +# +# NOTE! Don't add files that are generated in specific +# subdirectories here. Add them in the ".gitignore" file +# in that subdirectory instead. +# +# NOTE! Please use 'git-ls-files -i --exclude-standard' +# command after changing this file, to see if there are +# any tracked files which get ignored after the change. +# +# MaNGOS generated files at Windows build +# + +*.user diff --git a/contrib/vmap_assembler/VC90/vmap_assembler.vcproj b/contrib/vmap_assembler/VC90/vmap_assembler.vcproj new file mode 100644 index 000000000..4710f92f1 --- /dev/null +++ b/contrib/vmap_assembler/VC90/vmap_assembler.vcproj @@ -0,0 +1,455 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/contrib/vmap_assembler/vmap_assemblerVC90.sln b/contrib/vmap_assembler/vmap_assemblerVC90.sln new file mode 100644 index 000000000..0aeab053c --- /dev/null +++ b/contrib/vmap_assembler/vmap_assemblerVC90.sln @@ -0,0 +1,19 @@ +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vmap_assembler", "VC90\vmap_assembler.vcproj", "{572FFF74-480C-4472-8ABF-81733BB4049D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {572FFF74-480C-4472-8ABF-81733BB4049D}.Debug|Win32.ActiveCfg = Debug|Win32 + {572FFF74-480C-4472-8ABF-81733BB4049D}.Debug|Win32.Build.0 = Debug|Win32 + {572FFF74-480C-4472-8ABF-81733BB4049D}.Release|Win32.ActiveCfg = Release|Win32 + {572FFF74-480C-4472-8ABF-81733BB4049D}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/contrib/vmap_extractor_v2/vmapExtractor_VC90.sln b/contrib/vmap_extractor_v2/vmapExtractor_VC90.sln new file mode 100644 index 000000000..82d3e1509 --- /dev/null +++ b/contrib/vmap_extractor_v2/vmapExtractor_VC90.sln @@ -0,0 +1,19 @@ +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vmapExtractor", "vmapExtractor_VC90.vcproj", "{87335BBF-5DA8-4FEC-A51E-1FB948F2FFE9}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug Ansi Static|Win32 = Debug Ansi Static|Win32 + Release Ansi Static|Win32 = Release Ansi Static|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {87335BBF-5DA8-4FEC-A51E-1FB948F2FFE9}.Debug Ansi Static|Win32.ActiveCfg = Debug Ansi Static|Win32 + {87335BBF-5DA8-4FEC-A51E-1FB948F2FFE9}.Debug Ansi Static|Win32.Build.0 = Debug Ansi Static|Win32 + {87335BBF-5DA8-4FEC-A51E-1FB948F2FFE9}.Release Ansi Static|Win32.ActiveCfg = Release Ansi Static|Win32 + {87335BBF-5DA8-4FEC-A51E-1FB948F2FFE9}.Release Ansi Static|Win32.Build.0 = Release Ansi Static|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/contrib/vmap_extractor_v2/vmapExtractor_VC90.vcproj b/contrib/vmap_extractor_v2/vmapExtractor_VC90.vcproj new file mode 100644 index 000000000..ed75735c4 --- /dev/null +++ b/contrib/vmap_extractor_v2/vmapExtractor_VC90.vcproj @@ -0,0 +1,999 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dep/include/mersennetwister/MersenneTwister.h b/dep/include/mersennetwister/MersenneTwister.h index 9c6994bdf..af919319a 100644 --- a/dep/include/mersennetwister/MersenneTwister.h +++ b/dep/include/mersennetwister/MersenneTwister.h @@ -86,8 +86,8 @@ public: MTRand( const uint32& oneSeed ); // initialize with a simple uint32 MTRand( uint32 *const bigSeed, uint32 const seedLength = N ); // or an array MTRand(); // auto-initialize with /dev/urandom or time() and clock() - MTRand(const MTRand&); // prevent copy constructor - MTRand& operator=(const MTRand&); // no-op operator= + MTRand(const MTRand&); // prevent copy constructor + MTRand& operator=(const MTRand&); // no-op operator= // Do NOT use for CRYPTOGRAPHY without securely hashing several returned // values together, otherwise the generator state can be learned after diff --git a/src/game/CharacterHandler.cpp b/src/game/CharacterHandler.cpp index cd0b86b0e..a09436590 100644 --- a/src/game/CharacterHandler.cpp +++ b/src/game/CharacterHandler.cpp @@ -641,7 +641,6 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder) pCurrChar->LoadCorpse(); // setting Ghost+speed if dead - //if ( pCurrChar->m_deathState == DEAD ) if (pCurrChar->m_deathState != ALIVE) { // not blizz like, we must correctly save and load player instead... diff --git a/src/game/Creature.h b/src/game/Creature.h index 3c7825706..01111568a 100644 --- a/src/game/Creature.h +++ b/src/game/Creature.h @@ -218,7 +218,7 @@ struct CreatureInfo bool isTameable() const { - return type == CREATURE_TYPE_BEAST && family != 0 && (type_flags & CREATURE_TYPEFLAGS_TAMEBLE); + return type == CREATURE_TYPE_BEAST && family != 0 && (type_flags & CREATURE_TYPEFLAGS_TAMEABLE); } }; diff --git a/src/game/GameObject.cpp b/src/game/GameObject.cpp index 8a192716a..ab412dcf2 100644 --- a/src/game/GameObject.cpp +++ b/src/game/GameObject.cpp @@ -190,7 +190,7 @@ void GameObject::Update(uint32 /*p_time*/) if(caster && caster->GetTypeId()==TYPEID_PLAYER) { SetGoState(0); - SetUInt32Value(GAMEOBJECT_FLAGS, 32); + SetUInt32Value(GAMEOBJECT_FLAGS, GO_FLAG_NODESPAWN); UpdateData udata; WorldPacket packet; diff --git a/src/game/GossipDef.cpp b/src/game/GossipDef.cpp index fc0671b55..a690254e2 100644 --- a/src/game/GossipDef.cpp +++ b/src/game/GossipDef.cpp @@ -128,26 +128,20 @@ void PlayerMenu::SendGossipMenu( uint32 TitleTextId, uint64 npcGUID ) data << npcGUID; data << uint32(0); // new 2.4.0 data << uint32( TitleTextId ); - data << uint32( mGossipMenu.MenuItemCount() ); // max count 0x0F + data << uint32( mGossipMenu.MenuItemCount() ); // max count 0x0F for ( unsigned int iI = 0; iI < mGossipMenu.MenuItemCount(); iI++ ) { GossipMenuItem const& gItem = mGossipMenu.GetItem(iI); data << uint32( iI ); data << uint8( gItem.m_gIcon ); - // icons: - // 0 unlearn talents/misc - // 1 trader - // 2 taxi - // 3 trainer - // 9 BG/arena data << uint8( gItem.m_gCoded ); // makes pop up box password data << uint32(gItem.m_gBoxMoney); // money required to open menu, 2.0.3 data << gItem.m_gMessage; // text for gossip item data << gItem.m_gBoxMessage; // accept text (related to money) pop up box, 2.0.3 } - data << uint32( mQuestMenu.MenuItemCount() ); // max count 0x20 + data << uint32( mQuestMenu.MenuItemCount() ); // max count 0x20 for ( uint16 iI = 0; iI < mQuestMenu.MenuItemCount(); iI++ ) { @@ -155,7 +149,7 @@ void PlayerMenu::SendGossipMenu( uint32 TitleTextId, uint64 npcGUID ) uint32 questID = qItem.m_qId; Quest const* pQuest = objmgr.GetQuestTemplate(questID); - data << questID; + data << uint32(questID); data << uint32( qItem.m_qIcon ); data << uint32( pQuest ? pQuest->GetQuestLevel() : 0 ); std::string Title = pQuest->GetTitle(); @@ -381,8 +375,7 @@ void PlayerMenu::SendQuestGiverQuestList( QEmote eEmote, std::string Title, uint data << title; } pSession->SendPacket( &data ); - //uint32 fqid=pQuestMenu->GetItem(0).m_qId; - //sLog.outDebug( "WORLD: Sent SMSG_QUESTGIVER_QUEST_LIST NPC Guid=%u, questid-0=%u",npcGUID,fqid); + sLog.outDebug("WORLD: Sent SMSG_QUESTGIVER_QUEST_LIST NPC Guid=%u", GUID_LOPART(npcGUID)); } void PlayerMenu::SendQuestGiverStatus( uint8 questStatus, uint64 npcGUID ) @@ -392,7 +385,7 @@ void PlayerMenu::SendQuestGiverStatus( uint8 questStatus, uint64 npcGUID ) data << uint8(questStatus); pSession->SendPacket( &data ); - sLog.outDebug( "WORLD: Sent SMSG_QUESTGIVER_STATUS NPC Guid=%u, status=%u",GUID_LOPART(npcGUID),questStatus); + sLog.outDebug( "WORLD: Sent SMSG_QUESTGIVER_STATUS NPC Guid=%u, status=%u", GUID_LOPART(npcGUID), questStatus); } void PlayerMenu::SendQuestGiverQuestDetails( Quest const *pQuest, uint64 npcGUID, bool ActivateAccept ) @@ -462,6 +455,7 @@ void PlayerMenu::SendQuestGiverQuestDetails( Quest const *pQuest, uint64 npcGUID else data << uint32(0); } + data << uint32(pQuest->GetRewOrReqMoney()); } @@ -479,7 +473,7 @@ void PlayerMenu::SendQuestGiverQuestDetails( Quest const *pQuest, uint64 npcGUID } pSession->SendPacket( &data ); - sLog.outDebug("WORLD: Sent SMSG_QUESTGIVER_QUEST_DETAILS NPCGuid=%u, questid=%u",GUID_LOPART(npcGUID),pQuest->GetQuestId()); + sLog.outDebug("WORLD: Sent SMSG_QUESTGIVER_QUEST_DETAILS NPCGuid=%u, questid=%u", GUID_LOPART(npcGUID), pQuest->GetQuestId()); } void PlayerMenu::SendQuestQueryResponse( Quest const *pQuest ) @@ -760,8 +754,10 @@ void PlayerMenu::SendQuestGiverRequestItems( Quest const *pQuest, uint64 npcGUID else data << uint32(0x03); - data << uint32(0x04) << uint32(0x08) << uint32(0x10); + data << uint32(0x04); + data << uint32(0x08); + data << uint32(0x10); pSession->SendPacket( &data ); - sLog.outDebug( "WORLD: Sent SMSG_QUESTGIVER_REQUEST_ITEMS NPCGuid=%u, questid=%u",GUID_LOPART(npcGUID),pQuest->GetQuestId() ); + sLog.outDebug( "WORLD: Sent SMSG_QUESTGIVER_REQUEST_ITEMS NPCGuid=%u, questid=%u", GUID_LOPART(npcGUID), pQuest->GetQuestId() ); } diff --git a/src/game/ItemHandler.cpp b/src/game/ItemHandler.cpp index 421f6ae53..7d24fd5a2 100644 --- a/src/game/ItemHandler.cpp +++ b/src/game/ItemHandler.cpp @@ -369,7 +369,7 @@ void WorldSession::HandleItemQuerySingleOpcode( WorldPacket & recv_data ) data << pProto->ArcaneRes; data << pProto->Delay; - data << pProto->Ammo_type; + data << pProto->AmmoType; data << pProto->RangedModRange; for(int s = 0; s < 5; s++) diff --git a/src/game/ItemPrototype.h b/src/game/ItemPrototype.h index ba6f50f48..e3dab0d57 100644 --- a/src/game/ItemPrototype.h +++ b/src/game/ItemPrototype.h @@ -443,17 +443,15 @@ inline uint8 ItemSubClassToDurabilityMultiplierId(uint32 ItemClass, uint32 ItemS struct _Damage { - float DamageMin; - float DamageMax; - uint32 DamageType; // id from Resistances.dbc - + float DamageMin; + float DamageMax; + uint32 DamageType; // id from Resistances.dbc }; struct _ItemStat { - uint32 ItemStatType; - int32 ItemStatValue; - + uint32 ItemStatType; + int32 ItemStatValue; }; struct _Spell { @@ -464,7 +462,6 @@ struct _Spell int32 SpellCooldown; uint32 SpellCategory; // id from SpellCategory.dbc int32 SpellCategoryCooldown; - }; struct _Socket @@ -479,7 +476,7 @@ struct ItemPrototype uint32 Class; // id from ItemClass.dbc uint32 SubClass; // id from ItemSubClass.dbc uint32 Unk0; - char* Name1; + char* Name1; uint32 DisplayInfoID; // id from ItemDisplayInfo.dbc uint32 Quality; uint32 Flags; @@ -511,12 +508,11 @@ struct ItemPrototype uint32 ShadowRes; uint32 ArcaneRes; uint32 Delay; - uint32 Ammo_type; + uint32 AmmoType; float RangedModRange; - _Spell Spells[5]; uint32 Bonding; - char* Description; + char* Description; uint32 PageText; uint32 LanguageID; uint32 PageMaterial; diff --git a/src/game/Level1.cpp b/src/game/Level1.cpp index 5730ad1d6..c73231635 100644 --- a/src/game/Level1.cpp +++ b/src/game/Level1.cpp @@ -1028,7 +1028,7 @@ bool ChatHandler::HandleModifyASpeedCommand(const char* args) chr->SetSpeed(MOVE_RUN, ASpeed,true); chr->SetSpeed(MOVE_SWIM, ASpeed,true); //chr->SetSpeed(MOVE_TURN, ASpeed,true); - chr->SetSpeed(MOVE_FLY, ASpeed,true); + chr->SetSpeed(MOVE_FLIGHT, ASpeed,true); return true; } @@ -1144,7 +1144,7 @@ bool ChatHandler::HandleModifyBWalkCommand(const char* args) if (needReportToTarget(chr)) ChatHandler(chr).PSendSysMessage(LANG_YOURS_BACK_SPEED_CHANGED, GetName(), BSpeed); - chr->SetSpeed(MOVE_WALKBACK,BSpeed,true); + chr->SetSpeed(MOVE_RUN_BACK,BSpeed,true); return true; } @@ -1176,7 +1176,7 @@ bool ChatHandler::HandleModifyFlyCommand(const char* args) if (needReportToTarget(chr)) ChatHandler(chr).PSendSysMessage(LANG_YOURS_FLY_SPEED_CHANGED, GetName(), FSpeed); - chr->SetSpeed(MOVE_FLY,FSpeed,true); + chr->SetSpeed(MOVE_FLIGHT,FSpeed,true); return true; } diff --git a/src/game/Map.cpp b/src/game/Map.cpp index d782f6cba..b1cb12720 100644 --- a/src/game/Map.cpp +++ b/src/game/Map.cpp @@ -616,7 +616,6 @@ void Map::Update(const uint32 &t_diff) } } - // Don't unload grids if it's battleground, since we may have manually added GOs,creatures, those doesn't load from DB at grid re-load ! // This isn't really bother us, since as soon as we have instanced BG-s, the whole map unloads as the BG gets ended if (IsBattleGroundOrArena()) @@ -697,7 +696,7 @@ Map::Remove(T *obj, bool remove) CellPair p = MaNGOS::ComputeCellPair(obj->GetPositionX(), obj->GetPositionY()); if(p.x_coord >= TOTAL_NUMBER_OF_CELLS_PER_MAP || p.y_coord >= TOTAL_NUMBER_OF_CELLS_PER_MAP ) { - sLog.outError("Map::Remove: Object " I64FMTD " have invalid coordinates X:%f Y:%f grid cell [%u:%u]", obj->GetGUID(), obj->GetPositionX(), obj->GetPositionY(), p.x_coord, p.y_coord); + sLog.outError("Map::Remove: Object " I64FMT " have invalid coordinates X:%f Y:%f grid cell [%u:%u]", obj->GetGUID(), obj->GetPositionX(), obj->GetPositionY(), p.x_coord, p.y_coord); return; } @@ -705,7 +704,7 @@ Map::Remove(T *obj, bool remove) if( !loaded(GridPair(cell.data.Part.grid_x, cell.data.Part.grid_y)) ) return; - DEBUG_LOG("Remove object " I64FMTD " from grid[%u,%u]", obj->GetGUID(), cell.data.Part.grid_x, cell.data.Part.grid_y); + DEBUG_LOG("Remove object " I64FMT " from grid[%u,%u]", obj->GetGUID(), cell.data.Part.grid_x, cell.data.Part.grid_y); NGridType *grid = getNGrid(cell.GridX(), cell.GridY()); assert( grid != NULL ); @@ -959,7 +958,7 @@ bool Map::UnloadGrid(const uint32 &x, const uint32 &y, bool pForce) if (i_InstanceId == 0) { if(GridMaps[gx][gy]) delete (GridMaps[gx][gy]); - // x and y are swaped + // x and y are swapped VMAP::VMapFactory::createOrGetVMapManager()->unloadMap(GetId(), gy, gx); } else @@ -1122,7 +1121,6 @@ uint8 Map::GetTerrainType(float x, float y ) const return GridMaps[gx][gy]->terrain_type[(int)(lx)][(int)(ly)]; else return 0; - } float Map::GetWaterLevel(float x, float y ) const diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp index 2949ceb11..b2c7d7d5a 100644 --- a/src/game/MiscHandler.cpp +++ b/src/game/MiscHandler.cpp @@ -1380,7 +1380,7 @@ void WorldSession::HandleFarSightOpcode( WorldPacket & recv_data ) sLog.outDebug("Removed FarSight from player %u", _player->GetGUIDLow()); break; case 1: - sLog.outDebug("Added FarSight " I64FMTD " to player %u", _player->GetUInt64Value(PLAYER_FARSIGHT), _player->GetGUIDLow()); + sLog.outDebug("Added FarSight " I64FMT " to player %u", _player->GetFarSight(), _player->GetGUIDLow()); break; } } @@ -1395,9 +1395,9 @@ void WorldSession::HandleChooseTitleOpcode( WorldPacket & recv_data ) recv_data >> title; // -1 at none - if(title > 0 && title < 64) + if(title > 0 && title < 128) { - if(!GetPlayer()->HasFlag64(PLAYER__FIELD_KNOWN_TITLES,uint64(1) << title)) + if(!GetPlayer()->HasTitle(title)) return; } else diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp index 448d184e5..55c7e4cf6 100644 --- a/src/game/MovementHandler.cpp +++ b/src/game/MovementHandler.cpp @@ -461,19 +461,19 @@ void WorldSession::HandleForceSpeedChangeAck(WorldPacket &recv_data) UnitMoveType move_type; UnitMoveType force_move_type; - static char const* move_type_name[MAX_MOVE_TYPE] = { "Walk", "Run", "Walkback", "Swim", "Swimback", "Turn", "Fly", "Flyback" }; + static char const* move_type_name[MAX_MOVE_TYPE] = { "Walk", "Run", "RunBack", "Swim", "SwimBack", "TurnRate", "Flight", "FlightBack" }; uint16 opcode = recv_data.GetOpcode(); switch(opcode) { - case CMSG_FORCE_WALK_SPEED_CHANGE_ACK: move_type = MOVE_WALK; force_move_type = MOVE_WALK; break; - case CMSG_FORCE_RUN_SPEED_CHANGE_ACK: move_type = MOVE_RUN; force_move_type = MOVE_RUN; break; - case CMSG_FORCE_RUN_BACK_SPEED_CHANGE_ACK: move_type = MOVE_WALKBACK; force_move_type = MOVE_WALKBACK; break; - case CMSG_FORCE_SWIM_SPEED_CHANGE_ACK: move_type = MOVE_SWIM; force_move_type = MOVE_SWIM; break; - case CMSG_FORCE_SWIM_BACK_SPEED_CHANGE_ACK: move_type = MOVE_SWIMBACK; force_move_type = MOVE_SWIMBACK; break; - case CMSG_FORCE_TURN_RATE_CHANGE_ACK: move_type = MOVE_TURN; force_move_type = MOVE_TURN; break; - case CMSG_FORCE_FLIGHT_SPEED_CHANGE_ACK: move_type = MOVE_FLY; force_move_type = MOVE_FLY; break; - case CMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK: move_type = MOVE_FLYBACK; force_move_type = MOVE_FLYBACK; break; + case CMSG_FORCE_WALK_SPEED_CHANGE_ACK: move_type = MOVE_WALK; force_move_type = MOVE_WALK; break; + case CMSG_FORCE_RUN_SPEED_CHANGE_ACK: move_type = MOVE_RUN; force_move_type = MOVE_RUN; break; + case CMSG_FORCE_RUN_BACK_SPEED_CHANGE_ACK: move_type = MOVE_RUN_BACK; force_move_type = MOVE_RUN_BACK; break; + case CMSG_FORCE_SWIM_SPEED_CHANGE_ACK: move_type = MOVE_SWIM; force_move_type = MOVE_SWIM; break; + case CMSG_FORCE_SWIM_BACK_SPEED_CHANGE_ACK: move_type = MOVE_SWIM_BACK; force_move_type = MOVE_SWIM_BACK; break; + case CMSG_FORCE_TURN_RATE_CHANGE_ACK: move_type = MOVE_TURN_RATE; force_move_type = MOVE_TURN_RATE; break; + case CMSG_FORCE_FLIGHT_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT; force_move_type = MOVE_FLIGHT; break; + case CMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK: move_type = MOVE_FLIGHT_BACK; force_move_type = MOVE_FLIGHT_BACK; break; default: sLog.outError("WorldSession::HandleForceSpeedChangeAck: Unknown move type opcode: %u", opcode); return; diff --git a/src/game/NPCHandler.cpp b/src/game/NPCHandler.cpp index 46a2b8ebd..4303e1a6c 100644 --- a/src/game/NPCHandler.cpp +++ b/src/game/NPCHandler.cpp @@ -551,9 +551,9 @@ void WorldSession::SendStablePet(uint64 guid ) void WorldSession::HandleStablePet( WorldPacket & recv_data ) { - CHECK_PACKET_SIZE(recv_data,8); + CHECK_PACKET_SIZE(recv_data, 8); - sLog.outDebug("WORLD: Recv CMSG_STABLE_PET not dispose."); + sLog.outDebug("WORLD: Recv CMSG_STABLE_PET"); uint64 npcGUID; recv_data >> npcGUID; @@ -614,7 +614,7 @@ void WorldSession::HandleStablePet( WorldPacket & recv_data ) void WorldSession::HandleUnstablePet( WorldPacket & recv_data ) { - CHECK_PACKET_SIZE(recv_data,8+4); + CHECK_PACKET_SIZE(recv_data, 8+4); sLog.outDebug("WORLD: Recv CMSG_UNSTABLE_PET."); uint64 npcGUID; @@ -674,7 +674,7 @@ void WorldSession::HandleUnstablePet( WorldPacket & recv_data ) void WorldSession::HandleBuyStableSlot( WorldPacket & recv_data ) { - CHECK_PACKET_SIZE(recv_data,8); + CHECK_PACKET_SIZE(recv_data, 8); sLog.outDebug("WORLD: Recv CMSG_BUY_STABLE_SLOT."); uint64 npcGUID; @@ -719,7 +719,7 @@ void WorldSession::HandleStableRevivePet( WorldPacket &/* recv_data */) void WorldSession::HandleStableSwapPet( WorldPacket & recv_data ) { - CHECK_PACKET_SIZE(recv_data,8+4); + CHECK_PACKET_SIZE(recv_data, 8+4); sLog.outDebug("WORLD: Recv CMSG_STABLE_SWAP_PET."); uint64 npcGUID; @@ -774,7 +774,7 @@ void WorldSession::HandleStableSwapPet( WorldPacket & recv_data ) void WorldSession::HandleRepairItemOpcode( WorldPacket & recv_data ) { - CHECK_PACKET_SIZE(recv_data,8+8+1); + CHECK_PACKET_SIZE(recv_data, 8+8+1); sLog.outDebug("WORLD: CMSG_REPAIR_ITEM"); diff --git a/src/game/Object.cpp b/src/game/Object.cpp index d9c3677cf..b8f758cbd 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -376,12 +376,12 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2 *data << ((Unit*)this)->GetSpeed( MOVE_WALK ); *data << ((Unit*)this)->GetSpeed( MOVE_RUN ); - *data << ((Unit*)this)->GetSpeed( MOVE_SWIMBACK ); + *data << ((Unit*)this)->GetSpeed( MOVE_SWIM_BACK ); *data << ((Unit*)this)->GetSpeed( MOVE_SWIM ); - *data << ((Unit*)this)->GetSpeed( MOVE_WALKBACK ); - *data << ((Unit*)this)->GetSpeed( MOVE_FLY ); - *data << ((Unit*)this)->GetSpeed( MOVE_FLYBACK ); - *data << ((Unit*)this)->GetSpeed( MOVE_TURN ); + *data << ((Unit*)this)->GetSpeed( MOVE_RUN_BACK ); + *data << ((Unit*)this)->GetSpeed( MOVE_FLIGHT ); + *data << ((Unit*)this)->GetSpeed( MOVE_FLIGHT_BACK ); + *data << ((Unit*)this)->GetSpeed( MOVE_TURN_RATE ); // 0x08000000 if(flags2 & MOVEMENTFLAG_SPLINE2) @@ -625,7 +625,7 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask *data << uint32(1); break; default: - *data << uint32(0); //unknown. not happen. + *data << uint32(0); // unknown. not happen. break; } } @@ -934,6 +934,56 @@ void Object::RemoveFlag( uint16 index, uint32 oldFlag ) } } +void Object::SetByteFlag( uint16 index, uint8 offset, uint8 newFlag ) +{ + ASSERT( index < m_valuesCount || PrintIndexError( index , true ) ); + + if(offset > 4) + { + sLog.outError("Object::SetByteFlag: wrong offset %u", offset); + return; + } + + if(!(uint8(m_uint32Values[ index ] >> (offset * 8)) & newFlag)) + { + m_uint32Values[ index ] |= uint32(uint32(newFlag) << (offset * 8)); + + if(m_inWorld) + { + if(!m_objectUpdated) + { + ObjectAccessor::Instance().AddUpdateObject(this); + m_objectUpdated = true; + } + } + } +} + +void Object::RemoveByteFlag( uint16 index, uint8 offset, uint8 oldFlag ) +{ + ASSERT( index < m_valuesCount || PrintIndexError( index , true ) ); + + if(offset > 4) + { + sLog.outError("Object::RemoveByteFlag: wrong offset %u", offset); + return; + } + + if(uint8(m_uint32Values[ index ] >> (offset * 8)) & oldFlag) + { + m_uint32Values[ index ] &= ~uint32(uint32(oldFlag) << (offset * 8)); + + if(m_inWorld) + { + if(!m_objectUpdated) + { + ObjectAccessor::Instance().AddUpdateObject(this); + m_objectUpdated = true; + } + } + } +} + bool Object::PrintIndexError(uint32 index, bool set) const { sLog.outError("ERROR: Attempt %s non-existed value field: %u (count: %u) for object typeid: %u type mask: %u",(set ? "set value to" : "get value from"),index,m_valuesCount,GetTypeId(),m_objectType); diff --git a/src/game/Object.h b/src/game/Object.h index ae88004dd..16e1fbfdf 100644 --- a/src/game/Object.h +++ b/src/game/Object.h @@ -226,6 +226,24 @@ class MANGOS_DLL_SPEC Object return (m_uint32Values[ index ] & flag) != 0; } + void SetByteFlag( uint16 index, uint8 offset, uint8 newFlag ); + void RemoveByteFlag( uint16 index, uint8 offset, uint8 newFlag ); + + void ToggleFlag( uint16 index, uint8 offset, uint8 flag ) + { + if(HasByteFlag(index, offset, flag)) + RemoveByteFlag(index, offset, flag); + else + SetByteFlag(index, offset, flag); + } + + bool HasByteFlag( uint16 index, uint8 offset, uint8 flag ) const + { + ASSERT( index < m_valuesCount || PrintIndexError( index , false ) ); + ASSERT( offset < 4 ); + return (((uint8*)&m_uint32Values[index])[offset] & flag) != 0; + } + void ApplyModFlag( uint16 index, uint32 flag, bool apply) { if(apply) SetFlag(index,flag); else RemoveFlag(index,flag); @@ -297,7 +315,7 @@ class MANGOS_DLL_SPEC Object { int32 *m_int32Values; uint32 *m_uint32Values; - float *m_floatValues; + float *m_floatValues; }; uint32 *m_uint32Values_mirror; diff --git a/src/game/ObjectAccessor.cpp b/src/game/ObjectAccessor.cpp index 9934b2fe1..5ce16ca3c 100644 --- a/src/game/ObjectAccessor.cpp +++ b/src/game/ObjectAccessor.cpp @@ -45,7 +45,6 @@ INSTANTIATE_CLASS_MUTEX(ObjectAccessor, ZThread::FastMutex); namespace MaNGOS { - struct MANGOS_DLL_DECL BuildUpdateForPlayer { Player &i_player; @@ -551,7 +550,7 @@ void ObjectAccessor::UpdateVisibilityForPlayer( Player* player ) template UNORDERED_MAP< uint64, T* > HashMapHolder::m_objectMap; template ZThread::FastMutex HashMapHolder::i_lock; -/// Global defintions for the hashmap storage +/// Global definitions for the hashmap storage template class HashMapHolder; template class HashMapHolder; diff --git a/src/game/ObjectAccessor.h b/src/game/ObjectAccessor.h index 6b724408a..e5b0f61f7 100644 --- a/src/game/ObjectAccessor.h +++ b/src/game/ObjectAccessor.h @@ -72,7 +72,7 @@ class HashMapHolder static LockType* GetLock() { return &i_lock; } private: - //Non instanciable only static + //Non instanceable only static HashMapHolder() {} static LockType i_lock; diff --git a/src/game/ObjectGridLoader.cpp b/src/game/ObjectGridLoader.cpp index d43296e4c..83bce7171 100644 --- a/src/game/ObjectGridLoader.cpp +++ b/src/game/ObjectGridLoader.cpp @@ -50,7 +50,7 @@ ObjectGridRespawnMover::Visit(CreatureMapType &m) { // creature in unloading grid can have respawn point in another grid // if it will be unloaded then it will not respawn in original grid until unload/load original grid - // move to respwn point to prevent this case. For player view in respawn grid this wll be normal respawn. + // move to respawn point to prevent this case. For player view in respawn grid this will be normal respawn. for(CreatureMapType::iterator iter=m.begin(), next; iter != m.end(); iter = next) { next = iter; ++next; diff --git a/src/game/ObjectMgr.h b/src/game/ObjectMgr.h index c09daa071..1c408ce63 100644 --- a/src/game/ObjectMgr.h +++ b/src/game/ObjectMgr.h @@ -841,6 +841,7 @@ class ObjectMgr int GetOrNewIndexForLocale(LocaleConstant loc); int DBCLocaleIndex; + private: void LoadScripts(ScriptMapMap& scripts, char const* tablename); void CheckScripts(ScriptMapMap const& scripts,std::set& ids); diff --git a/src/game/Opcodes.cpp b/src/game/Opcodes.cpp index 06f910d8a..fba347199 100644 --- a/src/game/Opcodes.cpp +++ b/src/game/Opcodes.cpp @@ -138,7 +138,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] = /*0x06D*/ { "CMSG_DEL_IGNORE", STATUS_LOGGEDIN, &WorldSession::HandleDelIgnoreOpcode }, /*0x06E*/ { "CMSG_GROUP_INVITE", STATUS_LOGGEDIN, &WorldSession::HandleGroupInviteOpcode }, /*0x06F*/ { "SMSG_GROUP_INVITE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x070*/ { "CMSG_GROUP_CANCEL", STATUS_LOGGEDIN, &WorldSession::Handle_Depricated }, + /*0x070*/ { "CMSG_GROUP_CANCEL", STATUS_LOGGEDIN, &WorldSession::Handle_Deprecated }, /*0x071*/ { "SMSG_GROUP_CANCEL", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x072*/ { "CMSG_GROUP_ACCEPT", STATUS_LOGGEDIN, &WorldSession::HandleGroupAcceptOpcode }, /*0x073*/ { "CMSG_GROUP_DECLINE", STATUS_LOGGEDIN, &WorldSession::HandleGroupDeclineOpcode }, diff --git a/src/game/Pet.cpp b/src/game/Pet.cpp index 4bd8a1934..04cc6de0b 100644 --- a/src/game/Pet.cpp +++ b/src/game/Pet.cpp @@ -170,7 +170,7 @@ bool Pet::LoadPetFromDB( Unit* owner, uint32 petentry, uint32 petnumber, bool cu } Map *map = owner->GetMap(); - uint32 guid=objmgr.GenerateLowGuid(HIGHGUID_PET); + uint32 guid = objmgr.GenerateLowGuid(HIGHGUID_PET); uint32 pet_number = fields[0].GetUInt32(); if(!Create(guid, map, petentry, pet_number)) { @@ -179,7 +179,7 @@ bool Pet::LoadPetFromDB( Unit* owner, uint32 petentry, uint32 petnumber, bool cu } float px, py, pz; - owner->GetClosePoint(px, py, pz,GetObjectSize(),PET_FOLLOW_DIST,PET_FOLLOW_ANGLE); + owner->GetClosePoint(px, py, pz, GetObjectSize(), PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); Relocate(px, py, pz, owner->GetOrientation()); @@ -351,7 +351,7 @@ bool Pet::LoadPetFromDB( Unit* owner, uint32 petentry, uint32 petnumber, bool cu if(owner->GetTypeId() == TYPEID_PLAYER && getPetType() == HUNTER_PET) { - result = CharacterDatabase.PQuery("SELECT genitive, dative, accusative, instrumental, prepositional FROM character_pet_declinedname WHERE owner = '%u' AND id = '%u'",owner->GetGUIDLow(),GetCharmInfo()->GetPetNumber()); + result = CharacterDatabase.PQuery("SELECT genitive, dative, accusative, instrumental, prepositional FROM character_pet_declinedname WHERE owner = '%u' AND id = '%u'", owner->GetGUIDLow(), GetCharmInfo()->GetPetNumber()); if(result) { @@ -950,14 +950,14 @@ bool Pet::CreateBaseAtCreature(Creature* creature) } SetDisplayId(creature->GetDisplayId()); SetNativeDisplayId(creature->GetNativeDisplayId()); - SetMaxPower(POWER_HAPPINESS,GetCreatePowers(POWER_HAPPINESS)); - SetPower( POWER_HAPPINESS,166500); + SetMaxPower(POWER_HAPPINESS, GetCreatePowers(POWER_HAPPINESS)); + SetPower(POWER_HAPPINESS, 166500); setPowerType(POWER_FOCUS); - SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP,0); - SetUInt32Value(UNIT_FIELD_PETEXPERIENCE,0); + SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, 0); + SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, 0); SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, uint32((MaNGOS::XP::xp_to_level(creature->getLevel()))/4)); SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE); - SetUInt32Value(UNIT_NPC_FLAGS , 0); + SetUInt32Value(UNIT_NPC_FLAGS, 0); CreatureFamilyEntry const* cFamily = sCreatureFamilyStore.LookupEntry(creature->GetCreatureInfo()->family); if( char* familyname = cFamily->Name[sWorld.GetDefaultDbcLocale()] ) @@ -993,7 +993,7 @@ bool Pet::InitStatsForLevel(uint32 petlevel) uint32 creature_ID = (getPetType() == HUNTER_PET) ? 1 : cinfo->Entry; - SetLevel( petlevel); + SetLevel(petlevel); SetMeleeDamageSchool(SpellSchools(cinfo->dmgschool)); @@ -1082,7 +1082,7 @@ bool Pet::InitStatsForLevel(uint32 petlevel) for(int stat = 0; stat < MAX_STATS; ++stat) { - SetCreateStat(Stats(stat),float(pInfo->stats[stat])); + SetCreateStat(Stats(stat), float(pInfo->stats[stat])); } } else // not exist in DB, use some default fake data @@ -1093,11 +1093,11 @@ bool Pet::InitStatsForLevel(uint32 petlevel) SetCreateHealth(uint32(((float(cinfo->maxhealth) / cinfo->maxlevel) / (1 + 2 * cinfo->rank)) * petlevel) ); SetCreateMana( uint32(((float(cinfo->maxmana) / cinfo->maxlevel) / (1 + 2 * cinfo->rank)) * petlevel) ); - SetCreateStat(STAT_STRENGTH,22); - SetCreateStat(STAT_AGILITY,22); - SetCreateStat(STAT_STAMINA,25); - SetCreateStat(STAT_INTELLECT,28); - SetCreateStat(STAT_SPIRIT,27); + SetCreateStat(STAT_STRENGTH, 22); + SetCreateStat(STAT_AGILITY, 22); + SetCreateStat(STAT_STAMINA, 25); + SetCreateStat(STAT_INTELLECT, 28); + SetCreateStat(STAT_SPIRIT, 27); } break; } @@ -1132,34 +1132,35 @@ bool Pet::InitStatsForLevel(uint32 petlevel) // remove elite bonuses included in DB values SetCreateHealth( uint32(((float(cinfo->maxhealth) / cinfo->maxlevel) / (1 + 2 * cinfo->rank)) * petlevel) ); - SetCreateStat(STAT_STRENGTH,22); - SetCreateStat(STAT_AGILITY,22); - SetCreateStat(STAT_STAMINA,25); - SetCreateStat(STAT_INTELLECT,28); - SetCreateStat(STAT_SPIRIT,27); + SetCreateStat(STAT_STRENGTH, 22); + SetCreateStat(STAT_AGILITY, 22); + SetCreateStat(STAT_STAMINA, 25); + SetCreateStat(STAT_INTELLECT, 28); + SetCreateStat(STAT_SPIRIT, 27); } break; } case GUARDIAN_PET: - SetUInt32Value(UNIT_FIELD_PETEXPERIENCE,0); - SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP,1000); + SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, 0); + SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, 1000); - SetCreateMana( 28 + 10*petlevel ); - SetCreateHealth( 28 + 30*petlevel ); + SetCreateMana(28 + 10*petlevel); + SetCreateHealth(28 + 30*petlevel); // FIXME: this is wrong formula, possible each guardian pet have own damage formula //these formula may not be correct; however, it is designed to be close to what it should be //this makes dps 0.5 of pets level - SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, float(petlevel - (petlevel / 4)) ); + SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, float(petlevel - (petlevel / 4))); //damage range is then petlevel / 2 - SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, float(petlevel + (petlevel / 4)) ); + SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, float(petlevel + (petlevel / 4))); break; default: - sLog.outError("Pet have incorrect type (%u) for levelup.",getPetType()); break; + sLog.outError("Pet have incorrect type (%u) for levelup.", getPetType()); + break; } for (int i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i) - SetModifierValue(UnitMods(UNIT_MOD_RESISTANCE_START + i), BASE_VALUE, float(createResistance[i]) ); + SetModifierValue(UnitMods(UNIT_MOD_RESISTANCE_START + i), BASE_VALUE, float(createResistance[i])); UpdateAllStats(); @@ -1190,7 +1191,7 @@ bool Pet::HaveInDiet(ItemPrototype const* item) const uint32 Pet::GetCurrentFoodBenefitLevel(uint32 itemlevel) { // -5 or greater food level - if(getLevel() <= itemlevel +5) //possible to feed level 60 pet with level 55 level food for full effect + if(getLevel() <= itemlevel + 5) //possible to feed level 60 pet with level 55 level food for full effect return 35000; // -10..-6 else if(getLevel() <= itemlevel + 10) //pure guess, but sounds good @@ -1240,7 +1241,7 @@ void Pet::_LoadSpellCooldowns() _AddCreatureSpellCooldown(spell_id,db_time); - sLog.outDebug("Pet (Number: %u) spell %u cooldown loaded (%u secs).",m_charmInfo->GetPetNumber(),spell_id,uint32(db_time-curTime)); + sLog.outDebug("Pet (Number: %u) spell %u cooldown loaded (%u secs).", m_charmInfo->GetPetNumber(), spell_id, uint32(db_time-curTime)); } while( result->NextRow() ); @@ -1387,7 +1388,7 @@ void Pet::_LoadAuras(uint32 timediff) void Pet::_SaveAuras() { - CharacterDatabase.PExecute("DELETE FROM pet_aura WHERE guid = '%u'",m_charmInfo->GetPetNumber()); + CharacterDatabase.PExecute("DELETE FROM pet_aura WHERE guid = '%u'", m_charmInfo->GetPetNumber()); AuraMap const& auras = GetAuras(); if (auras.empty()) @@ -1762,7 +1763,7 @@ void Pet::CastPetAuras(bool current) if(getPetType() != HUNTER_PET && (getPetType() != SUMMON_PET || owner->getClass() != CLASS_WARLOCK)) return; - for(PetAuraSet::iterator itr = owner->m_petAuras.begin(); itr != owner->m_petAuras.end(); ) + for(PetAuraSet::iterator itr = owner->m_petAuras.begin(); itr != owner->m_petAuras.end();) { PetAura const* pa = *itr; ++itr; @@ -1783,7 +1784,7 @@ void Pet::CastPetAura(PetAura const* aura) if(auraId == 35696) // Demonic Knowledge { int32 basePoints = int32(aura->GetDamage() * (GetStat(STAT_STAMINA) + GetStat(STAT_INTELLECT)) / 100); - CastCustomSpell(this,auraId,&basePoints, NULL, NULL, true ); + CastCustomSpell(this, auraId, &basePoints, NULL, NULL, true); } else CastSpell(this, auraId, true); diff --git a/src/game/Pet.h b/src/game/Pet.h index ca7ccae08..0a8f46767 100644 --- a/src/game/Pet.h +++ b/src/game/Pet.h @@ -78,6 +78,7 @@ struct PetSpell { uint16 slotId; uint16 active; + PetSpellState state : 16; PetSpellType type : 16; }; @@ -144,7 +145,7 @@ class Pet : public Creature bool isTemporarySummoned() const { return m_duration > 0; } bool Create (uint32 guidlow, Map *map, uint32 Entry, uint32 pet_number); - bool CreateBaseAtCreature( Creature* creature ); + bool CreateBaseAtCreature(Creature* creature); bool LoadPetFromDB( Unit* owner,uint32 petentry = 0,uint32 petnumber = 0, bool current = false ); void SavePetToDB(PetSaveMode mode); void Remove(PetSaveMode mode, bool returnreagent = false); diff --git a/src/game/PetHandler.cpp b/src/game/PetHandler.cpp index 0ef5f1c01..eb51544d3 100644 --- a/src/game/PetHandler.cpp +++ b/src/game/PetHandler.cpp @@ -34,7 +34,7 @@ void WorldSession::HandlePetAction( WorldPacket & recv_data ) { - CHECK_PACKET_SIZE(recv_data,8+2+2+8); + CHECK_PACKET_SIZE(recv_data, 8+2+2+8); uint64 guid1; uint16 spellid; @@ -46,8 +46,8 @@ void WorldSession::HandlePetAction( WorldPacket & recv_data ) recv_data >> guid2; //tag guid // used also for charmed creature - Unit* pet= ObjectAccessor::GetUnit(*_player,guid1); - sLog.outDetail( "HandlePetAction.Pet %u flag is %u, spellid is %u, target %u.\n", uint32(GUID_LOPART(guid1)), flag, spellid, uint32(GUID_LOPART(guid2)) ); + Unit* pet= ObjectAccessor::GetUnit(*_player, guid1); + sLog.outDetail("HandlePetAction.Pet %u flag is %u, spellid is %u, target %u.\n", uint32(GUID_LOPART(guid1)), flag, spellid, uint32(GUID_LOPART(guid2)) ); if(!pet) { sLog.outError( "Pet %u not exist.\n", uint32(GUID_LOPART(guid1)) ); @@ -56,7 +56,7 @@ void WorldSession::HandlePetAction( WorldPacket & recv_data ) if(pet != GetPlayer()->GetPet() && pet != GetPlayer()->GetCharm()) { - sLog.outError( "HandlePetAction.Pet %u isn't pet of player %s .\n", uint32(GUID_LOPART(guid1)),GetPlayer()->GetName() ); + sLog.outError("HandlePetAction.Pet %u isn't pet of player %s.\n", uint32(GUID_LOPART(guid1)), GetPlayer()->GetName() ); return; } @@ -310,7 +310,7 @@ void WorldSession::SendPetNameQuery( uint64 petguid, uint32 petnumber) void WorldSession::HandlePetSetAction( WorldPacket & recv_data ) { - CHECK_PACKET_SIZE(recv_data,8+4+2+2); + CHECK_PACKET_SIZE(recv_data, 8+4+2+2); sLog.outDetail( "HandlePetSetAction. CMSG_PET_SET_ACTION\n" ); diff --git a/src/game/Player.cpp b/src/game/Player.cpp index a6989dd82..c2e1d25f5 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -173,7 +173,7 @@ void PlayerTaxi::AppendTaximaskTo( ByteBuffer& data, bool all ) if(all) { for (uint8 i=0; iSendPacket(&data); - //Let other players see that you get damage SendMessageToSet(&data, true); + DealDamage(this, damage, NULL, SELF_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); if(type==DAMAGE_FALL && !isAlive()) // DealDamage not apply item durability loss at self damage @@ -844,7 +836,7 @@ void Player::HandleDrowning() m_isunderwater|= 0x04; StartMirrorTimer(BREATH_TIMER, UnderWaterTime); } - //continius trigger drowning "Damage" + //continuous trigger drowning "Damage" if ((m_breathTimer == 0) && (m_isunderwater & 0x01)) { //TODO: Check this formula @@ -966,7 +958,7 @@ void Player::SetDrunkValue(uint16 newDrunkenValue, uint32 itemId) return; WorldPacket data(SMSG_CROSSED_INEBRIATION_THRESHOLD, (8+4+4)); - data << GetGUID(); + data << uint64(GetGUID()); data << uint32(newDrunkenState); data << uint32(itemId); @@ -1339,7 +1331,7 @@ void Player::BuildEnumData( QueryResult * result, WorldPacket * p_data ) *p_data << uint8(getLevel()); // player level // do not use GetMap! it will spawn a new instance since the bound instances are not loaded uint32 zoneId = MapManager::Instance().GetZoneId(GetMapId(), GetPositionX(),GetPositionY()); - + sLog.outDebug("Player::BuildEnumData: m:%u, x:%f, y:%f, z:%f zone:%u", GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), zoneId); *p_data << zoneId; *p_data << GetMapId(); @@ -2380,7 +2372,6 @@ void Player::SendInitialSpells() continue; data << uint16(itr->first); - //data << uint16(itr->second->slotId); data << uint16(0); // it's not slot id spellCount +=1; @@ -2407,13 +2398,13 @@ void Player::SendInitialSpells() data << uint16(sEntry->Category); // spell category if(sEntry->Category) // may be wrong, but anyway better than nothing... { - data << uint32(0); - data << uint32(cooldown); + data << uint32(0); // cooldown + data << uint32(cooldown); // category cooldown } else { - data << uint32(cooldown); - data << uint32(0); + data << uint32(cooldown); // cooldown + data << uint32(0); // category cooldown } } @@ -3399,7 +3390,6 @@ void Player::DestroyForPlayer( Player *target ) const if(target == this) { - for(int i = INVENTORY_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++) { if(m_items[i] == NULL) @@ -6453,23 +6443,23 @@ void Player::_ApplyItemBonuses(ItemPrototype const *proto,uint8 slot,bool apply) break; case ITEM_MOD_AGILITY: // modify agility HandleStatModifier(UNIT_MOD_STAT_AGILITY, BASE_VALUE, float(val), apply); - ApplyStatBuffMod(STAT_AGILITY, val, apply); + ApplyStatBuffMod(STAT_AGILITY, float(val), apply); break; case ITEM_MOD_STRENGTH: //modify strength HandleStatModifier(UNIT_MOD_STAT_STRENGTH, BASE_VALUE, float(val), apply); - ApplyStatBuffMod(STAT_STRENGTH, val, apply); + ApplyStatBuffMod(STAT_STRENGTH, float(val), apply); break; case ITEM_MOD_INTELLECT: //modify intellect HandleStatModifier(UNIT_MOD_STAT_INTELLECT, BASE_VALUE, float(val), apply); - ApplyStatBuffMod(STAT_INTELLECT, val, apply); + ApplyStatBuffMod(STAT_INTELLECT, float(val), apply); break; case ITEM_MOD_SPIRIT: //modify spirit HandleStatModifier(UNIT_MOD_STAT_SPIRIT, BASE_VALUE, float(val), apply); - ApplyStatBuffMod(STAT_SPIRIT, val, apply); + ApplyStatBuffMod(STAT_SPIRIT, float(val), apply); break; case ITEM_MOD_STAMINA: //modify stamina HandleStatModifier(UNIT_MOD_STAT_STAMINA, BASE_VALUE, float(val), apply); - ApplyStatBuffMod(STAT_STAMINA, val, apply); + ApplyStatBuffMod(STAT_STAMINA, float(val), apply); break; case ITEM_MOD_DEFENSE_SKILL_RATING: ApplyRatingMod(CR_DEFENSE_SKILL, int32(val), apply); @@ -8847,7 +8837,7 @@ uint8 Player::_CanStoreItem( uint8 bag, uint8 slot, ItemPosCountVec &dest, uint3 } else // equipped bag { - // we need check 2 time (specilized/non_specialized), use NULL_BAG to prevent skipping bag + // we need check 2 time (specialized/non_specialized), use NULL_BAG to prevent skipping bag res = _CanStoreItem_InBag(bag,dest,pProto,count,true,false,pItem,NULL_BAG,slot); if(res!=EQUIP_ERR_OK) res = _CanStoreItem_InBag(bag,dest,pProto,count,true,true,pItem,NULL_BAG,slot); @@ -10305,7 +10295,6 @@ void Player::DestroyItem( uint8 bag, uint8 slot, bool update ) if( bag == INVENTORY_SLOT_BAG_0 ) { - SetUInt64Value((uint16)(PLAYER_FIELD_INV_SLOT_HEAD + (slot*2)), 0); // equipment and equipped bags can have applied bonuses @@ -12136,7 +12125,7 @@ void Player::RewardQuest( Quest const *pQuest, uint32 reward, Object* questGiver if(pQuest->GetCharTitleId()) { if(CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(pQuest->GetCharTitleId())) - SetFlag64(PLAYER__FIELD_KNOWN_TITLES, (uint64(1) << titleEntry->bit_index)); + SetTitle(titleEntry); } // Send reward mail @@ -13153,7 +13142,7 @@ void Player::SendQuestComplete( uint32 quest_id ) if( quest_id ) { WorldPacket data( SMSG_QUESTUPDATE_COMPLETE, 4 ); - data << quest_id; + data << uint32(quest_id); GetSession()->SendPacket( &data ); sLog.outDebug( "WORLD: Sent SMSG_QUESTUPDATE_COMPLETE quest = %u", quest_id ); } @@ -13673,14 +13662,14 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder ) SetUInt32Value(UNIT_CHANNEL_SPELL,0); // clear charm/summon related fields - SetUInt64Value(UNIT_FIELD_CHARM,0); - SetUInt64Value(UNIT_FIELD_SUMMON,0); - SetUInt64Value(UNIT_FIELD_CHARMEDBY,0); - SetUInt64Value(UNIT_FIELD_SUMMONEDBY,0); - SetUInt64Value(UNIT_FIELD_CREATEDBY,0); + SetCharm(NULL); + SetPet(NULL); + SetCharmerGUID(NULL); + SetOwnerGUID(NULL); + SetCreatorGUID(NULL); // reset some aura modifiers before aura apply - SetUInt64Value(PLAYER_FARSIGHT, 0); + SetFarSight(NULL); SetUInt32Value(PLAYER_TRACK_CREATURES, 0 ); SetUInt32Value(PLAYER_TRACK_RESOURCES, 0 ); @@ -13765,7 +13754,7 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder ) // note: PLAYER__FIELD_KNOWN_TITLES updated at quest status loaded if(uint32 curTitle = GetUInt32Value(PLAYER_CHOSEN_TITLE)) { - if(!HasFlag64(PLAYER__FIELD_KNOWN_TITLES,uint64(1) << curTitle)) + if(!HasTitle(curTitle)) SetUInt32Value(PLAYER_CHOSEN_TITLE,0); } @@ -14380,7 +14369,7 @@ void Player::_LoadQuestStatus(QueryResult *result) if(pQuest->GetCharTitleId()) { if(CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(pQuest->GetCharTitleId())) - SetFlag64(PLAYER__FIELD_KNOWN_TITLES, (uint64(1) << titleEntry->bit_index)); + SetTitle(titleEntry); } } @@ -15673,8 +15662,8 @@ void Player::RemovePet(Pet* pet, PetSaveMode mode, bool returnreagent) m_guardianPets.erase(pet->GetGUID()); break; default: - if(GetPetGUID()==pet->GetGUID()) - SetPet(0); + if(GetPetGUID() == pet->GetGUID()) + SetPet(NULL); break; } @@ -18249,7 +18238,7 @@ Player* Player::GetNextRandomRaidMember(float radius) void Player::UpdateUnderwaterState( Map* m, float x, float y, float z ) { float water_z = m->GetWaterLevel(x,y); - float height_z = m->GetHeight(x,y,z, false); // use .map base surface height + float height_z = m->GetHeight(x,y,z, false); // use .map base surface height uint8 flag1 = m->GetTerrainType(x,y); //!Underwater check, not in water if underground or above water level @@ -18292,11 +18281,28 @@ bool ItemPosCount::isContainedIn(ItemPosCountVec const& vec) const bool Player::isAllowUseBattleGroundObject() { - return ( //InBattleGround() && // in battleground - not need, check in other cases - !IsMounted() && // not mounted - !HasStealthAura() && // not stealthed - !HasInvisibilityAura() && // not invisible - !HasAura(SPELL_RECENTLY_DROPPED_FLAG, 0) && // can't pickup - isAlive() // live player + return ( //InBattleGround() && // in battleground - not need, check in other cases + !IsMounted() && // not mounted + !HasStealthAura() && // not stealthed + !HasInvisibilityAura() && // not invisible + !HasAura(SPELL_RECENTLY_DROPPED_FLAG, 0) && // can't pickup + isAlive() // live player ); } + +bool Player::HasTitle(uint32 bitIndex) +{ + if (bitIndex > 128) + return false; + + uint32 fieldIndexOffset = bitIndex/32; + uint32 flag = 1 << (bitIndex%32); + return HasFlag(PLAYER__FIELD_KNOWN_TITLES+fieldIndexOffset, flag); +} + +void Player::SetTitle(CharTitlesEntry const* title) +{ + uint32 fieldIndexOffset = title->bit_index/32; + uint32 flag = 1 << (title->bit_index%32); + SetFlag(PLAYER__FIELD_KNOWN_TITLES+fieldIndexOffset, flag); +} diff --git a/src/game/Player.h b/src/game/Player.h index 88fbe8009..821f3bb6e 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -516,10 +516,10 @@ typedef std::map QuestStatusMap; enum QuestSlotOffsets { - QUEST_ID_OFFSET = 0, - QUEST_STATE_OFFSET = 1, + QUEST_ID_OFFSET = 0, + QUEST_STATE_OFFSET = 1, QUEST_COUNTS_OFFSET = 2, - QUEST_TIME_OFFSET = 3 + QUEST_TIME_OFFSET = 3 }; #define MAX_QUEST_OFFSET 4 @@ -1683,6 +1683,7 @@ class MANGOS_DLL_SPEC Player : public Unit FactionStateList m_factions; ForcedReactions m_forcedReactions; + FactionStateList const& GetFactionStateList() { return m_factions; } uint32 GetDefaultReputationFlags(const FactionEntry *factionEntry) const; int32 GetBaseReputation(const FactionEntry *factionEntry) const; int32 GetReputation(uint32 faction_id) const; @@ -1919,6 +1920,9 @@ class MANGOS_DLL_SPEC Player : public Unit void SetClientControl(Unit* target, uint8 allowMove); + uint64 GetFarSight() const { return GetUInt64Value(PLAYER_FARSIGHT); } + void SetFarSight(uint64 guid) { SetUInt64Value(PLAYER_FARSIGHT, guid); } + // Transports Transport * GetTransport() const { return m_transport; } void SetTransport(Transport * t) { m_transport = t; } @@ -2024,6 +2028,9 @@ class MANGOS_DLL_SPEC Player : public Unit WorldLocation& GetTeleportDest() { return m_teleport_dest; } DeclinedName const* GetDeclinedNames() const { return m_declinedname; } + bool HasTitle(uint32 bitIndex); + bool HasTitle(CharTitlesEntry const* title) { return HasTitle(title->bit_index); } + void SetTitle(CharTitlesEntry const* title); protected: diff --git a/src/game/QuestDef.h b/src/game/QuestDef.h index 551c3dd5f..316209393 100644 --- a/src/game/QuestDef.h +++ b/src/game/QuestDef.h @@ -112,24 +112,24 @@ enum __QuestGiverStatus enum __QuestFlags { - // Flags used at server and sended to client - QUEST_FLAGS_STAY_ALIVE = 1, // Not used currently - QUEST_FLAGS_PARTY_ACCEPT = 2, // Not used currently. If player in party, all players that can accept this quest will receive confirmation box to accept quest CMSG_QUEST_CONFIRM_ACCEPT/SMSG_QUEST_CONFIRM_ACCEPT - QUEST_FLAGS_EXPLORATION = 4, // Not used currently - QUEST_FLAGS_SHARABLE = 8, // Can be shared: Player::CanShareQuest() - //QUEST_FLAGS_NONE2 = 16, // Not used currently - QUEST_FLAGS_EPIC = 32, // Not used currently: Unsure of content - QUEST_FLAGS_RAID = 64, // Not used currently - QUEST_FLAGS_TBC = 128, // Not used currently: Available if TBC expension enabled only - QUEST_FLAGS_UNK2 = 256, // Not used currently: _DELIVER_MORE Quest needs more than normal _q-item_ drops from mobs - QUEST_FLAGS_HIDDEN_REWARDS = 512, // Items and money rewarded only sent in SMSG_QUESTGIVER_OFFER_REWARD (not in SMSG_QUESTGIVER_QUEST_DETAILS or in client quest log(SMSG_QUEST_QUERY_RESPONSE)) - QUEST_FLAGS_AUTO_REWARDED = 1024, // These quests are automatically rewarded on quest complete and they will never appear in quest log client side. - QUEST_FLAGS_TBC_RACES = 2048, // Not used currently: Bloodelf/draenei starting zone quests - QUEST_FLAGS_DAILY = 4096, // Used to know quest is Daily one + // Flags used at server and sent to client + QUEST_FLAGS_STAY_ALIVE = 0x00000001, // Not used currently + QUEST_FLAGS_PARTY_ACCEPT = 0x00000002, // Not used currently. If player in party, all players that can accept this quest will receive confirmation box to accept quest CMSG_QUEST_CONFIRM_ACCEPT/SMSG_QUEST_CONFIRM_ACCEPT + QUEST_FLAGS_EXPLORATION = 0x00000004, // Not used currently + QUEST_FLAGS_SHARABLE = 0x00000008, // Can be shared: Player::CanShareQuest() + //QUEST_FLAGS_NONE2 = 0x00000010, // Not used currently + QUEST_FLAGS_EPIC = 0x00000020, // Not used currently: Unsure of content + QUEST_FLAGS_RAID = 0x00000040, // Not used currently + QUEST_FLAGS_TBC = 0x00000080, // Not used currently: Available if TBC expension enabled only + QUEST_FLAGS_UNK2 = 0x00000100, // Not used currently: _DELIVER_MORE Quest needs more than normal _q-item_ drops from mobs + QUEST_FLAGS_HIDDEN_REWARDS = 0x00000200, // Items and money rewarded only sent in SMSG_QUESTGIVER_OFFER_REWARD (not in SMSG_QUESTGIVER_QUEST_DETAILS or in client quest log(SMSG_QUEST_QUERY_RESPONSE)) + QUEST_FLAGS_AUTO_REWARDED = 0x00000400, // These quests are automatically rewarded on quest complete and they will never appear in quest log client side. + QUEST_FLAGS_TBC_RACES = 0x00000800, // Not used currently: Blood elf/Draenei starting zone quests + QUEST_FLAGS_DAILY = 0x00001000, // Used to know quest is Daily one // Mangos flags for set SpecialFlags in DB if required but used only at server QUEST_MANGOS_FLAGS_REPEATABLE = 0x010000, // Set by 1 in SpecialFlags from DB - QUEST_MANGOS_FLAGS_EXPLORATION_OR_EVENT = 0x020000, // Set by 2 in SpecialFlags from DB (if reequired area explore, spell SPELL_EFFECT_QUEST_COMPLETE casting, table `*_script` command SCRIPT_COMMAND_QUEST_EXPLORED use, set from script DLL) + QUEST_MANGOS_FLAGS_EXPLORATION_OR_EVENT = 0x020000, // Set by 2 in SpecialFlags from DB (if required area explore, spell SPELL_EFFECT_QUEST_COMPLETE casting, table `*_script` command SCRIPT_COMMAND_QUEST_EXPLORED use, set from script DLL) QUEST_MANGOS_FLAGS_DB_ALLOWED = 0xFFFF | QUEST_MANGOS_FLAGS_REPEATABLE | QUEST_MANGOS_FLAGS_EXPLORATION_OR_EVENT, // Mangos flags for internal use only @@ -318,7 +318,7 @@ struct QuestStatusData : m_status(QUEST_STATUS_NONE),m_rewarded(false), m_explored(false), m_timer(0), uState(QUEST_NEW) { - memset(m_itemcount, 0, QUEST_OBJECTIVES_COUNT * sizeof(uint32)); + memset(m_itemcount, 0, QUEST_OBJECTIVES_COUNT * sizeof(uint32)); memset(m_creatureOrGOcount, 0, QUEST_OBJECTIVES_COUNT * sizeof(uint32)); } diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h index 907cceb2f..8ae1cf27b 100644 --- a/src/game/SharedDefines.h +++ b/src/game/SharedDefines.h @@ -553,7 +553,6 @@ enum SpellEffects SPELL_EFFECT_TRADE_SKILL = 47, SPELL_EFFECT_STEALTH = 48, SPELL_EFFECT_DETECT = 49, - // SPELL_EFFECT_SUMMON_OBJECT = 50, SPELL_EFFECT_TRANS_DOOR = 50, SPELL_EFFECT_FORCE_CRITICAL_HIT = 51, SPELL_EFFECT_GUARANTEE_HIT = 52, @@ -766,7 +765,7 @@ enum SpellImmunity IMMUNITY_MECHANIC = 5 // enum Mechanics }; -#define MAX_SPELL_IMMUNITY 6 +#define MAX_SPELL_IMMUNITY 6 enum Targets { @@ -831,7 +830,7 @@ enum SpellMissInfo SPELL_MISS_IMMUNE2 = 8, SPELL_MISS_DEFLECT = 9, SPELL_MISS_ABSORB = 10, - SPELL_MISS_REFLECT = 11, + SPELL_MISS_REFLECT = 11 }; enum SpellHitType @@ -903,13 +902,13 @@ enum GameobjectTypes enum GameObjectFlags { - GO_FLAG_IN_USE = 0x01, //disables interaction while animated - GO_FLAG_LOCKED = 0x02, //require key, spell, event, etc to be opened. Makes "Locked" appear in tooltip - GO_FLAG_INTERACT_COND = 0x04, //cannot interact (condition to interact) - GO_FLAG_TRANSPORT = 0x08, //any kind of transport? Object can transport (elevator, boat, car) - GO_FLAG_UNK1 = 0x10, // - GO_FLAG_NODESPAWN = 0x20, //never despawn, typically for doors, they just change state - GO_FLAG_TRIGGERED = 0x40, //typically, summoned objects. Triggered by spell or other events + GO_FLAG_IN_USE = 0x00000001, //disables interaction while animated + GO_FLAG_LOCKED = 0x00000002, //require key, spell, event, etc to be opened. Makes "Locked" appear in tooltip + GO_FLAG_INTERACT_COND = 0x00000004, //cannot interact (condition to interact) + GO_FLAG_TRANSPORT = 0x00000008, //any kind of transport? Object can transport (elevator, boat, car) + GO_FLAG_UNK1 = 0x00000010, // + GO_FLAG_NODESPAWN = 0x00000020, //never despawn, typically for doors, they just change state + GO_FLAG_TRIGGERED = 0x00000040 //typically, summoned objects. Triggered by spell or other events }; enum TextEmotes @@ -1503,7 +1502,7 @@ enum CreatureFamily CREATURE_FAMILY_SPIDER = 3, CREATURE_FAMILY_BEAR = 4, CREATURE_FAMILY_BOAR = 5, - CREATURE_FAMILY_CROCILISK = 6, + CREATURE_FAMILY_CROCOLISK = 6, CREATURE_FAMILY_CARRION_BIRD = 7, CREATURE_FAMILY_CRAB = 8, CREATURE_FAMILY_GORILLA = 9, @@ -1533,9 +1532,9 @@ enum CreatureFamily enum CreatureTypeFlags { - CREATURE_TYPEFLAGS_TAMEBLE = 0x0001, + CREATURE_TYPEFLAGS_TAMEABLE = 0x0001, CREATURE_TYPEFLAGS_HERBLOOT = 0x0100, - CREATURE_TYPEFLAGS_MININGLOOT = 0x0200, + CREATURE_TYPEFLAGS_MININGLOOT = 0x0200 }; enum CreatureEliteType diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index f1fa68b8a..458fa8af6 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -270,6 +270,7 @@ Spell::Spell( Unit* Caster, SpellEntry const *info, bool triggered, uint64 origi m_triggeringContainer = triggeringContainer; m_referencedFromCurrentSpell = false; m_executedCurrently = false; + m_delayStart = 0; m_delayAtDamageCount = 0; m_applyMultiplierMask = 0; @@ -2624,17 +2625,13 @@ void Spell::SendSpellStart() if(!IsNeedSendToClient()) return; - sLog.outDebug("Sending SMSG_SPELL_START id=%u",m_spellInfo->Id); + sLog.outDebug("Sending SMSG_SPELL_START id=%u", m_spellInfo->Id); - uint16 castFlags = CAST_FLAG_UNKNOWN1; + uint32 castFlags = CAST_FLAG_UNKNOWN1; if(IsRangedSpell()) castFlags |= CAST_FLAG_AMMO; - Unit * target; - if(!m_targets.getUnitTarget()) - target = m_caster; - else - target = m_targets.getUnitTarget(); + Unit *target = m_targets.getUnitTarget() ? m_targets.getUnitTarget() : m_caster; WorldPacket data(SMSG_SPELL_START, (8+8+4+4+2)); if(m_CastItem) @@ -2662,17 +2659,13 @@ void Spell::SendSpellGo() if(!IsNeedSendToClient()) return; - sLog.outDebug("Sending SMSG_SPELL_GO id=%u",m_spellInfo->Id); + sLog.outDebug("Sending SMSG_SPELL_GO id=%u", m_spellInfo->Id); - Unit * target; - if(!m_targets.getUnitTarget()) - target = m_caster; - else - target = m_targets.getUnitTarget(); + Unit *target = m_targets.getUnitTarget() ? m_targets.getUnitTarget() : m_caster; - uint16 castFlags = CAST_FLAG_UNKNOWN3; + uint32 castFlags = CAST_FLAG_UNKNOWN3; if(IsRangedSpell()) - castFlags |= CAST_FLAG_AMMO; + castFlags |= CAST_FLAG_AMMO; // arrows/bullets visual WorldPacket data(SMSG_SPELL_GO, 50); // guess size if(m_CastItem) @@ -2773,7 +2766,7 @@ void Spell::SendLogExecute() data << uint32(count1); // count1 (effect count?) for(uint32 i = 0; i < count1; ++i) { - data << uint32(m_spellInfo->Effect[0]); // spell effect? + data << uint32(m_spellInfo->Effect[0]); // spell effect uint32 count2 = 1; data << uint32(count2); // count2 (target count?) for(uint32 j = 0; j < count2; ++j) @@ -2897,7 +2890,7 @@ void Spell::SendChannelUpdate(uint32 time) WorldPacket data( MSG_CHANNEL_UPDATE, 8+4 ); data.append(m_caster->GetPackGUID()); - data << time; + data << uint32(time); ((Player*)m_caster)->GetSession()->SendPacket( &data ); } @@ -2934,8 +2927,8 @@ void Spell::SendChannelStart(uint32 duration) { WorldPacket data( MSG_CHANNEL_START, (8+4+4) ); data.append(m_caster->GetPackGUID()); - data << m_spellInfo->Id; - data << duration; + data << uint32(m_spellInfo->Id); + data << uint32(duration); ((Player*)m_caster)->GetSession()->SendPacket( &data ); } @@ -2961,8 +2954,8 @@ void Spell::SendPlaySpellVisual(uint32 SpellID) return; WorldPacket data(SMSG_PLAY_SPELL_VISUAL, 12); - data << m_caster->GetGUID(); - data << SpellID; + data << uint64(m_caster->GetGUID()); + data << uint32(SpellID); // spell visual id? ((Player*)m_caster)->GetSession()->SendPacket(&data); } @@ -3963,7 +3956,9 @@ uint8 Spell::CanCast(bool strict) if(int32(m_targets.getUnitTarget()->getLevel()) > CalculateDamage(i,m_targets.getUnitTarget())) return SPELL_FAILED_HIGHLEVEL; - };break; + + break; + } case SPELL_AURA_MOUNTED: { if (m_caster->IsInWater()) @@ -3996,7 +3991,9 @@ uint8 Spell::CanCast(bool strict) // can be casted at non-friendly unit or own pet/charm if(m_caster->IsFriendlyTo(m_targets.getUnitTarget())) return SPELL_FAILED_TARGET_FRIENDLY; - };break; + + break; + } case SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED: case SPELL_AURA_FLY: { @@ -4007,7 +4004,9 @@ uint8 Spell::CanCast(bool strict) GetVirtualMapForMapAndZone(m_caster->GetMapId(),m_caster->GetZoneId()) != 530) return SPELL_FAILED_NOT_HERE; } - };break; + + break; + } case SPELL_AURA_PERIODIC_MANA_LEECH: { if (!m_targets.getUnitTarget()) @@ -4018,9 +4017,11 @@ uint8 Spell::CanCast(bool strict) if(m_targets.getUnitTarget()->getPowerType()!=POWER_MANA) return SPELL_FAILED_BAD_TARGETS; + break; } - default:break; + default: + break; } } @@ -4143,7 +4144,7 @@ uint8 Spell::CheckCasterAuras() const else if(m_caster->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED) && m_spellInfo->PreventionType==SPELL_PREVENTION_TYPE_PACIFY) prevented_reason = SPELL_FAILED_PACIFIED; - // Attr must make flag drop spell totally immuned from all effects + // Attr must make flag drop spell totally immune from all effects if(prevented_reason) { if(school_immune || mechanic_immune || dispel_immune) diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index 8cb0bcb3c..a9699c70a 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -1975,7 +1975,7 @@ void Aura::HandleAuraDummy(bool apply, bool Real) ( GetSpellProto()->EffectApplyAuraName[0]==1 || GetSpellProto()->EffectApplyAuraName[0]==128 ) ) ) { // spells with SpellEffect=72 and aura=4: 6196, 6197, 21171, 21425 - m_target->SetUInt64Value(PLAYER_FARSIGHT, 0); + ((Player*)m_target)->SetFarSight(NULL); WorldPacket data(SMSG_CLEAR_FAR_SIGHT_IMMEDIATE, 0); ((Player*)m_target)->GetSession()->SendPacket(&data); return; @@ -2844,7 +2844,7 @@ void Aura::HandleBindSight(bool apply, bool Real) if(!caster || caster->GetTypeId() != TYPEID_PLAYER) return; - caster->SetUInt64Value(PLAYER_FARSIGHT,apply ? m_target->GetGUID() : 0); + ((Player*)caster)->SetFarSight(apply ? m_target->GetGUID() : NULL); } void Aura::HandleFarSight(bool apply, bool Real) @@ -2853,7 +2853,7 @@ void Aura::HandleFarSight(bool apply, bool Real) if(!caster || caster->GetTypeId() != TYPEID_PLAYER) return; - caster->SetUInt64Value(PLAYER_FARSIGHT,apply ? m_modifier.m_miscvalue : 0); + ((Player*)caster)->SetFarSight(apply ? m_target->GetGUID() : NULL); } void Aura::HandleAuraTrackCreatures(bool apply, bool Real) @@ -2959,7 +2959,7 @@ void Aura::HandleModPossess(bool apply, bool Real) } } if(caster->GetTypeId() == TYPEID_PLAYER) - caster->SetUInt64Value(PLAYER_FARSIGHT,apply ? m_target->GetGUID() : 0); + ((Player*)caster)->SetFarSight(apply ? m_target->GetGUID() : NULL); } void Aura::HandleModPossessPet(bool apply, bool Real) @@ -3661,7 +3661,7 @@ void Aura::HandleAuraModIncreaseFlightSpeed(bool apply, bool Real) m_target->SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID,16314); } - m_target->UpdateSpeed(MOVE_FLY, true); + m_target->UpdateSpeed(MOVE_FLIGHT, true); } void Aura::HandleAuraModIncreaseSwimSpeed(bool /*apply*/, bool Real) @@ -3681,7 +3681,7 @@ void Aura::HandleAuraModDecreaseSpeed(bool /*apply*/, bool Real) m_target->UpdateSpeed(MOVE_RUN, true); m_target->UpdateSpeed(MOVE_SWIM, true); - m_target->UpdateSpeed(MOVE_FLY, true); + m_target->UpdateSpeed(MOVE_FLIGHT, true); } void Aura::HandleAuraModUseNormalSpeed(bool /*apply*/, bool Real) @@ -3692,7 +3692,7 @@ void Aura::HandleAuraModUseNormalSpeed(bool /*apply*/, bool Real) m_target->UpdateSpeed(MOVE_RUN, true); m_target->UpdateSpeed(MOVE_SWIM, true); - m_target->UpdateSpeed(MOVE_FLY, true); + m_target->UpdateSpeed(MOVE_FLIGHT, true); } /*********************************************************/ @@ -4681,21 +4681,24 @@ void Aura::HandleAuraModIncreaseEnergy(bool apply, bool Real) if(int32(powerType) != m_modifier.m_miscvalue) return; - m_target->HandleStatModifier(UnitMods(UNIT_MOD_POWER_START + powerType), TOTAL_VALUE, float(m_modifier.m_amount), apply); + UnitMods unitMod = UnitMods(UNIT_MOD_POWER_START + powerType); + + m_target->HandleStatModifier(unitMod, TOTAL_VALUE, float(m_modifier.m_amount), apply); } -void Aura::HandleAuraModIncreaseEnergyPercent(bool apply, bool Real) +void Aura::HandleAuraModIncreaseEnergyPercent(bool apply, bool /*Real*/) { Powers powerType = m_target->getPowerType(); if(int32(powerType) != m_modifier.m_miscvalue) return; - m_target->HandleStatModifier(UnitMods(UNIT_MOD_POWER_START + powerType), TOTAL_PCT, float(m_modifier.m_amount), apply); + UnitMods unitMod = UnitMods(UNIT_MOD_POWER_START + powerType); + + m_target->HandleStatModifier(unitMod, TOTAL_PCT, float(m_modifier.m_amount), apply); } -void Aura::HandleAuraModIncreaseHealthPercent(bool apply, bool Real) +void Aura::HandleAuraModIncreaseHealthPercent(bool apply, bool /*Real*/) { - //m_target->ApplyMaxHealthPercentMod(m_modifier.m_amount,apply); m_target->HandleStatModifier(UNIT_MOD_HEALTH, TOTAL_PCT, float(m_modifier.m_amount), apply); } diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index 767cd8ea7..5634cc249 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -887,7 +887,7 @@ void Spell::EffectDummy(uint32 i) if (!m_caster->HasAuraType(SPELL_AURA_MOUNTED)) return; - float flyspeed = m_caster->GetSpeedRate(MOVE_FLY); + float flyspeed = m_caster->GetSpeedRate(MOVE_FLIGHT); float speed = m_caster->GetSpeedRate(MOVE_RUN); m_caster->RemoveSpellsCausingAura(SPELL_AURA_MOUNTED); @@ -3250,17 +3250,17 @@ void Spell::EffectSummon(uint32 i) if(duration > 0) spawnCreature->SetDuration(duration); - spawnCreature->SetUInt64Value(UNIT_FIELD_SUMMONEDBY,m_caster->GetGUID()); - spawnCreature->SetUInt32Value(UNIT_NPC_FLAGS , 0); + spawnCreature->SetOwnerGUID(m_caster->GetGUID()); + spawnCreature->SetUInt32Value(UNIT_NPC_FLAGS, 0); spawnCreature->setPowerType(POWER_MANA); - spawnCreature->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE,m_caster->getFaction()); - spawnCreature->SetUInt32Value(UNIT_FIELD_FLAGS,0); - spawnCreature->SetUInt32Value(UNIT_FIELD_BYTES_0,2048); - spawnCreature->SetUInt32Value(UNIT_FIELD_BYTES_1,0); - spawnCreature->SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP,0); - spawnCreature->SetUInt32Value(UNIT_FIELD_PETEXPERIENCE,0); - spawnCreature->SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP,1000); - spawnCreature->SetUInt64Value(UNIT_FIELD_CREATEDBY, m_caster->GetGUID()); + spawnCreature->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, m_caster->getFaction()); + spawnCreature->SetUInt32Value(UNIT_FIELD_FLAGS, 0); + spawnCreature->SetUInt32Value(UNIT_FIELD_BYTES_0, 2048); + spawnCreature->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + spawnCreature->SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, 0); + spawnCreature->SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, 0); + spawnCreature->SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, 1000); + spawnCreature->SetCreatorGUID(m_caster->GetGUID()); spawnCreature->SetUInt32Value(UNIT_CREATED_BY_SPELL, m_spellInfo->Id); spawnCreature->InitStatsForLevel(level); @@ -3522,7 +3522,8 @@ void Spell::EffectAddFarsight(uint32 i) dynObj->SetUInt32Value(DYNAMICOBJECT_BYTES, 0x80000002); m_caster->AddDynObject(dynObj); dynObj->GetMap()->Add(dynObj); - m_caster->SetUInt64Value(PLAYER_FARSIGHT, dynObj->GetGUID()); + if(m_caster->GetTypeId() == TYPEID_PLAYER) + ((Player*)m_caster)->SetFarSight(dynObj->GetGUID()); } void Spell::EffectSummonWild(uint32 i) @@ -3679,14 +3680,14 @@ void Spell::EffectSummonGuardian(uint32 i) if(duration > 0) spawnCreature->SetDuration(duration); - spawnCreature->SetUInt64Value(UNIT_FIELD_SUMMONEDBY,m_caster->GetGUID()); + spawnCreature->SetOwnerGUID(m_caster->GetGUID()); spawnCreature->setPowerType(POWER_MANA); spawnCreature->SetUInt32Value(UNIT_NPC_FLAGS , 0); spawnCreature->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE,m_caster->getFaction()); spawnCreature->SetUInt32Value(UNIT_FIELD_FLAGS,0); spawnCreature->SetUInt32Value(UNIT_FIELD_BYTES_1,0); spawnCreature->SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP,0); - spawnCreature->SetUInt64Value(UNIT_FIELD_CREATEDBY, m_caster->GetGUID()); + spawnCreature->SetCreatorGUID(m_caster->GetGUID()); spawnCreature->SetUInt32Value(UNIT_CREATED_BY_SPELL, m_spellInfo->Id); spawnCreature->InitStatsForLevel(level); @@ -4088,15 +4089,15 @@ void Spell::EffectSummonPet(uint32 i) NewSummon->GetCharmInfo()->SetReactState(REACT_DEFENSIVE); } - NewSummon->SetUInt64Value(UNIT_FIELD_SUMMONEDBY, m_caster->GetGUID()); - NewSummon->SetUInt64Value(UNIT_FIELD_CREATEDBY, m_caster->GetGUID()); - NewSummon->SetUInt32Value(UNIT_NPC_FLAGS , 0); + NewSummon->SetOwnerGUID(m_caster->GetGUID()); + NewSummon->SetCreatorGUID(m_caster->GetGUID()); + NewSummon->SetUInt32Value(UNIT_NPC_FLAGS, 0); NewSummon->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, faction); - NewSummon->SetUInt32Value(UNIT_FIELD_BYTES_0,2048); - NewSummon->SetUInt32Value(UNIT_FIELD_BYTES_1,0); - NewSummon->SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP,time(NULL)); - NewSummon->SetUInt32Value(UNIT_FIELD_PETEXPERIENCE,0); - NewSummon->SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP,1000); + NewSummon->SetUInt32Value(UNIT_FIELD_BYTES_0, 2048); + NewSummon->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); + NewSummon->SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, time(NULL)); + NewSummon->SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, 0); + NewSummon->SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, 1000); NewSummon->SetUInt32Value(UNIT_CREATED_BY_SPELL, m_spellInfo->Id); NewSummon->GetCharmInfo()->SetPetNumber(pet_number, true); @@ -4105,7 +4106,7 @@ void Spell::EffectSummonPet(uint32 i) // this enables popup window (pet dismiss, cancel), hunter pet additional flags set later NewSummon->SetUInt32Value(UNIT_FIELD_FLAGS,UNIT_FLAG_PVP_ATTACKABLE); - NewSummon->InitStatsForLevel( petlevel); + NewSummon->InitStatsForLevel(petlevel); NewSummon->InitPetCreateSpells(); if(NewSummon->getPetType()==SUMMON_PET) @@ -5703,8 +5704,8 @@ void Spell::EffectSummonCritter(uint32 i) return; } - critter->SetUInt64Value(UNIT_FIELD_SUMMONEDBY,m_caster->GetGUID()); - critter->SetUInt64Value(UNIT_FIELD_CREATEDBY,m_caster->GetGUID()); + critter->SetOwnerGUID(m_caster->GetGUID()); + critter->SetCreatorGUID(m_caster->GetGUID()); critter->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE,m_caster->getFaction()); critter->SetUInt32Value(UNIT_CREATED_BY_SPELL, m_spellInfo->Id); diff --git a/src/game/SpellHandler.cpp b/src/game/SpellHandler.cpp index ecc17cf70..de379d91e 100644 --- a/src/game/SpellHandler.cpp +++ b/src/game/SpellHandler.cpp @@ -260,7 +260,7 @@ void WorldSession::HandleOpenItemOpcode(WorldPacket& recvPacket) void WorldSession::HandleGameObjectUseOpcode( WorldPacket & recv_data ) { - CHECK_PACKET_SIZE(recv_data,8); + CHECK_PACKET_SIZE(recv_data, 8); uint64 guid; diff --git a/src/game/StatSystem.cpp b/src/game/StatSystem.cpp index f2157017a..d94e68fef 100644 --- a/src/game/StatSystem.cpp +++ b/src/game/StatSystem.cpp @@ -848,6 +848,7 @@ void Pet::UpdateMaxHealth() void Pet::UpdateMaxPower(Powers power) { UnitMods unitMod = UnitMods(UNIT_MOD_POWER_START + power); + float addValue = (power == POWER_MANA) ? GetStat(STAT_INTELLECT) - GetCreateStat(STAT_INTELLECT) : 0.0f; float value = GetModifierValue(unitMod, BASE_VALUE) + GetCreatePowers(power); diff --git a/src/game/TaxiHandler.cpp b/src/game/TaxiHandler.cpp index 76736227c..30c6df133 100644 --- a/src/game/TaxiHandler.cpp +++ b/src/game/TaxiHandler.cpp @@ -82,7 +82,7 @@ void WorldSession::HandleTaxiQueryAvailableNodesOpcode( WorldPacket & recv_data Creature *unit = ObjectAccessor::GetNPCIfCanInteractWith(*_player, guid, UNIT_NPC_FLAG_FLIGHTMASTER); if (!unit) { - sLog.outDebug( "WORLD: HandleTaxiQueryAvailableNodesOpcode - Unit (GUID: %u) not found or you can't interact with him.", uint32(GUID_LOPART(guid)) ); + sLog.outDebug( "WORLD: HandleTaxiQueryAvailableNodes - Unit (GUID: %u) not found or you can't interact with him.", uint32(GUID_LOPART(guid)) ); return; } diff --git a/src/game/Totem.cpp b/src/game/Totem.cpp index 5c708bf0c..5f21b7cd9 100644 --- a/src/game/Totem.cpp +++ b/src/game/Totem.cpp @@ -128,10 +128,9 @@ void Totem::UnSummon() void Totem::SetOwner(uint64 guid) { - SetUInt64Value(UNIT_FIELD_SUMMONEDBY, guid); - SetUInt64Value(UNIT_FIELD_CREATEDBY, guid); - Unit *owner = GetOwner(); - if (owner) + SetCreatorGUID(guid); + SetOwnerGUID(guid); + if (Unit *owner = GetOwner()) { setFaction(owner->getFaction()); SetLevel(owner->getLevel()); diff --git a/src/game/Traveller.h b/src/game/Traveller.h index 9256b9162..2d112896f 100644 --- a/src/game/Traveller.h +++ b/src/game/Traveller.h @@ -62,7 +62,7 @@ inline float Traveller::Speed() if(i_traveller.HasUnitMovementFlag(MOVEMENTFLAG_WALK_MODE)) return i_traveller.GetSpeed(MOVE_WALK); else if(i_traveller.HasUnitMovementFlag(MOVEMENTFLAG_FLYING2)) - return i_traveller.GetSpeed(MOVE_FLY); + return i_traveller.GetSpeed(MOVE_FLIGHT); else return i_traveller.GetSpeed(MOVE_RUN); } diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index f58e54e7d..0809a6404 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -50,12 +50,12 @@ float baseMoveSpeed[MAX_MOVE_TYPE] = { 2.5f, // MOVE_WALK 7.0f, // MOVE_RUN - 1.25f, // MOVE_WALKBACK + 1.25f, // MOVE_RUN_BACK 4.722222f, // MOVE_SWIM - 4.5f, // MOVE_SWIMBACK - 3.141594f, // MOVE_TURN - 7.0f, // MOVE_FLY - 4.5f, // MOVE_FLYBACK + 4.5f, // MOVE_SWIM_BACK + 3.141594f, // MOVE_TURN_RATE + 7.0f, // MOVE_FLIGHT + 4.5f, // MOVE_FLIGHT_BACK }; // auraTypes contains attacker auras capable of proc'ing cast auras @@ -1462,9 +1462,8 @@ uint32 Unit::SpellNonMeleeDamageLog(Unit *pVictim, uint32 spellID, uint32 damage void Unit::HandleEmoteCommand(uint32 anim_id) { WorldPacket data( SMSG_EMOTE, 12 ); - data << anim_id << GetGUID(); - WPAssert(data.size() == 12); - + data << uint32(anim_id); + data << uint64(GetGUID()); SendMessageToSet(&data, true); } @@ -2579,8 +2578,8 @@ float Unit::CalculateLevelPenalty(SpellEntry const* spellProto) const void Unit::SendAttackStart(Unit* pVictim) { WorldPacket data( SMSG_ATTACKSTART, 16 ); - data << GetGUID(); - data << pVictim->GetGUID(); + data << uint64(GetGUID()); + data << uint64(pVictim->GetGUID()); SendMessageToSet(&data, true); DEBUG_LOG( "WORLD: Sent SMSG_ATTACKSTART" ); @@ -6901,7 +6900,7 @@ bool Unit::Attack(Unit *victim, bool meleeAttack) if(GetTypeId()==TYPEID_UNIT) { WorldPacket data(SMSG_AI_REACTION, 12); - data << GetGUID(); + data << uint64(GetGUID()); data << uint32(AI_REACTION_AGGRO); // Aggro sound ((WorldObject*)this)->SendMessageToSet(&data, true); @@ -7117,17 +7116,17 @@ Unit* Unit::GetCharm() const void Unit::SetPet(Pet* pet) { - SetUInt64Value(UNIT_FIELD_SUMMON,pet ? pet->GetGUID() : 0); + SetUInt64Value(UNIT_FIELD_SUMMON, pet ? pet->GetGUID() : 0); // FIXME: hack, speed must be set only at follow if(pet) for(int i = 0; i < MAX_MOVE_TYPE; ++i) - pet->SetSpeed(UnitMoveType(i),m_speed_rate[i],true); + pet->SetSpeed(UnitMoveType(i), m_speed_rate[i], true); } -void Unit::SetCharm(Unit* charmed) +void Unit::SetCharm(Unit* pet) { - SetUInt64Value(UNIT_FIELD_CHARM,charmed ? charmed->GetGUID() : 0); + SetUInt64Value(UNIT_FIELD_CHARM, pet ? pet->GetGUID() : 0); } void Unit::UnsummonAllTotems() @@ -7164,7 +7163,6 @@ void Unit::SendEnergizeSpellLog(Unit *pVictim, uint32 SpellID, uint32 Damage, Po data << uint32(SpellID); data << uint32(powertype); data << uint32(Damage); - //data << uint8(critical ? 1 : 0); // removed in 2.4.0 SendMessageToSet(&data, true); } @@ -7621,7 +7619,7 @@ int32 Unit::SpellBaseDamageBonusForVictim(SpellSchoolMask schoolMask, Unit *pVic bool Unit::isSpellCrit(Unit *pVictim, SpellEntry const *spellProto, SpellSchoolMask schoolMask, WeaponAttackType attackType) { - // not criting spell + // not critting spell if((spellProto->AttributesEx2 & SPELL_ATTR_EX2_CANT_CRIT)) return false; @@ -8809,16 +8807,16 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) } break; } - case MOVE_WALKBACK: + case MOVE_RUN_BACK: return; case MOVE_SWIM: { main_speed_mod = GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_SWIM_SPEED); break; } - case MOVE_SWIMBACK: + case MOVE_SWIM_BACK: return; - case MOVE_FLY: + case MOVE_FLIGHT: { if (IsMounted()) // Use on mount auras main_speed_mod = GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED); @@ -8828,7 +8826,7 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) non_stack_bonus = (100.0 + GetMaxPositiveAuraModifier(SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACK))/100.0f; break; } - case MOVE_FLYBACK: + case MOVE_FLIGHT_BACK: return; default: sLog.outError("Unit::UpdateSpeed: Unsupported move type (%d)", mtype); @@ -8843,7 +8841,7 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) { case MOVE_RUN: case MOVE_SWIM: - case MOVE_FLY: + case MOVE_FLIGHT: { // Normalize speed by 191 aura SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED if need // TODO: possible affect only on MOVE_RUN @@ -8900,22 +8898,22 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced) case MOVE_RUN: data.Initialize(MSG_MOVE_SET_RUN_SPEED, 8+4+1+4+4+4+4+4+4+4); break; - case MOVE_WALKBACK: + case MOVE_RUN_BACK: data.Initialize(MSG_MOVE_SET_RUN_BACK_SPEED, 8+4+1+4+4+4+4+4+4+4); break; case MOVE_SWIM: data.Initialize(MSG_MOVE_SET_SWIM_SPEED, 8+4+1+4+4+4+4+4+4+4); break; - case MOVE_SWIMBACK: + case MOVE_SWIM_BACK: data.Initialize(MSG_MOVE_SET_SWIM_BACK_SPEED, 8+4+1+4+4+4+4+4+4+4); break; - case MOVE_TURN: + case MOVE_TURN_RATE: data.Initialize(MSG_MOVE_SET_TURN_RATE, 8+4+1+4+4+4+4+4+4+4); break; - case MOVE_FLY: + case MOVE_FLIGHT: data.Initialize(MSG_MOVE_SET_FLIGHT_SPEED, 8+4+1+4+4+4+4+4+4+4); break; - case MOVE_FLYBACK: + case MOVE_FLIGHT_BACK: data.Initialize(MSG_MOVE_SET_FLIGHT_BACK_SPEED, 8+4+1+4+4+4+4+4+4+4); break; default: @@ -8948,22 +8946,22 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced) case MOVE_RUN: data.Initialize(SMSG_FORCE_RUN_SPEED_CHANGE, 17); break; - case MOVE_WALKBACK: + case MOVE_RUN_BACK: data.Initialize(SMSG_FORCE_RUN_BACK_SPEED_CHANGE, 16); break; case MOVE_SWIM: data.Initialize(SMSG_FORCE_SWIM_SPEED_CHANGE, 16); break; - case MOVE_SWIMBACK: + case MOVE_SWIM_BACK: data.Initialize(SMSG_FORCE_SWIM_BACK_SPEED_CHANGE, 16); break; - case MOVE_TURN: + case MOVE_TURN_RATE: data.Initialize(SMSG_FORCE_TURN_RATE_CHANGE, 16); break; - case MOVE_FLY: + case MOVE_FLIGHT: data.Initialize(SMSG_FORCE_FLIGHT_SPEED_CHANGE, 16); break; - case MOVE_FLYBACK: + case MOVE_FLIGHT_BACK: data.Initialize(SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE, 16); break; default: @@ -8971,7 +8969,7 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced) return; } data.append(GetPackGUID()); - data << (uint32)0; + data << (uint32)0; // moveEvent, NUM_PMOVE_EVTS = 0x39 if (mtype == MOVE_RUN) data << uint8(0); // new 2.1.0 data << float(GetSpeed(mtype)); @@ -10753,9 +10751,9 @@ Pet* Unit::CreateTamedPetFrom(Creature* creatureTarget,uint32 spell_id) return NULL; } - pet->SetUInt64Value(UNIT_FIELD_SUMMONEDBY, GetGUID()); - pet->SetUInt64Value(UNIT_FIELD_CREATEDBY, GetGUID()); - pet->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE,getFaction()); + pet->SetOwnerGUID(GetGUID()); + pet->SetCreatorGUID(GetGUID()); + pet->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, getFaction()); pet->SetUInt32Value(UNIT_CREATED_BY_SPELL, spell_id); if(!pet->InitStatsForLevel(creatureTarget->getLevel())) diff --git a/src/game/Unit.h b/src/game/Unit.h index e4df75950..45a31f668 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -366,14 +366,14 @@ enum UnitState enum UnitMoveType { - MOVE_WALK = 0, - MOVE_RUN = 1, - MOVE_WALKBACK = 2, - MOVE_SWIM = 3, - MOVE_SWIMBACK = 4, - MOVE_TURN = 5, - MOVE_FLY = 6, - MOVE_FLYBACK = 7 + MOVE_WALK = 0, + MOVE_RUN = 1, + MOVE_RUN_BACK = 2, + MOVE_SWIM = 3, + MOVE_SWIM_BACK = 4, + MOVE_TURN_RATE = 5, + MOVE_FLIGHT = 6, + MOVE_FLIGHT_BACK = 7, }; #define MAX_MOVE_TYPE 8 @@ -948,11 +948,14 @@ class MANGOS_DLL_SPEC Unit : public WorldObject DeathState getDeathState() { return m_deathState; }; virtual void setDeathState(DeathState s); // overwrited in Creature/Player/Pet - uint64 const& GetOwnerGUID() const { return GetUInt64Value(UNIT_FIELD_SUMMONEDBY); } + uint64 GetOwnerGUID() const { return GetUInt64Value(UNIT_FIELD_SUMMONEDBY); } + void SetOwnerGUID(uint64 owner) { SetUInt64Value(UNIT_FIELD_SUMMONEDBY, owner); } + uint64 GetCreatorGUID() const { return GetUInt64Value(UNIT_FIELD_CREATEDBY); } + void SetCreatorGUID(uint64 creator) { SetUInt64Value(UNIT_FIELD_CREATEDBY, creator); } uint64 GetPetGUID() const { return GetUInt64Value(UNIT_FIELD_SUMMON); } uint64 GetCharmerGUID() const { return GetUInt64Value(UNIT_FIELD_CHARMEDBY); } - uint64 GetCharmGUID() const { return GetUInt64Value(UNIT_FIELD_CHARM); } void SetCharmerGUID(uint64 owner) { SetUInt64Value(UNIT_FIELD_CHARMEDBY, owner); } + uint64 GetCharmGUID() const { return GetUInt64Value(UNIT_FIELD_CHARM); } uint64 GetCharmerOrOwnerGUID() const { return GetCharmerGUID() ? GetCharmerGUID() : GetOwnerGUID(); } uint64 GetCharmerOrOwnerOrOwnGUID() const @@ -981,6 +984,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject void SetPet(Pet* pet); void SetCharm(Unit* pet); + bool isCharmed() const { return GetCharmerGUID() != 0; } CharmInfo* GetCharmInfo() { return m_charmInfo; } @@ -1116,7 +1120,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject AuraList const& GetSingleCastAuras() const { return m_scAuras; } SpellImmuneList m_spellImmune[MAX_SPELL_IMMUNITY]; - // Threat related methodes + // Threat related methods bool CanHaveThreatList() const; void AddThreat(Unit* pVictim, float threat, SpellSchoolMask schoolMask = SPELL_SCHOOL_MASK_NORMAL, SpellEntry const *threatSpell = NULL); float ApplyTotalThreatModifier(float threat, SpellSchoolMask schoolMask = SPELL_SCHOOL_MASK_NORMAL); diff --git a/src/game/WaypointMovementGenerator.cpp b/src/game/WaypointMovementGenerator.cpp index 77a9a2eb3..64061487c 100644 --- a/src/game/WaypointMovementGenerator.cpp +++ b/src/game/WaypointMovementGenerator.cpp @@ -42,8 +42,7 @@ alter table creature_movement add `wpguid` int(11) default '0'; #include //-----------------------------------------------// -void -WaypointMovementGenerator::LoadPath(Creature &c) +void WaypointMovementGenerator::LoadPath(Creature &c) { sLog.outDetail("LoadPath: loading waypoint path for creature %d,%d", c.GetGUIDLow(), c.GetDBTableGUIDLow()); @@ -60,26 +59,23 @@ WaypointMovementGenerator::LoadPath(Creature &c) for(uint32 i = 0; i < node_count-1; i++) i_hasDone[i] = false; - // to prevent a misbehaviour inside "update" + // to prevent a misbehavior inside "update" // update is always called with the next wp - but the wpSys needs the current // so when the routine is called the first time, wpSys gets the last waypoint // and this prevents the system from performing text/emote, etc i_hasDone[node_count - 1] = true; } -void -WaypointMovementGenerator::ClearWaypoints() +void WaypointMovementGenerator::ClearWaypoints() { i_path = NULL; } -void -WaypointMovementGenerator::Initialize() +void WaypointMovementGenerator::Initialize() { } -bool -WaypointMovementGenerator::Update(Creature &creature, const uint32 &diff) +bool WaypointMovementGenerator::Update(Creature &creature, const uint32 &diff) { if(!&creature) return true; @@ -104,7 +100,7 @@ WaypointMovementGenerator::Update(Creature &creature, const uint32 &di i_nextMoveTime.Update(diff); i_destinationHolder.UpdateTraveller(traveller, diff, false, true); - // creature has been stoped in middle of the waypoint segment + // creature has been stopped in middle of the waypoint segment if (!i_destinationHolder.HasArrived() && creature.IsStopped()) { if( i_nextMoveTime.Passed()) // Timer has elapsed, meaning this part controlled it @@ -214,14 +210,12 @@ void WaypointMovementGenerator::MovementInform(Creature &unit) } //----------------------------------------------------// -void -FlightPathMovementGenerator::LoadPath(Player &) +void FlightPathMovementGenerator::LoadPath(Player &) { objmgr.GetTaxiPathNodes(i_pathId, i_path,i_mapIds); } -uint32 -FlightPathMovementGenerator::GetPathAtMapEnd() const +uint32 FlightPathMovementGenerator::GetPathAtMapEnd() const { if(i_currentNode >= i_mapIds.size()) return i_mapIds.size(); @@ -236,8 +230,7 @@ FlightPathMovementGenerator::GetPathAtMapEnd() const return i_mapIds.size(); } -void -FlightPathMovementGenerator::Initialize(Player &player) +void FlightPathMovementGenerator::Initialize(Player &player) { player.getHostilRefManager().setOnlineOfflineState(false); player.addUnitState(UNIT_STAT_IN_FLIGHT); @@ -252,7 +245,6 @@ FlightPathMovementGenerator::Initialize(Player &player) void FlightPathMovementGenerator::Finalize(Player & player) { - float x, y, z; i_destinationHolder.GetLocationNow(player.GetMapId(), x, y, z); player.SetPosition(x, y, z, player.GetOrientation()); @@ -272,8 +264,7 @@ void FlightPathMovementGenerator::Finalize(Player & player) } } -bool -FlightPathMovementGenerator::Update(Player &player, const uint32 &diff) +bool FlightPathMovementGenerator::Update(Player &player, const uint32 &diff) { if( MovementInProgress() ) { @@ -308,8 +299,7 @@ FlightPathMovementGenerator::Update(Player &player, const uint32 &diff) return false; } -void -FlightPathMovementGenerator::SetCurrentNodeAfterTeleport() +void FlightPathMovementGenerator::SetCurrentNodeAfterTeleport() { if(i_mapIds.empty()) return; diff --git a/src/game/WorldSession.cpp b/src/game/WorldSession.cpp index 65b93645a..8371b2596 100644 --- a/src/game/WorldSession.cpp +++ b/src/game/WorldSession.cpp @@ -480,38 +480,38 @@ void WorldSession::Handle_NULL( WorldPacket& recvPacket ) void WorldSession::Handle_EarlyProccess( WorldPacket& recvPacket ) { - sLog.outError( "SESSION: received opcode %s (0x%.4X) that must be proccessed in WorldSocket::OnRead", + sLog.outError( "SESSION: received opcode %s (0x%.4X) that must be processed in WorldSocket::OnRead", LookupOpcodeName(recvPacket.GetOpcode()), recvPacket.GetOpcode()); } void WorldSession::Handle_ServerSide( WorldPacket& recvPacket ) { - sLog.outError( "SESSION: received sever-side opcode %s (0x%.4X)", + sLog.outError( "SESSION: received server-side opcode %s (0x%.4X)", LookupOpcodeName(recvPacket.GetOpcode()), recvPacket.GetOpcode()); } -void WorldSession::Handle_Depricated( WorldPacket& recvPacket ) +void WorldSession::Handle_Deprecated( WorldPacket& recvPacket ) { - sLog.outError( "SESSION: received depricated opcode %s (0x%.4X)", + sLog.outError( "SESSION: received deprecated opcode %s (0x%.4X)", LookupOpcodeName(recvPacket.GetOpcode()), recvPacket.GetOpcode()); } void WorldSession::SendAuthWaitQue(uint32 position) - { - if(position == 0) - { - WorldPacket packet( SMSG_AUTH_RESPONSE, 1 ); - packet << uint8( AUTH_OK ); - SendPacket(&packet); - } - else - { - WorldPacket packet( SMSG_AUTH_RESPONSE, 5 ); - packet << uint8( AUTH_WAIT_QUEUE ); - packet << uint32 (position); - SendPacket(&packet); - } - } +{ + if(position == 0) + { + WorldPacket packet( SMSG_AUTH_RESPONSE, 1 ); + packet << uint8( AUTH_OK ); + SendPacket(&packet); + } + else + { + WorldPacket packet( SMSG_AUTH_RESPONSE, 5 ); + packet << uint8( AUTH_WAIT_QUEUE ); + packet << uint32 (position); + SendPacket(&packet); + } +} diff --git a/src/game/WorldSession.h b/src/game/WorldSession.h index 6bc8fc967..6a8d609d9 100644 --- a/src/game/WorldSession.h +++ b/src/game/WorldSession.h @@ -209,7 +209,7 @@ class MANGOS_DLL_SPEC WorldSession void Handle_NULL(WorldPacket& recvPacket); // not used void Handle_EarlyProccess( WorldPacket& recvPacket);// just mark packets processed in WorldSocket::OnRead void Handle_ServerSide(WorldPacket& recvPacket); // sever side only, can't be accepted from client - void Handle_Depricated(WorldPacket& recvPacket); // never used anymore by client + void Handle_Deprecated(WorldPacket& recvPacket); // never used anymore by client void HandleCharEnumOpcode(WorldPacket& recvPacket); void HandleCharDeleteOpcode(WorldPacket& recvPacket); diff --git a/src/game/WorldSocket.cpp b/src/game/WorldSocket.cpp index df46becc9..e7e0bbc55 100644 --- a/src/game/WorldSocket.cpp +++ b/src/game/WorldSocket.cpp @@ -712,7 +712,7 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket) Field* fields = result->Fetch (); - expansion = fields[8].GetUInt8 () && sWorld.getConfig (CONFIG_EXPANSION) > 0; + expansion = ((sWorld.getConfig(CONFIG_EXPANSION) > fields[8].GetUInt8()) ? fields[8].GetUInt8() : sWorld.getConfig(CONFIG_EXPANSION)); N.SetHexStr ("894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7"); g.SetDword (7); @@ -734,8 +734,8 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket) x.SetBinary (sha1.GetDigest (), sha1.GetLength ()); v = g.ModExp (x, N); - const char* sStr = s.AsHexStr (); //Must be freed by OPENSSL_free() - const char* vStr = v.AsHexStr (); //Must be freed by OPENSSL_free() + const char* sStr = s.AsHexStr (); //Must be freed by OPENSSL_free() + const char* vStr = v.AsHexStr (); //Must be freed by OPENSSL_free() const char* vold = fields[6].GetString (); DEBUG_LOG ("WorldSocket::HandleAuthSession: (s,v) check s: %s v_old: %s v_new: %s", @@ -825,7 +825,7 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket) SendPacket (packet); - sLog.outBasic ("WorldSocket::HandleAuthSession: User tryes to login but his security level is not enough"); + sLog.outBasic ("WorldSocket::HandleAuthSession: User tries to login but his security level is not enough"); return -1; } @@ -940,7 +940,7 @@ int WorldSocket::HandlePing (WorldPacket& recvPacket) ACE_GUARD_RETURN (LockType, Guard, m_SessionLock, -1); if (m_Session) - m_Session->SetLatency (latency); + m_Session->SetLatency (latency); else { sLog.outError ("WorldSocket::HandlePing: peer sent CMSG_PING, " diff --git a/src/game/debugcmds.cpp b/src/game/debugcmds.cpp index 4fd1efd80..298411fbd 100644 --- a/src/game/debugcmds.cpp +++ b/src/game/debugcmds.cpp @@ -31,6 +31,7 @@ #include "Language.h" #include "MapManager.h" #include +#include "ObjectMgr.h" bool ChatHandler::HandleDebugInArcCommand(const char* /*args*/) { @@ -59,8 +60,8 @@ bool ChatHandler::HandleDebugSpellFailCommand(const char* args) uint8 failnum = (uint8)atoi(px); WorldPacket data(SMSG_CAST_FAILED, 5); - data << (uint32)133; - data << failnum; + data << uint32(133); + data << uint8(failnum); m_session->SendPacket(&data); return true; @@ -145,11 +146,14 @@ bool ChatHandler::HandleSendOpcodeCommand(const char* /*args*/) std::string type; ifs >> type; + if(type == "") + break; + if(type == "uint8") { - uint8 val1; + uint16 val1; ifs >> val1; - data << val1; + data << uint8(val1); } else if(type == "uint16") { @@ -187,7 +191,8 @@ bool ChatHandler::HandleSendOpcodeCommand(const char* /*args*/) } else { - sLog.outDebug("Sending opcode: unknown type %s", type.c_str()); + sLog.outDebug("Sending opcode: unknown type '%s'", type.c_str()); + break; } } ifs.close(); diff --git a/src/mangosd/RASocket.h b/src/mangosd/RASocket.h index fe539af65..d9acb8284 100644 --- a/src/mangosd/RASocket.h +++ b/src/mangosd/RASocket.h @@ -50,7 +50,7 @@ class RASocket: public TcpSocket bool bLog; bool bSecure; //kick on wrong pass, non exist. user, user with no priv //will protect from DOS, bruteforce attacks - //some 'smart' protection must be added for more scurity + //some 'smart' protection must be added for more security uint8 iMinLevel; enum { diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 934202b1d..23ee369fe 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 "6888" + #define REVISION_NR "6889" #endif // __REVISION_NR_H__ From 69e9ab315f760458b7ba8d88019979f815024d1c Mon Sep 17 00:00:00 2001 From: arrai Date: Wed, 10 Dec 2008 14:43:22 +0100 Subject: [PATCH 49/56] [6890] Implemented more correct way of calculating fall damage by using fall distance and not fall time. Thanks to DasMy for finding an appropriate formula --- src/game/MovementHandler.cpp | 20 ++++++++++++-------- src/game/Player.h | 1 + src/shared/revision_nr.h | 2 +- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp index 55c7e4cf6..10f8c315b 100644 --- a/src/game/MovementHandler.cpp +++ b/src/game/MovementHandler.cpp @@ -290,22 +290,24 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) // fall damage generation (ignore in flight case that can be triggered also at lags in moment teleportation to another map). if (recv_data.GetOpcode() == MSG_MOVE_FALL_LAND && !GetPlayer()->isInFlight()) { + // calculate total z distance of the fall + float z_diff = GetPlayer()->m_fallMovementInfo.z - movementInfo.z; + sLog.outDebug("zDiff = %f", z_diff); Player *target = GetPlayer(); - //Players with Feather Fall or low fall time, or physical immunity (charges used) are ignored - if (movementInfo.fallTime > 1100 && !target->isDead() && !target->isGameMaster() && + //Players with Feather Fall or physical immunity (charges used) are ignored + if (!target->isDead() && !target->isGameMaster() && !target->HasAuraType(SPELL_AURA_HOVER) && !target->HasAuraType(SPELL_AURA_FEATHER_FALL) && !target->HasAuraType(SPELL_AURA_FLY) && !target->IsImmunedToDamage(SPELL_SCHOOL_MASK_NORMAL,true) ) { - //Safe fall, fall time reduction + //Safe fall, fall height reduction int32 safe_fall = target->GetTotalAuraModifier(SPELL_AURA_SAFE_FALL); - uint32 fall_time = (movementInfo.fallTime > (safe_fall*10)) ? movementInfo.fallTime - (safe_fall*10) : 0; - if(fall_time > 1100) //Prevent damage if fall time < 1100 + float damageperc = 0.018f*(z_diff-safe_fall)-0.2426f; + + if(damageperc >0 ) { - //Fall Damage calculation - float fallperc = float(fall_time)/1100; - uint32 damage = (uint32)(((fallperc*fallperc -1) / 9 * target->GetMaxHealth())*sWorld.getRate(RATE_DAMAGE_FALL)); + uint32 damage = (uint32)(damageperc * target->GetMaxHealth()*sWorld.getRate(RATE_DAMAGE_FALL)); float height = movementInfo.z; target->UpdateGroundPositionZ(movementInfo.x,movementInfo.y,height); @@ -359,6 +361,8 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) GetPlayer()->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o); GetPlayer()->m_movementInfo = movementInfo; + if (GetPlayer()->m_fallMovementInfo.fallTime >= movementInfo.fallTime || GetPlayer()->m_fallMovementInfo.z <=movementInfo.z) + GetPlayer()->m_fallMovementInfo = movementInfo; if(GetPlayer()->isMovingOrTurning()) GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); diff --git a/src/game/Player.h b/src/game/Player.h index 821f3bb6e..635a7ad76 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -1910,6 +1910,7 @@ class MANGOS_DLL_SPEC Player : public Unit /*** VARIOUS SYSTEMS ***/ /*********************************************************/ MovementInfo m_movementInfo; + MovementInfo m_fallMovementInfo; bool isMoving() const { return HasUnitMovementFlag(movementFlagsMask); } bool isMovingOrTurning() const { return HasUnitMovementFlag(movementOrTurningFlagsMask); } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 23ee369fe..18a39532e 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 "6889" + #define REVISION_NR "6890" #endif // __REVISION_NR_H__ From 9f8e51ff41e0e39547e33c37e36fa837272e55f5 Mon Sep 17 00:00:00 2001 From: arrai Date: Wed, 10 Dec 2008 16:01:29 +0100 Subject: [PATCH 50/56] [6891] small performance fix for previous commit --- src/game/MovementHandler.cpp | 14 +++++++++----- src/game/Player.h | 3 ++- src/shared/revision_nr.h | 2 +- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp index 10f8c315b..f94718906 100644 --- a/src/game/MovementHandler.cpp +++ b/src/game/MovementHandler.cpp @@ -291,12 +291,13 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) if (recv_data.GetOpcode() == MSG_MOVE_FALL_LAND && !GetPlayer()->isInFlight()) { // calculate total z distance of the fall - float z_diff = GetPlayer()->m_fallMovementInfo.z - movementInfo.z; + float z_diff = GetPlayer()->m_lastFallZ - movementInfo.z; sLog.outDebug("zDiff = %f", z_diff); Player *target = GetPlayer(); - //Players with Feather Fall or physical immunity (charges used) are ignored - if (!target->isDead() && !target->isGameMaster() && + //Players with low fall distance, Feather Fall or physical immunity (charges used) are ignored + // 14.57 can be calculated by resolving damageperc formular below to 0 + if (z_diff >= 14.57f && !target->isDead() && !target->isGameMaster() && !target->HasAuraType(SPELL_AURA_HOVER) && !target->HasAuraType(SPELL_AURA_FEATHER_FALL) && !target->HasAuraType(SPELL_AURA_FLY) && !target->IsImmunedToDamage(SPELL_SCHOOL_MASK_NORMAL,true) ) { @@ -361,8 +362,11 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) GetPlayer()->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o); GetPlayer()->m_movementInfo = movementInfo; - if (GetPlayer()->m_fallMovementInfo.fallTime >= movementInfo.fallTime || GetPlayer()->m_fallMovementInfo.z <=movementInfo.z) - GetPlayer()->m_fallMovementInfo = movementInfo; + if (GetPlayer()->m_lastFallTime >= movementInfo.fallTime || GetPlayer()->m_lastFallZ <=movementInfo.z) + { + GetPlayer()->m_lastFallTime = movementInfo.fallTime; + GetPlayer()->m_lastFallZ= movementInfo.z; + } if(GetPlayer()->isMovingOrTurning()) GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); diff --git a/src/game/Player.h b/src/game/Player.h index 635a7ad76..a6915fbf4 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -1910,7 +1910,8 @@ class MANGOS_DLL_SPEC Player : public Unit /*** VARIOUS SYSTEMS ***/ /*********************************************************/ MovementInfo m_movementInfo; - MovementInfo m_fallMovementInfo; + uint32 m_lastFallTime; + float m_lastFallZ; bool isMoving() const { return HasUnitMovementFlag(movementFlagsMask); } bool isMovingOrTurning() const { return HasUnitMovementFlag(movementOrTurningFlagsMask); } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 18a39532e..27a2b558c 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 "6890" + #define REVISION_NR "6891" #endif // __REVISION_NR_H__ From 2e2055c4693d4cefc514eb58a696a28291bb6df8 Mon Sep 17 00:00:00 2001 From: hunuza Date: Wed, 10 Dec 2008 16:41:46 +0100 Subject: [PATCH 51/56] [6892] Some small code clean ups and optimisations. Signed-off-by: hunuza --- src/game/Channel.cpp | 4 ++-- src/game/Channel.h | 12 +++------- src/game/CharacterHandler.cpp | 29 +++++++++--------------- src/game/Creature.cpp | 42 +++-------------------------------- src/shared/revision_nr.h | 2 +- 5 files changed, 19 insertions(+), 70 deletions(-) diff --git a/src/game/Channel.cpp b/src/game/Channel.cpp index ca7c8ff3e..2fb8b5d09 100644 --- a/src/game/Channel.cpp +++ b/src/game/Channel.cpp @@ -209,7 +209,7 @@ void Channel::KickOrBan(uint64 good, const char *badname, bool ban) if(ban && !IsBanned(bad->GetGUID())) { - banned.push_back(bad->GetGUID()); + banned.insert(bad->GetGUID()); MakePlayerBanned(&data, bad->GetGUID(), good); } else @@ -258,7 +258,7 @@ void Channel::UnBan(uint64 good, const char *badname) } else { - banned.remove(bad->GetGUID()); + banned.erase(bad->GetGUID()); WorldPacket data; MakePlayerUnbanned(&data, bad->GetGUID(), good); diff --git a/src/game/Channel.h b/src/game/Channel.h index 31e196948..fc87efdd0 100644 --- a/src/game/Channel.h +++ b/src/game/Channel.h @@ -147,7 +147,7 @@ class Channel typedef std::map PlayerList; PlayerList players; - typedef std::list BannedList; + typedef std::set BannedList; BannedList banned; bool m_announce; bool m_moderate; @@ -202,15 +202,9 @@ class Channel void SendToAllButOne(WorldPacket *data, uint64 who); void SendToOne(WorldPacket *data, uint64 who); - bool IsOn(uint64 who) const { return players.count(who) > 0; } + bool IsOn(uint64 who) const { return players.count(who) != 0; } - bool IsBanned(const uint64 guid) const - { - for(BannedList::const_iterator i = banned.begin(); i != banned.end(); ++i) - if(*i == guid) - return true; - return false; - } + bool IsBanned(const uint64 guid) const {return banned.count(guid) != 0; } bool IsFirst() const { return !(players.size() > 1); } diff --git a/src/game/CharacterHandler.cpp b/src/game/CharacterHandler.cpp index a09436590..8880a7b2e 100644 --- a/src/game/CharacterHandler.cpp +++ b/src/game/CharacterHandler.cpp @@ -904,23 +904,8 @@ void WorldSession::HandleChangePlayerNameOpcode(WorldPacket& recv_data) recv_data >> guid; recv_data >> newname; - QueryResult *result = CharacterDatabase.PQuery("SELECT at_login FROM characters WHERE guid ='%u'", GUID_LOPART(guid)); - if (result) - { - uint32 at_loginFlags; - Field *fields = result->Fetch(); - at_loginFlags = fields[0].GetUInt32(); - delete result; - - if (!(at_loginFlags & AT_LOGIN_RENAME)) - { - WorldPacket data(SMSG_CHAR_RENAME, 1); - data << (uint8)CHAR_CREATE_ERROR; - SendPacket( &data ); - return; - } - } - else + QueryResult *result = CharacterDatabase.PQuery("SELECT at_login, name FROM characters WHERE guid ='%u'", GUID_LOPART(guid)); + if (!result) { WorldPacket data(SMSG_CHAR_RENAME, 1); data << (uint8)CHAR_CREATE_ERROR; @@ -928,10 +913,16 @@ void WorldSession::HandleChangePlayerNameOpcode(WorldPacket& recv_data) return; } - if(!objmgr.GetPlayerNameByGUID(guid, oldname)) // character not exist, because we have no name for this guid + uint32 at_loginFlags; + Field *fields = result->Fetch(); + at_loginFlags = fields[0].GetUInt32(); + oldname = fields[1].GetCppString(); + delete result; + + if (!(at_loginFlags & AT_LOGIN_RENAME)) { WorldPacket data(SMSG_CHAR_RENAME, 1); - data << (uint8)CHAR_LOGIN_NO_CHARACTER; + data << (uint8)CHAR_CREATE_ERROR; SendPacket( &data ); return; } diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index 880427b81..8ab1b3258 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -926,44 +926,7 @@ void Creature::OnPoiSelect(Player* player, GossipOption const *gossip) { if(gossip->GossipId==GOSSIP_GUARD_SPELLTRAINER || gossip->GossipId==GOSSIP_GUARD_SKILLTRAINER) { - //float x,y; - //bool findnpc=false; Poi_Icon icon = ICON_POI_0; - //QueryResult *result; - //Field *fields; - uint32 mapid=GetMapId(); - Map const* map=MapManager::Instance().GetBaseMap( mapid ); - uint16 areaflag=map->GetAreaFlag(GetPositionX(),GetPositionY()); - uint32 zoneid=Map::GetZoneId(areaflag,mapid); - std::string areaname= gossip->OptionText; - /* - uint16 pflag; - - // use the action relate to creaturetemplate.trainer_type ? - result= WorldDatabase.PQuery("SELECT creature.position_x,creature.position_y FROM creature,creature_template WHERE creature.map = '%u' AND creature.id = creature_template.entry AND creature_template.trainer_type = '%u'", mapid, gossip->Action ); - if(!result) - return; - do - { - fields = result->Fetch(); - x=fields[0].GetFloat(); - y=fields[1].GetFloat(); - pflag=map->GetAreaFlag(GetPositionX(),GetPositionY()); - if(pflag==areaflag) - { - findnpc=true; - break; - } - }while(result->NextRow()); - - delete result; - - if(!findnpc) - { - player->PlayerTalkClass->SendTalking( "$NSorry", "Here no this person."); - return; - }*/ - //need add more case. switch(gossip->Action) { @@ -980,8 +943,9 @@ void Creature::OnPoiSelect(Player* player, GossipOption const *gossip) icon=ICON_POI_TOWER; break; } - uint32 textid=GetGossipTextId( gossip->Action, zoneid ); - player->PlayerTalkClass->SendTalking( textid ); + uint32 textid = GetGossipTextId( gossip->Action, GetZoneId() ); + player->PlayerTalkClass->SendTalking(textid); + // std::string areaname= gossip->OptionText; // how this could worked player->PlayerTalkClass->SendPointOfInterest( x, y, icon, 2, 15, areaname.c_str() ); } } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 27a2b558c..ae4d0945a 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 "6891" + #define REVISION_NR "6892" #endif // __REVISION_NR_H__ From 477ba707820e266d3e4795c1396d692482590a6c Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Wed, 10 Dec 2008 18:06:37 +0300 Subject: [PATCH 52/56] [6893] Fixes in waypoint movement code. Initilize variables and reset last movment timer for correct waypoints work at reset movement. --- src/game/WaypointMovementGenerator.h | 14 ++++++++++---- src/shared/revision_nr.h | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/game/WaypointMovementGenerator.h b/src/game/WaypointMovementGenerator.h index bcd14d893..d6cb21752 100644 --- a/src/game/WaypointMovementGenerator.h +++ b/src/game/WaypointMovementGenerator.h @@ -73,10 +73,8 @@ class MANGOS_DLL_SPEC WaypointMovementGenerator : public MovementGeneratorMedium< Creature, WaypointMovementGenerator >, public PathMovementBase { - TimeTrackerSmall i_nextMoveTime; - std::vector i_hasDone; public: - WaypointMovementGenerator(Creature &) : i_nextMoveTime(0) {} + WaypointMovementGenerator(Creature &) : i_nextMoveTime(0), b_StopedByPlayer(false) {} ~WaypointMovementGenerator() { ClearWaypoints(); } void Initialize(Creature &u) { @@ -85,7 +83,12 @@ public PathMovementBase LoadPath(u); } void Finalize(Creature &) {} - void Reset(Creature &u) { ReloadPath(u); } + void Reset(Creature &u) + { + ReloadPath(u); + b_StopedByPlayer = false; + i_nextMoveTime.Reset(0); + } bool Update(Creature &u, const uint32 &diff); void MovementInform(Creature &); @@ -104,6 +107,9 @@ public PathMovementBase static void Initialize(void); private: void ClearWaypoints(); + + TimeTrackerSmall i_nextMoveTime; + std::vector i_hasDone; bool b_StopedByPlayer; }; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index ae4d0945a..783240f02 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 "6892" + #define REVISION_NR "6893" #endif // __REVISION_NR_H__ From 467090e817256265b5d49e8e8f95a8d264b01ada Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Wed, 10 Dec 2008 19:24:15 +0300 Subject: [PATCH 53/56] [6894] Backport file name preparing code in VMapManager from 303 branch that fix also possible memory corruption. --- src/shared/revision_nr.h | 2 +- src/shared/vmap/VMapManager.cpp | 18 ++++++------------ 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 783240f02..313811fc1 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 "6893" + #define REVISION_NR "6894" #endif // __REVISION_NR_H__ diff --git a/src/shared/vmap/VMapManager.cpp b/src/shared/vmap/VMapManager.cpp index 86e017c96..49fec68b5 100644 --- a/src/shared/vmap/VMapManager.cpp +++ b/src/shared/vmap/VMapManager.cpp @@ -275,10 +275,8 @@ namespace VMAP { dirFileName = getDirFileName(pMapId); } - size_t len = pBasePath.length() + dirFileName.length(); - char *filenameBuffer = new char[len+1]; - sprintf(filenameBuffer, "%s%s", pBasePath.c_str(), dirFileName.c_str()); - FILE* df = fopen(filenameBuffer, "rb"); + std::string fb = pBasePath + dirFileName; + FILE* df = fopen(fb.c_str(), "rb"); if(df) { char lineBuffer[FILENAMEBUFFER_SIZE]; @@ -288,8 +286,8 @@ namespace VMAP chomp(name); if(name.length() >1) { - sprintf(filenameBuffer, "%s%s", pBasePath.c_str(), name.c_str()); - FILE* df2 = fopen(filenameBuffer, "rb"); + std::string fb2 = pBasePath + name; + FILE* df2 = fopen(fb2.c_str(), "rb"); if(df2) { char magic[8]; @@ -302,7 +300,6 @@ namespace VMAP } fclose(df); } - delete[] filenameBuffer; return result; } @@ -659,14 +656,12 @@ namespace VMAP bool MapTree::loadMap(const std::string& pDirFileName, unsigned int pMapTileIdent) { bool result = true; - size_t len = iBasePath.length() + pDirFileName.length(); - char *filenameBuffer = new char[len+1]; if(!hasDirFile(pDirFileName)) { FilesInDir filesInDir; result = false; - sprintf(filenameBuffer, "%s%s", iBasePath.c_str(), pDirFileName.c_str()); - FILE* df = fopen(filenameBuffer, "rb"); + std::string fb = iBasePath + pDirFileName; + FILE* df = fopen(fb.c_str(), "rb"); if(df) { char lineBuffer[FILENAMEBUFFER_SIZE]; @@ -726,7 +721,6 @@ namespace VMAP filesInDir.incRefCount(); } } - delete [] filenameBuffer; return (result); } From 54207e753cc76cc8233a801121d09f1b5189a464 Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Wed, 10 Dec 2008 19:48:40 +0300 Subject: [PATCH 54/56] [6895] Fix unexpected change backported in [6889]. Rebuild ad.exe with recent changes. --- contrib/extractor/System.cpp | 2 +- contrib/extractor/ad.exe | Bin 167936 -> 167936 bytes src/shared/revision_nr.h | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/extractor/System.cpp b/contrib/extractor/System.cpp index 19c0e7159..978a7d2d9 100644 --- a/contrib/extractor/System.cpp +++ b/contrib/extractor/System.cpp @@ -261,7 +261,7 @@ void LoadCommonMPQFiles() { char filename[512]; - sprintf(filename,"%s/Data/common-2.MPQ", input_path); + sprintf(filename,"%s/Data/common.MPQ", input_path); new MPQArchive(filename); sprintf(filename,"%s/Data/expansion.MPQ", input_path); new MPQArchive(filename); diff --git a/contrib/extractor/ad.exe b/contrib/extractor/ad.exe index 1f2c45dfc5628396d14318608d799122738f8f4e..2dc24c0872e709084426117c84055c1e2579e576 100755 GIT binary patch delta 32 ocmZozz}2vTYr+fWqo3?2zV>Cld6lWznz7xQk#V~ Date: Thu, 11 Dec 2008 17:19:02 +0100 Subject: [PATCH 55/56] [6896] Fixed fall damage after teleports --- src/game/MovementHandler.cpp | 5 +---- src/game/Player.cpp | 2 ++ src/game/Player.h | 5 +++++ src/shared/revision_nr.h | 2 +- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp index f94718906..922b39e50 100644 --- a/src/game/MovementHandler.cpp +++ b/src/game/MovementHandler.cpp @@ -363,10 +363,7 @@ void WorldSession::HandleMovementOpcodes( WorldPacket & recv_data ) GetPlayer()->SetPosition(movementInfo.x, movementInfo.y, movementInfo.z, movementInfo.o); GetPlayer()->m_movementInfo = movementInfo; if (GetPlayer()->m_lastFallTime >= movementInfo.fallTime || GetPlayer()->m_lastFallZ <=movementInfo.z) - { - GetPlayer()->m_lastFallTime = movementInfo.fallTime; - GetPlayer()->m_lastFallZ= movementInfo.z; - } + GetPlayer()->SetFallInformation(movementInfo.fallTime, movementInfo.z); if(GetPlayer()->isMovingOrTurning()) GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); diff --git a/src/game/Player.cpp b/src/game/Player.cpp index c2e1d25f5..2f76c0632 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -1556,6 +1556,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati else // this will be used instead of the current location in SaveToDB m_teleport_dest = WorldLocation(mapid, x, y, z, orientation); + SetFallInformation(0, z); //BuildHeartBeatMsg(&data); //SendMessageToSet(&data, true); @@ -1703,6 +1704,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati } m_teleport_dest = WorldLocation(mapid, final_x, final_y, final_z, final_o); + SetFallInformation(0, final_z); // if the player is saved before worldportack (at logout for example) // this will be used instead of the current location in SaveToDB diff --git a/src/game/Player.h b/src/game/Player.h index a6915fbf4..fefcaa04d 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -1912,6 +1912,11 @@ class MANGOS_DLL_SPEC Player : public Unit MovementInfo m_movementInfo; uint32 m_lastFallTime; float m_lastFallZ; + void SetFallInformation(uint32 time, float z) + { + m_lastFallTime = time; + m_lastFallZ = z; + } bool isMoving() const { return HasUnitMovementFlag(movementFlagsMask); } bool isMovingOrTurning() const { return HasUnitMovementFlag(movementOrTurningFlagsMask); } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 6f471f5a9..c526a60bc 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 "6895" + #define REVISION_NR "6896" #endif // __REVISION_NR_H__ From ac2748a141fcea3b5d4bdad3f502252061f3f00f Mon Sep 17 00:00:00 2001 From: hunuza Date: Sat, 29 Nov 2008 10:07:58 +0100 Subject: [PATCH 56/56] [6897] Avoid DB access on uninvite from group. Signed-off-by: hunuza --- src/game/Group.cpp | 38 ++++++++++------- src/game/Group.h | 15 ++++++- src/game/GroupHandler.cpp | 88 +++++++++++++++++++-------------------- src/game/Guild.h | 2 +- src/game/Player.cpp | 43 ++++++++++++------- src/game/Player.h | 1 + src/game/WorldSession.h | 3 +- src/shared/revision_nr.h | 2 +- 8 files changed, 113 insertions(+), 79 deletions(-) diff --git a/src/game/Group.cpp b/src/game/Group.cpp index 9cf107f06..de97b70b3 100644 --- a/src/game/Group.cpp +++ b/src/game/Group.cpp @@ -212,7 +212,7 @@ bool Group::AddInvite(Player *player) RemoveInvite(player); - m_invitees.insert(player->GetGUID()); + m_invitees.insert(player); player->SetGroupInvite(this); @@ -231,14 +231,7 @@ bool Group::AddLeaderInvite(Player *player) uint32 Group::RemoveInvite(Player *player) { - for(InvitesList::iterator itr=m_invitees.begin(); itr!=m_invitees.end(); ++itr) - { - if((*itr) == player->GetGUID()) - { - m_invitees.erase(itr); - break; - } - } + m_invitees.erase(player); player->SetGroupInvite(NULL); return GetMembersCount(); @@ -247,14 +240,31 @@ uint32 Group::RemoveInvite(Player *player) void Group::RemoveAllInvites() { for(InvitesList::iterator itr=m_invitees.begin(); itr!=m_invitees.end(); ++itr) - { - Player *invitee = objmgr.GetPlayer(*itr); - if(invitee) - invitee->SetGroupInvite(NULL); - } + (*itr)->SetGroupInvite(NULL); + m_invitees.clear(); } +Player* Group::GetInvited(const uint64& guid) const +{ + for(InvitesList::const_iterator itr = m_invitees.begin(); itr != m_invitees.end(); ++itr) + { + if((*itr)->GetGUID() == guid) + return (*itr); + } + return NULL; +} + +Player* Group::GetInvited(const std::string& name) const +{ + for(InvitesList::const_iterator itr = m_invitees.begin(); itr != m_invitees.end(); ++itr) + { + if((*itr)->GetName() == name) + return (*itr); + } + return NULL; +} + bool Group::AddMember(const uint64 &guid, const char* name) { if(!_addMember(guid, name)) diff --git a/src/game/Group.h b/src/game/Group.h index 6160fd0f2..a9e6a733f 100644 --- a/src/game/Group.h +++ b/src/game/Group.h @@ -143,7 +143,7 @@ class MANGOS_DLL_SPEC Group typedef UNORDERED_MAP< uint32 /*mapId*/, InstanceGroupBind> BoundInstancesMap; protected: typedef MemberSlotList::iterator member_witerator; - typedef std::set InvitesList; + typedef std::set InvitesList; typedef std::vector Rolls; @@ -183,6 +183,17 @@ class MANGOS_DLL_SPEC Group // member manipulation methods bool IsMember(const uint64& guid) const { return _getMemberCSlot(guid) != m_memberSlots.end(); } bool IsLeader(const uint64& guid) const { return (GetLeaderGUID() == guid); } + uint64 GetMemberGUID(const std::string& name) + { + for(member_citerator itr = m_memberSlots.begin(); itr != m_memberSlots.end(); ++itr) + { + if(itr->name == name) + { + return itr->guid; + } + } + return 0; + } bool IsAssistant(uint64 guid) const { member_citerator mslot = _getMemberCSlot(guid); @@ -191,6 +202,8 @@ class MANGOS_DLL_SPEC Group return mslot->assistant; } + Player* GetInvited(const uint64& guid) const; + Player* GetInvited(const std::string& name) const; bool SameSubGroup(uint64 guid1,const uint64& guid2) const { diff --git a/src/game/GroupHandler.cpp b/src/game/GroupHandler.cpp index ad56314e7..2d05e6655 100644 --- a/src/game/GroupHandler.cpp +++ b/src/game/GroupHandler.cpp @@ -42,7 +42,7 @@ -FIX sending PartyMemberStats */ -void WorldSession::SendPartyResult(PartyOperation operation, std::string member, PartyResult res) +void WorldSession::SendPartyResult(PartyOperation operation, const std::string& member, PartyResult res) { WorldPacket data(SMSG_PARTY_COMMAND_RESULT, (8+member.size()+1)); data << (uint32)operation; @@ -246,17 +246,37 @@ void WorldSession::HandleGroupUninviteGuidOpcode(WorldPacket & recv_data) uint64 guid; recv_data >> guid; - if(_player->InBattleGround()) + //can't uninvite yourself + if(guid == GetPlayer()->GetGUID()) { - SendPartyResult(PARTY_OP_INVITE, "", PARTY_RESULT_INVITE_RESTRICTED); + sLog.outError("WorldSession::HandleGroupUninviteGuidOpcode: leader %s(%d) tried to uninvite himself from the group.", GetPlayer()->GetName(), GetPlayer()->GetGUIDLow()); return; } - std::string membername; - if(!objmgr.GetPlayerNameByGUID(guid, membername)) - return; // not found + PartyResult res = GetPlayer()->CanUninviteFromGroup(); + if(res != PARTY_RESULT_OK) + { + SendPartyResult(PARTY_OP_LEAVE, "", res); + return; + } - HandleGroupUninvite(guid, membername); + Group* grp = GetPlayer()->GetGroup(); + if(!grp) + return; + + if(grp->IsMember(guid)) + { + Player::RemoveFromGroup(grp,guid); + return; + } + + if(Player* plr = grp->GetInvited(guid)) + { + plr->UninviteFromGroup(); + return; + } + + SendPartyResult(PARTY_OP_LEAVE, "", PARTY_RESULT_NOT_IN_YOUR_PARTY); } void WorldSession::HandleGroupUninviteNameOpcode(WorldPacket & recv_data) @@ -266,65 +286,41 @@ void WorldSession::HandleGroupUninviteNameOpcode(WorldPacket & recv_data) std::string membername; recv_data >> membername; - if(_player->InBattleGround()) - { - SendPartyResult(PARTY_OP_INVITE, membername, PARTY_RESULT_INVITE_RESTRICTED); - return; - } - // player not found if(!normalizePlayerName(membername)) return; - uint64 guid = objmgr.GetPlayerGUIDByName(membername); - - // player not found - if(!guid) - return; - - HandleGroupUninvite(guid, membername); -} - -void WorldSession::HandleGroupUninvite(uint64 guid, std::string name) -{ - Group *group = GetPlayer()->GetGroup(); - if(!group) - return; - - if(_player->InBattleGround()) + // can't uninvite yourself + if(GetPlayer()->GetName() == membername) { - SendPartyResult(PARTY_OP_INVITE, "", PARTY_RESULT_INVITE_RESTRICTED); + sLog.outError("WorldSession::HandleGroupUninviteNameOpcode: leader %s(%d) tried to uninvite himself from the group.", GetPlayer()->GetName(), GetPlayer()->GetGUIDLow()); return; } - Player *player = objmgr.GetPlayer(guid); - - /** error handling **/ - if(!group->IsLeader(GetPlayer()->GetGUID()) && !group->IsAssistant(GetPlayer()->GetGUID())) + PartyResult res = GetPlayer()->CanUninviteFromGroup(); + if(res != PARTY_RESULT_OK) { - SendPartyResult(PARTY_OP_LEAVE, "", PARTY_RESULT_YOU_NOT_LEADER); + SendPartyResult(PARTY_OP_LEAVE, "", res); return; } - if(!group->IsMember(guid) && (player && player->GetGroupInvite() != group)) + Group* grp = GetPlayer()->GetGroup(); + if(!grp) + return; + + if(uint64 guid = grp->GetMemberGUID(membername)) { - SendPartyResult(PARTY_OP_LEAVE, name, PARTY_RESULT_NOT_IN_YOUR_PARTY); + Player::RemoveFromGroup(grp,guid); return; } - if(guid == GetPlayer()->GetGUID()) + if(Player* plr = grp->GetInvited(membername)) { - sLog.outError("WorldSession::HandleGroupUninvite: leader %s(%d) tried to uninvite himself from the group.", GetPlayer()->GetName(), GetPlayer()->GetGUIDLow()); + plr->UninviteFromGroup(); return; } - /********************/ - // everything's fine, do it - - if(player && player->GetGroupInvite()) // uninvite invitee - player->UninviteFromGroup(); - else // uninvite member - Player::RemoveFromGroup(group,guid); + SendPartyResult(PARTY_OP_LEAVE, membername, PARTY_RESULT_NOT_IN_YOUR_PARTY); } void WorldSession::HandleGroupSetLeaderOpcode( WorldPacket & recv_data ) diff --git a/src/game/Guild.h b/src/game/Guild.h index 31da4438a..a97a8cfb0 100644 --- a/src/game/Guild.h +++ b/src/game/Guild.h @@ -329,7 +329,7 @@ class Guild { return (members.find(LowGuid) != members.end()); } - MemberSlot* GetMemberSlot(std::string const& name, uint64& guid) + MemberSlot* GetMemberSlot(const std::string& name, uint64& guid) { for(MemberList::iterator itr = members.begin(); itr != members.end(); ++itr) { diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 2f76c0632..5a517f45d 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -2024,23 +2024,23 @@ bool Player::IsInSameGroupWith(Player const* p) const /// \todo Shouldn't we also check if there is no other invitees before disbanding the group? void Player::UninviteFromGroup() { - if(GetGroupInvite()) // uninvited invitee + Group* group = GetGroupInvite(); + if(!group) + return; + + group->RemoveInvite(this); + + if(group->GetMembersCount() <= 1) // group has just 1 member => disband { - Group* group = GetGroupInvite(); - group->RemoveInvite(this); - - if(group->GetMembersCount() <= 1) // group has just 1 member => disband + if(group->IsCreated()) { - if(group->IsCreated()) - { - group->Disband(true); - objmgr.RemoveGroup(group); - } - else - group->RemoveAllInvites(); - - delete group; + group->Disband(true); + objmgr.RemoveGroup(group); } + else + group->RemoveAllInvites(); + + delete group; } } @@ -18237,6 +18237,21 @@ Player* Player::GetNextRandomRaidMember(float radius) return nearMembers[randTarget]; } +PartyResult Player::CanUninviteFromGroup() const +{ + const Group* grp = GetGroup(); + if(!grp) + return PARTY_RESULT_YOU_NOT_IN_GROUP; + + if(!grp->IsLeader(GetGUID()) && !grp->IsAssistant(GetGUID())) + return PARTY_RESULT_YOU_NOT_LEADER; + + if(InBattleGround()) + return PARTY_RESULT_INVITE_RESTRICTED; + + return PARTY_RESULT_OK; +} + void Player::UpdateUnderwaterState( Map* m, float x, float y, float z ) { float water_z = m->GetWaterLevel(x,y); diff --git a/src/game/Player.h b/src/game/Player.h index fefcaa04d..bc7e3d39c 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -2026,6 +2026,7 @@ class MANGOS_DLL_SPEC Player : public Unit uint64 GetAuraUpdateMask() { return m_auraUpdateMask; } void SetAuraUpdateMask(uint8 slot) { m_auraUpdateMask |= (uint64(1) << slot); } Player* GetNextRandomRaidMember(float radius); + PartyResult CanUninviteFromGroup() const; GridReference &GetGridRef() { return m_gridRef; } MapReference &GetMapRef() { return m_mapRef; } diff --git a/src/game/WorldSession.h b/src/game/WorldSession.h index 6a8d609d9..6077d42b4 100644 --- a/src/game/WorldSession.h +++ b/src/game/WorldSession.h @@ -83,7 +83,7 @@ class MANGOS_DLL_SPEC WorldSession void SendNotification(int32 string_id,...); void SendPetNameInvalid(uint32 error, std::string name, DeclinedName *declinedName); void SendLfgResult(uint32 type, uint32 entry, uint8 lfg_type); - void SendPartyResult(PartyOperation operation, std::string member, PartyResult res); + void SendPartyResult(PartyOperation operation, const std::string& member, PartyResult res); void SendAreaTriggerMessage(const char* Text, ...) ATTR_PRINTF(2,3); uint32 GetSecurity() const { return _security; } @@ -332,7 +332,6 @@ class MANGOS_DLL_SPEC WorldSession void HandleGroupDeclineOpcode(WorldPacket& recvPacket); void HandleGroupUninviteNameOpcode(WorldPacket& recvPacket); void HandleGroupUninviteGuidOpcode(WorldPacket& recvPacket); - void HandleGroupUninvite(uint64 guid, std::string name); void HandleGroupSetLeaderOpcode(WorldPacket& recvPacket); void HandleGroupLeaveOpcode(WorldPacket& recvPacket); void HandleGroupPassOnLootOpcode( WorldPacket &recv_data ); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index c526a60bc..4a197620a 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 "6896" + #define REVISION_NR "6897" #endif // __REVISION_NR_H__