mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-13 06:21:28 +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:
parent
dacebca9dd
commit
91f5932c6d
@ -222,6 +222,9 @@ SET(repositories
|
|||||||
repositories/base/base_group_leaders_repository.h
|
repositories/base/base_group_leaders_repository.h
|
||||||
repositories/base/base_guilds_repository.h
|
repositories/base/base_guilds_repository.h
|
||||||
repositories/base/base_guild_ranks_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_guild_relations_repository.h
|
||||||
repositories/base/base_horses_repository.h
|
repositories/base/base_horses_repository.h
|
||||||
repositories/base/base_instance_list_repository.h
|
repositories/base/base_instance_list_repository.h
|
||||||
@ -399,6 +402,9 @@ SET(repositories
|
|||||||
repositories/group_leaders_repository.h
|
repositories/group_leaders_repository.h
|
||||||
repositories/guilds_repository.h
|
repositories/guilds_repository.h
|
||||||
repositories/guild_ranks_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/guild_relations_repository.h
|
||||||
repositories/horses_repository.h
|
repositories/horses_repository.h
|
||||||
repositories/instance_list_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_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`;
|
ADD COLUMN `marked_npc_3_instance_id` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `marked_npc_3_zone_id`;
|
||||||
)"
|
)"
|
||||||
},
|
},
|
||||||
ManifestEntry{
|
ManifestEntry{
|
||||||
.version = 9235,
|
.version = 9235,
|
||||||
.description = "2023_07_31_character_stats_record.sql",
|
.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 `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`;
|
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
|
// -- template; copy/paste this when you need to create a new entry
|
||||||
// ManifestEntry{
|
// ManifestEntry{
|
||||||
// .version = 9228,
|
// .version = 9228,
|
||||||
|
|||||||
@ -148,6 +148,7 @@ namespace DatabaseSchema {
|
|||||||
"guild_members",
|
"guild_members",
|
||||||
"guild_ranks",
|
"guild_ranks",
|
||||||
"guild_relations",
|
"guild_relations",
|
||||||
|
"guild_tributes",
|
||||||
"guilds",
|
"guilds",
|
||||||
"instance_list_player",
|
"instance_list_player",
|
||||||
"inventory",
|
"inventory",
|
||||||
|
|||||||
@ -228,6 +228,7 @@ N(OP_GuildBank),
|
|||||||
N(OP_GuildBankItemList),
|
N(OP_GuildBankItemList),
|
||||||
N(OP_GuildCreate),
|
N(OP_GuildCreate),
|
||||||
N(OP_GuildDelete),
|
N(OP_GuildDelete),
|
||||||
|
N(OP_GuildDeleteGuild),
|
||||||
N(OP_GuildDemote),
|
N(OP_GuildDemote),
|
||||||
N(OP_GuildInvite),
|
N(OP_GuildInvite),
|
||||||
N(OP_GuildInviteAccept),
|
N(OP_GuildInviteAccept),
|
||||||
@ -239,15 +240,33 @@ N(OP_GuildManageStatus),
|
|||||||
N(OP_GuildMemberLevelUpdate),
|
N(OP_GuildMemberLevelUpdate),
|
||||||
N(OP_GuildMemberList),
|
N(OP_GuildMemberList),
|
||||||
N(OP_GuildMemberUpdate),
|
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_GuildMOTD),
|
||||||
N(OP_GuildPeace),
|
N(OP_GuildPeace),
|
||||||
N(OP_GuildPromote),
|
N(OP_GuildPromote),
|
||||||
N(OP_GuildPublicNote),
|
N(OP_GuildPublicNote),
|
||||||
N(OP_GuildRemove),
|
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_GuildsList),
|
||||||
N(OP_GuildStatus),
|
N(OP_GuildStatus),
|
||||||
N(OP_GuildTributeInfo),
|
N(OP_GuildTributeInfo),
|
||||||
N(OP_GuildUpdateURLAndChannel),
|
N(OP_GuildUpdate),
|
||||||
|
N(OP_GuildTributeDonateItem),
|
||||||
|
N(OP_GuildTributeDonatePlat),
|
||||||
N(OP_GuildWar),
|
N(OP_GuildWar),
|
||||||
N(OP_Heartbeat),
|
N(OP_Heartbeat),
|
||||||
N(OP_Hide),
|
N(OP_Hide),
|
||||||
@ -425,6 +444,7 @@ N(OP_ReqClientSpawn),
|
|||||||
N(OP_ReqNewZone),
|
N(OP_ReqNewZone),
|
||||||
N(OP_RequestClientZoneChange),
|
N(OP_RequestClientZoneChange),
|
||||||
N(OP_RequestDuel),
|
N(OP_RequestDuel),
|
||||||
|
N(OP_RequestGuildTributes),
|
||||||
N(OP_RequestKnowledgeBase),
|
N(OP_RequestKnowledgeBase),
|
||||||
N(OP_RequestTitles),
|
N(OP_RequestTitles),
|
||||||
N(OP_RespawnWindow),
|
N(OP_RespawnWindow),
|
||||||
|
|||||||
@ -314,6 +314,7 @@ union
|
|||||||
uint32 DestructibleUnk9;
|
uint32 DestructibleUnk9;
|
||||||
bool targetable_with_hotkey;
|
bool targetable_with_hotkey;
|
||||||
bool show_name;
|
bool show_name;
|
||||||
|
bool guild_show;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PlayerState_Struct {
|
struct PlayerState_Struct {
|
||||||
@ -1677,6 +1678,68 @@ struct GuildUpdate_Struct {
|
|||||||
GuildsListEntry_Struct entry;
|
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
|
** Money Loot
|
||||||
** Length: 22 Bytes
|
** Length: 22 Bytes
|
||||||
@ -1725,10 +1788,10 @@ struct GuildJoin_Struct{
|
|||||||
/*092*/
|
/*092*/
|
||||||
};
|
};
|
||||||
struct GuildInviteAccept_Struct {
|
struct GuildInviteAccept_Struct {
|
||||||
char inviter[64];
|
char inviter[64];
|
||||||
char newmember[64];
|
char new_member[64];
|
||||||
uint32 response;
|
uint32 response;
|
||||||
uint32 guildeqid;
|
uint32 guild_id;
|
||||||
};
|
};
|
||||||
struct GuildManageRemove_Struct {
|
struct GuildManageRemove_Struct {
|
||||||
uint32 guildeqid;
|
uint32 guildeqid;
|
||||||
@ -1760,6 +1823,14 @@ struct PopupResponse_Struct {
|
|||||||
/*0004*/ uint32 popupid;
|
/*0004*/ uint32 popupid;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum GuildInformationActions
|
||||||
|
{
|
||||||
|
GuildUpdateURL = 0,
|
||||||
|
GuildUpdateChannel = 1,
|
||||||
|
GuildUpdateRanks = 4,
|
||||||
|
GuildUpdatePermissions = 5
|
||||||
|
};
|
||||||
|
|
||||||
struct GuildManageBanker_Struct {
|
struct GuildManageBanker_Struct {
|
||||||
uint32 unknown0;
|
uint32 unknown0;
|
||||||
char myname[64];
|
char myname[64];
|
||||||
@ -1773,9 +1844,9 @@ struct GuildSetRank_Struct
|
|||||||
{
|
{
|
||||||
/*00*/ uint32 Unknown00;
|
/*00*/ uint32 Unknown00;
|
||||||
/*04*/ uint32 Unknown04;
|
/*04*/ uint32 Unknown04;
|
||||||
/*08*/ uint32 Rank;
|
/*08*/ uint32 rank;
|
||||||
/*12*/ char MemberName[64];
|
/*12*/ char member_name[64];
|
||||||
/*76*/ uint32 Banker;
|
/*76*/ uint32 banker;
|
||||||
/*80*/
|
/*80*/
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -3333,6 +3404,7 @@ struct Internal_GuildMemberEntry_Struct {
|
|||||||
// char public_note[1]; //variable length.
|
// char public_note[1]; //variable length.
|
||||||
uint16 zoneinstance; //network byte order
|
uint16 zoneinstance; //network byte order
|
||||||
uint16 zone_id; //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.
|
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;
|
uint32 unknown0;
|
||||||
char name[64];
|
char name[64];
|
||||||
char target[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
|
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.
|
//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
|
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
|
/*0004*/ uint32 Unknown0004; //Seen 00 00 00 00
|
||||||
/*0008*/ uint32 Unknown0008; //Seen 96 29 00 00
|
/*0008*/ uint32 Unknown0008; //Seen 96 29 00 00
|
||||||
/*0008*/ char Unknown0012[64]; //Seen "CharacterName"
|
/*0008*/ char Unknown0012[64]; //Seen "CharacterName"
|
||||||
@ -3400,6 +3507,7 @@ struct GuildStatus_Struct
|
|||||||
struct GuildDemoteStruct{
|
struct GuildDemoteStruct{
|
||||||
char name[64];
|
char name[64];
|
||||||
char target[64];
|
char target[64];
|
||||||
|
uint32 rank;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct GuildRemoveStruct{
|
struct GuildRemoveStruct{
|
||||||
@ -3409,9 +3517,9 @@ struct GuildRemoveStruct{
|
|||||||
uint32 leaderstatus; //?
|
uint32 leaderstatus; //?
|
||||||
};
|
};
|
||||||
|
|
||||||
struct GuildMakeLeader{
|
struct GuildMakeLeader_Struct{
|
||||||
char name[64];
|
char requestor[64];
|
||||||
char target[64];
|
char new_leader[64];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct BugReport_Struct {
|
struct BugReport_Struct {
|
||||||
@ -3505,66 +3613,193 @@ struct ZoneInSendName_Struct2 {
|
|||||||
static const uint32 MAX_TRIBUTE_TIERS = 10;
|
static const uint32 MAX_TRIBUTE_TIERS = 10;
|
||||||
|
|
||||||
struct StartTribute_Struct {
|
struct StartTribute_Struct {
|
||||||
uint32 client_id;
|
uint32 client_id;
|
||||||
uint32 tribute_master_id;
|
uint32 tribute_master_id;
|
||||||
uint32 response;
|
uint32 response;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TributeLevel_Struct {
|
struct TributeLevel_Struct {
|
||||||
uint32 level; //backwards byte order!
|
uint32 level; //backwards byte order!
|
||||||
uint32 tribute_item_id; //backwards byte order!
|
uint32 tribute_item_id; //backwards byte order!
|
||||||
uint32 cost; //backwards byte order!
|
uint32 cost; //backwards byte order!
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TributeAbility_Struct {
|
struct TributeAbility_Struct {
|
||||||
uint32 tribute_id; //backwards byte order!
|
uint32 tribute_id; //backwards byte order!
|
||||||
uint32 tier_count; //backwards byte order!
|
uint32 tier_count; //backwards byte order!
|
||||||
TributeLevel_Struct tiers[MAX_TRIBUTE_TIERS];
|
TributeLevel_Struct tiers[MAX_TRIBUTE_TIERS];
|
||||||
char name[0];
|
char name[0];
|
||||||
};
|
|
||||||
|
|
||||||
struct GuildTributeAbility_Struct {
|
|
||||||
uint32 guild_id;
|
|
||||||
TributeAbility_Struct ability;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SelectTributeReq_Struct {
|
struct SelectTributeReq_Struct {
|
||||||
uint32 client_id; //? maybe action ID?
|
uint32 client_id; //? maybe action ID?
|
||||||
uint32 tribute_id;
|
uint32 tribute_id;
|
||||||
uint32 unknown8; //seen E3 00 00 00
|
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 {
|
struct SelectTributeReply_Struct {
|
||||||
uint32 client_id; //echoed from request.
|
uint32 client_id; //echoed from request.
|
||||||
uint32 tribute_id;
|
uint32 tribute_id;
|
||||||
char desc[0];
|
char description[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TributeInfo_Struct {
|
struct TributeInfo_Struct {
|
||||||
uint32 active; //0 == inactive, 1 == active
|
uint32 active; //0 == inactive, 1 == active
|
||||||
uint32 tributes[EQ::invtype::TRIBUTE_SIZE]; //-1 == NONE
|
uint32 tributes[EQ::invtype::TRIBUTE_SIZE]; //-1 == NONE
|
||||||
uint32 tiers[EQ::invtype::TRIBUTE_SIZE]; //all 00's
|
uint32 tiers[EQ::invtype::TRIBUTE_SIZE]; //all 00's
|
||||||
uint32 tribute_master_id;
|
uint32 tribute_master_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TributeItem_Struct {
|
struct TributeItem_Struct {
|
||||||
uint32 slot;
|
uint32 slot;
|
||||||
uint32 quantity;
|
uint32 quantity;
|
||||||
uint32 tribute_master_id;
|
uint32 tribute_master_id;
|
||||||
int32 tribute_points;
|
int32 tribute_points;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TributePoint_Struct {
|
struct TributePoint_Struct {
|
||||||
int32 tribute_points;
|
int32 tribute_points;
|
||||||
uint32 unknown04;
|
uint32 unknown04;
|
||||||
int32 career_tribute_points;
|
int32 career_tribute_points;
|
||||||
uint32 unknown12;
|
uint32 unknown12;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TributeMoney_Struct {
|
struct TributeMoney_Struct {
|
||||||
uint32 platinum;
|
uint32 platinum;
|
||||||
uint32 tribute_master_id;
|
uint32 tribute_master_id;
|
||||||
int32 tribute_points;
|
int32 tribute_points;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -697,6 +697,8 @@ void PlayerEventLogs::SetSettingsDefaults()
|
|||||||
m_settings[PlayerEvent::KILLED_NAMED_NPC].event_enabled = 1;
|
m_settings[PlayerEvent::KILLED_NAMED_NPC].event_enabled = 1;
|
||||||
m_settings[PlayerEvent::KILLED_RAID_NPC].event_enabled = 1;
|
m_settings[PlayerEvent::KILLED_RAID_NPC].event_enabled = 1;
|
||||||
m_settings[PlayerEvent::ITEM_CREATION].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++) {
|
for (int i = PlayerEvent::GM_COMMAND; i != PlayerEvent::MAX; i++) {
|
||||||
m_settings[i].retention_days = RETENTION_DAYS_DEFAULT;
|
m_settings[i].retention_days = RETENTION_DAYS_DEFAULT;
|
||||||
|
|||||||
@ -56,6 +56,8 @@ namespace PlayerEvent {
|
|||||||
KILLED_NAMED_NPC,
|
KILLED_NAMED_NPC,
|
||||||
KILLED_RAID_NPC,
|
KILLED_RAID_NPC,
|
||||||
ITEM_CREATION,
|
ITEM_CREATION,
|
||||||
|
GUILD_TRIBUTE_DONATE_ITEM,
|
||||||
|
GUILD_TRIBUTE_DONATE_PLAT,
|
||||||
MAX // dont remove
|
MAX // dont remove
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -112,7 +114,9 @@ namespace PlayerEvent {
|
|||||||
"Killed NPC",
|
"Killed NPC",
|
||||||
"Killed Named NPC",
|
"Killed Named NPC",
|
||||||
"Killed Raid NPC",
|
"Killed Raid NPC",
|
||||||
"Item Creation"
|
"Item Creation",
|
||||||
|
"Guild Tribute Donate Item",
|
||||||
|
"Guild Tribute Donate Platinum"
|
||||||
};
|
};
|
||||||
|
|
||||||
// Generic struct used by all events
|
// 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
|
#endif //EQEMU_PLAYER_EVENTS_H
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -5,6 +5,42 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#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;
|
class Database;
|
||||||
|
|
||||||
@ -12,22 +48,23 @@ class CharGuildInfo
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
//fields from `characer_`
|
//fields from `characer_`
|
||||||
uint32 char_id;
|
uint32 char_id;
|
||||||
std::string char_name;
|
std::string char_name;
|
||||||
uint8 class_;
|
uint8 class_;
|
||||||
uint16 level;
|
uint16 level;
|
||||||
uint32 time_last_on;
|
uint32 time_last_on;
|
||||||
uint32 zone_id;
|
uint32 zone_id;
|
||||||
|
|
||||||
//fields from `guild_members`
|
//fields from `guild_members`
|
||||||
uint32 guild_id;
|
uint32 guild_id;
|
||||||
uint8 rank;
|
uint8 rank;
|
||||||
bool tribute_enable;
|
bool tribute_enable;
|
||||||
uint32 total_tribute;
|
uint32 total_tribute;
|
||||||
uint32 last_tribute; //timestamp
|
uint32 last_tribute; //timestamp
|
||||||
bool banker;
|
bool banker;
|
||||||
bool alt;
|
bool alt;
|
||||||
std::string public_note;
|
std::string public_note;
|
||||||
|
bool online;
|
||||||
};
|
};
|
||||||
|
|
||||||
//this object holds guild functionality shared between world and zone.
|
//this object holds guild functionality shared between world and zone.
|
||||||
@ -44,15 +81,16 @@ class BaseGuildManager
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool LoadGuilds();
|
bool LoadGuilds();
|
||||||
bool RefreshGuild(uint32 guild_id);
|
virtual bool RefreshGuild(uint32 guild_id);
|
||||||
|
|
||||||
//guild edit actions.
|
//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 DeleteGuild(uint32 guild_id);
|
||||||
bool RenameGuild(uint32 guild_id, const char* name);
|
bool RenameGuild(uint32 guild_id, std::string name);
|
||||||
bool SetGuildMOTD(uint32 guild_id, const char* motd, const char *setter);
|
bool SetGuildMOTD(uint32 guild_id, std::string motd, std::string setter);
|
||||||
bool SetGuildURL(uint32 GuildID, const char* URL);
|
bool SetGuildURL(uint32 guild_id, std::string URL);
|
||||||
bool SetGuildChannel(uint32 GuildID, const char* Channel);
|
bool SetGuildChannel(uint32 guild_id, std::string Channel);
|
||||||
|
|
||||||
//character edit actions
|
//character edit actions
|
||||||
bool SetGuildLeader(uint32 guild_id, uint32 leader_char_id);
|
bool SetGuildLeader(uint32 guild_id, uint32 leader_char_id);
|
||||||
@ -62,9 +100,16 @@ class BaseGuildManager
|
|||||||
bool ForceRankUpdate(uint32 charid);
|
bool ForceRankUpdate(uint32 charid);
|
||||||
bool GetAltFlag(uint32 CharID);
|
bool GetAltFlag(uint32 CharID);
|
||||||
bool SetAltFlag(uint32 charid, bool is_alt);
|
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 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
|
//queries
|
||||||
bool GetCharInfo(const char *char_name, CharGuildInfo &into);
|
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 GetGuildMOTD(uint32 guild_id, char *motd_buffer, char *setter_buffer) const;
|
||||||
bool GetGuildURL(uint32 GuildID, char *URLBuffer) const;
|
bool GetGuildURL(uint32 GuildID, char *URLBuffer) const;
|
||||||
bool GetGuildChannel(uint32 GuildID, char *ChannelBuffer) const;
|
bool GetGuildChannel(uint32 GuildID, char *ChannelBuffer) const;
|
||||||
const char *GetRankName(uint32 guild_id, uint8 rank) const;
|
bool IsCharacterInGuild(uint32 character_id, uint32 guild_id = 0);
|
||||||
const char *GetGuildName(uint32 guild_id) const;
|
bool GetGuildNameByID(uint32 guild_id, std::string& into) const;
|
||||||
std::string GetGuildNameByID(uint32 guild_id) const;
|
bool IsGuildLeader(uint32 guild_id, uint32 char_id) const;
|
||||||
std::string GetGuildRankName(uint32 guild_id, uint8 rank) const;
|
bool CheckGMStatus(uint32 guild_id, uint8 status) const;
|
||||||
bool IsCharacterInGuild(uint32 character_id, uint32 guild_id = 0);
|
bool CheckPermission(uint32 guild_id, uint8 rank, GuildAction act) const;
|
||||||
bool GetGuildNameByID(uint32 guild_id, std::string &into) const;
|
bool UpdateDbBankerFlag(uint32 charid, bool is_banker);
|
||||||
uint32 GetGuildIDByName(const char *GuildName);
|
uint8* MakeGuildList(const char* head_name, uint32& length) const; //make a guild list packet, returns ownership of the buffer.
|
||||||
uint32 GetGuildIDByCharacterID(uint32 character_id);
|
uint8 GetDisplayedRank(uint32 guild_id, uint8 rank, uint32 char_id) const;
|
||||||
bool IsGuildLeader(uint32 guild_id, uint32 char_id) const;
|
uint32 GetGuildIDByName(const char *GuildName);
|
||||||
uint8 GetDisplayedRank(uint32 guild_id, uint8 rank, uint32 char_id) const;
|
uint32 GetGuildIDByCharacterID(uint32 character_id);
|
||||||
bool CheckGMStatus(uint32 guild_id, uint8 status) const;
|
uint32 FindGuildByLeader(uint32 leader) const;
|
||||||
bool CheckPermission(uint32 guild_id, uint8 rank, GuildAction act) const;
|
uint32 NumberInGuild(uint32 guild_id);
|
||||||
// uint32 Getguild_id(uint32 eqid);
|
uint32 DoesAccountContainAGuildLeader(uint32 AccountID);
|
||||||
uint32 FindGuildByLeader(uint32 leader) const;
|
const char* GetRankName(uint32 guild_id, uint8 rank) const;
|
||||||
// void GetGuildMembers(uint32 guild_id,GuildMember_Struct* gms);
|
const char* GetGuildName(uint32 guild_id) const;
|
||||||
uint32 NumberInGuild(uint32 guild_id);
|
std::string GetGuildNameByID(uint32 guild_id) const;
|
||||||
// bool GetGuildRanks(uint32 guildeqid, GuildRanks_Struct* gr);
|
std::string GetGuildRankName(uint32 guild_id, uint8 rank) const;
|
||||||
// bool EditGuild(uint32 guild_id, uint8 ranknum, GuildRankLevel_Struct* grl);
|
std::vector<GuildMembersRepository::GuildMembers> GetGuildMembers(uint32 guild_id);
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
//the methods which must be defined by base classes.
|
//the methods which must be defined by base classes.
|
||||||
@ -105,58 +145,62 @@ class BaseGuildManager
|
|||||||
virtual void SendRankUpdate(uint32 CharID) = 0;
|
virtual void SendRankUpdate(uint32 CharID) = 0;
|
||||||
virtual void SendGuildDelete(uint32 guild_id) = 0;
|
virtual void SendGuildDelete(uint32 guild_id) = 0;
|
||||||
|
|
||||||
uint32 DBCreateGuild(const char* name, uint32 leader_char_id);
|
uint32 UpdateDbCreateGuild(std::string name, uint32 leader_char_id);
|
||||||
bool DBDeleteGuild(uint32 guild_id);
|
bool UpdateDbDeleteGuild(uint32 guild_id, bool local_delete = true, bool db_delete = true);
|
||||||
bool DBRenameGuild(uint32 guild_id, const char* name);
|
bool UpdateDbRenameGuild(uint32 guild_id, std::string name);
|
||||||
bool DBSetGuildLeader(uint32 guild_id, uint32 leader_char_id);
|
bool UpdateDbGuildLeader(uint32 guild_id, uint32 leader_char_id);
|
||||||
bool DBSetGuildMOTD(uint32 guild_id, const char* motd, const char *setter);
|
bool UpdateDbGuildMOTD(uint32 guild_id, std::string motd, std::string setter);
|
||||||
bool DBSetGuildURL(uint32 GuildID, const char* URL);
|
bool UpdateDbGuildURL(uint32 GuildID, std::string URL);
|
||||||
bool DBSetGuildChannel(uint32 GuildID, const char* Channel);
|
bool UpdateDbGuildChannel(uint32 GuildID, std::string Channel);
|
||||||
bool DBSetGuild(uint32 charid, uint32 guild_id, uint8 rank);
|
bool UpdateDbGuild(uint32 charid, uint32 guild_id, uint8 rank);
|
||||||
bool DBSetGuildRank(uint32 charid, uint8 rank);
|
bool UpdateDbGuildRank(uint32 charid, uint8 rank);
|
||||||
bool DBSetBankerFlag(uint32 charid, bool is_banker);
|
bool UpdateDbAltFlag(uint32 charid, bool is_alt);
|
||||||
bool DBSetAltFlag(uint32 charid, bool is_alt);
|
bool UpdateDbTributeFlag(uint32 charid, bool enabled);
|
||||||
bool DBSetTributeFlag(uint32 charid, bool enabled);
|
bool UpdateDbPublicNote(uint32 charid, std::string public_note);
|
||||||
bool DBSetPublicNote(uint32 charid, const char *note);
|
|
||||||
bool QueryWithLogging(std::string query, const char *errmsg);
|
bool QueryWithLogging(std::string query, const char *errmsg);
|
||||||
// void DBSetPublicNote(uint32 guild_id,char* charname, char* note);
|
|
||||||
|
|
||||||
bool LocalDeleteGuild(uint32 guild_id);
|
bool LocalDeleteGuild(uint32 guild_id);
|
||||||
|
|
||||||
class RankInfo
|
struct RankInfo
|
||||||
{
|
{
|
||||||
public:
|
RankInfo();
|
||||||
RankInfo();
|
std::string rank_name;
|
||||||
std::string name;
|
|
||||||
bool permissions[_MaxGuildAction];
|
|
||||||
};
|
};
|
||||||
class GuildInfo
|
struct Functions
|
||||||
{
|
{
|
||||||
public:
|
uint32 id;
|
||||||
GuildInfo();
|
uint32 perm_id;
|
||||||
std::string name;
|
uint32 guild_id;
|
||||||
std::string motd;
|
uint32 perm_value;
|
||||||
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];
|
|
||||||
};
|
};
|
||||||
|
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
|
std::map<uint32, GuildInfo *> m_guilds; //we own the pointers in this map
|
||||||
void ClearGuilds(); //clears internal structure
|
void ClearGuilds(); //clears internal structure
|
||||||
|
|
||||||
Database *m_db; //we do not own this
|
Database *m_db; //we do not own this
|
||||||
|
|
||||||
bool _StoreGuildDB(uint32 guild_id);
|
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();
|
uint32 _GetFreeGuildID();
|
||||||
|
GuildsRepository::Guilds CreateGuildRepoFromGuildInfo(uint32 guild_id, BaseGuildManager::GuildInfo& in);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif /*GUILD_BASE_H_*/
|
#endif /*GUILD_BASE_H_*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -16,31 +16,70 @@
|
|||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef GUILD_H
|
#ifndef GUILDS_H
|
||||||
#define GUILD_H
|
#define GUILDS_H
|
||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
#define GUILD_NONE 0xFFFFFFFF // user has no guild
|
#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
|
//defines for standard ranks
|
||||||
#define GUILD_MEMBER 0
|
#define GUILD_MEMBER_TI 0
|
||||||
#define GUILD_OFFICER 1
|
#define GUILD_OFFICER_TI 1
|
||||||
#define GUILD_LEADER 2
|
#define GUILD_LEADER_TI 2
|
||||||
#define GUILD_RANK_NONE (GUILD_MAX_RANK+1)
|
#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 {
|
typedef enum {
|
||||||
GUILD_HEAR = 0,
|
GUILD_ACTION_BANNER_CHANGE = 1,
|
||||||
GUILD_SPEAK = 1,
|
GUILD_ACTION_BANNER_PLANT = 2,
|
||||||
GUILD_INVITE = 2,
|
GUILD_ACTION_BANNER_REMOVE = 3,
|
||||||
GUILD_REMOVE = 3,
|
GUILD_ACTION_DISPLAY_GUILD_NAME = 4,
|
||||||
GUILD_PROMOTE = 4,
|
GUILD_ACTION_RANKS_CHANGE_PERMISSIONS = 5,
|
||||||
GUILD_DEMOTE = 5,
|
GUILD_ACTION_RANKS_CHANGE_RANK_NAMES = 6,
|
||||||
GUILD_MOTD = 6,
|
GUILD_ACTION_MEMBERS_INVITE = 7,
|
||||||
GUILD_WARPEACE = 7,
|
GUILD_ACTION_MEMBERS_PROMOTE = 8,
|
||||||
_MaxGuildAction
|
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;
|
} GuildAction;
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -173,7 +173,8 @@ EQ::ItemInstance* EQ::InventoryProfile::GetItem(int16 slot_id) const
|
|||||||
result = _GetItem(m_inv, slot_id);
|
result = _GetItem(m_inv, slot_id);
|
||||||
}
|
}
|
||||||
else if ((slot_id >= invslot::EQUIPMENT_BEGIN && slot_id <= invslot::EQUIPMENT_END) ||
|
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)
|
// Equippable slots (on body)
|
||||||
result = _GetItem(m_worn, slot_id);
|
result = _GetItem(m_worn, slot_id);
|
||||||
}
|
}
|
||||||
@ -465,6 +466,10 @@ EQ::ItemInstance* EQ::InventoryProfile::PopItem(int16 slot_id)
|
|||||||
p = m_worn[slot_id];
|
p = m_worn[slot_id];
|
||||||
m_worn.erase(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) {
|
else if (slot_id >= invslot::BANK_BEGIN && slot_id <= invslot::BANK_END) {
|
||||||
p = m_bank[slot_id];
|
p = m_bank[slot_id];
|
||||||
m_bank.erase(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;
|
m_worn[slot_id] = inst;
|
||||||
result = slot_id;
|
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) {
|
else if (slot_id >= invslot::BANK_BEGIN && slot_id <= invslot::BANK_END) {
|
||||||
if (slot_id - EQ::invslot::BANK_BEGIN < m_lookup->InventoryTypeSize.Bank) {
|
if (slot_id - EQ::invslot::BANK_BEGIN < m_lookup->InventoryTypeSize.Bank) {
|
||||||
m_bank[slot_id] = inst;
|
m_bank[slot_id] = inst;
|
||||||
|
|||||||
@ -1791,6 +1791,16 @@ int EQ::ItemInstance::RemoveTaskDeliveredItems()
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32 EQ::ItemInstance::GetItemGuildFavor() const
|
||||||
|
{
|
||||||
|
uint32 total = 0;
|
||||||
|
const auto item = GetItem();
|
||||||
|
if (item) {
|
||||||
|
return total = item->GuildFavor;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// class EvolveInfo
|
// class EvolveInfo
|
||||||
//
|
//
|
||||||
|
|||||||
@ -299,6 +299,7 @@ namespace EQ
|
|||||||
int GetItemHeroicDR(bool augments = false) const;
|
int GetItemHeroicDR(bool augments = false) const;
|
||||||
int GetItemHeroicCorrup(bool augments = false) const;
|
int GetItemHeroicCorrup(bool augments = false) const;
|
||||||
int GetItemHaste(bool augments = false) const;
|
int GetItemHaste(bool augments = false) const;
|
||||||
|
uint32 GetItemGuildFavor() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
//////////////////////////
|
//////////////////////////
|
||||||
|
|||||||
@ -1308,13 +1308,13 @@ namespace RoF
|
|||||||
PutFieldN(class_);
|
PutFieldN(class_);
|
||||||
|
|
||||||
/* Translate older ranks to new values */
|
/* Translate older ranks to new values */
|
||||||
switch (emu_e->rank) {
|
//switch (emu_e->rank) {
|
||||||
case 0: { e->rank = htonl(5); break; } // GUILD_MEMBER 0
|
//case 0: { e->rank = htonl(5); break; } // GUILD_MEMBER 0
|
||||||
case 1: { e->rank = htonl(3); break; } // GUILD_OFFICER 1
|
//case 1: { e->rank = htonl(3); break; } // GUILD_OFFICER 1
|
||||||
case 2: { e->rank = htonl(1); break; } // GUILD_LEADER 2
|
//case 2: { e->rank = htonl(1); break; } // GUILD_LEADER 2
|
||||||
default: { e->rank = htonl(emu_e->rank); break; } // GUILD_NONE
|
//default: { e->rank = htonl(emu_e->rank); break; } // GUILD_NONE
|
||||||
}
|
//}
|
||||||
|
PutFieldN(rank);
|
||||||
PutFieldN(time_last_on);
|
PutFieldN(time_last_on);
|
||||||
PutFieldN(tribute_enable);
|
PutFieldN(tribute_enable);
|
||||||
e->unknown01 = 0;
|
e->unknown01 = 0;
|
||||||
@ -3051,19 +3051,12 @@ namespace RoF
|
|||||||
ENCODE_LENGTH_EXACT(GuildSetRank_Struct);
|
ENCODE_LENGTH_EXACT(GuildSetRank_Struct);
|
||||||
SETUP_DIRECT_ENCODE(GuildSetRank_Struct, structs::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 */
|
memcpy(eq->member_name, emu->member_name, sizeof(eq->member_name));
|
||||||
switch (emu->Rank) {
|
OUT(banker);
|
||||||
case 0: { eq->Rank = 5; break; } // GUILD_MEMBER 0
|
eq->unknown76 = 1;
|
||||||
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;
|
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
@ -3973,10 +3966,22 @@ namespace RoF
|
|||||||
|
|
||||||
/* Translate older ranks to new values */
|
/* Translate older ranks to new values */
|
||||||
switch (emu->guildrank) {
|
switch (emu->guildrank) {
|
||||||
case 0: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 5); break; } // GUILD_MEMBER 0
|
case 0: {
|
||||||
case 1: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 3); break; } // GUILD_OFFICER 1
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 5);
|
||||||
case 2: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 1); break; } // GUILD_LEADER 2
|
break;
|
||||||
default: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildrank); 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;
|
||||||
|
} //
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1319,6 +1319,7 @@ namespace RoF2
|
|||||||
buffer++;
|
buffer++;
|
||||||
|
|
||||||
// Guild ID
|
// Guild ID
|
||||||
|
//*((uint32*)buffer) = htonl(2);
|
||||||
buffer += sizeof(uint32);
|
buffer += sizeof(uint32);
|
||||||
|
|
||||||
//add member count.
|
//add member count.
|
||||||
@ -1357,15 +1358,7 @@ namespace RoF2
|
|||||||
PutFieldN(level);
|
PutFieldN(level);
|
||||||
PutFieldN(banker);
|
PutFieldN(banker);
|
||||||
PutFieldN(class_);
|
PutFieldN(class_);
|
||||||
|
PutFieldN(rank);
|
||||||
/* 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(time_last_on);
|
PutFieldN(time_last_on);
|
||||||
PutFieldN(tribute_enable);
|
PutFieldN(tribute_enable);
|
||||||
e->unknown01 = 0;
|
e->unknown01 = 0;
|
||||||
@ -1395,8 +1388,10 @@ namespace RoF2
|
|||||||
|
|
||||||
OUT(GuildID);
|
OUT(GuildID);
|
||||||
memcpy(eq->MemberName, emu->MemberName, sizeof(eq->MemberName));
|
memcpy(eq->MemberName, emu->MemberName, sizeof(eq->MemberName));
|
||||||
OUT(ZoneID);
|
//OUT(ZoneID);
|
||||||
OUT(InstanceID);
|
//OUT(InstanceID);
|
||||||
|
eq->InstanceID = emu->InstanceID;
|
||||||
|
eq->ZoneID = emu->ZoneID;
|
||||||
OUT(LastSeen);
|
OUT(LastSeen);
|
||||||
eq->Unknown76 = 0;
|
eq->Unknown76 = 0;
|
||||||
|
|
||||||
@ -1422,7 +1417,7 @@ namespace RoF2
|
|||||||
if (InBuffer[0])
|
if (InBuffer[0])
|
||||||
{
|
{
|
||||||
PacketSize += (5 + strlen(InBuffer));
|
PacketSize += (5 + strlen(InBuffer));
|
||||||
HighestGuildID = i - 1;
|
HighestGuildID += 1;
|
||||||
}
|
}
|
||||||
InBuffer += 64;
|
InBuffer += 64;
|
||||||
}
|
}
|
||||||
@ -1460,6 +1455,30 @@ namespace RoF2
|
|||||||
dest->FastQueuePacket(&in, ack_req);
|
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)
|
ENCODE(OP_HPUpdate)
|
||||||
{
|
{
|
||||||
SETUP_DIRECT_ENCODE(SpawnHPUpdate_Struct, structs::SpawnHPUpdate_Struct);
|
SETUP_DIRECT_ENCODE(SpawnHPUpdate_Struct, structs::SpawnHPUpdate_Struct);
|
||||||
@ -2466,6 +2485,8 @@ namespace RoF2
|
|||||||
{
|
{
|
||||||
outapp->WriteUInt32(0xffffffff);
|
outapp->WriteUInt32(0xffffffff);
|
||||||
outapp->WriteUInt32(0);
|
outapp->WriteUInt32(0);
|
||||||
|
// outapp->WriteUInt32(60);
|
||||||
|
// outapp->WriteUInt32(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
outapp->WriteUInt32(0); // Unknown
|
outapp->WriteUInt32(0); // Unknown
|
||||||
@ -3104,19 +3125,12 @@ namespace RoF2
|
|||||||
ENCODE_LENGTH_EXACT(GuildSetRank_Struct);
|
ENCODE_LENGTH_EXACT(GuildSetRank_Struct);
|
||||||
SETUP_DIRECT_ENCODE(GuildSetRank_Struct, structs::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 */
|
memcpy(eq->member_name, emu->member_name, sizeof(eq->member_name));
|
||||||
switch (emu->Rank) {
|
OUT(banker);
|
||||||
case 0: { eq->Rank = 5; break; } // GUILD_MEMBER 0
|
eq->unknown76 = 1;
|
||||||
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;
|
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
@ -4178,12 +4192,13 @@ namespace RoF2
|
|||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildID);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildID);
|
||||||
|
|
||||||
/* Translate older ranks to new values */
|
/* Translate older ranks to new values */
|
||||||
switch (emu->guildrank) {
|
//switch (emu->guildrank) {
|
||||||
case 0: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 5); break; } // GUILD_MEMBER 0
|
//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 1: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 3); break; } // GUILD_OFFICER 1
|
||||||
case 2: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 1); break; } // GUILD_LEADER 2
|
//case 2: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 1); break; } // GUILD_LEADER 2
|
||||||
default: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildrank); break; } //
|
//default: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildrank); break; } //
|
||||||
}
|
//}
|
||||||
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildrank);
|
||||||
}
|
}
|
||||||
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->class_);
|
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->class_);
|
||||||
@ -4199,7 +4214,7 @@ namespace RoF2
|
|||||||
VARSTRUCT_ENCODE_STRING(Buffer, emu->lastName);
|
VARSTRUCT_ENCODE_STRING(Buffer, emu->lastName);
|
||||||
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); // aatitle
|
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(uint8, Buffer, 0); // TempPet
|
||||||
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->petOwnerId);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->petOwnerId);
|
||||||
@ -4955,7 +4970,7 @@ namespace RoF2
|
|||||||
|
|
||||||
strn0cpy(emu->target, eq->target, sizeof(emu->target));
|
strn0cpy(emu->target, eq->target, sizeof(emu->target));
|
||||||
strn0cpy(emu->name, eq->name, sizeof(emu->name));
|
strn0cpy(emu->name, eq->name, sizeof(emu->name));
|
||||||
// IN(rank);
|
IN(rank);
|
||||||
|
|
||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
}
|
}
|
||||||
@ -4983,6 +4998,38 @@ namespace RoF2
|
|||||||
FINISH_DIRECT_DECODE();
|
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(OP_InspectAnswer)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::InspectResponse_Struct);
|
DECODE_LENGTH_EXACT(structs::InspectResponse_Struct);
|
||||||
|
|||||||
@ -82,6 +82,7 @@ E(OP_GuildBank)
|
|||||||
E(OP_GuildMemberList)
|
E(OP_GuildMemberList)
|
||||||
E(OP_GuildMemberUpdate)
|
E(OP_GuildMemberUpdate)
|
||||||
E(OP_GuildsList)
|
E(OP_GuildsList)
|
||||||
|
E(OP_GuildTributeDonateItem)
|
||||||
E(OP_HPUpdate)
|
E(OP_HPUpdate)
|
||||||
E(OP_Illusion)
|
E(OP_Illusion)
|
||||||
E(OP_InspectBuffs)
|
E(OP_InspectBuffs)
|
||||||
@ -182,6 +183,7 @@ D(OP_GuildBank)
|
|||||||
D(OP_GuildDemote)
|
D(OP_GuildDemote)
|
||||||
D(OP_GuildRemove)
|
D(OP_GuildRemove)
|
||||||
D(OP_GuildStatus)
|
D(OP_GuildStatus)
|
||||||
|
D(OP_GuildTributeDonateItem)
|
||||||
D(OP_InspectRequest)
|
D(OP_InspectRequest)
|
||||||
D(OP_ItemLinkClick)
|
D(OP_ItemLinkClick)
|
||||||
D(OP_ItemVerifyRequest)
|
D(OP_ItemVerifyRequest)
|
||||||
|
|||||||
@ -2011,6 +2011,31 @@ struct GuildBankClear_Struct
|
|||||||
/*16*/ uint32 MainAreaCount;
|
/*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
|
** Money Loot
|
||||||
** Length: 22 Bytes
|
** Length: 22 Bytes
|
||||||
@ -3600,11 +3625,11 @@ struct GuildMakeLeader {
|
|||||||
// Update a guild members rank and banker status
|
// Update a guild members rank and banker status
|
||||||
struct GuildSetRank_Struct
|
struct GuildSetRank_Struct
|
||||||
{
|
{
|
||||||
/*00*/ uint32 GuildID; // Was Unknown00
|
/*00*/ uint32 guild_id; // Was Unknown00
|
||||||
/*04*/ uint32 Rank;
|
/*04*/ uint32 rank;
|
||||||
/*08*/ char MemberName[64];
|
/*08*/ char member_name[64];
|
||||||
/*72*/ uint32 Banker;
|
/*72*/ uint32 banker;
|
||||||
/*76*/ uint32 Unknown76; // Seen 1 - Maybe Banker?
|
/*76*/ uint32 unknown76; // Seen 1 - Maybe Banker?
|
||||||
/*80*/
|
/*80*/
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -3722,15 +3747,15 @@ struct TributeItem_Struct
|
|||||||
|
|
||||||
struct TributePoint_Struct {
|
struct TributePoint_Struct {
|
||||||
int32 tribute_points;
|
int32 tribute_points;
|
||||||
uint32 unknown04;
|
uint32 unknown04;
|
||||||
int32 career_tribute_points;
|
int32 career_tribute_points;
|
||||||
uint32 unknown12;
|
uint32 unknown12;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TributeMoney_Struct {
|
struct TributeMoney_Struct {
|
||||||
uint32 platinum;
|
uint32 platinum;
|
||||||
uint32 tribute_master_id;
|
uint32 tribute_master_id;
|
||||||
int32 tribute_points;
|
int32 tribute_points;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -3537,11 +3537,11 @@ struct GuildMakeLeader {
|
|||||||
// Update a guild members rank and banker status
|
// Update a guild members rank and banker status
|
||||||
struct GuildSetRank_Struct
|
struct GuildSetRank_Struct
|
||||||
{
|
{
|
||||||
/*00*/ uint32 GuildID; // Was Unknown00
|
/*00*/ uint32 guild_id; // Was Unknown00
|
||||||
/*04*/ uint32 Rank;
|
/*04*/ uint32 rank;
|
||||||
/*08*/ char MemberName[64];
|
/*08*/ char member_name[64];
|
||||||
/*72*/ uint32 Banker;
|
/*72*/ uint32 banker;
|
||||||
/*76*/ uint32 Unknown76; // Seen 1 - Maybe Banker?
|
/*76*/ uint32 unknown76; // Seen 1 - Maybe Banker?
|
||||||
/*80*/
|
/*80*/
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -34,6 +34,7 @@
|
|||||||
#include "titanium_structs.h"
|
#include "titanium_structs.h"
|
||||||
#include "../path_manager.h"
|
#include "../path_manager.h"
|
||||||
#include "../raid.h"
|
#include "../raid.h"
|
||||||
|
#include "../guilds.h"
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
@ -664,6 +665,151 @@ namespace Titanium
|
|||||||
dest->FastQueuePacket(&in, ack_req);
|
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)
|
ENCODE(OP_GuildMemberList)
|
||||||
{
|
{
|
||||||
//consume the packet
|
//consume the packet
|
||||||
@ -727,12 +873,34 @@ namespace Titanium
|
|||||||
str += sl + 1; \
|
str += sl + 1; \
|
||||||
}
|
}
|
||||||
#define PutFieldN(field) e->field = htonl(emu_e->field)
|
#define PutFieldN(field) e->field = htonl(emu_e->field)
|
||||||
|
/* Translate new ranks to older values */
|
||||||
SlideStructString(name, emu_name);
|
SlideStructString(name, emu_name);
|
||||||
PutFieldN(level);
|
PutFieldN(level);
|
||||||
PutFieldN(banker);
|
PutFieldN(banker);
|
||||||
PutFieldN(class_);
|
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(time_last_on);
|
||||||
PutFieldN(tribute_enable);
|
PutFieldN(tribute_enable);
|
||||||
PutFieldN(total_tribute);
|
PutFieldN(total_tribute);
|
||||||
@ -753,6 +921,38 @@ namespace Titanium
|
|||||||
dest->FastQueuePacket(&in, ack_req);
|
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(OP_Illusion)
|
||||||
{
|
{
|
||||||
ENCODE_LENGTH_EXACT(Illusion_Struct);
|
ENCODE_LENGTH_EXACT(Illusion_Struct);
|
||||||
@ -867,11 +1067,60 @@ namespace Titanium
|
|||||||
|
|
||||||
ENCODE(OP_LFGuild)
|
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;
|
EQApplicationPacket *in = *p;
|
||||||
*p = nullptr;
|
|
||||||
|
|
||||||
uint32 Command = in->ReadUInt32();
|
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)
|
if (Command != 0)
|
||||||
{
|
{
|
||||||
dest->FastQueuePacket(&in, ack_req);
|
dest->FastQueuePacket(&in, ack_req);
|
||||||
@ -1149,7 +1398,28 @@ namespace Titanium
|
|||||||
OUT(pvp);
|
OUT(pvp);
|
||||||
OUT(anon);
|
OUT(anon);
|
||||||
OUT(gm);
|
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(guildbanker);
|
||||||
// OUT(unknown13054[8]);
|
// OUT(unknown13054[8]);
|
||||||
OUT(exp);
|
OUT(exp);
|
||||||
@ -1250,7 +1520,7 @@ namespace Titanium
|
|||||||
{
|
{
|
||||||
ENCODE_LENGTH_EXACT(MarkNPC_Struct);
|
ENCODE_LENGTH_EXACT(MarkNPC_Struct);
|
||||||
SETUP_DIRECT_ENCODE(MarkNPC_Struct, MarkNPC_Struct);
|
SETUP_DIRECT_ENCODE(MarkNPC_Struct, MarkNPC_Struct);
|
||||||
|
|
||||||
EQApplicationPacket* outapp = new EQApplicationPacket(OP_MarkNPC, sizeof(MarkNPC_Struct));
|
EQApplicationPacket* outapp = new EQApplicationPacket(OP_MarkNPC, sizeof(MarkNPC_Struct));
|
||||||
MarkNPC_Struct* mnpcs = (MarkNPC_Struct*)outapp->pBuffer;
|
MarkNPC_Struct* mnpcs = (MarkNPC_Struct*)outapp->pBuffer;
|
||||||
mnpcs->TargetID = emu->TargetID;
|
mnpcs->TargetID = emu->TargetID;
|
||||||
@ -1267,10 +1537,10 @@ namespace Titanium
|
|||||||
*p = nullptr;
|
*p = nullptr;
|
||||||
unsigned char* __emu_buffer = inapp->pBuffer;
|
unsigned char* __emu_buffer = inapp->pBuffer;
|
||||||
RaidGeneral_Struct* raid_gen = (RaidGeneral_Struct*)__emu_buffer;
|
RaidGeneral_Struct* raid_gen = (RaidGeneral_Struct*)__emu_buffer;
|
||||||
|
|
||||||
switch (raid_gen->action)
|
switch (raid_gen->action)
|
||||||
{
|
{
|
||||||
case raidAdd:
|
case raidAdd:
|
||||||
{
|
{
|
||||||
RaidAddMember_Struct* emu = (RaidAddMember_Struct*)__emu_buffer;
|
RaidAddMember_Struct* emu = (RaidAddMember_Struct*)__emu_buffer;
|
||||||
|
|
||||||
@ -1340,7 +1610,7 @@ namespace Titanium
|
|||||||
dest->QueuePacket(inapp);
|
dest->QueuePacket(inapp);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
RaidGeneral_Struct* emu = (RaidGeneral_Struct*)__emu_buffer;
|
RaidGeneral_Struct* emu = (RaidGeneral_Struct*)__emu_buffer;
|
||||||
|
|
||||||
@ -1864,7 +2134,28 @@ namespace Titanium
|
|||||||
eq->beard = emu->beard;
|
eq->beard = emu->beard;
|
||||||
strcpy(eq->suffix, emu->suffix);
|
strcpy(eq->suffix, emu->suffix);
|
||||||
eq->petOwnerId = emu->petOwnerId;
|
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];
|
// eq->unknown0194[3] = emu->unknown0194[3];
|
||||||
for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; k++) {
|
for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; k++) {
|
||||||
eq->equipment.Slot[k].Material = emu->equipment.Slot[k].Material;
|
eq->equipment.Slot[k].Material = emu->equipment.Slot[k].Material;
|
||||||
@ -2205,6 +2496,34 @@ namespace Titanium
|
|||||||
FINISH_DIRECT_DECODE();
|
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(OP_InspectAnswer)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::InspectResponse_Struct);
|
DECODE_LENGTH_EXACT(structs::InspectResponse_Struct);
|
||||||
@ -2260,8 +2579,77 @@ namespace Titanium
|
|||||||
|
|
||||||
DECODE(OP_LFGuild)
|
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();
|
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)
|
if (Command != 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -2401,7 +2789,7 @@ namespace Titanium
|
|||||||
IN(general.parameter);
|
IN(general.parameter);
|
||||||
IN_str(general.leader_name);
|
IN_str(general.leader_name);
|
||||||
IN_str(general.player_name);
|
IN_str(general.player_name);
|
||||||
|
|
||||||
auto len = 0;
|
auto len = 0;
|
||||||
if (__packet->size < sizeof(structs::RaidMOTD_Struct)) {
|
if (__packet->size < sizeof(structs::RaidMOTD_Struct)) {
|
||||||
len = __packet->size - sizeof(structs::RaidGeneral_Struct);
|
len = __packet->size - sizeof(structs::RaidGeneral_Struct);
|
||||||
@ -2409,8 +2797,8 @@ namespace Titanium
|
|||||||
else {
|
else {
|
||||||
len = sizeof(eq->motd);
|
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';
|
emu->motd[len - 1] = '\0';
|
||||||
|
|
||||||
FINISH_VAR_DECODE();
|
FINISH_VAR_DECODE();
|
||||||
@ -2428,7 +2816,7 @@ namespace Titanium
|
|||||||
|
|
||||||
FINISH_VAR_DECODE();
|
FINISH_VAR_DECODE();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
||||||
|
|||||||
@ -44,8 +44,13 @@ E(OP_DzSetLeaderName)
|
|||||||
E(OP_Emote)
|
E(OP_Emote)
|
||||||
E(OP_FormattedMessage)
|
E(OP_FormattedMessage)
|
||||||
E(OP_GroundSpawn)
|
E(OP_GroundSpawn)
|
||||||
|
E(OP_SetGuildRank)
|
||||||
E(OP_GuildMemberLevelUpdate)
|
E(OP_GuildMemberLevelUpdate)
|
||||||
E(OP_GuildMemberList)
|
E(OP_GuildMemberList)
|
||||||
|
E(OP_GuildMemberAdd)
|
||||||
|
E(OP_GuildMemberRankAltBanker)
|
||||||
|
E(OP_SendGuildTributes)
|
||||||
|
E(OP_GuildTributeDonateItem)
|
||||||
E(OP_Illusion)
|
E(OP_Illusion)
|
||||||
E(OP_InspectAnswer)
|
E(OP_InspectAnswer)
|
||||||
E(OP_InspectRequest)
|
E(OP_InspectRequest)
|
||||||
@ -69,6 +74,7 @@ E(OP_SendCharInfo)
|
|||||||
E(OP_SendAATable)
|
E(OP_SendAATable)
|
||||||
E(OP_SetFace)
|
E(OP_SetFace)
|
||||||
E(OP_ShopPlayerSell)
|
E(OP_ShopPlayerSell)
|
||||||
|
E(OP_SpawnAppearance)
|
||||||
E(OP_SpecialMesg)
|
E(OP_SpecialMesg)
|
||||||
E(OP_TaskDescription)
|
E(OP_TaskDescription)
|
||||||
E(OP_Track)
|
E(OP_Track)
|
||||||
@ -100,9 +106,11 @@ D(OP_DzRemovePlayer)
|
|||||||
D(OP_DzSwapPlayer)
|
D(OP_DzSwapPlayer)
|
||||||
D(OP_Emote)
|
D(OP_Emote)
|
||||||
D(OP_FaceChange)
|
D(OP_FaceChange)
|
||||||
|
D(OP_GuildDemote)
|
||||||
D(OP_InspectAnswer)
|
D(OP_InspectAnswer)
|
||||||
D(OP_InspectRequest)
|
D(OP_InspectRequest)
|
||||||
D(OP_ItemLinkClick)
|
D(OP_ItemLinkClick)
|
||||||
|
D(OP_GuildTributeDonateItem)
|
||||||
D(OP_LFGuild)
|
D(OP_LFGuild)
|
||||||
D(OP_LoadSpellSet)
|
D(OP_LoadSpellSet)
|
||||||
D(OP_LootItem)
|
D(OP_LootItem)
|
||||||
|
|||||||
@ -1423,6 +1423,23 @@ struct GuildUpdate_Struct {
|
|||||||
GuildsListEntry_Struct entry;
|
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
|
** Money Loot
|
||||||
** Length: 22 Bytes
|
** Length: 22 Bytes
|
||||||
@ -3508,7 +3525,7 @@ struct LFGuild_GuildToggle_Struct
|
|||||||
/*540*/ uint32 TimeZone;
|
/*540*/ uint32 TimeZone;
|
||||||
/*544*/ uint8 Toggle;
|
/*544*/ uint8 Toggle;
|
||||||
/*545*/ uint8 Unknown545[3];
|
/*545*/ uint8 Unknown545[3];
|
||||||
/*548*/ uint32 Expires;
|
/*548*/ uint32 TimePosted;
|
||||||
/*552*/ char Name[64];
|
/*552*/ char Name[64];
|
||||||
/*616*/
|
/*616*/
|
||||||
};
|
};
|
||||||
@ -3699,6 +3716,34 @@ struct SayLinkBodyFrame_Struct {
|
|||||||
/*045*/
|
/*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*/
|
}; /*structs*/
|
||||||
|
|
||||||
}; /*Titanium*/
|
}; /*Titanium*/
|
||||||
|
|||||||
@ -36,6 +36,7 @@
|
|||||||
#include "../classes.h"
|
#include "../classes.h"
|
||||||
#include "../races.h"
|
#include "../races.h"
|
||||||
#include "../raid.h"
|
#include "../raid.h"
|
||||||
|
#include "../guilds.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
@ -1134,6 +1135,29 @@ namespace UF
|
|||||||
PutFieldN(level);
|
PutFieldN(level);
|
||||||
PutFieldN(banker);
|
PutFieldN(banker);
|
||||||
PutFieldN(class_);
|
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(rank);
|
||||||
PutFieldN(time_last_on);
|
PutFieldN(time_last_on);
|
||||||
PutFieldN(tribute_enable);
|
PutFieldN(tribute_enable);
|
||||||
@ -1165,14 +1189,14 @@ namespace UF
|
|||||||
|
|
||||||
unsigned char *__emu_buffer = in->pBuffer;
|
unsigned char *__emu_buffer = in->pBuffer;
|
||||||
char *InBuffer = (char *)__emu_buffer;
|
char *InBuffer = (char *)__emu_buffer;
|
||||||
uint32 HighestGuildID = 0;
|
uint32 actual_no_guilds = 0;
|
||||||
|
|
||||||
for (unsigned int i = 0; i < NumberOfGuilds; ++i)
|
for (unsigned int i = 0; i < NumberOfGuilds; ++i)
|
||||||
{
|
{
|
||||||
if (InBuffer[0])
|
if (InBuffer[0])
|
||||||
{
|
{
|
||||||
PacketSize += (5 + strlen(InBuffer));
|
PacketSize += (5 + strlen(InBuffer));
|
||||||
HighestGuildID = i - 1;
|
actual_no_guilds++;
|
||||||
}
|
}
|
||||||
InBuffer += 64;
|
InBuffer += 64;
|
||||||
}
|
}
|
||||||
@ -1188,7 +1212,7 @@ namespace UF
|
|||||||
memset(OutBuffer, 0, 64);
|
memset(OutBuffer, 0, 64);
|
||||||
OutBuffer += 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)
|
for (unsigned int i = 0; i < NumberOfGuilds; ++i)
|
||||||
{
|
{
|
||||||
@ -1206,6 +1230,103 @@ namespace UF
|
|||||||
dest->FastQueuePacket(&in, ack_req);
|
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(OP_Illusion)
|
||||||
{
|
{
|
||||||
ENCODE_LENGTH_EXACT(Illusion_Struct);
|
ENCODE_LENGTH_EXACT(Illusion_Struct);
|
||||||
@ -1829,6 +1950,29 @@ namespace UF
|
|||||||
OUT(pvp);
|
OUT(pvp);
|
||||||
OUT(anon);
|
OUT(anon);
|
||||||
OUT(gm);
|
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(guildrank);
|
||||||
OUT(guildbanker);
|
OUT(guildbanker);
|
||||||
// OUT(unknown13054[12]);
|
// OUT(unknown13054[12]);
|
||||||
@ -2332,29 +2476,83 @@ namespace UF
|
|||||||
|
|
||||||
ENCODE(OP_SpawnAppearance)
|
ENCODE(OP_SpawnAppearance)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *in = *p;
|
ENCODE_LENGTH_EXACT(SpawnAppearance_Struct);
|
||||||
*p = nullptr;
|
SETUP_DIRECT_ENCODE(SpawnAppearance_Struct, structs::SpawnAppearance_Struct);
|
||||||
|
|
||||||
unsigned char *emu_buffer = in->pBuffer;
|
OUT(spawn_id);
|
||||||
|
OUT(type);
|
||||||
SpawnAppearance_Struct *sas = (SpawnAppearance_Struct *)emu_buffer;
|
OUT(parameter);
|
||||||
|
switch (emu->type) {
|
||||||
if (sas->type != AppearanceType::Size)
|
case AppearanceType::GuildRank: {
|
||||||
{
|
//Translate new ranks to old values* /
|
||||||
dest->FastQueuePacket(&in, ack_req);
|
switch (emu->parameter) {
|
||||||
return;
|
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));
|
FINISH_ENCODE();
|
||||||
ChangeSize_Struct *css = (ChangeSize_Struct *)outapp->pBuffer;
|
}
|
||||||
|
|
||||||
css->EntityID = sas->spawn_id;
|
ENCODE(OP_SetGuildRank)
|
||||||
css->Size = (float)sas->parameter;
|
{
|
||||||
css->Unknown08 = 0;
|
ENCODE_LENGTH_EXACT(GuildSetRank_Struct);
|
||||||
css->Unknown12 = 1.0f;
|
SETUP_DIRECT_ENCODE(GuildSetRank_Struct, structs::GuildSetRank_Struct);
|
||||||
|
|
||||||
dest->FastQueuePacket(&outapp, ack_req);
|
eq->unknown00 = 0;
|
||||||
delete in;
|
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)
|
ENCODE(OP_SpawnDoor)
|
||||||
@ -2945,6 +3143,29 @@ namespace UF
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildID);
|
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(uint32, Buffer, emu->guildrank);
|
||||||
}
|
}
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->class_);
|
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->class_);
|
||||||
@ -3577,6 +3798,34 @@ namespace UF
|
|||||||
DECODE_FORWARD(OP_GroupInvite);
|
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(OP_InspectRequest)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::Inspect_Struct);
|
DECODE_LENGTH_EXACT(structs::Inspect_Struct);
|
||||||
|
|||||||
@ -58,6 +58,10 @@ E(OP_GroupInvite)
|
|||||||
E(OP_GroupUpdate)
|
E(OP_GroupUpdate)
|
||||||
E(OP_GuildMemberList)
|
E(OP_GuildMemberList)
|
||||||
E(OP_GuildsList)
|
E(OP_GuildsList)
|
||||||
|
E(OP_GuildMemberAdd)
|
||||||
|
E(OP_SendGuildTributes)
|
||||||
|
E(OP_GuildMemberRankAltBanker)
|
||||||
|
E(OP_GuildTributeDonateItem)
|
||||||
E(OP_Illusion)
|
E(OP_Illusion)
|
||||||
E(OP_InspectBuffs)
|
E(OP_InspectBuffs)
|
||||||
E(OP_InspectRequest)
|
E(OP_InspectRequest)
|
||||||
@ -82,6 +86,7 @@ E(OP_RespondAA)
|
|||||||
E(OP_SendAATable)
|
E(OP_SendAATable)
|
||||||
E(OP_SendCharInfo)
|
E(OP_SendCharInfo)
|
||||||
E(OP_SendZonepoints)
|
E(OP_SendZonepoints)
|
||||||
|
E(OP_SetGuildRank)
|
||||||
E(OP_ShopPlayerBuy)
|
E(OP_ShopPlayerBuy)
|
||||||
E(OP_ShopPlayerSell)
|
E(OP_ShopPlayerSell)
|
||||||
E(OP_SomeItemPacketMaybe)
|
E(OP_SomeItemPacketMaybe)
|
||||||
@ -138,6 +143,8 @@ D(OP_GroupFollow)
|
|||||||
D(OP_GroupFollow2)
|
D(OP_GroupFollow2)
|
||||||
D(OP_GroupInvite)
|
D(OP_GroupInvite)
|
||||||
D(OP_GroupInvite2)
|
D(OP_GroupInvite2)
|
||||||
|
D(OP_GuildDemote)
|
||||||
|
D(OP_GuildTributeDonateItem)
|
||||||
D(OP_InspectRequest)
|
D(OP_InspectRequest)
|
||||||
D(OP_ItemLinkClick)
|
D(OP_ItemLinkClick)
|
||||||
D(OP_ItemVerifyRequest)
|
D(OP_ItemVerifyRequest)
|
||||||
|
|||||||
@ -1670,6 +1670,15 @@ struct Surname_Struct
|
|||||||
/*0100*/
|
/*0100*/
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct GuildSetRank_Struct
|
||||||
|
{
|
||||||
|
/*00*/ uint32 unknown00;
|
||||||
|
/*04*/ uint32 unknown04;
|
||||||
|
/*08*/ uint32 rank;
|
||||||
|
/*72*/ char member_name[64];
|
||||||
|
/*76*/ uint32 banker;
|
||||||
|
};
|
||||||
|
|
||||||
struct GuildsListEntry_Struct {
|
struct GuildsListEntry_Struct {
|
||||||
char name[64];
|
char name[64];
|
||||||
};
|
};
|
||||||
@ -1685,6 +1694,27 @@ struct GuildUpdate_Struct {
|
|||||||
GuildsListEntry_Struct entry;
|
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
|
** Money Loot
|
||||||
** Length: 22 Bytes
|
** Length: 22 Bytes
|
||||||
@ -3067,6 +3097,23 @@ struct GuildMakeLeader{
|
|||||||
char target[64];
|
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
|
struct Make_Pet_Struct { //Simple struct for getting pet info
|
||||||
uint8 level;
|
uint8 level;
|
||||||
uint8 class_;
|
uint8 class_;
|
||||||
|
|||||||
404
common/repositories/base/base_guild_bank_repository.h
Normal file
404
common/repositories/base/base_guild_bank_repository.h
Normal file
@ -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
|
||||||
416
common/repositories/base/base_guild_permissions_repository.h
Normal file
416
common/repositories/base/base_guild_permissions_repository.h
Normal file
@ -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
|
||||||
453
common/repositories/base/base_guild_tributes_repository.h
Normal file
453
common/repositories/base/base_guild_tributes_repository.h
Normal file
@ -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 "../../strings.h"
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
|
|
||||||
|
|
||||||
class BaseGuildsRepository {
|
class BaseGuildsRepository {
|
||||||
public:
|
public:
|
||||||
struct Guilds {
|
struct Guilds {
|
||||||
|
|||||||
@ -3,286 +3,47 @@
|
|||||||
|
|
||||||
#include "../database.h"
|
#include "../database.h"
|
||||||
#include "../strings.h"
|
#include "../strings.h"
|
||||||
|
#include "base/base_guild_bank_repository.h"
|
||||||
|
|
||||||
class GuildBankRepository {
|
class GuildBankRepository: public BaseGuildBankRepository {
|
||||||
public:
|
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()
|
/**
|
||||||
{
|
* This file was auto generated and can be modified and extended upon
|
||||||
return std::string("");
|
*
|
||||||
}
|
* 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()
|
// Custom extended repository methods here
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
194
common/repositories/guild_members_repository.h
Normal file
194
common/repositories/guild_members_repository.h
Normal file
@ -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
|
||||||
50
common/repositories/guild_permissions_repository.h
Normal file
50
common/repositories/guild_permissions_repository.h
Normal file
@ -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
|
// 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
|
#endif //EQEMU_GUILD_RANKS_REPOSITORY_H
|
||||||
|
|||||||
77
common/repositories/guild_tributes_repository.h
Normal file
77
common/repositories/guild_tributes_repository.h
Normal file
@ -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 "../strings.h"
|
||||||
#include "base/base_guilds_repository.h"
|
#include "base/base_guilds_repository.h"
|
||||||
|
|
||||||
class GuildsRepository: public BaseGuildsRepository {
|
class GuildsRepository : public BaseGuildsRepository {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This file was auto generated and can be modified and extended upon
|
* This file was auto generated and can be modified and extended upon
|
||||||
*
|
*
|
||||||
* Base repository methods are automatically
|
* Base repository methods are automatically
|
||||||
* generated in the "base" version of this repository. The base repository
|
* generated in the "base" version of this repository. The base repository
|
||||||
* is immutable and to be left untouched, while methods in this class
|
* is immutable and to be left untouched, while methods in this class
|
||||||
* are used as extension methods for more specific persistence-layer
|
* are used as extension methods for more specific persistence-layer
|
||||||
* accessors or mutators.
|
* accessors or mutators.
|
||||||
*
|
*
|
||||||
* Base Methods (Subject to be expanded upon in time)
|
* Base Methods (Subject to be expanded upon in time)
|
||||||
*
|
*
|
||||||
* Note: Not all tables are designed appropriately to fit functionality with all base methods
|
* Note: Not all tables are designed appropriately to fit functionality with all base methods
|
||||||
*
|
*
|
||||||
* InsertOne
|
* InsertOne
|
||||||
* UpdateOne
|
* UpdateOne
|
||||||
* DeleteOne
|
* DeleteOne
|
||||||
* FindOne
|
* FindOne
|
||||||
* GetWhere(std::string where_filter)
|
* GetWhere(std::string where_filter)
|
||||||
* DeleteWhere(std::string where_filter)
|
* DeleteWhere(std::string where_filter)
|
||||||
* InsertMany
|
* InsertMany
|
||||||
* All
|
* All
|
||||||
*
|
*
|
||||||
* Example custom methods in a repository
|
* Example custom methods in a repository
|
||||||
*
|
*
|
||||||
* GuildsRepository::GetByZoneAndVersion(int zone_id, int zone_version)
|
* GuildsRepository::GetByZoneAndVersion(int zone_id, int zone_version)
|
||||||
* GuildsRepository::GetWhereNeverExpires()
|
* GuildsRepository::GetWhereNeverExpires()
|
||||||
* GuildsRepository::GetWhereXAndY()
|
* GuildsRepository::GetWhereXAndY()
|
||||||
* GuildsRepository::DeleteWhereXAndY()
|
* GuildsRepository::DeleteWhereXAndY()
|
||||||
*
|
*
|
||||||
* Most of the above could be covered by base methods, but if you as a developer
|
* 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
|
* 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 that can be re-used easily elsewhere especially if it can use a base repository
|
||||||
* method and encapsulate filters there
|
* 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
|
#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, 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, 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, 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_END()
|
||||||
|
|
||||||
RULE_CATEGORY(Skills)
|
RULE_CATEGORY(Skills)
|
||||||
|
|||||||
@ -5,6 +5,7 @@
|
|||||||
#include "../common/packet_functions.h"
|
#include "../common/packet_functions.h"
|
||||||
#include "../common/eq_packet_structs.h"
|
#include "../common/eq_packet_structs.h"
|
||||||
#include "../common/net/packet.h"
|
#include "../common/net/packet.h"
|
||||||
|
#include "../common/guilds.h"
|
||||||
#include <cereal/cereal.hpp>
|
#include <cereal/cereal.hpp>
|
||||||
#include <cereal/archives/binary.hpp>
|
#include <cereal/archives/binary.hpp>
|
||||||
#include <cereal/types/chrono.hpp>
|
#include <cereal/types/chrono.hpp>
|
||||||
@ -94,6 +95,23 @@
|
|||||||
#define ServerOP_WebInterfaceEvent 0x0066
|
#define ServerOP_WebInterfaceEvent 0x0066
|
||||||
#define ServerOP_WebInterfaceSubscribe 0x0067
|
#define ServerOP_WebInterfaceSubscribe 0x0067
|
||||||
#define ServerOP_WebInterfaceUnsubscribe 0x0068
|
#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_RaidAdd 0x0100 //in use
|
||||||
#define ServerOP_RaidRemove 0x0101 //in use
|
#define ServerOP_RaidRemove 0x0101 //in use
|
||||||
@ -567,6 +585,8 @@ struct ServerClientList_Struct {
|
|||||||
uint8 anon;
|
uint8 anon;
|
||||||
bool tellsoff;
|
bool tellsoff;
|
||||||
uint32 guild_id;
|
uint32 guild_id;
|
||||||
|
uint32 guild_rank;
|
||||||
|
bool guild_tribute_opt_in;
|
||||||
bool LFG;
|
bool LFG;
|
||||||
uint8 gm;
|
uint8 gm;
|
||||||
uint8 ClientVersion;
|
uint8 ClientVersion;
|
||||||
@ -1006,19 +1026,34 @@ struct ServerGuildCharRefresh_Struct {
|
|||||||
uint32 char_id;
|
uint32 char_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ServerGuildRankUpdate_Struct
|
struct ServerGuildRankUpdate_Struct {
|
||||||
{
|
uint32 guild_id;
|
||||||
uint32 GuildID;
|
char member_name[64];
|
||||||
char MemberName[64];
|
uint32 rank;
|
||||||
uint32 Rank;
|
uint32 banker;
|
||||||
uint32 Banker;
|
uint32 alt;
|
||||||
|
bool no_update;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ServerGuildMemberUpdate_Struct {
|
struct ServerGuildMemberUpdate_Struct {
|
||||||
uint32 GuildID;
|
uint32 guild_id;
|
||||||
char MemberName[64];
|
char member_name[64];
|
||||||
uint32 ZoneID;
|
uint32 zone_id;
|
||||||
uint32 LastSeen;
|
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 {
|
struct SpawnPlayerCorpse_Struct {
|
||||||
@ -1857,6 +1892,47 @@ struct ServerZoneStatus_Struct {
|
|||||||
int16 admin;
|
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()
|
#pragma pack()
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -42,8 +42,7 @@
|
|||||||
* Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt
|
* 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
|
#define CURRENT_BINARY_BOTS_DATABASE_VERSION 9042
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -10,27 +10,27 @@
|
|||||||
extern WorldServer *worldserver;
|
extern WorldServer *worldserver;
|
||||||
extern QSDatabase database;
|
extern QSDatabase database;
|
||||||
|
|
||||||
PlayerLookingForGuild::PlayerLookingForGuild(char *Name, char *Comments, uint32 Level, uint32 Class, uint32 AACount, uint32 Timezone, uint32 TimePosted)
|
PlayerLookingForGuild::PlayerLookingForGuild(char *name, char *comments, uint32 level, uint32 classes, uint32 aa_count, uint32 time_zone, uint32 time_posted)
|
||||||
{
|
{
|
||||||
Name = Name;
|
Name = std::string(name);
|
||||||
Comments = Comments;
|
Comments = std::string(comments);
|
||||||
Level = Level;
|
Level = level;
|
||||||
Class = Class;
|
Class = classes;
|
||||||
AACount = AACount;
|
AACount = aa_count;
|
||||||
TimeZone = Timezone;
|
TimeZone = time_zone;
|
||||||
TimePosted = TimePosted;
|
TimePosted = time_posted;
|
||||||
}
|
}
|
||||||
|
|
||||||
GuildLookingForPlayers::GuildLookingForPlayers(char *Name, char *Comments, uint32 FromLevel, uint32 ToLevel, uint32 Classes, uint32 AACount, uint32 Timezone, uint32 TimePosted)
|
GuildLookingForPlayers::GuildLookingForPlayers(char * name, char * comments, uint32 from_level, uint32 to_level, uint32 classes, uint32 aa_count, uint32 time_zone, uint32 time_posted)
|
||||||
{
|
{
|
||||||
Name = Name;
|
Name = std::string(name);
|
||||||
Comments = Comments;
|
Comments = std::string(comments);
|
||||||
FromLevel = FromLevel;
|
FromLevel = from_level;
|
||||||
ToLevel = ToLevel;
|
ToLevel = to_level;
|
||||||
Classes = Classes;
|
Classes = classes;
|
||||||
AACount = AACount;
|
AACount = aa_count;
|
||||||
TimeZone = Timezone;
|
TimeZone = time_zone;
|
||||||
TimePosted = TimePosted;
|
TimePosted = time_posted;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LFGuildManager::LoadDatabase()
|
bool LFGuildManager::LoadDatabase()
|
||||||
|
|||||||
@ -82,7 +82,7 @@ OP_ChangeSize=0x4707
|
|||||||
OP_TributeUpdate=0x5961
|
OP_TributeUpdate=0x5961
|
||||||
OP_TributeTimer=0x073d
|
OP_TributeTimer=0x073d
|
||||||
OP_SendTributes=0x729b
|
OP_SendTributes=0x729b
|
||||||
OP_SendGuildTributes=0x1877
|
OP_RequestGuildTributes=0x4d5e
|
||||||
OP_TributeInfo=0x4254
|
OP_TributeInfo=0x4254
|
||||||
OP_Weather=0x661e
|
OP_Weather=0x661e
|
||||||
OP_ReqClientSpawn=0x35fa
|
OP_ReqClientSpawn=0x35fa
|
||||||
@ -133,16 +133,20 @@ OP_GuildManageBanker=0x3f35
|
|||||||
OP_GuildBank=0x5134
|
OP_GuildBank=0x5134
|
||||||
OP_GuildBankItemList=0x7850
|
OP_GuildBankItemList=0x7850
|
||||||
OP_SetGuildRank=0x0b9c
|
OP_SetGuildRank=0x0b9c
|
||||||
OP_GuildUpdateURLAndChannel=0x2958
|
OP_GuildUpdate=0x2958
|
||||||
OP_GuildStatus=0x7326
|
OP_GuildStatus=0x7326
|
||||||
OP_GuildCreate=0x76d9
|
OP_GuildCreate=0x76d9
|
||||||
OP_GuildMemberLevelUpdate=0x0000 # Unused?
|
OP_GuildOpenGuildWindow=0x0276
|
||||||
OP_ZoneGuildList=0x0000 # Unused?
|
OP_GuildMemberLevel=0x1bd3
|
||||||
OP_GetGuildsList=0x0000 # Unused?
|
OP_GuildMemberRankAltBanker=0x0b9c
|
||||||
OP_LFGuild=0x0000
|
OP_GuildMemberPublicNote=0x01f9
|
||||||
OP_GuildManageRemove=0x0000
|
OP_GuildMemberAdd=0x2925
|
||||||
OP_GuildManageAdd=0x0000
|
OP_GuildMemberRename=0x3b26
|
||||||
OP_GuildManageStatus=0x0000
|
OP_GuildMemberDelete=0x3141
|
||||||
|
OP_GuildMemberDetails=0x69b9
|
||||||
|
OP_GuildRenameGuild=0x61db
|
||||||
|
OP_LFGuild=0x3165
|
||||||
|
OP_GuildDeleteGuild=0x6dab
|
||||||
|
|
||||||
# GM/Guide Opcodes
|
# GM/Guide Opcodes
|
||||||
OP_GMServers=0x08c1
|
OP_GMServers=0x08c1
|
||||||
@ -476,7 +480,6 @@ OP_RecipeAutoCombine=0x40d7
|
|||||||
OP_TradeSkillCombine=0x579a
|
OP_TradeSkillCombine=0x579a
|
||||||
|
|
||||||
# Tribute Packets:
|
# Tribute Packets:
|
||||||
OP_OpenGuildTributeMaster=0x378d
|
|
||||||
OP_OpenTributeMaster=0x7666
|
OP_OpenTributeMaster=0x7666
|
||||||
OP_SelectTribute=0x79fc
|
OP_SelectTribute=0x79fc
|
||||||
OP_TributeItem=0x4f3e
|
OP_TributeItem=0x4f3e
|
||||||
@ -487,6 +490,18 @@ OP_TributeNPC=0x0000
|
|||||||
OP_GuildTributeInfo=0x0000
|
OP_GuildTributeInfo=0x0000
|
||||||
OP_OpenTributeReply=0x0000
|
OP_OpenTributeReply=0x0000
|
||||||
OP_GuildTributeStatus=0x0000
|
OP_GuildTributeStatus=0x0000
|
||||||
|
OP_GuildSaveActiveTributes=0x5f3f
|
||||||
|
OP_GuildSendActiveTributes=0x3771
|
||||||
|
OP_GuildTributeToggleReq=0x7745
|
||||||
|
OP_GuildTributeToggleReply=0x20ae
|
||||||
|
OP_GuildTributeFavorAndTimer=0x7fe0
|
||||||
|
OP_GuildTributeDonateItem=0x5bcb
|
||||||
|
OP_GuildTributeDonatePlat=0x43d2
|
||||||
|
OP_GuildSelectTribute=0x649f
|
||||||
|
OP_GuildModifyBenefits=0x34cd
|
||||||
|
OP_GuildOptInOut=0x0727
|
||||||
|
OP_SendGuildTributes=0x1877
|
||||||
|
OP_OpenGuildTributeMaster=0x49ea
|
||||||
|
|
||||||
# Adventure packets:
|
# Adventure packets:
|
||||||
OP_LeaveAdventure=0x5d18
|
OP_LeaveAdventure=0x5d18
|
||||||
|
|||||||
@ -42,6 +42,7 @@ OP_WorldLoginFailed=0x8DA7 # world->client. reject.
|
|||||||
OP_WorldLogout=0x7718 # client->world
|
OP_WorldLogout=0x7718 # client->world
|
||||||
OP_WorldLevelTooHigh=0x583b # world->client. Cancels zone in.
|
OP_WorldLevelTooHigh=0x583b # world->client. Cancels zone in.
|
||||||
OP_CharInacessable=0x436A # world->client. Cancels zone in.
|
OP_CharInacessable=0x436A # world->client. Cancels zone in.
|
||||||
|
OP_RequestGuildTributes=0x5e3a # request packet, 4 bytes
|
||||||
|
|
||||||
#Zone in opcodes
|
#Zone in opcodes
|
||||||
OP_ZoneEntry=0x7213 # ShowEQ 10/27/05
|
OP_ZoneEntry=0x7213 # ShowEQ 10/27/05
|
||||||
@ -108,13 +109,20 @@ OP_GuildInvite=0x18b7
|
|||||||
OP_GuildPublicNote=0x17a2 # ShowEQ 10/27/05
|
OP_GuildPublicNote=0x17a2 # ShowEQ 10/27/05
|
||||||
OP_GuildDelete=0x6cce
|
OP_GuildDelete=0x6cce
|
||||||
OP_GuildInviteAccept=0x61d0
|
OP_GuildInviteAccept=0x61d0
|
||||||
#OP_GuildManageRemove=0x0000
|
OP_GuildMemberPublicNote=0x17a2
|
||||||
#OP_GuildManageAdd=0x0000
|
|
||||||
#OP_GuildManageStatus=0x0000
|
|
||||||
OP_GuildManageBanker=0x3d1e
|
OP_GuildManageBanker=0x3d1e
|
||||||
OP_GuildBank=0xb4ab
|
OP_GuildBank=0xb4ab
|
||||||
OP_SetGuildRank=0x6966
|
OP_SetGuildRank=0x6966
|
||||||
OP_LFGuild=0x1858
|
OP_LFGuild=0x1858
|
||||||
|
OP_GuildMemberLevel=0x461a
|
||||||
|
OP_GuildMemberRankAltBanker=0x6966
|
||||||
|
OP_GuildMemberPublicNote=0x32cf
|
||||||
|
OP_GuildMemberAdd=0x754e
|
||||||
|
OP_GuildMemberRename=0x7c59
|
||||||
|
OP_GuildMemberDelete=0x712a
|
||||||
|
OP_GuildMemberDetails=0x0f4d
|
||||||
|
OP_GuildRenameGuild=0x4cc7
|
||||||
|
OP_GuildDeleteGuild=0x3230
|
||||||
|
|
||||||
#GM/guide opcodes
|
#GM/guide opcodes
|
||||||
OP_GMServers=0x3387 #/servers
|
OP_GMServers=0x3387 #/servers
|
||||||
@ -370,7 +378,6 @@ OP_TrackTarget=0x7085
|
|||||||
OP_TrackUnknown=0x6177 #size 0 right after OP_Track
|
OP_TrackUnknown=0x6177 #size 0 right after OP_Track
|
||||||
|
|
||||||
#Tribute Packets:
|
#Tribute Packets:
|
||||||
OP_OpenGuildTributeMaster=0x0000
|
|
||||||
OP_OpenTributeMaster=0x512e #open tribute master window
|
OP_OpenTributeMaster=0x512e #open tribute master window
|
||||||
OP_OpenTributeReply=0x27B3 #reply to open request
|
OP_OpenTributeReply=0x27B3 #reply to open request
|
||||||
OP_SelectTribute=0x625d #clicking on a tribute, and text reply
|
OP_SelectTribute=0x625d #clicking on a tribute, and text reply
|
||||||
@ -383,9 +390,20 @@ OP_TributePointUpdate=0x6463 #16 byte point packet
|
|||||||
OP_TributeUpdate=0x5639 # ShowEQ 10/27/05
|
OP_TributeUpdate=0x5639 # ShowEQ 10/27/05
|
||||||
OP_GuildTributeInfo=0x5e3d # ShowEQ 10/27/05
|
OP_GuildTributeInfo=0x5e3d # ShowEQ 10/27/05
|
||||||
OP_TributeInfo=0x152d
|
OP_TributeInfo=0x152d
|
||||||
OP_SendGuildTributes=0x5e3a # request packet, 4 bytes
|
|
||||||
OP_SendTributes=0x067a # request packet, 4 bytes, migth be backwards
|
OP_SendTributes=0x067a # request packet, 4 bytes, migth be backwards
|
||||||
# 27b3 4665
|
# 27b3 4665
|
||||||
|
OP_OpenGuildTributeMaster=0x60b6
|
||||||
|
OP_GuildSaveActiveTributes=0x12fb
|
||||||
|
OP_GuildSendActiveTributes=0x1a29
|
||||||
|
OP_GuildTributeToggleReq=0x4b98
|
||||||
|
OP_GuildTributeToggleReply=0x3312
|
||||||
|
OP_GuildTributeFavorAndTimer=0x67ea
|
||||||
|
OP_GuildTributeDonateItem=0x32c0
|
||||||
|
OP_GuildTributeDonatePlat=0x44c4
|
||||||
|
OP_GuildSelectTribute=0x704f
|
||||||
|
OP_GuildModifyBenefits=0x4eef
|
||||||
|
OP_GuildOptInOut=0x0cfc
|
||||||
|
OP_SendGuildTributes=0x5e3d
|
||||||
|
|
||||||
#Adventure packets:
|
#Adventure packets:
|
||||||
OP_LeaveAdventure=0x0c0d
|
OP_LeaveAdventure=0x0c0d
|
||||||
|
|||||||
@ -83,6 +83,7 @@ OP_SpawnAppearance=0x3e17 # V
|
|||||||
OP_ChangeSize=0x6942 #
|
OP_ChangeSize=0x6942 #
|
||||||
OP_TributeUpdate=0x684c # V
|
OP_TributeUpdate=0x684c # V
|
||||||
OP_TributeTimer=0x4895 # C
|
OP_TributeTimer=0x4895 # C
|
||||||
|
OP_RequestGuildTributes=0x6124 #
|
||||||
OP_TaskDescription=0x156c # C
|
OP_TaskDescription=0x156c # C
|
||||||
OP_TaskActivity=0x31f3 # C
|
OP_TaskActivity=0x31f3 # C
|
||||||
OP_CompletedTasks=0x687f # C
|
OP_CompletedTasks=0x687f # C
|
||||||
@ -104,7 +105,7 @@ OP_ClearBlockedBuffs=0x5570 # C
|
|||||||
OP_SendExpZonein=0x47e7 # V
|
OP_SendExpZonein=0x47e7 # V
|
||||||
OP_SendTributes=0x6bfb # V
|
OP_SendTributes=0x6bfb # V
|
||||||
OP_TributeInfo=0x5a67 # V
|
OP_TributeInfo=0x5a67 # V
|
||||||
OP_SendGuildTributes=0x4df0 # C 0x5a01
|
#OP_SendGuildTributes=0x4df0 # C 0x5a01
|
||||||
OP_AAExpUpdate=0x4aa2 # V
|
OP_AAExpUpdate=0x4aa2 # V
|
||||||
OP_ExpUpdate=0x0555 # V
|
OP_ExpUpdate=0x0555 # V
|
||||||
OP_HPUpdate=0x6145 # V
|
OP_HPUpdate=0x6145 # V
|
||||||
@ -137,16 +138,22 @@ OP_GuildPublicNote=0x2dbd # C
|
|||||||
OP_GuildManageBanker=0x1e4c # C
|
OP_GuildManageBanker=0x1e4c # C
|
||||||
OP_GuildBank=0x0d8a # C
|
OP_GuildBank=0x0d8a # C
|
||||||
OP_SetGuildRank=0x4ffe # C
|
OP_SetGuildRank=0x4ffe # C
|
||||||
OP_GuildUpdateURLAndChannel=0x5232 # C
|
OP_GuildUpdate=0x5232 # C
|
||||||
OP_GuildMemberLevelUpdate=0x0000 #
|
OP_GuildMemberLevelUpdate=0x0000 #
|
||||||
OP_ZoneGuildList=0x0000 #
|
OP_ZoneGuildList=0x0000 #
|
||||||
OP_GetGuildsList=0x0000 #
|
OP_GetGuildsList=0x0000 #
|
||||||
OP_GuildStatus=0x28c8 #
|
OP_GuildStatus=0x28c8 #
|
||||||
OP_GuildCreate=0x192d #
|
OP_GuildCreate=0x192d #
|
||||||
OP_LFGuild=0x7e23 #
|
OP_LFGuild=0x7e23 #
|
||||||
# OP_GuildManageRemove=0x0000 #
|
OP_GuildMemberLevel=0x4d4e
|
||||||
# OP_GuildManageAdd=0x0000 #
|
OP_GuildMemberRankAltBanker=0x4ffe
|
||||||
# OP_GuildManageStatus=0x0000 #
|
OP_GuildMemberPublicNote=0x526d
|
||||||
|
OP_GuildMemberAdd=0x7337
|
||||||
|
OP_GuildMemberRename=0x5fc7
|
||||||
|
OP_GuildMemberDelete=0x190c
|
||||||
|
OP_GuildMemberDetails=0x0a53
|
||||||
|
OP_GuildRenameGuild=0x480e
|
||||||
|
OP_GuildDeleteGuild=0x736
|
||||||
|
|
||||||
# GM/guide opcodes
|
# GM/guide opcodes
|
||||||
OP_GMServers=0x6989 # C
|
OP_GMServers=0x6989 # C
|
||||||
@ -480,6 +487,18 @@ OP_TributeNPC=0x0000 #
|
|||||||
OP_GuildTributeInfo=0x0000 #
|
OP_GuildTributeInfo=0x0000 #
|
||||||
OP_OpenTributeReply=0x0000 #
|
OP_OpenTributeReply=0x0000 #
|
||||||
# OP_GuildTributeStatus=0x0000 #
|
# OP_GuildTributeStatus=0x0000 #
|
||||||
|
OP_OpenGuildTributeMaster=0x4933
|
||||||
|
OP_GuildSaveActiveTributes=0x322f
|
||||||
|
OP_GuildSendActiveTributes=0x5a01 #
|
||||||
|
OP_GuildTributeToggleReq=0x7880
|
||||||
|
OP_GuildTributeToggleReply=0x7d66 #
|
||||||
|
OP_GuildTributeFavorAndTimer=0x4df0
|
||||||
|
OP_GuildTributeDonateItem=0x3683
|
||||||
|
OP_GuildTributeDonatePlat=0x5e79
|
||||||
|
OP_GuildSelectTribute=0x3bef
|
||||||
|
OP_GuildModifyBenefits=0x3a1b
|
||||||
|
OP_GuildOptInOut=0x5a6f
|
||||||
|
OP_SendGuildTributes=0x45b3
|
||||||
|
|
||||||
# Adventure packets:
|
# Adventure packets:
|
||||||
OP_LeaveAdventure=0x3ed4 # C
|
OP_LeaveAdventure=0x3ed4 # C
|
||||||
|
|||||||
@ -2387,3 +2387,45 @@ void Client::RecordPossibleHack(const std::string& message)
|
|||||||
PlayerEventLogsRepository::InsertOne(database, e);
|
PlayerEventLogsRepository::InsertOne(database, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Client::SendGuildTributeFavorAndTimer(uint32 favor, uint32 time_remaining)
|
||||||
|
{
|
||||||
|
auto cle = GetCLE();
|
||||||
|
if (!cle) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto guild = guild_mgr.GetGuildByGuildID(GetCLE()->GuildID());
|
||||||
|
if (guild) {
|
||||||
|
guild->tribute.favor = favor;
|
||||||
|
guild->tribute.time_remaining = time_remaining;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_GuildTributeFavorAndTimer, sizeof(GuildTributeFavorTimer_Struct));
|
||||||
|
auto gtsa = (GuildTributeFavorTimer_Struct *)outapp->pBuffer;
|
||||||
|
|
||||||
|
gtsa->guild_id = GetCLE()->GuildID();
|
||||||
|
gtsa->guild_favor = guild->tribute.favor;
|
||||||
|
gtsa->tribute_timer = guild->tribute.time_remaining;
|
||||||
|
gtsa->trophy_timer = 0; //not yet implemented
|
||||||
|
|
||||||
|
QueuePacket(outapp);
|
||||||
|
safe_delete(outapp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Client::SendGuildTributeOptInToggle(const GuildTributeMemberToggle *in)
|
||||||
|
{
|
||||||
|
auto outapp = new EQApplicationPacket(OP_GuildOptInOut, sizeof(GuildTributeOptInOutReply_Struct));
|
||||||
|
auto data = (GuildTributeOptInOutReply_Struct *)outapp->pBuffer;
|
||||||
|
|
||||||
|
data->guild_id = in->guild_id;
|
||||||
|
data->no_donations = in->no_donations;
|
||||||
|
data->tribute_toggle = in->tribute_toggle;
|
||||||
|
data->tribute_trophy_toggle = 0; //not yet implemented
|
||||||
|
data->time = time(nullptr);
|
||||||
|
data->command = in->command;
|
||||||
|
strn0cpy(data->player_name, in->player_name, sizeof(data->player_name));
|
||||||
|
|
||||||
|
QueuePacket(outapp);
|
||||||
|
safe_delete(outapp);
|
||||||
|
}
|
||||||
|
|||||||
@ -51,6 +51,8 @@ public:
|
|||||||
void SendLogServer();
|
void SendLogServer();
|
||||||
void SendApproveWorld();
|
void SendApproveWorld();
|
||||||
void SendPostEnterWorld();
|
void SendPostEnterWorld();
|
||||||
|
void SendGuildTributeFavorAndTimer(uint32 favor, uint32 time_remaining);
|
||||||
|
void SendGuildTributeOptInToggle(const GuildTributeMemberToggle* in);
|
||||||
|
|
||||||
inline uint32 GetIP() { return ip; }
|
inline uint32 GetIP() { return ip; }
|
||||||
inline uint16 GetPort() { return port; }
|
inline uint16 GetPort() { return port; }
|
||||||
|
|||||||
@ -223,6 +223,8 @@ void ClientListEntry::Update(ZoneServer *iZS, ServerClientList_Struct *scl, CLE_
|
|||||||
panon = scl->anon;
|
panon = scl->anon;
|
||||||
ptellsoff = scl->tellsoff;
|
ptellsoff = scl->tellsoff;
|
||||||
pguild_id = scl->guild_id;
|
pguild_id = scl->guild_id;
|
||||||
|
pguild_rank = scl->guild_rank;
|
||||||
|
pguild_tribute_opt_in = scl->guild_tribute_opt_in;
|
||||||
pLFG = scl->LFG;
|
pLFG = scl->LFG;
|
||||||
gm = scl->gm;
|
gm = scl->gm;
|
||||||
pClientVersion = scl->ClientVersion;
|
pClientVersion = scl->ClientVersion;
|
||||||
@ -280,6 +282,7 @@ void ClientListEntry::ClearVars(bool iAll)
|
|||||||
panon = 0;
|
panon = 0;
|
||||||
ptellsoff = 0;
|
ptellsoff = 0;
|
||||||
pguild_id = GUILD_NONE;
|
pguild_id = GUILD_NONE;
|
||||||
|
pguild_rank = 0;
|
||||||
pLFG = 0;
|
pLFG = 0;
|
||||||
gm = 0;
|
gm = 0;
|
||||||
pClientVersion = 0;
|
pClientVersion = 0;
|
||||||
|
|||||||
@ -95,29 +95,32 @@ public:
|
|||||||
inline void SetAdmin(uint16 iAdmin) { padmin = iAdmin; }
|
inline void SetAdmin(uint16 iAdmin) { padmin = iAdmin; }
|
||||||
|
|
||||||
// Character info
|
// Character info
|
||||||
inline ZoneServer* Server() const { return pzoneserver; }
|
inline ZoneServer *Server() const { return pzoneserver; }
|
||||||
inline void ClearServer() { pzoneserver = 0; }
|
inline void ClearServer() { pzoneserver = 0; }
|
||||||
inline uint32 CharID() const { return pcharid; }
|
inline uint32 CharID() const { return pcharid; }
|
||||||
inline const char* name() const { return pname; }
|
inline const char *name() const { return pname; }
|
||||||
inline uint32 zone() const { return pzone; }
|
inline uint32 zone() const { return pzone; }
|
||||||
inline uint16 instance() const { return pinstance; }
|
inline uint16 instance() const { return pinstance; }
|
||||||
inline uint8 level() const { return plevel; }
|
inline uint8 level() const { return plevel; }
|
||||||
inline uint8 class_() const { return pclass_; }
|
inline uint8 class_() const { return pclass_; }
|
||||||
inline uint16 race() const { return prace; }
|
inline uint16 race() const { return prace; }
|
||||||
inline uint8 Anon() { return panon; }
|
inline uint8 Anon() { return panon; }
|
||||||
inline uint8 TellsOff() const { return ptellsoff; }
|
inline uint8 TellsOff() const { return ptellsoff; }
|
||||||
inline uint32 GuildID() const { return pguild_id; }
|
inline uint32 GuildID() const { return pguild_id; }
|
||||||
inline void SetGuild(uint32 guild_id) { pguild_id = guild_id; }
|
inline uint32 GuildRank() const { return pguild_rank; }
|
||||||
inline bool LFG() const { return pLFG; }
|
inline bool GuildTributeOptIn() const { return pguild_tribute_opt_in; }
|
||||||
inline uint8 GetGM() const { return gm; }
|
inline void SetGuild(uint32 guild_id) { pguild_id = guild_id; }
|
||||||
inline void SetGM(uint8 igm) { gm = igm; }
|
inline void SetGuildTributeOptIn(bool opt) { pguild_tribute_opt_in = opt; }
|
||||||
inline void SetZone(uint32 zone) { pzone = zone; }
|
inline bool LFG() const { return pLFG; }
|
||||||
inline bool IsLocalClient() const { return plocal; }
|
inline uint8 GetGM() const { return gm; }
|
||||||
inline uint8 GetLFGFromLevel() const { return pLFGFromLevel; }
|
inline void SetGM(uint8 igm) { gm = igm; }
|
||||||
inline uint8 GetLFGToLevel() const { return pLFGToLevel; }
|
inline void SetZone(uint32 zone) { pzone = zone; }
|
||||||
inline bool GetLFGMatchFilter() const { return pLFGMatchFilter; }
|
inline bool IsLocalClient() const { return plocal; }
|
||||||
inline const char* GetLFGComments() const { return pLFGComments; }
|
inline uint8 GetLFGFromLevel() const { return pLFGFromLevel; }
|
||||||
inline uint8 GetClientVersion() { return pClientVersion; }
|
inline uint8 GetLFGToLevel() const { return pLFGToLevel; }
|
||||||
|
inline bool GetLFGMatchFilter() const { return pLFGMatchFilter; }
|
||||||
|
inline const char *GetLFGComments() const { return pLFGComments; }
|
||||||
|
inline uint8 GetClientVersion() { return pClientVersion; }
|
||||||
|
|
||||||
inline bool TellQueueFull() const { return tell_queue.size() >= RuleI(World, TellQueueSize); }
|
inline bool TellQueueFull() const { return tell_queue.size() >= RuleI(World, TellQueueSize); }
|
||||||
inline bool TellQueueEmpty() const { return tell_queue.empty(); }
|
inline bool TellQueueEmpty() const { return tell_queue.empty(); }
|
||||||
@ -160,6 +163,8 @@ private:
|
|||||||
uint8 panon{};
|
uint8 panon{};
|
||||||
uint8 ptellsoff{};
|
uint8 ptellsoff{};
|
||||||
uint32 pguild_id{};
|
uint32 pguild_id{};
|
||||||
|
uint32 pguild_rank;
|
||||||
|
bool pguild_tribute_opt_in{};
|
||||||
bool pLFG{};
|
bool pLFG{};
|
||||||
uint8 gm{};
|
uint8 gm{};
|
||||||
uint8 pClientVersion{};
|
uint8 pClientVersion{};
|
||||||
|
|||||||
@ -384,6 +384,8 @@ void ClientList::ClientUpdate(ZoneServer *zoneserver, ServerClientList_Struct *s
|
|||||||
" anon [{}]"
|
" anon [{}]"
|
||||||
" tellsoff [{}]"
|
" tellsoff [{}]"
|
||||||
" guild_id [{}]"
|
" guild_id [{}]"
|
||||||
|
" guild_rank [{}]"
|
||||||
|
" guild_tribute_opt_in [{}]"
|
||||||
" LFG [{}]"
|
" LFG [{}]"
|
||||||
" gm [{}]"
|
" gm [{}]"
|
||||||
" ClientVersion [{}]"
|
" ClientVersion [{}]"
|
||||||
@ -409,6 +411,8 @@ void ClientList::ClientUpdate(ZoneServer *zoneserver, ServerClientList_Struct *s
|
|||||||
scl->anon,
|
scl->anon,
|
||||||
scl->tellsoff,
|
scl->tellsoff,
|
||||||
scl->guild_id,
|
scl->guild_id,
|
||||||
|
scl->guild_rank,
|
||||||
|
scl->guild_tribute_opt_in,
|
||||||
scl->LFG,
|
scl->LFG,
|
||||||
scl->gm,
|
scl->gm,
|
||||||
scl->ClientVersion,
|
scl->ClientVersion,
|
||||||
@ -1577,6 +1581,8 @@ void ClientList::GetClientList(Json::Value &response)
|
|||||||
row["client_version"] = cle->GetClientVersion();
|
row["client_version"] = cle->GetClientVersion();
|
||||||
row["gm"] = cle->GetGM();
|
row["gm"] = cle->GetGM();
|
||||||
row["guild_id"] = cle->GuildID();
|
row["guild_id"] = cle->GuildID();
|
||||||
|
row["guild_rank"] = cle->GuildRank();
|
||||||
|
row["guild_tribute_opt_in"] = cle->GuildTributeOptIn();
|
||||||
row["instance"] = cle->instance();
|
row["instance"] = cle->instance();
|
||||||
row["is_local_client"] = cle->IsLocalClient();
|
row["is_local_client"] = cle->IsLocalClient();
|
||||||
row["level"] = cle->level();
|
row["level"] = cle->level();
|
||||||
@ -1667,3 +1673,97 @@ void ClientList::SendCharacterMessageID(ClientListEntry* character,
|
|||||||
|
|
||||||
character->Server()->SendPacket(pack.get());
|
character->Server()->SendPacket(pack.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ClientList::GetGuildClientList(Json::Value& response, uint32 guild_id)
|
||||||
|
{
|
||||||
|
LinkedListIterator<ClientListEntry*> Iterator(clientlist);
|
||||||
|
|
||||||
|
Iterator.Reset();
|
||||||
|
|
||||||
|
while (Iterator.MoreElements()) {
|
||||||
|
ClientListEntry* cle = Iterator.GetData();
|
||||||
|
if (cle->GuildID() != guild_id) {
|
||||||
|
Iterator.Advance();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Json::Value row;
|
||||||
|
|
||||||
|
row["account_id"] = cle->AccountID();
|
||||||
|
row["account_name"] = cle->AccountName();
|
||||||
|
row["admin"] = cle->Admin();
|
||||||
|
row["id"] = cle->GetID();
|
||||||
|
row["ip"] = cle->GetIP();
|
||||||
|
row["loginserver_account_id"] = cle->LSAccountID();
|
||||||
|
row["loginserver_id"] = cle->LSID();
|
||||||
|
row["loginserver_name"] = cle->LSName();
|
||||||
|
row["online"] = cle->Online();
|
||||||
|
row["world_admin"] = cle->WorldAdmin();
|
||||||
|
|
||||||
|
auto server = cle->Server();
|
||||||
|
if (server) {
|
||||||
|
row["server"]["client_address"] = server->GetCAddress();
|
||||||
|
row["server"]["client_local_address"] = server->GetCLocalAddress();
|
||||||
|
row["server"]["client_port"] = server->GetCPort();
|
||||||
|
row["server"]["compile_time"] = server->GetCompileTime();
|
||||||
|
row["server"]["id"] = server->GetID();
|
||||||
|
row["server"]["instance_id"] = server->GetInstanceID();
|
||||||
|
row["server"]["ip"] = server->GetIP();
|
||||||
|
row["server"]["is_booting"] = server->IsBootingUp();
|
||||||
|
row["server"]["launch_name"] = server->GetLaunchName();
|
||||||
|
row["server"]["launched_name"] = server->GetLaunchedName();
|
||||||
|
row["server"]["number_players"] = server->NumPlayers();
|
||||||
|
row["server"]["port"] = server->GetPort();
|
||||||
|
row["server"]["previous_zone_id"] = server->GetPrevZoneID();
|
||||||
|
row["server"]["static_zone"] = server->IsStaticZone();
|
||||||
|
row["server"]["uui"] = server->GetUUID();
|
||||||
|
row["server"]["zone_id"] = server->GetZoneID();
|
||||||
|
row["server"]["zone_long_name"] = server->GetZoneLongName();
|
||||||
|
row["server"]["zone_name"] = server->GetZoneName();
|
||||||
|
row["server"]["zone_os_pid"] = server->GetZoneOSProcessID();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
row["server"] = Json::Value();
|
||||||
|
}
|
||||||
|
row["anon"] = cle->Anon();
|
||||||
|
row["character_id"] = cle->CharID();
|
||||||
|
row["class"] = cle->class_();
|
||||||
|
row["client_version"] = cle->GetClientVersion();
|
||||||
|
row["gm"] = cle->GetGM();
|
||||||
|
row["guild_id"] = cle->GuildID();
|
||||||
|
row["guild_rank"] = cle->GuildRank();
|
||||||
|
row["guild_tribute_opt_in"] = cle->GuildTributeOptIn();
|
||||||
|
row["instance"] = cle->instance();
|
||||||
|
row["is_local_client"] = cle->IsLocalClient();
|
||||||
|
row["level"] = cle->level();
|
||||||
|
row["lfg"] = cle->LFG();
|
||||||
|
row["lfg_comments"] = cle->GetLFGComments();
|
||||||
|
row["lfg_from_level"] = cle->GetLFGFromLevel();
|
||||||
|
row["lfg_match_filter"] = cle->GetLFGMatchFilter();
|
||||||
|
row["lfg_to_level"] = cle->GetLFGToLevel();
|
||||||
|
row["name"] = cle->name();
|
||||||
|
row["race"] = cle->race();
|
||||||
|
row["tells_off"] = cle->TellsOff();
|
||||||
|
row["zone"] = cle->zone();
|
||||||
|
|
||||||
|
response.append(row);
|
||||||
|
|
||||||
|
Iterator.Advance();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::map<uint32, ClientListEntry *> ClientList::GetGuildClientsWithTributeOptIn(uint32 guild_id)
|
||||||
|
{
|
||||||
|
std::map<uint32, ClientListEntry *> guild_members;
|
||||||
|
|
||||||
|
LinkedListIterator<ClientListEntry *> Iterator(clientlist);
|
||||||
|
Iterator.Reset();
|
||||||
|
|
||||||
|
while (Iterator.MoreElements()) {
|
||||||
|
auto c = Iterator.GetData();
|
||||||
|
if (c->GuildID() == guild_id && c->GuildTributeOptIn()) {
|
||||||
|
guild_members.emplace(c->CharID(), c);
|
||||||
|
}
|
||||||
|
Iterator.Advance();
|
||||||
|
}
|
||||||
|
return guild_members;
|
||||||
|
}
|
||||||
|
|||||||
@ -33,7 +33,9 @@ public:
|
|||||||
|
|
||||||
void ZoneBootup(ZoneServer* zs);
|
void ZoneBootup(ZoneServer* zs);
|
||||||
void RemoveCLEReferances(ClientListEntry* cle);
|
void RemoveCLEReferances(ClientListEntry* cle);
|
||||||
|
std::map<uint32, ClientListEntry*> GetGuildClientsWithTributeOptIn(uint32 guild_id);
|
||||||
|
std::map<uint32, ClientListEntry*> GetGuildClientList(uint32 guild_id);
|
||||||
|
//Client* GetClient(uint32 char_id);
|
||||||
|
|
||||||
//from ZSList
|
//from ZSList
|
||||||
|
|
||||||
@ -65,6 +67,7 @@ public:
|
|||||||
void GetClients(const char *zone_name, std::vector<ClientListEntry *> &into);
|
void GetClients(const char *zone_name, std::vector<ClientListEntry *> &into);
|
||||||
|
|
||||||
void GetClientList(Json::Value &response);
|
void GetClientList(Json::Value &response);
|
||||||
|
void GetGuildClientList(Json::Value& response, uint32 guild_id);
|
||||||
|
|
||||||
void SendCharacterMessage(uint32_t character_id, int chat_type, const std::string& message);
|
void SendCharacterMessage(uint32_t character_id, int chat_type, const std::string& message);
|
||||||
void SendCharacterMessage(const std::string& character_name, int chat_type, const std::string& message);
|
void SendCharacterMessage(const std::string& character_name, int chat_type, const std::string& message);
|
||||||
|
|||||||
@ -27,10 +27,12 @@
|
|||||||
#include "../common/database_schema.h"
|
#include "../common/database_schema.h"
|
||||||
#include "../common/zone_store.h"
|
#include "../common/zone_store.h"
|
||||||
#include "worlddb.h"
|
#include "worlddb.h"
|
||||||
|
#include "wguild_mgr.h"
|
||||||
#include "world_config.h"
|
#include "world_config.h"
|
||||||
|
|
||||||
extern ZSList zoneserver_list;
|
extern ZSList zoneserver_list;
|
||||||
extern ClientList client_list;
|
extern ClientList client_list;
|
||||||
|
extern WorldGuildManager guild_mgr;
|
||||||
|
|
||||||
void callGetZoneList(Json::Value &response)
|
void callGetZoneList(Json::Value &response)
|
||||||
{
|
{
|
||||||
@ -277,7 +279,63 @@ void EQEmuApiWorldDataService::get(Json::Value &r, const std::vector<std::string
|
|||||||
if (m == "reload") {
|
if (m == "reload") {
|
||||||
reload(r, args);
|
reload(r, args);
|
||||||
}
|
}
|
||||||
|
if (m == "get_guild_details") {
|
||||||
|
callGetGuildDetails(r, args);
|
||||||
|
}
|
||||||
if (m == "lock_status") {
|
if (m == "lock_status") {
|
||||||
r["locked"] = WorldConfig::get()->Locked;
|
r["locked"] = WorldConfig::get()->Locked;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EQEmuApiWorldDataService::callGetGuildDetails(Json::Value &response, const std::vector<std::string> &args)
|
||||||
|
{
|
||||||
|
|
||||||
|
std::string command = !args[1].empty() ? args[1] : "";
|
||||||
|
if (command.empty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Json::Value row;
|
||||||
|
|
||||||
|
auto guild_id = Strings::ToUnsignedInt(command);
|
||||||
|
if (!guild_id) {
|
||||||
|
row = "useage is: api get_guild_details ### where ### is a valid guild id.";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto guild = guild_mgr.GetGuildByGuildID(guild_id);
|
||||||
|
if (!guild) {
|
||||||
|
row = fmt::format("Could not find guild id {}", guild_id);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
row["guild_id"] = command;
|
||||||
|
row["guild_name"] = guild->name;
|
||||||
|
row["leader_id"] = guild->leader;
|
||||||
|
row["min_status"] = guild->minstatus;
|
||||||
|
row["motd"] = guild->motd;
|
||||||
|
row["motd_setter"] = guild->motd_setter;
|
||||||
|
row["url"] = guild->url;
|
||||||
|
row["channel"] = guild->channel;
|
||||||
|
|
||||||
|
for (int i = GUILD_LEADER; i <= GUILD_RECRUIT; i++) {
|
||||||
|
row["Ranks"][i] = guild->rank_names[i].c_str();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 1; i <= GUILD_MAX_FUNCTIONS; i++) {
|
||||||
|
row["functions"][i]["db_id"] = guild->functions[i].id;
|
||||||
|
row["functions"][i]["perm_id"] = guild->functions[i].perm_id;
|
||||||
|
row["functions"][i]["guild_id"] = guild->functions[i].guild_id;
|
||||||
|
row["functions"][i]["perm_value"] = guild->functions[i].perm_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
row["tribute"]["favor"] = guild->tribute.favor;
|
||||||
|
row["tribute"]["id1"] = guild->tribute.id_1;
|
||||||
|
row["tribute"]["id1_tier"] = guild->tribute.id_1_tier;
|
||||||
|
row["tribute"]["id2"] = guild->tribute.id_2;
|
||||||
|
row["tribute"]["id2_tier"] = guild->tribute.id_2_tier;
|
||||||
|
row["tribute"]["time_remaining"] = guild->tribute.time_remaining;
|
||||||
|
row["tribute"]["enabled"] = guild->tribute.enabled;
|
||||||
|
|
||||||
|
client_list.GetGuildClientList(response, guild_id);
|
||||||
|
|
||||||
|
response.append(row);
|
||||||
|
}
|
||||||
|
|||||||
@ -28,6 +28,7 @@ public:
|
|||||||
static void get(Json::Value &r, const std::vector<std::string> &args);
|
static void get(Json::Value &r, const std::vector<std::string> &args);
|
||||||
static void reload(Json::Value &r, const std::vector<std::string> &args);
|
static void reload(Json::Value &r, const std::vector<std::string> &args);
|
||||||
static void message(Json::Value &r, const std::string &message);
|
static void message(Json::Value &r, const std::string &message);
|
||||||
|
static void callGetGuildDetails(Json::Value &response, const std::vector<std::string> &args);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -45,6 +45,7 @@
|
|||||||
#include "../common/misc.h"
|
#include "../common/misc.h"
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
#include "worlddb.h"
|
#include "worlddb.h"
|
||||||
|
#include "wguild_mgr.h"
|
||||||
|
|
||||||
#ifdef _WINDOWS
|
#ifdef _WINDOWS
|
||||||
#include <process.h>
|
#include <process.h>
|
||||||
@ -409,6 +410,7 @@ int main(int argc, char **argv)
|
|||||||
event_scheduler.Process(&zoneserver_list);
|
event_scheduler.Process(&zoneserver_list);
|
||||||
|
|
||||||
client_list.Process();
|
client_list.Process();
|
||||||
|
guild_mgr.Process();
|
||||||
|
|
||||||
if (player_event_process_timer.Check()) {
|
if (player_event_process_timer.Check()) {
|
||||||
player_event_logs.Process();
|
player_event_logs.Process();
|
||||||
|
|||||||
@ -22,17 +22,25 @@
|
|||||||
#include "../common/servertalk.h"
|
#include "../common/servertalk.h"
|
||||||
#include "clientlist.h"
|
#include "clientlist.h"
|
||||||
#include "zonelist.h"
|
#include "zonelist.h"
|
||||||
|
#include "zoneserver.h"
|
||||||
|
#include "cliententry.h"
|
||||||
|
#include "client.h"
|
||||||
|
#include "../common/repositories/guilds_repository.h"
|
||||||
|
#include "../common/repositories/guild_ranks_repository.h"
|
||||||
|
#include "../common/repositories/guild_permissions_repository.h"
|
||||||
|
#include "../common/repositories/guild_members_repository.h"
|
||||||
|
#include "../common/repositories/guild_bank_repository.h"
|
||||||
|
#include "../common/repositories/guild_tributes_repository.h"
|
||||||
|
#include "../common/repositories/tributes_repository.h"
|
||||||
|
#include "../common/repositories/tribute_levels_repository.h"
|
||||||
|
|
||||||
|
|
||||||
extern ClientList client_list;
|
extern ClientList client_list;
|
||||||
extern ZSList zoneserver_list;
|
extern ZSList zoneserver_list;
|
||||||
|
std::map<uint32, TributeData> tribute_list;
|
||||||
|
|
||||||
|
|
||||||
WorldGuildManager guild_mgr;
|
WorldGuildManager guild_mgr;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void WorldGuildManager::SendGuildRefresh(uint32 guild_id, bool name, bool motd, bool rank, bool relation) {
|
void WorldGuildManager::SendGuildRefresh(uint32 guild_id, bool name, bool motd, bool rank, bool relation) {
|
||||||
LogGuilds("Broadcasting guild refresh for [{}], changes: name=[{}], motd=[{}], rank=d, relation=[{}]", guild_id, name, motd, rank, relation);
|
LogGuilds("Broadcasting guild refresh for [{}], changes: name=[{}], motd=[{}], rank=d, relation=[{}]", guild_id, name, motd, rank, relation);
|
||||||
auto pack = new ServerPacket(ServerOP_RefreshGuild, sizeof(ServerGuildRefresh_Struct));
|
auto pack = new ServerPacket(ServerOP_RefreshGuild, sizeof(ServerGuildRefresh_Struct));
|
||||||
@ -89,14 +97,12 @@ void WorldGuildManager::ProcessZonePacket(ServerPacket *pack) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case ServerOP_GuildCharRefresh: {
|
case ServerOP_GuildCharRefresh:
|
||||||
if(pack->size != sizeof(ServerGuildCharRefresh_Struct)) {
|
{
|
||||||
LogGuilds("Received ServerOP_RefreshGuild of incorrect size [{}], expected [{}]", pack->size, sizeof(ServerGuildCharRefresh_Struct));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ServerGuildCharRefresh_Struct *s = (ServerGuildCharRefresh_Struct *) pack->pBuffer;
|
ServerGuildCharRefresh_Struct *s = (ServerGuildCharRefresh_Struct *) pack->pBuffer;
|
||||||
LogGuilds("Received and broadcasting guild member refresh for char [{}] to all zones with members of guild [{}]", s->char_id, s->guild_id);
|
LogGuilds("Received and broadcasting guild member refresh for char [{}] to all zones with members of guild [{}]", s->char_id, s->guild_id);
|
||||||
|
|
||||||
|
RefreshGuild(s->guild_id);
|
||||||
//preform the local update
|
//preform the local update
|
||||||
client_list.UpdateClientGuild(s->char_id, s->guild_id);
|
client_list.UpdateClientGuild(s->char_id, s->guild_id);
|
||||||
|
|
||||||
@ -107,41 +113,325 @@ void WorldGuildManager::ProcessZonePacket(ServerPacket *pack) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case ServerOP_DeleteGuild: {
|
case ServerOP_DeleteGuild:
|
||||||
|
{
|
||||||
if(pack->size != sizeof(ServerGuildID_Struct)) {
|
if(pack->size != sizeof(ServerGuildID_Struct)) {
|
||||||
LogGuilds("Received ServerOP_DeleteGuild of incorrect size [{}], expected [{}]", pack->size, sizeof(ServerGuildID_Struct));
|
LogGuilds("Received ServerOP_DeleteGuild of incorrect size [{}], expected [{}]", pack->size, sizeof(ServerGuildID_Struct));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ServerGuildID_Struct *s = (ServerGuildID_Struct *) pack->pBuffer;
|
ServerGuildID_Struct *s = (ServerGuildID_Struct *) pack->pBuffer;
|
||||||
|
|
||||||
|
auto res = m_guilds.find(s->guild_id);
|
||||||
|
if (res != m_guilds.end()) {
|
||||||
|
delete res->second;
|
||||||
|
m_guilds.erase(res);
|
||||||
|
}
|
||||||
|
|
||||||
LogGuilds("Received and broadcasting guild delete for guild [{}]", s->guild_id);
|
LogGuilds("Received and broadcasting guild delete for guild [{}]", s->guild_id);
|
||||||
|
|
||||||
//broadcast this packet to all zones.
|
//broadcast this packet to all zones.
|
||||||
zoneserver_list.SendPacket(pack);
|
zoneserver_list.SendPacket(pack);
|
||||||
|
|
||||||
//preform a local refresh.
|
|
||||||
if(!LocalDeleteGuild(s->guild_id)) {
|
|
||||||
LogGuilds("Unable to preform local delete on guild [{}]", s->guild_id);
|
|
||||||
//can we do anything?
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case ServerOP_GuildMemberUpdate: {
|
case ServerOP_GuildMemberUpdate:
|
||||||
|
{
|
||||||
if(pack->size != sizeof(ServerGuildMemberUpdate_Struct))
|
if(pack->size != sizeof(ServerGuildMemberUpdate_Struct))
|
||||||
{
|
{
|
||||||
LogGuilds("Received ServerOP_GuildMemberUpdate of incorrect size [{}], expected [{}]", pack->size, sizeof(ServerGuildMemberUpdate_Struct));
|
LogGuilds("Received ServerOP_GuildMemberUpdate of incorrect size [{}], expected [{}]", pack->size, sizeof(ServerGuildMemberUpdate_Struct));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto s = (ServerGuildID_Struct *)pack->pBuffer;
|
||||||
|
RefreshGuild(s->guild_id);
|
||||||
|
|
||||||
zoneserver_list.SendPacket(pack);
|
zoneserver_list.SendPacket(pack);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ServerOP_GuildPermissionUpdate:
|
||||||
|
{
|
||||||
|
if (pack->size != sizeof(ServerGuildPermissionUpdate_Struct))
|
||||||
|
{
|
||||||
|
LogGuilds("Received ServerOP_GuildPermissionUpdate of incorrect size [{}], expected [{}]", pack->size, sizeof(ServerGuildPermissionUpdate_Struct));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto sg = (ServerGuildPermissionUpdate_Struct *)pack->pBuffer;
|
||||||
|
auto guild = GetGuildByGuildID(sg->guild_id);
|
||||||
|
if (!guild) {
|
||||||
|
guild_mgr.LoadGuilds();
|
||||||
|
guild = GetGuildByGuildID(sg->guild_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (guild) {
|
||||||
|
if (sg->function_value) {
|
||||||
|
guild->functions[sg->function_id].perm_value |= (1UL << (8 - sg->rank));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
guild->functions[sg->function_id].perm_value &= ~(1UL << (8 - sg->rank));
|
||||||
|
}
|
||||||
|
|
||||||
|
LogGuilds("World Received ServerOP_GuildPermissionUpdate for guild [{}] function id {} with value of {}",
|
||||||
|
sg->guild_id,
|
||||||
|
sg->function_id,
|
||||||
|
sg->function_value
|
||||||
|
);
|
||||||
|
|
||||||
|
zoneserver_list.SendPacketToBootedZones(pack);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
LogError("World Received ServerOP_GuildPermissionUpdate for guild [{}] function id {} with value of {} but guild could not be found.",
|
||||||
|
sg->guild_id,
|
||||||
|
sg->function_id,
|
||||||
|
sg->function_value
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case ServerOP_GuildRankNameChange:
|
||||||
|
{
|
||||||
|
if (pack->size != sizeof(ServerGuildRankNameChange))
|
||||||
|
{
|
||||||
|
LogGuilds("Received ServerOP_ServerGuildRankNameChange of incorrect size [{}], expected [{}]", pack->size, sizeof(ServerGuildPermissionUpdate_Struct));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto rnc = (ServerGuildRankNameChange*)pack->pBuffer;
|
||||||
|
auto guild = GetGuildByGuildID(rnc->guild_id);
|
||||||
|
if (!guild) {
|
||||||
|
guild_mgr.LoadGuilds();
|
||||||
|
guild = GetGuildByGuildID(rnc->guild_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (guild) {
|
||||||
|
guild->rank_names[rnc->rank] = rnc->rank_name;
|
||||||
|
LogGuilds("World Received ServerOP_GuildRankNameChange from zone for guild [{}] rank id {} with new name of {}",
|
||||||
|
rnc->guild_id,
|
||||||
|
rnc->rank,
|
||||||
|
rnc->rank_name
|
||||||
|
);
|
||||||
|
zoneserver_list.SendPacketToBootedZones(pack);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
LogError("World Received ServerOP_GuildRankNameChange from zone for guild [{}] rank id {} with new name of {} but could not find guild.",
|
||||||
|
rnc->guild_id,
|
||||||
|
rnc->rank,
|
||||||
|
rnc->rank_name
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ServerOP_GuildMemberLevelUpdate:
|
||||||
|
case ServerOP_GuildMemberPublicNote:
|
||||||
|
case ServerOP_GuildChannel:
|
||||||
|
case ServerOP_GuildURL:
|
||||||
|
case ServerOP_GuildMemberRemove:
|
||||||
|
case ServerOP_GuildMemberAdd:
|
||||||
|
case ServerOP_GuildSendGuildList:
|
||||||
|
case ServerOP_GuildMembersList:
|
||||||
|
{
|
||||||
|
zoneserver_list.SendPacketToBootedZones(pack);
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
LogGuilds("Unknown packet {:#04x} received from zone??", pack->opcode);
|
LogGuilds("Unknown packet {:#04x} received from zone??", pack->opcode);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WorldGuildManager::Process()
|
||||||
|
{
|
||||||
|
for (auto &g: m_guilds) {
|
||||||
|
if (!g.second->tribute.enabled) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (g.second->tribute.enabled && !g.second->tribute.timer.Enabled()) {
|
||||||
|
g.second->tribute.timer.Start(g.second->tribute.time_remaining);
|
||||||
|
LogGuilds(
|
||||||
|
"Found a Guild Tribute Timer for guild [{}]. that was not started. Started it with [{}] time remaining before restart.",
|
||||||
|
g.first,
|
||||||
|
g.second->tribute.time_remaining
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else if (g.second->tribute.enabled && g.second->tribute.timer.Check()) {
|
||||||
|
g.second->tribute.favor -= GetGuildTributeCost(g.first);
|
||||||
|
g.second->tribute.time_remaining = RuleI(Guild, TributeTime);
|
||||||
|
g.second->tribute.timer.Start(RuleI(Guild, TributeTime));
|
||||||
|
guild_mgr.UpdateDbGuildFavor(g.first, g.second->tribute.favor);
|
||||||
|
guild_mgr.UpdateDbTributeTimeRemaining(g.first, RuleI(Guild, TributeTime));
|
||||||
|
SendGuildTributeFavorAndTimer(g.first, g.second->tribute.favor, g.second->tribute.timer.GetRemainingTime());
|
||||||
|
}
|
||||||
|
else if (g.second->tribute.send_timer &&
|
||||||
|
((g.second->tribute.timer.GetRemainingTime() / 1000) %
|
||||||
|
(RuleI(Guild, TributeTimeRefreshInterval) / 1000)) == 0 &&
|
||||||
|
!g.second->tribute.timer.Check()
|
||||||
|
) {
|
||||||
|
g.second->tribute.send_timer = false;
|
||||||
|
g.second->tribute.time_remaining = g.second->tribute.timer.GetRemainingTime();
|
||||||
|
SendGuildTributeFavorAndTimer(g.first, g.second->tribute.favor, g.second->tribute.time_remaining);
|
||||||
|
guild_mgr.UpdateDbTributeTimeRemaining(g.first, g.second->tribute.time_remaining);
|
||||||
|
LogGuilds(
|
||||||
|
"Timer Frequency [{}] ms hit sending time [{}] to guild clients",
|
||||||
|
RuleI(Guild, TributeTimeRefreshInterval),
|
||||||
|
g.second->tribute.time_remaining
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else if (!g.second->tribute.send_timer &&
|
||||||
|
((g.second->tribute.timer.GetRemainingTime() / 1000) %
|
||||||
|
(RuleI(Guild, TributeTimeRefreshInterval) / 1000)) > 0 &&
|
||||||
|
!g.second->tribute.timer.Check()
|
||||||
|
) {
|
||||||
|
g.second->tribute.send_timer = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 WorldGuildManager::GetGuildTributeCost(uint32 guild_id)
|
||||||
|
{
|
||||||
|
auto guild_members = client_list.GetGuildClientsWithTributeOptIn(guild_id);
|
||||||
|
auto total = guild_members.size();
|
||||||
|
auto total_cost = 0;
|
||||||
|
|
||||||
|
auto guild = guild_mgr.GetGuildByGuildID(guild_id);
|
||||||
|
if (guild)
|
||||||
|
{
|
||||||
|
TributeData &d1 = tribute_list[guild->tribute.id_1];
|
||||||
|
TributeData &d2 = tribute_list[guild->tribute.id_2];
|
||||||
|
uint32 cost_id1 = d1.tiers[guild->tribute.id_1_tier].cost;
|
||||||
|
uint32 cost_id2 = d2.tiers[guild->tribute.id_2_tier].cost;
|
||||||
|
uint32 level_id1 = d2.tiers[guild->tribute.id_1_tier].level;
|
||||||
|
uint32 level_id2 = d2.tiers[guild->tribute.id_2_tier].level;
|
||||||
|
|
||||||
|
for (auto const &m: guild_members) {
|
||||||
|
if (m.second->level() >= level_id1) {
|
||||||
|
total_cost += cost_id1;
|
||||||
|
}
|
||||||
|
if (m.second->level() >= level_id2) {
|
||||||
|
total_cost += cost_id2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return total_cost;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WorldGuildManager::LoadTributes()
|
||||||
|
{
|
||||||
|
TributeData td{};
|
||||||
|
td.tier_count = 0;
|
||||||
|
|
||||||
|
tribute_list.clear();
|
||||||
|
|
||||||
|
auto tributes = TributesRepository::All(*m_db);
|
||||||
|
for (auto const& t : tributes) {
|
||||||
|
td.name = t.name;
|
||||||
|
td.description = t.descr;
|
||||||
|
td.unknown = t.unknown;
|
||||||
|
td.is_guild = t.isguild == 0 ? false : true;
|
||||||
|
tribute_list[t.id] = td;
|
||||||
|
}
|
||||||
|
|
||||||
|
LogInfo("Loaded [{}] tributes", Strings::Commify(tributes.size()));
|
||||||
|
|
||||||
|
auto tribute_levels = TributeLevelsRepository::GetWhere(*m_db, "TRUE ORDER BY tribute_id, level");
|
||||||
|
|
||||||
|
for (auto const& t : tribute_levels) {
|
||||||
|
uint32 id = t.tribute_id;
|
||||||
|
|
||||||
|
if (tribute_list.count(id) != 1) {
|
||||||
|
LogError("Error in LoadTributes: unknown tribute [{}] in tribute_levels", (unsigned long)id);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
TributeData& cur = tribute_list[id];
|
||||||
|
if (cur.tier_count >= MAX_TRIBUTE_TIERS) {
|
||||||
|
LogError("Error in LoadTributes: on tribute [{}] more tiers defined than permitted", (unsigned long)id);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
TributeLevel_Struct& s = cur.tiers[cur.tier_count];
|
||||||
|
|
||||||
|
s.level = t.level;
|
||||||
|
s.cost = t.cost;
|
||||||
|
s.tribute_item_id = t.item_id;
|
||||||
|
|
||||||
|
cur.tier_count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
LogInfo("Loaded [{}] tribute levels", Strings::Commify(tribute_levels.size()));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WorldGuildManager::RefreshGuild(uint32 guild_id)
|
||||||
|
{
|
||||||
|
auto temp_guild = GetGuildByGuildID(guild_id);
|
||||||
|
BaseGuildManager::GuildInfo temp_guild_detail;
|
||||||
|
|
||||||
|
if (temp_guild) {
|
||||||
|
temp_guild_detail.tribute = temp_guild->tribute;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (guild_id <= 0) {
|
||||||
|
LogError("Requested to refresh guild id [{}] but id must be greater than 0.", guild_id);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto db_guild = GuildsRepository::FindOne(*m_db, guild_id);
|
||||||
|
if (!db_guild.id) {
|
||||||
|
LogGuilds("Guild ID [{}] not found in database.", db_guild.id);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
LogGuilds("Found guild id [{}]. Loading details.....", db_guild.id);
|
||||||
|
_CreateGuild(db_guild.id, db_guild.name, db_guild.leader, db_guild.minstatus, db_guild.motd, db_guild.motd_setter, db_guild.channel, db_guild.url, db_guild.favor);
|
||||||
|
auto guild = GetGuildByGuildID(guild_id);
|
||||||
|
auto where_filter = fmt::format("guild_id = '{}'", guild_id);
|
||||||
|
auto guild_ranks = GuildRanksRepository::GetWhere(*m_db, where_filter);
|
||||||
|
for (auto const& r : guild_ranks) {
|
||||||
|
guild->rank_names[r.rank_] = r.title;
|
||||||
|
}
|
||||||
|
|
||||||
|
where_filter = fmt::format("guild_id = '{}'", guild_id);
|
||||||
|
auto guild_permissions = GuildPermissionsRepository::GetWhere(*m_db, where_filter);
|
||||||
|
for (auto const& p : guild_permissions) {
|
||||||
|
guild->functions[p.perm_id].id = p.id;
|
||||||
|
guild->functions[p.perm_id].guild_id = p.guild_id;
|
||||||
|
guild->functions[p.perm_id].perm_id = p.perm_id;
|
||||||
|
guild->functions[p.perm_id].perm_value = p.permission;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto guild_tributes = GuildTributesRepository::FindOne(*m_db, guild_id);
|
||||||
|
if (guild_tributes.guild_id) {
|
||||||
|
guild->tribute.id_1 = guild_tributes.tribute_id_1;
|
||||||
|
guild->tribute.id_2 = guild_tributes.tribute_id_2;
|
||||||
|
guild->tribute.id_1_tier = guild_tributes.tribute_id_1_tier;
|
||||||
|
guild->tribute.id_2_tier = guild_tributes.tribute_id_2_tier;
|
||||||
|
guild->tribute.enabled = guild_tributes.enabled;
|
||||||
|
guild->tribute.time_remaining = guild_tributes.time_remaining;
|
||||||
|
}
|
||||||
|
if (temp_guild_detail.tribute.enabled == 1) {
|
||||||
|
guild->tribute = temp_guild_detail.tribute;
|
||||||
|
}
|
||||||
|
|
||||||
|
LogGuilds("Successfully refreshed guild id [{}] from the [WORLD] database", guild_id);
|
||||||
|
LogGuilds("Timer has [{}] time remaining from the [WORLD] refresh.", guild->tribute.time_remaining);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WorldGuildManager::SendGuildTributeFavorAndTimer(uint32 guild_id, uint32 favor, uint32 time)
|
||||||
|
{
|
||||||
|
auto sp = new ServerPacket(ServerOP_GuildTributeFavAndTimer, sizeof(GuildTributeFavorTimer_Struct));
|
||||||
|
auto data = (GuildTributeFavorTimer_Struct *)sp->pBuffer;
|
||||||
|
data->guild_id = guild_id;
|
||||||
|
data->guild_favor = favor;
|
||||||
|
data->tribute_timer = time;
|
||||||
|
data->trophy_timer = 0;
|
||||||
|
|
||||||
|
zoneserver_list.SendPacketToBootedZones(sp);
|
||||||
|
safe_delete(sp)
|
||||||
|
}
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
#ifndef GUILD_MGR_H_
|
#ifndef WGUILD_MGR_H_
|
||||||
#define GUILD_MGR_H_
|
#define WGUILD_MGR_H_
|
||||||
|
|
||||||
#include "../common/types.h"
|
#include "../common/types.h"
|
||||||
#include "../common/guild_base.h"
|
#include "../common/guild_base.h"
|
||||||
@ -12,6 +12,12 @@ public:
|
|||||||
|
|
||||||
//called by zoneserver when it receives a guild message from zone.
|
//called by zoneserver when it receives a guild message from zone.
|
||||||
void ProcessZonePacket(ServerPacket *pack);
|
void ProcessZonePacket(ServerPacket *pack);
|
||||||
|
void Process();
|
||||||
|
bool LoadTributes();
|
||||||
|
void SendGuildTributeFavorAndTimer(uint32 guild_id);
|
||||||
|
void SendGuildTributeFavorAndTimer(uint32 guild_id, uint32 favor, uint32 time);
|
||||||
|
uint32 GetGuildTributeCost(uint32 guild_id);
|
||||||
|
virtual bool RefreshGuild(uint32 guild_id);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void SendGuildRefresh(uint32 guild_id, bool name, bool motd, bool rank, bool relation);
|
virtual void SendGuildRefresh(uint32 guild_id, bool name, bool motd, bool rank, bool relation);
|
||||||
@ -19,11 +25,12 @@ protected:
|
|||||||
virtual void SendRankUpdate(uint32 CharID) { return; }
|
virtual void SendRankUpdate(uint32 CharID) { return; }
|
||||||
virtual void SendGuildDelete(uint32 guild_id);
|
virtual void SendGuildDelete(uint32 guild_id);
|
||||||
|
|
||||||
|
|
||||||
//map<uint32, uint32> m_tribute; //map from guild ID to current tribute ammount
|
//map<uint32, uint32> m_tribute; //map from guild ID to current tribute ammount
|
||||||
};
|
};
|
||||||
|
|
||||||
extern WorldGuildManager guild_mgr;
|
extern WorldGuildManager guild_mgr;
|
||||||
|
|
||||||
|
|
||||||
#endif /*GUILD_MGR_H_*/
|
#endif /*WGUILD_MGR_H_*/
|
||||||
|
|
||||||
|
|||||||
@ -297,6 +297,7 @@ bool WorldBoot::DatabaseLoadRoutines(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
guild_mgr.LoadGuilds();
|
guild_mgr.LoadGuilds();
|
||||||
|
guild_mgr.LoadTributes();
|
||||||
|
|
||||||
//rules:
|
//rules:
|
||||||
{
|
{
|
||||||
|
|||||||
@ -857,3 +857,15 @@ const std::list<std::unique_ptr<ZoneServer>> &ZSList::getZoneServerList() const
|
|||||||
{
|
{
|
||||||
return zone_server_list;
|
return zone_server_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ZSList::SendPacketToBootedZones(ServerPacket* pack)
|
||||||
|
{
|
||||||
|
for (auto const& z : zone_server_list) {
|
||||||
|
auto r = z.get();
|
||||||
|
if (r && r->GetZoneID() > 0) {
|
||||||
|
r->SendPacket(pack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|||||||
@ -28,6 +28,7 @@ public:
|
|||||||
bool SendPacket(ServerPacket *pack);
|
bool SendPacket(ServerPacket *pack);
|
||||||
bool SendPacket(uint32 zoneid, ServerPacket *pack);
|
bool SendPacket(uint32 zoneid, ServerPacket *pack);
|
||||||
bool SendPacket(uint32 zoneid, uint16 instanceid, ServerPacket *pack);
|
bool SendPacket(uint32 zoneid, uint16 instanceid, ServerPacket *pack);
|
||||||
|
bool SendPacketToBootedZones(ServerPacket* pack);
|
||||||
bool SetLockedZone(uint16 iZoneID, bool iLock);
|
bool SetLockedZone(uint16 iZoneID, bool iLock);
|
||||||
|
|
||||||
EQTime worldclock;
|
EQTime worldclock;
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
/* EQEMu: Everquest Server Emulator
|
/* EQEMu: Everquest Server Emulator
|
||||||
Copyright (C) 2001-2005 EQEMu Development Team (http://eqemulator.net)
|
Copyright (C) 2001-2005 EQEMu Development Team (http://eqemulator.net)
|
||||||
|
|
||||||
@ -47,6 +48,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|||||||
#include "../common/events/player_event_logs.h"
|
#include "../common/events/player_event_logs.h"
|
||||||
#include "../common/patches/patches.h"
|
#include "../common/patches/patches.h"
|
||||||
#include "../zone/data_bucket.h"
|
#include "../zone/data_bucket.h"
|
||||||
|
#include "../common/repositories/guild_tributes_repository.h"
|
||||||
|
|
||||||
extern ClientList client_list;
|
extern ClientList client_list;
|
||||||
extern GroupLFPList LFPGroupList;
|
extern GroupLFPList LFPGroupList;
|
||||||
@ -978,7 +980,18 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) {
|
|||||||
case ServerOP_DeleteGuild:
|
case ServerOP_DeleteGuild:
|
||||||
case ServerOP_GuildCharRefresh:
|
case ServerOP_GuildCharRefresh:
|
||||||
case ServerOP_GuildMemberUpdate:
|
case ServerOP_GuildMemberUpdate:
|
||||||
case ServerOP_RefreshGuild: {
|
case ServerOP_GuildPermissionUpdate:
|
||||||
|
case ServerOP_GuildRankNameChange:
|
||||||
|
case ServerOP_RefreshGuild:
|
||||||
|
case ServerOP_GuildMemberLevelUpdate:
|
||||||
|
case ServerOP_GuildMemberPublicNote:
|
||||||
|
case ServerOP_GuildChannel:
|
||||||
|
case ServerOP_GuildURL:
|
||||||
|
case ServerOP_GuildMemberRemove:
|
||||||
|
case ServerOP_GuildMemberAdd:
|
||||||
|
case ServerOP_GuildSendGuildList:
|
||||||
|
case ServerOP_GuildMembersList:
|
||||||
|
{
|
||||||
guild_mgr.ProcessZonePacket(pack);
|
guild_mgr.ProcessZonePacket(pack);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1552,6 +1565,169 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) {
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case ServerOP_GuildTributeUpdate: {
|
||||||
|
auto data = (GuildTributeUpdate *)pack->pBuffer;
|
||||||
|
auto guild = guild_mgr.GetGuildByGuildID(data->guild_id);
|
||||||
|
|
||||||
|
if (guild) {
|
||||||
|
guild->tribute.enabled = 0;
|
||||||
|
guild->tribute.id_1 = data->tribute_id_1;
|
||||||
|
guild->tribute.id_2 = data->tribute_id_2;
|
||||||
|
guild->tribute.id_1_tier = data->tribute_id_1_tier;
|
||||||
|
guild->tribute.id_2_tier = data->tribute_id_2_tier;
|
||||||
|
guild->tribute.time_remaining = RuleI(Guild, TributeTime);
|
||||||
|
|
||||||
|
guild->tribute.timer.Disable();
|
||||||
|
|
||||||
|
zoneserver_list.SendPacketToBootedZones(pack);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ServerOP_GuildTributeActivate: {
|
||||||
|
auto data = (GuildTributeUpdate *)pack->pBuffer;
|
||||||
|
auto guild = guild_mgr.GetGuildByGuildID(data->guild_id);
|
||||||
|
|
||||||
|
if (guild) {
|
||||||
|
guild->tribute.enabled = data->enabled;
|
||||||
|
|
||||||
|
if (guild->tribute.enabled) {
|
||||||
|
data->enabled = 1;
|
||||||
|
if (guild->tribute.time_remaining == RuleI(Guild, TributeTime)) {
|
||||||
|
data->favor = (guild->tribute.favor -= guild_mgr.GetGuildTributeCost(data->guild_id));
|
||||||
|
}
|
||||||
|
data->time_remaining = guild->tribute.time_remaining;
|
||||||
|
data->tribute_id_1 = guild->tribute.id_1;
|
||||||
|
data->tribute_id_2 = guild->tribute.id_2;
|
||||||
|
data->tribute_id_1_tier = guild->tribute.id_1_tier;
|
||||||
|
data->tribute_id_2_tier = guild->tribute.id_2_tier;
|
||||||
|
|
||||||
|
guild->tribute.timer.Start(guild->tribute.time_remaining);
|
||||||
|
LogInfo("Guild Tribute Timer Started.");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (guild->tribute.timer.Enabled()) {
|
||||||
|
guild->tribute.time_remaining = guild->tribute.timer.GetRemainingTime();
|
||||||
|
}
|
||||||
|
data->enabled = 0;
|
||||||
|
data->favor = guild->tribute.favor;
|
||||||
|
data->time_remaining = guild->tribute.time_remaining;
|
||||||
|
data->tribute_id_1 = guild->tribute.id_1;
|
||||||
|
data->tribute_id_2 = guild->tribute.id_2;
|
||||||
|
data->tribute_id_1_tier = guild->tribute.id_1_tier;
|
||||||
|
data->tribute_id_2_tier = guild->tribute.id_2_tier;
|
||||||
|
LogInfo("Guild Tribute Timer Stopped with {} ms remaining.", data->time_remaining);
|
||||||
|
guild->tribute.timer.Disable();
|
||||||
|
}
|
||||||
|
guild_mgr.UpdateDbGuildTributeEnabled(data->guild_id, data->enabled);
|
||||||
|
guild_mgr.UpdateDbGuildFavor(data->guild_id, data->favor);
|
||||||
|
guild_mgr.UpdateDbTributeTimeRemaining(data->guild_id, data->time_remaining);
|
||||||
|
|
||||||
|
zoneserver_list.SendPacketToBootedZones(pack);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ServerOP_GuildTributeOptInToggle:
|
||||||
|
{
|
||||||
|
auto in = (GuildTributeMemberToggle *)pack->pBuffer;
|
||||||
|
auto guild = guild_mgr.GetGuildByGuildID(in->guild_id);
|
||||||
|
auto c = client_list.FindCharacter(in->player_name);
|
||||||
|
if (c) {
|
||||||
|
c->SetGuildTributeOptIn(in->tribute_toggle ? true : false);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto cle = client_list.FindCLEByCharacterID(in->char_id);
|
||||||
|
if (cle) {
|
||||||
|
cle->SetGuildTributeOptIn(in->tribute_toggle ? true : false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (guild) {
|
||||||
|
CharGuildInfo gci;
|
||||||
|
guild_mgr.GetCharInfo(in->char_id, gci);
|
||||||
|
|
||||||
|
auto out = new ServerPacket(ServerOP_GuildTributeOptInToggle, sizeof(GuildTributeMemberToggle));
|
||||||
|
auto data = (GuildTributeMemberToggle *)out->pBuffer;
|
||||||
|
|
||||||
|
data->char_id = in->char_id;
|
||||||
|
data->command = in->command;
|
||||||
|
data->tribute_toggle = in->tribute_toggle;
|
||||||
|
data->no_donations = gci.total_tribute;
|
||||||
|
data->member_last_donated = gci.last_tribute;
|
||||||
|
data->guild_id = in->guild_id;
|
||||||
|
data->time_remaining = in->time_remaining;
|
||||||
|
strn0cpy(data->player_name, in->player_name, sizeof(data->player_name));
|
||||||
|
|
||||||
|
zoneserver_list.SendPacketToBootedZones(out);
|
||||||
|
safe_delete(out);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ServerOP_RequestGuildActiveTributes:
|
||||||
|
{
|
||||||
|
auto in = (GuildTributeUpdate *)pack->pBuffer;
|
||||||
|
auto guild = guild_mgr.GetGuildByGuildID(in->guild_id);
|
||||||
|
|
||||||
|
if (guild) {
|
||||||
|
auto sp = new ServerPacket(ServerOP_RequestGuildActiveTributes, sizeof(GuildTributeUpdate));
|
||||||
|
auto out = (GuildTributeUpdate *)sp->pBuffer;
|
||||||
|
|
||||||
|
out->guild_id = in->guild_id;
|
||||||
|
out->enabled = guild->tribute.enabled;
|
||||||
|
out->favor = guild->tribute.favor;
|
||||||
|
out->tribute_id_1 = guild->tribute.id_1;
|
||||||
|
out->tribute_id_2 = guild->tribute.id_2;
|
||||||
|
out->tribute_id_1_tier = guild->tribute.id_1_tier;
|
||||||
|
out->tribute_id_2_tier = guild->tribute.id_2_tier;
|
||||||
|
out->time_remaining = guild_mgr.GetGuildTributeTimeRemaining(in->guild_id);
|
||||||
|
|
||||||
|
zoneserver_list.SendPacketToBootedZones(sp);
|
||||||
|
safe_delete(sp);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ServerOP_RequestGuildFavorAndTimer:
|
||||||
|
{
|
||||||
|
auto in = (GuildTributeUpdate *)pack->pBuffer;
|
||||||
|
auto guild = guild_mgr.GetGuildByGuildID(in->guild_id);
|
||||||
|
|
||||||
|
if (guild) {
|
||||||
|
auto sp = new ServerPacket(ServerOP_RequestGuildFavorAndTimer, sizeof(GuildTributeFavorTimer_Struct));
|
||||||
|
auto out = (GuildTributeFavorTimer_Struct *) sp->pBuffer;
|
||||||
|
|
||||||
|
out->guild_id = in->guild_id;
|
||||||
|
out->guild_favor = guild->tribute.favor;
|
||||||
|
out->tribute_timer = guild_mgr.GetGuildTributeTimeRemaining(in->guild_id);
|
||||||
|
out->trophy_timer = 0;
|
||||||
|
|
||||||
|
zoneserver_list.SendPacketToBootedZones(sp);
|
||||||
|
safe_delete(sp);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ServerOP_GuildTributeUpdateDonations:
|
||||||
|
{
|
||||||
|
auto in = (GuildTributeUpdate*)pack->pBuffer;
|
||||||
|
auto guild = guild_mgr.GetGuildByGuildID(in->guild_id);
|
||||||
|
|
||||||
|
if (guild) {
|
||||||
|
guild->tribute.favor = in->favor;
|
||||||
|
guild_mgr.SendGuildTributeFavorAndTimer(in->guild_id, guild->tribute.favor, guild_mgr.GetGuildTributeTimeRemaining(in->guild_id)/*guild->tribute.timer.GetRemainingTime()*/);
|
||||||
|
|
||||||
|
auto sp = new ServerPacket(ServerOP_GuildTributeUpdateDonations, sizeof(GuildTributeUpdate));
|
||||||
|
auto out = (GuildTributeUpdate *) sp->pBuffer;
|
||||||
|
|
||||||
|
out->guild_id = in->guild_id;
|
||||||
|
out->member_favor = in->member_favor;
|
||||||
|
out->member_enabled = in->member_enabled ? true : false;
|
||||||
|
out->member_time = in->member_time;
|
||||||
|
strn0cpy(out->player_name, in->player_name, sizeof(out->player_name));
|
||||||
|
|
||||||
|
zoneserver_list.SendPacketToBootedZones(sp);
|
||||||
|
safe_delete(sp)
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
default: {
|
default: {
|
||||||
LogInfo("Unknown ServerOPcode from zone {:#04x}, size [{}]", pack->opcode, pack->size);
|
LogInfo("Unknown ServerOPcode from zone {:#04x}, size [{}]", pack->opcode, pack->size);
|
||||||
DumpPacket(pack->pBuffer, pack->size);
|
DumpPacket(pack->pBuffer, pack->size);
|
||||||
|
|||||||
@ -193,6 +193,17 @@ void Mob::CalcItemBonuses(StatBonuses* b) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (IsOfClientBot()) {
|
||||||
|
for (i = EQ::invslot::GUILD_TRIBUTE_BEGIN; i <= EQ::invslot::GUILD_TRIBUTE_END; i++) {
|
||||||
|
const auto* inst = GetInv().GetItem(i);
|
||||||
|
if (!inst) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
AddItemBonuses(inst, b, false, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
RuleI(Spells, AdditiveBonusWornType) &&
|
RuleI(Spells, AdditiveBonusWornType) &&
|
||||||
RuleI(Spells, AdditiveBonusWornType) != EQ::item::ItemEffectWorn
|
RuleI(Spells, AdditiveBonusWornType) != EQ::item::ItemEffectWorn
|
||||||
|
|||||||
@ -209,6 +209,7 @@ Client::Client(EQStreamInterface *ieqs) : Mob(
|
|||||||
lsaccountid = 0;
|
lsaccountid = 0;
|
||||||
guild_id = GUILD_NONE;
|
guild_id = GUILD_NONE;
|
||||||
guildrank = 0;
|
guildrank = 0;
|
||||||
|
guild_tribute_opt_in = 0;
|
||||||
GuildBanker = false;
|
GuildBanker = false;
|
||||||
memset(lskey, 0, sizeof(lskey));
|
memset(lskey, 0, sizeof(lskey));
|
||||||
strcpy(account_name, "");
|
strcpy(account_name, "");
|
||||||
@ -378,6 +379,7 @@ Client::Client(EQStreamInterface *ieqs) : Mob(
|
|||||||
SetBotPrecombat(false);
|
SetBotPrecombat(false);
|
||||||
|
|
||||||
AI_Init();
|
AI_Init();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Client::~Client() {
|
Client::~Client() {
|
||||||
@ -535,7 +537,8 @@ void Client::SendZoneInPackets()
|
|||||||
safe_delete(outapp);
|
safe_delete(outapp);
|
||||||
|
|
||||||
if (IsInAGuild()) {
|
if (IsInAGuild()) {
|
||||||
SendGuildMembers();
|
guild_mgr.UpdateDbMemberOnline(CharacterID(), true);
|
||||||
|
//SendGuildMembers();
|
||||||
SendGuildURL();
|
SendGuildURL();
|
||||||
SendGuildChannel();
|
SendGuildChannel();
|
||||||
SendGuildLFGuildStatus();
|
SendGuildLFGuildStatus();
|
||||||
@ -744,7 +747,7 @@ bool Client::Save(uint8 iCommitNow) {
|
|||||||
SetNextInvSnapshot(RuleI(Character, InvSnapshotMinRetryM));
|
SetNextInvSnapshot(RuleI(Character, InvSnapshotMinRetryM));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
database.SaveCharacterData(this, &m_pp, &m_epp); /* Save Character Data */
|
database.SaveCharacterData(this, &m_pp, &m_epp); /* Save Character Data */
|
||||||
|
|
||||||
database.SaveCharacterEXPModifier(this);
|
database.SaveCharacterEXPModifier(this);
|
||||||
@ -951,12 +954,13 @@ void Client::ChannelMessageReceived(uint8 chan_num, uint8 language, uint8 lang_s
|
|||||||
switch(chan_num)
|
switch(chan_num)
|
||||||
{
|
{
|
||||||
case ChatChannel_Guild: { /* Guild Chat */
|
case ChatChannel_Guild: { /* Guild Chat */
|
||||||
if (!IsInAGuild())
|
if (!IsInAGuild()) {
|
||||||
MessageString(Chat::DefaultText, GUILD_NOT_MEMBER2); //You are not a member of any guild.
|
MessageString(Chat::DefaultText, GUILD_NOT_MEMBER2); //You are not a member of any guild.
|
||||||
else if (!guild_mgr.CheckPermission(GuildID(), GuildRank(), GUILD_SPEAK))
|
} else if (!guild_mgr.CheckPermission(GuildID(), GuildRank(), GUILD_ACTION_GUILD_CHAT_SPEAK_IN)) {
|
||||||
Message(0, "Error: You dont have permission to speak to the guild.");
|
MessageString(Chat::EchoGuild, NO_PROPER_ACCESS);
|
||||||
else if (!worldserver.SendChannelMessage(this, targetname, chan_num, GuildID(), language, lang_skill, message))
|
} else if (!worldserver.SendChannelMessage(this, targetname, chan_num, GuildID(), language, lang_skill, message)) {
|
||||||
Message(0, "Error: World server disconnected");
|
Message(Chat::White, "Error: World server disconnected");
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ChatChannel_Group: { /* Group Chat */
|
case ChatChannel_Group: { /* Group Chat */
|
||||||
@ -1776,6 +1780,8 @@ void Client::UpdateWho(uint8 remove)
|
|||||||
s->ClientVersion = static_cast<unsigned int>(ClientVersion());
|
s->ClientVersion = static_cast<unsigned int>(ClientVersion());
|
||||||
s->tellsoff = tellsoff;
|
s->tellsoff = tellsoff;
|
||||||
s->guild_id = guild_id;
|
s->guild_id = guild_id;
|
||||||
|
s->guild_rank = guildrank;
|
||||||
|
s->guild_tribute_opt_in = guild_tribute_opt_in;
|
||||||
s->LFG = LFG;
|
s->LFG = LFG;
|
||||||
if (LFG) {
|
if (LFG) {
|
||||||
s->LFGFromLevel = LFGFromLevel;
|
s->LFGFromLevel = LFGFromLevel;
|
||||||
@ -2160,7 +2166,8 @@ void Client::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho)
|
|||||||
if (!IsInAGuild()) {
|
if (!IsInAGuild()) {
|
||||||
ns->spawn.guildrank = 0xFF;
|
ns->spawn.guildrank = 0xFF;
|
||||||
} else {
|
} else {
|
||||||
ns->spawn.guildrank = guild_mgr.GetDisplayedRank(GuildID(), GuildRank(), AccountID());
|
ns->spawn.guildrank = guild_mgr.GetDisplayedRank(GuildID(), GuildRank(), CharacterID());
|
||||||
|
ns->spawn.guild_show = guild_mgr.CheckPermission(GuildID(), GuildRank(), GUILD_ACTION_DISPLAY_GUILD_NAME);
|
||||||
}
|
}
|
||||||
ns->spawn.size = 0; // Changing size works, but then movement stops! (wth?)
|
ns->spawn.size = 0; // Changing size works, but then movement stops! (wth?)
|
||||||
ns->spawn.runspeed = (gmspeed == 0) ? runspeed : 3.125f;
|
ns->spawn.runspeed = (gmspeed == 0) ? runspeed : 3.125f;
|
||||||
@ -10178,6 +10185,7 @@ int Client::CountItem(uint32 item_id)
|
|||||||
{ EQ::invbag::GENERAL_BAGS_BEGIN, EQ::invbag::GENERAL_BAGS_END },
|
{ EQ::invbag::GENERAL_BAGS_BEGIN, EQ::invbag::GENERAL_BAGS_END },
|
||||||
{ EQ::invbag::CURSOR_BAG_BEGIN, EQ::invbag::CURSOR_BAG_END},
|
{ EQ::invbag::CURSOR_BAG_BEGIN, EQ::invbag::CURSOR_BAG_END},
|
||||||
{ EQ::invslot::BANK_BEGIN, EQ::invslot::BANK_END },
|
{ EQ::invslot::BANK_BEGIN, EQ::invslot::BANK_END },
|
||||||
|
{ EQ::invslot::GUILD_TRIBUTE_BEGIN, EQ::invslot::GUILD_TRIBUTE_END },
|
||||||
{ EQ::invbag::BANK_BAGS_BEGIN, EQ::invbag::BANK_BAGS_END },
|
{ EQ::invbag::BANK_BAGS_BEGIN, EQ::invbag::BANK_BAGS_END },
|
||||||
{ EQ::invslot::SHARED_BANK_BEGIN, EQ::invslot::SHARED_BANK_END },
|
{ EQ::invslot::SHARED_BANK_BEGIN, EQ::invslot::SHARED_BANK_END },
|
||||||
{ EQ::invbag::SHARED_BANK_BAGS_BEGIN, EQ::invbag::SHARED_BANK_BAGS_END },
|
{ EQ::invbag::SHARED_BANK_BAGS_BEGIN, EQ::invbag::SHARED_BANK_BAGS_END },
|
||||||
@ -10330,6 +10338,7 @@ void Client::RemoveItem(uint32 item_id, uint32 quantity)
|
|||||||
{ EQ::invbag::GENERAL_BAGS_BEGIN, EQ::invbag::GENERAL_BAGS_END },
|
{ EQ::invbag::GENERAL_BAGS_BEGIN, EQ::invbag::GENERAL_BAGS_END },
|
||||||
{ EQ::invbag::CURSOR_BAG_BEGIN, EQ::invbag::CURSOR_BAG_END},
|
{ EQ::invbag::CURSOR_BAG_BEGIN, EQ::invbag::CURSOR_BAG_END},
|
||||||
{ EQ::invslot::BANK_BEGIN, EQ::invslot::BANK_END },
|
{ EQ::invslot::BANK_BEGIN, EQ::invslot::BANK_END },
|
||||||
|
{ EQ::invslot::GUILD_TRIBUTE_BEGIN, EQ::invslot::GUILD_TRIBUTE_END },
|
||||||
{ EQ::invbag::BANK_BAGS_BEGIN, EQ::invbag::BANK_BAGS_END },
|
{ EQ::invbag::BANK_BAGS_BEGIN, EQ::invbag::BANK_BAGS_END },
|
||||||
{ EQ::invslot::SHARED_BANK_BEGIN, EQ::invslot::SHARED_BANK_END },
|
{ EQ::invslot::SHARED_BANK_BEGIN, EQ::invslot::SHARED_BANK_END },
|
||||||
{ EQ::invbag::SHARED_BANK_BAGS_BEGIN, EQ::invbag::SHARED_BANK_BAGS_END },
|
{ EQ::invbag::SHARED_BANK_BAGS_BEGIN, EQ::invbag::SHARED_BANK_BAGS_END },
|
||||||
|
|||||||
@ -718,8 +718,16 @@ public:
|
|||||||
|
|
||||||
inline bool IsInAGuild() const { return(guild_id != GUILD_NONE && guild_id != 0); }
|
inline bool IsInAGuild() const { return(guild_id != GUILD_NONE && guild_id != 0); }
|
||||||
inline bool IsInGuild(uint32 in_gid) const { return(in_gid == guild_id && IsInAGuild()); }
|
inline bool IsInGuild(uint32 in_gid) const { return(in_gid == guild_id && IsInAGuild()); }
|
||||||
|
inline bool GetGuildListDirty() { return guild_dirty; }
|
||||||
|
inline void SetGuildListDirty(bool state) { guild_dirty = state; }
|
||||||
inline uint32 GuildID() const { return guild_id; }
|
inline uint32 GuildID() const { return guild_id; }
|
||||||
inline uint8 GuildRank() const { return guildrank; }
|
inline uint8 GuildRank() const { return guildrank; }
|
||||||
|
inline bool GuildTributeOptIn() const { return guild_tribute_opt_in; }
|
||||||
|
void SetGuildTributeOptIn(bool state);
|
||||||
|
void SendGuildTributeDonateItemReply(GuildTributeDonateItemRequest_Struct* in, uint32 favor);
|
||||||
|
void SendGuildTributeDonatePlatReply(GuildTributeDonatePlatRequest_Struct* in, uint32 favor);
|
||||||
|
void SetGuildRank(uint32 rank);
|
||||||
|
void SetGuildID(uint32 guild_id);
|
||||||
void SendGuildMOTD(bool GetGuildMOTDReply = false);
|
void SendGuildMOTD(bool GetGuildMOTDReply = false);
|
||||||
void SendGuildURL();
|
void SendGuildURL();
|
||||||
void SendGuildChannel();
|
void SendGuildChannel();
|
||||||
@ -729,6 +737,24 @@ public:
|
|||||||
void SendGuildList();
|
void SendGuildList();
|
||||||
void SendGuildJoin(GuildJoin_Struct* gj);
|
void SendGuildJoin(GuildJoin_Struct* gj);
|
||||||
void RefreshGuildInfo();
|
void RefreshGuildInfo();
|
||||||
|
void SendGuildRankNames();
|
||||||
|
void SendGuildTributeDetails(uint32 tribute_id, uint32 tier);
|
||||||
|
void DoGuildTributeUpdate();
|
||||||
|
void SendGuildActiveTributes(uint32 guild_id);
|
||||||
|
void SendGuildFavorAndTimer(uint32 guild_id);
|
||||||
|
void SendGuildTributeOptInToggle(const GuildTributeMemberToggle* in);
|
||||||
|
void RequestGuildActiveTributes(uint32 guild_id);
|
||||||
|
void RequestGuildFavorAndTimer(uint32 guild_id);
|
||||||
|
void SendGuildMembersList();
|
||||||
|
void SendGuildMemberAdd(uint32 guild_id, uint32 level, uint32 _class, uint32 rank, uint32 guild_show, uint32 zone_id, std::string player_name);
|
||||||
|
void SendGuildMemberRename(uint32 guild_id, std::string player_name, std::string new_player_name);
|
||||||
|
void SendGuildMemberDelete(uint32 guild_id, std::string player_name);
|
||||||
|
void SendGuildMemberLevel(uint32 guild_id, uint32 level, std::string player_name);
|
||||||
|
void SendGuildMemberRankAltBanker(uint32 guild_id, uint32 rank, std::string player_name, bool alt, bool banker);
|
||||||
|
void SendGuildMemberPublicNote(uint32 guild_id, std::string player_name, std::string public_note);
|
||||||
|
void SendGuildMemberDetails(uint32 guild_id, uint32 zone_id, uint32 offline_mode, std::string player_name);
|
||||||
|
void SendGuildRenameGuild(uint32 guild_id, std::string new_guild_name);
|
||||||
|
void SendGuildDeletePacket(uint32 guild_id);
|
||||||
|
|
||||||
uint8 GetClientMaxLevel() const { return client_max_level; }
|
uint8 GetClientMaxLevel() const { return client_max_level; }
|
||||||
void SetClientMaxLevel(uint8 max_level) { client_max_level = max_level; }
|
void SetClientMaxLevel(uint8 max_level) { client_max_level = max_level; }
|
||||||
@ -1481,6 +1507,7 @@ public:
|
|||||||
void GuildBankAck();
|
void GuildBankAck();
|
||||||
void GuildBankDepositAck(bool Fail, int8 action);
|
void GuildBankDepositAck(bool Fail, int8 action);
|
||||||
inline bool IsGuildBanker() { return GuildBanker; }
|
inline bool IsGuildBanker() { return GuildBanker; }
|
||||||
|
inline void SetGuildBanker(bool banker) { GuildBanker = banker; }
|
||||||
void ClearGuildBank();
|
void ClearGuildBank();
|
||||||
void SendGroupCreatePacket();
|
void SendGroupCreatePacket();
|
||||||
void SendGroupLeaderChangePacket(const char *LeaderName);
|
void SendGroupLeaderChangePacket(const char *LeaderName);
|
||||||
@ -1782,7 +1809,9 @@ private:
|
|||||||
char lskey[30];
|
char lskey[30];
|
||||||
int16 admin;
|
int16 admin;
|
||||||
uint32 guild_id;
|
uint32 guild_id;
|
||||||
uint8 guildrank; // player's rank in the guild, 0-GUILD_MAX_RANK
|
uint8 guildrank; // player's rank in the guild, 1- Leader 8 Recruit
|
||||||
|
bool guild_tribute_opt_in;
|
||||||
|
bool guild_dirty{ true }; //used to control add/delete opcodes due to client bug in Ti thru RoF2
|
||||||
bool GuildBanker;
|
bool GuildBanker;
|
||||||
uint16 duel_target;
|
uint16 duel_target;
|
||||||
bool duelaccepted;
|
bool duelaccepted;
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -166,7 +166,14 @@
|
|||||||
void Handle_OP_GuildPublicNote(const EQApplicationPacket *app);
|
void Handle_OP_GuildPublicNote(const EQApplicationPacket *app);
|
||||||
void Handle_OP_GuildRemove(const EQApplicationPacket *app);
|
void Handle_OP_GuildRemove(const EQApplicationPacket *app);
|
||||||
void Handle_OP_GuildStatus(const EQApplicationPacket *app);
|
void Handle_OP_GuildStatus(const EQApplicationPacket *app);
|
||||||
void Handle_OP_GuildUpdateURLAndChannel(const EQApplicationPacket *app);
|
void Handle_OP_GuildTributeModifyBenefits(const EQApplicationPacket* app);
|
||||||
|
void Handle_OP_GuildTributeOptInOut(const EQApplicationPacket* app);
|
||||||
|
void Handle_OP_GuildTributeSaveActiveTributes(const EQApplicationPacket* app);
|
||||||
|
void Handle_OP_GuildTributeSelect(const EQApplicationPacket* app);
|
||||||
|
void Handle_OP_GuildTributeToggle(const EQApplicationPacket* app);
|
||||||
|
void Handle_OP_GuildUpdate(const EQApplicationPacket *app);
|
||||||
|
void Handle_OP_GuildTributeDonateItem(const EQApplicationPacket* app);
|
||||||
|
void Handle_OP_GuildTributeDonatePlat(const EQApplicationPacket* app);
|
||||||
void Handle_OP_GuildWar(const EQApplicationPacket *app);
|
void Handle_OP_GuildWar(const EQApplicationPacket *app);
|
||||||
void Handle_OP_Heartbeat(const EQApplicationPacket *app);
|
void Handle_OP_Heartbeat(const EQApplicationPacket *app);
|
||||||
void Handle_OP_Hide(const EQApplicationPacket *app);
|
void Handle_OP_Hide(const EQApplicationPacket *app);
|
||||||
|
|||||||
@ -177,6 +177,10 @@ bool Client::Process() {
|
|||||||
if (myraid) {
|
if (myraid) {
|
||||||
myraid->MemberZoned(this);
|
myraid->MemberZoned(this);
|
||||||
}
|
}
|
||||||
|
if (IsInAGuild()) {
|
||||||
|
guild_mgr.UpdateDbMemberOnline(CharacterID(), false);
|
||||||
|
guild_mgr.SendToWorldSendGuildMembersList(GuildID());
|
||||||
|
}
|
||||||
|
|
||||||
SetDynamicZoneMemberStatus(DynamicZoneMemberStatus::Offline);
|
SetDynamicZoneMemberStatus(DynamicZoneMemberStatus::Offline);
|
||||||
|
|
||||||
@ -196,6 +200,11 @@ bool Client::Process() {
|
|||||||
}
|
}
|
||||||
LeaveGroup();
|
LeaveGroup();
|
||||||
Save();
|
Save();
|
||||||
|
if (IsInAGuild()) {
|
||||||
|
guild_mgr.UpdateDbMemberOnline(CharacterID(), false);
|
||||||
|
guild_mgr.SendToWorldSendGuildMembersList(GuildID());
|
||||||
|
}
|
||||||
|
|
||||||
if (GetMerc())
|
if (GetMerc())
|
||||||
{
|
{
|
||||||
GetMerc()->Save();
|
GetMerc()->Save();
|
||||||
@ -561,6 +570,10 @@ bool Client::Process() {
|
|||||||
GetMerc()->Save();
|
GetMerc()->Save();
|
||||||
GetMerc()->Depop();
|
GetMerc()->Depop();
|
||||||
}
|
}
|
||||||
|
if (IsInAGuild()) {
|
||||||
|
guild_mgr.UpdateDbMemberOnline(CharacterID(), false);
|
||||||
|
guild_mgr.SendToWorldSendGuildMembersList(GuildID());
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else if (!linkdead_timer.Enabled()) {
|
else if (!linkdead_timer.Enabled()) {
|
||||||
|
|||||||
@ -2307,8 +2307,10 @@ void EntityList::ChannelMessageFromWorld(const char *from, const char *to,
|
|||||||
if (chan_num == ChatChannel_Guild) {
|
if (chan_num == ChatChannel_Guild) {
|
||||||
if (!client->IsInGuild(guild_id))
|
if (!client->IsInGuild(guild_id))
|
||||||
continue;
|
continue;
|
||||||
if (!guild_mgr.CheckPermission(guild_id, client->GuildRank(), GUILD_HEAR))
|
if (client->ClientVersion() >= EQ::versions::ClientVersion::RoF) {
|
||||||
continue;
|
if (!guild_mgr.CheckPermission(guild_id, client->GuildRank(), GUILD_ACTION_GUILD_CHAT_SEE))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (client->GetFilter(FilterGuildChat) == FilterHide)
|
if (client->GetFilter(FilterGuildChat) == FilterHide)
|
||||||
continue;
|
continue;
|
||||||
} else if (chan_num == ChatChannel_OOC) {
|
} else if (chan_num == ChatChannel_OOC) {
|
||||||
@ -2337,14 +2339,13 @@ void EntityList::Message(uint32 to_guilddbid, uint32 type, const char *message,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EntityList::QueueClientsGuild(Mob *sender, const EQApplicationPacket *app,
|
void EntityList::QueueClientsGuild(const EQApplicationPacket *app, uint32 guild_id)
|
||||||
bool ignore_sender, uint32 guild_id)
|
|
||||||
{
|
{
|
||||||
auto it = client_list.begin();
|
auto it = client_list.begin();
|
||||||
while (it != client_list.end()) {
|
while (it != client_list.end()) {
|
||||||
Client *client = it->second;
|
Client *client = it->second;
|
||||||
if (client->IsInGuild(guild_id))
|
if (client->IsInGuild(guild_id))
|
||||||
client->QueuePacket(app);
|
client->QueuePacket(app, true);
|
||||||
++it;
|
++it;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -240,11 +240,24 @@ public:
|
|||||||
bool IsMobInZone(Mob *who);
|
bool IsMobInZone(Mob *who);
|
||||||
void ClearClientPetitionQueue();
|
void ClearClientPetitionQueue();
|
||||||
bool CanAddHateForMob(Mob *p);
|
bool CanAddHateForMob(Mob *p);
|
||||||
void SendGuildMOTD(uint32 guild_id);
|
void SendGuildMOTD(uint32 guild_id);
|
||||||
void SendGuildSpawnAppearance(uint32 guild_id);
|
void SendGuildChannel(uint32 guild_id);
|
||||||
void SendGuildMembers(uint32 guild_id);
|
void SendGuildURL(uint32 guild_id);
|
||||||
|
void SendGuildSpawnAppearance(uint32 guild_id);
|
||||||
|
void SendGuildMembers(uint32 guild_id);
|
||||||
|
void SendGuildMembersList(uint32 guild_id);
|
||||||
|
void SendGuildMemberAdd(uint32 guild_id, uint32 level, uint32 _class, uint32 rank, uint32 spirit, uint32 zone_id, std::string player_name);
|
||||||
|
void SendGuildMemberRename(uint32 guild_id, std::string player_name, std::string new_player_name);
|
||||||
|
void SendGuildMemberRemove(uint32 guild_id, std::string player_name);
|
||||||
|
void SendGuildMemberLevel(uint32 guild_id, uint32 level, std::string player_name);
|
||||||
|
void SendGuildMemberRankAltBanker(uint32 guild_id, uint32 rank, std::string player_name, bool alt, bool banker);
|
||||||
|
void SendGuildMemberPublicNote(uint32 guild_id, std::string player_name, std::string public_note);
|
||||||
|
void SendGuildMemberDetails(uint32 guild_id, uint32 zone_id, uint32 offline_mode, std::string player_name);
|
||||||
|
void SendGuildRenameGuild(uint32 guild_id, std::string new_guild_name);
|
||||||
|
|
||||||
void RefreshAllGuildInfo(uint32 guild_id);
|
void RefreshAllGuildInfo(uint32 guild_id);
|
||||||
void SendGuildList();
|
void SendGuildList();
|
||||||
|
void GuildSetPreRoFBankerFlag(uint32 guild_id, uint32 guild_rank, bool banker_status);
|
||||||
void CheckGroupList (const char *fname, const int fline);
|
void CheckGroupList (const char *fname, const int fline);
|
||||||
void GroupProcess();
|
void GroupProcess();
|
||||||
void RaidProcess();
|
void RaidProcess();
|
||||||
@ -402,6 +415,7 @@ public:
|
|||||||
void QuestJournalledSayClose(Mob *sender, float dist, const char* mobname, const char* message, Journal::Options &opts);
|
void QuestJournalledSayClose(Mob *sender, float dist, const char* mobname, const char* message, Journal::Options &opts);
|
||||||
void GroupMessage(uint32 gid, const char *from, const char *message);
|
void GroupMessage(uint32 gid, const char *from, const char *message);
|
||||||
void ExpeditionWarning(uint32 minutes_left);
|
void ExpeditionWarning(uint32 minutes_left);
|
||||||
|
void UpdateGuildTributes(uint32 guild_id);
|
||||||
|
|
||||||
void RemoveFromTargets(Mob* mob, bool RemoveFromXTargets = false);
|
void RemoveFromTargets(Mob* mob, bool RemoveFromXTargets = false);
|
||||||
void RemoveFromTargetsFadingMemories(Mob* spell_target, bool RemoveFromXTargets = false, uint32 max_level = 0);
|
void RemoveFromTargetsFadingMemories(Mob* spell_target, bool RemoveFromXTargets = false, uint32 max_level = 0);
|
||||||
@ -411,7 +425,7 @@ public:
|
|||||||
void QueueCloseClients(Mob* sender, const EQApplicationPacket* app, bool ignore_sender=false, float distance=200, Mob* skipped_mob = 0, bool is_ack_required = true, eqFilterType filter=FilterNone);
|
void QueueCloseClients(Mob* sender, const EQApplicationPacket* app, bool ignore_sender=false, float distance=200, Mob* skipped_mob = 0, bool is_ack_required = true, eqFilterType filter=FilterNone);
|
||||||
void QueueClients(Mob* sender, const EQApplicationPacket* app, bool ignore_sender=false, bool ackreq = true);
|
void QueueClients(Mob* sender, const EQApplicationPacket* app, bool ignore_sender=false, bool ackreq = true);
|
||||||
void QueueClientsStatus(Mob* sender, const EQApplicationPacket* app, bool ignore_sender = false, uint8 minstatus = AccountStatus::Player, uint8 maxstatus = AccountStatus::Player);
|
void QueueClientsStatus(Mob* sender, const EQApplicationPacket* app, bool ignore_sender = false, uint8 minstatus = AccountStatus::Player, uint8 maxstatus = AccountStatus::Player);
|
||||||
void QueueClientsGuild(Mob* sender, const EQApplicationPacket* app, bool ignore_sender = false, uint32 guildeqid = 0);
|
void QueueClientsGuild(const EQApplicationPacket* app, uint32 guildeqid = 0);
|
||||||
void QueueClientsGuildBankItemUpdate(const GuildBankItemUpdate_Struct *gbius, uint32 GuildID);
|
void QueueClientsGuildBankItemUpdate(const GuildBankItemUpdate_Struct *gbius, uint32 GuildID);
|
||||||
void QueueClientsByTarget(Mob* sender, const EQApplicationPacket* app, bool iSendToSender = true, Mob* SkipThisMob = 0, bool ackreq = true, bool HoTT = true, uint32 ClientVersionBits = 0xFFFFFFFF, bool inspect_buffs = false, bool clear_target_window = false);
|
void QueueClientsByTarget(Mob* sender, const EQApplicationPacket* app, bool iSendToSender = true, Mob* SkipThisMob = 0, bool ackreq = true, bool HoTT = true, uint32 ClientVersionBits = 0xFFFFFFFF, bool inspect_buffs = false, bool clear_target_window = false);
|
||||||
|
|
||||||
|
|||||||
@ -969,6 +969,11 @@ void Client::SetLevel(uint8 set_level, bool command)
|
|||||||
SetPVP(true);
|
SetPVP(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (IsInAGuild()) {
|
||||||
|
guild_mgr.SendToWorldMemberLevelUpdate(GuildID(), GetLevel(), std::string(GetCleanName()));
|
||||||
|
DoGuildTributeUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
DoTributeUpdate();
|
DoTributeUpdate();
|
||||||
SendHPUpdate();
|
SendHPUpdate();
|
||||||
SetMana(CalcMaxMana());
|
SetMana(CalcMaxMana());
|
||||||
|
|||||||
@ -6,7 +6,7 @@ extern WorldServer worldserver;
|
|||||||
#include "../guild_mgr.h"
|
#include "../guild_mgr.h"
|
||||||
#include "../doors.h"
|
#include "../doors.h"
|
||||||
|
|
||||||
void command_guild(Client *c, const Seperator *sep)
|
void command_guild(Client* c, const Seperator* sep)
|
||||||
{
|
{
|
||||||
const auto arguments = sep->argnum;
|
const auto arguments = sep->argnum;
|
||||||
if (!arguments) {
|
if (!arguments) {
|
||||||
@ -30,6 +30,8 @@ void command_guild(Client *c, const Seperator *sep)
|
|||||||
bool is_set_leader = !strcasecmp(sep->arg[1], "setleader");
|
bool is_set_leader = !strcasecmp(sep->arg[1], "setleader");
|
||||||
bool is_set_rank = !strcasecmp(sep->arg[1], "setrank");
|
bool is_set_rank = !strcasecmp(sep->arg[1], "setrank");
|
||||||
bool is_status = !strcasecmp(sep->arg[1], "status");
|
bool is_status = !strcasecmp(sep->arg[1], "status");
|
||||||
|
bool is_details = !strcasecmp(sep->arg[1], "details");
|
||||||
|
bool is_test = !strcasecmp(sep->arg[1], "test");
|
||||||
if (
|
if (
|
||||||
!is_create &&
|
!is_create &&
|
||||||
!is_delete &&
|
!is_delete &&
|
||||||
@ -41,8 +43,10 @@ void command_guild(Client *c, const Seperator *sep)
|
|||||||
!is_set &&
|
!is_set &&
|
||||||
!is_set_leader &&
|
!is_set_leader &&
|
||||||
!is_set_rank &&
|
!is_set_rank &&
|
||||||
!is_status
|
!is_status &&
|
||||||
) {
|
!is_details &&
|
||||||
|
!is_test
|
||||||
|
) {
|
||||||
SendGuildSubCommands(c);
|
SendGuildSubCommands(c);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -50,12 +54,13 @@ void command_guild(Client *c, const Seperator *sep)
|
|||||||
if (is_create) {
|
if (is_create) {
|
||||||
if (arguments < 3) {
|
if (arguments < 3) {
|
||||||
c->Message(Chat::White, "Usage: #guild create [Character ID|Character Name] [Guild Name]");
|
c->Message(Chat::White, "Usage: #guild create [Character ID|Character Name] [Guild Name]");
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
auto leader_id = (
|
auto leader_id = (
|
||||||
sep->IsNumber(2) ?
|
sep->IsNumber(2) ?
|
||||||
Strings::ToUnsignedInt(sep->arg[2]) :
|
Strings::ToUnsignedInt(sep->arg[2]) :
|
||||||
database.GetCharacterID(sep->arg[2])
|
database.GetCharacterID(sep->arg[2])
|
||||||
);
|
);
|
||||||
auto leader_name = database.GetCharNameByID(leader_id);
|
auto leader_name = database.GetCharNameByID(leader_id);
|
||||||
if (!leader_id || leader_name.empty()) {
|
if (!leader_id || leader_name.empty()) {
|
||||||
c->Message(
|
c->Message(
|
||||||
@ -80,7 +85,8 @@ void command_guild(Client *c, const Seperator *sep)
|
|||||||
guild_id
|
guild_id
|
||||||
).c_str()
|
).c_str()
|
||||||
);
|
);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
auto guild_name = sep->argplus[3];
|
auto guild_name = sep->argplus[3];
|
||||||
auto guild_id = guild_mgr.CreateGuild(sep->argplus[3], leader_id);
|
auto guild_id = guild_mgr.CreateGuild(sep->argplus[3], leader_id);
|
||||||
|
|
||||||
@ -94,7 +100,8 @@ void command_guild(Client *c, const Seperator *sep)
|
|||||||
|
|
||||||
if (guild_id == GUILD_NONE) {
|
if (guild_id == GUILD_NONE) {
|
||||||
c->Message(Chat::White, "Guild creation failed.");
|
c->Message(Chat::White, "Guild creation failed.");
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
c->Message(
|
c->Message(
|
||||||
Chat::White,
|
Chat::White,
|
||||||
fmt::format(
|
fmt::format(
|
||||||
@ -123,10 +130,12 @@ void command_guild(Client *c, const Seperator *sep)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (is_delete) {
|
}
|
||||||
|
else if (is_delete) {
|
||||||
if (!sep->IsNumber(2)) {
|
if (!sep->IsNumber(2)) {
|
||||||
c->Message(Chat::White, "Usage: #guild delete [Guild ID]");
|
c->Message(Chat::White, "Usage: #guild delete [Guild ID]");
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
auto guild_id = Strings::ToUnsignedInt(sep->arg[2]);
|
auto guild_id = Strings::ToUnsignedInt(sep->arg[2]);
|
||||||
if (!guild_mgr.GuildExists(guild_id)) {
|
if (!guild_mgr.GuildExists(guild_id)) {
|
||||||
c->Message(
|
c->Message(
|
||||||
@ -156,12 +165,15 @@ void command_guild(Client *c, const Seperator *sep)
|
|||||||
).c_str()
|
).c_str()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} else if (is_help) {
|
}
|
||||||
|
else if (is_help) {
|
||||||
SendGuildSubCommands(c);
|
SendGuildSubCommands(c);
|
||||||
} else if (is_info) {
|
}
|
||||||
|
else if (is_info) {
|
||||||
if (arguments != 2 && c->IsInAGuild()) {
|
if (arguments != 2 && c->IsInAGuild()) {
|
||||||
c->Message(Chat::White, "#guild info [Guild ID]");
|
c->Message(Chat::White, "#guild info [Guild ID]");
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
auto guild_id = GUILD_NONE;
|
auto guild_id = GUILD_NONE;
|
||||||
if (sep->IsNumber(2)) {
|
if (sep->IsNumber(2)) {
|
||||||
guild_id = Strings::ToUnsignedInt(sep->arg[2]);
|
guild_id = Strings::ToUnsignedInt(sep->arg[2]);
|
||||||
@ -171,12 +183,15 @@ void command_guild(Client *c, const Seperator *sep)
|
|||||||
guild_mgr.DescribeGuild(c, guild_id);
|
guild_mgr.DescribeGuild(c, guild_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (is_list) {
|
}
|
||||||
|
else if (is_list) {
|
||||||
guild_mgr.ListGuilds(c, std::string());
|
guild_mgr.ListGuilds(c, std::string());
|
||||||
} else if (is_rename) {
|
}
|
||||||
|
else if (is_rename) {
|
||||||
if (!sep->IsNumber(2)) {
|
if (!sep->IsNumber(2)) {
|
||||||
c->Message(Chat::White, "Usage: #guild rename [Guild ID] [New Guild Name]");
|
c->Message(Chat::White, "Usage: #guild rename [Guild ID] [New Guild Name]");
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
auto guild_id = Strings::ToUnsignedInt(sep->arg[2]);
|
auto guild_id = Strings::ToUnsignedInt(sep->arg[2]);
|
||||||
if (!guild_mgr.GuildExists(guild_id)) {
|
if (!guild_mgr.GuildExists(guild_id)) {
|
||||||
c->Message(
|
c->Message(
|
||||||
@ -208,28 +223,33 @@ void command_guild(Client *c, const Seperator *sep)
|
|||||||
).c_str()
|
).c_str()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} else if (is_search) {
|
}
|
||||||
|
else if (is_search) {
|
||||||
if (Strings::IsNumber(sep->arg[2])) {
|
if (Strings::IsNumber(sep->arg[2])) {
|
||||||
const auto guild_id = Strings::ToUnsignedInt(sep->arg[2]);
|
const auto guild_id = Strings::ToUnsignedInt(sep->arg[2]);
|
||||||
|
|
||||||
guild_mgr.ListGuilds(c, guild_id);
|
guild_mgr.ListGuilds(c, guild_id);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
const std::string search_criteria = sep->argplus[2];
|
const std::string search_criteria = sep->argplus[2];
|
||||||
|
|
||||||
guild_mgr.ListGuilds(c, search_criteria);
|
guild_mgr.ListGuilds(c, search_criteria);
|
||||||
}
|
}
|
||||||
} else if (is_set) {
|
}
|
||||||
|
else if (is_set) {
|
||||||
if (
|
if (
|
||||||
arguments != 3 ||
|
arguments != 3 ||
|
||||||
!sep->IsNumber(3)
|
!sep->IsNumber(3)
|
||||||
) {
|
) {
|
||||||
c->Message(Chat::White, "#guild set [Character ID|Character Name] [Guild ID] (Guild ID 0 is Guildless)");
|
c->Message(Chat::White, "#guild set [Character ID|Character Name] [Guild ID] (Guild ID 0 is Guildless)");
|
||||||
return;
|
return;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
auto guild_id = Strings::ToUnsignedInt(sep->arg[3]);
|
auto guild_id = Strings::ToUnsignedInt(sep->arg[3]);
|
||||||
if (!guild_id) {
|
if (!guild_id) {
|
||||||
guild_id = GUILD_NONE;
|
guild_id = GUILD_NONE;
|
||||||
} else if (!guild_mgr.GuildExists(guild_id)) {
|
}
|
||||||
|
else if (!guild_mgr.GuildExists(guild_id)) {
|
||||||
c->Message(
|
c->Message(
|
||||||
Chat::White,
|
Chat::White,
|
||||||
fmt::format(
|
fmt::format(
|
||||||
@ -244,7 +264,7 @@ void command_guild(Client *c, const Seperator *sep)
|
|||||||
sep->IsNumber(2) ?
|
sep->IsNumber(2) ?
|
||||||
Strings::ToUnsignedInt(sep->arg[2]) :
|
Strings::ToUnsignedInt(sep->arg[2]) :
|
||||||
database.GetCharacterID(sep->arg[2])
|
database.GetCharacterID(sep->arg[2])
|
||||||
);
|
);
|
||||||
auto character_name = database.GetCharNameByID(character_id);
|
auto character_name = database.GetCharNameByID(character_id);
|
||||||
if (!character_id || character_name.empty()) {
|
if (!character_id || character_name.empty()) {
|
||||||
c->Message(
|
c->Message(
|
||||||
@ -264,7 +284,8 @@ void command_guild(Client *c, const Seperator *sep)
|
|||||||
character_name,
|
character_name,
|
||||||
character_id
|
character_id
|
||||||
);
|
);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
LogGuilds(
|
LogGuilds(
|
||||||
"[{}]: Putting [{}] ([{}]) into guild [{}] ([{}]) with GM command",
|
"[{}]: Putting [{}] ([{}]) into guild [{}] ([{}]) with GM command",
|
||||||
c->GetName(),
|
c->GetName(),
|
||||||
@ -287,7 +308,8 @@ void command_guild(Client *c, const Seperator *sep)
|
|||||||
guild_id
|
guild_id
|
||||||
).c_str()
|
).c_str()
|
||||||
);
|
);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
guild_mgr.SetGuild(character_id, GUILD_NONE, 0);
|
guild_mgr.SetGuild(character_id, GUILD_NONE, 0);
|
||||||
c->Message(
|
c->Message(
|
||||||
Chat::White,
|
Chat::White,
|
||||||
@ -299,18 +321,20 @@ void command_guild(Client *c, const Seperator *sep)
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (is_set_leader) {
|
}
|
||||||
|
else if (is_set_leader) {
|
||||||
if (
|
if (
|
||||||
arguments != 3 ||
|
arguments != 3 ||
|
||||||
!sep->IsNumber(2)
|
!sep->IsNumber(2)
|
||||||
) {
|
) {
|
||||||
c->Message(Chat::White, "Usage: #guild setleader [Guild ID] [Character ID|Character Name]");
|
c->Message(Chat::White, "Usage: #guild setleader [Guild ID] [Character ID|Character Name]");
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
auto leader_id = (
|
auto leader_id = (
|
||||||
sep->IsNumber(2) ?
|
sep->IsNumber(2) ?
|
||||||
Strings::ToUnsignedInt(sep->arg[2]) :
|
Strings::ToUnsignedInt(sep->arg[2]) :
|
||||||
database.GetCharacterID(sep->arg[2])
|
database.GetCharacterID(sep->arg[2])
|
||||||
);
|
);
|
||||||
auto leader_name = database.GetCharNameByID(leader_id);
|
auto leader_name = database.GetCharNameByID(leader_id);
|
||||||
if (!leader_id || leader_name.empty()) {
|
if (!leader_id || leader_name.empty()) {
|
||||||
c->Message(
|
c->Message(
|
||||||
@ -368,11 +392,13 @@ void command_guild(Client *c, const Seperator *sep)
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (is_set_rank) {
|
}
|
||||||
|
else if (is_set_rank) {
|
||||||
auto rank = static_cast<uint8>(Strings::ToUnsignedInt(sep->arg[3]));
|
auto rank = static_cast<uint8>(Strings::ToUnsignedInt(sep->arg[3]));
|
||||||
if (!sep->IsNumber(3)) {
|
if (!sep->IsNumber(3)) {
|
||||||
c->Message(Chat::White, "#guild setrank [Character ID|Character Name] [Rank]");
|
c->Message(Chat::White, "#guild setrank [Character ID|Character Name] [Rank]");
|
||||||
} else if (rank < 0 || rank > GUILD_MAX_RANK) {
|
}
|
||||||
|
else if (rank < 0 || rank > GUILD_MAX_RANK) {
|
||||||
c->Message(
|
c->Message(
|
||||||
Chat::White,
|
Chat::White,
|
||||||
fmt::format(
|
fmt::format(
|
||||||
@ -380,12 +406,13 @@ void command_guild(Client *c, const Seperator *sep)
|
|||||||
GUILD_MAX_RANK
|
GUILD_MAX_RANK
|
||||||
).c_str()
|
).c_str()
|
||||||
);
|
);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
auto character_id = (
|
auto character_id = (
|
||||||
sep->IsNumber(2) ?
|
sep->IsNumber(2) ?
|
||||||
Strings::ToUnsignedInt(sep->arg[2]) :
|
Strings::ToUnsignedInt(sep->arg[2]) :
|
||||||
database.GetCharacterID(sep->arg[2])
|
database.GetCharacterID(sep->arg[2])
|
||||||
);
|
);
|
||||||
auto character_name = database.GetCharNameByID(character_id);
|
auto character_name = database.GetCharNameByID(character_id);
|
||||||
if (!character_id || character_name.empty()) {
|
if (!character_id || character_name.empty()) {
|
||||||
c->Message(
|
c->Message(
|
||||||
@ -430,7 +457,8 @@ void command_guild(Client *c, const Seperator *sep)
|
|||||||
).c_str()
|
).c_str()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} else if (is_status) {
|
}
|
||||||
|
else if (is_status) {
|
||||||
auto client = (
|
auto client = (
|
||||||
t ?
|
t ?
|
||||||
t :
|
t :
|
||||||
@ -438,11 +466,12 @@ void command_guild(Client *c, const Seperator *sep)
|
|||||||
arguments == 2 ?
|
arguments == 2 ?
|
||||||
entity_list.GetClientByName(sep->arg[2]) :
|
entity_list.GetClientByName(sep->arg[2]) :
|
||||||
c
|
c
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
if (!client) {
|
if (!client) {
|
||||||
c->Message(Chat::White, "You must target someone or specify a character name.");
|
c->Message(Chat::White, "You must target someone or specify a character name.");
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
if (!client->IsInAGuild()) {
|
if (!client->IsInAGuild()) {
|
||||||
c->Message(
|
c->Message(
|
||||||
Chat::White,
|
Chat::White,
|
||||||
@ -452,7 +481,8 @@ void command_guild(Client *c, const Seperator *sep)
|
|||||||
c == t ? "are" : "is"
|
c == t ? "are" : "is"
|
||||||
).c_str()
|
).c_str()
|
||||||
);
|
);
|
||||||
} else if (guild_mgr.IsGuildLeader(client->GuildID(), client->CharacterID())) {
|
}
|
||||||
|
else if (guild_mgr.IsGuildLeader(client->GuildID(), client->CharacterID())) {
|
||||||
c->Message(
|
c->Message(
|
||||||
Chat::White,
|
Chat::White,
|
||||||
fmt::format(
|
fmt::format(
|
||||||
@ -462,7 +492,8 @@ void command_guild(Client *c, const Seperator *sep)
|
|||||||
guild_mgr.GetGuildNameByID(client->GuildID())
|
guild_mgr.GetGuildNameByID(client->GuildID())
|
||||||
).c_str()
|
).c_str()
|
||||||
);
|
);
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
c->Message(
|
c->Message(
|
||||||
Chat::White,
|
Chat::White,
|
||||||
fmt::format(
|
fmt::format(
|
||||||
@ -476,12 +507,109 @@ void command_guild(Client *c, const Seperator *sep)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (is_details) {
|
||||||
|
if (!sep->IsNumber(2)) {
|
||||||
|
c->Message(Chat::White, "Usage: #guild details [Guild ID]");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
auto guild_id = Strings::ToUnsignedInt(sep->arg[2]);
|
||||||
|
if (!guild_mgr.GuildExists(guild_id)) {
|
||||||
|
c->Message(
|
||||||
|
Chat::White,
|
||||||
|
fmt::format(
|
||||||
|
"Guild ID {} could not be found.",
|
||||||
|
guild_id
|
||||||
|
).c_str()
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto guild = guild_mgr.GetGuildByGuildID(guild_id);
|
||||||
|
if (!guild) {
|
||||||
|
c->Message(
|
||||||
|
Chat::Yellow,
|
||||||
|
fmt::format(
|
||||||
|
"Guild {} not found. #guild list can be used to get guild ids.",
|
||||||
|
guild_id
|
||||||
|
).c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (guild) {
|
||||||
|
c->Message(Chat::Yellow, fmt::format("Guild ID: {}.", sep->arg[2]).c_str());
|
||||||
|
c->Message(Chat::Yellow, fmt::format("Guild Name: {}.", guild->name.c_str()).c_str());
|
||||||
|
c->Message(Chat::Yellow, fmt::format("Guild Leader ID: {}.", guild->leader).c_str());
|
||||||
|
c->Message(Chat::Yellow, fmt::format("Guild MinStatus: {}.", guild->minstatus).c_str());
|
||||||
|
c->Message(Chat::Yellow, fmt::format("Guild MOTD: {}.", guild->motd.c_str()).c_str());
|
||||||
|
c->Message(Chat::Yellow, fmt::format("Guild MOTD Setter:{}.", guild->motd_setter.c_str()).c_str());
|
||||||
|
c->Message(Chat::Yellow, fmt::format("Guild Channel: {}.", guild->channel.c_str()).c_str());
|
||||||
|
c->Message(Chat::Yellow, fmt::format("Guild URL: {}.", guild->url.c_str()).c_str());
|
||||||
|
|
||||||
|
for (int i = 1; i <= GUILD_MAX_RANK; i++) {
|
||||||
|
c->Message(
|
||||||
|
Chat::Yellow,
|
||||||
|
fmt::format("Guild Rank: {} - {}.", i, guild->rank_names[i].c_str()).c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
c->Message(Chat::Yellow, "Guild Functions: {db_id} - {guild_id} - {perm_id} - {perm_value}.");
|
||||||
|
for (int i = 1; i <= GUILD_MAX_FUNCTIONS; i++) {
|
||||||
|
c->Message(
|
||||||
|
Chat::Yellow, fmt::format(
|
||||||
|
"Guild Function: {} - {} - {} - {}.",
|
||||||
|
guild->functions[i].id,
|
||||||
|
guild->functions[i].guild_id,
|
||||||
|
guild->functions[i].perm_id,
|
||||||
|
guild->functions[i].perm_value
|
||||||
|
).c_str());
|
||||||
|
}
|
||||||
|
c->Message(Chat::Yellow, fmt::format("Guild Tribute: Favor {}", guild->tribute.favor).c_str());
|
||||||
|
c->Message(
|
||||||
|
Chat::Yellow, fmt::format(
|
||||||
|
"Guild Tribute: Tribute 1 {}/{} - Tribute 2 {}/{}",
|
||||||
|
guild->tribute.id_1,
|
||||||
|
guild->tribute.id_1_tier,
|
||||||
|
guild->tribute.id_2,
|
||||||
|
guild->tribute.id_2_tier
|
||||||
|
).c_str());
|
||||||
|
c->Message(
|
||||||
|
Chat::Yellow, fmt::format(
|
||||||
|
"Guild Tribute: Time Remaining {} - Enabled {}",
|
||||||
|
guild->tribute.time_remaining,
|
||||||
|
guild->tribute.enabled
|
||||||
|
).c_str());
|
||||||
|
}
|
||||||
|
for (auto &c1: entity_list.GetClientList()) {
|
||||||
|
if (c1.second->GuildID() == guild_id) {
|
||||||
|
c->Message(
|
||||||
|
Chat::Yellow, fmt::format(
|
||||||
|
"PlayerName: {} ID: {} Rank: {} OptIn: {} DirtyList: {}.",
|
||||||
|
c1.second->GetCleanName(),
|
||||||
|
c1.second->GuildID(),
|
||||||
|
c1.second->GuildRank(),
|
||||||
|
c1.second->GuildTributeOptIn(),
|
||||||
|
c1.second->GetGuildListDirty()
|
||||||
|
).c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (is_test) {
|
||||||
|
if (!sep->IsNumber(2)) {
|
||||||
|
c->Message(Chat::White, "Usage: #guild test [Guild ID]");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
auto guild_id = Strings::ToUnsignedInt(sep->arg[2]);
|
||||||
|
auto guild = guild_mgr.GetGuildByGuildID(guild_id);
|
||||||
|
c->SendGuildMembersList();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SendGuildSubCommands(Client *c)
|
void SendGuildSubCommands(Client* c)
|
||||||
{
|
{
|
||||||
c->Message(Chat::White, "#guild create [Character ID|Character Name] [Guild Name]");
|
c->Message(Chat::White, "#guild create [Character ID|Character Name] [Guild Name]");
|
||||||
c->Message(Chat::White, "#guild delete [Guild ID]");
|
c->Message(Chat::White, "#guild delete [Guild ID]");
|
||||||
|
c->Message(Chat::White, "#guild details [Guild ID]");
|
||||||
c->Message(Chat::White, "#guild help");
|
c->Message(Chat::White, "#guild help");
|
||||||
c->Message(Chat::White, "#guild info [Guild ID]");
|
c->Message(Chat::White, "#guild info [Guild ID]");
|
||||||
c->Message(Chat::White, "#guild list");
|
c->Message(Chat::White, "#guild list");
|
||||||
|
|||||||
591
zone/guild.cpp
591
zone/guild.cpp
@ -69,13 +69,13 @@ void Client::SendGuildURL()
|
|||||||
if(IsInAGuild())
|
if(IsInAGuild())
|
||||||
{
|
{
|
||||||
auto outapp =
|
auto outapp =
|
||||||
new EQApplicationPacket(OP_GuildUpdateURLAndChannel, sizeof(GuildUpdateURLAndChannel_Struct));
|
new EQApplicationPacket(OP_GuildUpdate, sizeof(GuildUpdateURLAndChannel_Struct));
|
||||||
|
|
||||||
GuildUpdateURLAndChannel_Struct *guuacs = (GuildUpdateURLAndChannel_Struct*) outapp->pBuffer;
|
GuildUpdateURLAndChannel_Struct *guuacs = (GuildUpdateURLAndChannel_Struct*) outapp->pBuffer;
|
||||||
|
|
||||||
if(guild_mgr.GetGuildURL(GuildID(), guuacs->Text))
|
if(guild_mgr.GetGuildURL(GuildID(), guuacs->Text))
|
||||||
{
|
{
|
||||||
guuacs->Action = 0;
|
guuacs->Action = GuildUpdateURL;
|
||||||
FastQueuePacket(&outapp);
|
FastQueuePacket(&outapp);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -91,13 +91,13 @@ void Client::SendGuildChannel()
|
|||||||
if(IsInAGuild())
|
if(IsInAGuild())
|
||||||
{
|
{
|
||||||
auto outapp =
|
auto outapp =
|
||||||
new EQApplicationPacket(OP_GuildUpdateURLAndChannel, sizeof(GuildUpdateURLAndChannel_Struct));
|
new EQApplicationPacket(OP_GuildUpdate, sizeof(GuildUpdateURLAndChannel_Struct));
|
||||||
|
|
||||||
GuildUpdateURLAndChannel_Struct *guuacs = (GuildUpdateURLAndChannel_Struct*) outapp->pBuffer;
|
GuildUpdateURLAndChannel_Struct *guuacs = (GuildUpdateURLAndChannel_Struct*) outapp->pBuffer;
|
||||||
|
|
||||||
if(guild_mgr.GetGuildChannel(GuildID(), guuacs->Text))
|
if(guild_mgr.GetGuildChannel(GuildID(), guuacs->Text))
|
||||||
{
|
{
|
||||||
guuacs->Action = 1;
|
guuacs->Action = GuildUpdateChannel;
|
||||||
|
|
||||||
FastQueuePacket(&outapp);
|
FastQueuePacket(&outapp);
|
||||||
}
|
}
|
||||||
@ -111,8 +111,8 @@ void Client::SendGuildRanks()
|
|||||||
if (ClientVersion() < EQ::versions::ClientVersion::RoF)
|
if (ClientVersion() < EQ::versions::ClientVersion::RoF)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int permissions = 30 + 1; //Static number of permissions in all EQ clients as of May 2014
|
int permissions = GUILD_MAX_FUNCTIONS + 1; //Static number of permissions in all EQ clients as of May 2014
|
||||||
int ranks = 8 + 1; // Static number of RoF+ ranks as of May 2014
|
int ranks = GUILD_RECRUIT + 1; // Static number of RoF+ ranks as of May 2014
|
||||||
int j = 1;
|
int j = 1;
|
||||||
int i = 1;
|
int i = 1;
|
||||||
if(IsInAGuild())
|
if(IsInAGuild())
|
||||||
@ -121,21 +121,20 @@ void Client::SendGuildRanks()
|
|||||||
{
|
{
|
||||||
while(i < permissions)
|
while(i < permissions)
|
||||||
{
|
{
|
||||||
auto outapp = new EQApplicationPacket(OP_GuildUpdateURLAndChannel,
|
auto outapp = new EQApplicationPacket(OP_GuildUpdate,
|
||||||
sizeof(GuildUpdateRanks_Struct));
|
sizeof(GuildUpdateRanks_Struct));
|
||||||
GuildUpdateRanks_Struct *guuacs = (GuildUpdateRanks_Struct*) outapp->pBuffer;
|
GuildUpdateRanks_Struct* guuacs = (GuildUpdateRanks_Struct*)outapp->pBuffer;
|
||||||
//guuacs->Unknown0008 = GuildID();
|
strncpy(guuacs->Unknown0012, GetCleanName(), 64);
|
||||||
strncpy(guuacs->Unknown0012, GetCleanName(), 64);
|
guuacs->Action = GuildUpdatePermissions;
|
||||||
guuacs->Action = 5;
|
guuacs->RankID = j;
|
||||||
guuacs->RankID = j;
|
guuacs->GuildID = GuildID();
|
||||||
guuacs->GuildID = GuildID();
|
guuacs->PermissionID = i;
|
||||||
guuacs->PermissionID = i;
|
guuacs->PermissionVal = guild_mgr.CheckPermission(GuildID(), j, (GuildAction)i);
|
||||||
guuacs->PermissionVal = 1;
|
guuacs->Unknown0089[0] = 0x2c;
|
||||||
guuacs->Unknown0089[0] = 0x2c;
|
guuacs->Unknown0089[1] = 0x01;
|
||||||
guuacs->Unknown0089[1] = 0x01;
|
guuacs->Unknown0089[2] = 0x00;
|
||||||
guuacs->Unknown0089[2] = 0x00;
|
FastQueuePacket(&outapp);
|
||||||
FastQueuePacket(&outapp);
|
i++;
|
||||||
i++;
|
|
||||||
}
|
}
|
||||||
j++;
|
j++;
|
||||||
i = 1;
|
i = 1;
|
||||||
@ -143,25 +142,42 @@ void Client::SendGuildRanks()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Client::SendGuildRankNames()
|
||||||
|
{
|
||||||
|
if (IsInAGuild() && (ClientVersion() >= EQ::versions::ClientVersion::RoF)) {
|
||||||
|
auto guild = guild_mgr.GetGuildByGuildID(GuildID());
|
||||||
|
|
||||||
|
for (int i = 1; i <= GUILD_MAX_RANK; i++) {
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_GuildUpdate, sizeof(GuildUpdateUCPStruct));
|
||||||
|
GuildUpdateUCPStruct *gucp = (GuildUpdateUCPStruct *) outapp->pBuffer;
|
||||||
|
|
||||||
|
gucp->payload.rank_name.rank = i;
|
||||||
|
strn0cpy(
|
||||||
|
gucp->payload.rank_name.rank_name,
|
||||||
|
guild->rank_names[i].c_str(),
|
||||||
|
sizeof(gucp->payload.rank_name.rank_name)
|
||||||
|
);
|
||||||
|
gucp->action = GuildUpdateRanks;
|
||||||
|
|
||||||
|
QueuePacket(outapp);
|
||||||
|
safe_delete(outapp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Client::SendGuildSpawnAppearance() {
|
void Client::SendGuildSpawnAppearance() {
|
||||||
if (!IsInAGuild()) {
|
if (!IsInAGuild()) {
|
||||||
// clear guildtag
|
// clear guildtag
|
||||||
SendAppearancePacket(AppearanceType::GuildID, GUILD_NONE);
|
SendAppearancePacket(AppearanceType::GuildID, GUILD_NONE);
|
||||||
LogGuilds("Sending spawn appearance for no guild tag");
|
LogGuilds("Sending spawn appearance for no guild tag");
|
||||||
} else {
|
} else {
|
||||||
uint8 rank = guild_mgr.GetDisplayedRank(GuildID(), GuildRank(), CharacterID());
|
uint8 rank = guild_mgr.GetDisplayedRank(GuildID(), GuildRank(), CharacterID());
|
||||||
|
uint32 display = guild_mgr.CheckPermission(GuildID(), GuildRank(), GUILD_ACTION_DISPLAY_GUILD_NAME) ? 1 : 0;
|
||||||
LogGuilds("Sending spawn appearance for guild [{}] at rank [{}]", GuildID(), rank);
|
LogGuilds("Sending spawn appearance for guild [{}] at rank [{}]", GuildID(), rank);
|
||||||
SendAppearancePacket(AppearanceType::GuildID, GuildID());
|
SendAppearancePacket(AppearanceType::GuildID, GuildID(), true);
|
||||||
if (ClientVersion() >= EQ::versions::ClientVersion::RoF)
|
SendAppearancePacket(AppearanceType::GuildRank, rank, true);
|
||||||
{
|
SendAppearancePacket(AppearanceType::GuildShow, display, true);
|
||||||
switch (rank) {
|
|
||||||
case 0: { rank = 5; break; } // GUILD_MEMBER 0
|
|
||||||
case 1: { rank = 3; break; } // GUILD_OFFICER 1
|
|
||||||
case 2: { rank = 1; break; } // GUILD_LEADER 2
|
|
||||||
default: { break; } // GUILD_NONE
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SendAppearancePacket(AppearanceType::GuildRank, rank);
|
|
||||||
}
|
}
|
||||||
UpdateWho();
|
UpdateWho();
|
||||||
}
|
}
|
||||||
@ -234,7 +250,10 @@ void Client::RefreshGuildInfo()
|
|||||||
|
|
||||||
guildrank = info.rank;
|
guildrank = info.rank;
|
||||||
guild_id = info.guild_id;
|
guild_id = info.guild_id;
|
||||||
GuildBanker = info.banker || guild_mgr.IsGuildLeader(GuildID(), CharacterID());
|
GuildBanker = info.banker ||
|
||||||
|
guild_mgr.IsGuildLeader(GuildID(), CharacterID()) ||
|
||||||
|
guild_mgr.GetBankerFlag(CharacterID()) ||
|
||||||
|
ClientVersion() >= EQ::versions::ClientVersion::RoF ? true : false;
|
||||||
|
|
||||||
if(zone->GetZoneID() == Zones::GUILDHALL)
|
if(zone->GetZoneID() == Zones::GUILDHALL)
|
||||||
{
|
{
|
||||||
@ -244,9 +263,9 @@ void Client::RefreshGuildInfo()
|
|||||||
|
|
||||||
GuildSetRank_Struct *gsrs = (GuildSetRank_Struct*)outapp->pBuffer;
|
GuildSetRank_Struct *gsrs = (GuildSetRank_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
gsrs->Rank = guildrank;
|
gsrs->rank = guildrank;
|
||||||
strn0cpy(gsrs->MemberName, GetName(), sizeof(gsrs->MemberName));
|
strn0cpy(gsrs->member_name, GetName(), sizeof(gsrs->member_name));
|
||||||
gsrs->Banker = GuildBanker;
|
gsrs->banker = GuildBanker;
|
||||||
|
|
||||||
FastQueuePacket(&outapp);
|
FastQueuePacket(&outapp);
|
||||||
}
|
}
|
||||||
@ -257,7 +276,7 @@ void Client::RefreshGuildInfo()
|
|||||||
if (ClientVersion() < EQ::versions::ClientVersion::RoF)
|
if (ClientVersion() < EQ::versions::ClientVersion::RoF)
|
||||||
ClearGuildBank();
|
ClearGuildBank();
|
||||||
|
|
||||||
if(guild_id != GUILD_NONE)
|
if (guild_id != GUILD_NONE)
|
||||||
GuildBanks->SendGuildBank(this);
|
GuildBanks->SendGuildBank(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -265,24 +284,50 @@ void Client::RefreshGuildInfo()
|
|||||||
SendGuildSpawnAppearance();
|
SendGuildSpawnAppearance();
|
||||||
}
|
}
|
||||||
|
|
||||||
void EntityList::SendGuildMOTD(uint32 guild_id) {
|
void EntityList::SendGuildMOTD(uint32 guild_id)
|
||||||
if(guild_id == GUILD_NONE)
|
{
|
||||||
|
if (guild_id == GUILD_NONE) {
|
||||||
return;
|
return;
|
||||||
auto it = client_list.begin();
|
}
|
||||||
while (it != client_list.end()) {
|
|
||||||
Client *client = it->second;
|
for (auto const &c: client_list) {
|
||||||
if (client->GuildID() == guild_id) {
|
if (c.second->GuildID() == guild_id) {
|
||||||
client->SendGuildMOTD();
|
c.second->SendGuildMOTD();
|
||||||
client->SendGuildURL();
|
|
||||||
client->SendGuildChannel();
|
|
||||||
}
|
}
|
||||||
++it;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EntityList::SendGuildSpawnAppearance(uint32 guild_id) {
|
void EntityList::SendGuildChannel(uint32 guild_id)
|
||||||
if(guild_id == GUILD_NONE)
|
{
|
||||||
|
if (guild_id == GUILD_NONE) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto const &c: client_list) {
|
||||||
|
if (c.second->GuildID() == guild_id) {
|
||||||
|
c.second->SendGuildChannel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EntityList::SendGuildURL(uint32 guild_id)
|
||||||
|
{
|
||||||
|
if (guild_id == GUILD_NONE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto const &c: client_list) {
|
||||||
|
if (c.second->GuildID() == guild_id) {
|
||||||
|
c.second->SendGuildURL();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EntityList::SendGuildSpawnAppearance(uint32 guild_id)
|
||||||
|
{
|
||||||
|
if (guild_id == GUILD_NONE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
auto it = client_list.begin();
|
auto it = client_list.begin();
|
||||||
while (it != client_list.end()) {
|
while (it != client_list.end()) {
|
||||||
Client *client = it->second;
|
Client *client = it->second;
|
||||||
@ -293,9 +338,11 @@ void EntityList::SendGuildSpawnAppearance(uint32 guild_id) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EntityList::RefreshAllGuildInfo(uint32 guild_id) {
|
void EntityList::RefreshAllGuildInfo(uint32 guild_id)
|
||||||
if(guild_id == GUILD_NONE)
|
{
|
||||||
|
if (guild_id == GUILD_NONE) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
auto it = client_list.begin();
|
auto it = client_list.begin();
|
||||||
while (it != client_list.end()) {
|
while (it != client_list.end()) {
|
||||||
Client *client = it->second;
|
Client *client = it->second;
|
||||||
@ -306,9 +353,11 @@ void EntityList::RefreshAllGuildInfo(uint32 guild_id) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EntityList::SendGuildMembers(uint32 guild_id) {
|
void EntityList::SendGuildMembers(uint32 guild_id)
|
||||||
if(guild_id == GUILD_NONE)
|
{
|
||||||
|
if (guild_id == GUILD_NONE) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//this could be optimized a bit to only build the member's packet once
|
//this could be optimized a bit to only build the member's packet once
|
||||||
//and then keep swapping out the name in the packet on each send.
|
//and then keep swapping out the name in the packet on each send.
|
||||||
@ -317,36 +366,92 @@ void EntityList::SendGuildMembers(uint32 guild_id) {
|
|||||||
while (it != client_list.end()) {
|
while (it != client_list.end()) {
|
||||||
Client *client = it->second;
|
Client *client = it->second;
|
||||||
if (client->GuildID() == guild_id) {
|
if (client->GuildID() == guild_id) {
|
||||||
client->SendGuildMembers();
|
//client->SendGuildMembers();
|
||||||
}
|
}
|
||||||
++it;
|
++it;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EntityList::SendGuildList() {
|
void EntityList::SendGuildList()
|
||||||
auto it = client_list.begin();
|
{
|
||||||
while (it != client_list.end()) {
|
for (auto const& c : client_list) {
|
||||||
Client *client = it->second;
|
c.second->SendGuildList();
|
||||||
client->SendGuildList();
|
|
||||||
++it;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client::SendGuildJoin(GuildJoin_Struct* gj){
|
void Client::SendGuildJoin(GuildJoin_Struct *gj)
|
||||||
|
{
|
||||||
auto outapp = new EQApplicationPacket(OP_GuildManageAdd, sizeof(GuildJoin_Struct));
|
auto outapp = new EQApplicationPacket(OP_GuildManageAdd, sizeof(GuildJoin_Struct));
|
||||||
GuildJoin_Struct* outgj=(GuildJoin_Struct*)outapp->pBuffer;
|
auto outgj = (GuildJoin_Struct *) outapp->pBuffer;
|
||||||
outgj->class_ = gj->class_;
|
outgj->class_ = gj->class_;
|
||||||
outgj->guild_id = gj->guild_id;
|
outgj->guild_id = gj->guild_id;
|
||||||
outgj->level = gj->level;
|
outgj->level = gj->level;
|
||||||
|
outgj->rank = gj->rank;
|
||||||
|
outgj->zoneid = gj->zoneid;
|
||||||
strcpy(outgj->name, gj->name);
|
strcpy(outgj->name, gj->name);
|
||||||
outgj->rank = gj->rank;
|
|
||||||
outgj->zoneid = gj->zoneid;
|
|
||||||
|
|
||||||
LogGuilds("Sending OP_GuildManageAdd for join of length [{}]", outapp->size);
|
LogGuilds("Sending OP_GuildManageAdd for join of length [{}]", outapp->size);
|
||||||
|
|
||||||
FastQueuePacket(&outapp);
|
FastQueuePacket(&outapp);
|
||||||
|
}
|
||||||
|
|
||||||
// SendGuildMembers(gj->guild_id, true);
|
void EntityList::GuildSetPreRoFBankerFlag(uint32 guild_id, uint32 guild_rank, bool bank_status)
|
||||||
|
{
|
||||||
|
auto guild_members = [&]() -> std::vector<Client *> {
|
||||||
|
std::vector<Client *> members = {};
|
||||||
|
for (auto const &c: entity_list.GetClientList()) {
|
||||||
|
if (c.second->GuildID() == guild_id && c.second->GuildRank() == guild_rank) {
|
||||||
|
members.push_back(c.second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return members;
|
||||||
|
};
|
||||||
|
|
||||||
|
for (auto const &c: guild_members()) {
|
||||||
|
auto outapp = new ServerPacket(
|
||||||
|
ServerOP_GuildRankUpdate,
|
||||||
|
sizeof(ServerGuildRankUpdate_Struct)
|
||||||
|
);
|
||||||
|
|
||||||
|
guild_mgr.UpdateDbBankerFlag(c->CharacterID(), bank_status);
|
||||||
|
c->SetGuildBanker(bank_status);
|
||||||
|
CharGuildInfo cgi;
|
||||||
|
guild_mgr.GetCharInfo(c->CharacterID(), cgi);
|
||||||
|
|
||||||
|
auto *sgrus = (ServerGuildRankUpdate_Struct *) outapp->pBuffer;
|
||||||
|
sgrus->guild_id = guild_id;
|
||||||
|
sgrus->rank = guild_rank;
|
||||||
|
sgrus->banker = (bank_status ? 1 : 0) + (cgi.alt ? 2 : 0);
|
||||||
|
sgrus->no_update = true;
|
||||||
|
strn0cpy(sgrus->member_name, c->GetCleanName(), sizeof(sgrus->member_name));
|
||||||
|
|
||||||
|
worldserver.SendPacket(outapp);
|
||||||
|
safe_delete(outapp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Client::SetGuildRank(uint32 rank)
|
||||||
|
{
|
||||||
|
guildrank = rank;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Client::SetGuildTributeOptIn(bool state)
|
||||||
|
{
|
||||||
|
guild_tribute_opt_in = state;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Client::SetGuildID(uint32 g_id)
|
||||||
|
{
|
||||||
|
guild_id = g_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EntityList::UpdateGuildTributes(uint32 guild_id)
|
||||||
|
{
|
||||||
|
for (auto const &c: entity_list.GetClientList()) {
|
||||||
|
if (c.second->GuildID() == guild_id) {
|
||||||
|
c.second->DoGuildTributeUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -409,3 +514,353 @@ void Client::GuildChangeRank(const char* name, uint32 guild_id, uint32 oldrank,
|
|||||||
SendGuildMembers(guild_id, true);
|
SendGuildMembers(guild_id, true);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
|
void Client::SendGuildMembersList()
|
||||||
|
{
|
||||||
|
auto guild_name = guild_mgr.GetGuildName(GuildID());
|
||||||
|
uint32 len;
|
||||||
|
uint8 *data = guild_mgr.MakeGuildMembers(GuildID(), guild_name, len);
|
||||||
|
if (data == nullptr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_GuildMemberList);
|
||||||
|
outapp->size = len;
|
||||||
|
outapp->pBuffer = data;
|
||||||
|
data = nullptr;
|
||||||
|
|
||||||
|
LogGuilds("Sending OP_GuildMemberList of length [{}]", outapp->size);
|
||||||
|
|
||||||
|
FastQueuePacket(&outapp);
|
||||||
|
|
||||||
|
SendGuildMOTD();
|
||||||
|
SendGuildChannel();
|
||||||
|
SendGuildURL();
|
||||||
|
|
||||||
|
SetGuildListDirty(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Client::SendGuildMemberAdd(
|
||||||
|
uint32 guild_id,
|
||||||
|
uint32 level,
|
||||||
|
uint32 class_,
|
||||||
|
uint32 rank_,
|
||||||
|
uint32 guild_show,
|
||||||
|
uint32 zone_id,
|
||||||
|
std::string player_name
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (GetGuildListDirty()) {
|
||||||
|
SendGuildMembersList();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_GuildMemberAdd, sizeof(GuildMemberAdd_Struct));
|
||||||
|
auto out = (GuildMemberAdd_Struct *) outapp->pBuffer;
|
||||||
|
|
||||||
|
out->guild_id = guild_id;
|
||||||
|
out->last_on = time(nullptr);
|
||||||
|
out->level = level;
|
||||||
|
out->zone_id = zone_id;
|
||||||
|
out->rank_ = rank_;
|
||||||
|
out->guild_show = guild_show;
|
||||||
|
out->class_ = class_;
|
||||||
|
strn0cpy(out->player_name, player_name.c_str(), sizeof(out->player_name));
|
||||||
|
|
||||||
|
QueuePacket(outapp);
|
||||||
|
safe_delete(outapp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Client::SendGuildMemberRename(uint32 guild_id, std::string player_name, std::string new_player_name)
|
||||||
|
{
|
||||||
|
auto outapp = new EQApplicationPacket(OP_GuildMemberRename, sizeof(GuildRenameMember_Struct));
|
||||||
|
auto *out = (GuildRenameMember_Struct *) outapp->pBuffer;
|
||||||
|
|
||||||
|
out->guild_id = guild_id;
|
||||||
|
strn0cpy(out->player_name, player_name.c_str(), sizeof(out->player_name));
|
||||||
|
strn0cpy(out->new_player_name, new_player_name.c_str(), sizeof(out->new_player_name));
|
||||||
|
|
||||||
|
QueuePacket(outapp);
|
||||||
|
safe_delete(outapp);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Client::SendGuildMemberDelete(uint32 guild_id, std::string player_name)
|
||||||
|
{
|
||||||
|
auto outapp = new EQApplicationPacket(OP_GuildMemberDelete, sizeof(GuildMemberDelete_Struct));
|
||||||
|
auto out = (GuildMemberDelete_Struct *) outapp->pBuffer;
|
||||||
|
|
||||||
|
out->guild_id = guild_id;
|
||||||
|
strn0cpy(out->player_name, player_name.c_str(), sizeof(out->player_name));
|
||||||
|
|
||||||
|
QueuePacket(outapp);
|
||||||
|
safe_delete(outapp);
|
||||||
|
|
||||||
|
SetGuildListDirty(true);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Client::SendGuildMemberLevel(uint32 guild_id, uint32 level, std::string player_name)
|
||||||
|
{
|
||||||
|
auto outapp = new EQApplicationPacket(OP_GuildMemberLevel, sizeof(GuildMemberLevel_Struct));
|
||||||
|
auto out = (GuildMemberLevel_Struct *) outapp->pBuffer;
|
||||||
|
|
||||||
|
out->guild_id = guild_id;
|
||||||
|
out->level = level;
|
||||||
|
strn0cpy(out->player_name, player_name.c_str(), sizeof(out->player_name));
|
||||||
|
|
||||||
|
QueuePacket(outapp);
|
||||||
|
safe_delete(outapp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Client::SendGuildMemberRankAltBanker(uint32 guild_id, uint32 rank, std::string player_name, bool alt, bool banker)
|
||||||
|
{
|
||||||
|
auto outapp = new EQApplicationPacket(OP_GuildMemberRankAltBanker, sizeof(GuildMemberRank_Struct));
|
||||||
|
auto out = (GuildMemberRank_Struct *) outapp->pBuffer;
|
||||||
|
|
||||||
|
out->guild_id = guild_id;
|
||||||
|
out->rank_ = rank;
|
||||||
|
out->alt_banker = (alt << 1) | banker;
|
||||||
|
strn0cpy(out->player_name, player_name.c_str(), sizeof(out->player_name));
|
||||||
|
|
||||||
|
QueuePacket(outapp);
|
||||||
|
safe_delete(outapp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Client::SendGuildMemberPublicNote(uint32 guild_id, std::string player_name, std::string public_note)
|
||||||
|
{
|
||||||
|
auto outapp = new EQApplicationPacket(OP_GuildMemberPublicNote, sizeof(GuildMemberPublicNote_Struct));
|
||||||
|
auto out = (GuildMemberPublicNote_Struct *) outapp->pBuffer;
|
||||||
|
|
||||||
|
out->guild_id = guild_id;
|
||||||
|
strn0cpy(out->player_name, player_name.c_str(), sizeof(out->player_name));
|
||||||
|
strn0cpy(out->public_note, public_note.c_str(), sizeof(out->public_note));
|
||||||
|
|
||||||
|
QueuePacket(outapp);
|
||||||
|
safe_delete(outapp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Client::SendGuildMemberDetails(uint32 guild_id, uint32 zone_id, uint32 offline_mode, std::string player_name)
|
||||||
|
{
|
||||||
|
auto outapp = new EQApplicationPacket(OP_GuildMemberDetails, sizeof(GuildMemberDetails_Struct));
|
||||||
|
auto out = (GuildMemberDetails_Struct *) outapp->pBuffer;
|
||||||
|
|
||||||
|
out->guild_id = guild_id;
|
||||||
|
out->zone_id = zone_id;
|
||||||
|
out->last_on = time(nullptr);
|
||||||
|
out->offline_mode = offline_mode;
|
||||||
|
strn0cpy(out->player_name, player_name.c_str(), sizeof(out->player_name));
|
||||||
|
|
||||||
|
QueuePacket(outapp);
|
||||||
|
safe_delete(outapp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Client::SendGuildRenameGuild(uint32 guild_id, std::string new_guild_name)
|
||||||
|
{
|
||||||
|
auto outapp = new EQApplicationPacket(OP_GuildRenameGuild, sizeof(GuildRenameGuild_Struct));
|
||||||
|
auto out = (GuildRenameGuild_Struct *) outapp->pBuffer;
|
||||||
|
|
||||||
|
out->guild_id = guild_id;
|
||||||
|
strn0cpy(out->new_guild_name, new_guild_name.c_str(), sizeof(out->new_guild_name));
|
||||||
|
|
||||||
|
QueuePacket(outapp);
|
||||||
|
safe_delete(outapp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EntityList::SendGuildMembersList(uint32 guild_id)
|
||||||
|
{
|
||||||
|
for (auto const& c : client_list) {
|
||||||
|
if (c.second->GuildID() == guild_id) {
|
||||||
|
c.second->SendGuildMembersList();
|
||||||
|
c.second->SetGuildListDirty(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EntityList::SendGuildMemberAdd(
|
||||||
|
uint32 guild_id,
|
||||||
|
uint32 level,
|
||||||
|
uint32 class_,
|
||||||
|
uint32 rank_,
|
||||||
|
uint32 spirit,
|
||||||
|
uint32 zone_id,
|
||||||
|
std::string player_name
|
||||||
|
)
|
||||||
|
{
|
||||||
|
for (auto &c: client_list) {
|
||||||
|
if (c.second->GuildID() == guild_id) {
|
||||||
|
c.second->SendGuildMemberAdd(guild_id, level, class_, rank_, 0, zone_id, player_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (player_name.compare(c.second->GetCleanName()) == 0) {
|
||||||
|
c.second->SetGuildID(guild_id);
|
||||||
|
c.second->SetGuildRank(rank_);
|
||||||
|
c.second->SendGuildList();
|
||||||
|
c.second->SetGuildTributeOptIn(false);
|
||||||
|
c.second->SendGuildMembersList();
|
||||||
|
if (c.second->ClientVersion() >= EQ::versions::ClientVersion::RoF) {
|
||||||
|
c.second->SendGuildRanks();
|
||||||
|
c.second->SendGuildRankNames();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (zone->GetZoneID() == Zones::GUILDHALL && GuildBanks) {
|
||||||
|
GuildBanks->SendGuildBank(c.second);
|
||||||
|
}
|
||||||
|
|
||||||
|
c.second->SendGuildActiveTributes(guild_id);
|
||||||
|
c.second->SendAppearancePacket(AppearanceType::GuildID, guild_id, true, false, c.second);
|
||||||
|
c.second->SendAppearancePacket(AppearanceType::GuildRank, rank_, true, false, c.second);
|
||||||
|
c.second->SendAppearancePacket(AppearanceType::GuildShow, guild_mgr.CheckPermission(guild_id, rank_, GUILD_ACTION_DISPLAY_GUILD_NAME) ? 1 : 0);
|
||||||
|
c.second->DoGuildTributeUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EntityList::SendGuildMemberRename(uint32 guild_id, std::string player_name, std::string new_player_name)
|
||||||
|
{
|
||||||
|
for (auto const &c: client_list) {
|
||||||
|
if (c.second->GuildID() == guild_id) {
|
||||||
|
auto outapp = new EQApplicationPacket(OP_GuildMemberRename, sizeof(GuildRenameMember_Struct));
|
||||||
|
auto out = (GuildRenameMember_Struct *) outapp->pBuffer;
|
||||||
|
|
||||||
|
out->guild_id = guild_id;
|
||||||
|
strn0cpy(out->player_name, player_name.c_str(), sizeof(out->player_name));
|
||||||
|
strn0cpy(out->new_player_name, new_player_name.c_str(), sizeof(out->new_player_name));
|
||||||
|
|
||||||
|
c.second->QueuePacket(outapp);
|
||||||
|
safe_delete(outapp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EntityList::SendGuildMemberRemove(uint32 guild_id, std::string player_name)
|
||||||
|
{
|
||||||
|
for (auto &c: client_list) {
|
||||||
|
if (c.second->GuildID() == guild_id) {
|
||||||
|
auto outapp = new EQApplicationPacket(OP_GuildMemberDelete, sizeof(GuildMemberDelete_Struct));
|
||||||
|
auto out = (GuildMemberDelete_Struct *) outapp->pBuffer;
|
||||||
|
|
||||||
|
out->guild_id = guild_id;
|
||||||
|
strn0cpy(out->player_name, player_name.c_str(), sizeof(out->player_name));
|
||||||
|
|
||||||
|
c.second->QueuePacket(outapp);
|
||||||
|
safe_delete(outapp);
|
||||||
|
|
||||||
|
c.second->SetGuildListDirty(true);
|
||||||
|
|
||||||
|
if (player_name.compare(c.second->GetCleanName()) == 0) {
|
||||||
|
c.second->SetGuildID(GUILD_NONE);
|
||||||
|
c.second->SetGuildRank(GUILD_RANK_NONE);
|
||||||
|
c.second->SetGuildTributeOptIn(false);
|
||||||
|
c.second->SendGuildActiveTributes(0);
|
||||||
|
c.second->SetGuildListDirty(false);
|
||||||
|
c.second->SendGuildList();
|
||||||
|
c.second->SendAppearancePacket(AppearanceType::GuildID, GUILD_NONE, true);
|
||||||
|
c.second->SendAppearancePacket(AppearanceType::GuildRank, GUILD_RANK_NONE, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EntityList::SendGuildMemberLevel(uint32 guild_id, uint32 level, std::string player_name)
|
||||||
|
{
|
||||||
|
for (auto const &c: client_list) {
|
||||||
|
if (c.second->GuildID() == guild_id) {
|
||||||
|
auto outapp = new EQApplicationPacket(OP_GuildMemberLevel, sizeof(GuildMemberLevel_Struct));
|
||||||
|
GuildMemberLevel_Struct *out = (GuildMemberLevel_Struct *) outapp->pBuffer;
|
||||||
|
|
||||||
|
out->guild_id = guild_id;
|
||||||
|
out->level = level;
|
||||||
|
strn0cpy(out->player_name, player_name.c_str(), sizeof(out->player_name));
|
||||||
|
|
||||||
|
c.second->QueuePacket(outapp);
|
||||||
|
safe_delete(outapp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EntityList::SendGuildMemberRankAltBanker(uint32 guild_id, uint32 rank_, std::string player_name, bool alt, bool banker)
|
||||||
|
{
|
||||||
|
for (auto const &c: client_list) {
|
||||||
|
if (c.second->GuildID() == guild_id) {
|
||||||
|
auto outapp = new EQApplicationPacket(OP_GuildMemberRankAltBanker, sizeof(GuildMemberRank_Struct));
|
||||||
|
auto out = (GuildMemberRank_Struct *) outapp->pBuffer;
|
||||||
|
|
||||||
|
out->guild_id = guild_id;
|
||||||
|
out->rank_ = rank_;
|
||||||
|
out->alt_banker = (alt << 1) | banker;
|
||||||
|
strn0cpy(out->player_name, player_name.c_str(), sizeof(out->player_name));
|
||||||
|
|
||||||
|
c.second->QueuePacket(outapp);
|
||||||
|
safe_delete(outapp);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (player_name.compare(c.second->GetName()) == 0) {
|
||||||
|
c.second->SetGuildRank(rank_);
|
||||||
|
c.second->SendAppearancePacket(AppearanceType::GuildRank, rank_, false);
|
||||||
|
c.second->SendAppearancePacket(AppearanceType::GuildShow,
|
||||||
|
guild_mgr.CheckPermission(c.second->GuildID(), c.second->GuildRank(), GUILD_ACTION_DISPLAY_GUILD_NAME) ? 1 : 0,
|
||||||
|
true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EntityList::SendGuildMemberPublicNote(uint32 guild_id, std::string player_name, std::string public_note)
|
||||||
|
{
|
||||||
|
for (auto const &c: client_list) {
|
||||||
|
if (c.second->GuildID() == guild_id) {
|
||||||
|
auto outapp = new EQApplicationPacket(OP_GuildMemberPublicNote, sizeof(GuildMemberPublicNote_Struct));
|
||||||
|
auto out = (GuildMemberPublicNote_Struct *) outapp->pBuffer;
|
||||||
|
|
||||||
|
out->guild_id = guild_id;
|
||||||
|
strn0cpy(out->player_name, player_name.c_str(), sizeof(out->player_name));
|
||||||
|
strn0cpy(out->public_note, public_note.c_str(), sizeof(out->public_note));
|
||||||
|
|
||||||
|
c.second->QueuePacket(outapp);
|
||||||
|
safe_delete(outapp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EntityList::SendGuildMemberDetails(uint32 guild_id, uint32 zone_id, uint32 offline_mode, std::string player_name)
|
||||||
|
{
|
||||||
|
for (auto const &c: client_list) {
|
||||||
|
if (c.second->GuildID() == guild_id) {
|
||||||
|
auto outapp = new EQApplicationPacket(OP_GuildMemberDetails, sizeof(GuildMemberDetails_Struct));
|
||||||
|
auto out = (GuildMemberDetails_Struct *) outapp->pBuffer;
|
||||||
|
|
||||||
|
out->guild_id = guild_id;
|
||||||
|
out->zone_id = zone_id;
|
||||||
|
out->last_on = time(nullptr);
|
||||||
|
out->offline_mode = offline_mode;
|
||||||
|
strn0cpy(out->player_name, player_name.c_str(), sizeof(out->player_name));
|
||||||
|
|
||||||
|
c.second->QueuePacket(outapp);
|
||||||
|
safe_delete(outapp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EntityList::SendGuildRenameGuild(uint32 guild_id, std::string new_guild_name)
|
||||||
|
{
|
||||||
|
for (auto const &c: client_list) {
|
||||||
|
if (c.second->GuildID() == guild_id) {
|
||||||
|
auto outapp = new EQApplicationPacket(OP_GuildRenameGuild, sizeof(GuildRenameGuild_Struct));
|
||||||
|
auto out = (GuildRenameGuild_Struct *) outapp->pBuffer;
|
||||||
|
|
||||||
|
out->guild_id = guild_id;
|
||||||
|
strn0cpy(out->new_guild_name, new_guild_name.c_str(), sizeof(out->new_guild_name));
|
||||||
|
|
||||||
|
c.second->QueuePacket(outapp);
|
||||||
|
safe_delete(outapp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Client::SendGuildDeletePacket(uint32 guild_id)
|
||||||
|
{
|
||||||
|
auto outapp = new EQApplicationPacket(OP_GuildDeleteGuild, sizeof(GuildDelete_Struct));
|
||||||
|
auto data = (GuildDelete_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
data->guild_id = guild_id;
|
||||||
|
FastQueuePacket(&outapp);
|
||||||
|
}
|
||||||
|
|||||||
1133
zone/guild_mgr.cpp
1133
zone/guild_mgr.cpp
File diff suppressed because it is too large
Load Diff
@ -57,16 +57,32 @@ public:
|
|||||||
void ListGuilds(Client *c, std::string search_criteria = std::string()) const;
|
void ListGuilds(Client *c, std::string search_criteria = std::string()) const;
|
||||||
void ListGuilds(Client *c, uint32 guild_id = 0) const;
|
void ListGuilds(Client *c, uint32 guild_id = 0) const;
|
||||||
void DescribeGuild(Client *c, uint32 guild_id) const;
|
void DescribeGuild(Client *c, uint32 guild_id) const;
|
||||||
|
bool IsActionABankAction(GuildAction action);
|
||||||
|
|
||||||
|
uint8 *MakeGuildMembers(uint32 guild_id, const char* prefix_name, uint32& length);
|
||||||
// bool DonateTribute(uint32 charid, uint32 guild_id, uint32 tribute_amount);
|
void SendToWorldMemberLevelUpdate(uint32 guild_id, uint32 level, std::string player_name);
|
||||||
|
void SendToWorldMemberPublicNote(uint32 guild_id, std::string player_name, std::string public_note);
|
||||||
uint8 *MakeGuildMembers(uint32 guild_id, const char *prefix_name, uint32 &length); //make a guild member list packet, returns ownership of the buffer.
|
void SendToWorldMemberRemove(uint32 guild_id, std::string player_name);
|
||||||
|
void SendToWorldMemberAdd(uint32 guild_id, uint32 char_id, uint32 level, uint32 _class, uint32 rank, uint32 zone_id, std::string player_name);
|
||||||
|
void SendToWorldGuildChannel(uint32 guild_id, std::string channel);
|
||||||
|
void SendToWorldGuildURL(uint32 guild_id, std::string url);
|
||||||
|
void SendToWorldSendGuildList();
|
||||||
|
void SendToWorldMemberRankUpdate(uint32 guild_id, uint32 rank, uint32 banker, uint32 alt, bool no_update, const char *player_name);
|
||||||
|
void SendToWorldSendGuildMembersList(uint32 guild_id);
|
||||||
|
bool RemoveMember(uint32 guild_id, uint32 char_id, std::string player_name);
|
||||||
|
void MemberAdd(uint32 guild_id, uint32 char_id, uint32 level, uint32 _class, uint32 rank, uint32 zone_id, std::string player_name);
|
||||||
|
bool MemberRankUpdate(uint32 guild_id, uint32 rank, uint32 banker, uint32 alt, bool no_update, const char *player_name);
|
||||||
|
|
||||||
void RecordInvite(uint32 char_id, uint32 guild_id, uint8 rank);
|
void RecordInvite(uint32 char_id, uint32 guild_id, uint8 rank);
|
||||||
bool VerifyAndClearInvite(uint32 char_id, uint32 guild_id, uint8 rank);
|
bool VerifyAndClearInvite(uint32 char_id, uint32 guild_id, uint8 rank);
|
||||||
void SendGuildMemberUpdateToWorld(const char *MemberName, uint32 GuildID, uint16 ZoneID, uint32 LastSeen);
|
void SendGuildMemberUpdateToWorld(const char *MemberName, uint32 GuildID, uint16 ZoneID, uint32 LastSeen);
|
||||||
void RequestOnlineGuildMembers(uint32 FromID, uint32 GuildID);
|
void RequestOnlineGuildMembers(uint32 FromID, uint32 GuildID);
|
||||||
|
void UpdateRankPermission(uint32 gid, uint32 charid, uint32 fid, uint32 rank, uint32 value);
|
||||||
|
void SendPermissionUpdate(uint32 guild_id, uint32 rank, uint32 function_id, uint32 value);
|
||||||
|
void UpdateRankName(uint32 gid, uint32 rank, std::string rank_name);
|
||||||
|
void SendRankName(uint32 guild_id, uint32 rank, std::string rank_name);
|
||||||
|
void SendAllRankNames(uint32 guild_id, uint32 char_id);
|
||||||
|
BaseGuildManager::GuildInfo* GetGuildByGuildID(uint32 guild_id);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void SendGuildRefresh(uint32 guild_id, bool name, bool motd, bool rank, bool relation);
|
virtual void SendGuildRefresh(uint32 guild_id, bool name, bool motd, bool rank, bool relation);
|
||||||
|
|||||||
@ -1105,7 +1105,7 @@ void Client::DeleteItemInInventory(int16 slot_id, int16 quantity, bool client_up
|
|||||||
if(update_db)
|
if(update_db)
|
||||||
database.SaveInventory(character_id, inst, slot_id);
|
database.SaveInventory(character_id, inst, slot_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(client_update && IsValidSlot(slot_id)) {
|
if(client_update && IsValidSlot(slot_id)) {
|
||||||
EQApplicationPacket* outapp = nullptr;
|
EQApplicationPacket* outapp = nullptr;
|
||||||
if(inst) {
|
if(inst) {
|
||||||
@ -1674,6 +1674,7 @@ bool Client::IsValidSlot(uint32 slot) {
|
|||||||
(slot == (uint32)EQ::invslot::slotCursor) ||
|
(slot == (uint32)EQ::invslot::slotCursor) ||
|
||||||
(slot <= EQ::invbag::CURSOR_BAG_END && slot >= EQ::invbag::CURSOR_BAG_BEGIN) ||
|
(slot <= EQ::invbag::CURSOR_BAG_END && slot >= EQ::invbag::CURSOR_BAG_BEGIN) ||
|
||||||
(slot <= EQ::invslot::TRIBUTE_END && slot >= EQ::invslot::TRIBUTE_BEGIN) ||
|
(slot <= EQ::invslot::TRIBUTE_END && slot >= EQ::invslot::TRIBUTE_BEGIN) ||
|
||||||
|
(slot <= EQ::invslot::GUILD_TRIBUTE_END && slot >= EQ::invslot::GUILD_TRIBUTE_BEGIN) ||
|
||||||
(slot <= EQ::invslot::SHARED_BANK_END && slot >= EQ::invslot::SHARED_BANK_BEGIN) ||
|
(slot <= EQ::invslot::SHARED_BANK_END && slot >= EQ::invslot::SHARED_BANK_BEGIN) ||
|
||||||
(slot <= EQ::invbag::SHARED_BANK_BAGS_END && slot >= EQ::invbag::SHARED_BANK_BAGS_BEGIN) ||
|
(slot <= EQ::invbag::SHARED_BANK_BAGS_END && slot >= EQ::invbag::SHARED_BANK_BAGS_BEGIN) ||
|
||||||
(slot <= EQ::invslot::TRADE_END && slot >= EQ::invslot::TRADE_BEGIN) ||
|
(slot <= EQ::invslot::TRADE_END && slot >= EQ::invslot::TRADE_BEGIN) ||
|
||||||
@ -3578,6 +3579,11 @@ bool Client::InterrogateInventory(Client* requester, bool log, bool silent, bool
|
|||||||
if (inst == nullptr) { continue; }
|
if (inst == nullptr) { continue; }
|
||||||
instmap[index] = inst;
|
instmap[index] = inst;
|
||||||
}
|
}
|
||||||
|
for (int16 index = EQ::invslot::GUILD_TRIBUTE_BEGIN; index <= EQ::invslot::GUILD_TRIBUTE_END; ++index) {
|
||||||
|
auto inst = m_inv[index];
|
||||||
|
if (inst == nullptr) { continue; }
|
||||||
|
instmap[index] = inst;
|
||||||
|
}
|
||||||
for (int16 index = EQ::invslot::BANK_BEGIN; index <= EQ::invslot::BANK_END; ++index) {
|
for (int16 index = EQ::invslot::BANK_BEGIN; index <= EQ::invslot::BANK_END; ++index) {
|
||||||
auto inst = m_inv[index];
|
auto inst = m_inv[index];
|
||||||
if (inst == nullptr) { continue; }
|
if (inst == nullptr) { continue; }
|
||||||
@ -3714,6 +3720,7 @@ bool Client::InterrogateInventory_error(int16 head, int16 index, const EQ::ItemI
|
|||||||
if (
|
if (
|
||||||
(head >= EQ::invslot::EQUIPMENT_BEGIN && head <= EQ::invslot::EQUIPMENT_END) ||
|
(head >= EQ::invslot::EQUIPMENT_BEGIN && head <= EQ::invslot::EQUIPMENT_END) ||
|
||||||
(head >= EQ::invslot::TRIBUTE_BEGIN && head <= EQ::invslot::TRIBUTE_END) ||
|
(head >= EQ::invslot::TRIBUTE_BEGIN && head <= EQ::invslot::TRIBUTE_END) ||
|
||||||
|
(head >= EQ::invslot::GUILD_TRIBUTE_BEGIN && head <= EQ::invslot::GUILD_TRIBUTE_END) ||
|
||||||
(head >= EQ::invslot::WORLD_BEGIN && head <= EQ::invslot::WORLD_END) ||
|
(head >= EQ::invslot::WORLD_BEGIN && head <= EQ::invslot::WORLD_END) ||
|
||||||
(head >= 8000 && head <= 8101)) {
|
(head >= 8000 && head <= 8101)) {
|
||||||
switch (depth)
|
switch (depth)
|
||||||
|
|||||||
@ -83,6 +83,11 @@ int Lua_Packet::GetRawOpcode() {
|
|||||||
return static_cast<int>(self->GetOpcodeBypass());
|
return static_cast<int>(self->GetOpcodeBypass());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int Lua_Packet::GetProtocolOpcode() {
|
||||||
|
Lua_Safe_Call_Int();
|
||||||
|
return static_cast<int>(self->GetProtocolOpcode());
|
||||||
|
}
|
||||||
|
|
||||||
void Lua_Packet::SetRawOpcode(int op) {
|
void Lua_Packet::SetRawOpcode(int op) {
|
||||||
Lua_Safe_Call_Void();
|
Lua_Safe_Call_Void();
|
||||||
self->SetOpcode(static_cast<EmuOpcode>(op));
|
self->SetOpcode(static_cast<EmuOpcode>(op));
|
||||||
@ -329,6 +334,7 @@ luabind::scope lua_register_packet() {
|
|||||||
.property("valid", &Lua_Packet::Valid)
|
.property("valid", &Lua_Packet::Valid)
|
||||||
.def("GetOpcode", &Lua_Packet::GetOpcode)
|
.def("GetOpcode", &Lua_Packet::GetOpcode)
|
||||||
.def("GetRawOpcode", &Lua_Packet::GetRawOpcode)
|
.def("GetRawOpcode", &Lua_Packet::GetRawOpcode)
|
||||||
|
.def("GetProtocolOpcode", &Lua_Packet::GetProtocolOpcode)
|
||||||
.def("GetSize", &Lua_Packet::GetSize)
|
.def("GetSize", &Lua_Packet::GetSize)
|
||||||
.def("GetWritePosition", &Lua_Packet::GetWritePosition)
|
.def("GetWritePosition", &Lua_Packet::GetWritePosition)
|
||||||
.def("ReadDouble", &Lua_Packet::ReadDouble)
|
.def("ReadDouble", &Lua_Packet::ReadDouble)
|
||||||
@ -837,7 +843,7 @@ luabind::scope lua_register_packet_opcodes() {
|
|||||||
luabind::value("HideCorpse", static_cast<int>(OP_HideCorpse)),
|
luabind::value("HideCorpse", static_cast<int>(OP_HideCorpse)),
|
||||||
luabind::value("TargetBuffs", static_cast<int>(OP_TargetBuffs)),
|
luabind::value("TargetBuffs", static_cast<int>(OP_TargetBuffs)),
|
||||||
luabind::value("TradeBusy", static_cast<int>(OP_TradeBusy)),
|
luabind::value("TradeBusy", static_cast<int>(OP_TradeBusy)),
|
||||||
luabind::value("GuildUpdateURLAndChannel", static_cast<int>(OP_GuildUpdateURLAndChannel)),
|
luabind::value("GuildUpdate", static_cast<int>(OP_GuildUpdate)),
|
||||||
luabind::value("CameraEffect", static_cast<int>(OP_CameraEffect)),
|
luabind::value("CameraEffect", static_cast<int>(OP_CameraEffect)),
|
||||||
luabind::value("SpellEffect", static_cast<int>(OP_SpellEffect)),
|
luabind::value("SpellEffect", static_cast<int>(OP_SpellEffect)),
|
||||||
luabind::value("DzQuit", static_cast<int>(OP_DzQuit)),
|
luabind::value("DzQuit", static_cast<int>(OP_DzQuit)),
|
||||||
|
|||||||
@ -30,6 +30,7 @@ public:
|
|||||||
int GetOpcode();
|
int GetOpcode();
|
||||||
void SetOpcode(int op);
|
void SetOpcode(int op);
|
||||||
int GetRawOpcode();
|
int GetRawOpcode();
|
||||||
|
int GetProtocolOpcode();
|
||||||
void SetRawOpcode(int op);
|
void SetRawOpcode(int op);
|
||||||
int GetWritePosition();
|
int GetWritePosition();
|
||||||
void SetWritePosition(int offset);
|
void SetWritePosition(int offset);
|
||||||
|
|||||||
@ -371,7 +371,7 @@ int main(int argc, char **argv)
|
|||||||
LogError("Loading items failed!");
|
LogError("Loading items failed!");
|
||||||
LogError("Failed. But ignoring error and going on..");
|
LogError("Failed. But ignoring error and going on..");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!content_db.LoadSkillCaps(std::string(hotfix_name))) {
|
if (!content_db.LoadSkillCaps(std::string(hotfix_name))) {
|
||||||
LogError("Loading skill caps failed!");
|
LogError("Loading skill caps failed!");
|
||||||
return 1;
|
return 1;
|
||||||
@ -381,6 +381,7 @@ int main(int argc, char **argv)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
guild_mgr.LoadGuilds();
|
guild_mgr.LoadGuilds();
|
||||||
content_db.LoadFactionData();
|
content_db.LoadFactionData();
|
||||||
title_manager.LoadTitles();
|
title_manager.LoadTitles();
|
||||||
|
|||||||
@ -21,6 +21,8 @@ enum PlayerGenericLogEventTypes {
|
|||||||
Player_Log_Issued_Commands,
|
Player_Log_Issued_Commands,
|
||||||
Player_Log_Money_Transactions,
|
Player_Log_Money_Transactions,
|
||||||
Player_Log_Alternate_Currency_Transactions,
|
Player_Log_Alternate_Currency_Transactions,
|
||||||
|
Player_Log_Guild_Tribute_Item_Donation,
|
||||||
|
Player_Log_Guild_Tribute_Plat_Donation
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -6596,7 +6596,49 @@ int64 Mob::GetFocusEffect(focusType type, uint16 spell_id, Mob *caster, bool fro
|
|||||||
focus_max_real = focus_max;
|
focus_max_real = focus_max;
|
||||||
UsedItem = TempItem;
|
UsedItem = TempItem;
|
||||||
UsedFocusID = TempItem->Focus.Effect;
|
UsedFocusID = TempItem->Focus.Effect;
|
||||||
} else if (focus_max < 0 && focus_max < focus_max_real) {
|
}
|
||||||
|
else if (focus_max < 0 && focus_max < focus_max_real) {
|
||||||
|
focus_max_real = focus_max;
|
||||||
|
UsedItem = TempItem;
|
||||||
|
UsedFocusID = TempItem->Focus.Effect;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Total = CalcFocusEffect(type, TempItem->Focus.Effect, spell_id);
|
||||||
|
if (Total > 0 && realTotal >= 0 && Total > realTotal) {
|
||||||
|
realTotal = Total;
|
||||||
|
UsedItem = TempItem;
|
||||||
|
UsedFocusID = TempItem->Focus.Effect;
|
||||||
|
}
|
||||||
|
else if (Total < 0 && Total < realTotal) {
|
||||||
|
realTotal = Total;
|
||||||
|
UsedItem = TempItem;
|
||||||
|
UsedFocusID = TempItem->Focus.Effect;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IsClient()) {
|
||||||
|
//Client Guild Tribute Focus
|
||||||
|
for (int x = EQ::invslot::GUILD_TRIBUTE_BEGIN; x <= EQ::invslot::GUILD_TRIBUTE_END; ++x) {
|
||||||
|
TempItem = nullptr;
|
||||||
|
EQ::ItemInstance* ins = GetInv().GetItem(x);
|
||||||
|
if (!ins) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
TempItem = ins->GetItem();
|
||||||
|
if (TempItem && IsValidSpell(TempItem->Focus.Effect)) {
|
||||||
|
if (rand_effectiveness) {
|
||||||
|
focus_max = CalcFocusEffect(type, TempItem->Focus.Effect, spell_id, true);
|
||||||
|
if (focus_max > 0 && focus_max_real >= 0 && focus_max > focus_max_real) {
|
||||||
|
focus_max_real = focus_max;
|
||||||
|
UsedItem = TempItem;
|
||||||
|
UsedFocusID = TempItem->Focus.Effect;
|
||||||
|
}
|
||||||
|
else if (focus_max < 0 && focus_max < focus_max_real) {
|
||||||
focus_max_real = focus_max;
|
focus_max_real = focus_max;
|
||||||
UsedItem = TempItem;
|
UsedItem = TempItem;
|
||||||
UsedFocusID = TempItem->Focus.Effect;
|
UsedFocusID = TempItem->Focus.Effect;
|
||||||
|
|||||||
@ -278,6 +278,7 @@
|
|||||||
#define GROWS_DIM 1237 //Your %1 grows dim.
|
#define GROWS_DIM 1237 //Your %1 grows dim.
|
||||||
#define BEGINS_TO_SHINE 1238 //Your %1 begins to shine.
|
#define BEGINS_TO_SHINE 1238 //Your %1 begins to shine.
|
||||||
#define SURNAME_REJECTED 1374 //Your new surname was rejected. Please try a different name.
|
#define SURNAME_REJECTED 1374 //Your new surname was rejected. Please try a different name.
|
||||||
|
#define GUILD_DISBANDED 1377 //Your guild has been disbanded! You are no longer a member of any guild.
|
||||||
#define DUEL_DECLINE 1383 //%1 has declined your challenge to duel to the death.
|
#define DUEL_DECLINE 1383 //%1 has declined your challenge to duel to the death.
|
||||||
#define DUEL_ACCEPTED 1384 //%1 has already accepted a duel with someone else.
|
#define DUEL_ACCEPTED 1384 //%1 has already accepted a duel with someone else.
|
||||||
#define DUEL_CONSIDERING 1385 //%1 is considering a duel with someone else.
|
#define DUEL_CONSIDERING 1385 //%1 is considering a duel with someone else.
|
||||||
@ -384,6 +385,7 @@
|
|||||||
#define DUNGEON_SEALED 5141 //The gateway to the dungeon is sealed off to you. Perhaps you would be able to enter if you needed to adventure there.
|
#define DUNGEON_SEALED 5141 //The gateway to the dungeon is sealed off to you. Perhaps you would be able to enter if you needed to adventure there.
|
||||||
#define ADVENTURE_COMPLETE 5147 //You received %1 points for successfully completing the adventure.
|
#define ADVENTURE_COMPLETE 5147 //You received %1 points for successfully completing the adventure.
|
||||||
#define SUCCOR_FAIL 5169 //The portal collapes before you can escape!
|
#define SUCCOR_FAIL 5169 //The portal collapes before you can escape!
|
||||||
|
#define NO_PROPER_ACCESS 5410 //You don't have the proper access rights.
|
||||||
#define AUGMENT_RESTRICTED 5480 //The item does not satisfy the augment's restrictions.
|
#define AUGMENT_RESTRICTED 5480 //The item does not satisfy the augment's restrictions.
|
||||||
#define PET_ATTACKING 5501 //%1 tells you, 'Attacking %2 Master.'
|
#define PET_ATTACKING 5501 //%1 tells you, 'Attacking %2 Master.'
|
||||||
#define AVOID_STUNNING_BLOW 5753 //You avoid the stunning blow.
|
#define AVOID_STUNNING_BLOW 5753 //You avoid the stunning blow.
|
||||||
@ -408,6 +410,7 @@
|
|||||||
#define TRANSFORM_FAILED 6326 //This mold cannot be applied to your %1.
|
#define TRANSFORM_FAILED 6326 //This mold cannot be applied to your %1.
|
||||||
#define TRANSFORM_COMPLETE 6327 //You have successfully transformed your %1.
|
#define TRANSFORM_COMPLETE 6327 //You have successfully transformed your %1.
|
||||||
#define DETRANSFORM_FAILED 6341 //%1 has no transformation that can be removed.
|
#define DETRANSFORM_FAILED 6341 //%1 has no transformation that can be removed.
|
||||||
|
#define GUILD_PERMISSION_FAILED 6418 //You do not have permission to change access options.
|
||||||
#define GENERIC_STRING 6688 //%1 (used to any basic message)
|
#define GENERIC_STRING 6688 //%1 (used to any basic message)
|
||||||
#define SENTINEL_TRIG_YOU 6724 //You have triggered your sentinel.
|
#define SENTINEL_TRIG_YOU 6724 //You have triggered your sentinel.
|
||||||
#define SENTINEL_TRIG_OTHER 6725 //%1 has triggered your sentinel.
|
#define SENTINEL_TRIG_OTHER 6725 //%1 has triggered your sentinel.
|
||||||
|
|||||||
299
zone/tribute.cpp
299
zone/tribute.cpp
@ -19,6 +19,10 @@
|
|||||||
#include "../common/global_define.h"
|
#include "../common/global_define.h"
|
||||||
#include "../common/eq_packet_structs.h"
|
#include "../common/eq_packet_structs.h"
|
||||||
#include "../common/features.h"
|
#include "../common/features.h"
|
||||||
|
#include "../common/repositories/guild_tributes_repository.h"
|
||||||
|
#include "../common/guild_base.h"
|
||||||
|
#include "guild_mgr.h"
|
||||||
|
#include "worldserver.h"
|
||||||
|
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
|
|
||||||
@ -43,19 +47,7 @@ The server periodicly sends tribute timer updates to the client on live,
|
|||||||
but I dont see a point to that right now, so I dont do it.
|
but I dont see a point to that right now, so I dont do it.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
extern WorldServer worldserver;
|
||||||
|
|
||||||
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
|
|
||||||
};
|
|
||||||
|
|
||||||
std::map<uint32, TributeData> tribute_list;
|
std::map<uint32, TributeData> tribute_list;
|
||||||
|
|
||||||
void Client::ToggleTribute(bool enabled) {
|
void Client::ToggleTribute(bool enabled) {
|
||||||
@ -229,8 +221,8 @@ void Client::SendTributeDetails(uint32 client_id, uint32 tribute_id) {
|
|||||||
|
|
||||||
t->client_id = client_id;
|
t->client_id = client_id;
|
||||||
t->tribute_id = tribute_id;
|
t->tribute_id = tribute_id;
|
||||||
memcpy(t->desc, td.description.c_str(), len);
|
memcpy(t->description, td.description.c_str(), len);
|
||||||
t->desc[len] = '\0';
|
t->description[len] = '\0';
|
||||||
|
|
||||||
QueuePacket(&outapp);
|
QueuePacket(&outapp);
|
||||||
}
|
}
|
||||||
@ -334,47 +326,6 @@ void Client::SendTributes() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client::SendGuildTributes() {
|
|
||||||
|
|
||||||
std::map<uint32, TributeData>::iterator cur,end;
|
|
||||||
cur = tribute_list.begin();
|
|
||||||
end = tribute_list.end();
|
|
||||||
|
|
||||||
for(; cur != end; ++cur) {
|
|
||||||
if(!cur->second.is_guild)
|
|
||||||
continue; //skip guild tributes here
|
|
||||||
int len = cur->second.name.length();
|
|
||||||
|
|
||||||
//guild tribute has an unknown uint32 at its begining, guild ID?
|
|
||||||
EQApplicationPacket outapp(OP_TributeInfo, sizeof(TributeAbility_Struct) + len + 1 + 4);
|
|
||||||
uint32 *unknown = (uint32 *) outapp.pBuffer;
|
|
||||||
TributeAbility_Struct* tas = (TributeAbility_Struct*) (outapp.pBuffer+4);
|
|
||||||
|
|
||||||
//this is prolly wrong in general, prolly for one specific guild
|
|
||||||
*unknown = 0x8A110000;
|
|
||||||
|
|
||||||
tas->tribute_id = htonl(cur->first);
|
|
||||||
tas->tier_count = htonl(cur->second.unknown);
|
|
||||||
|
|
||||||
//gotta copy over the data from tiers, and flip all the
|
|
||||||
//byte orders, no idea why its flipped here
|
|
||||||
uint32 r, c;
|
|
||||||
c = cur->second.tier_count;
|
|
||||||
TributeLevel_Struct *dest = tas->tiers;
|
|
||||||
TributeLevel_Struct *src = cur->second.tiers;
|
|
||||||
for(r = 0; r < c; r++, dest++, src++) {
|
|
||||||
dest->cost = htonl(src->cost);
|
|
||||||
dest->level = htonl(src->level);
|
|
||||||
dest->tribute_item_id = htonl(src->tribute_item_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(tas->name, cur->second.name.c_str(), len);
|
|
||||||
tas->name[len] = '\0';
|
|
||||||
|
|
||||||
QueuePacket(&outapp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ZoneDatabase::LoadTributes() {
|
bool ZoneDatabase::LoadTributes() {
|
||||||
|
|
||||||
TributeData tributeData;
|
TributeData tributeData;
|
||||||
@ -435,9 +386,243 @@ bool ZoneDatabase::LoadTributes() {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Client::SendGuildTributes()
|
||||||
|
{
|
||||||
|
for (auto const& t : tribute_list) {
|
||||||
|
if (!t.second.is_guild)
|
||||||
|
continue; //skip non guild tributes here
|
||||||
|
|
||||||
|
//guild tribute has an unknown uint32 at its begining, guild ID?
|
||||||
|
int len = t.second.name.length() + 1;
|
||||||
|
|
||||||
|
EQApplicationPacket* outapp = new EQApplicationPacket(OP_SendGuildTributes, sizeof(GuildTributeAbility_Struct) + len);
|
||||||
|
GuildTributeAbility_Struct* gtas = (GuildTributeAbility_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
auto tier_count = t.second.tier_count;
|
||||||
|
for (int ti = 0; ti < t.second.tier_count; ti++) {
|
||||||
|
if (RuleB(Guild, UseCharacterMaxLevelForGuildTributes) && t.second.tiers[ti].level > RuleI(Character, MaxLevel)) {
|
||||||
|
tier_count -= 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
gtas->guild_id = GuildID();
|
||||||
|
gtas->ability.tier_count = htonl(tier_count);
|
||||||
|
gtas->ability.tribute_id = htonl(t.first);
|
||||||
|
gtas->ability.tiers[ti].cost = htonl(t.second.tiers[ti].cost);
|
||||||
|
gtas->ability.tiers[ti].tribute_item_id = htonl(t.second.tiers[ti].tribute_item_id);
|
||||||
|
gtas->ability.tiers[ti].level = htonl(t.second.tiers[ti].level);
|
||||||
|
}
|
||||||
|
strcpy(gtas->ability.name, t.second.name.data());
|
||||||
|
FastQueuePacket(&outapp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Client::SendGuildTributeDetails(uint32 tribute_id, uint32 tier)
|
||||||
|
{
|
||||||
|
if (tribute_list.count(tribute_id) != 1) {
|
||||||
|
LogGuilds("Details request for invalid tribute [{}]", tribute_id);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
TributeData& td = tribute_list[tribute_id];
|
||||||
|
|
||||||
|
int len = td.description.length();
|
||||||
|
EQApplicationPacket* outapp = new EQApplicationPacket(OP_GuildSelectTribute, sizeof(GuildTributeSelectReply_Struct) + len + 1);
|
||||||
|
GuildTributeSelectReply_Struct* t = (GuildTributeSelectReply_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
t->tribute_id = tribute_id;
|
||||||
|
t->tier = tier;
|
||||||
|
t->tribute_id2 = tribute_id;
|
||||||
|
strncpy(&t->description, td.description.c_str(), len);
|
||||||
|
|
||||||
|
QueuePacket(outapp);
|
||||||
|
safe_delete(outapp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Client::DoGuildTributeUpdate()
|
||||||
|
{
|
||||||
|
LogTribute("DoGuildTributeUpdate");
|
||||||
|
auto guild = guild_mgr.GetGuildByGuildID(GuildID());
|
||||||
|
|
||||||
|
if (guild && guild->tribute.enabled && GuildTributeOptIn()) {
|
||||||
|
TributeData& d1 = tribute_list[guild->tribute.id_1];
|
||||||
|
uint32 item_id1 = d1.tiers[guild->tribute.id_1_tier].tribute_item_id;
|
||||||
|
TributeData& d2 = tribute_list[guild->tribute.id_2];
|
||||||
|
uint32 item_id2 = d2.tiers[guild->tribute.id_2_tier].tribute_item_id;
|
||||||
|
|
||||||
|
if (item_id1) {
|
||||||
|
LogGuilds("Guild Tribute Item 1 is {}", item_id1);
|
||||||
|
const EQ::ItemInstance* inst = database.CreateItem(item_id1, 1);
|
||||||
|
if (!inst) {
|
||||||
|
LogGuilds("Guild Tribute Item 1 was not found. {}", item_id1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto inst_level = d1.tiers[guild->tribute.id_1_tier].level;
|
||||||
|
if (m_inv[EQ::invslot::GUILD_TRIBUTE_BEGIN]) {
|
||||||
|
LogGuilds("Guild Tribute DELETE Item in Slot 450");
|
||||||
|
DeleteItemInInventory(EQ::invslot::GUILD_TRIBUTE_BEGIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((RuleB(Guild,UseCharacterMaxLevelForGuildTributes) && RuleI(Character, MaxLevel) >= inst_level && GetLevel() >= inst_level) ||
|
||||||
|
!RuleB(Guild, UseCharacterMaxLevelForGuildTributes)) {
|
||||||
|
PutItemInInventory(EQ::invslot::GUILD_TRIBUTE_BEGIN, *inst);
|
||||||
|
SendItemPacket(EQ::invslot::GUILD_TRIBUTE_BEGIN, inst, ItemPacketGuildTribute);
|
||||||
|
}
|
||||||
|
|
||||||
|
safe_delete(inst);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item_id2) {
|
||||||
|
LogInfo("Guild Tribute Item 2 is {}", item_id2);
|
||||||
|
const EQ::ItemInstance* inst = database.CreateItem(item_id2, 1);
|
||||||
|
if (!inst) {
|
||||||
|
LogGuilds("Guild Tribute Item 1 was not found. {}", item_id2);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
auto inst_level = d2.tiers[guild->tribute.id_2_tier].level;
|
||||||
|
if (m_inv[EQ::invslot::GUILD_TRIBUTE_BEGIN + 1]) {
|
||||||
|
DeleteItemInInventory(EQ::invslot::GUILD_TRIBUTE_BEGIN + 1);
|
||||||
|
LogGuilds("Guild Tribute DELETE Item in Slot 451");
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((RuleB(Guild, UseCharacterMaxLevelForGuildTributes) && RuleI(Character, MaxLevel) >= inst_level && GetLevel() >= inst_level) ||
|
||||||
|
!RuleB(Guild, UseCharacterMaxLevelForGuildTributes)) {
|
||||||
|
PutItemInInventory(EQ::invslot::GUILD_TRIBUTE_BEGIN + 1, *inst);
|
||||||
|
SendItemPacket(EQ::invslot::GUILD_TRIBUTE_BEGIN + 1, inst, ItemPacketGuildTribute);
|
||||||
|
}
|
||||||
|
|
||||||
|
safe_delete(inst);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (m_inv[EQ::invslot::GUILD_TRIBUTE_BEGIN]) {
|
||||||
|
DeleteItemInInventory(EQ::invslot::GUILD_TRIBUTE_BEGIN);
|
||||||
|
}
|
||||||
|
if (m_inv[EQ::invslot::GUILD_TRIBUTE_BEGIN + 1]) {
|
||||||
|
DeleteItemInInventory(EQ::invslot::GUILD_TRIBUTE_BEGIN + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CalcBonuses();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Client::SendGuildActiveTributes(uint32 guild_id)
|
||||||
|
{
|
||||||
|
auto guild = guild_mgr.GetGuildByGuildID(guild_id);
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_GuildSendActiveTributes, sizeof(GuildTributeSendActive_Struct));
|
||||||
|
auto gtsa = (GuildTributeSendActive_Struct *) outapp->pBuffer;
|
||||||
|
|
||||||
|
if (guild) {
|
||||||
|
gtsa->guild_favor = guild->tribute.favor;
|
||||||
|
gtsa->tribute_timer = guild->tribute.time_remaining;
|
||||||
|
gtsa->tribute_enabled = guild->tribute.enabled;
|
||||||
|
gtsa->tribute_id_1 = guild->tribute.id_1;
|
||||||
|
gtsa->tribute_id_1_tier = guild->tribute.id_1_tier;
|
||||||
|
gtsa->tribute_id_2 = guild->tribute.id_2;
|
||||||
|
gtsa->tribute_id_2_tier = guild->tribute.id_2_tier;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
gtsa->guild_favor = 0;
|
||||||
|
gtsa->tribute_timer = 0;
|
||||||
|
gtsa->tribute_enabled = 0;
|
||||||
|
gtsa->tribute_id_1 = 0xffffffff;
|
||||||
|
gtsa->tribute_id_1_tier = 0;
|
||||||
|
gtsa->tribute_id_2 = 0xffffffff;
|
||||||
|
gtsa->tribute_id_2_tier = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
QueuePacket(outapp);
|
||||||
|
safe_delete(outapp)
|
||||||
|
}
|
||||||
|
|
||||||
|
void Client::SendGuildFavorAndTimer(uint32 guild_id)
|
||||||
|
{
|
||||||
|
auto guild = guild_mgr.GetGuildByGuildID(guild_id);
|
||||||
|
|
||||||
|
if (guild) {
|
||||||
|
auto outapp = new EQApplicationPacket(OP_GuildTributeFavorAndTimer, sizeof(GuildTributeFavorTimer_Struct));
|
||||||
|
auto gtsa = (GuildTributeFavorTimer_Struct *) outapp->pBuffer;
|
||||||
|
|
||||||
|
gtsa->guild_favor = guild->tribute.favor;
|
||||||
|
gtsa->tribute_timer = guild->tribute.time_remaining;
|
||||||
|
gtsa->trophy_timer = 0; //not yet implemented
|
||||||
|
|
||||||
|
QueuePacket(outapp);
|
||||||
|
safe_delete(outapp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Client::SendGuildTributeOptInToggle(const GuildTributeMemberToggle* in)
|
||||||
|
{
|
||||||
|
EQApplicationPacket* outapp = new EQApplicationPacket(OP_GuildOptInOut, sizeof(GuildTributeOptInOutReply_Struct));
|
||||||
|
GuildTributeOptInOutReply_Struct* data = (GuildTributeOptInOutReply_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
strncpy(data->player_name, in->player_name, 64);
|
||||||
|
data->guild_id = in->guild_id;
|
||||||
|
data->no_donations = in->no_donations;
|
||||||
|
data->tribute_toggle = in->tribute_toggle;
|
||||||
|
data->tribute_trophy_toggle = 0; //not yet implemented
|
||||||
|
data->time = time(nullptr);
|
||||||
|
data->command = in->command;
|
||||||
|
|
||||||
|
QueuePacket(outapp);
|
||||||
|
safe_delete(outapp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Client::RequestGuildActiveTributes(uint32 guild_id)
|
||||||
|
{
|
||||||
|
auto sp = new ServerPacket(ServerOP_RequestGuildActiveTributes, sizeof(GuildTributeUpdate));
|
||||||
|
auto data = (GuildTributeUpdate *) sp->pBuffer;
|
||||||
|
|
||||||
|
data->guild_id = GuildID();
|
||||||
|
|
||||||
|
worldserver.SendPacket(sp);
|
||||||
|
safe_delete(sp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Client::RequestGuildFavorAndTimer(uint32 guild_id)
|
||||||
|
{
|
||||||
|
auto sp = new ServerPacket(ServerOP_RequestGuildFavorAndTimer, sizeof(GuildTributeUpdate));
|
||||||
|
auto data = (GuildTributeUpdate *) sp->pBuffer;
|
||||||
|
|
||||||
|
data->guild_id = GuildID();
|
||||||
|
|
||||||
|
worldserver.SendPacket(sp);
|
||||||
|
safe_delete(sp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Client::SendGuildTributeDonateItemReply(GuildTributeDonateItemRequest_Struct* in, uint32 favor) {
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_GuildTributeDonateItem, sizeof(GuildTributeDonateItemReply_Struct));
|
||||||
|
auto out = (GuildTributeDonateItemReply_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
out->type = in->type;
|
||||||
|
out->slot = in->slot;
|
||||||
|
out->aug_index = in->aug_index;
|
||||||
|
out->sub_index = in->sub_index;
|
||||||
|
out->quantity = in->quantity;
|
||||||
|
out->unknown10 = in->unknown10;
|
||||||
|
out->unknown20 = in->unknown20;
|
||||||
|
out->favor = favor;
|
||||||
|
|
||||||
|
QueuePacket(outapp);
|
||||||
|
safe_delete(outapp);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Client::SendGuildTributeDonatePlatReply(GuildTributeDonatePlatRequest_Struct* in, uint32 favor) {
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_GuildTributeDonatePlat, sizeof(GuildTributeDonatePlatReply_Struct));
|
||||||
|
auto out = (GuildTributeDonatePlatReply_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
out->favor = favor;
|
||||||
|
out->quantity = in->quantity;
|
||||||
|
|
||||||
|
QueuePacket(outapp);
|
||||||
|
safe_delete(outapp)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
64.37.149.6:1353 == server
|
64.37.149.6:1353 == server
|
||||||
66.90.221.245:3173 == client
|
66.90.221.245:3173 == client
|
||||||
|
|
||||||
|
|||||||
@ -57,6 +57,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|||||||
#include "dialogue_window.h"
|
#include "dialogue_window.h"
|
||||||
#include "bot_command.h"
|
#include "bot_command.h"
|
||||||
#include "../common/events/player_event_logs.h"
|
#include "../common/events/player_event_logs.h"
|
||||||
|
#include "../common/repositories/guild_tributes_repository.h"
|
||||||
|
|
||||||
extern EntityList entity_list;
|
extern EntityList entity_list;
|
||||||
extern Zone* zone;
|
extern Zone* zone;
|
||||||
@ -781,8 +782,18 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
|
|||||||
case ServerOP_DeleteGuild:
|
case ServerOP_DeleteGuild:
|
||||||
case ServerOP_GuildCharRefresh:
|
case ServerOP_GuildCharRefresh:
|
||||||
case ServerOP_GuildMemberUpdate:
|
case ServerOP_GuildMemberUpdate:
|
||||||
|
case ServerOP_GuildPermissionUpdate:
|
||||||
case ServerOP_GuildRankUpdate:
|
case ServerOP_GuildRankUpdate:
|
||||||
|
case ServerOP_GuildRankNameChange:
|
||||||
case ServerOP_LFGuildUpdate:
|
case ServerOP_LFGuildUpdate:
|
||||||
|
case ServerOP_GuildMemberLevelUpdate:
|
||||||
|
case ServerOP_GuildMemberPublicNote:
|
||||||
|
case ServerOP_GuildChannel:
|
||||||
|
case ServerOP_GuildURL:
|
||||||
|
case ServerOP_GuildMemberRemove:
|
||||||
|
case ServerOP_GuildMemberAdd:
|
||||||
|
case ServerOP_GuildSendGuildList:
|
||||||
|
case ServerOP_GuildMembersList:
|
||||||
{
|
{
|
||||||
guild_mgr.ProcessWorldPacket(pack);
|
guild_mgr.ProcessWorldPacket(pack);
|
||||||
break;
|
break;
|
||||||
@ -3613,6 +3624,225 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
|
|||||||
DataBucket::HandleWorldMessage(pack);
|
DataBucket::HandleWorldMessage(pack);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case ServerOP_GuildTributeUpdate: {
|
||||||
|
GuildTributeUpdate* in = (GuildTributeUpdate*)pack->pBuffer;
|
||||||
|
|
||||||
|
auto guild = guild_mgr.GetGuildByGuildID(in->guild_id);
|
||||||
|
if (guild) {
|
||||||
|
guild->tribute.favor = in->favor;
|
||||||
|
guild->tribute.id_1 = in->tribute_id_1;
|
||||||
|
guild->tribute.id_2 = in->tribute_id_2;
|
||||||
|
guild->tribute.id_1_tier = in->tribute_id_1_tier;
|
||||||
|
guild->tribute.id_2_tier = in->tribute_id_2_tier;
|
||||||
|
guild->tribute.time_remaining = in->time_remaining;
|
||||||
|
guild->tribute.enabled = in->enabled;
|
||||||
|
}
|
||||||
|
EQApplicationPacket* outapp = new EQApplicationPacket(OP_GuildSendActiveTributes, sizeof(GuildTributeSendActive_Struct));
|
||||||
|
GuildTributeSendActive_Struct* out = (GuildTributeSendActive_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
out->not_used = in->guild_id;
|
||||||
|
out->guild_favor = in->favor;
|
||||||
|
out->tribute_enabled = in->enabled;
|
||||||
|
out->tribute_timer = in->time_remaining;
|
||||||
|
out->tribute_id_1 = in->tribute_id_1;
|
||||||
|
out->tribute_id_2 = in->tribute_id_2;
|
||||||
|
out->tribute_id_1_tier = in->tribute_id_1_tier;
|
||||||
|
out->tribute_id_2_tier = in->tribute_id_2_tier;
|
||||||
|
|
||||||
|
entity_list.QueueClientsGuild(outapp, in->guild_id);
|
||||||
|
safe_delete(outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ServerOP_GuildTributeActivate: {
|
||||||
|
GuildTributeUpdate* in = (GuildTributeUpdate*)pack->pBuffer;
|
||||||
|
|
||||||
|
auto guild = guild_mgr.GetGuildByGuildID(in->guild_id);
|
||||||
|
if (guild) {
|
||||||
|
guild->tribute.favor = in->favor;
|
||||||
|
guild->tribute.id_1 = in->tribute_id_1;
|
||||||
|
guild->tribute.id_2 = in->tribute_id_2;
|
||||||
|
guild->tribute.id_1_tier = in->tribute_id_1_tier;
|
||||||
|
guild->tribute.id_2_tier = in->tribute_id_2_tier;
|
||||||
|
guild->tribute.time_remaining = in->time_remaining;
|
||||||
|
guild->tribute.enabled = in->enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
EQApplicationPacket* outapp = new EQApplicationPacket(OP_GuildTributeToggleReply, sizeof(GuildTributeSendActive_Struct));
|
||||||
|
GuildTributeSendActive_Struct* out = (GuildTributeSendActive_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
out->not_used = in->guild_id;
|
||||||
|
out->guild_favor = in->favor;
|
||||||
|
out->tribute_enabled = in->enabled;
|
||||||
|
out->tribute_timer = in->time_remaining;
|
||||||
|
out->tribute_id_1 = in->tribute_id_1;
|
||||||
|
out->tribute_id_2 = in->tribute_id_2;
|
||||||
|
out->tribute_id_1_tier = in->tribute_id_1_tier;
|
||||||
|
out->tribute_id_2_tier = in->tribute_id_2_tier;
|
||||||
|
|
||||||
|
entity_list.QueueClientsGuild(outapp, in->guild_id);
|
||||||
|
safe_delete(outapp);
|
||||||
|
|
||||||
|
for (auto& c : entity_list.GetClientList()) {
|
||||||
|
if (c.second->IsInGuild(in->guild_id)) {
|
||||||
|
c.second->DoGuildTributeUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ServerOP_GuildTributeUpdateDonations:
|
||||||
|
{
|
||||||
|
GuildTributeUpdate* in = (GuildTributeUpdate*)pack->pBuffer;
|
||||||
|
|
||||||
|
EQApplicationPacket* outapp = new EQApplicationPacket(OP_GuildOptInOut, sizeof(GuildTributeOptInOutReply_Struct));
|
||||||
|
GuildTributeOptInOutReply_Struct* data = (GuildTributeOptInOutReply_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
data->guild_id = in->guild_id;
|
||||||
|
strn0cpy(data->player_name, in->player_name, sizeof(data->player_name));
|
||||||
|
data->no_donations = in->member_favor;
|
||||||
|
data->tribute_toggle = in->member_enabled ? true : false;
|
||||||
|
data->tribute_trophy_toggle = 0; //not yet implemented
|
||||||
|
data->time = in->member_time;
|
||||||
|
data->command = 1;
|
||||||
|
|
||||||
|
entity_list.QueueClientsGuild(outapp, in->guild_id);
|
||||||
|
safe_delete(outapp);
|
||||||
|
|
||||||
|
//my new items
|
||||||
|
outapp = new EQApplicationPacket(OP_GuildTributeToggleReply, sizeof(GuildTributeSendActive_Struct));
|
||||||
|
GuildTributeSendActive_Struct *out = (GuildTributeSendActive_Struct *) outapp->pBuffer;
|
||||||
|
|
||||||
|
auto guild = guild_mgr.GetGuildByGuildID(in->guild_id);
|
||||||
|
out->not_used = in->guild_id;
|
||||||
|
out->guild_favor = guild->tribute.favor;
|
||||||
|
out->tribute_enabled = guild->tribute.enabled;
|
||||||
|
out->tribute_timer = guild->tribute.time_remaining;
|
||||||
|
out->tribute_id_1 = guild->tribute.id_1;
|
||||||
|
out->tribute_id_2 = guild->tribute.id_2;
|
||||||
|
out->tribute_id_1_tier = guild->tribute.id_1_tier;
|
||||||
|
out->tribute_id_2_tier = guild->tribute.id_2_tier;
|
||||||
|
|
||||||
|
entity_list.QueueClientsGuild(outapp, in->guild_id);
|
||||||
|
safe_delete(outapp)
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ServerOP_GuildTributeOptInToggle:
|
||||||
|
{
|
||||||
|
GuildTributeMemberToggle* in = (GuildTributeMemberToggle*)pack->pBuffer;
|
||||||
|
|
||||||
|
EQApplicationPacket* outapp = new EQApplicationPacket(OP_GuildOptInOut, sizeof(GuildTributeOptInOutReply_Struct));
|
||||||
|
GuildTributeOptInOutReply_Struct* data = (GuildTributeOptInOutReply_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
data->guild_id = in->guild_id;
|
||||||
|
strn0cpy(data->player_name, in->player_name, sizeof(data->player_name));
|
||||||
|
data->no_donations = in->no_donations;
|
||||||
|
data->tribute_toggle = in->tribute_toggle ? true : false;
|
||||||
|
data->tribute_trophy_toggle = 0; //not yet implemented
|
||||||
|
data->time = in->member_last_donated;
|
||||||
|
data->command = in->command;
|
||||||
|
|
||||||
|
entity_list.QueueClientsGuild(outapp, in->guild_id);
|
||||||
|
safe_delete(outapp);
|
||||||
|
|
||||||
|
auto guild = guild_mgr.GetGuildByGuildID(in->guild_id);
|
||||||
|
auto client = entity_list.GetClientByCharID(in->char_id);
|
||||||
|
if (guild && client) {
|
||||||
|
client->SetGuildTributeOptIn(in->tribute_toggle ? true : false);
|
||||||
|
|
||||||
|
EQApplicationPacket* outapp = new EQApplicationPacket(OP_GuildTributeToggleReply, sizeof(GuildTributeSendActive_Struct));
|
||||||
|
GuildTributeSendActive_Struct* out = (GuildTributeSendActive_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
out->not_used = in->guild_id;
|
||||||
|
out->guild_favor = guild->tribute.favor;
|
||||||
|
out->tribute_enabled = guild->tribute.enabled;
|
||||||
|
out->tribute_timer = guild->tribute.time_remaining;
|
||||||
|
out->tribute_id_1 = guild->tribute.id_1;
|
||||||
|
out->tribute_id_2 = guild->tribute.id_2;
|
||||||
|
out->tribute_id_1_tier = guild->tribute.id_1_tier;
|
||||||
|
out->tribute_id_2_tier = guild->tribute.id_2_tier;
|
||||||
|
client->QueuePacket(outapp);
|
||||||
|
safe_delete(outapp);
|
||||||
|
//send deactivate and then activate
|
||||||
|
|
||||||
|
client->DoGuildTributeUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ServerOP_GuildTributeFavAndTimer:
|
||||||
|
{
|
||||||
|
GuildTributeFavorTimer_Struct* in = (GuildTributeFavorTimer_Struct*)pack->pBuffer;
|
||||||
|
|
||||||
|
auto guild = guild_mgr.GetGuildByGuildID(in->guild_id);
|
||||||
|
if (guild) {
|
||||||
|
guild->tribute.favor = in->guild_favor;
|
||||||
|
guild->tribute.time_remaining = in->tribute_timer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_GuildTributeFavorAndTimer, sizeof(GuildTributeFavorTimer_Struct));
|
||||||
|
GuildTributeFavorTimer_Struct* gtsa = (GuildTributeFavorTimer_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
gtsa->guild_id = in->guild_id;
|
||||||
|
gtsa->guild_favor = guild->tribute.favor;
|
||||||
|
gtsa->tribute_timer = guild->tribute.time_remaining;
|
||||||
|
gtsa->trophy_timer = 0; //not yet implemented
|
||||||
|
|
||||||
|
entity_list.QueueClientsGuild(outapp, in->guild_id);
|
||||||
|
safe_delete(outapp);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ServerOP_RequestGuildActiveTributes:
|
||||||
|
{
|
||||||
|
GuildTributeUpdate* in = (GuildTributeUpdate*)pack->pBuffer;
|
||||||
|
auto guild = guild_mgr.GetGuildByGuildID(in->guild_id);
|
||||||
|
|
||||||
|
if (guild) {
|
||||||
|
auto outapp = new EQApplicationPacket(OP_GuildSendActiveTributes, sizeof(GuildTributeSendActive_Struct));
|
||||||
|
GuildTributeSendActive_Struct* gtsa = (GuildTributeSendActive_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
guild->tribute.enabled = in->enabled;
|
||||||
|
guild->tribute.favor = in->favor;
|
||||||
|
guild->tribute.id_1 = in->tribute_id_1;
|
||||||
|
guild->tribute.id_2 = in->tribute_id_2;
|
||||||
|
guild->tribute.id_1_tier = in->tribute_id_1_tier;
|
||||||
|
guild->tribute.id_2_tier = in->tribute_id_2_tier;
|
||||||
|
guild->tribute.time_remaining = in->time_remaining;
|
||||||
|
|
||||||
|
gtsa->guild_favor = guild->tribute.favor;
|
||||||
|
gtsa->tribute_timer = guild->tribute.time_remaining;
|
||||||
|
gtsa->tribute_enabled = guild->tribute.enabled;
|
||||||
|
gtsa->tribute_id_1 = guild->tribute.id_1;
|
||||||
|
gtsa->tribute_id_1_tier = guild->tribute.id_1_tier;
|
||||||
|
gtsa->tribute_id_2 = guild->tribute.id_2;
|
||||||
|
gtsa->tribute_id_2_tier = guild->tribute.id_2_tier;
|
||||||
|
|
||||||
|
entity_list.QueueClientsGuild(outapp, in->guild_id);
|
||||||
|
safe_delete(outapp);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ServerOP_RequestGuildFavorAndTimer:
|
||||||
|
{
|
||||||
|
GuildTributeFavorTimer_Struct* in = (GuildTributeFavorTimer_Struct*)pack->pBuffer;
|
||||||
|
|
||||||
|
auto guild = guild_mgr.GetGuildByGuildID(in->guild_id);
|
||||||
|
if (guild) {
|
||||||
|
guild->tribute.favor = in->guild_favor;
|
||||||
|
guild->tribute.time_remaining = in->tribute_timer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_GuildTributeFavorAndTimer, sizeof(GuildTributeFavorTimer_Struct));
|
||||||
|
GuildTributeFavorTimer_Struct* gtsa = (GuildTributeFavorTimer_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
gtsa->guild_id = in->guild_id;
|
||||||
|
gtsa->guild_favor = guild->tribute.favor;
|
||||||
|
gtsa->tribute_timer = guild->tribute.time_remaining;
|
||||||
|
gtsa->trophy_timer = 0; //not yet implemented
|
||||||
|
|
||||||
|
entity_list.QueueClientsGuild(outapp, in->guild_id);
|
||||||
|
safe_delete(outapp);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
default: {
|
default: {
|
||||||
LogInfo("Unknown ZS Opcode [{}] size [{}]", (int)pack->opcode, pack->size);
|
LogInfo("Unknown ZS Opcode [{}] size [{}]", (int)pack->opcode, pack->size);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -1203,6 +1203,8 @@ bool Zone::Init(bool is_static) {
|
|||||||
DynamicZone::CacheAllFromDatabase();
|
DynamicZone::CacheAllFromDatabase();
|
||||||
Expedition::CacheAllFromDatabase();
|
Expedition::CacheAllFromDatabase();
|
||||||
|
|
||||||
|
guild_mgr.LoadGuilds();
|
||||||
|
|
||||||
LogInfo("Loading timezone data");
|
LogInfo("Loading timezone data");
|
||||||
zone_time.setEQTimeZone(content_db.GetZoneTimezone(zoneid, GetInstanceVersion()));
|
zone_time.setEQTimeZone(content_db.GetZoneTimezone(zoneid, GetInstanceVersion()));
|
||||||
|
|
||||||
|
|||||||
0
zone/zonedb.cpp
Executable file → Normal file
0
zone/zonedb.cpp
Executable file → Normal file
Loading…
x
Reference in New Issue
Block a user