aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormegamage <none@none>2008-11-25 16:36:50 -0600
committermegamage <none@none>2008-11-25 16:36:50 -0600
commitf6ea784eda445794bf99ba2b9f97012ea4009f59 (patch)
tree97ed434b569dd1194854908cd3fe67a9129a5e8b /src
parent52f2e35d65af17abfd9499232398bab338db78e1 (diff)
*Update to Mangos 6848. Source: Mangos.
--HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/game/AuctionHouse.cpp2
-rw-r--r--src/game/BattleGroundEY.cpp4
-rw-r--r--src/game/Chat.cpp2
-rw-r--r--src/game/Creature.cpp72
-rw-r--r--src/game/Creature.h25
-rw-r--r--src/game/GridNotifiers.h30
-rw-r--r--src/game/GuildHandler.cpp10
-rw-r--r--src/game/Language.h114
-rw-r--r--src/game/Level3.cpp125
-rw-r--r--src/game/Mail.cpp6
-rw-r--r--src/game/MiscHandler.cpp4
-rw-r--r--src/game/ObjectMgr.cpp2
-rw-r--r--src/game/Player.cpp16
-rw-r--r--src/game/SpellEffects.cpp8
-rw-r--r--src/game/TradeHandler.cpp16
-rw-r--r--src/game/Unit.cpp4
-rw-r--r--src/game/World.cpp3
-rw-r--r--src/game/World.h3
-rw-r--r--src/shared/Log.cpp148
-rw-r--r--src/shared/Log.h15
-rw-r--r--src/shared/Util.h12
-rw-r--r--src/trinitycore/trinitycore.conf.dist5
22 files changed, 392 insertions, 234 deletions
diff --git a/src/game/AuctionHouse.cpp b/src/game/AuctionHouse.cpp
index 5526240528b..b1420f680c2 100644
--- a/src/game/AuctionHouse.cpp
+++ b/src/game/AuctionHouse.cpp
@@ -278,7 +278,7 @@ void WorldSession::HandleAuctionSellItem( WorldPacket & recv_data )
if( GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE) )
{
- sLog.outCommand("GM %s (Account: %u) create auction: %s (Entry: %u Count: %u)",
+ sLog.outCommand(GetAccountId(),"GM %s (Account: %u) create auction: %s (Entry: %u Count: %u)",
GetPlayerName(),GetAccountId(),it->GetProto()->Name1,it->GetEntry(),it->GetCount());
}
diff --git a/src/game/BattleGroundEY.cpp b/src/game/BattleGroundEY.cpp
index d828d626ad2..3b545e5e65b 100644
--- a/src/game/BattleGroundEY.cpp
+++ b/src/game/BattleGroundEY.cpp
@@ -191,7 +191,7 @@ void BattleGroundEY::CheckSomeoneJoinedPoint()
++j;
continue;
}
- if (plr->isAlive() && plr->IsWithinDistInMap(obj, BG_EY_POINT_RADIUS))
+ if (plr->isAllowUseBattleGroundObject() && plr->IsWithinDistInMap(obj, BG_EY_POINT_RADIUS))
{
//player joined point!
//show progress bar
@@ -234,7 +234,7 @@ void BattleGroundEY::CheckSomeoneLeftPoint()
++j;
continue;
}
- if (!plr->isAlive() || !plr->IsWithinDistInMap(obj, BG_EY_POINT_RADIUS))
+ if (!plr->isAllowUseBattleGroundObject() || !plr->IsWithinDistInMap(obj, BG_EY_POINT_RADIUS))
//move player out of point (add him to players that are out of points
{
m_PlayersNearPoint[EY_POINTS_MAX].push_back(m_PlayersNearPoint[i][j]);
diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp
index 862cfc638ca..fb2032d2ac1 100644
--- a/src/game/Chat.cpp
+++ b/src/game/Chat.cpp
@@ -786,7 +786,7 @@ bool ChatHandler::ExecuteCommandInTable(ChatCommand *table, const char* text, st
{
Player* p = m_session->GetPlayer();
uint64 sel_guid = p->GetSelection();
- sLog.outCommand("Command: %s [Player: %s (Account: %u) X: %f Y: %f Z: %f Map: %u Selected: %s (GUID: %u)]",
+ sLog.outCommand(m_session->GetAccountId(),"Command: %s [Player: %s (Account: %u) X: %f Y: %f Z: %f Map: %u Selected: %s (GUID: %u)]",
fullcmd.c_str(),p->GetName(),m_session->GetAccountId(),p->GetPositionX(),p->GetPositionY(),p->GetPositionZ(),p->GetMapId(),
GetLogNameForGuid(sel_guid),GUID_LOPART(sel_guid));
}
diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp
index 79c1bf18008..9daab97da38 100644
--- a/src/game/Creature.cpp
+++ b/src/game/Creature.cpp
@@ -117,6 +117,28 @@ uint32 CreatureInfo::GetFirstValidModelId() const
return 0;
}
+bool AssistDelayEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/)
+{
+ Unit* victim = Unit::GetUnit(m_owner, m_victim);
+ if (victim)
+ {
+ while (!m_assistants.empty())
+ {
+ Creature* assistant = (Creature*)Unit::GetUnit(m_owner, *m_assistants.begin());
+ m_assistants.pop_front();
+
+ if (assistant && assistant->CanAssistTo(&m_owner, victim))
+ {
+ //assistant->SetNoCallAssistence(true);
+ assistant->CombatStart(victim);
+ if(assistant->AI())
+ assistant->AI()->AttackStart(victim);
+ }
+ }
+ }
+ return true;
+}
+
Creature::Creature() :
Unit(), i_AI(NULL), i_AI_possessed(NULL),
lootForPickPocketed(false), lootForBody(false), m_groupLootTimer(0), lootingGroupLeaderGUID(0),
@@ -124,7 +146,7 @@ m_lootMoney(0), m_lootRecipient(0),
m_deathTimer(0), m_respawnTime(0), m_respawnDelay(25), m_corpseDelay(60), m_respawnradius(0.0f),
m_gossipOptionLoaded(false), m_emoteState(0), m_isPet(false), m_isTotem(false), m_isAggressive(true),
m_regenTimer(2000), m_defaultMovementType(IDLE_MOTION_TYPE), m_equipmentId(0),
-m_AlreadyCallAssistence(false), m_regenHealth(true), m_AI_locked(false), m_isDeadByDefault(false),
+m_AlreadyCallAssistance(false), m_regenHealth(true), m_AI_locked(false), m_isDeadByDefault(false),
m_meleeDamageSchoolMask(SPELL_SCHOOL_MASK_NORMAL),m_creatureInfo(NULL), m_DBTableGuid(0)
{
m_valuesCount = UNIT_END;
@@ -1865,11 +1887,11 @@ Unit* Creature::SelectNearestTarget(float dist) const
void Creature::CallAssistence()
{
- if( !m_AlreadyCallAssistence && getVictim() && !isPet() && !isCharmed())
+ if( !m_AlreadyCallAssistance && getVictim() && !isPet() && !isCharmed())
{
- SetNoCallAssistence(true);
+ SetNoCallAssistance(true);
- float radius = sWorld.getConfig(CONFIG_CREATURE_FAMILY_ASSISTEMCE_RADIUS);
+ float radius = sWorld.getConfig(CONFIG_CREATURE_FAMILY_ASSISTANCE_RADIUS);
if(radius > 0)
{
std::list<Creature*> assistList;
@@ -1889,17 +1911,49 @@ void Creature::CallAssistence()
cell_lock->Visit(cell_lock, grid_creature_searcher, *MapManager::Instance().GetMap(GetMapId(), this));
}
- for(std::list<Creature*>::iterator iter = assistList.begin(); iter != assistList.end(); ++iter)
+ if (!assistList.empty())
{
- //(*iter)->SetNoCallAssistence(true);
- (*iter)->CombatStart(getVictim());
- if((*iter)->AI())
- (*iter)->AI()->AttackStart(getVictim());
+ AssistDelayEvent *e = new AssistDelayEvent(getVictim()->GetGUID(), *this);
+ while (!assistList.empty())
+ {
+ // Pushing guids because in delay can happen some creature gets despawned => invalid pointer
+ e->AddAssistant((*assistList.begin())->GetGUID());
+ assistList.pop_front();
+ }
+ m_Events.AddEvent(e, m_Events.CalculateTime(sWorld.getConfig(CONFIG_CREATURE_FAMILY_ASSISTANCE_DELAY)));
}
}
}
}
+bool Creature::CanAssistTo(const Unit* u, const Unit* enemy) const
+{
+ if(!isAggressive())
+ return false;
+
+ // we don't need help from zombies :)
+ if( !isAlive() )
+ return false;
+
+ // skip fighting creature
+ if( isInCombat() )
+ return false;
+
+ // only from same creature faction
+ if(getFaction() != u->getFaction() )
+ return false;
+
+ // only free creature
+ if( GetCharmerOrOwnerGUID() )
+ return false;
+
+ // skip non hostile to caster enemy creatures
+ if( !IsHostileTo(enemy) )
+ return false;
+
+ return true;
+}
+
void Creature::SaveRespawnTime()
{
if(isPet() || !m_DBTableGuid)
diff --git a/src/game/Creature.h b/src/game/Creature.h
index 5b5b1efffc5..b85c74d31b8 100644
--- a/src/game/Creature.h
+++ b/src/game/Creature.h
@@ -29,6 +29,8 @@
#include "Database/DatabaseEnv.h"
#include "Cell.h"
+#include <list>
+
struct SpellEntry;
class CreatureAI;
@@ -561,8 +563,9 @@ class TRINITY_DLL_SPEC Creature : public Unit
float GetAttackDistance(Unit const* pl) const;
Unit* SelectNearestTarget(float dist = 0) const;
- void CallAssistence();
- void SetNoCallAssistence(bool val) { m_AlreadyCallAssistence = val; }
+ void CallAssistance();
+ void SetNoCallAssistance(bool val) { m_AlreadyCallAssistance = val; }
+ bool CanAssistTo(const Unit* u, const Unit* enemy) const;
void DoFleeToGetAssistance(float radius = 50);
MovementGeneratorType GetDefaultMovementType() const { return m_defaultMovementType; }
@@ -648,7 +651,7 @@ class TRINITY_DLL_SPEC Creature : public Unit
uint32 m_DBTableGuid; ///< For new or temporary creatures is 0 for saved it is lowguid
uint32 m_equipmentId;
- bool m_AlreadyCallAssistence;
+ bool m_AlreadyCallAssistance;
bool m_regenHealth;
bool m_AI_locked;
bool m_isDeadByDefault;
@@ -664,4 +667,20 @@ class TRINITY_DLL_SPEC Creature : public Unit
GridReference<Creature> m_gridRef;
CreatureInfo const* m_creatureInfo; // in heroic mode can different from ObjMgr::GetCreatureTemplate(GetEntry())
};
+
+class AssistDelayEvent : public BasicEvent
+{
+ public:
+ AssistDelayEvent(const uint64& victim, Unit& owner) : BasicEvent(), m_victim(victim), m_owner(owner) { }
+
+ bool Execute(uint64 e_time, uint32 p_time);
+ void AddAssistant(const uint64& guid) { m_assistants.push_back(guid); }
+ private:
+ AssistDelayEvent();
+
+ uint64 m_victim;
+ std::list<uint64> m_assistants;
+ Unit& m_owner;
+};
+
#endif
diff --git a/src/game/GridNotifiers.h b/src/game/GridNotifiers.h
index 6b4dd39306c..ac68db6ba1e 100644
--- a/src/game/GridNotifiers.h
+++ b/src/game/GridNotifiers.h
@@ -10,12 +10,12 @@
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef TRINITY_GRIDNOTIFIERS_H
@@ -476,7 +476,7 @@ namespace Trinity
return false;
}
- template<class NOT_INTERESTED> bool operator()(NOT_INTERESTED* u) { return false; }
+ template<class NOT_INTERESTED> bool operator()(NOT_INTERESTED*) { return false; }
private:
Unit* const i_funit;
float i_range;
@@ -771,35 +771,15 @@ namespace Trinity
if(u == i_funit)
return false;
- // we don't need help from zombies :)
- if( !u->isAlive() )
- return false;
-
- // skip fighting creature
- if( u->isInCombat() )
- return false;
-
- // only from same creature faction
- if(u->getFaction() != i_funit->getFaction() )
- return false;
-
- if(!u->isAggressive())
- return false;
-
- // only free creature
- if( u->GetCharmerOrOwnerGUID() )
+ if ( !u->CanAssistTo(i_funit, i_enemy) )
return false;
// too far
if( !i_funit->IsWithinDistInMap(u, i_range) )
return false;
- // skip non hostile to caster enemy creatures
- if( !u->IsHostileTo(i_enemy) )
- return false;
-
// only if see assisted creature
- if(!u->IsWithinLOSInMap(i_funit) )
+ if( !i_funit->IsWithinLOSInMap(u) )
return false;
return true;
diff --git a/src/game/GuildHandler.cpp b/src/game/GuildHandler.cpp
index 9462f7a1bb1..066c6e60b84 100644
--- a/src/game/GuildHandler.cpp
+++ b/src/game/GuildHandler.cpp
@@ -984,7 +984,7 @@ void WorldSession::HandleGuildBankDeposit( WorldPacket & recv_data )
// logging money
if(_player->GetSession()->GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE))
{
- sLog.outCommand("GM %s (Account: %u) deposit money (Amount: %u) to guild bank (Guild ID %u)",
+ sLog.outCommand(_player->GetSession()->GetAccountId(),"GM %s (Account: %u) deposit money (Amount: %u) to guild bank (Guild ID %u)",
_player->GetName(),_player->GetSession()->GetAccountId(),money,GuildId);
}
@@ -1379,7 +1379,7 @@ void WorldSession::HandleGuildBankDepositItem( WorldPacket & recv_data )
// logging item move to bank
if(_player->GetSession()->GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE))
{
- sLog.outCommand("GM %s (Account: %u) deposit item: %s (Entry: %d Count: %u) to guild bank (Guild ID: %u )",
+ sLog.outCommand(_player->GetSession()->GetAccountId(),"GM %s (Account: %u) deposit item: %s (Entry: %d Count: %u) to guild bank (Guild ID: %u )",
_player->GetName(),_player->GetSession()->GetAccountId(),
pItemChar->GetProto()->Name1,pItemChar->GetEntry(),pItemChar->GetCount(),
GuildId);
@@ -1448,7 +1448,7 @@ void WorldSession::HandleGuildBankDepositItem( WorldPacket & recv_data )
// logging item move to bank (before items merge
if(_player->GetSession()->GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE))
{
- sLog.outCommand("GM %s (Account: %u) deposit item: %s (Entry: %d Count: %u) to guild bank (Guild ID: %u )",
+ sLog.outCommand(_player->GetSession()->GetAccountId(),"GM %s (Account: %u) deposit item: %s (Entry: %d Count: %u) to guild bank (Guild ID: %u )",
_player->GetName(),_player->GetSession()->GetAccountId(),
pItemChar->GetProto()->Name1,pItemChar->GetEntry(),SplitedAmount,GuildId);
}
@@ -1474,7 +1474,7 @@ void WorldSession::HandleGuildBankDepositItem( WorldPacket & recv_data )
// logging item move to bank
if(_player->GetSession()->GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE))
{
- sLog.outCommand("GM %s (Account: %u) deposit item: %s (Entry: %d Count: %u) to guild bank (Guild ID: %u )",
+ sLog.outCommand(_player->GetSession()->GetAccountId(),"GM %s (Account: %u) deposit item: %s (Entry: %d Count: %u) to guild bank (Guild ID: %u )",
_player->GetName(),_player->GetSession()->GetAccountId(),
pItemChar->GetProto()->Name1,pItemChar->GetEntry(),pItemChar->GetCount(),
GuildId);
@@ -1524,7 +1524,7 @@ void WorldSession::HandleGuildBankDepositItem( WorldPacket & recv_data )
// logging item move to bank
if(_player->GetSession()->GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE))
{
- sLog.outCommand("GM %s (Account: %u) deposit item: %s (Entry: %d Count: %u) to guild bank (Guild ID: %u )",
+ sLog.outCommand(_player->GetSession()->GetAccountId(),"GM %s (Account: %u) deposit item: %s (Entry: %d Count: %u) to guild bank (Guild ID: %u )",
_player->GetName(),_player->GetSession()->GetAccountId(),
pItemChar->GetProto()->Name1,pItemChar->GetEntry(),pItemChar->GetCount(),
GuildId);
diff --git a/src/game/Language.h b/src/game/Language.h
index fc20f1725fd..73fa058ae4d 100644
--- a/src/game/Language.h
+++ b/src/game/Language.h
@@ -10,12 +10,12 @@
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef __TRINITY_LANGUAGE_H
@@ -80,11 +80,11 @@ enum TrinityStrings
LANG_COMMAND_INVALID_ITEM_COUNT = 52,
LANG_COMMAND_MAIL_ITEMS_LIMIT = 53,
LANG_NEW_PASSWORDS_NOT_MATCH = 54,
- LANG_PASSWORD_TOO_LONG = 55,
- LANG_MOTD_CURRENT = 56,
- LANG_USING_WORLD_DB = 57,
- LANG_USING_SCRIPT_LIB = 58,
- // Room for more level 0 59-99 not used
+ LANG_PASSWORD_TOO_LONG = 55,
+ LANG_MOTD_CURRENT = 56,
+ LANG_USING_WORLD_DB = 57,
+ LANG_USING_SCRIPT_LIB = 58,
+ // Room for more level 0 59-99 not used
// level 1 chat
LANG_GLOBAL_NOTIFY = 100,
@@ -170,7 +170,7 @@ enum TrinityStrings
LANG_SOUND_NOT_EXIST = 170,
LANG_TELEPORTED_TO_BY_CONSOLE = 171,
LANG_CONSOLE_COMMAND = 172,
- // Room for more level 1 173-199 not used
+ // Room for more level 1 173-199 not used
// level 2 chat
LANG_NO_SELECTION = 200,
@@ -326,7 +326,9 @@ enum TrinityStrings
LANG_CREATURE_FOLLOW_YOU_NOW = 340,
LANG_CREATURE_NOT_FOLLOW_YOU = 341,
LANG_CREATURE_NOT_FOLLOW_YOU_NOW = 342,
- // Room for more level 2 343-399 not used
+ LANG_CREATURE_NON_TAMEABLE = 343,
+ LANG_YOU_ALREADY_HAVE_PET = 344,
+ // Room for more level 2 345-399 not used
// level 3 chat
LANG_SCRIPTS_RELOADED = 400,
@@ -553,14 +555,14 @@ enum TrinityStrings
LANG_MOVEGENS_DISTRACT = 591,
LANG_COMMAND_LEARN_ALL_RECIPES = 592,
- LANG_BANLIST_ACCOUNTS = 593,
- LANG_BANLIST_ACCOUNTS_HEADER = 594,
- LANG_BANLIST_IPS = 595,
- LANG_BANLIST_IPS_HEADER = 596,
- LANG_GMLIST = 597,
- LANG_GMLIST_HEADER = 598,
- LANG_GMLIST_EMPTY = 599,
- // End Level 3 list, continued at 1100
+ LANG_BANLIST_ACCOUNTS = 593,
+ LANG_BANLIST_ACCOUNTS_HEADER = 594,
+ LANG_BANLIST_IPS = 595,
+ LANG_BANLIST_IPS_HEADER = 596,
+ LANG_GMLIST = 597,
+ LANG_GMLIST_HEADER = 598,
+ LANG_GMLIST_EMPTY = 599,
+ // End Level 3 list, continued at 1100
// Battleground
LANG_BG_A_WINS = 600,
@@ -720,43 +722,46 @@ enum TrinityStrings
// Room for in-game strings 810-999 not used
// Level 4 (CLI only commands)
- LANG_COMMAND_EXIT = 1000,
- LANG_ACCOUNT_DELETED = 1001,
- LANG_ACCOUNT_NOT_DELETED_SQL_ERROR = 1002,
- LANG_ACCOUNT_NOT_DELETED = 1003,
- LANG_ACCOUNT_CREATED = 1004,
- LANG_ACCOUNT_TOO_LONG = 1005,
- LANG_ACCOUNT_ALREADY_EXIST = 1006,
- LANG_ACCOUNT_NOT_CREATED_SQL_ERROR = 1007,
- LANG_ACCOUNT_NOT_CREATED = 1008,
- LANG_CHARACTER_DELETED = 1009,
- LANG_ACCOUNT_LIST_HEADER = 1010,
- LANG_ACCOUNT_LIST_ERROR = 1011,
- // Room for more level 4 1012-1099 not used
-
- // Level 3 (continue)
+ LANG_COMMAND_EXIT = 1000,
+ LANG_ACCOUNT_DELETED = 1001,
+ LANG_ACCOUNT_NOT_DELETED_SQL_ERROR = 1002,
+ LANG_ACCOUNT_NOT_DELETED = 1003,
+ LANG_ACCOUNT_CREATED = 1004,
+ LANG_ACCOUNT_TOO_LONG = 1005,
+ LANG_ACCOUNT_ALREADY_EXIST = 1006,
+ LANG_ACCOUNT_NOT_CREATED_SQL_ERROR = 1007,
+ LANG_ACCOUNT_NOT_CREATED = 1008,
+ LANG_CHARACTER_DELETED = 1009,
+ LANG_ACCOUNT_LIST_HEADER = 1010,
+ LANG_ACCOUNT_LIST_ERROR = 1011,
+ // Room for more level 4 1012-1099 not used
+
+ // Level 3 (continue)
LANG_ACCOUNT_SETADDON = 1100,
LANG_MOTD_NEW = 1101,
LANG_SENDMESSAGE = 1102,
LANG_EVENT_ENTRY_LIST_CONSOLE = 1103,
- LANG_CREATURE_ENTRY_LIST_CONSOLE = 1104,
- LANG_ITEM_LIST_CONSOLE = 1105,
- LANG_ITEMSET_LIST_CONSOLE = 1106,
- LANG_GO_ENTRY_LIST_CONSOLE = 1107,
- LANG_QUEST_LIST_CONSOLE = 1108,
- LANG_SKILL_LIST_CONSOLE = 1109,
- LANG_CREATURE_LIST_CONSOLE = 1110,
- LANG_GO_LIST_CONSOLE = 1111,
- LANG_FILE_OPEN_FAIL = 1112,
- LANG_ACCOUNT_CHARACTER_LIST_FULL = 1113,
- LANG_DUMP_BROKEN = 1114,
- LANG_INVALID_CHARACTER_NAME = 1115,
- LANG_INVALID_CHARACTER_GUID = 1116,
- LANG_CHARACTER_GUID_IN_USE = 1117,
- LANG_ITEMLIST_GUILD = 1118,
- // Room for more level 3 1119-1199 not used
-
- // Trinity strings 5000-9999
+ LANG_CREATURE_ENTRY_LIST_CONSOLE = 1104,
+ LANG_ITEM_LIST_CONSOLE = 1105,
+ LANG_ITEMSET_LIST_CONSOLE = 1106,
+ LANG_GO_ENTRY_LIST_CONSOLE = 1107,
+ LANG_QUEST_LIST_CONSOLE = 1108,
+ LANG_SKILL_LIST_CONSOLE = 1109,
+ LANG_CREATURE_LIST_CONSOLE = 1110,
+ LANG_GO_LIST_CONSOLE = 1111,
+ LANG_FILE_OPEN_FAIL = 1112,
+ LANG_ACCOUNT_CHARACTER_LIST_FULL = 1113,
+ LANG_DUMP_BROKEN = 1114,
+ LANG_INVALID_CHARACTER_NAME = 1115,
+ LANG_INVALID_CHARACTER_GUID = 1116,
+ LANG_CHARACTER_GUID_IN_USE = 1117,
+ LANG_ITEMLIST_GUILD = 1118,
+ LANG_MUST_MALE_OR_FEMALE = 1119,
+ LANG_YOU_CHANGE_GENDER = 1120,
+ LANG_YOUR_GENDER_CHANGED = 1121,
+ // Room for more level 3 1122-1199 not used
+
+ // Trinity strings 5000-9999
LANG_COMMAND_FREEZE = 5000,
LANG_COMMAND_FREEZE_ERROR = 5001,
LANG_COMMAND_FREEZE_WRONG = 5002,
@@ -767,9 +772,10 @@ enum TrinityStrings
LANG_INSTANCE_MUST_RAID_GRP = 5007,
LANG_INSTANCE_NOT_AS_GHOST = 5008,
LANG_COMMAND_PLAYED_TO_ALL = 5009,
- // Room for more Trinity strings 5009-9999
+ // Room for more Trinity strings 5009-9999
- // Use for not-in-svn patches 10000-10999
+ // Use for not-in-offcial-sources patches
+ // 10000-10999
// opvp hp
LANG_OPVP_HP_CAPTURE_OVERLOOK_H = 10001,
LANG_OPVP_HP_CAPTURE_OVERLOOK_A = 10002,
@@ -835,6 +841,8 @@ enum TrinityStrings
// Use for custom patches 11000-11999
- // NOT RESERVED IDS 12000-
+ // NOT RESERVED IDS 12000-1999999999
+ // `db_script_string` table index 2000000000-2000009999 (MIN_DB_SCRIPT_STRING_ID-MAX_DB_SCRIPT_STRING_ID)
+ // For other tables maybe 2000010000-2147483647 (max index)
};
#endif
diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp
index 1fb799cde6b..43cdb2ab319 100644
--- a/src/game/Level3.cpp
+++ b/src/game/Level3.cpp
@@ -5673,9 +5673,23 @@ bool ChatHandler::HandleWritePDumpCommand(const char *args)
if(!file || !p2)
return false;
- uint32 guid = objmgr.GetPlayerGUIDByName(p2);
- if(!guid)
+ uint32 guid;
+ // character name can't start from number
+ if (isNumeric(p2[0]))
guid = atoi(p2);
+ else
+ {
+ std::string name = p2;
+
+ if (!normalizePlayerName (name))
+ {
+ SendSysMessage (LANG_PLAYER_NOT_FOUND);
+ SetSentErrorMessage (true);
+ return false;
+ }
+
+ guid = objmgr.GetPlayerGUIDByName(name);
+ }
if(!objmgr.GetPlayerAccountIdByGUID(guid))
{
@@ -6548,31 +6562,11 @@ bool ChatHandler::HandleSendMessageCommand(const char* args)
return true;
}
-bool ChatHandler::HandlePlayAllCommand(const char* args)
+bool ChatHandler::HandleModifyGenderCommand(const char *args)
{
if(!*args)
return false;
- uint32 soundId = atoi((char*)args);
-
- if(!sSoundEntriesStore.LookupEntry(soundId))
- {
- PSendSysMessage(LANG_SOUND_NOT_EXIST, soundId);
- SetSentErrorMessage(true);
- return false;
- }
-
- WorldPacket data(SMSG_PLAY_SOUND, 4);
- data << uint32(soundId) << m_session->GetPlayer()->GetGUID();
- sWorld.SendGlobalMessage(&data);
-
- PSendSysMessage(LANG_COMMAND_PLAYED_TO_ALL, soundId);
- return true;
-}
-
-bool ChatHandler::HandleModifyGenderCommand(const char *args)
-{
- if(!*args) return false;
Player *player = getSelectedPlayer();
if(!player)
@@ -6582,54 +6576,75 @@ bool ChatHandler::HandleModifyGenderCommand(const char *args)
return false;
}
- std::string gender = (char*)args;
+ char const* gender_str = (char*)args;
+ int gender_len = strlen(gender_str);
+
uint32 displayId = player->GetNativeDisplayId();
+ char const* gender_full = NULL;
+ uint32 new_displayId = displayId;
+ Gender gender;
- if(gender == "male") // MALE
+ if(!strncmp(gender_str,"male",gender_len)) // MALE
{
if(player->getGender() == GENDER_MALE)
- {
- PSendSysMessage("%s is already male", player->GetName());
- SetSentErrorMessage(true);
- return false;
- }
-
- // Set gender
- player->SetByteValue(UNIT_FIELD_BYTES_0, 2, GENDER_MALE);
- // Change display ID
- player->SetDisplayId(player->getRace() == RACE_BLOODELF ? displayId+1 : displayId-1);
- player->SetNativeDisplayId(player->getRace() == RACE_BLOODELF ? displayId+1 : displayId-1);
+ return true;
- ChatHandler(player).PSendSysMessage("Gender changed. You are now a man!");
- PSendSysMessage("Gender changed for %s", player->GetName());
- return true;
+ gender_full = "male";
+ new_displayId = player->getRace() == RACE_BLOODELF ? displayId+1 : displayId-1;
+ gender = GENDER_MALE;
}
- else if(gender == "female") // FEMALE
+ else if (!strncmp(gender_str,"female",gender_len)) // FEMALE
{
if(player->getGender() == GENDER_FEMALE)
- {
- PSendSysMessage("%s is already female", player->GetName());
- SetSentErrorMessage(true);
- return false;
- }
-
- // Set gender
- player->SetByteValue(UNIT_FIELD_BYTES_0, 2, GENDER_FEMALE);
- // Change display ID
- player->SetDisplayId(player->getRace() == RACE_BLOODELF ? displayId-1 : displayId+1);
- player->SetNativeDisplayId(player->getRace() == RACE_BLOODELF ? displayId-1 : displayId+1);
+ return true;
- ChatHandler(player).PSendSysMessage("Gender changed. You are now a woman!");
- PSendSysMessage("Gender changed for %s", player->GetName());
- return true;
+ gender_full = "female";
+ new_displayId = player->getRace() == RACE_BLOODELF ? displayId-1 : displayId+1;
+ gender = GENDER_FEMALE;
}
else
{
- PSendSysMessage("You must use male or female as gender.");
+ SendSysMessage(LANG_MUST_MALE_OR_FEMALE);
+ SetSentErrorMessage(true);
+ return false;
+ }
+
+ // Set gender
+ player->SetByteValue(UNIT_FIELD_BYTES_0, 2, gender);
+
+ // Change display ID
+ player->SetDisplayId(new_displayId);
+ player->SetNativeDisplayId(new_displayId);
+
+ PSendSysMessage(LANG_YOU_CHANGE_GENDER, player->GetName(),gender_full);
+ if (needReportToTarget(player))
+ ChatHandler(player).PSendSysMessage(LANG_YOUR_GENDER_CHANGED, gender_full,GetName());
+ return true;
+}
+
+/*------------------------------------------
+ *-------------TRINITY----------------------
+ *-------------------------------------*/
+
+bool ChatHandler::HandlePlayAllCommand(const char* args)
+{
+ if(!*args)
+ return false;
+
+ uint32 soundId = atoi((char*)args);
+
+ if(!sSoundEntriesStore.LookupEntry(soundId))
+ {
+ PSendSysMessage(LANG_SOUND_NOT_EXIST, soundId);
SetSentErrorMessage(true);
return false;
}
+ WorldPacket data(SMSG_PLAY_SOUND, 4);
+ data << uint32(soundId) << m_session->GetPlayer()->GetGUID();
+ sWorld.SendGlobalMessage(&data);
+
+ PSendSysMessage(LANG_COMMAND_PLAYED_TO_ALL, soundId);
return true;
}
diff --git a/src/game/Mail.cpp b/src/game/Mail.cpp
index 6605cc78057..b01a906dbdf 100644
--- a/src/game/Mail.cpp
+++ b/src/game/Mail.cpp
@@ -232,7 +232,7 @@ void WorldSession::HandleSendMail(WorldPacket & recv_data )
if( GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE) )
{
- sLog.outCommand("GM %s (Account: %u) mail item: %s (Entry: %u Count: %u) to player: %s (Account: %u)",
+ sLog.outCommand(GetAccountId(), "GM %s (Account: %u) mail item: %s (Entry: %u Count: %u) to player: %s (Account: %u)",
GetPlayerName(), GetAccountId(), mailItem.item->GetProto()->Name1, mailItem.item->GetEntry(), mailItem.item->GetCount(), receiver.c_str(), rc_account);
}
@@ -251,7 +251,7 @@ void WorldSession::HandleSendMail(WorldPacket & recv_data )
if(money > 0 && GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE))
{
- sLog.outCommand("GM %s (Account: %u) mail money: %u to player: %s (Account: %u)",
+ sLog.outCommand(GetAccountId(),"GM %s (Account: %u) mail money: %u to player: %s (Account: %u)",
GetPlayerName(), GetAccountId(), money, receiver.c_str(), rc_account);
}
}
@@ -460,7 +460,7 @@ void WorldSession::HandleTakeItem(WorldPacket & recv_data )
if(!objmgr.GetPlayerNameByGUID(sender_guid,sender_name))
sender_name = objmgr.GetTrinityStringForDBCLocale(LANG_UNKNOWN);
}
- sLog.outCommand("GM %s (Account: %u) receive mail item: %s (Entry: %u Count: %u) and send COD money: %u to player: %s (Account: %u)",
+ sLog.outCommand(GetAccountId(),"GM %s (Account: %u) receive mail item: %s (Entry: %u Count: %u) and send COD money: %u to player: %s (Account: %u)",
GetPlayerName(),GetAccountId(),it->GetProto()->Name1,it->GetEntry(),it->GetCount(),m->COD,sender_name.c_str(),sender_accId);
}
else if(!receive)
diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp
index 7196b57eac2..0da6e1b74e4 100644
--- a/src/game/MiscHandler.cpp
+++ b/src/game/MiscHandler.cpp
@@ -1275,14 +1275,12 @@ void WorldSession::HandleWhoisOpcode(WorldPacket& recv_data)
return;
}
- if(charname.empty())
+ if(charname.empty() || !normalizePlayerName (charname))
{
SendNotification(LANG_NEED_CHARACTER_NAME);
return;
}
- normalizePlayerName (charname);
-
Player *plr = objmgr.GetPlayer(charname.c_str());
if(!plr)
diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp
index 9d95a995eed..16ef4a26a34 100644
--- a/src/game/ObjectMgr.cpp
+++ b/src/game/ObjectMgr.cpp
@@ -401,7 +401,7 @@ void ObjectMgr::SendAuctionWonMail( AuctionEntry *auction )
uint32 owner_accid = GetPlayerAccountIdByGUID(auction->owner);
- sLog.outCommand("GM %s (Account: %u) won item in auction: %s (Entry: %u Count: %u) and pay money: %u. Original owner %s (Account: %u)",
+ sLog.outCommand(bidder_accId,"GM %s (Account: %u) won item in auction: %s (Entry: %u Count: %u) and pay money: %u. Original owner %s (Account: %u)",
bidder_name.c_str(),bidder_accId,pItem->GetProto()->Name1,pItem->GetEntry(),pItem->GetCount(),auction->bid,owner_name.c_str(),owner_accid);
}
}
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index c081d6cc8a4..6e51e368281 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -11936,7 +11936,7 @@ void Player::SendPreparedQuest( uint64 guid )
else if( status == DIALOG_STATUS_INCOMPLETE )
PlayerTalkClass->SendQuestGiverRequestItems( pQuest, guid, false, true );
// Send completable on repeatable quest if player don't have quest
- else if( pQuest->IsRepeatable() )
+ else if( pQuest->IsRepeatable() && !pQuest->IsDaily() )
PlayerTalkClass->SendQuestGiverRequestItems( pQuest, guid, CanCompleteRepeatableQuest(pQuest), true );
else
PlayerTalkClass->SendQuestGiverQuestDetails( pQuest, guid, true );
@@ -12178,7 +12178,7 @@ bool Player::CanRewardQuest( Quest const *pQuest, bool msg )
if(!pQuest->IsAutoComplete() && GetQuestStatus(pQuest->GetQuestId()) != QUEST_STATUS_COMPLETE)
return false;
- // daily quest can't be rewarded (10 daily quest already completed)
+ // daily quest can't be rewarded (25 daily quest already completed)
if(!SatisfyQuestDay(pQuest,true))
return false;
@@ -12779,6 +12779,15 @@ bool Player::SatisfyQuestExclusiveGroup( Quest const* qInfo, bool msg )
if(exclude_Id == qInfo->GetQuestId())
continue;
+ // not allow have daily quest if daily quest from exclusive group already recently completed
+ Quest const* Nquest = objmgr.GetQuestTemplate(exclude_Id);
+ if( !SatisfyQuestDay(Nquest, false) )
+ {
+ if( msg )
+ SendCanTakeQuestResponse( INVALIDREASON_DONT_HAVE_REQ );
+ return false;
+ }
+
QuestStatusMap::iterator i_exstatus = mQuestStatus.find( exclude_Id );
// alternative quest already started or completed
@@ -14658,7 +14667,8 @@ void Player::_LoadQuestStatus(QueryResult *result)
// add to quest log
if( slot < MAX_QUEST_LOG_SIZE &&
( questStatusData.m_status==QUEST_STATUS_INCOMPLETE ||
- questStatusData.m_status==QUEST_STATUS_COMPLETE && !questStatusData.m_rewarded ) )
+ questStatusData.m_status==QUEST_STATUS_COMPLETE &&
+ (!questStatusData.m_rewarded || pQuest->IsDaily()) ) )
{
SetQuestSlot(slot,quest_id,quest_time);
diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp
index d7ed4f3af4c..248171600b6 100644
--- a/src/game/SpellEffects.cpp
+++ b/src/game/SpellEffects.cpp
@@ -3824,10 +3824,12 @@ void Spell::EffectEnchantItemPerm(uint32 i)
return;
if(item_owner!=p_caster && p_caster->GetSession()->GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE) )
- sLog.outCommand("GM %s (Account: %u) enchanting(perm): %s (Entry: %d) for player: %s (Account: %u)",
+ {
+ sLog.outCommand(p_caster->GetSession()->GetAccountId(),"GM %s (Account: %u) enchanting(perm): %s (Entry: %d) for player: %s (Account: %u)",
p_caster->GetName(),p_caster->GetSession()->GetAccountId(),
itemTarget->GetProto()->Name1,itemTarget->GetEntry(),
item_owner->GetName(),item_owner->GetSession()->GetAccountId());
+ }
// remove old enchanting before applying new if equipped
item_owner->ApplyEnchantment(itemTarget,PERM_ENCHANTMENT_SLOT,false);
@@ -3953,10 +3955,12 @@ void Spell::EffectEnchantItemTmp(uint32 i)
return;
if(item_owner!=p_caster && p_caster->GetSession()->GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE) )
- sLog.outCommand("GM %s (Account: %u) enchanting(temp): %s (Entry: %d) for player: %s (Account: %u)",
+ {
+ sLog.outCommand(p_caster->GetSession()->GetAccountId(),"GM %s (Account: %u) enchanting(temp): %s (Entry: %d) for player: %s (Account: %u)",
p_caster->GetName(),p_caster->GetSession()->GetAccountId(),
itemTarget->GetProto()->Name1,itemTarget->GetEntry(),
item_owner->GetName(),item_owner->GetSession()->GetAccountId());
+ }
// remove old enchanting before applying new if equipped
item_owner->ApplyEnchantment(itemTarget,TEMP_ENCHANTMENT_SLOT,false);
diff --git a/src/game/TradeHandler.cpp b/src/game/TradeHandler.cpp
index 6a6c709a42e..58a18896e9f 100644
--- a/src/game/TradeHandler.cpp
+++ b/src/game/TradeHandler.cpp
@@ -195,10 +195,12 @@ void WorldSession::moveItems(Item* myItems[], Item* hisItems[])
// logging
sLog.outDebug("partner storing: %u",myItems[i]->GetGUIDLow());
if( _player->GetSession()->GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE) )
- sLog.outCommand("GM %s (Account: %u) trade: %s (Entry: %d Count: %u) to player: %s (Account: %u)",
+ {
+ sLog.outCommand(_player->GetSession()->GetAccountId(),"GM %s (Account: %u) trade: %s (Entry: %d Count: %u) to player: %s (Account: %u)",
_player->GetName(),_player->GetSession()->GetAccountId(),
myItems[i]->GetProto()->Name1,myItems[i]->GetEntry(),myItems[i]->GetCount(),
_player->pTrader->GetName(),_player->pTrader->GetSession()->GetAccountId());
+ }
// store
_player->pTrader->MoveItemToInventory( traderDst, myItems[i], true, true);
@@ -208,10 +210,12 @@ void WorldSession::moveItems(Item* myItems[], Item* hisItems[])
// logging
sLog.outDebug("player storing: %u",hisItems[i]->GetGUIDLow());
if( _player->pTrader->GetSession()->GetSecurity() > SEC_PLAYER && sWorld.getConfig(CONFIG_GM_LOG_TRADE) )
- sLog.outCommand("GM %s (Account: %u) trade: %s (Entry: %d Count: %u) to player: %s (Account: %u)",
+ {
+ sLog.outCommand(_player->pTrader->GetSession()->GetAccountId(),"GM %s (Account: %u) trade: %s (Entry: %d Count: %u) to player: %s (Account: %u)",
_player->pTrader->GetName(),_player->pTrader->GetSession()->GetAccountId(),
hisItems[i]->GetProto()->Name1,hisItems[i]->GetEntry(),hisItems[i]->GetCount(),
_player->GetName(),_player->GetSession()->GetAccountId());
+ }
// store
_player->MoveItemToInventory( playerDst, hisItems[i], true, true);
@@ -378,15 +382,19 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/)
if(sWorld.getConfig(CONFIG_GM_LOG_TRADE))
{
if( _player->GetSession()->GetSecurity() > SEC_PLAYER && _player->tradeGold > 0)
- sLog.outCommand("GM %s (Account: %u) give money (Amount: %u) to player: %s (Account: %u)",
+ {
+ sLog.outCommand(_player->GetSession()->GetAccountId(),"GM %s (Account: %u) give money (Amount: %u) to player: %s (Account: %u)",
_player->GetName(),_player->GetSession()->GetAccountId(),
_player->tradeGold,
_player->pTrader->GetName(),_player->pTrader->GetSession()->GetAccountId());
+ }
if( _player->pTrader->GetSession()->GetSecurity() > SEC_PLAYER && _player->pTrader->tradeGold > 0)
- sLog.outCommand("GM %s (Account: %u) give money (Amount: %u) to player: %s (Account: %u)",
+ {
+ sLog.outCommand(_player->pTrader->GetSession()->GetAccountId(),"GM %s (Account: %u) give money (Amount: %u) to player: %s (Account: %u)",
_player->pTrader->GetName(),_player->pTrader->GetSession()->GetAccountId(),
_player->pTrader->tradeGold,
_player->GetName(),_player->GetSession()->GetAccountId());
+ }
}
// update money
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 38853c67635..c227eece88c 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -6932,7 +6932,7 @@ bool Unit::Attack(Unit *victim, bool meleeAttack)
data << uint32(AI_REACTION_AGGRO); // Aggro sound
((WorldObject*)this)->SendMessageToSet(&data, true);
- ((Creature*)this)->CallAssistence();
+ ((Creature*)this)->CallAssistance();
((Creature*)this)->SetCombatStartPosition(GetPositionX(), GetPositionY(), GetPositionZ());
}
@@ -6966,7 +6966,7 @@ bool Unit::AttackStop()
if( GetTypeId()==TYPEID_UNIT )
{
// reset call assistance
- ((Creature*)this)->SetNoCallAssistence(false);
+ ((Creature*)this)->SetNoCallAssistance(false);
}
SendAttackStop(victim);
diff --git a/src/game/World.cpp b/src/game/World.cpp
index 64c2bd49099..11236caa59e 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -738,7 +738,8 @@ void World::LoadConfigSettings(bool reload)
m_configs[CONFIG_EVENT_ANNOUNCE] = sConfig.GetIntDefault("Event.Announce",0);
- m_configs[CONFIG_CREATURE_FAMILY_ASSISTEMCE_RADIUS] = sConfig.GetIntDefault("CreatureFamilyAssistenceRadius",10);
+ m_configs[CONFIG_CREATURE_FAMILY_ASSISTANCE_RADIUS] = sConfig.GetIntDefault("CreatureFamilyAssistanceRadius",10);
+ m_configs[CONFIG_CREATURE_FAMILY_ASSISTANCE_DELAY] = sConfig.GetIntDefault("CreatureFamilyAssistanceDelay",1500);
m_configs[CONFIG_WORLD_BOSS_LEVEL_DIFF] = sConfig.GetIntDefault("WorldBossLevelDiff",3);
diff --git a/src/game/World.h b/src/game/World.h
index 50065b360dd..2be2360728d 100644
--- a/src/game/World.h
+++ b/src/game/World.h
@@ -147,7 +147,8 @@ enum WorldConfigs
CONFIG_CHATFLOOD_MESSAGE_DELAY,
CONFIG_CHATFLOOD_MUTE_TIME,
CONFIG_EVENT_ANNOUNCE,
- CONFIG_CREATURE_FAMILY_ASSISTEMCE_RADIUS,
+ CONFIG_CREATURE_FAMILY_ASSISTANCE_RADIUS,
+ CONFIG_CREATURE_FAMILY_ASSISTANCE_DELAY,
CONFIG_WORLD_BOSS_LEVEL_DIFF,
CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF,
CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF,
diff --git a/src/shared/Log.cpp b/src/shared/Log.cpp
index e30ecc56f25..fba8adc806b 100644
--- a/src/shared/Log.cpp
+++ b/src/shared/Log.cpp
@@ -38,6 +38,13 @@ enum LogType
const int LogType_count = int(LogError) +1;
+Log::Log() :
+ raLogfile(NULL), logfile(NULL), gmLogfile(NULL), charLogfile(NULL),
+ dberLogfile(NULL), m_colored(false), m_includeTime(false), m_gmlog_per_account(false)
+{
+ Initialize();
+}
+
void Log::InitColors(std::string str)
{
if(str.empty())
@@ -175,73 +182,56 @@ void Log::SetLogFileLevel(char *Level)
void Log::Initialize()
{
- std::string logsDir = sConfig.GetStringDefault("LogsDir","");
-
- if(!logsDir.empty())
+ /// Common log files data
+ m_logsDir = sConfig.GetStringDefault("LogsDir","");
+ if(!m_logsDir.empty())
{
- if((logsDir.at(logsDir.length()-1)!='/') && (logsDir.at(logsDir.length()-1)!='\\'))
- logsDir.append("/");
+ if((m_logsDir.at(m_logsDir.length()-1)!='/') && (m_logsDir.at(m_logsDir.length()-1)!='\\'))
+ m_logsDir.append("/");
}
- std::string logfn=sConfig.GetStringDefault("LogFile", "");
- if(!logfn.empty())
- {
- if(sConfig.GetBoolDefault("LogTimestamp",false))
- {
- std::string logTimestamp = GetTimestampStr();
- logTimestamp.insert(0,"_");
- size_t dot_pos = logfn.find_last_of(".");
- if(dot_pos!=logfn.npos)
- logfn.insert(dot_pos,logTimestamp);
- else
- logfn += logTimestamp;
- }
+ m_logsTimestamp = "_" + GetTimestampStr();
- logfile = fopen((logsDir+logfn).c_str(), "w");
- }
+ /// Open specific log files
+ logfile = openLogFile("LogFile","LogTimestamp","w");
- std::string gmlogname = sConfig.GetStringDefault("GMLogFile", "");
- if(!gmlogname.empty())
+ m_gmlog_per_account = sConfig.GetBoolDefault("GmLogPerAccount",false);
+ if(!m_gmlog_per_account)
+ gmLogfile = openLogFile("GMLogFile","GmLogTimestamp","a");
+ else
{
- if(sConfig.GetBoolDefault("GmLogTimestamp",false))
+ // GM log settings for per account case
+ m_gmlog_filename_format = sConfig.GetStringDefault("GMLogFile", "");
+ if(!m_gmlog_filename_format.empty())
{
- std::string gmLogTimestamp = GetTimestampStr();
- gmLogTimestamp.insert(0,"_");
- size_t dot_pos = gmlogname.find_last_of(".");
- if(dot_pos!=gmlogname.npos)
- gmlogname.insert(dot_pos,gmLogTimestamp);
- else
- gmlogname += gmLogTimestamp;
- }
- gmLogfile = fopen((logsDir+gmlogname).c_str(), "a");
- }
+ bool m_gmlog_timestamp = sConfig.GetBoolDefault("GmLogTimestamp",false);
- std::string charlogname = sConfig.GetStringDefault("CharLogFile", "");
- if(!charlogname.empty())
- {
- if(sConfig.GetBoolDefault("CharLogTimestamp",false))
- {
- std::string charLogTimestamp = GetTimestampStr();
- charLogTimestamp.insert(0,"_");
- size_t dot_pos = charlogname.find_last_of(".");
- if(dot_pos!=charlogname.npos)
- charlogname.insert(dot_pos,charLogTimestamp);
+ size_t dot_pos = m_gmlog_filename_format.find_last_of(".");
+ if(dot_pos!=m_gmlog_filename_format.npos)
+ {
+ if(m_gmlog_timestamp)
+ m_gmlog_filename_format.insert(dot_pos,m_logsTimestamp);
+
+ m_gmlog_filename_format.insert(dot_pos,"_#%u");
+ }
else
- charlogname += charLogTimestamp;
+ {
+ m_gmlog_filename_format += "_#%u";
+
+ if(m_gmlog_timestamp)
+ m_gmlog_filename_format += m_logsTimestamp;
+ }
+
+ m_gmlog_filename_format = m_logsDir + m_gmlog_filename_format;
}
- charLogfile = fopen((logsDir+charlogname).c_str(), "a");
}
- std::string dberlogname = sConfig.GetStringDefault("DBErrorLogFile", "");
- if(!dberlogname.empty())
- {
- dberLogfile = fopen((logsDir+dberlogname).c_str(), "a");
- }
- std::string ralogname = sConfig.GetStringDefault("RaLogFile", "");
- if(!ralogname.empty())
- {
- raLogfile = fopen((logsDir+ralogname).c_str(), "a");
- }
+ charLogfile = openLogFile("CharLogFile","CharLogTimestamp","a");
+
+ dberLogfile = openLogFile("DBErrorLogFile",NULL,"a");
+ raLogfile = openLogFile("RaLogFile",NULL,"a");
+
+ // Main log file settings
m_includeTime = sConfig.GetBoolDefault("LogTime", false);
m_logLevel = sConfig.GetIntDefault("LogLevel", 0);
m_logFileLevel = sConfig.GetIntDefault("LogFileLevel", 0);
@@ -256,9 +246,38 @@ void Log::Initialize()
if(sConfig.GetBoolDefault("LogFilter_VisibilityChanges", true))
m_logFilter |= LOG_FILTER_VISIBILITY_CHANGES;
+ // Char log settings
m_charLog_Dump = sConfig.GetBoolDefault("CharLogDump", false);
}
+FILE* Log::openLogFile(char const* configFileName,char const* configTimeStampFlag, char const* mode)
+{
+ std::string logfn=sConfig.GetStringDefault(configFileName, "");
+ if(logfn.empty())
+ return NULL;
+
+ if(configTimeStampFlag && sConfig.GetBoolDefault(configTimeStampFlag,false))
+ {
+ size_t dot_pos = logfn.find_last_of(".");
+ if(dot_pos!=logfn.npos)
+ logfn.insert(dot_pos,m_logsTimestamp);
+ else
+ logfn += m_logsTimestamp;
+ }
+
+ return fopen((m_logsDir+logfn).c_str(), mode);
+}
+
+FILE* Log::openGmlogPerAccount(uint32 account)
+{
+ if(m_gmlog_filename_format.empty())
+ return NULL;
+
+ char namebuf[MAX_PATH];
+ snprintf(namebuf,MAX_PATH,m_gmlog_filename_format.c_str(),account);
+ return fopen(namebuf, "a");
+}
+
void Log::outTimestamp(FILE* file)
{
time_t t = time(NULL);
@@ -577,7 +596,7 @@ void Log::outDebug( const char * str, ... )
fflush(stdout);
}
-void Log::outCommand( const char * str, ... )
+void Log::outCommand( uint32 account, const char * str, ... )
{
if( !str )
return;
@@ -607,7 +626,21 @@ void Log::outCommand( const char * str, ... )
va_end(ap);
fflush(logfile);
}
- if(gmLogfile)
+
+ if (m_gmlog_per_account)
+ {
+ if (FILE* per_file = openGmlogPerAccount (account))
+ {
+ va_list ap;
+ outTimestamp(per_file);
+ va_start(ap, str);
+ vfprintf(per_file, str, ap);
+ fprintf(per_file, "\n" );
+ va_end(ap);
+ fclose(per_file);
+ }
+ }
+ else if (gmLogfile)
{
va_list ap;
outTimestamp(gmLogfile);
@@ -617,6 +650,7 @@ void Log::outCommand( const char * str, ... )
va_end(ap);
fflush(gmLogfile);
}
+
fflush(stdout);
}
diff --git a/src/shared/Log.h b/src/shared/Log.h
index c22c9e6778b..02f996d26c5 100644
--- a/src/shared/Log.h
+++ b/src/shared/Log.h
@@ -58,7 +58,8 @@ const int Color_count = int(WHITE)+1;
class Log : public Trinity::Singleton<Log, Trinity::ClassLevelLockable<Log, ZThread::FastMutex> >
{
friend class Trinity::OperatorNew<Log>;
- Log() : raLogfile(NULL), logfile(NULL), gmLogfile(NULL), charLogfile(NULL), dberLogfile(NULL), m_colored(false) { Initialize(); }
+ Log();
+
~Log()
{
if( logfile != NULL )
@@ -85,7 +86,7 @@ class Log : public Trinity::Singleton<Log, Trinity::ClassLevelLockable<Log, ZThr
void Initialize();
void InitColors(std::string init_str);
void outTitle( const char * str);
- void outCommand( const char * str, ...) ATTR_PRINTF(2,3);
+ void outCommand( uint32 account, const char * str, ...) ATTR_PRINTF(3,4);
void outString(); // any log level
// any log level
void outString( const char * str, ... ) ATTR_PRINTF(2,3);
@@ -120,6 +121,9 @@ class Log : public Trinity::Singleton<Log, Trinity::ClassLevelLockable<Log, ZThr
bool IsOutCharDump() const { return m_charLog_Dump; }
bool IsIncludeTime() const { return m_includeTime; }
private:
+ FILE* openLogFile(char const* configFileName,char const* configTimeStampFlag, char const* mode);
+ FILE* openGmlogPerAccount(uint32 account);
+
FILE* raLogfile;
FILE* logfile;
FILE* gmLogfile;
@@ -134,9 +138,16 @@ class Log : public Trinity::Singleton<Log, Trinity::ClassLevelLockable<Log, ZThr
Color m_colors[4];
uint32 m_logFilter;
+ // cache values for after initilization use (like gm log per account case)
+ std::string m_logsDir;
+ std::string m_logsTimestamp;
+
// char log control
bool m_charLog_Dump;
+ // gm log control
+ bool m_gmlog_per_account;
+ std::string m_gmlog_filename_format;
};
#define sLog Trinity::Singleton<Log>::Instance()
diff --git a/src/shared/Util.h b/src/shared/Util.h
index 690f1ec0ac0..44c0dda8370 100644
--- a/src/shared/Util.h
+++ b/src/shared/Util.h
@@ -172,9 +172,19 @@ inline bool isEastAsianCharacter(wchar_t wchar)
return false;
}
+inline bool isNumeric(wchar_t wchar)
+{
+ return (wchar >= L'0' && wchar <=L'9');
+}
+
+inline bool isNumeric(char c)
+{
+ return (c >= '0' && c <='9');
+}
+
inline bool isNumericOrSpace(wchar_t wchar)
{
- return (wchar >= L'0' && wchar <=L'9') || wchar == L' ';
+ return isNumeric(wchar) || wchar == L' ';
}
inline bool isBasicLatinString(std::wstring wstr, bool numericOrSpace)
diff --git a/src/trinitycore/trinitycore.conf.dist b/src/trinitycore/trinitycore.conf.dist
index ad4ea6618e0..f9233dff65e 100644
--- a/src/trinitycore/trinitycore.conf.dist
+++ b/src/trinitycore/trinitycore.conf.dist
@@ -621,6 +621,10 @@ TalentsInspecting = 1
# Default: 10
# 0 - off
#
+# CreatureFamilyAssistanceDelay
+# Reaction time for creature assistance call
+# Default: 1500 (1.5s)
+#
# WorldBossLevelDiff
# Difference for boss dynamic level with target
# Default: 3
@@ -666,6 +670,7 @@ TalentsInspecting = 1
ThreatRadius = 100
Rate.Creature.Aggro = 1
CreatureFamilyAssistenceRadius = 10
+CreatureFamilyAssistanceDelay = 1500
WorldBossLevelDiff = 3
Corpse.Decay.NORMAL = 60
Corpse.Decay.RARE = 300