From 9ec6455b7cecbe4d859fced92458a86b36945d05 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 21 Oct 2021 19:28:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=9C=A8=E6=B0=B4=E4=B8=AD?= =?UTF-8?q?=E6=81=A2=E5=A4=8D=E6=B0=A7=E6=B0=94=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/buff.cc | 56 +++++++++++++++++++++++++++++------ server/gameserver/buff.h | 2 ++ server/gameserver/creature.cc | 5 ++++ server/gameserver/human.cc | 13 +++++++- server/gameserver/human.h | 1 + server/gameserver/metamgr.cc | 1 + server/gameserver/metamgr.h | 1 + 7 files changed, 69 insertions(+), 10 deletions(-) diff --git a/server/gameserver/buff.cc b/server/gameserver/buff.cc index 7c65309..b6c8861 100644 --- a/server/gameserver/buff.cc +++ b/server/gameserver/buff.cc @@ -746,15 +746,6 @@ void Buff::CalcPassengerShotOffset() void Buff::ProcDive() { - if (owner->IsHuman()) { - owner->AsHuman()->SetOxygen(MetaMgr::Instance()->dive_oxygen_total); - owner->AsHuman()->room->frame_event.AddPropChg - (owner->AsHuman()->GetWeakPtrRef(), - kPropDive, - MetaMgr::Instance()->dive_oxygen_total, - owner->AsHuman()->GetOxygen(), - true); - } owner->room->xtimer.AddRepeatTimerAndAttach ( SERVER_FRAME_RATE, @@ -792,3 +783,50 @@ void Buff::ProcRemoveDive() owner->AsHuman()->SetOxygen(0); } } + +void Buff::ProcInWater() +{ + if (owner->IsHuman()) { + owner->AsHuman()->SetOxygen(MetaMgr::Instance()->dive_oxygen_total); + owner->AsHuman()->room->frame_event.AddPropChg + (owner->AsHuman()->GetWeakPtrRef(), + kPropDive, + MetaMgr::Instance()->dive_oxygen_total, + owner->AsHuman()->GetOxygen(), + true); + + if (owner->IsPlayer()) { + owner->room->xtimer.AddRepeatTimerAndAttach + ( + SERVER_FRAME_RATE, + a8::XParams() + .SetSender(this), + [] (const a8::XParams& param) + { + Buff* buff = (Buff*)param.sender.GetUserData(); + if (buff->owner->dead || !buff->owner->IsHuman()) { + return; + } + Human* hum = buff->owner->AsHuman(); + if (hum->GetOxygen() < MetaMgr::Instance()->dive_oxygen_total) { + hum->AddOxygen(MetaMgr::Instance()->inwater_oxygen_recover); + hum->room->frame_event.AddPropChg(hum->GetWeakPtrRef(), + kPropDive, + MetaMgr::Instance()->dive_oxygen_total, + hum->GetOxygen(), + true); + return; + } + }, + &xtimer_attacher.timer_list_ + ); + } + } +} + +void Buff::ProcRemoveInWater() +{ + if (owner->IsHuman()) { + owner->AsHuman()->SetOxygen(0); + } +} diff --git a/server/gameserver/buff.h b/server/gameserver/buff.h index a67b4e2..e9ec141 100644 --- a/server/gameserver/buff.h +++ b/server/gameserver/buff.h @@ -75,6 +75,8 @@ class Buff void ProcDisperse(); void ProcDive(); void ProcRemoveDive(); + void ProcInWater(); + void ProcRemoveInWater(); void CalcPassengerShotOffset(); diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 65bb6e2..be593c0 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -1391,6 +1391,11 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) buff->ProcDive(); } break; + case kBET_InWater: + { + buff->ProcInWater(); + } + break; default: { } diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index f9cebd2..788e346 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -1187,7 +1187,7 @@ void Human::FillMFActivePlayerData(cs::MFActivePlayerData* player_data) player_data->set_max_health(GetMaxHP()); player_data->set_cur_weapon_idx(GetCurrWeapon()->weapon_idx); player_data->set_cur_scope(curr_scope_idx); - if (HasBuffEffect(kBET_Dive)) { + if (HasBuffEffect(kBET_InWater)) { player_data->set_dive_oxygen_max(MetaMgr::Instance()->dive_oxygen_total); player_data->set_dive_oxygen_curr(oxygen_); } @@ -2887,6 +2887,11 @@ void Human::OnBuffRemove(Buff& buff) buff.ProcRemoveDive(); } break; + case kBET_InWater: + { + buff.ProcRemoveInWater(); + } + break; case kBET_AddInventory: { for (int slot : buff.meta->param2_int_list) { @@ -3860,6 +3865,12 @@ void Human::TraverseObservers(std::function func) } } +void Human::AddOxygen(int val) +{ + oxygen_ += val; + oxygen_ = std::min(MetaMgr::Instance()->dive_oxygen_total, oxygen_); +} + void Human::DecOxygen(int val) { oxygen_ -= val; diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 0b7db39..bda5ed1 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -269,6 +269,7 @@ class Human : public Creature FrameData& GetFrameData() { return framedata_; }; int GetOxygen() { return oxygen_; }; void SetOxygen(int oxygen) { oxygen_ = oxygen; }; + void AddOxygen(int val); void DecOxygen(int val); protected: diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 10d8b6b..c417e65 100644 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -519,6 +519,7 @@ public: METAMGR_READ(dive_oxygen_consume, 20); METAMGR_READ(dive_hp_consume, 20); METAMGR_READ(dive_explosion_dmg_switch, 0); + METAMGR_READ(inwater_oxygen_recover, 20); } if (MetaMgr::Instance()->K < 0.01f) { abort(); diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index e9b6bba..ee7ed95 100644 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -188,6 +188,7 @@ class MetaMgr : public a8::Singleton int dive_oxygen_consume = 0; int dive_hp_consume = 0; int dive_explosion_dmg_switch = 0; + int inwater_oxygen_recover = 0; private: MetaDataLoader* loader_ = nullptr;