From 0daaa3ec3f582dc99e239e207bfdfc33051e44c4 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 22 Oct 2021 16:38:18 +0800 Subject: [PATCH] 1 --- server/gameserver/buff.cc | 25 +++++++++++++++++++++++-- server/gameserver/human.cc | 1 + 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/server/gameserver/buff.cc b/server/gameserver/buff.cc index 041f67f..b9aacf3 100644 --- a/server/gameserver/buff.cc +++ b/server/gameserver/buff.cc @@ -787,7 +787,6 @@ void Buff::ProcRemoveDive() void Buff::ProcInWater() { if (owner->IsHuman()) { - owner->AsHuman()->SetOxygen(MetaMgr::Instance()->dive_oxygen_total); owner->AsHuman()->room->frame_event.AddPropChg (owner->AsHuman()->GetWeakPtrRef(), kPropDive, @@ -828,6 +827,28 @@ void Buff::ProcInWater() void Buff::ProcRemoveInWater() { if (owner->IsHuman()) { - owner->AsHuman()->SetOxygen(0); + if (owner->IsPlayer()) { + owner->room->xtimer.AddRepeatTimerAndAttach + ( + SERVER_FRAME_RATE, + a8::XParams() + .SetSender(owner), + [] (const a8::XParams& param) + { + Creature* c = (Creature*)param.sender.GetUserData(); + if (!c->IsHuman() || c->HasBuffEffect(kBET_InWater) || c->dead) { + c->room->xtimer.DeleteTimer(c->room->xtimer.GetRunningTimer()); + return; + } + Human* hum = c->AsHuman(); + if (hum->GetOxygen() >= MetaMgr::Instance()->dive_oxygen_total) { + c->room->xtimer.DeleteTimer(c->room->xtimer.GetRunningTimer()); + return; + } + hum->AddOxygen(MetaMgr::Instance()->inwater_oxygen_recover); + }, + &owner->xtimer_attacher.timer_list_ + ); + } } } diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 6915bc0..e4d3cd6 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -77,6 +77,7 @@ void Human::Initialize() } SetMaxHP(GetHP()); SetCurrWeapon(&weapons[0]); + SetOxygen(MetaMgr::Instance()->dive_oxygen_total); } float Human::GetSpeed()