diff --git a/server/imserver/guild.cc b/server/imserver/guild.cc index b425f42..0d0eda6 100644 --- a/server/imserver/guild.cc +++ b/server/imserver/guild.cc @@ -414,7 +414,22 @@ void Guild::_CMGuildGainExp(f8::MsgHdr& hdr, const cs::CMGuildGainExp& msg) if (!next_guild_meta || !curr_guild_meta) { break; } - int add_exp = std::max(curr_guild_meta->i->experience(), 0); + if (curr_guild_meta->i->experience() <= GuildExp()) { + ++guild_lv_; + guild_exp_ = 0; + next_guild_meta = MetaMgr::Instance()->GetGuild(GuildLv() + 1); + } else { + int add_exp = curr_guild_meta->i->experience() - GuildExp(); + if (exp < add_exp) { + guild_exp_ += std::min(add_exp, exp); + break; + } else { + exp -= add_exp; + ++guild_lv_; + guild_exp_ = 0; + next_guild_meta = MetaMgr::Instance()->GetGuild(GuildLv() + 1); + } + } } while (next_guild_meta && exp > 0); } diff --git a/server/imserver/guild.h b/server/imserver/guild.h index 82c5d24..ed8975c 100644 --- a/server/imserver/guild.h +++ b/server/imserver/guild.h @@ -32,6 +32,7 @@ public: long long GuildId() { return guild_id_; } int GuildLv() { return guild_lv_; } + int GuildExp() { return guild_exp_; } const std::string GuildName() { return guild_name_; } int GetMemberJob(const std::string& account_id); int Status() { return guild_status_; }