diff --git a/server/gameserver/CMakeLists.txt b/server/gameserver/CMakeLists.txt index a317486d..139c6dc6 100644 --- a/server/gameserver/CMakeLists.txt +++ b/server/gameserver/CMakeLists.txt @@ -19,7 +19,7 @@ else() endif() set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g -std=gnu++11 -DGAME_ID=${GAME_ID} -DNDEBUG -DNEWGS") -set(CMAKE_CXX_FLAGS_DEBUG "-Wall -g -std=gnu++11 -DGAME_ID=${GAME_ID} -DDEBUG -fsanitize=address -fno-omit-frame-pointer -DNEWGS") +set(CMAKE_CXX_FLAGS_DEBUG "-Wall -g -std=gnu++11 -DGAME_ID=${GAME_ID} -DDEBUG -fsanitize=address -fno-omit-frame-pointer -DNEWGS -DPVE") include_directories( AFTER diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 6b857c8a..321cbbf0 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -1714,18 +1714,21 @@ void Creature::UpdatePoisoning() } bool need_notify = poisoning_time > 1000; while (poisoning_time > 1000) { - float dmg = 0; - if (room->GetGasData().is_last_gas) { - dmg = room->GetGasData().new_area_meta->i->hurt(); + if (room->IsPveRoom()) { } else { - dmg = room->GetGasData().old_area_meta->i->hurt(); - } - dmg *= 1 + GetAbility()->GetAttrRate(kHAT_PoisoningReduction); - dmg = std::max(10.0f, dmg); - DecHP(dmg, VP_Gas, TEXT("battle_server_killer_gas", "毒圈"), VW_Gas); - if (dead) { - poisoning_time = 0; - break; + float dmg = 0; + if (room->GetGasData().is_last_gas) { + dmg = room->GetGasData().new_area_meta->i->hurt(); + } else { + dmg = room->GetGasData().old_area_meta->i->hurt(); + } + dmg *= 1 + GetAbility()->GetAttrRate(kHAT_PoisoningReduction); + dmg = std::max(10.0f, dmg); + DecHP(dmg, VP_Gas, TEXT("battle_server_killer_gas", "毒圈"), VW_Gas); + if (dead) { + poisoning_time = 0; + break; + } } poisoning_time -= 1000; } diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 2790274b..99e41943 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -1530,18 +1530,31 @@ void Human::FillMFGasData(cs::MFGasData* gas_data) gas_data->set_duration(0); } } else { - if (room->GetGasData().old_area_meta->i->wait_time() <= 0) { + if (room->IsPveRoom()) { gas_data->set_duration(0); } else { - long long duration = room->GetGasData().old_area_meta->i->wait_time() * 20 - - (room->GetFrameNo() - room->GetGasData().gas_start_frameno); - gas_data->set_duration(std::max(duration * 50, (long long)1000) / 1000); + if (room->GetGasData().old_area_meta->i->wait_time() <= 0) { + gas_data->set_duration(0); + } else { + long long duration = room->GetGasData().old_area_meta->i->wait_time() * 20 - + (room->GetFrameNo() - room->GetGasData().gas_start_frameno); + gas_data->set_duration(std::max(duration * 50, (long long)1000) / 1000); + } } } - TypeConvert::ToPb(room->GetGasData().pos_old, gas_data->mutable_pos_old()); - TypeConvert::ToPb(room->GetGasData().pos_new, gas_data->mutable_pos_new()); - gas_data->set_rad_old(room->GetGasData().rad_old); - gas_data->set_rad_new(room->GetGasData().rad_new); + if (room->IsPveRoom()) { +#if 0 + TypeConvert::ToPb(room->GetGasData().pos_old, gas_data->mutable_pos_old()); + TypeConvert::ToPb(room->GetGasData().pos_new, gas_data->mutable_pos_new()); + gas_data->set_rad_old(room->GetGasData().rad_old); + gas_data->set_rad_new(room->GetGasData().rad_new); +#endif + } else { + TypeConvert::ToPb(room->GetGasData().pos_old, gas_data->mutable_pos_old()); + TypeConvert::ToPb(room->GetGasData().pos_new, gas_data->mutable_pos_new()); + gas_data->set_rad_old(room->GetGasData().rad_old); + gas_data->set_rad_new(room->GetGasData().rad_new); + } } void Human::RecalcVolume() diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 86709bc8..1d3f4f8b 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -1183,10 +1183,14 @@ void Room::UpdateGas() } if (gas_data_.gas_mode != GasInactive && gas_data_.gas_mode != GasJump) { if (gas_data_.gas_mode != GasInactive && GetRoomMode() == kChiJiMode) { - if (!IsGameOver() && alive_count_ <= MAX_TEAM_NUM && GetAliveTeamNum() <= 1) { - game_over_ = true; - game_over_frameno_ = GetFrameNo(); - OnGameOver(); + if (IsPveRoom()) { + + } else { + if (!IsGameOver() && alive_count_ <= MAX_TEAM_NUM && GetAliveTeamNum() <= 1) { + game_over_ = true; + game_over_frameno_ = GetFrameNo(); + OnGameOver(); + } } for (auto& pair : human_hash_) { if (pair.second->real_dead || @@ -1292,14 +1296,24 @@ void Room::UpdateGasInactivePvp() void Room::UpdateGasInactivePve() { + gas_data_.gas_mode = GasWaiting; + gas_data_.gas_start_frameno = GetFrameNo(); + battle_start_frameno_ = GetFrameNo(); + NotifyUiUpdate(); + ClearPostBattleAutoFreeList(); + OnBattleStart(); } void Room::UpdateGasWaiting() { - if (GetFrameNo() - gas_data_.gas_start_frameno >= - gas_data_.old_area_meta->i->wait_time() * SERVER_FRAME_RATE) { - gas_data_.gas_mode = GasMoving; - gas_data_.gas_start_frameno = GetFrameNo();; + if (IsPveRoom()) { + + } else { + if (GetFrameNo() - gas_data_.gas_start_frameno >= + gas_data_.old_area_meta->i->wait_time() * SERVER_FRAME_RATE) { + gas_data_.gas_mode = GasMoving; + gas_data_.gas_start_frameno = GetFrameNo();; + } } }