diff --git a/server/gameserver/ingamevoice.cc b/server/gameserver/ingamevoice.cc index 4decefea..2a78c9e2 100644 --- a/server/gameserver/ingamevoice.cc +++ b/server/gameserver/ingamevoice.cc @@ -51,6 +51,7 @@ void InGameVoice::UnInit() void InGameVoice::OnHumanBeKill(int killer_id, Human* deader) { personal_nodead_series_kills_.erase(deader->GetUniId()); + personal_nodead_timer_attacher_.erase(deader->GetUniId()); if (killer_id == deader->GetUniId()) { return; } @@ -88,18 +89,18 @@ void InGameVoice::OnHumanBeKill(int killer_id, Human* deader) } }, &room_->xtimer_attacher_); -#if 0 - room_->xtimer.SetTimeoutWpEx - ( - SERVER_FRAME_RATE * mt::InGameVoice::s_series_kill_interval, - [room = room_, killer_id] (int event, const a8::Args* args) - { - if (a8::TIMER_EXEC_EVENT == event) { - DecIntMap(room->GetInGameVoice()->personal_nodead_series_kills_, killer_id); - } - }, - &room_->xtimer_attacher_); -#endif + if (!killer->dead) { + room_->xtimer.SetTimeoutWpEx + ( + SERVER_FRAME_RATE * mt::InGameVoice::s_series_kill_interval, + [room = room_, killer_id] (int event, const a8::Args* args) + { + if (a8::TIMER_EXEC_EVENT == event) { + DecIntMap(room->GetInGameVoice()->personal_nodead_series_kills_, killer_id); + } + }, + GetNoDeadTimerAttacher(killer_id)); + } } } @@ -107,3 +108,14 @@ void InGameVoice::Notify(Human* killer, Human* deader, const mt::InGameVoice* me { } + +a8::Attacher* InGameVoice::GetNoDeadTimerAttacher(int killer_id) +{ + auto itr = personal_nodead_timer_attacher_.find(killer_id); + if (itr == personal_nodead_timer_attacher_.end()) { + personal_nodead_timer_attacher_[killer_id] = a8::Attacher(); + itr = personal_nodead_timer_attacher_.find(killer_id); + itr->second.SetOwner(&room_->xtimer); + } + return &itr->second; +} diff --git a/server/gameserver/ingamevoice.h b/server/gameserver/ingamevoice.h index 223fb66c..920b7578 100644 --- a/server/gameserver/ingamevoice.h +++ b/server/gameserver/ingamevoice.h @@ -17,6 +17,7 @@ class InGameVoice : public std::enable_shared_from_this private: void UpdateTeamBeKillLastTime(int team_id); + a8::Attacher* GetNoDeadTimerAttacher(int killer_id); void Notify(Human* killer, Human* deader, const mt::InGameVoice* meta); @@ -27,5 +28,6 @@ private: std::map personal_kills_; std::map personal_series_kills_; std::map personal_nodead_series_kills_; + std::map personal_nodead_timer_attacher_; };