From 4a97883559da9cf25c4a816e84241ef930a67784 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Sat, 2 Oct 2021 20:50:59 -0400 Subject: [PATCH] Core/Players: Store player creation timestamp and type (normal/npe) Port From (https://github.com/TrinityCore/TrinityCore/commit/11762273c68b24b332238aa89a73b9ed9ac1d249) --- Source/Framework/Constants/PlayerConst.cs | 6 ++++++ .../Database/Databases/CharacterDatabase.cs | 6 +++--- Source/Game/Entities/Player/Player.DB.cs | 6 ++++++ Source/Game/Entities/Player/Player.Fields.cs | 3 +++ Source/Game/Entities/Player/Player.cs | 1 + sql/base/characters_database.sql | 6 +++++- .../characters/master/2021_10_02_00_characters.sql | 12 ++++++++++++ 7 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 sql/updates/characters/master/2021_10_02_00_characters.sql diff --git a/Source/Framework/Constants/PlayerConst.cs b/Source/Framework/Constants/PlayerConst.cs index fea650cbd..655a15744 100644 --- a/Source/Framework/Constants/PlayerConst.cs +++ b/Source/Framework/Constants/PlayerConst.cs @@ -784,4 +784,10 @@ namespace Framework.Constants Contested = 3, Combat = 4 } + + public enum PlayerCreateMode + { + Normal = 0, + NPE = 1 + } } diff --git a/Source/Framework/Database/Databases/CharacterDatabase.cs b/Source/Framework/Database/Databases/CharacterDatabase.cs index d412fe79b..fb9cde527 100644 --- a/Source/Framework/Database/Databases/CharacterDatabase.cs +++ b/Source/Framework/Database/Databases/CharacterDatabase.cs @@ -81,7 +81,7 @@ namespace Framework.Database PrepareStatement(CharStatements.INS_BATTLEGROUND_RANDOM, "INSERT INTO character_battleground_random (guid) VALUES (?)"); PrepareStatement(CharStatements.SEL_CHARACTER, "SELECT c.guid, account, name, race, class, gender, level, xp, money, inventorySlots, bankSlots, restState, playerFlags, playerFlagsEx, " + - "position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " + + "position_x, position_y, position_z, map, orientation, taximask, createTime, createMode, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " + "resettalents_time, primarySpecialization, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, " + "totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, health, power1, power2, power3, power4, power5, power6, instance_id, activeTalentGroup, lootSpecId, exploredZones, " + "knownTitles, actionBars, raidDifficulty, legacyRaidDifficulty, fishingSteps, honor, honorLevel, honorRestState, honorRestBonus, numRespecs " + @@ -472,10 +472,10 @@ namespace Framework.Database // Player saving PrepareStatement(CharStatements.INS_CHARACTER, "INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, inventorySlots, bankSlots, restState, playerFlags, playerFlagsEx, " + "map, instance_id, dungeonDifficulty, raidDifficulty, legacyRaidDifficulty, position_x, position_y, position_z, orientation, trans_x, trans_y, trans_z, trans_o, transguid, " + - "taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, primarySpecialization, " + + "taximask, createTime, createMode, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, primarySpecialization, " + "extra_flags, stable_slots, at_login, zone, death_expire_time, taxi_path, totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, health, power1, power2, power3, " + "power4, power5, power6, latency, activeTalentGroup, lootSpecId, exploredZones, equipmentCache, knownTitles, actionBars, lastLoginBuild) VALUES " + - "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); + "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); PrepareStatement(CharStatements.UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,inventorySlots=?,bankSlots=?,restState=?,playerFlags=?,playerFlagsEx=?," + "map=?,instance_id=?,dungeonDifficulty=?,raidDifficulty=?,legacyRaidDifficulty=?,position_x=?,position_y=?,position_z=?,orientation=?,trans_x=?,trans_y=?,trans_z=?,trans_o=?,transguid=?,taximask=?,cinematic=?,totaltime=?,leveltime=?,rest_bonus=?," + "logout_time=?,is_logout_resting=?,resettalents_cost=?,resettalents_time=?,numRespecs=?,primarySpecialization=?,extra_flags=?,stable_slots=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?," + diff --git a/Source/Game/Entities/Player/Player.DB.cs b/Source/Game/Entities/Player/Player.DB.cs index d459b78f0..2c9c477e5 100644 --- a/Source/Game/Entities/Player/Player.DB.cs +++ b/Source/Game/Entities/Player/Player.DB.cs @@ -2551,6 +2551,8 @@ namespace Game.Entities uint mapId = result.Read(fieldIndex++); float orientation = result.Read(fieldIndex++); string taximask = result.Read(fieldIndex++); + long createTime = result.Read(fieldIndex++); + PlayerCreateMode createMode = (PlayerCreateMode)result.Read(fieldIndex++); byte cinematic = result.Read(fieldIndex++); uint totaltime = result.Read(fieldIndex++); uint leveltime = result.Read(fieldIndex++); @@ -3030,6 +3032,8 @@ namespace Game.Entities SetDrunkValue(newDrunkValue); + m_createTime = createTime; + m_createMode = createMode; m_cinematic = cinematic; m_PlayedTimeTotal = totaltime; m_PlayedTimeLevel = leveltime; @@ -3385,6 +3389,8 @@ namespace Game.Entities ss.Append(m_taxi.m_taximask[i] + " "); stmt.AddValue(index++, ss.ToString()); + stmt.AddValue(index++, m_createTime); + stmt.AddValue(index++, (byte)m_createMode); stmt.AddValue(index++, m_cinematic); stmt.AddValue(index++, m_PlayedTimeTotal); stmt.AddValue(index++, m_PlayedTimeLevel); diff --git a/Source/Game/Entities/Player/Player.Fields.cs b/Source/Game/Entities/Player/Player.Fields.cs index 957c94532..b76c7ef69 100644 --- a/Source/Game/Entities/Player/Player.Fields.cs +++ b/Source/Game/Entities/Player/Player.Fields.cs @@ -196,6 +196,9 @@ namespace Game.Entities public PlayerData m_playerData; public ActivePlayerData m_activePlayerData; + long m_createTime; + PlayerCreateMode m_createMode; + uint m_nextSave; byte m_cinematic; diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index 025c05016..95b62d9f4 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -194,6 +194,7 @@ namespace Game.Entities } SetMap(Global.MapMgr.CreateMap(info.MapId, this)); + m_createTime = GameTime.GetGameTime(); UpdatePositionData(); PowerType powertype = cEntry.DisplayPower; diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index e1ea55f1a..005b09ff3 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -1806,6 +1806,8 @@ CREATE TABLE `characters` ( `orientation` float NOT NULL DEFAULT '0', `taximask` text NOT NULL, `online` tinyint(3) unsigned NOT NULL DEFAULT '0', + `createTime` bigint(20) NOT NULL DEFAULT '0', + `createMode` tinyint(4) NOT NULL DEFAULT '0', `cinematic` tinyint(3) unsigned NOT NULL DEFAULT '0', `totaltime` int(10) unsigned NOT NULL DEFAULT '0', `leveltime` int(10) unsigned NOT NULL DEFAULT '0', @@ -3718,7 +3720,9 @@ INSERT INTO `updates` VALUES ('2021_05_11_00_characters.sql','C3F0337CE8363F970AB4FDB9D23BBB7C650A0B0E','ARCHIVED','2021-05-11 15:39:26',0), ('2021_07_04_00_characters.sql','E0E7AD664DDB553E96B457DD9ED8976665E94007','ARCHIVED','2021-07-04 22:23:24',0), ('2021_08_11_00_characters.sql','2137A52A45B045104B97D39626CE3C0214625B17','ARCHIVED','2021-08-11 21:48:57',0), -('2021_08_18_00_characters.sql','5BA1326EE8EC907CDE82E6E8BCB38EA2E661F10A','ARCHIVED','2021-08-18 15:14:17',0); +('2021_08_18_00_characters.sql','5BA1326EE8EC907CDE82E6E8BCB38EA2E661F10A','ARCHIVED','2021-08-18 15:14:17',0), +('2021_10_02_00_characters.sql','C6831D3ED03F6BD390A5E5E403FA402D6DC0E95D','RELEASED','2021-10-02 21:21:37',0), +('2021_10_02_01_characters.sql','F97B956F3B5F909294CA399F75B5795A07C4D8EC','RELEASED','2021-10-02 21:47:38',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/updates/characters/master/2021_10_02_00_characters.sql b/sql/updates/characters/master/2021_10_02_00_characters.sql new file mode 100644 index 000000000..e6e6285b7 --- /dev/null +++ b/sql/updates/characters/master/2021_10_02_00_characters.sql @@ -0,0 +1,12 @@ +ALTER TABLE `characters` + ADD `createTime` bigint(20) NOT NULL DEFAULT '0' AFTER `online`, + ADD `createMode` tinyint(4) NOT NULL DEFAULT '0' AFTER `createTime`; + + -- AT_LOGIN_FIRST: Characters that have never logged in have accurate creation timestamp in `logout_time` +UPDATE `characters` SET `createTime`=`logout_time` WHERE (`at_login` & 0x20) != 0; + -- attempt to find lowest criteria timestamp for characters that have logged in already +UPDATE `characters` SET `createTime`=(SELECT COALESCE(MIN(candidates.`date`), UNIX_TIMESTAMP()) FROM ( +SELECT MIN(cap.`date`) `date` FROM `character_achievement_progress` cap WHERE cap.`guid`=`characters`.`guid` +UNION +SELECT MIN(ca.`date`) `date` FROM `character_achievement` ca WHERE ca.`guid`=`characters`.`guid` +) candidates) WHERE (`at_login` & 0x20) = 0;