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