diff --git a/zone/embparser_api.cpp b/zone/embparser_api.cpp index 8f23083f1..91e194a31 100644 --- a/zone/embparser_api.cpp +++ b/zone/embparser_api.cpp @@ -754,7 +754,7 @@ void Perl__setsky(uint8 new_sky) void Perl__setguild(uint32_t guild_id, uint8_t guild_rank_id) { - quest_manager.setguild(guild_id, guild_rank_id); + quest_manager.SetGuild(guild_id, guild_rank_id); } void Perl__createguild(const char* guild_name, const char* leader_name) diff --git a/zone/gm_commands/guild.cpp b/zone/gm_commands/guild.cpp index 979a624fe..39a30c4ed 100755 --- a/zone/gm_commands/guild.cpp +++ b/zone/gm_commands/guild.cpp @@ -91,6 +91,8 @@ void command_guild(Client* c, const Seperator* sep) else { auto guild_name = sep->argplus[3]; auto guild_id = guild_mgr.CreateGuild(sep->argplus[3], leader_id); + auto leader = entity_list.GetClientByCharID(leader_id); + LogGuilds( "[{}]: Creating guild [{}] with leader [{}] with GM command. It was given id [{}]", @@ -115,7 +117,7 @@ void command_guild(Client* c, const Seperator* sep) ).c_str() ); - if (!guild_mgr.SetGuild(leader_id, guild_id, GUILD_LEADER)) { + if (!guild_mgr.SetGuild(leader, guild_id, GUILD_LEADER)) { c->Message( Chat::White, fmt::format( @@ -268,6 +270,7 @@ void command_guild(Client* c, const Seperator* sep) database.GetCharacterID(sep->arg[2]) ); auto character_name = database.GetCharNameByID(character_id); + auto client = entity_list.GetClientByCharID(character_id); if (!character_id || character_name.empty()) { c->Message( Chat::White, @@ -305,14 +308,14 @@ void command_guild(Client* c, const Seperator* sep) "{} ({}) has {} put into {} ({}).", character_name, character_id, - guild_mgr.SetGuild(character_id, guild_id, GUILD_MEMBER) ? "been" : "failed to be", + guild_mgr.SetGuild(client, guild_id, GUILD_MEMBER) ? "been" : "failed to be", guild_mgr.GetGuildNameByID(guild_id), guild_id ).c_str() ); } else { - guild_mgr.SetGuild(character_id, GUILD_NONE, 0); + guild_mgr.SetGuild(client, GUILD_NONE, 0); c->Message( Chat::White, fmt::format( diff --git a/zone/guild_mgr.cpp b/zone/guild_mgr.cpp index f6e540c20..ab96fb1fd 100644 --- a/zone/guild_mgr.cpp +++ b/zone/guild_mgr.cpp @@ -1317,42 +1317,6 @@ bool GuildBankManager::SplitStack(uint32 guild_id, uint16 slot_id, uint32 quanti return true; } -// void GuildBankManager::UpdateItemQuantity(uint32 guildID, uint16 area, uint16 slotID, uint32 quantity) -// { -// // Helper method for MergeStacks. Assuming all passed parameters are valid. -// // -// std::string query = StringFormat("UPDATE `guild_bank` SET `qty` = %i " -// "WHERE `guildid` = %i AND `area` = %i " -// "AND `slot` = %i LIMIT 1", -// quantity, guildID, area, slotID); -// auto results = database.QueryDatabase(query); -// if(!results.Success()) { -// return; -// } -// -// } - -// bool GuildBankManager::AllowedToWithdraw(uint32 guild_id, uint16 area, uint16 slot_id, const char *name) -// { -// auto guild_bank = GetGuildBank(guild_id); -// if (!guild_bank) { -// return false; -// } -// -// if (area != GuildBankMainArea) { -// return false; -// } -// -// auto item = &guild_bank->items.main_area[slot_id]; -// uint8 permissions = item->permissions; -// -// if (permissions == GuildBankBankerOnly) { -// return false; -// } -// -// return false; -// } - int32 GuildBankManager::NextFreeBankSlot(uint32 guild_id, uint32 area) { auto guild_bank = GetGuildBank(guild_id); @@ -1760,3 +1724,38 @@ void GuildBankManager::SendGuildBankItemUpdate(uint32 guild_id, int32 slot_id, u entity_list.QueueClientsGuildBankItemUpdate(&gbius, guild_id); } + +bool ZoneGuildManager::SetGuild(Client *client, uint32 guild_id, uint8 rank) +{ + if (!client || rank > GUILD_MAX_RANK || !GetGuildByGuildID(guild_id)) { + return false; + } + + if (rank <= GUILD_RANK_NONE) { + rank = GUILD_RECRUIT; + } + + const uint32 current_guild_id = client->GuildID(); + if (current_guild_id == guild_id) { + return false; + } + + if (current_guild_id != guild_id && current_guild_id != GUILD_NONE) { + guild_mgr.RemoveMember(client->GuildID(), client->CharacterID(), std::string(client->GetCleanName())); + } + + client->SetGuildID(guild_id); + client->SetGuildRank(rank); + MemberAdd( + guild_id, + client->CharacterID(), + client->GetLevel(), + client->GetClass(), + rank, + client->GetZoneID(), + client->GetName() + ); + + client->SendGuildSpawnAppearance(); + return true; +} diff --git a/zone/guild_mgr.h b/zone/guild_mgr.h index 2fe4ae7b2..1c12cd669 100644 --- a/zone/guild_mgr.h +++ b/zone/guild_mgr.h @@ -72,6 +72,7 @@ public: void ListGuilds(Client *c, uint32 guild_id = 0) const; void DescribeGuild(Client *c, uint32 guild_id) const; bool IsActionABankAction(GuildAction action); + bool SetGuild(Client *client, uint32 guild_id, uint8 rank); uint8 *MakeGuildMembers(uint32 guild_id, const char* prefix_name, uint32& length); void SendToWorldMemberLevelUpdate(uint32 guild_id, uint32 level, std::string player_name); diff --git a/zone/lua_general.cpp b/zone/lua_general.cpp index a381a1b14..2778a904e 100644 --- a/zone/lua_general.cpp +++ b/zone/lua_general.cpp @@ -468,7 +468,7 @@ void lua_set_sky(int sky) { } void lua_set_guild(int guild_id, int rank) { - quest_manager.setguild(guild_id, rank); + quest_manager.SetGuild(guild_id, rank); } void lua_create_guild(const char *name, const char *leader) { diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index 7f60e1021..dba3295a7 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -1623,10 +1623,10 @@ void QuestManager::setsky(uint8 new_sky) { safe_delete(outapp); } -void QuestManager::setguild(uint32 new_guild_id, uint8 new_rank) { +void QuestManager::SetGuild(uint32 new_guild_id, uint8 new_rank) { QuestManagerCurrentQuestVars(); if (initiator) { - guild_mgr.SetGuild(initiator->CharacterID(), new_guild_id, new_rank); + guild_mgr.SetGuild(initiator, new_guild_id, new_rank); } } @@ -1681,7 +1681,7 @@ void QuestManager::CreateGuild(const char *guild_name, const char *leader) { gid ).c_str() ); - if (!guild_mgr.SetGuild(character_id, gid, GUILD_LEADER)) { + if (!guild_mgr.SetGuild(initiator, gid, GUILD_LEADER)) { worldserver.SendEmoteMessage( 0, 0, diff --git a/zone/questmgr.h b/zone/questmgr.h index 255871105..5148b44f5 100644 --- a/zone/questmgr.h +++ b/zone/questmgr.h @@ -152,7 +152,7 @@ public: void faction(int faction_id, int faction_value, int temp); void rewardfaction(int faction_id, int faction_value); void setsky(uint8 new_sky); - void setguild(uint32 new_guild_id, uint8 new_rank); + void SetGuild(uint32 new_guild_id, uint8 new_rank); void CreateGuild(const char *guild_name, const char *leader); void settime(uint8 new_hour, uint8 new_min, bool update_world = true); void itemlink(int item_id);