aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorn0n4m3 <none@none>2010-04-14 13:29:56 +0400
committern0n4m3 <none@none>2010-04-14 13:29:56 +0400
commita6af93c3d6df91e6f9f5d374a55ef1d7b8d7a5f4 (patch)
treeca5179cadd1785e92cf79dd48f2392e46fdcda7e /src
parent8b6005666dc10ba6acb423c7ad936b8b290fd6ee (diff)
Create new table character_stats for external tools(website,etc). This table use only when player logout. Original code by hunuza.
--HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/game/Player.cpp39
-rw-r--r--src/game/Player.h1
-rw-r--r--src/game/World.cpp8
-rw-r--r--src/game/World.h2
-rw-r--r--src/trinitycore/trinitycore.conf.dist12
5 files changed, 62 insertions, 0 deletions
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index 0d70553c2c0..8441dd31fa5 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -17448,6 +17448,11 @@ void Player::SaveToDB()
CharacterDatabase.CommitTransaction();
+ // check if stats should only be saved on logout
+ // save stats can be out of transaction
+ if (m_session->isLogingOut() || !sWorld.getConfig(CONFIG_STATS_SAVE_ONLY_ON_LOGOUT))
+ _SaveStats();
+
// save pet (hunter pet level and experience and all type pets health/mana).
if (Pet* pet = GetPet())
pet->SavePetToDB(PET_SAVE_AS_CURRENT);
@@ -17789,6 +17794,40 @@ void Player::_SaveSpells()
}
}
+// save player stats -- only for external usage
+// real stats will be recalculated on player login
+void Player::_SaveStats()
+{
+ // check if stat saving is enabled and if char level is high enough
+ if (!sWorld.getConfig(CONFIG_MIN_LEVEL_STAT_SAVE) || getLevel() < sWorld.getConfig(CONFIG_MIN_LEVEL_STAT_SAVE))
+ return;
+
+ CharacterDatabase.PExecute("DELETE FROM character_stats WHERE guid = '%u'", GetGUIDLow());
+ std::ostringstream ss;
+ ss << "INSERT INTO character_stats (guid, maxhealth, maxpower1, maxpower2, maxpower3, maxpower4, maxpower5, maxpower6, maxpower7, "
+ "strength, agility, stamina, intellect, spirit, armor, resHoly, resFire, resNature, resFrost, resShadow, resArcane, "
+ "blockPct, dodgePct, parryPct, critPct, rangedCritPct, spellCritPct, attackPower, rangedAttackPower, spellPower) VALUES ("
+ << GetGUIDLow() << ", "
+ << GetMaxHealth() << ", ";
+ for (int i = 0; i < MAX_POWERS; ++i)
+ ss << GetMaxPower(Powers(i)) << ", ";
+ for (int i = 0; i < MAX_STATS; ++i)
+ ss << GetStat(Stats(i)) << ", ";
+ // armor + school resistances
+ for (int i = 0; i < MAX_SPELL_SCHOOL; ++i)
+ ss << GetResistance(SpellSchools(i)) << ",";
+ ss << GetFloatValue(PLAYER_BLOCK_PERCENTAGE) << ", "
+ << GetFloatValue(PLAYER_DODGE_PERCENTAGE) << ", "
+ << GetFloatValue(PLAYER_PARRY_PERCENTAGE) << ", "
+ << GetFloatValue(PLAYER_CRIT_PERCENTAGE) << ", "
+ << GetFloatValue(PLAYER_RANGED_CRIT_PERCENTAGE) << ", "
+ << GetFloatValue(PLAYER_SPELL_CRIT_PERCENTAGE1) << ", "
+ << GetUInt32Value(UNIT_FIELD_ATTACK_POWER) << ", "
+ << GetUInt32Value(UNIT_FIELD_RANGED_ATTACK_POWER) << ", "
+ << GetBaseSpellPowerBonus() << ")";
+ CharacterDatabase.Execute(ss.str().c_str());
+}
+
void Player::outDebugValues() const
{
if (!sLog.IsOutDebug()) // optimize disabled debug output
diff --git a/src/game/Player.h b/src/game/Player.h
index 244a50c58ca..bccf9030fe1 100644
--- a/src/game/Player.h
+++ b/src/game/Player.h
@@ -2411,6 +2411,7 @@ class Player : public Unit, public GridObject<Player>
void _SaveBGData();
void _SaveGlyphs();
void _SaveTalents();
+ void _SaveStats();
void _SetCreateBits(UpdateMask *updateMask, Player *target) const;
void _SetUpdateBits(UpdateMask *updateMask, Player *target) const;
diff --git a/src/game/World.cpp b/src/game/World.cpp
index 630f339b7e4..057e3489216 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -613,6 +613,14 @@ void World::LoadConfigSettings(bool reload)
m_configs[CONFIG_GRID_UNLOAD] = sConfig.GetBoolDefault("GridUnload", true);
m_configs[CONFIG_INTERVAL_SAVE] = sConfig.GetIntDefault("PlayerSaveInterval", 15 * MINUTE * IN_MILISECONDS);
m_configs[CONFIG_INTERVAL_DISCONNECT_TOLERANCE] = sConfig.GetIntDefault("DisconnectToleranceInterval", 0);
+ m_configs[CONFIG_STATS_SAVE_ONLY_ON_LOGOUT] = sConfig.GetBoolDefault("PlayerSave.Stats.SaveOnlyOnLogout", true);
+
+ m_configs[CONFIG_MIN_LEVEL_STAT_SAVE] = sConfig.GetIntDefault("PlayerSave.Stats.MinLevel", 0);
+ if (m_configs[CONFIG_MIN_LEVEL_STAT_SAVE] > MAX_LEVEL)
+ {
+ sLog.outError("PlayerSave.Stats.MinLevel (%i) must be in range 0..80. Using default, do not save character stats (0).",m_configs[CONFIG_MIN_LEVEL_STAT_SAVE]);
+ m_configs[CONFIG_MIN_LEVEL_STAT_SAVE] = 0;
+ }
m_configs[CONFIG_INTERVAL_GRIDCLEAN] = sConfig.GetIntDefault("GridCleanUpDelay", 5 * MINUTE * IN_MILISECONDS);
if (m_configs[CONFIG_INTERVAL_GRIDCLEAN] < MIN_GRID_DELAY)
diff --git a/src/game/World.h b/src/game/World.h
index 958ab584488..0a336395921 100644
--- a/src/game/World.h
+++ b/src/game/World.h
@@ -274,6 +274,8 @@ enum WorldConfigs
CONFIG_CLIENTCACHE_VERSION,
CONFIG_GUILD_EVENT_LOG_COUNT,
CONFIG_GUILD_BANK_EVENT_LOG_COUNT,
+ CONFIG_MIN_LEVEL_STAT_SAVE,
+ CONFIG_STATS_SAVE_ONLY_ON_LOGOUT,
CONFIG_VALUE_COUNT
};
diff --git a/src/trinitycore/trinitycore.conf.dist b/src/trinitycore/trinitycore.conf.dist
index 4e94e3dee75..c6582bb1837 100644
--- a/src/trinitycore/trinitycore.conf.dist
+++ b/src/trinitycore/trinitycore.conf.dist
@@ -145,6 +145,16 @@ EAIErrorLevel = 2
# Player save interval (in milliseconds)
# Default: 900000 (15 min)
#
+# PlayerSave.Stats.MinLevel
+# Minimum level for saving character stats for external usage in database
+# Default: 0 (do not save character stats)
+# 1+ (save stats for characters with level 1+)
+#
+# PlayerSave.Stats.SaveOnlyOnLogout
+# Enable/Disable saving of character stats only on logout
+# Default: 1 (only save on logout)
+# 0 (save on every player save)
+#
# vmap.enableLOS
# vmap.enableHeight
# Enable/Disable VMmap support for line of sight and height calculation
@@ -227,6 +237,8 @@ GridCleanUpDelay = 300000
MapUpdateInterval = 100
ChangeWeatherInterval = 600000
PlayerSaveInterval = 900000
+PlayerSave.Stats.MinLevel = 0
+PlayerSave.Stats.SaveOnlyOnLogout = 1
vmap.enableLOS = 0
vmap.enableHeight = 0
vmap.ignoreMapIds = "369"