mirror of
https://github.com/EQEmu/Server.git
synced 2026-09-04 06:16:38 +00:00
[Feature] Add RoF2 Guild features (#3699)
* [Feature] Add additional Guild Features This adds the following guild features and design pattern - the existing guild system was used - guild features are based on RoF2 within source with translaters used to converted between client differences - backward compatible with Ti and UF, and allows for mixed client servers - Guild Back for Ti and UF is based on RoF2 Permissions for banking if Guild Leader does not use Ti/UF - Guild Ranks and Permissions are enabled. - Guild Tributes are enabled. - Event logging via rules for donating tribute items and plat - Rules to limit Guild Tributes based on max level of server - Rewrote guild communications to client using specific opcodes -- Server no longer sends a guild member list on each zone -- Guild window is updated when a member levels, rank changes, zone changes, banker/alt status using individual opcodes -- When a member is removed or added to a guild, a single opcode is sent to each guild member -- This reduces network traffic considerably Known issues: - Visual bug only. Guild Tributes window will display a 0 for level if tribute is above max level rule setting. - Visual bug only. Guild Mgmt Window will not display an online member if the player has 'show offline' unchecked and a guild member zones within the Notes/Tribute tab. This is resolved by selecting and de-selecting the 'Show Offline' checkbox. * Updated RoF2 Guild Comms Updated RoF2 Guild Comms Update RoF2 Opcodes Rewrote RoF2 Guild Communications using specific opcodes. Added database changes - they are irreversible * Formatting * Update base_guild_members_repository.h * Format GuildInfo * Format GuildAction enum * Formatting in clientlist * quantity vs quantity * desc vs description * Format structs * Inline struct values * Formatting * Formatting * Formatting fixes * Formatting items * Formatting * Formatting * struct formatting updates * Updated formatting * Updated - std:string items - naming conventions - magic numbers * Repo refactors Other formatting updates * Remove test guild commands * Updated #guild info command * Add new repo methods for Neckolla ReplaceOne and ReplaceMany * Fix guild_tributes repo * Update database_update_manifest.cpp * Phase 1 of final testing with RoF2 -> RoF2. Next phase will be inter compatibility review * Remove #guild testing commands * Fix uf translator error Rewrite LoadGuilds * Use extended repository * FIx guild window on member add * LoadGuild Changes * Update guild_base.cpp * Few small fixes for display issue with UF * Update guild_base.cpp * Update guild_members_repository.h * Update zoneserver.cpp * Update guild.cpp * Update entity.h * Switch formatting * Formatting * Update worldserver.cpp * Switch formatting * Formatting switch statement * Update guild.cpp * Formatting in guild_base * We don't need to validate m_db everywhere * More formatting / spacing issues * Switch format * Update guild_base.cpp * Fix an UF issue displaying incorrect guildtag as <> * Updated several constants, fixed a few issues with Ti/UF and guild tributes not being removed or sent when a member is removed/disbands from a guild. * Formatting and logging updates * Fix for Loadguilds and permissions after repo updates. * Cleanup unnecessary m_db checks * Updated logging to use player_event_logs * Updated to use the single opcodes for guild traffic for Ti/UF/RoF2. Several enhancements for guild functionality for more reusable code and readability. * Update to fix Demote Self and guild invites declining when option set to not accept guild invites * Potential fix for guild notes/tribute display issues when client has 'Show Offline' unchecked. * Updates to fox recent master changes Updates to fix recent master changes * Updates in response to comments * Further Updates in response to comments * Comment updates and refactor for SendAppearance functions * Comment updates * Update client spawn process for show guild name Add show guild tag to default spawn process * Update to use zone spawn packets for RoF2 Removed several unused functions as a result Updated MemberRankUpdate to properly update guild_show on rank change. Updated OP_GuildURLAndChannel opcode for UF/RoF2 * Cleanup of world changes Created function for repetitive zonelist sendpackets to only booted zones Re-Inserted accidental delete of scanclosemobs * Fixes * Further world cleanup * Fix a few test guild bank cases for backward compat Removed a duplicate db call Fixed a fallthrough issue * Update guild_mgr.cpp * Cleanup --------- Co-authored-by: Akkadius <akkadius1@gmail.com>
This commit is contained in:
@@ -222,6 +222,9 @@ SET(repositories
|
||||
repositories/base/base_group_leaders_repository.h
|
||||
repositories/base/base_guilds_repository.h
|
||||
repositories/base/base_guild_ranks_repository.h
|
||||
repositories/base/base_guild_permissions_repository.h
|
||||
repositories/base/base_guild_members_repository.h
|
||||
repositories/base/base_guild_bank_repository.h
|
||||
repositories/base/base_guild_relations_repository.h
|
||||
repositories/base/base_horses_repository.h
|
||||
repositories/base/base_instance_list_repository.h
|
||||
@@ -399,6 +402,9 @@ SET(repositories
|
||||
repositories/group_leaders_repository.h
|
||||
repositories/guilds_repository.h
|
||||
repositories/guild_ranks_repository.h
|
||||
repositories/guild_permissions_repository.h
|
||||
repositories/guild_members_repository.h
|
||||
repositories/guild_bank_repository.h
|
||||
repositories/guild_relations_repository.h
|
||||
repositories/horses_repository.h
|
||||
repositories/instance_list_repository.h
|
||||
|
||||
@@ -4844,7 +4844,7 @@ UPDATE data_buckets SET bot_id = SUBSTRING_INDEX(SUBSTRING_INDEX( `key`, '-', 2
|
||||
ADD COLUMN `marked_npc_3_zone_id` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `marked_npc_3_entity_id`,
|
||||
ADD COLUMN `marked_npc_3_instance_id` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `marked_npc_3_zone_id`;
|
||||
)"
|
||||
},
|
||||
},
|
||||
ManifestEntry{
|
||||
.version = 9235,
|
||||
.description = "2023_07_31_character_stats_record.sql",
|
||||
@@ -5284,7 +5284,68 @@ ADD COLUMN `gm_exp` int(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `rez_time`,
|
||||
ADD COLUMN `killed_by` int(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `gm_exp`,
|
||||
ADD COLUMN `rezzable` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 AFTER `killed_by`;
|
||||
)"
|
||||
}
|
||||
},
|
||||
ManifestEntry{
|
||||
.version = 9260,
|
||||
.description = "2023_11_11_guild_features.sql",
|
||||
.check = "SHOW TABLES LIKE 'guild_permissions'",
|
||||
.condition = "empty",
|
||||
.match = "",
|
||||
.sql = R"(
|
||||
CREATE TABLE `guild_permissions` (
|
||||
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||
`perm_id` INT(11) NOT NULL DEFAULT '0',
|
||||
`guild_id` INT(11) NOT NULL DEFAULT '0',
|
||||
`permission` INT(11) NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`id`) USING BTREE,
|
||||
UNIQUE INDEX `perm_id_guild_id` (`perm_id`, `guild_id`) USING BTREE
|
||||
)
|
||||
ENGINE=InnoDB
|
||||
AUTO_INCREMENT=1;
|
||||
|
||||
UPDATE guild_ranks SET title = 'Leader' WHERE `rank` = '1';
|
||||
UPDATE guild_ranks SET title = 'Senior Officer' WHERE `rank` = '2';
|
||||
UPDATE guild_ranks SET title = 'Officer' WHERE `rank` = '3';
|
||||
UPDATE guild_ranks SET title = 'Senior Member' WHERE `rank` = '4';
|
||||
UPDATE guild_ranks SET title = 'Member' WHERE `rank` = '5';
|
||||
UPDATE guild_ranks SET title = 'Junior Member' WHERE `rank` = '6';
|
||||
UPDATE guild_ranks SET title = 'Initiate' WHERE `rank` = '7';
|
||||
UPDATE guild_ranks SET title = 'Recruit' WHERE `rank` = '8';
|
||||
|
||||
DELETE FROM guild_ranks WHERE `rank` = 0;
|
||||
|
||||
ALTER TABLE `guild_ranks`
|
||||
DROP COLUMN `can_hear`,
|
||||
DROP COLUMN `can_speak`,
|
||||
DROP COLUMN `can_invite`,
|
||||
DROP COLUMN `can_remove`,
|
||||
DROP COLUMN `can_promote`,
|
||||
DROP COLUMN `can_demote`,
|
||||
DROP COLUMN `can_motd`,
|
||||
DROP COLUMN `can_warpeace`;
|
||||
|
||||
UPDATE guild_members SET `rank` = '5' WHERE `rank` = '0';
|
||||
UPDATE guild_members SET `rank` = '3' WHERE `rank` = '1';
|
||||
UPDATE guild_members SET `rank` = '1' WHERE `rank` = '2';
|
||||
|
||||
ALTER TABLE `guild_members`
|
||||
ADD COLUMN `online` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `alt`;
|
||||
|
||||
ALTER TABLE `guilds`
|
||||
ADD COLUMN `favor` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `url`;
|
||||
|
||||
CREATE TABLE guild_tributes (
|
||||
guild_id int(11) unsigned NOT NULL DEFAULT 0,
|
||||
tribute_id_1 int(11) unsigned NOT NULL DEFAULT 0,
|
||||
tribute_id_1_tier int(11) unsigned NOT NULL DEFAULT 0,
|
||||
tribute_id_2 int(11) unsigned NOT NULL DEFAULT 0,
|
||||
tribute_id_2_tier int(11) unsigned NOT NULL DEFAULT 0,
|
||||
time_remaining int(11) unsigned NOT NULL DEFAULT 0,
|
||||
enabled int(11) unsigned NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (guild_id) USING BTREE
|
||||
) ENGINE=InnoDB;
|
||||
)"
|
||||
},
|
||||
// -- template; copy/paste this when you need to create a new entry
|
||||
// ManifestEntry{
|
||||
// .version = 9228,
|
||||
|
||||
@@ -148,6 +148,7 @@ namespace DatabaseSchema {
|
||||
"guild_members",
|
||||
"guild_ranks",
|
||||
"guild_relations",
|
||||
"guild_tributes",
|
||||
"guilds",
|
||||
"instance_list_player",
|
||||
"inventory",
|
||||
|
||||
+21
-1
@@ -228,6 +228,7 @@ N(OP_GuildBank),
|
||||
N(OP_GuildBankItemList),
|
||||
N(OP_GuildCreate),
|
||||
N(OP_GuildDelete),
|
||||
N(OP_GuildDeleteGuild),
|
||||
N(OP_GuildDemote),
|
||||
N(OP_GuildInvite),
|
||||
N(OP_GuildInviteAccept),
|
||||
@@ -239,15 +240,33 @@ N(OP_GuildManageStatus),
|
||||
N(OP_GuildMemberLevelUpdate),
|
||||
N(OP_GuildMemberList),
|
||||
N(OP_GuildMemberUpdate),
|
||||
N(OP_GuildMemberLevel),
|
||||
N(OP_GuildMemberRankAltBanker),
|
||||
N(OP_GuildMemberPublicNote),
|
||||
N(OP_GuildMemberAdd),
|
||||
N(OP_GuildMemberRename),
|
||||
N(OP_GuildMemberDelete),
|
||||
N(OP_GuildMemberDetails),
|
||||
N(OP_GuildRenameGuild),
|
||||
N(OP_GuildMOTD),
|
||||
N(OP_GuildPeace),
|
||||
N(OP_GuildPromote),
|
||||
N(OP_GuildPublicNote),
|
||||
N(OP_GuildRemove),
|
||||
N(OP_GuildSelectTribute),
|
||||
N(OP_GuildModifyBenefits),
|
||||
N(OP_GuildTributeToggleReq),
|
||||
N(OP_GuildTributeToggleReply),
|
||||
N(OP_GuildOptInOut),
|
||||
N(OP_GuildSaveActiveTributes),
|
||||
N(OP_GuildSendActiveTributes),
|
||||
N(OP_GuildTributeFavorAndTimer),
|
||||
N(OP_GuildsList),
|
||||
N(OP_GuildStatus),
|
||||
N(OP_GuildTributeInfo),
|
||||
N(OP_GuildUpdateURLAndChannel),
|
||||
N(OP_GuildUpdate),
|
||||
N(OP_GuildTributeDonateItem),
|
||||
N(OP_GuildTributeDonatePlat),
|
||||
N(OP_GuildWar),
|
||||
N(OP_Heartbeat),
|
||||
N(OP_Hide),
|
||||
@@ -425,6 +444,7 @@ N(OP_ReqClientSpawn),
|
||||
N(OP_ReqNewZone),
|
||||
N(OP_RequestClientZoneChange),
|
||||
N(OP_RequestDuel),
|
||||
N(OP_RequestGuildTributes),
|
||||
N(OP_RequestKnowledgeBase),
|
||||
N(OP_RequestTitles),
|
||||
N(OP_RespawnWindow),
|
||||
|
||||
+281
-46
@@ -314,6 +314,7 @@ union
|
||||
uint32 DestructibleUnk9;
|
||||
bool targetable_with_hotkey;
|
||||
bool show_name;
|
||||
bool guild_show;
|
||||
};
|
||||
|
||||
struct PlayerState_Struct {
|
||||
@@ -1677,6 +1678,68 @@ struct GuildUpdate_Struct {
|
||||
GuildsListEntry_Struct entry;
|
||||
};
|
||||
|
||||
struct GuildMemberAdd_Struct {
|
||||
/*000*/ uint32 guild_id;
|
||||
/*004*/ uint32 unknown04;
|
||||
/*008*/ uint32 unknown08;
|
||||
/*012*/ uint32 unknown12;
|
||||
/*016*/ uint32 level;
|
||||
/*020*/ uint32 class_;
|
||||
/*024*/ uint32 rank_;
|
||||
/*028*/ uint32 guild_show;
|
||||
/*032*/ uint32 zone_id;
|
||||
/*036*/ uint32 last_on;
|
||||
/*040*/ char player_name[64];
|
||||
};
|
||||
|
||||
struct GuildMemberLevel_Struct {
|
||||
/*000*/ uint32 guild_id;
|
||||
/*004*/ char player_name[64];
|
||||
/*068*/ uint32 level;
|
||||
};
|
||||
|
||||
struct GuildMemberRank_Struct {
|
||||
/*000*/ uint32 guild_id;
|
||||
/*004*/ uint32 rank_;
|
||||
/*008*/ char player_name[64];
|
||||
/*072*/ uint32 alt_banker; //Banker/Alt bit 00 - none 10 - Alt 11 - Alt and Banker 01 - Banker. Banker not functional for RoF2+
|
||||
/*076*/ uint32 offline;
|
||||
};
|
||||
|
||||
struct GuildMemberPublicNote_Struct {
|
||||
/*000*/ uint32 guild_id;
|
||||
/*004*/ char player_name[64];
|
||||
/*068*/ char public_note[256]; //RoF2 256
|
||||
};
|
||||
|
||||
struct GuildDelete_Struct {
|
||||
/*000*/ uint32 guild_id;
|
||||
};
|
||||
|
||||
struct GuildRenameGuild_Struct {
|
||||
/*000*/ uint32 guild_id;
|
||||
/*004*/ char new_guild_name[64];
|
||||
};
|
||||
|
||||
struct GuildRenameMember_Struct {
|
||||
/*000*/ uint32 guild_id;
|
||||
/*004*/ char player_name[64];
|
||||
/*068*/ char new_player_name[64];
|
||||
};
|
||||
|
||||
struct GuildMemberDetails_Struct {
|
||||
/*000*/ uint32 guild_id;
|
||||
/*004*/ char player_name[64];
|
||||
/*068*/ uint32 zone_id;
|
||||
/*072*/ uint32 last_on;
|
||||
/*076*/ uint32 offline_mode; //1 Offline
|
||||
};
|
||||
|
||||
struct GuildMemberDelete_Struct {
|
||||
/*000*/ uint32 guild_id;
|
||||
/*004*/ char player_name[64];
|
||||
};
|
||||
|
||||
/*
|
||||
** Money Loot
|
||||
** Length: 22 Bytes
|
||||
@@ -1725,10 +1788,10 @@ struct GuildJoin_Struct{
|
||||
/*092*/
|
||||
};
|
||||
struct GuildInviteAccept_Struct {
|
||||
char inviter[64];
|
||||
char newmember[64];
|
||||
char inviter[64];
|
||||
char new_member[64];
|
||||
uint32 response;
|
||||
uint32 guildeqid;
|
||||
uint32 guild_id;
|
||||
};
|
||||
struct GuildManageRemove_Struct {
|
||||
uint32 guildeqid;
|
||||
@@ -1760,6 +1823,14 @@ struct PopupResponse_Struct {
|
||||
/*0004*/ uint32 popupid;
|
||||
};
|
||||
|
||||
enum GuildInformationActions
|
||||
{
|
||||
GuildUpdateURL = 0,
|
||||
GuildUpdateChannel = 1,
|
||||
GuildUpdateRanks = 4,
|
||||
GuildUpdatePermissions = 5
|
||||
};
|
||||
|
||||
struct GuildManageBanker_Struct {
|
||||
uint32 unknown0;
|
||||
char myname[64];
|
||||
@@ -1773,9 +1844,9 @@ struct GuildSetRank_Struct
|
||||
{
|
||||
/*00*/ uint32 Unknown00;
|
||||
/*04*/ uint32 Unknown04;
|
||||
/*08*/ uint32 Rank;
|
||||
/*12*/ char MemberName[64];
|
||||
/*76*/ uint32 Banker;
|
||||
/*08*/ uint32 rank;
|
||||
/*12*/ char member_name[64];
|
||||
/*76*/ uint32 banker;
|
||||
/*80*/
|
||||
};
|
||||
|
||||
@@ -3333,6 +3404,7 @@ struct Internal_GuildMemberEntry_Struct {
|
||||
// char public_note[1]; //variable length.
|
||||
uint16 zoneinstance; //network byte order
|
||||
uint16 zone_id; //network byte order
|
||||
uint32 online;
|
||||
};
|
||||
|
||||
struct Internal_GuildMembers_Struct { //just for display purposes, this is not actually used in the message encoding.
|
||||
@@ -3359,7 +3431,42 @@ struct GuildUpdate_PublicNote{
|
||||
uint32 unknown0;
|
||||
char name[64];
|
||||
char target[64];
|
||||
char note[1]; //variable length.
|
||||
char note[256];
|
||||
};
|
||||
|
||||
struct GuildUpdateURLAndChannelStruct {
|
||||
char text[512];
|
||||
};
|
||||
|
||||
struct GuildUpdatePermissionsStruct {
|
||||
uint32 rank; // the rank that is being changed
|
||||
uint32 function_id; // the id of the guild function
|
||||
uint32 value; // 1 is on, 0 is off
|
||||
|
||||
};
|
||||
|
||||
struct GuildUpdateRankNamesStruct {
|
||||
uint32 rank; // the rank that is being updated
|
||||
char rank_name[76]; // the rank name
|
||||
};
|
||||
|
||||
struct GuildUpdateUCPStruct {
|
||||
uint32 action; // 0 and 1 use url and channel payload. 5 uses permissions payload
|
||||
char unknown[76];
|
||||
union {
|
||||
GuildUpdateURLAndChannelStruct url_channel;
|
||||
GuildUpdatePermissionsStruct permissions;
|
||||
GuildUpdateRankNamesStruct rank_name;
|
||||
}payload;
|
||||
};
|
||||
|
||||
struct GuildPermission_Struct
|
||||
{
|
||||
uint32 Action; // 5 = Update function permission
|
||||
char Unknown0004[76]; // not used
|
||||
uint32 rank; // the rank that is being changed
|
||||
uint32 function_id; // the id of the guild function
|
||||
uint32 value; // 1 is on, 0 is off
|
||||
};
|
||||
|
||||
struct GuildUpdateURLAndChannel_Struct
|
||||
@@ -3378,7 +3485,7 @@ struct GuildUpdateURLAndChannel_Struct
|
||||
//The client sends this struct on changing a guild rank. The server sends each rank in 32 or less packets upon zonein if you are in a guild.
|
||||
struct GuildUpdateRanks_Struct
|
||||
{
|
||||
/*0000*/ uint32 Action; // 0 = Update URL, 1 = Update Channel, 5 = RoF Ranks
|
||||
/*0000*/ uint32 Action; // 0 = Update URL, 1 = Update Channel, 4 = Ranks 5 = Permissions
|
||||
/*0004*/ uint32 Unknown0004; //Seen 00 00 00 00
|
||||
/*0008*/ uint32 Unknown0008; //Seen 96 29 00 00
|
||||
/*0008*/ char Unknown0012[64]; //Seen "CharacterName"
|
||||
@@ -3400,6 +3507,7 @@ struct GuildStatus_Struct
|
||||
struct GuildDemoteStruct{
|
||||
char name[64];
|
||||
char target[64];
|
||||
uint32 rank;
|
||||
};
|
||||
|
||||
struct GuildRemoveStruct{
|
||||
@@ -3409,9 +3517,9 @@ struct GuildRemoveStruct{
|
||||
uint32 leaderstatus; //?
|
||||
};
|
||||
|
||||
struct GuildMakeLeader{
|
||||
char name[64];
|
||||
char target[64];
|
||||
struct GuildMakeLeader_Struct{
|
||||
char requestor[64];
|
||||
char new_leader[64];
|
||||
};
|
||||
|
||||
struct BugReport_Struct {
|
||||
@@ -3505,66 +3613,193 @@ struct ZoneInSendName_Struct2 {
|
||||
static const uint32 MAX_TRIBUTE_TIERS = 10;
|
||||
|
||||
struct StartTribute_Struct {
|
||||
uint32 client_id;
|
||||
uint32 tribute_master_id;
|
||||
uint32 response;
|
||||
uint32 client_id;
|
||||
uint32 tribute_master_id;
|
||||
uint32 response;
|
||||
};
|
||||
|
||||
struct TributeLevel_Struct {
|
||||
uint32 level; //backwards byte order!
|
||||
uint32 tribute_item_id; //backwards byte order!
|
||||
uint32 cost; //backwards byte order!
|
||||
uint32 level; //backwards byte order!
|
||||
uint32 tribute_item_id; //backwards byte order!
|
||||
uint32 cost; //backwards byte order!
|
||||
};
|
||||
|
||||
struct TributeAbility_Struct {
|
||||
uint32 tribute_id; //backwards byte order!
|
||||
uint32 tier_count; //backwards byte order!
|
||||
uint32 tribute_id; //backwards byte order!
|
||||
uint32 tier_count; //backwards byte order!
|
||||
TributeLevel_Struct tiers[MAX_TRIBUTE_TIERS];
|
||||
char name[0];
|
||||
};
|
||||
|
||||
struct GuildTributeAbility_Struct {
|
||||
uint32 guild_id;
|
||||
TributeAbility_Struct ability;
|
||||
char name[0];
|
||||
};
|
||||
|
||||
struct SelectTributeReq_Struct {
|
||||
uint32 client_id; //? maybe action ID?
|
||||
uint32 tribute_id;
|
||||
uint32 unknown8; //seen E3 00 00 00
|
||||
uint32 client_id; //? maybe action ID?
|
||||
uint32 tribute_id;
|
||||
uint32 unknown8; //seen E3 00 00 00
|
||||
};
|
||||
|
||||
struct GuildTributeAbilityDetail_Struct {
|
||||
uint32 tribute_id; //backwards byte order!
|
||||
uint32 tier_count; //backwards byte order!
|
||||
TributeLevel_Struct tiers[MAX_TRIBUTE_TIERS];
|
||||
uint32 unknown132;
|
||||
char name[0];
|
||||
};
|
||||
|
||||
struct GuildTributeAbility_Struct {
|
||||
uint32 guild_id;
|
||||
GuildTributeAbilityDetail_Struct ability;
|
||||
};
|
||||
|
||||
struct GuildTributeSelectReq_Struct {
|
||||
uint32 tribute_id;
|
||||
uint32 tier;
|
||||
uint32 tribute_id2;
|
||||
uint32 unknown12; //seen A7 01 00 00
|
||||
};
|
||||
|
||||
struct GuildTributeSelectReply_Struct {
|
||||
uint32 tribute_id;
|
||||
uint32 tier;
|
||||
uint32 tribute_id2;
|
||||
char description;
|
||||
};
|
||||
|
||||
struct GuildTributeModifyBenefits_Struct {
|
||||
/*000*/uint32 command;
|
||||
/*004*/uint32 data;
|
||||
/*008*/char unknown8[12];
|
||||
/*020*/uint32 tribute_master_id;
|
||||
/*024*/uint32 tribute_id_1;
|
||||
/*028*/uint32 tribute_id_2;
|
||||
/*032*/uint32 tribute_id_1_tier;
|
||||
/*036*/uint32 tribute_id_2_tier;
|
||||
/*040*/char unknown[40];
|
||||
};
|
||||
|
||||
struct GuildTributeOptInOutReq_Struct {
|
||||
/*000*/uint32 guild_id;
|
||||
/*004*/uint32 tribute_toggle;
|
||||
/*008*/char player[64];
|
||||
/*072*/uint32 command;
|
||||
/*076*/uint32 tribute_master_id;
|
||||
};
|
||||
|
||||
struct GuildTributeOptInOutReply_Struct {
|
||||
/*000*/uint32 guild_id;
|
||||
/*004*/char player_name[64];
|
||||
/*068*/uint32 tribute_toggle;// 0 off 1 on
|
||||
/*072*/uint32 tribute_trophy_toggle;// 0 off 1 on not yet implemented
|
||||
/*076*/uint32 no_donations;
|
||||
/*080*/uint32 time;
|
||||
/*084*/uint32 command;
|
||||
};
|
||||
|
||||
struct GuildTributeSaveActive_Struct {
|
||||
/*000*/ uint32 command;
|
||||
/*004*/ char unknown04[16];
|
||||
/*020*/ uint32 master_tribute_id;
|
||||
/*024*/ uint32 tribute_id_1;
|
||||
/*028*/ uint32 tribute_id_2;
|
||||
/*032*/ uint32 tribute_1_tier;
|
||||
/*036*/ uint32 tribute_2_tier;
|
||||
/*040*/ char unknown40[8];
|
||||
};
|
||||
|
||||
struct GuildTributeFavorTimer_Struct {
|
||||
/*000*/ uint32 guild_id;
|
||||
/*004*/ uint32 guild_favor;
|
||||
/*008*/ uint32 tribute_timer;
|
||||
/*012*/ uint32 trophy_timer;
|
||||
};
|
||||
|
||||
struct GuildTributeSendActive_Struct {
|
||||
/*000*/ uint32 not_used;
|
||||
/*004*/ uint32 guild_favor;
|
||||
/*008*/ uint32 tribute_timer;
|
||||
/*012*/ uint32 tribute_enabled;
|
||||
/*016*/ char unknown16[8];
|
||||
/*024*/ uint32 tribute_id_1;
|
||||
/*028*/ uint32 tribute_id_2;
|
||||
/*032*/ uint32 tribute_id_1_tier;
|
||||
/*036*/ uint32 tribute_id_2_tier;
|
||||
};
|
||||
|
||||
struct GuildTributeToggleReq_Struct {
|
||||
/*000*/ uint32 command;
|
||||
/*004*/ uint32 unknown4;
|
||||
/*008*/ uint32 unknown8;
|
||||
};
|
||||
|
||||
struct GuildTributeDonateItemRequest_Struct {
|
||||
/*000*/ uint32 type;
|
||||
/*004*/ uint16 slot;
|
||||
/*006*/ uint16 sub_index;
|
||||
/*008*/ uint16 aug_index;
|
||||
/*010*/ uint16 unknown10;
|
||||
/*012*/ uint32 quantity;
|
||||
/*016*/ uint32 tribute_master_id;
|
||||
/*020*/ uint32 unknown20;
|
||||
/*024*/ uint32 guild_id;
|
||||
/*028*/ uint32 unknown28;
|
||||
/*032*/ uint32 unknown32;
|
||||
};
|
||||
|
||||
struct GuildTributeDonateItemReply_Struct {
|
||||
/*000*/ uint32 type;
|
||||
/*004*/ uint16 slot;
|
||||
/*006*/ uint16 sub_index;
|
||||
/*008*/ uint16 aug_index;
|
||||
/*010*/ uint16 unknown10;
|
||||
/*012*/ uint32 quantity;
|
||||
/*016*/ uint32 unknown20;
|
||||
/*020*/ uint32 favor;
|
||||
};
|
||||
|
||||
struct GuildTributeDonatePlatRequest_Struct {
|
||||
/*000*/ uint32 quantity;
|
||||
/*004*/ uint32 tribute_master_id;
|
||||
/*008*/ uint32 unknown08;
|
||||
/*012*/ uint32 guild_id;
|
||||
/*016*/ uint32 unknown16;
|
||||
};
|
||||
|
||||
struct GuildTributeDonatePlatReply_Struct {
|
||||
/*000*/ uint32 quantity;
|
||||
/*004*/ uint32 unknown4;
|
||||
/*008*/ uint32 favor;
|
||||
};
|
||||
|
||||
struct SelectTributeReply_Struct {
|
||||
uint32 client_id; //echoed from request.
|
||||
uint32 tribute_id;
|
||||
char desc[0];
|
||||
uint32 client_id; //echoed from request.
|
||||
uint32 tribute_id;
|
||||
char description[0];
|
||||
};
|
||||
|
||||
struct TributeInfo_Struct {
|
||||
uint32 active; //0 == inactive, 1 == active
|
||||
uint32 tributes[EQ::invtype::TRIBUTE_SIZE]; //-1 == NONE
|
||||
uint32 tiers[EQ::invtype::TRIBUTE_SIZE]; //all 00's
|
||||
uint32 tribute_master_id;
|
||||
uint32 active; //0 == inactive, 1 == active
|
||||
uint32 tributes[EQ::invtype::TRIBUTE_SIZE]; //-1 == NONE
|
||||
uint32 tiers[EQ::invtype::TRIBUTE_SIZE]; //all 00's
|
||||
uint32 tribute_master_id;
|
||||
};
|
||||
|
||||
struct TributeItem_Struct {
|
||||
uint32 slot;
|
||||
uint32 quantity;
|
||||
uint32 tribute_master_id;
|
||||
int32 tribute_points;
|
||||
uint32 slot;
|
||||
uint32 quantity;
|
||||
uint32 tribute_master_id;
|
||||
int32 tribute_points;
|
||||
};
|
||||
|
||||
struct TributePoint_Struct {
|
||||
int32 tribute_points;
|
||||
uint32 unknown04;
|
||||
int32 career_tribute_points;
|
||||
uint32 unknown12;
|
||||
int32 tribute_points;
|
||||
uint32 unknown04;
|
||||
int32 career_tribute_points;
|
||||
uint32 unknown12;
|
||||
};
|
||||
|
||||
struct TributeMoney_Struct {
|
||||
uint32 platinum;
|
||||
uint32 tribute_master_id;
|
||||
int32 tribute_points;
|
||||
uint32 platinum;
|
||||
uint32 tribute_master_id;
|
||||
int32 tribute_points;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -697,6 +697,8 @@ void PlayerEventLogs::SetSettingsDefaults()
|
||||
m_settings[PlayerEvent::KILLED_NAMED_NPC].event_enabled = 1;
|
||||
m_settings[PlayerEvent::KILLED_RAID_NPC].event_enabled = 1;
|
||||
m_settings[PlayerEvent::ITEM_CREATION].event_enabled = 1;
|
||||
m_settings[PlayerEvent::GUILD_TRIBUTE_DONATE_ITEM].event_enabled = 1;
|
||||
m_settings[PlayerEvent::GUILD_TRIBUTE_DONATE_PLAT].event_enabled = 1;
|
||||
|
||||
for (int i = PlayerEvent::GM_COMMAND; i != PlayerEvent::MAX; i++) {
|
||||
m_settings[i].retention_days = RETENTION_DAYS_DEFAULT;
|
||||
|
||||
@@ -56,6 +56,8 @@ namespace PlayerEvent {
|
||||
KILLED_NAMED_NPC,
|
||||
KILLED_RAID_NPC,
|
||||
ITEM_CREATION,
|
||||
GUILD_TRIBUTE_DONATE_ITEM,
|
||||
GUILD_TRIBUTE_DONATE_PLAT,
|
||||
MAX // dont remove
|
||||
};
|
||||
|
||||
@@ -112,7 +114,9 @@ namespace PlayerEvent {
|
||||
"Killed NPC",
|
||||
"Killed Named NPC",
|
||||
"Killed Raid NPC",
|
||||
"Item Creation"
|
||||
"Item Creation",
|
||||
"Guild Tribute Donate Item",
|
||||
"Guild Tribute Donate Platinum"
|
||||
};
|
||||
|
||||
// Generic struct used by all events
|
||||
@@ -942,6 +946,36 @@ namespace PlayerEvent {
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
struct GuildTributeDonateItem {
|
||||
uint32 item_id;
|
||||
uint32 guild_favor;
|
||||
|
||||
// cereal
|
||||
template<class Archive>
|
||||
void serialize(Archive &ar)
|
||||
{
|
||||
ar(
|
||||
CEREAL_NVP(item_id),
|
||||
CEREAL_NVP(guild_favor)
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
struct GuildTributeDonatePlat {
|
||||
uint32 plat;
|
||||
uint32 guild_favor;
|
||||
|
||||
// cereal
|
||||
template<class Archive>
|
||||
void serialize(Archive &ar)
|
||||
{
|
||||
ar(
|
||||
CEREAL_NVP(plat),
|
||||
CEREAL_NVP(guild_favor)
|
||||
);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#endif //EQEMU_PLAYER_EVENTS_H
|
||||
|
||||
+1007
-801
File diff suppressed because it is too large
Load Diff
+123
-79
@@ -5,6 +5,42 @@
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "timer.h"
|
||||
#include "../common/repositories/guild_members_repository.h"
|
||||
#include "../common/repositories/guilds_repository.h"
|
||||
|
||||
struct DefaultPermissionStruct {
|
||||
GuildAction id;
|
||||
uint32 value;
|
||||
};
|
||||
|
||||
struct DefaultRankNamesStruct {
|
||||
uint32 id;
|
||||
std::string name;
|
||||
};
|
||||
|
||||
struct GuildTributeStruct {
|
||||
Timer timer;
|
||||
uint32 id_1;
|
||||
uint32 id_2;
|
||||
uint32 id_1_tier;
|
||||
uint32 id_2_tier;
|
||||
uint32 favor;
|
||||
uint32 time_remaining;
|
||||
uint32 enabled;
|
||||
bool send_timer;
|
||||
};
|
||||
|
||||
class TributeData {
|
||||
public:
|
||||
//this level data stored in regular byte order and must be flipped before sending
|
||||
TributeLevel_Struct tiers[MAX_TRIBUTE_TIERS];
|
||||
uint8 tier_count;
|
||||
uint32 unknown;
|
||||
std::string name;
|
||||
std::string description;
|
||||
bool is_guild; //is a guild tribute item
|
||||
};
|
||||
|
||||
class Database;
|
||||
|
||||
@@ -12,22 +48,23 @@ class CharGuildInfo
|
||||
{
|
||||
public:
|
||||
//fields from `characer_`
|
||||
uint32 char_id;
|
||||
uint32 char_id;
|
||||
std::string char_name;
|
||||
uint8 class_;
|
||||
uint16 level;
|
||||
uint32 time_last_on;
|
||||
uint32 zone_id;
|
||||
uint8 class_;
|
||||
uint16 level;
|
||||
uint32 time_last_on;
|
||||
uint32 zone_id;
|
||||
|
||||
//fields from `guild_members`
|
||||
uint32 guild_id;
|
||||
uint8 rank;
|
||||
bool tribute_enable;
|
||||
uint32 total_tribute;
|
||||
uint32 last_tribute; //timestamp
|
||||
bool banker;
|
||||
bool alt;
|
||||
uint32 guild_id;
|
||||
uint8 rank;
|
||||
bool tribute_enable;
|
||||
uint32 total_tribute;
|
||||
uint32 last_tribute; //timestamp
|
||||
bool banker;
|
||||
bool alt;
|
||||
std::string public_note;
|
||||
bool online;
|
||||
};
|
||||
|
||||
//this object holds guild functionality shared between world and zone.
|
||||
@@ -44,15 +81,16 @@ class BaseGuildManager
|
||||
}
|
||||
|
||||
bool LoadGuilds();
|
||||
bool RefreshGuild(uint32 guild_id);
|
||||
virtual bool RefreshGuild(uint32 guild_id);
|
||||
|
||||
//guild edit actions.
|
||||
uint32 CreateGuild(const char* name, uint32 leader_char_id);
|
||||
uint32 CreateGuild(std::string name, uint32 leader_char_id);
|
||||
bool StoreGuildDB(uint32 guild_id);
|
||||
bool DeleteGuild(uint32 guild_id);
|
||||
bool RenameGuild(uint32 guild_id, const char* name);
|
||||
bool SetGuildMOTD(uint32 guild_id, const char* motd, const char *setter);
|
||||
bool SetGuildURL(uint32 GuildID, const char* URL);
|
||||
bool SetGuildChannel(uint32 GuildID, const char* Channel);
|
||||
bool RenameGuild(uint32 guild_id, std::string name);
|
||||
bool SetGuildMOTD(uint32 guild_id, std::string motd, std::string setter);
|
||||
bool SetGuildURL(uint32 guild_id, std::string URL);
|
||||
bool SetGuildChannel(uint32 guild_id, std::string Channel);
|
||||
|
||||
//character edit actions
|
||||
bool SetGuildLeader(uint32 guild_id, uint32 leader_char_id);
|
||||
@@ -62,9 +100,16 @@ class BaseGuildManager
|
||||
bool ForceRankUpdate(uint32 charid);
|
||||
bool GetAltFlag(uint32 CharID);
|
||||
bool SetAltFlag(uint32 charid, bool is_alt);
|
||||
bool GetBankerFlag(uint32 CharID);
|
||||
bool GetBankerFlag(uint32 CharID, bool compat_mode = false);
|
||||
bool GetGuildBankerStatus(uint32 guild_id, uint32 guild_rank);
|
||||
bool SetTributeFlag(uint32 charid, bool enabled);
|
||||
bool SetPublicNote(uint32 charid, const char *note);
|
||||
bool SetPublicNote(uint32 charid, std::string public_note);
|
||||
uint32 UpdateDbGuildFavor(uint32 guild_id, uint32 enabled);
|
||||
bool UpdateDbGuildTributeEnabled(uint32 guild_id, uint32 enabled);
|
||||
bool UpdateDbMemberTributeEnabled(uint32 guild_id, uint32 char_id, uint32 enabled);
|
||||
bool UpdateDbTributeTimeRemaining(uint32 guild_id, uint32 enabled);
|
||||
uint32 UpdateDbMemberFavor(uint32 guild_id, uint32 char_id, uint32 favor);
|
||||
bool UpdateDbMemberOnline(uint32 char_id, bool status);
|
||||
|
||||
//queries
|
||||
bool GetCharInfo(const char *char_name, CharGuildInfo &into);
|
||||
@@ -74,29 +119,24 @@ class BaseGuildManager
|
||||
bool GetGuildMOTD(uint32 guild_id, char *motd_buffer, char *setter_buffer) const;
|
||||
bool GetGuildURL(uint32 GuildID, char *URLBuffer) const;
|
||||
bool GetGuildChannel(uint32 GuildID, char *ChannelBuffer) const;
|
||||
const char *GetRankName(uint32 guild_id, uint8 rank) const;
|
||||
const char *GetGuildName(uint32 guild_id) const;
|
||||
std::string GetGuildNameByID(uint32 guild_id) const;
|
||||
std::string GetGuildRankName(uint32 guild_id, uint8 rank) const;
|
||||
bool IsCharacterInGuild(uint32 character_id, uint32 guild_id = 0);
|
||||
bool GetGuildNameByID(uint32 guild_id, std::string &into) const;
|
||||
uint32 GetGuildIDByName(const char *GuildName);
|
||||
uint32 GetGuildIDByCharacterID(uint32 character_id);
|
||||
bool IsGuildLeader(uint32 guild_id, uint32 char_id) const;
|
||||
uint8 GetDisplayedRank(uint32 guild_id, uint8 rank, uint32 char_id) const;
|
||||
bool CheckGMStatus(uint32 guild_id, uint8 status) const;
|
||||
bool CheckPermission(uint32 guild_id, uint8 rank, GuildAction act) const;
|
||||
// uint32 Getguild_id(uint32 eqid);
|
||||
uint32 FindGuildByLeader(uint32 leader) const;
|
||||
// void GetGuildMembers(uint32 guild_id,GuildMember_Struct* gms);
|
||||
uint32 NumberInGuild(uint32 guild_id);
|
||||
// bool GetGuildRanks(uint32 guildeqid, GuildRanks_Struct* gr);
|
||||
// bool EditGuild(uint32 guild_id, uint8 ranknum, GuildRankLevel_Struct* grl);
|
||||
|
||||
uint8 *MakeGuildList(const char *head_name, uint32 &length) const; //make a guild list packet, returns ownership of the buffer.
|
||||
|
||||
static const char *const GuildActionNames[_MaxGuildAction];
|
||||
uint32 DoesAccountContainAGuildLeader(uint32 AccountID);
|
||||
bool IsCharacterInGuild(uint32 character_id, uint32 guild_id = 0);
|
||||
bool GetGuildNameByID(uint32 guild_id, std::string& into) const;
|
||||
bool IsGuildLeader(uint32 guild_id, uint32 char_id) const;
|
||||
bool CheckGMStatus(uint32 guild_id, uint8 status) const;
|
||||
bool CheckPermission(uint32 guild_id, uint8 rank, GuildAction act) const;
|
||||
bool UpdateDbBankerFlag(uint32 charid, bool is_banker);
|
||||
uint8* MakeGuildList(const char* head_name, uint32& length) const; //make a guild list packet, returns ownership of the buffer.
|
||||
uint8 GetDisplayedRank(uint32 guild_id, uint8 rank, uint32 char_id) const;
|
||||
uint32 GetGuildIDByName(const char *GuildName);
|
||||
uint32 GetGuildIDByCharacterID(uint32 character_id);
|
||||
uint32 FindGuildByLeader(uint32 leader) const;
|
||||
uint32 NumberInGuild(uint32 guild_id);
|
||||
uint32 DoesAccountContainAGuildLeader(uint32 AccountID);
|
||||
const char* GetRankName(uint32 guild_id, uint8 rank) const;
|
||||
const char* GetGuildName(uint32 guild_id) const;
|
||||
std::string GetGuildNameByID(uint32 guild_id) const;
|
||||
std::string GetGuildRankName(uint32 guild_id, uint8 rank) const;
|
||||
std::vector<GuildMembersRepository::GuildMembers> GetGuildMembers(uint32 guild_id);
|
||||
|
||||
protected:
|
||||
//the methods which must be defined by base classes.
|
||||
@@ -105,58 +145,62 @@ class BaseGuildManager
|
||||
virtual void SendRankUpdate(uint32 CharID) = 0;
|
||||
virtual void SendGuildDelete(uint32 guild_id) = 0;
|
||||
|
||||
uint32 DBCreateGuild(const char* name, uint32 leader_char_id);
|
||||
bool DBDeleteGuild(uint32 guild_id);
|
||||
bool DBRenameGuild(uint32 guild_id, const char* name);
|
||||
bool DBSetGuildLeader(uint32 guild_id, uint32 leader_char_id);
|
||||
bool DBSetGuildMOTD(uint32 guild_id, const char* motd, const char *setter);
|
||||
bool DBSetGuildURL(uint32 GuildID, const char* URL);
|
||||
bool DBSetGuildChannel(uint32 GuildID, const char* Channel);
|
||||
bool DBSetGuild(uint32 charid, uint32 guild_id, uint8 rank);
|
||||
bool DBSetGuildRank(uint32 charid, uint8 rank);
|
||||
bool DBSetBankerFlag(uint32 charid, bool is_banker);
|
||||
bool DBSetAltFlag(uint32 charid, bool is_alt);
|
||||
bool DBSetTributeFlag(uint32 charid, bool enabled);
|
||||
bool DBSetPublicNote(uint32 charid, const char *note);
|
||||
uint32 UpdateDbCreateGuild(std::string name, uint32 leader_char_id);
|
||||
bool UpdateDbDeleteGuild(uint32 guild_id, bool local_delete = true, bool db_delete = true);
|
||||
bool UpdateDbRenameGuild(uint32 guild_id, std::string name);
|
||||
bool UpdateDbGuildLeader(uint32 guild_id, uint32 leader_char_id);
|
||||
bool UpdateDbGuildMOTD(uint32 guild_id, std::string motd, std::string setter);
|
||||
bool UpdateDbGuildURL(uint32 GuildID, std::string URL);
|
||||
bool UpdateDbGuildChannel(uint32 GuildID, std::string Channel);
|
||||
bool UpdateDbGuild(uint32 charid, uint32 guild_id, uint8 rank);
|
||||
bool UpdateDbGuildRank(uint32 charid, uint8 rank);
|
||||
bool UpdateDbAltFlag(uint32 charid, bool is_alt);
|
||||
bool UpdateDbTributeFlag(uint32 charid, bool enabled);
|
||||
bool UpdateDbPublicNote(uint32 charid, std::string public_note);
|
||||
bool QueryWithLogging(std::string query, const char *errmsg);
|
||||
// void DBSetPublicNote(uint32 guild_id,char* charname, char* note);
|
||||
|
||||
bool LocalDeleteGuild(uint32 guild_id);
|
||||
|
||||
class RankInfo
|
||||
struct RankInfo
|
||||
{
|
||||
public:
|
||||
RankInfo();
|
||||
std::string name;
|
||||
bool permissions[_MaxGuildAction];
|
||||
RankInfo();
|
||||
std::string rank_name;
|
||||
};
|
||||
class GuildInfo
|
||||
struct Functions
|
||||
{
|
||||
public:
|
||||
GuildInfo();
|
||||
std::string name;
|
||||
std::string motd;
|
||||
std::string motd_setter;
|
||||
std::string url;
|
||||
std::string channel;
|
||||
|
||||
uint32 leader_char_id;
|
||||
uint8 minstatus;
|
||||
//tribute is not in here on purpose, since it is only valid in world!
|
||||
RankInfo ranks[GUILD_MAX_RANK + 1];
|
||||
uint32 id;
|
||||
uint32 perm_id;
|
||||
uint32 guild_id;
|
||||
uint32 perm_value;
|
||||
};
|
||||
public:
|
||||
class GuildInfo {
|
||||
public:
|
||||
GuildInfo();
|
||||
std::string name;
|
||||
std::string motd;
|
||||
std::string motd_setter;
|
||||
std::string url;
|
||||
std::string channel;
|
||||
uint32 leader;
|
||||
uint8 minstatus;
|
||||
std::string rank_names[GUILD_MAX_RANK + 1];
|
||||
Functions functions[GUILD_MAX_FUNCTIONS + 1];
|
||||
GuildTributeStruct tribute;
|
||||
};
|
||||
virtual BaseGuildManager::GuildInfo* GetGuildByGuildID(uint32 guild_id);
|
||||
uint32 GetGuildTributeTimeRemaining(uint32 guild_id);
|
||||
|
||||
protected:
|
||||
std::map<uint32, GuildInfo *> m_guilds; //we own the pointers in this map
|
||||
void ClearGuilds(); //clears internal structure
|
||||
|
||||
Database *m_db; //we do not own this
|
||||
|
||||
bool _StoreGuildDB(uint32 guild_id);
|
||||
GuildInfo *_CreateGuild(uint32 guild_id, const char *guild_name, uint32 account_id, uint8 minstatus, const char *guild_motd, const char *motd_setter, const char *Channel, const char *URL);
|
||||
GuildInfo* _CreateGuild(uint32 guild_id, std::string guild_name, uint32 leader_char_id, uint8 minstatus, std::string guild_motd, std::string motd_setter, std::string Channel, std::string URL, uint32 favour);
|
||||
uint32 _GetFreeGuildID();
|
||||
GuildsRepository::Guilds CreateGuildRepoFromGuildInfo(uint32 guild_id, BaseGuildManager::GuildInfo& in);
|
||||
};
|
||||
|
||||
|
||||
#endif /*GUILD_BASE_H_*/
|
||||
|
||||
|
||||
|
||||
+54
-15
@@ -16,31 +16,70 @@
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef GUILD_H
|
||||
#define GUILD_H
|
||||
#ifndef GUILDS_H
|
||||
#define GUILDS_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
#define GUILD_NONE 0xFFFFFFFF // user has no guild
|
||||
|
||||
#define GUILD_MAX_RANK 8 // 0-2 - some places in the code assume a single digit, dont go above 9
|
||||
#define GUILD_MAX_RANK 8 // 0-2 - some places in the code assume a single digit, dont go above 9
|
||||
#define GUILD_MAX_FUNCTIONS 30
|
||||
#define GUILD_TRIBUTES_MODIFY 1
|
||||
#define GUILD_TRIBUTES_SAVE 0
|
||||
#define GUILD_TRIBUTES_OFF 0
|
||||
#define GUILD_TRIBUTES_ON 1
|
||||
#define GUILD_INVITE_DECLINE 9
|
||||
|
||||
//defines for standard ranks
|
||||
#define GUILD_MEMBER 0
|
||||
#define GUILD_OFFICER 1
|
||||
#define GUILD_LEADER 2
|
||||
#define GUILD_MEMBER_TI 0
|
||||
#define GUILD_OFFICER_TI 1
|
||||
#define GUILD_LEADER_TI 2
|
||||
#define GUILD_RANK_NONE (GUILD_MAX_RANK+1)
|
||||
|
||||
//defines for standard ranks base on RoF2 definitions
|
||||
#define GUILD_RANK_NONE 0
|
||||
#define GUILD_LEADER 1
|
||||
#define GUILD_SENIOR_OFFICER 2
|
||||
#define GUILD_OFFICER 3
|
||||
#define GUILD_SENIOR_MEMBER 4
|
||||
#define GUILD_MEMBER 5
|
||||
#define GUILD_JUNIOR_MEMBER 6
|
||||
#define GUILD_INITIATE 7
|
||||
#define GUILD_RECRUIT 8
|
||||
|
||||
typedef enum {
|
||||
GUILD_HEAR = 0,
|
||||
GUILD_SPEAK = 1,
|
||||
GUILD_INVITE = 2,
|
||||
GUILD_REMOVE = 3,
|
||||
GUILD_PROMOTE = 4,
|
||||
GUILD_DEMOTE = 5,
|
||||
GUILD_MOTD = 6,
|
||||
GUILD_WARPEACE = 7,
|
||||
_MaxGuildAction
|
||||
GUILD_ACTION_BANNER_CHANGE = 1,
|
||||
GUILD_ACTION_BANNER_PLANT = 2,
|
||||
GUILD_ACTION_BANNER_REMOVE = 3,
|
||||
GUILD_ACTION_DISPLAY_GUILD_NAME = 4,
|
||||
GUILD_ACTION_RANKS_CHANGE_PERMISSIONS = 5,
|
||||
GUILD_ACTION_RANKS_CHANGE_RANK_NAMES = 6,
|
||||
GUILD_ACTION_MEMBERS_INVITE = 7,
|
||||
GUILD_ACTION_MEMBERS_PROMOTE = 8,
|
||||
GUILD_ACTION_MEMBERS_DEMOTE = 9,
|
||||
GUILD_ACTION_MEMBERS_REMOVE = 10,
|
||||
GUILD_ACTION_EDIT_RECRUITING_SETTINGS = 11,
|
||||
GUILD_ACTION_EDIT_PUBLIC_NOTES = 12,
|
||||
GUILD_ACTION_BANK_DEPOSIT_ITEMS = 13,
|
||||
GUILD_ACTION_BANK_WITHDRAW_ITEMS = 14,
|
||||
GUILD_ACTION_BANK_VIEW_ITEMS = 15,
|
||||
GUILD_ACTION_BANK_PROMOTE_ITEMS = 16,
|
||||
GUILD_ACTION_BANK_CHANGE_ITEM_PERMISSIONS = 17,
|
||||
GUILD_ACTION_CHANGE_THE_MOTD = 18,
|
||||
GUILD_ACTION_GUILD_CHAT_SEE = 19,
|
||||
GUILD_ACTION_GUILD_CHAT_SPEAK_IN = 20,
|
||||
GUILD_ACTION_SEND_THE_WHOLE_GUILD_E_MAIL = 21,
|
||||
GUILD_ACTION_TRIBUTE_CHANGE_FOR_OTHERS = 22,
|
||||
GUILD_ACTION_TRIBUTE_CHANGE_ACTIVE_BENEFIT = 23,
|
||||
GUILD_ACTION_TROPHY_TRIBUTE_CHANGE_FOR_OTHERS = 24,
|
||||
GUILD_ACTION_TROPHY_TRIBUTE_CHANGE_ACTIVE_BENEFIT = 25,
|
||||
GUILD_ACTION_MEMBERS_CHANGE_ALT_FLAG_FOR_OTHER = 26,
|
||||
GUILD_ACTION_REAL_ESTATE_GUILD_PLOT_BUY = 27,
|
||||
GUILD_ACTION_REAL_ESTATE_GUILD_PLOT_SELL = 28,
|
||||
GUILD_ACTION_REAL_ESTATE_MODIFY_TROPHIES = 29,
|
||||
GUILD_ACTION_MEMBERS_DEMOTE_SELF = 30,
|
||||
} GuildAction;
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -173,7 +173,8 @@ EQ::ItemInstance* EQ::InventoryProfile::GetItem(int16 slot_id) const
|
||||
result = _GetItem(m_inv, slot_id);
|
||||
}
|
||||
else if ((slot_id >= invslot::EQUIPMENT_BEGIN && slot_id <= invslot::EQUIPMENT_END) ||
|
||||
(slot_id >= invslot::TRIBUTE_BEGIN && slot_id <= invslot::TRIBUTE_END)) {
|
||||
(slot_id >= invslot::TRIBUTE_BEGIN && slot_id <= invslot::TRIBUTE_END) ||
|
||||
(slot_id >= invslot::GUILD_TRIBUTE_BEGIN && slot_id <= invslot::GUILD_TRIBUTE_END)) {
|
||||
// Equippable slots (on body)
|
||||
result = _GetItem(m_worn, slot_id);
|
||||
}
|
||||
@@ -465,6 +466,10 @@ EQ::ItemInstance* EQ::InventoryProfile::PopItem(int16 slot_id)
|
||||
p = m_worn[slot_id];
|
||||
m_worn.erase(slot_id);
|
||||
}
|
||||
else if (slot_id >= invslot::GUILD_TRIBUTE_BEGIN && slot_id <= invslot::GUILD_TRIBUTE_END) {
|
||||
p = m_worn[slot_id];
|
||||
m_worn.erase(slot_id);
|
||||
}
|
||||
else if (slot_id >= invslot::BANK_BEGIN && slot_id <= invslot::BANK_END) {
|
||||
p = m_bank[slot_id];
|
||||
m_bank.erase(slot_id);
|
||||
@@ -1419,6 +1424,10 @@ int16 EQ::InventoryProfile::_PutItem(int16 slot_id, ItemInstance* inst)
|
||||
m_worn[slot_id] = inst;
|
||||
result = slot_id;
|
||||
}
|
||||
else if (slot_id >= invslot::GUILD_TRIBUTE_BEGIN && slot_id <= invslot::GUILD_TRIBUTE_END) {
|
||||
m_worn[slot_id] = inst;
|
||||
result = slot_id;
|
||||
}
|
||||
else if (slot_id >= invslot::BANK_BEGIN && slot_id <= invslot::BANK_END) {
|
||||
if (slot_id - EQ::invslot::BANK_BEGIN < m_lookup->InventoryTypeSize.Bank) {
|
||||
m_bank[slot_id] = inst;
|
||||
|
||||
@@ -1791,6 +1791,16 @@ int EQ::ItemInstance::RemoveTaskDeliveredItems()
|
||||
return count;
|
||||
}
|
||||
|
||||
uint32 EQ::ItemInstance::GetItemGuildFavor() const
|
||||
{
|
||||
uint32 total = 0;
|
||||
const auto item = GetItem();
|
||||
if (item) {
|
||||
return total = item->GuildFavor;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//
|
||||
// class EvolveInfo
|
||||
//
|
||||
|
||||
@@ -299,6 +299,7 @@ namespace EQ
|
||||
int GetItemHeroicDR(bool augments = false) const;
|
||||
int GetItemHeroicCorrup(bool augments = false) const;
|
||||
int GetItemHaste(bool augments = false) const;
|
||||
uint32 GetItemGuildFavor() const;
|
||||
|
||||
protected:
|
||||
//////////////////////////
|
||||
|
||||
+28
-23
@@ -1308,13 +1308,13 @@ namespace RoF
|
||||
PutFieldN(class_);
|
||||
|
||||
/* Translate older ranks to new values */
|
||||
switch (emu_e->rank) {
|
||||
case 0: { e->rank = htonl(5); break; } // GUILD_MEMBER 0
|
||||
case 1: { e->rank = htonl(3); break; } // GUILD_OFFICER 1
|
||||
case 2: { e->rank = htonl(1); break; } // GUILD_LEADER 2
|
||||
default: { e->rank = htonl(emu_e->rank); break; } // GUILD_NONE
|
||||
}
|
||||
|
||||
//switch (emu_e->rank) {
|
||||
//case 0: { e->rank = htonl(5); break; } // GUILD_MEMBER 0
|
||||
//case 1: { e->rank = htonl(3); break; } // GUILD_OFFICER 1
|
||||
//case 2: { e->rank = htonl(1); break; } // GUILD_LEADER 2
|
||||
//default: { e->rank = htonl(emu_e->rank); break; } // GUILD_NONE
|
||||
//}
|
||||
PutFieldN(rank);
|
||||
PutFieldN(time_last_on);
|
||||
PutFieldN(tribute_enable);
|
||||
e->unknown01 = 0;
|
||||
@@ -3051,19 +3051,12 @@ namespace RoF
|
||||
ENCODE_LENGTH_EXACT(GuildSetRank_Struct);
|
||||
SETUP_DIRECT_ENCODE(GuildSetRank_Struct, structs::GuildSetRank_Struct);
|
||||
|
||||
eq->GuildID = emu->Unknown00;
|
||||
eq->guild_id = emu->Unknown00;
|
||||
eq->rank = emu->rank;
|
||||
|
||||
/* Translate older ranks to new values */
|
||||
switch (emu->Rank) {
|
||||
case 0: { eq->Rank = 5; break; } // GUILD_MEMBER 0
|
||||
case 1: { eq->Rank = 3; break; } // GUILD_OFFICER 1
|
||||
case 2: { eq->Rank = 1; break; } // GUILD_LEADER 2
|
||||
default: { eq->Rank = emu->Rank; break; }
|
||||
}
|
||||
|
||||
memcpy(eq->MemberName, emu->MemberName, sizeof(eq->MemberName));
|
||||
OUT(Banker);
|
||||
eq->Unknown76 = 1;
|
||||
memcpy(eq->member_name, emu->member_name, sizeof(eq->member_name));
|
||||
OUT(banker);
|
||||
eq->unknown76 = 1;
|
||||
|
||||
FINISH_ENCODE();
|
||||
}
|
||||
@@ -3973,10 +3966,22 @@ namespace RoF
|
||||
|
||||
/* Translate older ranks to new values */
|
||||
switch (emu->guildrank) {
|
||||
case 0: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 5); break; } // GUILD_MEMBER 0
|
||||
case 1: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 3); break; } // GUILD_OFFICER 1
|
||||
case 2: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 1); break; } // GUILD_LEADER 2
|
||||
default: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildrank); break; } //
|
||||
case 0: {
|
||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 5);
|
||||
break;
|
||||
} // GUILD_MEMBER 0
|
||||
case 1: {
|
||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 3);
|
||||
break;
|
||||
} // GUILD_OFFICER 1
|
||||
case 2: {
|
||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 1);
|
||||
break;
|
||||
} // GUILD_LEADER 2
|
||||
default: {
|
||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildrank);
|
||||
break;
|
||||
} //
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+79
-32
@@ -1319,6 +1319,7 @@ namespace RoF2
|
||||
buffer++;
|
||||
|
||||
// Guild ID
|
||||
//*((uint32*)buffer) = htonl(2);
|
||||
buffer += sizeof(uint32);
|
||||
|
||||
//add member count.
|
||||
@@ -1357,15 +1358,7 @@ namespace RoF2
|
||||
PutFieldN(level);
|
||||
PutFieldN(banker);
|
||||
PutFieldN(class_);
|
||||
|
||||
/* Translate older ranks to new values */
|
||||
switch (emu_e->rank) {
|
||||
case 0: { e->rank = htonl(5); break; } // GUILD_MEMBER 0
|
||||
case 1: { e->rank = htonl(3); break; } // GUILD_OFFICER 1
|
||||
case 2: { e->rank = htonl(1); break; } // GUILD_LEADER 2
|
||||
default: { e->rank = htonl(emu_e->rank); break; } // GUILD_NONE
|
||||
}
|
||||
|
||||
PutFieldN(rank);
|
||||
PutFieldN(time_last_on);
|
||||
PutFieldN(tribute_enable);
|
||||
e->unknown01 = 0;
|
||||
@@ -1395,8 +1388,10 @@ namespace RoF2
|
||||
|
||||
OUT(GuildID);
|
||||
memcpy(eq->MemberName, emu->MemberName, sizeof(eq->MemberName));
|
||||
OUT(ZoneID);
|
||||
OUT(InstanceID);
|
||||
//OUT(ZoneID);
|
||||
//OUT(InstanceID);
|
||||
eq->InstanceID = emu->InstanceID;
|
||||
eq->ZoneID = emu->ZoneID;
|
||||
OUT(LastSeen);
|
||||
eq->Unknown76 = 0;
|
||||
|
||||
@@ -1422,7 +1417,7 @@ namespace RoF2
|
||||
if (InBuffer[0])
|
||||
{
|
||||
PacketSize += (5 + strlen(InBuffer));
|
||||
HighestGuildID = i - 1;
|
||||
HighestGuildID += 1;
|
||||
}
|
||||
InBuffer += 64;
|
||||
}
|
||||
@@ -1460,6 +1455,30 @@ namespace RoF2
|
||||
dest->FastQueuePacket(&in, ack_req);
|
||||
}
|
||||
|
||||
ENCODE(OP_GuildTributeDonateItem)
|
||||
{
|
||||
SETUP_DIRECT_ENCODE(GuildTributeDonateItemReply_Struct, structs::GuildTributeDonateItemReply_Struct);
|
||||
|
||||
Log(Logs::Detail, Logs::Netcode, "RoF2::ENCODE(OP_GuildTributeDonateItem)");
|
||||
|
||||
OUT(type);
|
||||
OUT(sub_index);
|
||||
OUT(aug_index);
|
||||
OUT(quantity);
|
||||
OUT(unknown10);
|
||||
OUT(unknown20);
|
||||
OUT(favor);
|
||||
|
||||
structs::InventorySlot_Struct iss;
|
||||
iss = ServerToRoF2Slot(emu->slot);
|
||||
|
||||
eq->slot = iss.Slot;
|
||||
eq->sub_index = iss.SubIndex;
|
||||
|
||||
FINISH_ENCODE();
|
||||
}
|
||||
|
||||
|
||||
ENCODE(OP_HPUpdate)
|
||||
{
|
||||
SETUP_DIRECT_ENCODE(SpawnHPUpdate_Struct, structs::SpawnHPUpdate_Struct);
|
||||
@@ -2466,6 +2485,8 @@ namespace RoF2
|
||||
{
|
||||
outapp->WriteUInt32(0xffffffff);
|
||||
outapp->WriteUInt32(0);
|
||||
// outapp->WriteUInt32(60);
|
||||
// outapp->WriteUInt32(1);
|
||||
}
|
||||
|
||||
outapp->WriteUInt32(0); // Unknown
|
||||
@@ -3104,19 +3125,12 @@ namespace RoF2
|
||||
ENCODE_LENGTH_EXACT(GuildSetRank_Struct);
|
||||
SETUP_DIRECT_ENCODE(GuildSetRank_Struct, structs::GuildSetRank_Struct);
|
||||
|
||||
eq->GuildID = emu->Unknown00;
|
||||
eq->guild_id= emu->Unknown00;
|
||||
eq->rank = emu->rank;
|
||||
|
||||
/* Translate older ranks to new values */
|
||||
switch (emu->Rank) {
|
||||
case 0: { eq->Rank = 5; break; } // GUILD_MEMBER 0
|
||||
case 1: { eq->Rank = 3; break; } // GUILD_OFFICER 1
|
||||
case 2: { eq->Rank = 1; break; } // GUILD_LEADER 2
|
||||
default: { eq->Rank = emu->Rank; break; }
|
||||
}
|
||||
|
||||
memcpy(eq->MemberName, emu->MemberName, sizeof(eq->MemberName));
|
||||
OUT(Banker);
|
||||
eq->Unknown76 = 1;
|
||||
memcpy(eq->member_name, emu->member_name, sizeof(eq->member_name));
|
||||
OUT(banker);
|
||||
eq->unknown76 = 1;
|
||||
|
||||
FINISH_ENCODE();
|
||||
}
|
||||
@@ -4178,12 +4192,13 @@ namespace RoF2
|
||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildID);
|
||||
|
||||
/* Translate older ranks to new values */
|
||||
switch (emu->guildrank) {
|
||||
case 0: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 5); break; } // GUILD_MEMBER 0
|
||||
case 1: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 3); break; } // GUILD_OFFICER 1
|
||||
case 2: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 1); break; } // GUILD_LEADER 2
|
||||
default: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildrank); break; } //
|
||||
}
|
||||
//switch (emu->guildrank) {
|
||||
//case 0: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 5); break; } // GUILD_MEMBER 0
|
||||
//case 1: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 3); break; } // GUILD_OFFICER 1
|
||||
//case 2: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 1); break; } // GUILD_LEADER 2
|
||||
//default: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildrank); break; } //
|
||||
//}
|
||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildrank);
|
||||
}
|
||||
|
||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->class_);
|
||||
@@ -4199,7 +4214,7 @@ namespace RoF2
|
||||
VARSTRUCT_ENCODE_STRING(Buffer, emu->lastName);
|
||||
|
||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); // aatitle
|
||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->NPC ? 0 : 1); // unknown - Must be 1 for guild name to be shown abover players head.
|
||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->guild_show);
|
||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 0); // TempPet
|
||||
|
||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->petOwnerId);
|
||||
@@ -4955,7 +4970,7 @@ namespace RoF2
|
||||
|
||||
strn0cpy(emu->target, eq->target, sizeof(emu->target));
|
||||
strn0cpy(emu->name, eq->name, sizeof(emu->name));
|
||||
// IN(rank);
|
||||
IN(rank);
|
||||
|
||||
FINISH_DIRECT_DECODE();
|
||||
}
|
||||
@@ -4983,6 +4998,38 @@ namespace RoF2
|
||||
FINISH_DIRECT_DECODE();
|
||||
}
|
||||
|
||||
DECODE(OP_GuildTributeDonateItem)
|
||||
{
|
||||
DECODE_LENGTH_EXACT(structs::GuildTributeDonateItemRequest_Struct);
|
||||
SETUP_DIRECT_DECODE(GuildTributeDonateItemRequest_Struct, structs::GuildTributeDonateItemRequest_Struct);
|
||||
|
||||
Log(Logs::Detail, Logs::Netcode, "RoF2::DECODE(OP_GuildTributeDonateItem)");
|
||||
|
||||
IN(type);
|
||||
IN(slot);
|
||||
IN(sub_index);
|
||||
IN(aug_index);
|
||||
IN(unknown10);
|
||||
IN(quantity);
|
||||
IN(tribute_master_id);
|
||||
IN(unknown20);
|
||||
IN(guild_id);
|
||||
IN(unknown28);
|
||||
IN(unknown32);
|
||||
|
||||
structs::InventorySlot_Struct iss;
|
||||
iss.Slot = eq->slot;
|
||||
iss.SubIndex = eq->sub_index;
|
||||
iss.AugIndex = eq->aug_index;
|
||||
iss.Type = eq->type;
|
||||
iss.Unknown01 = 0;
|
||||
iss.Unknown02 = 0;
|
||||
|
||||
emu->slot = RoF2ToServerSlot(iss);
|
||||
|
||||
FINISH_DIRECT_DECODE();
|
||||
}
|
||||
|
||||
/*DECODE(OP_InspectAnswer)
|
||||
{
|
||||
DECODE_LENGTH_EXACT(structs::InspectResponse_Struct);
|
||||
|
||||
@@ -82,6 +82,7 @@ E(OP_GuildBank)
|
||||
E(OP_GuildMemberList)
|
||||
E(OP_GuildMemberUpdate)
|
||||
E(OP_GuildsList)
|
||||
E(OP_GuildTributeDonateItem)
|
||||
E(OP_HPUpdate)
|
||||
E(OP_Illusion)
|
||||
E(OP_InspectBuffs)
|
||||
@@ -182,6 +183,7 @@ D(OP_GuildBank)
|
||||
D(OP_GuildDemote)
|
||||
D(OP_GuildRemove)
|
||||
D(OP_GuildStatus)
|
||||
D(OP_GuildTributeDonateItem)
|
||||
D(OP_InspectRequest)
|
||||
D(OP_ItemLinkClick)
|
||||
D(OP_ItemVerifyRequest)
|
||||
|
||||
@@ -2011,6 +2011,31 @@ struct GuildBankClear_Struct
|
||||
/*16*/ uint32 MainAreaCount;
|
||||
};
|
||||
|
||||
struct GuildTributeDonateItemRequest_Struct {
|
||||
/*000*/ uint32 type;
|
||||
/*004*/ uint16 slot;
|
||||
/*006*/ uint16 sub_index;
|
||||
/*008*/ uint16 aug_index;
|
||||
/*010*/ uint16 unknown10;
|
||||
/*012*/ uint32 quantity;
|
||||
/*016*/ uint32 tribute_master_id;
|
||||
/*020*/ uint32 unknown20;
|
||||
/*024*/ uint32 guild_id;
|
||||
/*028*/ uint32 unknown28;
|
||||
/*032*/ uint32 unknown32;
|
||||
};
|
||||
|
||||
struct GuildTributeDonateItemReply_Struct {
|
||||
/*000*/ uint32 type;
|
||||
/*004*/ uint16 slot;
|
||||
/*006*/ uint16 sub_index;
|
||||
/*008*/ uint16 aug_index;
|
||||
/*010*/ uint16 unknown10;
|
||||
/*012*/ uint32 quantity;
|
||||
/*016*/ uint32 unknown20;
|
||||
/*020*/ uint32 favor;
|
||||
};
|
||||
|
||||
/*
|
||||
** Money Loot
|
||||
** Length: 22 Bytes
|
||||
@@ -3600,11 +3625,11 @@ struct GuildMakeLeader {
|
||||
// Update a guild members rank and banker status
|
||||
struct GuildSetRank_Struct
|
||||
{
|
||||
/*00*/ uint32 GuildID; // Was Unknown00
|
||||
/*04*/ uint32 Rank;
|
||||
/*08*/ char MemberName[64];
|
||||
/*72*/ uint32 Banker;
|
||||
/*76*/ uint32 Unknown76; // Seen 1 - Maybe Banker?
|
||||
/*00*/ uint32 guild_id; // Was Unknown00
|
||||
/*04*/ uint32 rank;
|
||||
/*08*/ char member_name[64];
|
||||
/*72*/ uint32 banker;
|
||||
/*76*/ uint32 unknown76; // Seen 1 - Maybe Banker?
|
||||
/*80*/
|
||||
};
|
||||
|
||||
@@ -3722,15 +3747,15 @@ struct TributeItem_Struct
|
||||
|
||||
struct TributePoint_Struct {
|
||||
int32 tribute_points;
|
||||
uint32 unknown04;
|
||||
uint32 unknown04;
|
||||
int32 career_tribute_points;
|
||||
uint32 unknown12;
|
||||
uint32 unknown12;
|
||||
};
|
||||
|
||||
struct TributeMoney_Struct {
|
||||
uint32 platinum;
|
||||
uint32 tribute_master_id;
|
||||
int32 tribute_points;
|
||||
int32 tribute_points;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -3537,11 +3537,11 @@ struct GuildMakeLeader {
|
||||
// Update a guild members rank and banker status
|
||||
struct GuildSetRank_Struct
|
||||
{
|
||||
/*00*/ uint32 GuildID; // Was Unknown00
|
||||
/*04*/ uint32 Rank;
|
||||
/*08*/ char MemberName[64];
|
||||
/*72*/ uint32 Banker;
|
||||
/*76*/ uint32 Unknown76; // Seen 1 - Maybe Banker?
|
||||
/*00*/ uint32 guild_id; // Was Unknown00
|
||||
/*04*/ uint32 rank;
|
||||
/*08*/ char member_name[64];
|
||||
/*72*/ uint32 banker;
|
||||
/*76*/ uint32 unknown76; // Seen 1 - Maybe Banker?
|
||||
/*80*/
|
||||
};
|
||||
|
||||
|
||||
+401
-13
@@ -34,6 +34,7 @@
|
||||
#include "titanium_structs.h"
|
||||
#include "../path_manager.h"
|
||||
#include "../raid.h"
|
||||
#include "../guilds.h"
|
||||
|
||||
#include <sstream>
|
||||
|
||||
@@ -664,6 +665,151 @@ namespace Titanium
|
||||
dest->FastQueuePacket(&in, ack_req);
|
||||
}
|
||||
|
||||
ENCODE(OP_SetGuildRank)
|
||||
{
|
||||
ENCODE_LENGTH_EXACT(GuildSetRank_Struct);
|
||||
SETUP_DIRECT_ENCODE(GuildSetRank_Struct, structs::GuildSetRank_Struct);
|
||||
|
||||
eq->unknown00 = 0;
|
||||
eq->unknown04 = 0;
|
||||
|
||||
//Translate older ranks to new values* /
|
||||
switch (emu->rank) {
|
||||
case GUILD_SENIOR_MEMBER:
|
||||
case GUILD_MEMBER:
|
||||
case GUILD_JUNIOR_MEMBER:
|
||||
case GUILD_INITIATE:
|
||||
case GUILD_RECRUIT: {
|
||||
eq->rank = GUILD_MEMBER_TI;
|
||||
break;
|
||||
}
|
||||
case GUILD_OFFICER:
|
||||
case GUILD_SENIOR_OFFICER: {
|
||||
eq->rank = GUILD_OFFICER_TI;
|
||||
break;
|
||||
}
|
||||
case GUILD_LEADER: {
|
||||
eq->rank = GUILD_LEADER_TI;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
memcpy(eq->member_name, emu->member_name, sizeof(eq->member_name));
|
||||
OUT(banker);
|
||||
|
||||
FINISH_ENCODE();
|
||||
}
|
||||
|
||||
ENCODE(OP_SpawnAppearance)
|
||||
{
|
||||
ENCODE_LENGTH_EXACT(SpawnAppearance_Struct);
|
||||
SETUP_DIRECT_ENCODE(SpawnAppearance_Struct, structs::SpawnAppearance_Struct);
|
||||
|
||||
OUT(spawn_id);
|
||||
OUT(type);
|
||||
OUT(parameter);
|
||||
switch (emu->type) {
|
||||
case AppearanceType::GuildRank: {
|
||||
//Translate new ranks to old values* /
|
||||
switch (emu->parameter) {
|
||||
case GUILD_SENIOR_MEMBER:
|
||||
case GUILD_MEMBER:
|
||||
case GUILD_JUNIOR_MEMBER:
|
||||
case GUILD_INITIATE:
|
||||
case GUILD_RECRUIT: {
|
||||
eq->parameter = GUILD_MEMBER_TI;
|
||||
break;
|
||||
}
|
||||
case GUILD_OFFICER:
|
||||
case GUILD_SENIOR_OFFICER: {
|
||||
eq->parameter = GUILD_OFFICER_TI;
|
||||
break;
|
||||
}
|
||||
case GUILD_LEADER: {
|
||||
eq->parameter = GUILD_LEADER_TI;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case AppearanceType::GuildShow: {
|
||||
FAIL_ENCODE();
|
||||
return;
|
||||
}
|
||||
default: {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
FINISH_ENCODE();
|
||||
}
|
||||
|
||||
ENCODE(OP_GuildMemberAdd)
|
||||
{
|
||||
ENCODE_LENGTH_EXACT(GuildMemberAdd_Struct)
|
||||
SETUP_DIRECT_ENCODE(GuildMemberAdd_Struct, structs::GuildMemberAdd_Struct)
|
||||
|
||||
OUT(guild_id)
|
||||
OUT(level)
|
||||
OUT(class_)
|
||||
switch (emu->rank_) {
|
||||
case GUILD_SENIOR_MEMBER:
|
||||
case GUILD_MEMBER:
|
||||
case GUILD_JUNIOR_MEMBER:
|
||||
case GUILD_INITIATE:
|
||||
case GUILD_RECRUIT: {
|
||||
eq->rank_ = GUILD_MEMBER_TI;
|
||||
break;
|
||||
}
|
||||
case GUILD_OFFICER:
|
||||
case GUILD_SENIOR_OFFICER: {
|
||||
eq->rank_ = GUILD_OFFICER_TI;
|
||||
break;
|
||||
}
|
||||
case GUILD_LEADER: {
|
||||
eq->rank_ = GUILD_LEADER_TI;
|
||||
break;
|
||||
}
|
||||
}
|
||||
OUT(zone_id)
|
||||
OUT(last_on)
|
||||
OUT_str(player_name)
|
||||
|
||||
FINISH_ENCODE()
|
||||
}
|
||||
|
||||
ENCODE(OP_GuildMemberRankAltBanker)
|
||||
{
|
||||
ENCODE_LENGTH_EXACT(GuildMemberRank_Struct)
|
||||
SETUP_DIRECT_ENCODE(GuildMemberRank_Struct, structs::GuildMemberRank_Struct)
|
||||
|
||||
OUT(guild_id)
|
||||
OUT(alt_banker)
|
||||
OUT_str(player_name)
|
||||
|
||||
switch (emu->rank_) {
|
||||
case GUILD_SENIOR_MEMBER:
|
||||
case GUILD_MEMBER:
|
||||
case GUILD_JUNIOR_MEMBER:
|
||||
case GUILD_INITIATE:
|
||||
case GUILD_RECRUIT: {
|
||||
eq->rank_ = GUILD_MEMBER_TI;
|
||||
break;
|
||||
}
|
||||
case GUILD_OFFICER:
|
||||
case GUILD_SENIOR_OFFICER: {
|
||||
eq->rank_ = GUILD_OFFICER_TI;
|
||||
break;
|
||||
}
|
||||
case GUILD_LEADER: {
|
||||
eq->rank_ = GUILD_LEADER_TI;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
FINISH_ENCODE()
|
||||
}
|
||||
|
||||
ENCODE(OP_GuildMemberList)
|
||||
{
|
||||
//consume the packet
|
||||
@@ -727,12 +873,34 @@ namespace Titanium
|
||||
str += sl + 1; \
|
||||
}
|
||||
#define PutFieldN(field) e->field = htonl(emu_e->field)
|
||||
|
||||
/* Translate new ranks to older values */
|
||||
SlideStructString(name, emu_name);
|
||||
PutFieldN(level);
|
||||
PutFieldN(banker);
|
||||
PutFieldN(class_);
|
||||
PutFieldN(rank);
|
||||
switch (emu_e->rank) {
|
||||
case GUILD_SENIOR_MEMBER:
|
||||
case GUILD_MEMBER:
|
||||
case GUILD_JUNIOR_MEMBER:
|
||||
case GUILD_INITIATE:
|
||||
case GUILD_RECRUIT: {
|
||||
e->rank = htonl(GUILD_MEMBER_TI);
|
||||
break;
|
||||
}
|
||||
case GUILD_OFFICER:
|
||||
case GUILD_SENIOR_OFFICER: {
|
||||
e->rank = htonl(GUILD_OFFICER_TI);
|
||||
break;
|
||||
}
|
||||
case GUILD_LEADER: {
|
||||
e->rank = htonl(GUILD_LEADER_TI);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
e->rank = htonl(GUILD_MEMBER_TI);
|
||||
break;
|
||||
}
|
||||
}
|
||||
PutFieldN(time_last_on);
|
||||
PutFieldN(tribute_enable);
|
||||
PutFieldN(total_tribute);
|
||||
@@ -753,6 +921,38 @@ namespace Titanium
|
||||
dest->FastQueuePacket(&in, ack_req);
|
||||
}
|
||||
|
||||
ENCODE(OP_SendGuildTributes)
|
||||
{
|
||||
ENCODE_LENGTH_ATLEAST(structs::GuildTributeAbility_Struct);
|
||||
SETUP_VAR_ENCODE(GuildTributeAbility_Struct);
|
||||
ALLOC_VAR_ENCODE(structs::GuildTributeAbility_Struct, sizeof(GuildTributeAbility_Struct) + strlen(emu->ability.name));
|
||||
|
||||
eq->guild_id = emu->guild_id;;
|
||||
strncpy(eq->ability.name, emu->ability.name, strlen(emu->ability.name));
|
||||
eq->ability.tribute_id = emu->ability.tribute_id;
|
||||
eq->ability.tier_count = emu->ability.tier_count;
|
||||
for (int i = 0; i < ntohl(emu->ability.tier_count); i++) {
|
||||
eq->ability.tiers[i].cost = emu->ability.tiers[i].cost;
|
||||
eq->ability.tiers[i].level = emu->ability.tiers[i].level;
|
||||
eq->ability.tiers[i].tribute_item_id = emu->ability.tiers[i].tribute_item_id;
|
||||
}
|
||||
FINISH_ENCODE();
|
||||
}
|
||||
|
||||
ENCODE(OP_GuildTributeDonateItem)
|
||||
{
|
||||
SETUP_DIRECT_ENCODE(GuildTributeDonateItemReply_Struct, structs::GuildTributeDonateItemReply_Struct);
|
||||
|
||||
Log(Logs::Detail, Logs::Netcode, "UF::ENCODE(OP_GuildTributeDonateItem)");
|
||||
|
||||
OUT(quantity);
|
||||
OUT(favor);
|
||||
eq->unknown8 = 0;
|
||||
eq->slot = ServerToTitaniumSlot(emu->slot);
|
||||
|
||||
FINISH_ENCODE();
|
||||
}
|
||||
|
||||
ENCODE(OP_Illusion)
|
||||
{
|
||||
ENCODE_LENGTH_EXACT(Illusion_Struct);
|
||||
@@ -867,11 +1067,60 @@ namespace Titanium
|
||||
|
||||
ENCODE(OP_LFGuild)
|
||||
{
|
||||
struct bit_mask_conversion {
|
||||
uint32 titanium_mask;
|
||||
uint32 rof2_mask;
|
||||
};
|
||||
|
||||
std::vector<bit_mask_conversion> bit_mask = {
|
||||
{.titanium_mask = 2, .rof2_mask = 256},
|
||||
{.titanium_mask = 4, .rof2_mask = 32768},
|
||||
{.titanium_mask = 8, .rof2_mask = 65536},
|
||||
{.titanium_mask = 16, .rof2_mask = 4},
|
||||
{.titanium_mask = 32, .rof2_mask = 64},
|
||||
{.titanium_mask = 64, .rof2_mask = 16384},
|
||||
{.titanium_mask = 128, .rof2_mask = 8192},
|
||||
{.titanium_mask = 256, .rof2_mask = 128},
|
||||
{.titanium_mask = 512, .rof2_mask = 2048},
|
||||
{.titanium_mask = 1024, .rof2_mask = 8},
|
||||
{.titanium_mask = 2048, .rof2_mask = 16},
|
||||
{.titanium_mask = 4096, .rof2_mask = 512},
|
||||
{.titanium_mask = 8192, .rof2_mask = 32},
|
||||
{.titanium_mask = 16384, .rof2_mask = 1024},
|
||||
{.titanium_mask = 32768, .rof2_mask = 2},
|
||||
{.titanium_mask = 65536, .rof2_mask = 4096},
|
||||
};
|
||||
|
||||
EQApplicationPacket *in = *p;
|
||||
*p = nullptr;
|
||||
|
||||
uint32 Command = in->ReadUInt32();
|
||||
|
||||
if (Command == 1) {
|
||||
ENCODE_LENGTH_EXACT(LFGuild_GuildToggle_Struct);
|
||||
SETUP_DIRECT_ENCODE(LFGuild_GuildToggle_Struct, structs::LFGuild_GuildToggle_Struct);
|
||||
|
||||
OUT(Command);
|
||||
OUT_str(Comment);
|
||||
OUT(FromLevel);
|
||||
OUT(ToLevel);
|
||||
OUT(AACount);
|
||||
OUT(TimeZone);
|
||||
OUT(Toggle);
|
||||
OUT(TimePosted);
|
||||
OUT_str(Name);
|
||||
|
||||
uint32 emu_bitmask = emu->Classes;
|
||||
uint32 ti_bitmask = 0;
|
||||
for (auto const& b : bit_mask) {
|
||||
(emu_bitmask & b.rof2_mask) != 0 ? ti_bitmask |= b.titanium_mask : ti_bitmask &= ~b.titanium_mask;
|
||||
}
|
||||
eq->Classes = ti_bitmask;
|
||||
|
||||
FINISH_ENCODE();
|
||||
return;
|
||||
}
|
||||
|
||||
*p = nullptr;
|
||||
if (Command != 0)
|
||||
{
|
||||
dest->FastQueuePacket(&in, ack_req);
|
||||
@@ -1149,7 +1398,28 @@ namespace Titanium
|
||||
OUT(pvp);
|
||||
OUT(anon);
|
||||
OUT(gm);
|
||||
OUT(guildrank);
|
||||
switch (emu->guildrank) {
|
||||
case GUILD_SENIOR_MEMBER:
|
||||
case GUILD_MEMBER:
|
||||
case GUILD_JUNIOR_MEMBER:
|
||||
case GUILD_INITIATE:
|
||||
case GUILD_RECRUIT: {
|
||||
eq->guildrank = GUILD_MEMBER_TI;
|
||||
break;
|
||||
}
|
||||
case GUILD_OFFICER:
|
||||
case GUILD_SENIOR_OFFICER: {
|
||||
eq->guildrank = GUILD_OFFICER_TI;
|
||||
break;
|
||||
}
|
||||
case GUILD_LEADER: {
|
||||
eq->guildrank = GUILD_LEADER_TI;
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
break;
|
||||
}
|
||||
}
|
||||
OUT(guildbanker);
|
||||
// OUT(unknown13054[8]);
|
||||
OUT(exp);
|
||||
@@ -1250,7 +1520,7 @@ namespace Titanium
|
||||
{
|
||||
ENCODE_LENGTH_EXACT(MarkNPC_Struct);
|
||||
SETUP_DIRECT_ENCODE(MarkNPC_Struct, MarkNPC_Struct);
|
||||
|
||||
|
||||
EQApplicationPacket* outapp = new EQApplicationPacket(OP_MarkNPC, sizeof(MarkNPC_Struct));
|
||||
MarkNPC_Struct* mnpcs = (MarkNPC_Struct*)outapp->pBuffer;
|
||||
mnpcs->TargetID = emu->TargetID;
|
||||
@@ -1267,10 +1537,10 @@ namespace Titanium
|
||||
*p = nullptr;
|
||||
unsigned char* __emu_buffer = inapp->pBuffer;
|
||||
RaidGeneral_Struct* raid_gen = (RaidGeneral_Struct*)__emu_buffer;
|
||||
|
||||
|
||||
switch (raid_gen->action)
|
||||
{
|
||||
case raidAdd:
|
||||
case raidAdd:
|
||||
{
|
||||
RaidAddMember_Struct* emu = (RaidAddMember_Struct*)__emu_buffer;
|
||||
|
||||
@@ -1340,7 +1610,7 @@ namespace Titanium
|
||||
dest->QueuePacket(inapp);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
default:
|
||||
{
|
||||
RaidGeneral_Struct* emu = (RaidGeneral_Struct*)__emu_buffer;
|
||||
|
||||
@@ -1864,7 +2134,28 @@ namespace Titanium
|
||||
eq->beard = emu->beard;
|
||||
strcpy(eq->suffix, emu->suffix);
|
||||
eq->petOwnerId = emu->petOwnerId;
|
||||
eq->guildrank = emu->guildrank;
|
||||
switch (emu->guildrank) {
|
||||
case GUILD_SENIOR_MEMBER:
|
||||
case GUILD_MEMBER:
|
||||
case GUILD_JUNIOR_MEMBER:
|
||||
case GUILD_INITIATE:
|
||||
case GUILD_RECRUIT: {
|
||||
eq->guildrank = GUILD_MEMBER_TI;
|
||||
break;
|
||||
}
|
||||
case GUILD_OFFICER:
|
||||
case GUILD_SENIOR_OFFICER: {
|
||||
eq->guildrank = GUILD_OFFICER_TI;
|
||||
break;
|
||||
}
|
||||
case GUILD_LEADER: {
|
||||
eq->guildrank = GUILD_LEADER_TI;
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
break;
|
||||
}
|
||||
}
|
||||
// eq->unknown0194[3] = emu->unknown0194[3];
|
||||
for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; k++) {
|
||||
eq->equipment.Slot[k].Material = emu->equipment.Slot[k].Material;
|
||||
@@ -2205,6 +2496,34 @@ namespace Titanium
|
||||
FINISH_DIRECT_DECODE();
|
||||
}
|
||||
|
||||
DECODE(OP_GuildDemote)
|
||||
{
|
||||
DECODE_LENGTH_EXACT(structs::GuildDemoteStruct);
|
||||
SETUP_DIRECT_DECODE(GuildDemoteStruct, structs::GuildDemoteStruct);
|
||||
|
||||
memcpy(emu->name, eq->name, sizeof(emu->name));
|
||||
memcpy(emu->target, eq->target, sizeof(emu->target));
|
||||
emu->rank = GUILD_MEMBER;
|
||||
|
||||
FINISH_DIRECT_DECODE();
|
||||
}
|
||||
|
||||
DECODE(OP_GuildTributeDonateItem)
|
||||
{
|
||||
DECODE_LENGTH_EXACT(structs::GuildTributeDonateItemRequest_Struct);
|
||||
SETUP_DIRECT_DECODE(GuildTributeDonateItemRequest_Struct, structs::GuildTributeDonateItemRequest_Struct);
|
||||
|
||||
Log(Logs::Detail, Logs::Netcode, "UF::DECODE(OP_GuildTributeDonateItem)");
|
||||
|
||||
IN(quantity);
|
||||
IN(tribute_master_id);
|
||||
IN(guild_id);
|
||||
|
||||
emu->slot = TitaniumToServerSlot(eq->slot);
|
||||
|
||||
FINISH_DIRECT_DECODE();
|
||||
}
|
||||
|
||||
DECODE(OP_InspectAnswer)
|
||||
{
|
||||
DECODE_LENGTH_EXACT(structs::InspectResponse_Struct);
|
||||
@@ -2260,8 +2579,77 @@ namespace Titanium
|
||||
|
||||
DECODE(OP_LFGuild)
|
||||
{
|
||||
struct bit_mask_conversion {
|
||||
uint32 titanium_mask;
|
||||
uint32 rof2_mask;
|
||||
};
|
||||
|
||||
std::vector<bit_mask_conversion> bit_mask = {
|
||||
{.titanium_mask = 2, .rof2_mask = 256},
|
||||
{.titanium_mask = 4, .rof2_mask = 32768},
|
||||
{.titanium_mask = 8, .rof2_mask = 65536},
|
||||
{.titanium_mask = 16, .rof2_mask = 4},
|
||||
{.titanium_mask = 32, .rof2_mask = 64},
|
||||
{.titanium_mask = 64, .rof2_mask = 16384},
|
||||
{.titanium_mask = 128, .rof2_mask = 8192},
|
||||
{.titanium_mask = 256, .rof2_mask = 128},
|
||||
{.titanium_mask = 512, .rof2_mask = 2048},
|
||||
{.titanium_mask = 1024, .rof2_mask = 8},
|
||||
{.titanium_mask = 2048, .rof2_mask = 16},
|
||||
{.titanium_mask = 4096, .rof2_mask = 512},
|
||||
{.titanium_mask = 8192, .rof2_mask = 32},
|
||||
{.titanium_mask = 16384, .rof2_mask = 1024},
|
||||
{.titanium_mask = 32768, .rof2_mask = 2},
|
||||
{.titanium_mask = 65536, .rof2_mask = 4096},
|
||||
};
|
||||
|
||||
uint32 Command = __packet->ReadUInt32();
|
||||
|
||||
if (Command == 3) {
|
||||
DECODE_LENGTH_EXACT(structs::LFGuild_SearchPlayer_Struct);
|
||||
SETUP_DIRECT_DECODE(LFGuild_SearchPlayer_Struct, structs::LFGuild_SearchPlayer_Struct);
|
||||
|
||||
IN(Command);
|
||||
IN(Unknown04);
|
||||
IN(FromLevel);
|
||||
IN(ToLevel);
|
||||
IN(MinAA);
|
||||
IN(TimeZone);
|
||||
|
||||
uint32 new_bitmask = 0;
|
||||
uint32 ti_bitmask = eq->Classes;
|
||||
for (auto const& b : bit_mask) {
|
||||
(ti_bitmask & b.titanium_mask) != 0 ? new_bitmask |= b.rof2_mask : new_bitmask &= ~b.rof2_mask;
|
||||
}
|
||||
emu->Classes = new_bitmask;
|
||||
FINISH_DIRECT_DECODE();
|
||||
return;
|
||||
}
|
||||
|
||||
if (Command == 1) {
|
||||
DECODE_LENGTH_EXACT(structs::LFGuild_GuildToggle_Struct);
|
||||
SETUP_DIRECT_DECODE(LFGuild_GuildToggle_Struct, structs::LFGuild_GuildToggle_Struct);
|
||||
|
||||
IN(Command);
|
||||
IN_str(Comment);
|
||||
IN(FromLevel);
|
||||
IN(ToLevel);
|
||||
IN(AACount);
|
||||
IN(TimeZone);
|
||||
IN(Toggle);
|
||||
IN(TimePosted);
|
||||
IN_str(Name);
|
||||
|
||||
uint32 new_bitmask = 0;
|
||||
uint32 ti_bitmask = eq->Classes;
|
||||
for (auto const& b : bit_mask) {
|
||||
(ti_bitmask & b.titanium_mask) != 0 ? new_bitmask |= b.rof2_mask : new_bitmask &= ~b.rof2_mask;
|
||||
}
|
||||
emu->Classes = new_bitmask;
|
||||
FINISH_DIRECT_DECODE();
|
||||
return;
|
||||
}
|
||||
|
||||
if (Command != 0)
|
||||
return;
|
||||
|
||||
@@ -2401,7 +2789,7 @@ namespace Titanium
|
||||
IN(general.parameter);
|
||||
IN_str(general.leader_name);
|
||||
IN_str(general.player_name);
|
||||
|
||||
|
||||
auto len = 0;
|
||||
if (__packet->size < sizeof(structs::RaidMOTD_Struct)) {
|
||||
len = __packet->size - sizeof(structs::RaidGeneral_Struct);
|
||||
@@ -2409,8 +2797,8 @@ namespace Titanium
|
||||
else {
|
||||
len = sizeof(eq->motd);
|
||||
}
|
||||
|
||||
strn0cpy(emu->motd, eq->motd, len > 1024 ? 1024 : len);
|
||||
|
||||
strn0cpy(emu->motd, eq->motd, len > 1024 ? 1024 : len);
|
||||
emu->motd[len - 1] = '\0';
|
||||
|
||||
FINISH_VAR_DECODE();
|
||||
@@ -2428,7 +2816,7 @@ namespace Titanium
|
||||
|
||||
FINISH_VAR_DECODE();
|
||||
break;
|
||||
}
|
||||
}
|
||||
default:
|
||||
{
|
||||
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
||||
|
||||
@@ -44,8 +44,13 @@ E(OP_DzSetLeaderName)
|
||||
E(OP_Emote)
|
||||
E(OP_FormattedMessage)
|
||||
E(OP_GroundSpawn)
|
||||
E(OP_SetGuildRank)
|
||||
E(OP_GuildMemberLevelUpdate)
|
||||
E(OP_GuildMemberList)
|
||||
E(OP_GuildMemberAdd)
|
||||
E(OP_GuildMemberRankAltBanker)
|
||||
E(OP_SendGuildTributes)
|
||||
E(OP_GuildTributeDonateItem)
|
||||
E(OP_Illusion)
|
||||
E(OP_InspectAnswer)
|
||||
E(OP_InspectRequest)
|
||||
@@ -69,6 +74,7 @@ E(OP_SendCharInfo)
|
||||
E(OP_SendAATable)
|
||||
E(OP_SetFace)
|
||||
E(OP_ShopPlayerSell)
|
||||
E(OP_SpawnAppearance)
|
||||
E(OP_SpecialMesg)
|
||||
E(OP_TaskDescription)
|
||||
E(OP_Track)
|
||||
@@ -100,9 +106,11 @@ D(OP_DzRemovePlayer)
|
||||
D(OP_DzSwapPlayer)
|
||||
D(OP_Emote)
|
||||
D(OP_FaceChange)
|
||||
D(OP_GuildDemote)
|
||||
D(OP_InspectAnswer)
|
||||
D(OP_InspectRequest)
|
||||
D(OP_ItemLinkClick)
|
||||
D(OP_GuildTributeDonateItem)
|
||||
D(OP_LFGuild)
|
||||
D(OP_LoadSpellSet)
|
||||
D(OP_LootItem)
|
||||
|
||||
@@ -1423,6 +1423,23 @@ struct GuildUpdate_Struct {
|
||||
GuildsListEntry_Struct entry;
|
||||
};
|
||||
|
||||
struct GuildTributeDonateItemRequest_Struct {
|
||||
/*000*/ uint32 slot;
|
||||
/*004*/ uint32 quantity;
|
||||
/*008*/ uint32 tribute_master_id;
|
||||
/*012*/ uint32 unknown12;
|
||||
/*016*/ uint32 guild_id;
|
||||
/*020*/ uint32 unknown20;
|
||||
/*024*/ uint32 unknown24;
|
||||
};
|
||||
|
||||
struct GuildTributeDonateItemReply_Struct {
|
||||
/*000*/ uint32 slot;
|
||||
/*004*/ uint32 quantity;
|
||||
/*008*/ uint32 unknown8;
|
||||
/*012*/ uint32 favor;
|
||||
};
|
||||
|
||||
/*
|
||||
** Money Loot
|
||||
** Length: 22 Bytes
|
||||
@@ -3508,7 +3525,7 @@ struct LFGuild_GuildToggle_Struct
|
||||
/*540*/ uint32 TimeZone;
|
||||
/*544*/ uint8 Toggle;
|
||||
/*545*/ uint8 Unknown545[3];
|
||||
/*548*/ uint32 Expires;
|
||||
/*548*/ uint32 TimePosted;
|
||||
/*552*/ char Name[64];
|
||||
/*616*/
|
||||
};
|
||||
@@ -3699,6 +3716,34 @@ struct SayLinkBodyFrame_Struct {
|
||||
/*045*/
|
||||
};
|
||||
|
||||
struct GuildSetRank_Struct
|
||||
{
|
||||
/*00*/ uint32 unknown00;
|
||||
/*04*/ uint32 unknown04;
|
||||
/*08*/ uint32 rank;
|
||||
/*72*/ char member_name[64];
|
||||
/*76*/ uint32 banker;
|
||||
};
|
||||
|
||||
struct GuildMemberAdd_Struct {
|
||||
/*000*/ uint32 guild_id;
|
||||
/*004*/ uint32 unknown04;
|
||||
/*008*/ uint32 level;
|
||||
/*012*/ uint32 class_;
|
||||
/*016*/ uint32 rank_;
|
||||
/*020*/ uint32 zone_id;
|
||||
/*024*/ uint32 last_on;
|
||||
/*028*/ char player_name[64];
|
||||
};
|
||||
|
||||
struct GuildMemberRank_Struct {
|
||||
/*000*/ uint32 guild_id;
|
||||
/*004*/ uint32 unknown_004;
|
||||
/*008*/ uint32 rank_;
|
||||
/*012*/ char player_name[64];
|
||||
/*076*/ uint32 alt_banker; //Banker/Alt bit 00 - none 10 - Alt 11 - Alt and Banker 01 - Banker. Banker not functional for RoF2+
|
||||
};
|
||||
|
||||
}; /*structs*/
|
||||
|
||||
}; /*Titanium*/
|
||||
|
||||
+270
-21
@@ -36,6 +36,7 @@
|
||||
#include "../classes.h"
|
||||
#include "../races.h"
|
||||
#include "../raid.h"
|
||||
#include "../guilds.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
@@ -1134,6 +1135,29 @@ namespace UF
|
||||
PutFieldN(level);
|
||||
PutFieldN(banker);
|
||||
PutFieldN(class_);
|
||||
//Translate older ranks to new values* /
|
||||
switch (emu_e->rank) {
|
||||
case GUILD_SENIOR_MEMBER:
|
||||
case GUILD_MEMBER:
|
||||
case GUILD_JUNIOR_MEMBER:
|
||||
case GUILD_INITIATE:
|
||||
case GUILD_RECRUIT: {
|
||||
emu_e->rank = GUILD_MEMBER_TI;
|
||||
break;
|
||||
}
|
||||
case GUILD_OFFICER:
|
||||
case GUILD_SENIOR_OFFICER: {
|
||||
emu_e->rank = GUILD_OFFICER_TI;
|
||||
break;
|
||||
}
|
||||
case GUILD_LEADER: {
|
||||
emu_e->rank = GUILD_LEADER_TI;
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
break;
|
||||
}
|
||||
}
|
||||
PutFieldN(rank);
|
||||
PutFieldN(time_last_on);
|
||||
PutFieldN(tribute_enable);
|
||||
@@ -1165,14 +1189,14 @@ namespace UF
|
||||
|
||||
unsigned char *__emu_buffer = in->pBuffer;
|
||||
char *InBuffer = (char *)__emu_buffer;
|
||||
uint32 HighestGuildID = 0;
|
||||
uint32 actual_no_guilds = 0;
|
||||
|
||||
for (unsigned int i = 0; i < NumberOfGuilds; ++i)
|
||||
{
|
||||
if (InBuffer[0])
|
||||
{
|
||||
PacketSize += (5 + strlen(InBuffer));
|
||||
HighestGuildID = i - 1;
|
||||
actual_no_guilds++;
|
||||
}
|
||||
InBuffer += 64;
|
||||
}
|
||||
@@ -1188,7 +1212,7 @@ namespace UF
|
||||
memset(OutBuffer, 0, 64);
|
||||
OutBuffer += 64;
|
||||
|
||||
VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, HighestGuildID);
|
||||
VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, actual_no_guilds);
|
||||
|
||||
for (unsigned int i = 0; i < NumberOfGuilds; ++i)
|
||||
{
|
||||
@@ -1206,6 +1230,103 @@ namespace UF
|
||||
dest->FastQueuePacket(&in, ack_req);
|
||||
}
|
||||
|
||||
ENCODE(OP_GuildMemberAdd)
|
||||
{
|
||||
ENCODE_LENGTH_EXACT(GuildMemberAdd_Struct)
|
||||
SETUP_DIRECT_ENCODE(GuildMemberAdd_Struct, structs::GuildMemberAdd_Struct)
|
||||
|
||||
OUT(guild_id)
|
||||
OUT(level)
|
||||
OUT(class_)
|
||||
switch (emu->rank_) {
|
||||
case GUILD_SENIOR_MEMBER:
|
||||
case GUILD_MEMBER:
|
||||
case GUILD_JUNIOR_MEMBER:
|
||||
case GUILD_INITIATE:
|
||||
case GUILD_RECRUIT: {
|
||||
eq->rank_ = GUILD_MEMBER_TI;
|
||||
break;
|
||||
}
|
||||
case GUILD_OFFICER:
|
||||
case GUILD_SENIOR_OFFICER: {
|
||||
eq->rank_ = GUILD_OFFICER_TI;
|
||||
break;
|
||||
}
|
||||
case GUILD_LEADER: {
|
||||
eq->rank_ = GUILD_LEADER_TI;
|
||||
break;
|
||||
}
|
||||
}
|
||||
OUT(zone_id)
|
||||
OUT(last_on)
|
||||
OUT_str(player_name)
|
||||
|
||||
FINISH_ENCODE()
|
||||
}
|
||||
|
||||
ENCODE(OP_GuildMemberRankAltBanker)
|
||||
{
|
||||
ENCODE_LENGTH_EXACT(GuildMemberRank_Struct)
|
||||
SETUP_DIRECT_ENCODE(GuildMemberRank_Struct, structs::GuildMemberRank_Struct)
|
||||
|
||||
OUT(guild_id)
|
||||
OUT(alt_banker)
|
||||
OUT_str(player_name)
|
||||
|
||||
switch (emu->rank_) {
|
||||
case GUILD_SENIOR_MEMBER:
|
||||
case GUILD_MEMBER:
|
||||
case GUILD_JUNIOR_MEMBER:
|
||||
case GUILD_INITIATE:
|
||||
case GUILD_RECRUIT: {
|
||||
eq->rank_ = GUILD_MEMBER_TI;
|
||||
break;
|
||||
}
|
||||
case GUILD_OFFICER:
|
||||
case GUILD_SENIOR_OFFICER: {
|
||||
eq->rank_ = GUILD_OFFICER_TI;
|
||||
break;
|
||||
}
|
||||
case GUILD_LEADER: {
|
||||
eq->rank_ = GUILD_LEADER_TI;
|
||||
break;
|
||||
}
|
||||
}
|
||||
FINISH_ENCODE()
|
||||
}
|
||||
|
||||
ENCODE(OP_SendGuildTributes)
|
||||
{
|
||||
ENCODE_LENGTH_ATLEAST(structs::GuildTributeAbility_Struct)
|
||||
SETUP_VAR_ENCODE(GuildTributeAbility_Struct)
|
||||
ALLOC_VAR_ENCODE(structs::GuildTributeAbility_Struct, sizeof(GuildTributeAbility_Struct) + strlen(emu->ability.name))
|
||||
|
||||
eq->guild_id = emu->guild_id;
|
||||
eq->ability.tribute_id = emu->ability.tribute_id;
|
||||
eq->ability.tier_count = emu->ability.tier_count;
|
||||
strncpy(eq->ability.name, emu->ability.name, strlen(emu->ability.name));
|
||||
for (int i = 0; i < ntohl(emu->ability.tier_count); i++) {
|
||||
eq->ability.tiers[i].cost = emu->ability.tiers[i].cost;
|
||||
eq->ability.tiers[i].level = emu->ability.tiers[i].level;
|
||||
eq->ability.tiers[i].tribute_item_id = emu->ability.tiers[i].tribute_item_id;
|
||||
}
|
||||
FINISH_ENCODE()
|
||||
}
|
||||
|
||||
ENCODE(OP_GuildTributeDonateItem)
|
||||
{
|
||||
SETUP_DIRECT_ENCODE(GuildTributeDonateItemReply_Struct, structs::GuildTributeDonateItemReply_Struct);
|
||||
|
||||
Log(Logs::Detail, Logs::Netcode, "UF::ENCODE(OP_GuildTributeDonateItem)");
|
||||
|
||||
OUT(quantity)
|
||||
OUT(favor)
|
||||
eq->unknown8 = 0;
|
||||
eq->slot = ServerToUFSlot(emu->slot);
|
||||
|
||||
FINISH_ENCODE()
|
||||
}
|
||||
|
||||
ENCODE(OP_Illusion)
|
||||
{
|
||||
ENCODE_LENGTH_EXACT(Illusion_Struct);
|
||||
@@ -1829,6 +1950,29 @@ namespace UF
|
||||
OUT(pvp);
|
||||
OUT(anon);
|
||||
OUT(gm);
|
||||
//Translate older ranks to new values* /
|
||||
switch (emu->guildrank) {
|
||||
case GUILD_SENIOR_MEMBER:
|
||||
case GUILD_MEMBER:
|
||||
case GUILD_JUNIOR_MEMBER:
|
||||
case GUILD_INITIATE:
|
||||
case GUILD_RECRUIT: {
|
||||
emu->guildrank = GUILD_MEMBER_TI;
|
||||
break;
|
||||
}
|
||||
case GUILD_OFFICER:
|
||||
case GUILD_SENIOR_OFFICER: {
|
||||
emu->guildrank = GUILD_OFFICER_TI;
|
||||
break;
|
||||
}
|
||||
case GUILD_LEADER: {
|
||||
emu->guildrank = GUILD_LEADER_TI;
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
break;
|
||||
}
|
||||
}
|
||||
OUT(guildrank);
|
||||
OUT(guildbanker);
|
||||
// OUT(unknown13054[12]);
|
||||
@@ -2332,29 +2476,83 @@ namespace UF
|
||||
|
||||
ENCODE(OP_SpawnAppearance)
|
||||
{
|
||||
EQApplicationPacket *in = *p;
|
||||
*p = nullptr;
|
||||
ENCODE_LENGTH_EXACT(SpawnAppearance_Struct);
|
||||
SETUP_DIRECT_ENCODE(SpawnAppearance_Struct, structs::SpawnAppearance_Struct);
|
||||
|
||||
unsigned char *emu_buffer = in->pBuffer;
|
||||
|
||||
SpawnAppearance_Struct *sas = (SpawnAppearance_Struct *)emu_buffer;
|
||||
|
||||
if (sas->type != AppearanceType::Size)
|
||||
{
|
||||
dest->FastQueuePacket(&in, ack_req);
|
||||
return;
|
||||
OUT(spawn_id);
|
||||
OUT(type);
|
||||
OUT(parameter);
|
||||
switch (emu->type) {
|
||||
case AppearanceType::GuildRank: {
|
||||
//Translate new ranks to old values* /
|
||||
switch (emu->parameter) {
|
||||
case GUILD_SENIOR_MEMBER:
|
||||
case GUILD_MEMBER:
|
||||
case GUILD_JUNIOR_MEMBER:
|
||||
case GUILD_INITIATE:
|
||||
case GUILD_RECRUIT: {
|
||||
eq->parameter = GUILD_MEMBER_TI;
|
||||
break;
|
||||
}
|
||||
case GUILD_OFFICER:
|
||||
case GUILD_SENIOR_OFFICER: {
|
||||
eq->parameter = GUILD_OFFICER_TI;
|
||||
break;
|
||||
}
|
||||
case GUILD_LEADER: {
|
||||
eq->parameter = GUILD_LEADER_TI;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case AppearanceType::GuildShow: {
|
||||
FAIL_ENCODE();
|
||||
return;
|
||||
}
|
||||
default: {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
auto outapp = new EQApplicationPacket(OP_ChangeSize, sizeof(ChangeSize_Struct));
|
||||
ChangeSize_Struct *css = (ChangeSize_Struct *)outapp->pBuffer;
|
||||
FINISH_ENCODE();
|
||||
}
|
||||
|
||||
css->EntityID = sas->spawn_id;
|
||||
css->Size = (float)sas->parameter;
|
||||
css->Unknown08 = 0;
|
||||
css->Unknown12 = 1.0f;
|
||||
ENCODE(OP_SetGuildRank)
|
||||
{
|
||||
ENCODE_LENGTH_EXACT(GuildSetRank_Struct);
|
||||
SETUP_DIRECT_ENCODE(GuildSetRank_Struct, structs::GuildSetRank_Struct);
|
||||
|
||||
dest->FastQueuePacket(&outapp, ack_req);
|
||||
delete in;
|
||||
eq->unknown00 = 0;
|
||||
eq->unknown04 = 0;
|
||||
|
||||
switch (emu->rank) {
|
||||
case GUILD_SENIOR_MEMBER:
|
||||
case GUILD_MEMBER:
|
||||
case GUILD_JUNIOR_MEMBER:
|
||||
case GUILD_INITIATE:
|
||||
case GUILD_RECRUIT: {
|
||||
emu->rank = GUILD_MEMBER_TI;
|
||||
break;
|
||||
}
|
||||
case GUILD_OFFICER:
|
||||
case GUILD_SENIOR_OFFICER: {
|
||||
emu->rank = GUILD_OFFICER_TI;
|
||||
break;
|
||||
}
|
||||
case GUILD_LEADER: {
|
||||
emu->rank = GUILD_LEADER_TI;
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
memcpy(eq->member_name, emu->member_name, sizeof(eq->member_name));
|
||||
OUT(banker);
|
||||
|
||||
FINISH_ENCODE();
|
||||
}
|
||||
|
||||
ENCODE(OP_SpawnDoor)
|
||||
@@ -2945,6 +3143,29 @@ namespace UF
|
||||
else
|
||||
{
|
||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildID);
|
||||
//Translate older ranks to new values* /
|
||||
switch (emu->guildrank) {
|
||||
case GUILD_SENIOR_MEMBER:
|
||||
case GUILD_MEMBER:
|
||||
case GUILD_JUNIOR_MEMBER:
|
||||
case GUILD_INITIATE:
|
||||
case GUILD_RECRUIT: {
|
||||
emu->guildrank = GUILD_MEMBER_TI;
|
||||
break;
|
||||
}
|
||||
case GUILD_OFFICER:
|
||||
case GUILD_SENIOR_OFFICER: {
|
||||
emu->guildrank = GUILD_OFFICER_TI;
|
||||
break;
|
||||
}
|
||||
case GUILD_LEADER: {
|
||||
emu->guildrank = GUILD_LEADER_TI;
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
break;
|
||||
}
|
||||
}
|
||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildrank);
|
||||
}
|
||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->class_);
|
||||
@@ -3577,6 +3798,34 @@ namespace UF
|
||||
DECODE_FORWARD(OP_GroupInvite);
|
||||
}
|
||||
|
||||
DECODE(OP_GuildDemote)
|
||||
{
|
||||
DECODE_LENGTH_EXACT(structs::GuildDemoteStruct);
|
||||
SETUP_DIRECT_DECODE(GuildDemoteStruct, structs::GuildDemoteStruct);
|
||||
|
||||
memcpy(emu->name, eq->name, sizeof(emu->name));
|
||||
memcpy(emu->target, eq->target, sizeof(emu->target));
|
||||
emu->rank = GUILD_MEMBER;
|
||||
|
||||
FINISH_DIRECT_DECODE();
|
||||
}
|
||||
|
||||
DECODE(OP_GuildTributeDonateItem)
|
||||
{
|
||||
DECODE_LENGTH_EXACT(structs::GuildTributeDonateItemRequest_Struct);
|
||||
SETUP_DIRECT_DECODE(GuildTributeDonateItemRequest_Struct, structs::GuildTributeDonateItemRequest_Struct);
|
||||
|
||||
Log(Logs::Detail, Logs::Netcode, "UF::DECODE(OP_GuildTributeDonateItem)");
|
||||
|
||||
IN(quantity);
|
||||
IN(tribute_master_id);
|
||||
IN(guild_id);
|
||||
|
||||
emu->slot = UFToServerSlot(eq->slot);
|
||||
|
||||
FINISH_DIRECT_DECODE();
|
||||
}
|
||||
|
||||
DECODE(OP_InspectRequest)
|
||||
{
|
||||
DECODE_LENGTH_EXACT(structs::Inspect_Struct);
|
||||
|
||||
@@ -58,6 +58,10 @@ E(OP_GroupInvite)
|
||||
E(OP_GroupUpdate)
|
||||
E(OP_GuildMemberList)
|
||||
E(OP_GuildsList)
|
||||
E(OP_GuildMemberAdd)
|
||||
E(OP_SendGuildTributes)
|
||||
E(OP_GuildMemberRankAltBanker)
|
||||
E(OP_GuildTributeDonateItem)
|
||||
E(OP_Illusion)
|
||||
E(OP_InspectBuffs)
|
||||
E(OP_InspectRequest)
|
||||
@@ -82,6 +86,7 @@ E(OP_RespondAA)
|
||||
E(OP_SendAATable)
|
||||
E(OP_SendCharInfo)
|
||||
E(OP_SendZonepoints)
|
||||
E(OP_SetGuildRank)
|
||||
E(OP_ShopPlayerBuy)
|
||||
E(OP_ShopPlayerSell)
|
||||
E(OP_SomeItemPacketMaybe)
|
||||
@@ -138,6 +143,8 @@ D(OP_GroupFollow)
|
||||
D(OP_GroupFollow2)
|
||||
D(OP_GroupInvite)
|
||||
D(OP_GroupInvite2)
|
||||
D(OP_GuildDemote)
|
||||
D(OP_GuildTributeDonateItem)
|
||||
D(OP_InspectRequest)
|
||||
D(OP_ItemLinkClick)
|
||||
D(OP_ItemVerifyRequest)
|
||||
|
||||
@@ -1670,6 +1670,15 @@ struct Surname_Struct
|
||||
/*0100*/
|
||||
};
|
||||
|
||||
struct GuildSetRank_Struct
|
||||
{
|
||||
/*00*/ uint32 unknown00;
|
||||
/*04*/ uint32 unknown04;
|
||||
/*08*/ uint32 rank;
|
||||
/*72*/ char member_name[64];
|
||||
/*76*/ uint32 banker;
|
||||
};
|
||||
|
||||
struct GuildsListEntry_Struct {
|
||||
char name[64];
|
||||
};
|
||||
@@ -1685,6 +1694,27 @@ struct GuildUpdate_Struct {
|
||||
GuildsListEntry_Struct entry;
|
||||
};
|
||||
|
||||
struct GuildMemberAdd_Struct {
|
||||
/*000*/ uint32 guild_id;
|
||||
/*004*/ uint32 unknown04;
|
||||
/*008*/ uint32 unknown08;
|
||||
/*012*/ uint32 unknown12;
|
||||
/*016*/ uint32 level;
|
||||
/*020*/ uint32 class_;
|
||||
/*024*/ uint32 rank_;
|
||||
/*028*/ uint32 zone_id;
|
||||
/*032*/ uint32 last_on;
|
||||
/*036*/ char player_name[64];
|
||||
};
|
||||
|
||||
struct GuildMemberRank_Struct {
|
||||
/*000*/ uint32 guild_id;
|
||||
/*004*/ uint32 unknown_004;
|
||||
/*008*/ uint32 rank_;
|
||||
/*012*/ char player_name[64];
|
||||
/*076*/ uint32 alt_banker; //Banker/Alt bit 00 - none 10 - Alt 11 - Alt and Banker 01 - Banker. Banker not functional for RoF2+
|
||||
};
|
||||
|
||||
/*
|
||||
** Money Loot
|
||||
** Length: 22 Bytes
|
||||
@@ -3067,6 +3097,23 @@ struct GuildMakeLeader{
|
||||
char target[64];
|
||||
};
|
||||
|
||||
struct GuildTributeDonateItemRequest_Struct {
|
||||
/*000*/ uint32 slot;
|
||||
/*004*/ uint32 quantity;
|
||||
/*008*/ uint32 tribute_master_id;
|
||||
/*012*/ uint32 unknown12;
|
||||
/*016*/ uint32 guild_id;
|
||||
/*020*/ uint32 unknown20;
|
||||
/*024*/ uint32 unknown24;
|
||||
};
|
||||
|
||||
struct GuildTributeDonateItemReply_Struct {
|
||||
/*000*/ uint32 slot;
|
||||
/*004*/ uint32 quantity;
|
||||
/*008*/ uint32 unknown8;
|
||||
/*012*/ uint32 favor;
|
||||
};
|
||||
|
||||
struct Make_Pet_Struct { //Simple struct for getting pet info
|
||||
uint8 level;
|
||||
uint8 class_;
|
||||
|
||||
@@ -0,0 +1,404 @@
|
||||
/**
|
||||
* DO NOT MODIFY THIS FILE
|
||||
*
|
||||
* This repository was automatically generated and is NOT to be modified directly.
|
||||
* Any repository modifications are meant to be made to the repository extending the base.
|
||||
* Any modifications to base repositories are to be made by the generator only
|
||||
*
|
||||
* @generator ./utils/scripts/generators/repository-generator.pl
|
||||
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
|
||||
*/
|
||||
|
||||
#ifndef EQEMU_BASE_GUILD_BANK_REPOSITORY_H
|
||||
#define EQEMU_BASE_GUILD_BANK_REPOSITORY_H
|
||||
|
||||
#include "../../database.h"
|
||||
#include "../../strings.h"
|
||||
#include <ctime>
|
||||
|
||||
|
||||
class BaseGuildBankRepository {
|
||||
public:
|
||||
struct GuildBank {
|
||||
uint32_t id;
|
||||
uint32_t guildid;
|
||||
uint8_t area;
|
||||
uint32_t slot;
|
||||
uint32_t itemid;
|
||||
uint32_t qty;
|
||||
std::string donator;
|
||||
uint8_t permissions;
|
||||
std::string whofor;
|
||||
};
|
||||
|
||||
static std::string PrimaryKey()
|
||||
{
|
||||
return std::string("id");
|
||||
}
|
||||
|
||||
static std::vector<std::string> Columns()
|
||||
{
|
||||
return {
|
||||
"id",
|
||||
"guildid",
|
||||
"area",
|
||||
"slot",
|
||||
"itemid",
|
||||
"qty",
|
||||
"donator",
|
||||
"permissions",
|
||||
"whofor",
|
||||
};
|
||||
}
|
||||
|
||||
static std::vector<std::string> SelectColumns()
|
||||
{
|
||||
return {
|
||||
"id",
|
||||
"guildid",
|
||||
"area",
|
||||
"slot",
|
||||
"itemid",
|
||||
"qty",
|
||||
"donator",
|
||||
"permissions",
|
||||
"whofor",
|
||||
};
|
||||
}
|
||||
|
||||
static std::string ColumnsRaw()
|
||||
{
|
||||
return std::string(Strings::Implode(", ", Columns()));
|
||||
}
|
||||
|
||||
static std::string SelectColumnsRaw()
|
||||
{
|
||||
return std::string(Strings::Implode(", ", SelectColumns()));
|
||||
}
|
||||
|
||||
static std::string TableName()
|
||||
{
|
||||
return std::string("guild_bank");
|
||||
}
|
||||
|
||||
static std::string BaseSelect()
|
||||
{
|
||||
return fmt::format(
|
||||
"SELECT {} FROM {}",
|
||||
SelectColumnsRaw(),
|
||||
TableName()
|
||||
);
|
||||
}
|
||||
|
||||
static std::string BaseInsert()
|
||||
{
|
||||
return fmt::format(
|
||||
"INSERT INTO {} ({}) ",
|
||||
TableName(),
|
||||
ColumnsRaw()
|
||||
);
|
||||
}
|
||||
|
||||
static GuildBank NewEntity()
|
||||
{
|
||||
GuildBank e{};
|
||||
|
||||
e.id = 0;
|
||||
e.guildid = 0;
|
||||
e.area = 0;
|
||||
e.slot = 0;
|
||||
e.itemid = 0;
|
||||
e.qty = 0;
|
||||
e.donator = "";
|
||||
e.permissions = 0;
|
||||
e.whofor = "";
|
||||
|
||||
return e;
|
||||
}
|
||||
|
||||
static GuildBank GetGuildBank(
|
||||
const std::vector<GuildBank> &guild_banks,
|
||||
int guild_bank_id
|
||||
)
|
||||
{
|
||||
for (auto &guild_bank : guild_banks) {
|
||||
if (guild_bank.id == guild_bank_id) {
|
||||
return guild_bank;
|
||||
}
|
||||
}
|
||||
|
||||
return NewEntity();
|
||||
}
|
||||
|
||||
static GuildBank FindOne(
|
||||
Database& db,
|
||||
int guild_bank_id
|
||||
)
|
||||
{
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"{} WHERE {} = {} LIMIT 1",
|
||||
BaseSelect(),
|
||||
PrimaryKey(),
|
||||
guild_bank_id
|
||||
)
|
||||
);
|
||||
|
||||
auto row = results.begin();
|
||||
if (results.RowCount() == 1) {
|
||||
GuildBank e{};
|
||||
|
||||
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
||||
e.guildid = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
||||
e.area = static_cast<uint8_t>(strtoul(row[2], nullptr, 10));
|
||||
e.slot = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
|
||||
e.itemid = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
|
||||
e.qty = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
|
||||
e.donator = row[6] ? row[6] : "";
|
||||
e.permissions = static_cast<uint8_t>(strtoul(row[7], nullptr, 10));
|
||||
e.whofor = row[8] ? row[8] : "";
|
||||
|
||||
return e;
|
||||
}
|
||||
|
||||
return NewEntity();
|
||||
}
|
||||
|
||||
static int DeleteOne(
|
||||
Database& db,
|
||||
int guild_bank_id
|
||||
)
|
||||
{
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"DELETE FROM {} WHERE {} = {}",
|
||||
TableName(),
|
||||
PrimaryKey(),
|
||||
guild_bank_id
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() ? results.RowsAffected() : 0);
|
||||
}
|
||||
|
||||
static int UpdateOne(
|
||||
Database& db,
|
||||
const GuildBank &e
|
||||
)
|
||||
{
|
||||
std::vector<std::string> v;
|
||||
|
||||
auto columns = Columns();
|
||||
|
||||
v.push_back(columns[1] + " = " + std::to_string(e.guildid));
|
||||
v.push_back(columns[2] + " = " + std::to_string(e.area));
|
||||
v.push_back(columns[3] + " = " + std::to_string(e.slot));
|
||||
v.push_back(columns[4] + " = " + std::to_string(e.itemid));
|
||||
v.push_back(columns[5] + " = " + std::to_string(e.qty));
|
||||
v.push_back(columns[6] + " = '" + Strings::Escape(e.donator) + "'");
|
||||
v.push_back(columns[7] + " = " + std::to_string(e.permissions));
|
||||
v.push_back(columns[8] + " = '" + Strings::Escape(e.whofor) + "'");
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"UPDATE {} SET {} WHERE {} = {}",
|
||||
TableName(),
|
||||
Strings::Implode(", ", v),
|
||||
PrimaryKey(),
|
||||
e.id
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() ? results.RowsAffected() : 0);
|
||||
}
|
||||
|
||||
static GuildBank InsertOne(
|
||||
Database& db,
|
||||
GuildBank e
|
||||
)
|
||||
{
|
||||
std::vector<std::string> v;
|
||||
|
||||
v.push_back(std::to_string(e.id));
|
||||
v.push_back(std::to_string(e.guildid));
|
||||
v.push_back(std::to_string(e.area));
|
||||
v.push_back(std::to_string(e.slot));
|
||||
v.push_back(std::to_string(e.itemid));
|
||||
v.push_back(std::to_string(e.qty));
|
||||
v.push_back("'" + Strings::Escape(e.donator) + "'");
|
||||
v.push_back(std::to_string(e.permissions));
|
||||
v.push_back("'" + Strings::Escape(e.whofor) + "'");
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"{} VALUES ({})",
|
||||
BaseInsert(),
|
||||
Strings::Implode(",", v)
|
||||
)
|
||||
);
|
||||
|
||||
if (results.Success()) {
|
||||
e.id = results.LastInsertedID();
|
||||
return e;
|
||||
}
|
||||
|
||||
e = NewEntity();
|
||||
|
||||
return e;
|
||||
}
|
||||
|
||||
static int InsertMany(
|
||||
Database& db,
|
||||
const std::vector<GuildBank> &entries
|
||||
)
|
||||
{
|
||||
std::vector<std::string> insert_chunks;
|
||||
|
||||
for (auto &e: entries) {
|
||||
std::vector<std::string> v;
|
||||
|
||||
v.push_back(std::to_string(e.id));
|
||||
v.push_back(std::to_string(e.guildid));
|
||||
v.push_back(std::to_string(e.area));
|
||||
v.push_back(std::to_string(e.slot));
|
||||
v.push_back(std::to_string(e.itemid));
|
||||
v.push_back(std::to_string(e.qty));
|
||||
v.push_back("'" + Strings::Escape(e.donator) + "'");
|
||||
v.push_back(std::to_string(e.permissions));
|
||||
v.push_back("'" + Strings::Escape(e.whofor) + "'");
|
||||
|
||||
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
||||
}
|
||||
|
||||
std::vector<std::string> v;
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"{} VALUES {}",
|
||||
BaseInsert(),
|
||||
Strings::Implode(",", insert_chunks)
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() ? results.RowsAffected() : 0);
|
||||
}
|
||||
|
||||
static std::vector<GuildBank> All(Database& db)
|
||||
{
|
||||
std::vector<GuildBank> all_entries;
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"{}",
|
||||
BaseSelect()
|
||||
)
|
||||
);
|
||||
|
||||
all_entries.reserve(results.RowCount());
|
||||
|
||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||
GuildBank e{};
|
||||
|
||||
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
||||
e.guildid = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
||||
e.area = static_cast<uint8_t>(strtoul(row[2], nullptr, 10));
|
||||
e.slot = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
|
||||
e.itemid = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
|
||||
e.qty = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
|
||||
e.donator = row[6] ? row[6] : "";
|
||||
e.permissions = static_cast<uint8_t>(strtoul(row[7], nullptr, 10));
|
||||
e.whofor = row[8] ? row[8] : "";
|
||||
|
||||
all_entries.push_back(e);
|
||||
}
|
||||
|
||||
return all_entries;
|
||||
}
|
||||
|
||||
static std::vector<GuildBank> GetWhere(Database& db, const std::string &where_filter)
|
||||
{
|
||||
std::vector<GuildBank> all_entries;
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"{} WHERE {}",
|
||||
BaseSelect(),
|
||||
where_filter
|
||||
)
|
||||
);
|
||||
|
||||
all_entries.reserve(results.RowCount());
|
||||
|
||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||
GuildBank e{};
|
||||
|
||||
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
||||
e.guildid = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
||||
e.area = static_cast<uint8_t>(strtoul(row[2], nullptr, 10));
|
||||
e.slot = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
|
||||
e.itemid = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
|
||||
e.qty = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
|
||||
e.donator = row[6] ? row[6] : "";
|
||||
e.permissions = static_cast<uint8_t>(strtoul(row[7], nullptr, 10));
|
||||
e.whofor = row[8] ? row[8] : "";
|
||||
|
||||
all_entries.push_back(e);
|
||||
}
|
||||
|
||||
return all_entries;
|
||||
}
|
||||
|
||||
static int DeleteWhere(Database& db, const std::string &where_filter)
|
||||
{
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"DELETE FROM {} WHERE {}",
|
||||
TableName(),
|
||||
where_filter
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() ? results.RowsAffected() : 0);
|
||||
}
|
||||
|
||||
static int Truncate(Database& db)
|
||||
{
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"TRUNCATE TABLE {}",
|
||||
TableName()
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() ? results.RowsAffected() : 0);
|
||||
}
|
||||
|
||||
static int64 GetMaxId(Database& db)
|
||||
{
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"SELECT COALESCE(MAX({}), 0) FROM {}",
|
||||
PrimaryKey(),
|
||||
TableName()
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
||||
}
|
||||
|
||||
static int64 Count(Database& db, const std::string &where_filter = "")
|
||||
{
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"SELECT COUNT(*) FROM {} {}",
|
||||
TableName(),
|
||||
(where_filter.empty() ? "" : "WHERE " + where_filter)
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif //EQEMU_BASE_GUILD_BANK_REPOSITORY_H
|
||||
@@ -0,0 +1,416 @@
|
||||
/**
|
||||
* DO NOT MODIFY THIS FILE
|
||||
*
|
||||
* This repository was automatically generated and is NOT to be modified directly.
|
||||
* Any repository modifications are meant to be made to the repository extending the base.
|
||||
* Any modifications to base repositories are to be made by the generator only
|
||||
*
|
||||
* @generator ./utils/scripts/generators/repository-generator.pl
|
||||
* @docs https://docs.eqemu.io/developer/repositories
|
||||
*/
|
||||
|
||||
#ifndef EQEMU_BASE_GUILD_PERMISSIONS_REPOSITORY_H
|
||||
#define EQEMU_BASE_GUILD_PERMISSIONS_REPOSITORY_H
|
||||
|
||||
#include "../../database.h"
|
||||
#include "../../strings.h"
|
||||
#include <ctime>
|
||||
|
||||
|
||||
class BaseGuildPermissionsRepository {
|
||||
public:
|
||||
struct GuildPermissions {
|
||||
int32_t id;
|
||||
int32_t perm_id;
|
||||
int32_t guild_id;
|
||||
int32_t permission;
|
||||
};
|
||||
|
||||
static std::string PrimaryKey()
|
||||
{
|
||||
return std::string("id");
|
||||
}
|
||||
|
||||
static std::vector<std::string> Columns()
|
||||
{
|
||||
return {
|
||||
"id",
|
||||
"perm_id",
|
||||
"guild_id",
|
||||
"permission",
|
||||
};
|
||||
}
|
||||
|
||||
static std::vector<std::string> SelectColumns()
|
||||
{
|
||||
return {
|
||||
"id",
|
||||
"perm_id",
|
||||
"guild_id",
|
||||
"permission",
|
||||
};
|
||||
}
|
||||
|
||||
static std::string ColumnsRaw()
|
||||
{
|
||||
return std::string(Strings::Implode(", ", Columns()));
|
||||
}
|
||||
|
||||
static std::string SelectColumnsRaw()
|
||||
{
|
||||
return std::string(Strings::Implode(", ", SelectColumns()));
|
||||
}
|
||||
|
||||
static std::string TableName()
|
||||
{
|
||||
return std::string("guild_permissions");
|
||||
}
|
||||
|
||||
static std::string BaseSelect()
|
||||
{
|
||||
return fmt::format(
|
||||
"SELECT {} FROM {}",
|
||||
SelectColumnsRaw(),
|
||||
TableName()
|
||||
);
|
||||
}
|
||||
|
||||
static std::string BaseInsert()
|
||||
{
|
||||
return fmt::format(
|
||||
"INSERT INTO {} ({}) ",
|
||||
TableName(),
|
||||
ColumnsRaw()
|
||||
);
|
||||
}
|
||||
|
||||
static GuildPermissions NewEntity()
|
||||
{
|
||||
GuildPermissions e{};
|
||||
|
||||
e.id = 0;
|
||||
e.perm_id = 0;
|
||||
e.guild_id = 0;
|
||||
e.permission = 0;
|
||||
|
||||
return e;
|
||||
}
|
||||
|
||||
static GuildPermissions GetGuildPermissions(
|
||||
const std::vector<GuildPermissions> &guild_permissionss,
|
||||
int guild_permissions_id
|
||||
)
|
||||
{
|
||||
for (auto &guild_permissions : guild_permissionss) {
|
||||
if (guild_permissions.id == guild_permissions_id) {
|
||||
return guild_permissions;
|
||||
}
|
||||
}
|
||||
|
||||
return NewEntity();
|
||||
}
|
||||
|
||||
static GuildPermissions FindOne(
|
||||
Database& db,
|
||||
int guild_permissions_id
|
||||
)
|
||||
{
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"{} WHERE {} = {} LIMIT 1",
|
||||
BaseSelect(),
|
||||
PrimaryKey(),
|
||||
guild_permissions_id
|
||||
)
|
||||
);
|
||||
|
||||
auto row = results.begin();
|
||||
if (results.RowCount() == 1) {
|
||||
GuildPermissions e{};
|
||||
|
||||
e.id = static_cast<int32_t>(atoi(row[0]));
|
||||
e.perm_id = static_cast<int32_t>(atoi(row[1]));
|
||||
e.guild_id = static_cast<int32_t>(atoi(row[2]));
|
||||
e.permission = static_cast<int32_t>(atoi(row[3]));
|
||||
|
||||
return e;
|
||||
}
|
||||
|
||||
return NewEntity();
|
||||
}
|
||||
|
||||
static int DeleteOne(
|
||||
Database& db,
|
||||
int guild_permissions_id
|
||||
)
|
||||
{
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"DELETE FROM {} WHERE {} = {}",
|
||||
TableName(),
|
||||
PrimaryKey(),
|
||||
guild_permissions_id
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() ? results.RowsAffected() : 0);
|
||||
}
|
||||
|
||||
static int UpdateOne(
|
||||
Database& db,
|
||||
const GuildPermissions &e
|
||||
)
|
||||
{
|
||||
std::vector<std::string> v;
|
||||
|
||||
auto columns = Columns();
|
||||
|
||||
v.push_back(columns[1] + " = " + std::to_string(e.perm_id));
|
||||
v.push_back(columns[2] + " = " + std::to_string(e.guild_id));
|
||||
v.push_back(columns[3] + " = " + std::to_string(e.permission));
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"UPDATE {} SET {} WHERE {} = {}",
|
||||
TableName(),
|
||||
Strings::Implode(", ", v),
|
||||
PrimaryKey(),
|
||||
e.id
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() ? results.RowsAffected() : 0);
|
||||
}
|
||||
|
||||
static GuildPermissions InsertOne(
|
||||
Database& db,
|
||||
GuildPermissions e
|
||||
)
|
||||
{
|
||||
std::vector<std::string> v;
|
||||
|
||||
v.push_back(std::to_string(e.id));
|
||||
v.push_back(std::to_string(e.perm_id));
|
||||
v.push_back(std::to_string(e.guild_id));
|
||||
v.push_back(std::to_string(e.permission));
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"{} VALUES ({})",
|
||||
BaseInsert(),
|
||||
Strings::Implode(",", v)
|
||||
)
|
||||
);
|
||||
|
||||
if (results.Success()) {
|
||||
e.id = results.LastInsertedID();
|
||||
return e;
|
||||
}
|
||||
|
||||
e = NewEntity();
|
||||
|
||||
return e;
|
||||
}
|
||||
|
||||
static int InsertMany(
|
||||
Database& db,
|
||||
const std::vector<GuildPermissions> &entries
|
||||
)
|
||||
{
|
||||
std::vector<std::string> insert_chunks;
|
||||
|
||||
for (auto &e: entries) {
|
||||
std::vector<std::string> v;
|
||||
|
||||
v.push_back(std::to_string(e.id));
|
||||
v.push_back(std::to_string(e.perm_id));
|
||||
v.push_back(std::to_string(e.guild_id));
|
||||
v.push_back(std::to_string(e.permission));
|
||||
|
||||
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
||||
}
|
||||
|
||||
std::vector<std::string> v;
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"{} VALUES {}",
|
||||
BaseInsert(),
|
||||
Strings::Implode(",", insert_chunks)
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() ? results.RowsAffected() : 0);
|
||||
}
|
||||
|
||||
static std::vector<GuildPermissions> All(Database& db)
|
||||
{
|
||||
std::vector<GuildPermissions> all_entries;
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"{}",
|
||||
BaseSelect()
|
||||
)
|
||||
);
|
||||
|
||||
all_entries.reserve(results.RowCount());
|
||||
|
||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||
GuildPermissions e{};
|
||||
|
||||
e.id = static_cast<int32_t>(atoi(row[0]));
|
||||
e.perm_id = static_cast<int32_t>(atoi(row[1]));
|
||||
e.guild_id = static_cast<int32_t>(atoi(row[2]));
|
||||
e.permission = static_cast<int32_t>(atoi(row[3]));
|
||||
|
||||
all_entries.push_back(e);
|
||||
}
|
||||
|
||||
return all_entries;
|
||||
}
|
||||
|
||||
static std::vector<GuildPermissions> GetWhere(Database& db, const std::string &where_filter)
|
||||
{
|
||||
std::vector<GuildPermissions> all_entries;
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"{} WHERE {}",
|
||||
BaseSelect(),
|
||||
where_filter
|
||||
)
|
||||
);
|
||||
|
||||
all_entries.reserve(results.RowCount());
|
||||
|
||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||
GuildPermissions e{};
|
||||
|
||||
e.id = static_cast<int32_t>(atoi(row[0]));
|
||||
e.perm_id = static_cast<int32_t>(atoi(row[1]));
|
||||
e.guild_id = static_cast<int32_t>(atoi(row[2]));
|
||||
e.permission = static_cast<int32_t>(atoi(row[3]));
|
||||
|
||||
all_entries.push_back(e);
|
||||
}
|
||||
|
||||
return all_entries;
|
||||
}
|
||||
|
||||
static int DeleteWhere(Database& db, const std::string &where_filter)
|
||||
{
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"DELETE FROM {} WHERE {}",
|
||||
TableName(),
|
||||
where_filter
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() ? results.RowsAffected() : 0);
|
||||
}
|
||||
|
||||
static int Truncate(Database& db)
|
||||
{
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"TRUNCATE TABLE {}",
|
||||
TableName()
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() ? results.RowsAffected() : 0);
|
||||
}
|
||||
|
||||
static int64 GetMaxId(Database& db)
|
||||
{
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"SELECT COALESCE(MAX({}), 0) FROM {}",
|
||||
PrimaryKey(),
|
||||
TableName()
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
||||
}
|
||||
|
||||
static int64 Count(Database& db, const std::string &where_filter = "")
|
||||
{
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"SELECT COUNT(*) FROM {} {}",
|
||||
TableName(),
|
||||
(where_filter.empty() ? "" : "WHERE " + where_filter)
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
||||
}
|
||||
|
||||
static std::string BaseReplace()
|
||||
{
|
||||
return fmt::format(
|
||||
"REPLACE INTO {} ({}) ",
|
||||
TableName(),
|
||||
ColumnsRaw()
|
||||
);
|
||||
}
|
||||
|
||||
static int ReplaceOne(
|
||||
Database& db,
|
||||
const GuildPermissions &e
|
||||
)
|
||||
{
|
||||
std::vector<std::string> v;
|
||||
|
||||
v.push_back(std::to_string(e.id));
|
||||
v.push_back(std::to_string(e.perm_id));
|
||||
v.push_back(std::to_string(e.guild_id));
|
||||
v.push_back(std::to_string(e.permission));
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"{} VALUES ({})",
|
||||
BaseReplace(),
|
||||
Strings::Implode(",", v)
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() ? results.RowsAffected() : 0);
|
||||
}
|
||||
|
||||
static int ReplaceMany(
|
||||
Database& db,
|
||||
const std::vector<GuildPermissions> &entries
|
||||
)
|
||||
{
|
||||
std::vector<std::string> insert_chunks;
|
||||
|
||||
for (auto &e: entries) {
|
||||
std::vector<std::string> v;
|
||||
|
||||
v.push_back(std::to_string(e.id));
|
||||
v.push_back(std::to_string(e.perm_id));
|
||||
v.push_back(std::to_string(e.guild_id));
|
||||
v.push_back(std::to_string(e.permission));
|
||||
|
||||
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
||||
}
|
||||
|
||||
std::vector<std::string> v;
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"{} VALUES {}",
|
||||
BaseReplace(),
|
||||
Strings::Implode(",", insert_chunks)
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() ? results.RowsAffected() : 0);
|
||||
}
|
||||
};
|
||||
|
||||
#endif //EQEMU_BASE_GUILD_PERMISSIONS_REPOSITORY_H
|
||||
@@ -0,0 +1,453 @@
|
||||
/**
|
||||
* DO NOT MODIFY THIS FILE
|
||||
*
|
||||
* This repository was automatically generated and is NOT to be modified directly.
|
||||
* Any repository modifications are meant to be made to the repository extending the base.
|
||||
* Any modifications to base repositories are to be made by the generator only
|
||||
*
|
||||
* @generator ./utils/scripts/generators/repository-generator.pl
|
||||
* @docs https://docs.eqemu.io/developer/repositories
|
||||
*/
|
||||
|
||||
#ifndef EQEMU_BASE_GUILD_TRIBUTES_REPOSITORY_H
|
||||
#define EQEMU_BASE_GUILD_TRIBUTES_REPOSITORY_H
|
||||
|
||||
#include "../../database.h"
|
||||
#include "../../strings.h"
|
||||
#include <ctime>
|
||||
|
||||
|
||||
class BaseGuildTributesRepository {
|
||||
public:
|
||||
struct GuildTributes {
|
||||
uint32_t guild_id;
|
||||
uint32_t tribute_id_1;
|
||||
uint32_t tribute_id_1_tier;
|
||||
uint32_t tribute_id_2;
|
||||
uint32_t tribute_id_2_tier;
|
||||
uint32_t time_remaining;
|
||||
uint32_t enabled;
|
||||
};
|
||||
|
||||
static std::string PrimaryKey()
|
||||
{
|
||||
return std::string("guild_id");
|
||||
}
|
||||
|
||||
static std::vector<std::string> Columns()
|
||||
{
|
||||
return {
|
||||
"guild_id",
|
||||
"tribute_id_1",
|
||||
"tribute_id_1_tier",
|
||||
"tribute_id_2",
|
||||
"tribute_id_2_tier",
|
||||
"time_remaining",
|
||||
"enabled",
|
||||
};
|
||||
}
|
||||
|
||||
static std::vector<std::string> SelectColumns()
|
||||
{
|
||||
return {
|
||||
"guild_id",
|
||||
"tribute_id_1",
|
||||
"tribute_id_1_tier",
|
||||
"tribute_id_2",
|
||||
"tribute_id_2_tier",
|
||||
"time_remaining",
|
||||
"enabled",
|
||||
};
|
||||
}
|
||||
|
||||
static std::string ColumnsRaw()
|
||||
{
|
||||
return std::string(Strings::Implode(", ", Columns()));
|
||||
}
|
||||
|
||||
static std::string SelectColumnsRaw()
|
||||
{
|
||||
return std::string(Strings::Implode(", ", SelectColumns()));
|
||||
}
|
||||
|
||||
static std::string TableName()
|
||||
{
|
||||
return std::string("guild_tributes");
|
||||
}
|
||||
|
||||
static std::string BaseSelect()
|
||||
{
|
||||
return fmt::format(
|
||||
"SELECT {} FROM {}",
|
||||
SelectColumnsRaw(),
|
||||
TableName()
|
||||
);
|
||||
}
|
||||
|
||||
static std::string BaseInsert()
|
||||
{
|
||||
return fmt::format(
|
||||
"INSERT INTO {} ({}) ",
|
||||
TableName(),
|
||||
ColumnsRaw()
|
||||
);
|
||||
}
|
||||
|
||||
static GuildTributes NewEntity()
|
||||
{
|
||||
GuildTributes e{};
|
||||
|
||||
e.guild_id = 0;
|
||||
e.tribute_id_1 = 0;
|
||||
e.tribute_id_1_tier = 0;
|
||||
e.tribute_id_2 = 0;
|
||||
e.tribute_id_2_tier = 0;
|
||||
e.time_remaining = 0;
|
||||
e.enabled = 0;
|
||||
|
||||
return e;
|
||||
}
|
||||
|
||||
static GuildTributes GetGuildTributes(
|
||||
const std::vector<GuildTributes> &guild_tributess,
|
||||
int guild_tributes_id
|
||||
)
|
||||
{
|
||||
for (auto &guild_tributes : guild_tributess) {
|
||||
if (guild_tributes.guild_id == guild_tributes_id) {
|
||||
return guild_tributes;
|
||||
}
|
||||
}
|
||||
|
||||
return NewEntity();
|
||||
}
|
||||
|
||||
static GuildTributes FindOne(
|
||||
Database& db,
|
||||
int guild_tributes_id
|
||||
)
|
||||
{
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"{} WHERE {} = {} LIMIT 1",
|
||||
BaseSelect(),
|
||||
PrimaryKey(),
|
||||
guild_tributes_id
|
||||
)
|
||||
);
|
||||
|
||||
auto row = results.begin();
|
||||
if (results.RowCount() == 1) {
|
||||
GuildTributes e{};
|
||||
|
||||
e.guild_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
||||
e.tribute_id_1 = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
||||
e.tribute_id_1_tier = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
|
||||
e.tribute_id_2 = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
|
||||
e.tribute_id_2_tier = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
|
||||
e.time_remaining = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
|
||||
e.enabled = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
|
||||
|
||||
return e;
|
||||
}
|
||||
|
||||
return NewEntity();
|
||||
}
|
||||
|
||||
static int DeleteOne(
|
||||
Database& db,
|
||||
int guild_tributes_id
|
||||
)
|
||||
{
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"DELETE FROM {} WHERE {} = {}",
|
||||
TableName(),
|
||||
PrimaryKey(),
|
||||
guild_tributes_id
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() ? results.RowsAffected() : 0);
|
||||
}
|
||||
|
||||
static int UpdateOne(
|
||||
Database& db,
|
||||
const GuildTributes &e
|
||||
)
|
||||
{
|
||||
std::vector<std::string> v;
|
||||
|
||||
auto columns = Columns();
|
||||
|
||||
v.push_back(columns[0] + " = " + std::to_string(e.guild_id));
|
||||
v.push_back(columns[1] + " = " + std::to_string(e.tribute_id_1));
|
||||
v.push_back(columns[2] + " = " + std::to_string(e.tribute_id_1_tier));
|
||||
v.push_back(columns[3] + " = " + std::to_string(e.tribute_id_2));
|
||||
v.push_back(columns[4] + " = " + std::to_string(e.tribute_id_2_tier));
|
||||
v.push_back(columns[5] + " = " + std::to_string(e.time_remaining));
|
||||
v.push_back(columns[6] + " = " + std::to_string(e.enabled));
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"UPDATE {} SET {} WHERE {} = {}",
|
||||
TableName(),
|
||||
Strings::Implode(", ", v),
|
||||
PrimaryKey(),
|
||||
e.guild_id
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() ? results.RowsAffected() : 0);
|
||||
}
|
||||
|
||||
static GuildTributes InsertOne(
|
||||
Database& db,
|
||||
GuildTributes e
|
||||
)
|
||||
{
|
||||
std::vector<std::string> v;
|
||||
|
||||
v.push_back(std::to_string(e.guild_id));
|
||||
v.push_back(std::to_string(e.tribute_id_1));
|
||||
v.push_back(std::to_string(e.tribute_id_1_tier));
|
||||
v.push_back(std::to_string(e.tribute_id_2));
|
||||
v.push_back(std::to_string(e.tribute_id_2_tier));
|
||||
v.push_back(std::to_string(e.time_remaining));
|
||||
v.push_back(std::to_string(e.enabled));
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"{} VALUES ({})",
|
||||
BaseInsert(),
|
||||
Strings::Implode(",", v)
|
||||
)
|
||||
);
|
||||
|
||||
if (results.Success()) {
|
||||
e.guild_id = results.LastInsertedID();
|
||||
return e;
|
||||
}
|
||||
|
||||
e = NewEntity();
|
||||
|
||||
return e;
|
||||
}
|
||||
|
||||
static int InsertMany(
|
||||
Database& db,
|
||||
const std::vector<GuildTributes> &entries
|
||||
)
|
||||
{
|
||||
std::vector<std::string> insert_chunks;
|
||||
|
||||
for (auto &e: entries) {
|
||||
std::vector<std::string> v;
|
||||
|
||||
v.push_back(std::to_string(e.guild_id));
|
||||
v.push_back(std::to_string(e.tribute_id_1));
|
||||
v.push_back(std::to_string(e.tribute_id_1_tier));
|
||||
v.push_back(std::to_string(e.tribute_id_2));
|
||||
v.push_back(std::to_string(e.tribute_id_2_tier));
|
||||
v.push_back(std::to_string(e.time_remaining));
|
||||
v.push_back(std::to_string(e.enabled));
|
||||
|
||||
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
||||
}
|
||||
|
||||
std::vector<std::string> v;
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"{} VALUES {}",
|
||||
BaseInsert(),
|
||||
Strings::Implode(",", insert_chunks)
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() ? results.RowsAffected() : 0);
|
||||
}
|
||||
|
||||
static std::vector<GuildTributes> All(Database& db)
|
||||
{
|
||||
std::vector<GuildTributes> all_entries;
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"{}",
|
||||
BaseSelect()
|
||||
)
|
||||
);
|
||||
|
||||
all_entries.reserve(results.RowCount());
|
||||
|
||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||
GuildTributes e{};
|
||||
|
||||
e.guild_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
||||
e.tribute_id_1 = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
||||
e.tribute_id_1_tier = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
|
||||
e.tribute_id_2 = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
|
||||
e.tribute_id_2_tier = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
|
||||
e.time_remaining = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
|
||||
e.enabled = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
|
||||
|
||||
all_entries.push_back(e);
|
||||
}
|
||||
|
||||
return all_entries;
|
||||
}
|
||||
|
||||
static std::vector<GuildTributes> GetWhere(Database& db, const std::string &where_filter)
|
||||
{
|
||||
std::vector<GuildTributes> all_entries;
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"{} WHERE {}",
|
||||
BaseSelect(),
|
||||
where_filter
|
||||
)
|
||||
);
|
||||
|
||||
all_entries.reserve(results.RowCount());
|
||||
|
||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||
GuildTributes e{};
|
||||
|
||||
e.guild_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
||||
e.tribute_id_1 = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
||||
e.tribute_id_1_tier = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
|
||||
e.tribute_id_2 = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
|
||||
e.tribute_id_2_tier = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
|
||||
e.time_remaining = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
|
||||
e.enabled = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
|
||||
|
||||
all_entries.push_back(e);
|
||||
}
|
||||
|
||||
return all_entries;
|
||||
}
|
||||
|
||||
static int DeleteWhere(Database& db, const std::string &where_filter)
|
||||
{
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"DELETE FROM {} WHERE {}",
|
||||
TableName(),
|
||||
where_filter
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() ? results.RowsAffected() : 0);
|
||||
}
|
||||
|
||||
static int Truncate(Database& db)
|
||||
{
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"TRUNCATE TABLE {}",
|
||||
TableName()
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() ? results.RowsAffected() : 0);
|
||||
}
|
||||
|
||||
static int64 GetMaxId(Database& db)
|
||||
{
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"SELECT COALESCE(MAX({}), 0) FROM {}",
|
||||
PrimaryKey(),
|
||||
TableName()
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
||||
}
|
||||
|
||||
static int64 Count(Database& db, const std::string &where_filter = "")
|
||||
{
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"SELECT COUNT(*) FROM {} {}",
|
||||
TableName(),
|
||||
(where_filter.empty() ? "" : "WHERE " + where_filter)
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
||||
}
|
||||
|
||||
static std::string BaseReplace()
|
||||
{
|
||||
return fmt::format(
|
||||
"REPLACE INTO {} ({}) ",
|
||||
TableName(),
|
||||
ColumnsRaw()
|
||||
);
|
||||
}
|
||||
|
||||
static int ReplaceOne(
|
||||
Database& db,
|
||||
const GuildTributes &e
|
||||
)
|
||||
{
|
||||
std::vector<std::string> v;
|
||||
|
||||
v.push_back(std::to_string(e.guild_id));
|
||||
v.push_back(std::to_string(e.tribute_id_1));
|
||||
v.push_back(std::to_string(e.tribute_id_1_tier));
|
||||
v.push_back(std::to_string(e.tribute_id_2));
|
||||
v.push_back(std::to_string(e.tribute_id_2_tier));
|
||||
v.push_back(std::to_string(e.time_remaining));
|
||||
v.push_back(std::to_string(e.enabled));
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"{} VALUES ({})",
|
||||
BaseReplace(),
|
||||
Strings::Implode(",", v)
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() ? results.RowsAffected() : 0);
|
||||
}
|
||||
|
||||
static int ReplaceMany(
|
||||
Database& db,
|
||||
const std::vector<GuildTributes> &entries
|
||||
)
|
||||
{
|
||||
std::vector<std::string> insert_chunks;
|
||||
|
||||
for (auto &e: entries) {
|
||||
std::vector<std::string> v;
|
||||
|
||||
v.push_back(std::to_string(e.guild_id));
|
||||
v.push_back(std::to_string(e.tribute_id_1));
|
||||
v.push_back(std::to_string(e.tribute_id_1_tier));
|
||||
v.push_back(std::to_string(e.tribute_id_2));
|
||||
v.push_back(std::to_string(e.tribute_id_2_tier));
|
||||
v.push_back(std::to_string(e.time_remaining));
|
||||
v.push_back(std::to_string(e.enabled));
|
||||
|
||||
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
||||
}
|
||||
|
||||
std::vector<std::string> v;
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"{} VALUES {}",
|
||||
BaseReplace(),
|
||||
Strings::Implode(",", insert_chunks)
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() ? results.RowsAffected() : 0);
|
||||
}
|
||||
};
|
||||
|
||||
#endif //EQEMU_BASE_GUILD_TRIBUTES_REPOSITORY_H
|
||||
@@ -16,6 +16,7 @@
|
||||
#include "../../strings.h"
|
||||
#include <ctime>
|
||||
|
||||
|
||||
class BaseGuildsRepository {
|
||||
public:
|
||||
struct Guilds {
|
||||
|
||||
@@ -3,286 +3,47 @@
|
||||
|
||||
#include "../database.h"
|
||||
#include "../strings.h"
|
||||
#include "base/base_guild_bank_repository.h"
|
||||
|
||||
class GuildBankRepository {
|
||||
class GuildBankRepository: public BaseGuildBankRepository {
|
||||
public:
|
||||
struct GuildBank {
|
||||
int guildid;
|
||||
int8 area;
|
||||
int slot;
|
||||
int itemid;
|
||||
int qty;
|
||||
std::string donator;
|
||||
int8 permissions;
|
||||
std::string whofor;
|
||||
};
|
||||
|
||||
static std::string PrimaryKey()
|
||||
{
|
||||
return std::string("");
|
||||
}
|
||||
/**
|
||||
* This file was auto generated and can be modified and extended upon
|
||||
*
|
||||
* Base repository methods are automatically
|
||||
* generated in the "base" version of this repository. The base repository
|
||||
* is immutable and to be left untouched, while methods in this class
|
||||
* are used as extension methods for more specific persistence-layer
|
||||
* accessors or mutators.
|
||||
*
|
||||
* Base Methods (Subject to be expanded upon in time)
|
||||
*
|
||||
* Note: Not all tables are designed appropriately to fit functionality with all base methods
|
||||
*
|
||||
* InsertOne
|
||||
* UpdateOne
|
||||
* DeleteOne
|
||||
* FindOne
|
||||
* GetWhere(std::string where_filter)
|
||||
* DeleteWhere(std::string where_filter)
|
||||
* InsertMany
|
||||
* All
|
||||
*
|
||||
* Example custom methods in a repository
|
||||
*
|
||||
* GuildBankRepository::GetByZoneAndVersion(int zone_id, int zone_version)
|
||||
* GuildBankRepository::GetWhereNeverExpires()
|
||||
* GuildBankRepository::GetWhereXAndY()
|
||||
* GuildBankRepository::DeleteWhereXAndY()
|
||||
*
|
||||
* Most of the above could be covered by base methods, but if you as a developer
|
||||
* find yourself re-using logic for other parts of the code, its best to just make a
|
||||
* method that can be re-used easily elsewhere especially if it can use a base repository
|
||||
* method and encapsulate filters there
|
||||
*/
|
||||
|
||||
static std::vector<std::string> Columns()
|
||||
{
|
||||
return {
|
||||
"guildid",
|
||||
"area",
|
||||
"slot",
|
||||
"itemid",
|
||||
"qty",
|
||||
"donator",
|
||||
"permissions",
|
||||
"whofor",
|
||||
};
|
||||
}
|
||||
|
||||
static std::string ColumnsRaw()
|
||||
{
|
||||
return std::string(Strings::Implode(", ", Columns()));
|
||||
}
|
||||
|
||||
static std::string InsertColumnsRaw()
|
||||
{
|
||||
std::vector<std::string> insert_columns;
|
||||
|
||||
for (auto &column : Columns()) {
|
||||
if (column == PrimaryKey()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
insert_columns.push_back(column);
|
||||
}
|
||||
|
||||
return std::string(Strings::Implode(", ", insert_columns));
|
||||
}
|
||||
|
||||
static std::string TableName()
|
||||
{
|
||||
return std::string("guild_bank");
|
||||
}
|
||||
|
||||
static std::string BaseSelect()
|
||||
{
|
||||
return fmt::format(
|
||||
"SELECT {} FROM {}",
|
||||
ColumnsRaw(),
|
||||
TableName()
|
||||
);
|
||||
}
|
||||
|
||||
static std::string BaseInsert()
|
||||
{
|
||||
return fmt::format(
|
||||
"INSERT INTO {} ({}) ",
|
||||
TableName(),
|
||||
InsertColumnsRaw()
|
||||
);
|
||||
}
|
||||
|
||||
static GuildBank NewEntity()
|
||||
{
|
||||
GuildBank entry{};
|
||||
|
||||
entry.guildid = 0;
|
||||
entry.area = 0;
|
||||
entry.slot = 0;
|
||||
entry.itemid = 0;
|
||||
entry.qty = 0;
|
||||
entry.donator = 0;
|
||||
entry.permissions = 0;
|
||||
entry.whofor = 0;
|
||||
|
||||
return entry;
|
||||
}
|
||||
|
||||
static GuildBank GetGuildBankEntry(
|
||||
const std::vector<GuildBank> &guild_banks,
|
||||
int guild_bank_id
|
||||
)
|
||||
{
|
||||
for (auto &guild_bank : guild_banks) {
|
||||
if (guild_bank. == guild_bank_id) {
|
||||
return guild_bank;
|
||||
}
|
||||
}
|
||||
|
||||
return NewEntity();
|
||||
}
|
||||
|
||||
static GuildBank FindOne(
|
||||
int guild_bank_id
|
||||
)
|
||||
{
|
||||
auto results = database.QueryDatabase(
|
||||
fmt::format(
|
||||
"{} WHERE id = {} LIMIT 1",
|
||||
BaseSelect(),
|
||||
guild_bank_id
|
||||
)
|
||||
);
|
||||
|
||||
auto row = results.begin();
|
||||
if (results.RowCount() == 1) {
|
||||
GuildBank entry{};
|
||||
|
||||
entry.guildid = atoi(row[0]);
|
||||
entry.area = atoi(row[1]);
|
||||
entry.slot = atoi(row[2]);
|
||||
entry.itemid = atoi(row[3]);
|
||||
entry.qty = atoi(row[4]);
|
||||
entry.donator = row[5];
|
||||
entry.permissions = atoi(row[6]);
|
||||
entry.whofor = row[7];
|
||||
|
||||
return entry;
|
||||
}
|
||||
|
||||
return NewEntity();
|
||||
}
|
||||
|
||||
static int DeleteOne(
|
||||
int guild_bank_id
|
||||
)
|
||||
{
|
||||
auto results = database.QueryDatabase(
|
||||
fmt::format(
|
||||
"DELETE FROM {} WHERE {} = {}",
|
||||
TableName(),
|
||||
PrimaryKey(),
|
||||
guild_bank_id
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() ? results.RowsAffected() : 0);
|
||||
}
|
||||
|
||||
static int UpdateOne(
|
||||
GuildBank guild_bank_entry
|
||||
)
|
||||
{
|
||||
std::vector<std::string> update_values;
|
||||
|
||||
auto columns = Columns();
|
||||
|
||||
update_values.push_back(columns[0] + " = " + std::to_string(guild_bank_entry.guildid));
|
||||
update_values.push_back(columns[1] + " = " + std::to_string(guild_bank_entry.area));
|
||||
update_values.push_back(columns[2] + " = " + std::to_string(guild_bank_entry.slot));
|
||||
update_values.push_back(columns[3] + " = " + std::to_string(guild_bank_entry.itemid));
|
||||
update_values.push_back(columns[4] + " = " + std::to_string(guild_bank_entry.qty));
|
||||
update_values.push_back(columns[5] + " = '" + Strings::Escape(guild_bank_entry.donator) + "'");
|
||||
update_values.push_back(columns[6] + " = " + std::to_string(guild_bank_entry.permissions));
|
||||
update_values.push_back(columns[7] + " = '" + Strings::Escape(guild_bank_entry.whofor) + "'");
|
||||
|
||||
auto results = database.QueryDatabase(
|
||||
fmt::format(
|
||||
"UPDATE {} SET {} WHERE {} = {}",
|
||||
TableName(),
|
||||
Strings::Implode(", ", update_values),
|
||||
PrimaryKey(),
|
||||
guild_bank_entry.
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() ? results.RowsAffected() : 0);
|
||||
}
|
||||
|
||||
static GuildBank InsertOne(
|
||||
GuildBank guild_bank_entry
|
||||
)
|
||||
{
|
||||
std::vector<std::string> insert_values;
|
||||
|
||||
insert_values.push_back(std::to_string(guild_bank_entry.guildid));
|
||||
insert_values.push_back(std::to_string(guild_bank_entry.area));
|
||||
insert_values.push_back(std::to_string(guild_bank_entry.slot));
|
||||
insert_values.push_back(std::to_string(guild_bank_entry.itemid));
|
||||
insert_values.push_back(std::to_string(guild_bank_entry.qty));
|
||||
insert_values.push_back("'" + Strings::Escape(guild_bank_entry.donator) + "'");
|
||||
insert_values.push_back(std::to_string(guild_bank_entry.permissions));
|
||||
insert_values.push_back("'" + Strings::Escape(guild_bank_entry.whofor) + "'");
|
||||
|
||||
auto results = database.QueryDatabase(
|
||||
fmt::format(
|
||||
"{} VALUES ({})",
|
||||
BaseInsert(),
|
||||
Strings::Implode(",", insert_values)
|
||||
)
|
||||
);
|
||||
|
||||
if (results.Success()) {
|
||||
guild_bank_entry.id = results.LastInsertedID();
|
||||
return guild_bank_entry;
|
||||
}
|
||||
|
||||
guild_bank_entry = InstanceListRepository::NewEntity();
|
||||
|
||||
return guild_bank_entry;
|
||||
}
|
||||
|
||||
static int InsertMany(
|
||||
std::vector<GuildBank> guild_bank_entries
|
||||
)
|
||||
{
|
||||
std::vector<std::string> insert_chunks;
|
||||
|
||||
for (auto &guild_bank_entry: guild_bank_entries) {
|
||||
std::vector<std::string> insert_values;
|
||||
|
||||
insert_values.push_back(std::to_string(guild_bank_entry.guildid));
|
||||
insert_values.push_back(std::to_string(guild_bank_entry.area));
|
||||
insert_values.push_back(std::to_string(guild_bank_entry.slot));
|
||||
insert_values.push_back(std::to_string(guild_bank_entry.itemid));
|
||||
insert_values.push_back(std::to_string(guild_bank_entry.qty));
|
||||
insert_values.push_back("'" + Strings::Escape(guild_bank_entry.donator) + "'");
|
||||
insert_values.push_back(std::to_string(guild_bank_entry.permissions));
|
||||
insert_values.push_back("'" + Strings::Escape(guild_bank_entry.whofor) + "'");
|
||||
|
||||
insert_chunks.push_back("(" + Strings::Implode(",", insert_values) + ")");
|
||||
}
|
||||
|
||||
std::vector<std::string> insert_values;
|
||||
|
||||
auto results = database.QueryDatabase(
|
||||
fmt::format(
|
||||
"{} VALUES {}",
|
||||
BaseInsert(),
|
||||
Strings::Implode(",", insert_chunks)
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() ? results.RowsAffected() : 0);
|
||||
}
|
||||
|
||||
static std::vector<GuildBank> All()
|
||||
{
|
||||
std::vector<GuildBank> all_entries;
|
||||
|
||||
auto results = database.QueryDatabase(
|
||||
fmt::format(
|
||||
"{}",
|
||||
BaseSelect()
|
||||
)
|
||||
);
|
||||
|
||||
all_entries.reserve(results.RowCount());
|
||||
|
||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||
GuildBank entry{};
|
||||
|
||||
entry.guildid = atoi(row[0]);
|
||||
entry.area = atoi(row[1]);
|
||||
entry.slot = atoi(row[2]);
|
||||
entry.itemid = atoi(row[3]);
|
||||
entry.qty = atoi(row[4]);
|
||||
entry.donator = row[5];
|
||||
entry.permissions = atoi(row[6]);
|
||||
entry.whofor = row[7];
|
||||
|
||||
all_entries.push_back(entry);
|
||||
}
|
||||
|
||||
return all_entries;
|
||||
}
|
||||
// Custom extended repository methods here
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,194 @@
|
||||
#ifndef EQEMU_GUILD_MEMBERS_REPOSITORY_H
|
||||
#define EQEMU_GUILD_MEMBERS_REPOSITORY_H
|
||||
|
||||
#include "../database.h"
|
||||
#include "../strings.h"
|
||||
#include "base/base_guild_members_repository.h"
|
||||
|
||||
class GuildMembersRepository : public BaseGuildMembersRepository {
|
||||
public:
|
||||
|
||||
struct GuildMembersWithTributeOnStruct {
|
||||
int32_t char_id;
|
||||
uint32_t guild_id;
|
||||
uint8_t tribute_enable;
|
||||
std::string char_name;
|
||||
uint32_t char_level;
|
||||
};
|
||||
|
||||
struct GuildMembershipStatsStruct {
|
||||
uint32 leaders;
|
||||
uint32 senior_officers;
|
||||
uint32 officers;
|
||||
uint32 senior_members;
|
||||
uint32 members;
|
||||
uint32 junior_members;
|
||||
uint32 initates;
|
||||
uint32 recruits;
|
||||
uint32 tribute_enabled;
|
||||
};
|
||||
|
||||
static int UpdateMemberRank(Database &db, uint32 char_id, uint32 rank_id)
|
||||
{
|
||||
const auto guild_members = GetWhere(db, fmt::format("char_id = '{}'", char_id));
|
||||
if (guild_members.empty()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
auto m = guild_members[0];
|
||||
m.rank_ = rank_id;
|
||||
|
||||
return UpdateOne(db, m);
|
||||
}
|
||||
|
||||
static int UpdateEnabled(Database &db, uint32 guild_id, uint32 char_id, uint32 enabled)
|
||||
{
|
||||
const auto guild_members = GetWhere(db, fmt::format("char_id = '{}' AND guild_id = '{}'", char_id, guild_id));
|
||||
if (guild_members.empty()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
auto m = guild_members[0];
|
||||
m.tribute_enable = enabled ? 1 : 0;
|
||||
|
||||
return UpdateOne(db, m);
|
||||
}
|
||||
|
||||
static std::vector<GuildMembersWithTributeOnStruct> GetMembersWithTributeOn(Database &db, uint32 guild_id)
|
||||
{
|
||||
std::vector<GuildMembersWithTributeOnStruct> all_entries;
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"SELECT gm.char_id, gm.guild_id, gm.tribute_enable, cd.`name`, cd.`level`, cd.deleted_at "
|
||||
"FROM guild_members gm JOIN character_data cd ON cd.id = gm.char_id "
|
||||
"WHERE ISNULL(cd.deleted_at) AND gm.tribute_enable = 1 AND gm.guild_id = '{}';",
|
||||
guild_id
|
||||
)
|
||||
);
|
||||
|
||||
all_entries.reserve(results.RowCount());
|
||||
|
||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||
GuildMembersWithTributeOnStruct e{};
|
||||
|
||||
e.char_id = static_cast<int32_t>(atoi(row[0]));
|
||||
e.guild_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
||||
e.tribute_enable = static_cast<uint8_t>(strtoul(row[2], nullptr, 10));
|
||||
e.char_name = row[3] ? row[3] : "";
|
||||
e.char_level = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
|
||||
|
||||
all_entries.push_back(e);
|
||||
}
|
||||
|
||||
return all_entries;
|
||||
}
|
||||
|
||||
static int UpdateFavor(Database &db, uint32 guild_id, uint32 char_id, uint32 favor)
|
||||
{
|
||||
const auto guild_members = GetWhere(db, fmt::format("char_id = '{}' AND guild_id = '{}'", char_id, guild_id));
|
||||
if (guild_members.empty()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
auto m = guild_members[0];
|
||||
m.total_tribute = favor;
|
||||
m.last_tribute = time(nullptr);
|
||||
|
||||
return UpdateOne(db, m);
|
||||
}
|
||||
|
||||
static int UpdateOnline(Database &db, uint32 char_id, bool status)
|
||||
{
|
||||
const auto guild_members = GetWhere(db, fmt::format("char_id = '{}'", char_id));
|
||||
if (guild_members.empty()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
auto m = guild_members[0];
|
||||
m.online = status ? 1 : 0;
|
||||
|
||||
return UpdateOne(db, m);
|
||||
}
|
||||
|
||||
static int UpdateNote(Database &db, uint32 char_id, std::string &public_note)
|
||||
{
|
||||
const auto guild_members = GetWhere(db, fmt::format("char_id = '{}'", char_id));
|
||||
if (guild_members.empty()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
auto m = guild_members[0];
|
||||
m.public_note = public_note;
|
||||
|
||||
return UpdateOne(db, m);
|
||||
}
|
||||
|
||||
static GuildMembershipStatsStruct GetGuildMembershipStats(Database &db, uint32 guild_id)
|
||||
{
|
||||
std::string query = fmt::format(
|
||||
"SELECT "
|
||||
"SUM(CASE WHEN gm.`rank` = 1 THEN 1 ELSE 0 END) AS RANK1, "
|
||||
"SUM(CASE WHEN gm.`rank` = 2 THEN 1 ELSE 0 END) AS RANK2, "
|
||||
"SUM(CASE WHEN gm.`rank` = 3 THEN 1 ELSE 0 END) AS RANK3, "
|
||||
"SUM(CASE WHEN gm.`rank` = 4 THEN 1 ELSE 0 END) AS RANK4, "
|
||||
"SUM(CASE WHEN gm.`rank` = 5 THEN 1 ELSE 0 END) AS RANK5, "
|
||||
"SUM(CASE WHEN gm.`rank` = 6 THEN 1 ELSE 0 END) AS RANK6, "
|
||||
"SUM(CASE WHEN gm.`rank` = 7 THEN 1 ELSE 0 END) AS RANK7, "
|
||||
"SUM(CASE WHEN gm.`rank` = 8 THEN 1 ELSE 0 END) AS RANK8, "
|
||||
"SUM(CASE WHEN gm.tribute_enable = 1 THEN 1 ELSE 0 END) AS TRIBUTE "
|
||||
"FROM guild_members gm "
|
||||
"WHERE gm.guild_id = '{}';",
|
||||
guild_id
|
||||
);
|
||||
|
||||
GuildMembershipStatsStruct gmss{};
|
||||
|
||||
auto results = db.QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
return gmss;
|
||||
}
|
||||
|
||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||
|
||||
gmss.leaders = static_cast<uint32_t>(Strings::ToUnsignedInt(row[0]));
|
||||
gmss.senior_officers = static_cast<uint32_t>(Strings::ToUnsignedInt(row[1]));
|
||||
gmss.officers = static_cast<uint32_t>(Strings::ToUnsignedInt(row[2]));
|
||||
gmss.senior_members = static_cast<uint32_t>(Strings::ToUnsignedInt(row[3]));
|
||||
gmss.members = static_cast<uint32_t>(Strings::ToUnsignedInt(row[4]));
|
||||
gmss.junior_members = static_cast<uint32_t>(Strings::ToUnsignedInt(row[5]));
|
||||
gmss.initates = static_cast<uint32_t>(Strings::ToUnsignedInt(row[6]));
|
||||
gmss.recruits = static_cast<uint32_t>(Strings::ToUnsignedInt(row[7]));
|
||||
gmss.tribute_enabled = static_cast<uint32_t>(Strings::ToUnsignedInt(row[8]));
|
||||
}
|
||||
|
||||
return gmss;
|
||||
}
|
||||
|
||||
static int UpdateBankerFlag(Database &db, uint32 char_id, bool status)
|
||||
{
|
||||
const auto guild_members = GetWhere(db, fmt::format("char_id = {}", char_id));
|
||||
if (guild_members.empty()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
auto m = guild_members[0];
|
||||
m.banker = status ? 1 : 0;
|
||||
|
||||
return UpdateOne(db, m);
|
||||
}
|
||||
|
||||
static int UpdateAltFlag(Database &db, uint32 char_id, bool status)
|
||||
{
|
||||
const auto guild_members = GetWhere(db, fmt::format("char_id = {}", char_id));
|
||||
if (guild_members.empty()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
auto m = guild_members[0];
|
||||
m.alt = status ? 1 : 0;
|
||||
|
||||
return UpdateOne(db, m);
|
||||
}
|
||||
};
|
||||
#endif //EQEMU_GUILD_MEMBERS_REPOSITORY_H
|
||||
@@ -0,0 +1,50 @@
|
||||
#ifndef EQEMU_GUILD_PERMISSIONS_REPOSITORY_H
|
||||
#define EQEMU_GUILD_PERMISSIONS_REPOSITORY_H
|
||||
|
||||
#include "../database.h"
|
||||
#include "../strings.h"
|
||||
#include "base/base_guild_permissions_repository.h"
|
||||
|
||||
class GuildPermissionsRepository: public BaseGuildPermissionsRepository {
|
||||
public:
|
||||
|
||||
/**
|
||||
* This file was auto generated and can be modified and extended upon
|
||||
*
|
||||
* Base repository methods are automatically
|
||||
* generated in the "base" version of this repository. The base repository
|
||||
* is immutable and to be left untouched, while methods in this class
|
||||
* are used as extension methods for more specific persistence-layer
|
||||
* accessors or mutators.
|
||||
*
|
||||
* Base Methods (Subject to be expanded upon in time)
|
||||
*
|
||||
* Note: Not all tables are designed appropriately to fit functionality with all base methods
|
||||
*
|
||||
* InsertOne
|
||||
* UpdateOne
|
||||
* DeleteOne
|
||||
* FindOne
|
||||
* GetWhere(std::string where_filter)
|
||||
* DeleteWhere(std::string where_filter)
|
||||
* InsertMany
|
||||
* All
|
||||
*
|
||||
* Example custom methods in a repository
|
||||
*
|
||||
* GuildPermissionsRepository::GetByZoneAndVersion(int zone_id, int zone_version)
|
||||
* GuildPermissionsRepository::GetWhereNeverExpires()
|
||||
* GuildPermissionsRepository::GetWhereXAndY()
|
||||
* GuildPermissionsRepository::DeleteWhereXAndY()
|
||||
*
|
||||
* Most of the above could be covered by base methods, but if you as a developer
|
||||
* find yourself re-using logic for other parts of the code, its best to just make a
|
||||
* method that can be re-used easily elsewhere especially if it can use a base repository
|
||||
* method and encapsulate filters there
|
||||
*/
|
||||
|
||||
// Custom extended repository methods here
|
||||
|
||||
};
|
||||
|
||||
#endif //EQEMU_GUILD_PERMISSIONS_REPOSITORY_H
|
||||
@@ -45,6 +45,21 @@ public:
|
||||
|
||||
// Custom extended repository methods here
|
||||
|
||||
static int UpdateTitle(Database &db, uint32 guild_id, uint32 rank, std::string title)
|
||||
{
|
||||
auto guild_rank = GetWhere(db, fmt::format("guild_id = '{}' AND rank = '{}'", guild_id, rank));
|
||||
if (guild_rank.empty()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
auto r = guild_rank[0];
|
||||
r.title = title;
|
||||
|
||||
DeleteWhere(db, fmt::format("guild_id = '{}' AND rank = '{}'", guild_id, rank));
|
||||
InsertOne(db, r);
|
||||
|
||||
return 1;
|
||||
}
|
||||
};
|
||||
|
||||
#endif //EQEMU_GUILD_RANKS_REPOSITORY_H
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
#ifndef EQEMU_GUILD_TRIBUTES_REPOSITORY_H
|
||||
#define EQEMU_GUILD_TRIBUTES_REPOSITORY_H
|
||||
|
||||
#include "../database.h"
|
||||
#include "../strings.h"
|
||||
#include "base/base_guild_tributes_repository.h"
|
||||
|
||||
class GuildTributesRepository: public BaseGuildTributesRepository {
|
||||
public:
|
||||
|
||||
/**
|
||||
* This file was auto generated and can be modified and extended upon
|
||||
*
|
||||
* Base repository methods are automatically
|
||||
* generated in the "base" version of this repository. The base repository
|
||||
* is immutable and to be left untouched, while methods in this class
|
||||
* are used as extension methods for more specific persistence-layer
|
||||
* accessors or mutators.
|
||||
*
|
||||
* Base Methods (Subject to be expanded upon in time)
|
||||
*
|
||||
* Note: Not all tables are designed appropriately to fit functionality with all base methods
|
||||
*
|
||||
* InsertOne
|
||||
* UpdateOne
|
||||
* DeleteOne
|
||||
* FindOne
|
||||
* GetWhere(std::string where_filter)
|
||||
* DeleteWhere(std::string where_filter)
|
||||
* InsertMany
|
||||
* All
|
||||
*
|
||||
* Example custom methods in a repository
|
||||
*
|
||||
* GuildTributesRepository::GetByZoneAndVersion(int zone_id, int zone_version)
|
||||
* GuildTributesRepository::GetWhereNeverExpires()
|
||||
* GuildTributesRepository::GetWhereXAndY()
|
||||
* GuildTributesRepository::DeleteWhereXAndY()
|
||||
*
|
||||
* Most of the above could be covered by base methods, but if you as a developer
|
||||
* find yourself re-using logic for other parts of the code, its best to just make a
|
||||
* method that can be re-used easily elsewhere especially if it can use a base repository
|
||||
* method and encapsulate filters there
|
||||
*/
|
||||
|
||||
// Custom extended repository methods here
|
||||
static int UpdateEnabled(Database& db, uint32 guild_id, uint32 enabled)
|
||||
{
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"UPDATE {} SET `enabled` = '{}' WHERE `guild_id` = {}",
|
||||
TableName(),
|
||||
enabled,
|
||||
guild_id
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() ? results.RowsAffected() : 0);
|
||||
}
|
||||
|
||||
static int UpdateTimeRemaining(Database& db, uint32 guild_id, uint32 time_remaining)
|
||||
{
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
"UPDATE {} SET `time_remaining` = '{}' WHERE `guild_id` = {}",
|
||||
TableName(),
|
||||
time_remaining,
|
||||
guild_id
|
||||
)
|
||||
);
|
||||
|
||||
return (results.Success() ? results.RowsAffected() : 0);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif //EQEMU_GUILD_TRIBUTES_REPOSITORY_H
|
||||
@@ -5,46 +5,58 @@
|
||||
#include "../strings.h"
|
||||
#include "base/base_guilds_repository.h"
|
||||
|
||||
class GuildsRepository: public BaseGuildsRepository {
|
||||
class GuildsRepository : public BaseGuildsRepository {
|
||||
public:
|
||||
|
||||
/**
|
||||
* This file was auto generated and can be modified and extended upon
|
||||
*
|
||||
* Base repository methods are automatically
|
||||
* generated in the "base" version of this repository. The base repository
|
||||
* is immutable and to be left untouched, while methods in this class
|
||||
* are used as extension methods for more specific persistence-layer
|
||||
* accessors or mutators.
|
||||
*
|
||||
* Base Methods (Subject to be expanded upon in time)
|
||||
*
|
||||
* Note: Not all tables are designed appropriately to fit functionality with all base methods
|
||||
*
|
||||
* InsertOne
|
||||
* UpdateOne
|
||||
* DeleteOne
|
||||
* FindOne
|
||||
* GetWhere(std::string where_filter)
|
||||
* DeleteWhere(std::string where_filter)
|
||||
* InsertMany
|
||||
* All
|
||||
*
|
||||
* Example custom methods in a repository
|
||||
*
|
||||
* GuildsRepository::GetByZoneAndVersion(int zone_id, int zone_version)
|
||||
* GuildsRepository::GetWhereNeverExpires()
|
||||
* GuildsRepository::GetWhereXAndY()
|
||||
* GuildsRepository::DeleteWhereXAndY()
|
||||
*
|
||||
* Most of the above could be covered by base methods, but if you as a developer
|
||||
* find yourself re-using logic for other parts of the code, its best to just make a
|
||||
* method that can be re-used easily elsewhere especially if it can use a base repository
|
||||
* method and encapsulate filters there
|
||||
*/
|
||||
/**
|
||||
* This file was auto generated and can be modified and extended upon
|
||||
*
|
||||
* Base repository methods are automatically
|
||||
* generated in the "base" version of this repository. The base repository
|
||||
* is immutable and to be left untouched, while methods in this class
|
||||
* are used as extension methods for more specific persistence-layer
|
||||
* accessors or mutators.
|
||||
*
|
||||
* Base Methods (Subject to be expanded upon in time)
|
||||
*
|
||||
* Note: Not all tables are designed appropriately to fit functionality with all base methods
|
||||
*
|
||||
* InsertOne
|
||||
* UpdateOne
|
||||
* DeleteOne
|
||||
* FindOne
|
||||
* GetWhere(std::string where_filter)
|
||||
* DeleteWhere(std::string where_filter)
|
||||
* InsertMany
|
||||
* All
|
||||
*
|
||||
* Example custom methods in a repository
|
||||
*
|
||||
* GuildsRepository::GetByZoneAndVersion(int zone_id, int zone_version)
|
||||
* GuildsRepository::GetWhereNeverExpires()
|
||||
* GuildsRepository::GetWhereXAndY()
|
||||
* GuildsRepository::DeleteWhereXAndY()
|
||||
*
|
||||
* Most of the above could be covered by base methods, but if you as a developer
|
||||
* find yourself re-using logic for other parts of the code, its best to just make a
|
||||
* method that can be re-used easily elsewhere especially if it can use a base repository
|
||||
* method and encapsulate filters there
|
||||
*/
|
||||
|
||||
// Custom extended repository methods here
|
||||
// Custom extended repository methods here
|
||||
|
||||
static int UpdateFavor(Database &db, uint32 guild_id, uint32 favor)
|
||||
{
|
||||
auto const guild = GetWhere(db, fmt::format("id = '{}'", guild_id));
|
||||
if (guild.empty()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
auto g = guild[0];
|
||||
g.favor = favor;
|
||||
|
||||
return UpdateOne(db, g);
|
||||
}
|
||||
};
|
||||
|
||||
#endif //EQEMU_GUILDS_REPOSITORY_H
|
||||
|
||||
@@ -245,6 +245,10 @@ RULE_INT(Guild, PlayerCreationLimit, 1, "Only allow use of the UF+ window if the
|
||||
RULE_INT(Guild, PlayerCreationRequiredStatus, 0, "Required status to create a guild")
|
||||
RULE_INT(Guild, PlayerCreationRequiredLevel, 0, "Required level of the player attempting to create the guild")
|
||||
RULE_INT(Guild, PlayerCreationRequiredTime, 0, "Time needed online on the account to create a guild (in minutes)")
|
||||
RULE_INT(Guild, TributeTime, 600000, "Time in ms for guild tributes. Default is 10 mins.")
|
||||
RULE_INT(Guild, TributeTimeRefreshInterval, 180000, "Time in ms to send all guild members a Tribute Time refresh. Default is 3 mins.")
|
||||
RULE_INT(Guild, TributePlatConversionRate, 10, "The conversion rate of platinum donations. Default is 10 guild favor to 1 platinum.")
|
||||
RULE_BOOL(Guild, UseCharacterMaxLevelForGuildTributes, true, "Guild Tributes will adhere to Character:MaxLevel. Default is true.")
|
||||
RULE_CATEGORY_END()
|
||||
|
||||
RULE_CATEGORY(Skills)
|
||||
|
||||
+86
-10
@@ -5,6 +5,7 @@
|
||||
#include "../common/packet_functions.h"
|
||||
#include "../common/eq_packet_structs.h"
|
||||
#include "../common/net/packet.h"
|
||||
#include "../common/guilds.h"
|
||||
#include <cereal/cereal.hpp>
|
||||
#include <cereal/archives/binary.hpp>
|
||||
#include <cereal/types/chrono.hpp>
|
||||
@@ -94,6 +95,23 @@
|
||||
#define ServerOP_WebInterfaceEvent 0x0066
|
||||
#define ServerOP_WebInterfaceSubscribe 0x0067
|
||||
#define ServerOP_WebInterfaceUnsubscribe 0x0068
|
||||
#define ServerOP_GuildPermissionUpdate 0x0069
|
||||
#define ServerOP_GuildTributeUpdate 0x0070
|
||||
#define ServerOP_GuildRankNameChange 0x0071
|
||||
#define ServerOP_GuildTributeActivate 0x0072
|
||||
#define ServerOP_GuildTributeOptInToggle 0x0073
|
||||
#define ServerOP_GuildTributeFavAndTimer 0x0074
|
||||
#define ServerOP_RequestGuildActiveTributes 0x0075
|
||||
#define ServerOP_RequestGuildFavorAndTimer 0x0076
|
||||
#define ServerOP_GuildTributeUpdateDonations 0x0077
|
||||
#define ServerOP_GuildMemberLevelUpdate 0x0078
|
||||
#define ServerOP_GuildMemberPublicNote 0x0079
|
||||
#define ServerOP_GuildMemberRemove 0x007A
|
||||
#define ServerOP_GuildMemberAdd 0x007B
|
||||
#define ServerOP_GuildChannel 0x007C
|
||||
#define ServerOP_GuildURL 0x007D
|
||||
#define ServerOP_GuildSendGuildList 0x007E
|
||||
#define ServerOP_GuildMembersList 0x007F
|
||||
|
||||
#define ServerOP_RaidAdd 0x0100 //in use
|
||||
#define ServerOP_RaidRemove 0x0101 //in use
|
||||
@@ -567,6 +585,8 @@ struct ServerClientList_Struct {
|
||||
uint8 anon;
|
||||
bool tellsoff;
|
||||
uint32 guild_id;
|
||||
uint32 guild_rank;
|
||||
bool guild_tribute_opt_in;
|
||||
bool LFG;
|
||||
uint8 gm;
|
||||
uint8 ClientVersion;
|
||||
@@ -1006,19 +1026,34 @@ struct ServerGuildCharRefresh_Struct {
|
||||
uint32 char_id;
|
||||
};
|
||||
|
||||
struct ServerGuildRankUpdate_Struct
|
||||
{
|
||||
uint32 GuildID;
|
||||
char MemberName[64];
|
||||
uint32 Rank;
|
||||
uint32 Banker;
|
||||
struct ServerGuildRankUpdate_Struct {
|
||||
uint32 guild_id;
|
||||
char member_name[64];
|
||||
uint32 rank;
|
||||
uint32 banker;
|
||||
uint32 alt;
|
||||
bool no_update;
|
||||
};
|
||||
|
||||
struct ServerGuildMemberUpdate_Struct {
|
||||
uint32 GuildID;
|
||||
char MemberName[64];
|
||||
uint32 ZoneID;
|
||||
uint32 LastSeen;
|
||||
uint32 guild_id;
|
||||
char member_name[64];
|
||||
uint32 zone_id;
|
||||
uint32 last_seen;
|
||||
};
|
||||
|
||||
struct ServerGuildPermissionUpdate_Struct {
|
||||
uint32 guild_id;
|
||||
char member_name[64];
|
||||
uint32 rank;
|
||||
uint32 function_id;
|
||||
uint32 function_value;
|
||||
};
|
||||
|
||||
struct ServerGuildRankNameChange {
|
||||
uint32 guild_id;
|
||||
uint32 rank;
|
||||
char rank_name[51]; //RoF2 has 51 max.
|
||||
};
|
||||
|
||||
struct SpawnPlayerCorpse_Struct {
|
||||
@@ -1857,6 +1892,47 @@ struct ServerZoneStatus_Struct {
|
||||
int16 admin;
|
||||
};
|
||||
|
||||
struct GuildTributeUpdate {
|
||||
uint32 guild_id;
|
||||
uint32 tribute_id_1;
|
||||
uint32 tribute_id_2;
|
||||
uint32 tribute_id_1_tier;
|
||||
uint32 tribute_id_2_tier;
|
||||
uint32 enabled;
|
||||
uint32 favor;
|
||||
uint32 time_remaining;
|
||||
uint32 member_favor;
|
||||
uint32 member_time;
|
||||
uint32 member_enabled;
|
||||
char player_name[64];
|
||||
};
|
||||
|
||||
struct GuildTributeMemberToggle {
|
||||
uint32 guild_id;
|
||||
uint32 char_id;
|
||||
char player_name[64];
|
||||
uint32 tribute_toggle;
|
||||
uint32 command;
|
||||
uint32 time_remaining;
|
||||
uint32 no_donations;
|
||||
uint32 member_last_donated;
|
||||
};
|
||||
|
||||
struct ServerOP_GuildMessage_Struct {
|
||||
uint32 guild_id{GUILD_NONE};
|
||||
char player_name[64]{0};
|
||||
uint32 player_level{0};
|
||||
uint32 player_class{0};
|
||||
uint32 player_rank{GUILD_RANK_NONE};
|
||||
uint32 player_zone_id{0};
|
||||
bool player_offline{false};
|
||||
char player_new_name[64]{0};
|
||||
char new_guild_name[64]{0};
|
||||
char note[256]{0};
|
||||
char channel[2048]{0};
|
||||
char url[2048]{0};
|
||||
};
|
||||
|
||||
#pragma pack()
|
||||
|
||||
#endif
|
||||
|
||||
+1
-2
@@ -42,8 +42,7 @@
|
||||
* Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt
|
||||
*/
|
||||
|
||||
#define CURRENT_BINARY_DATABASE_VERSION 9259
|
||||
|
||||
#define CURRENT_BINARY_DATABASE_VERSION 9260
|
||||
#define CURRENT_BINARY_BOTS_DATABASE_VERSION 9042
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user