disable EXP share during battle and challenge quests
This commit is contained in:
@@ -146,26 +146,9 @@ Lobby::Lobby(shared_ptr<ServerState> s, uint32_t id, bool is_game)
|
||||
: server_state(s),
|
||||
log(std::format("[{}:{:X}] ", is_game ? "Game" : "Lobby", id), lobby_log.min_level),
|
||||
lobby_id(id),
|
||||
min_level(0),
|
||||
max_level(0xFFFFFFFF),
|
||||
next_game_item_id(0xCC000000),
|
||||
allowed_versions(0x0000),
|
||||
override_section_id(0xFF),
|
||||
episode(Episode::NONE),
|
||||
mode(GameMode::NORMAL),
|
||||
difficulty(0),
|
||||
base_exp_multiplier(1.0f),
|
||||
exp_share_multiplier(0.5f),
|
||||
challenge_exp_multiplier(1.0f),
|
||||
random_seed(phosg::random_object<uint32_t>()),
|
||||
rand_crypt(make_shared<DisabledRandomGenerator>()),
|
||||
drop_mode(ServerDropMode::CLIENT),
|
||||
event(0),
|
||||
block(0),
|
||||
leader_id(0),
|
||||
max_clients(12),
|
||||
enabled_flags(0),
|
||||
idle_timeout_usecs(0),
|
||||
idle_timeout_timer(*s->io_context) {
|
||||
this->log.info_f("Created");
|
||||
if (is_game) {
|
||||
|
||||
+21
-21
@@ -96,12 +96,12 @@ struct Lobby : public std::enable_shared_from_this<Lobby> {
|
||||
|
||||
uint32_t lobby_id;
|
||||
|
||||
uint32_t min_level;
|
||||
uint32_t max_level;
|
||||
uint32_t min_level = 0;
|
||||
uint32_t max_level = 0xFFFFFFFF;
|
||||
|
||||
// Game state
|
||||
std::array<uint32_t, 12> next_item_id_for_client;
|
||||
uint32_t next_game_item_id;
|
||||
uint32_t next_game_item_id = 0xCC000000;
|
||||
std::vector<FloorItemManager> floor_item_managers;
|
||||
std::shared_ptr<const MapState::RareEnemyRates> rare_enemy_rates;
|
||||
std::shared_ptr<MapState> map_state; // Always null for lobbies, never null for games
|
||||
@@ -114,22 +114,22 @@ struct Lobby : public std::enable_shared_from_this<Lobby> {
|
||||
// Bits in allowed_versions specify who is allowed to join this game. The
|
||||
// bits are indexed as (1 << version), where version is a value from the
|
||||
// Version enum.
|
||||
uint16_t allowed_versions;
|
||||
uint8_t creator_section_id;
|
||||
uint8_t override_section_id;
|
||||
Episode episode;
|
||||
GameMode mode;
|
||||
uint8_t difficulty; // 0-3
|
||||
float base_exp_multiplier;
|
||||
float exp_share_multiplier;
|
||||
float challenge_exp_multiplier;
|
||||
uint16_t allowed_versions = 0x0000;
|
||||
uint8_t creator_section_id = 0xFF;
|
||||
uint8_t override_section_id = 0xFF;
|
||||
Episode episode = Episode::NONE;
|
||||
GameMode mode = GameMode::NORMAL;
|
||||
uint8_t difficulty = 0; // 0-3
|
||||
float base_exp_multiplier = 1.0f;
|
||||
float exp_share_multiplier = 0.5f;
|
||||
float challenge_exp_multiplier = 1.0f;
|
||||
std::string password;
|
||||
std::string name;
|
||||
// This seed is also sent to the client for rare enemy generation
|
||||
uint32_t random_seed;
|
||||
uint32_t random_seed = 0;
|
||||
std::shared_ptr<RandomGenerator> rand_crypt;
|
||||
uint8_t allowed_drop_modes;
|
||||
ServerDropMode drop_mode;
|
||||
uint8_t allowed_drop_modes = 0x1F;
|
||||
ServerDropMode drop_mode = ServerDropMode::CLIENT;
|
||||
std::shared_ptr<ItemCreator> item_creator; // Always null for lobbies, never null for games
|
||||
|
||||
struct ChallengeParameters {
|
||||
@@ -164,11 +164,11 @@ struct Lobby : public std::enable_shared_from_this<Lobby> {
|
||||
std::shared_ptr<const G_SetEXResultValues_Ep3_6xB4x4B> ep3_ex_result_values;
|
||||
|
||||
// Lobby stuff
|
||||
uint8_t event;
|
||||
uint8_t block;
|
||||
uint8_t leader_id;
|
||||
uint8_t max_clients;
|
||||
uint32_t enabled_flags;
|
||||
uint8_t event = 0;
|
||||
uint8_t block = 0;
|
||||
uint8_t leader_id = 0;
|
||||
uint8_t max_clients = 12;
|
||||
uint32_t enabled_flags = 0;
|
||||
std::shared_ptr<const Quest> quest;
|
||||
std::array<std::shared_ptr<Client>, 12> clients;
|
||||
// Keys in this map are client_id
|
||||
@@ -176,7 +176,7 @@ struct Lobby : public std::enable_shared_from_this<Lobby> {
|
||||
|
||||
// This is only used when the PERSISTENT flag is set and idle_timeout_usecs
|
||||
// is not zero
|
||||
uint64_t idle_timeout_usecs;
|
||||
uint64_t idle_timeout_usecs = 0;
|
||||
asio::steady_timer idle_timeout_timer;
|
||||
|
||||
Lobby(std::shared_ptr<ServerState> s, uint32_t id, bool is_game);
|
||||
|
||||
@@ -4029,15 +4029,19 @@ static asio::awaitable<void> on_enemy_exp_request_bb(shared_ptr<Client> c, Subco
|
||||
if (base_exp != 0.0) {
|
||||
// If this player killed the enemy, they get full EXP; if they tagged the
|
||||
// enemy, they get 80% EXP; if auto EXP share is enabled and they are
|
||||
// close enough to the monster, they get a smaller share; if none of these
|
||||
// situations apply, they get no EXP.
|
||||
// close enough to the monster, they get a smaller share; if none of
|
||||
// these situations apply, they get no EXP. In Battle and Challenge
|
||||
// modes, if a quest is loaded, EXP share is disabled.
|
||||
float exp_share_multiplier = (((l->mode == GameMode::BATTLE) || (l->mode == GameMode::CHALLENGE)) && l->quest)
|
||||
? 0.0f
|
||||
: l->exp_share_multiplier;
|
||||
double rate_factor;
|
||||
if (ene_st->last_hit_by_client_id(client_id)) {
|
||||
rate_factor = max<double>(1.0, l->exp_share_multiplier);
|
||||
rate_factor = max<double>(1.0, exp_share_multiplier);
|
||||
} else if (ene_st->ever_hit_by_client_id(client_id)) {
|
||||
rate_factor = max<double>(0.8, l->exp_share_multiplier);
|
||||
rate_factor = max<double>(0.8, exp_share_multiplier);
|
||||
} else if (lc->floor == ene_st->super_ene->floor) {
|
||||
rate_factor = l->exp_share_multiplier;
|
||||
rate_factor = max<double>(0.0, exp_share_multiplier);
|
||||
} else {
|
||||
rate_factor = 0.0;
|
||||
}
|
||||
|
||||
@@ -826,7 +826,9 @@
|
||||
// (50% by default).
|
||||
// - If the player is not on the same floor as an enemy when it is killed and
|
||||
// never tagged it, they get no EXP.
|
||||
// To disable EXP share in BB games, set this to zero.
|
||||
// To disable EXP share in BB games, set this to zero. EXP share is always
|
||||
// disabled during battle and challenge quests (but not in free-play battle
|
||||
// mode).
|
||||
"BBEXPShareMultiplier": 0.5,
|
||||
// Drop rate multiplier for all server drop tables. This applies to server
|
||||
// drop modes in all game versions. If you want to scale the drop rates for
|
||||
|
||||
Reference in New Issue
Block a user