Skip to content

Commit db7998a

Browse files
committed
Core/Players: use CharacterFlags enums to store player information in database and set player flags accordingly
1 parent 9c96064 commit db7998a

13 files changed

Lines changed: 243 additions & 124 deletions

File tree

sql/base/characters_database.sql

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1560,7 +1560,8 @@ CREATE TABLE `characters` (
15601560
`facialStyle` tinyint unsigned NOT NULL DEFAULT '0',
15611561
`bankSlots` tinyint unsigned NOT NULL DEFAULT '0',
15621562
`restState` tinyint unsigned NOT NULL DEFAULT '0',
1563-
`playerFlags` int unsigned NOT NULL DEFAULT '0',
1563+
`characterFlags` int unsigned NOT NULL DEFAULT '0',
1564+
`characterFlags2` int unsigned NOT NULL DEFAULT '0',
15641565
`position_x` float NOT NULL DEFAULT '0',
15651566
`position_y` float NOT NULL DEFAULT '0',
15661567
`position_z` float NOT NULL DEFAULT '0',
@@ -3063,6 +3064,7 @@ INSERT INTO `updates` VALUES
30633064
('2022_12_24_00_characters.sql','D3F04078C0846BCF7C8330AC20C39B8C3AEE7002','RELEASED','2022-12-24 23:52:52',0),
30643065
('2022_12_26_00_characters.sql','74EDF8E4AC31419144E4535A295DB8B189CFAF95','RELEASED','2022-12-26 10:51:39',0),
30653066
('2023_07_11_00_characters.sql','0BA579ED21F4E75AC2B4797421B5029568B3F6E2','RELEASED','2023-07-16 22:00:15',0),
3067+
('2026_03_18_00_characters.sql','37744EF940E093FF1D21A21DC37FF5D604FD695B','RELEASED','2026-03-22 18:02:12',0),
30663068
('custom_2017_12_21_00_characters.sql','2D5B3830D47E4BC717EC468E18E477A32B9A21BF','ARCHIVED','2019-11-06 00:17:44',0),
30673069
('custom_2018_01_07_00_characters.sql','7437B6243B3CB6FA08F6A37BB39E38930B0DCFD3','ARCHIVED','2019-11-06 00:17:44',0),
30683070
('custom_2018_03_18_00_characters.sql','8D1E81A7272F643687C67443C270D17255A9AA84','ARCHIVED','2019-11-06 00:17:44',0),
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
-- Adding columns
2+
ALTER TABLE `characters`
3+
ADD COLUMN `characterFlags` INT(10) UNSIGNED DEFAULT 0 NOT NULL AFTER `playerFlags`,
4+
ADD COLUMN `characterFlags2` INT(10) UNSIGNED DEFAULT 0 NOT NULL AFTER `characterFlags`;
5+
6+
-- Migrate data
7+
-- Ghost
8+
UPDATE `characters` SET `characterFlags`= `characterFlags` | 0x00002000 WHERE (`playerFlags` & 0x00000010) != 0;
9+
-- Hide Cloak
10+
UPDATE `characters` SET `characterFlags`= `characterFlags` | 0x00000800 WHERE (`playerFlags` & 0x00000800) != 0;
11+
-- Hide Helm
12+
UPDATE `characters` SET `characterFlags`= `characterFlags` | 0x00000400 WHERE (`playerFlags` & 0x00000400) != 0;
13+
-- Game Master
14+
UPDATE `characters` SET `characterFlags`= `characterFlags` | 0x00020000 WHERE (`playerFlags` & 0x00000008) != 0;
15+
-- Resting
16+
UPDATE `characters` SET `characterFlags`= `characterFlags` | 0x00000002 WHERE (`playerFlags` & 0x00000020) != 0;
17+
-- PvP Enabled
18+
UPDATE `characters` SET `characterFlags`= `characterFlags` | 0x00000040 WHERE (`playerFlags` & 0x00000100) != 0;
19+
-- PvP Desired
20+
UPDATE `characters` SET `characterFlags`= `characterFlags` | 0x00010000 WHERE (`playerFlags` & 0x00000200) != 0;
21+
-- No XP Gain
22+
UPDATE `characters` SET `characterFlags2`= `characterFlags2` | 0x00040000 WHERE (`playerFlags` & 0x02000000) != 0;
23+
-- Can Use Void Storage Feature
24+
UPDATE `characters` SET `characterFlags2`= `characterFlags2` | 0x04000000 WHERE (`playerFlags` & 0x20000000) != 0;
25+
-- Low Level Raids enabled
26+
UPDATE `characters` SET `characterFlags2`= `characterFlags2` | 0x20000000 WHERE (`playerFlags` & 0x00010000) != 0;
27+
-- Auto Decline Guild Invites
28+
UPDATE `characters` SET `characterFlags2`= `characterFlags2` | 0x40000000 WHERE (`playerFlags` & 0x08000000) != 0;
29+
30+
-- Conversion done, drop no longer needed column
31+
ALTER TABLE `characters` DROP COLUMN `playerFlags`;

src/server/database/Database/Implementation/CharacterDatabase.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,11 @@ void CharacterDatabaseConnection::DoPrepareStatements()
4343
"subject, deliver_time, expire_time, money, has_items FROM mail WHERE receiver = ? ", CONNECTION_SYNCH);
4444
PrepareStatement(CHAR_SEL_MAIL_LIST_ITEMS, "SELECT itemEntry,count FROM item_instance WHERE guid = ?", CONNECTION_SYNCH);
4545
PrepareStatement(CHAR_SEL_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, "
46-
"gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot "
46+
"gm.guildid, c.characterFlags, c.characterFlags2, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot "
4747
"FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.active = 1 LEFT JOIN guild_member AS gm ON c.guid = gm.guid "
4848
"LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL", CONNECTION_ASYNC);
4949
PrepareStatement(CHAR_SEL_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.level, c.zone, c.map, "
50-
"c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, "
50+
"c.position_x, c.position_y, c.position_z, gm.guildid, c.characterFlags, c.characterFlags2, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, "
5151
"cb.guid, c.slot, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.active = 1 "
5252
"LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid "
5353
"LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL", CONNECTION_ASYNC);
@@ -61,7 +61,7 @@ void CharacterDatabaseConnection::DoPrepareStatements()
6161
PrepareStatement(CHAR_DEL_BATTLEGROUND_RANDOM, "DELETE FROM character_battleground_random WHERE guid = ?", CONNECTION_ASYNC);
6262
PrepareStatement(CHAR_INS_BATTLEGROUND_RANDOM, "INSERT INTO character_battleground_random (guid) VALUES (?)", CONNECTION_ASYNC);
6363

64-
PrepareStatement(CHAR_SEL_CHARACTER, "SELECT c.guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, bankSlots, restState, playerFlags, "
64+
PrepareStatement(CHAR_SEL_CHARACTER, "SELECT c.guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, bankSlots, restState, characterFlags, characterFlags2 "
6565
"position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, "
6666
"resettalents_time, talentTree, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, instance_mode_mask, "
6767
"totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, health, power1, power2, power3, power4, power5, instance_id, talentGroupsCount, activeTalentGroup, "
@@ -378,16 +378,16 @@ void CharacterDatabaseConnection::DoPrepareStatements()
378378
PrepareStatement(CHAR_DEL_LFG_DATA, "DELETE FROM lfg_data WHERE guid = ?", CONNECTION_ASYNC);
379379

380380
// Player saving
381-
PrepareStatement(CHAR_INS_CHARACTER, "INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, bankSlots, restState, playerFlags, "
381+
PrepareStatement(CHAR_INS_CHARACTER, "INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, bankSlots, restState, characterFlags, characterFlags2, "
382382
"map, instance_id, instance_mode_mask, position_x, position_y, position_z, orientation, trans_x, trans_y, trans_z, trans_o, transguid, "
383383
"taximask, cinematic, "
384384
"totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, talentTree, "
385385
"extra_flags, stable_slots, at_login, zone, "
386386
"death_expire_time, taxi_path, totalKills, "
387387
"todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, health, power1, power2, power3, "
388388
"power4, power5, latency, talentGroupsCount, activeTalentGroup, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels, achievementPoints) VALUES "
389-
"(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC);
390-
PrepareStatement(CHAR_UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,skin=?,face=?,hairStyle=?,hairColor=?,facialStyle=?,bankSlots=?,restState=?,playerFlags=?,"
389+
"(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC);
390+
PrepareStatement(CHAR_UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,skin=?,face=?,hairStyle=?,hairColor=?,facialStyle=?,bankSlots=?,restState=?,characterFlags=?,characterFlags2=?,"
391391
"map=?,instance_id=?,instance_mode_mask=?,position_x=?,position_y=?,position_z=?,orientation=?,trans_x=?,trans_y=?,trans_z=?,trans_o=?,transguid=?,taximask=?,cinematic=?,"
392392
"totaltime=?,leveltime=?,rest_bonus=?,logout_time=?,is_logout_resting=?,resettalents_cost=?,resettalents_time=?,talentTree=?,extra_flags=?,stable_slots=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?,"
393393
"totalKills=?,todayKills=?,yesterdayKills=?,chosenTitle=?,"
@@ -451,7 +451,7 @@ void CharacterDatabaseConnection::DoPrepareStatements()
451451
PrepareStatement(CHAR_SEL_CHAR_DEL_INFO_BY_NAME, "SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL AND deleteInfos_Name LIKE CONCAT('%%', ?, '%%')", CONNECTION_SYNCH);
452452
PrepareStatement(CHAR_SEL_CHAR_DEL_INFO, "SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL", CONNECTION_SYNCH);
453453
PrepareStatement(CHAR_SEL_CHARS_BY_ACCOUNT_ID, "SELECT guid FROM characters WHERE account = ?", CONNECTION_SYNCH);
454-
PrepareStatement(CHAR_SEL_CHAR_PINFO, "SELECT totaltime, level, money, account, race, class, map, zone, gender, health, playerFlags FROM characters WHERE guid = ?", CONNECTION_SYNCH);
454+
PrepareStatement(CHAR_SEL_CHAR_PINFO, "SELECT totaltime, level, money, account, race, class, map, zone, gender, health, characterFlags FROM characters WHERE guid = ?", CONNECTION_SYNCH);
455455
PrepareStatement(CHAR_SEL_PINFO_BANS, "SELECT unbandate, bandate = unbandate, bannedby, banreason FROM character_banned WHERE guid = ? AND active ORDER BY bandate ASC LIMIT 1", CONNECTION_SYNCH);
456456
//0: lowGUID
457457
PrepareStatement(CHAR_SEL_PINFO_MAILS, "SELECT SUM(CASE WHEN (checked & 1) THEN 1 ELSE 0 END) AS 'readmail', COUNT(*) AS 'totalmail' FROM mail WHERE `receiver` = ?", CONNECTION_SYNCH);

0 commit comments

Comments
 (0)