From 952c949d88b868bfb95b642a38edb8b3c11e0a75 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 1 Apr 2024 10:17:18 +0800 Subject: [PATCH] 1 --- server/gameserver/framedata.cc | 3 + server/gameserver/framedata.h | 10 +++ server/gameserver/frameevent.cc | 5 ++ server/gameserver/frameevent.h | 1 + server/gameserver/ingamevoice.cc | 110 +++++++++++++++++++++++++++---- 5 files changed, 118 insertions(+), 11 deletions(-) diff --git a/server/gameserver/framedata.cc b/server/gameserver/framedata.cc index 24f1f9fc..dd28359a 100644 --- a/server/gameserver/framedata.cc +++ b/server/gameserver/framedata.cc @@ -91,4 +91,7 @@ void FrameData::ClearFrameData(Human* hum) if (!del_bullets_.empty()) { del_bullets_.clear(); } + if (!voices_.empty()) { + voices_.clear(); + } } diff --git a/server/gameserver/framedata.h b/server/gameserver/framedata.h index 7be616a0..a82e6d6b 100644 --- a/server/gameserver/framedata.h +++ b/server/gameserver/framedata.h @@ -11,7 +11,15 @@ struct PartObject EntityWeakPtr object; }; +struct FightVoice +{ + int voice_id = 0; + int killer_id = 0; + int dead_id = 0; +}; + class Human; +struct FightVoice; class FrameData { private: @@ -41,8 +49,10 @@ class FrameData std::vector chged_cars_; std::vector chged_props_; std::vector del_bullets_; + std::vector> voices_; friend class Human; friend class FrameMaker; friend class FrameEvent; + friend class InGameVoice; }; diff --git a/server/gameserver/frameevent.cc b/server/gameserver/frameevent.cc index deb8a77f..de7f53c4 100644 --- a/server/gameserver/frameevent.cc +++ b/server/gameserver/frameevent.cc @@ -547,6 +547,11 @@ void FrameEvent::AddExitGame(CreatureWeakPtr& sender) } } +void FrameEvent::AddVoice(int voice_id, Human* killer, Human* dead) +{ + +} + void FrameEvent::Clear() { if (!room->frame_event_data->explosions_.empty()) { diff --git a/server/gameserver/frameevent.h b/server/gameserver/frameevent.h index 11fbbc7d..7e77dbd0 100644 --- a/server/gameserver/frameevent.h +++ b/server/gameserver/frameevent.h @@ -51,6 +51,7 @@ public: float value, float value2, float value3, bool only_self = false); void AddEnterGame(CreatureWeakPtr& sender); void AddExitGame(CreatureWeakPtr& sender); + void AddVoice(int voice_id, Human* killer, Human* dead); void Clear(); }; diff --git a/server/gameserver/ingamevoice.cc b/server/gameserver/ingamevoice.cc index 7e1932bb..f7d82859 100644 --- a/server/gameserver/ingamevoice.cc +++ b/server/gameserver/ingamevoice.cc @@ -94,61 +94,149 @@ void InGameVoice::OnHumanBeKill(int killer_id, Human* deader) void InGameVoice::Notify(Human* killer, Human* deader, const mt::InGameVoice* meta) { + auto p = std::make_shared(); + { + p->voice_id = meta->sound_id(); + switch (meta->notify_fields()) { + case 1: + { + p->killer_id = killer->GetUniId(); + } + break; + case 2: + { + p->dead_id = deader->GetUniId(); + } + break; + case 3: + { + p->killer_id = killer->GetUniId(); + p->dead_id = deader->GetUniId(); + } + break; + default: + { + } + break; + } + } switch (meta->GetNotifyObject()) { case InGameVoiceNotifyObject_e::kGlobal: { - + room_->TraverseHumanList + ( + [p] (Human* hum) -> bool + { + hum->GetFrameData().voices_.push_back(p); + return true; + }); } break; case InGameVoiceNotifyObject_e::kKiller: { - + killer->GetFrameData().voices_.push_back(p); } break; case InGameVoiceNotifyObject_e::kNoKiller: { - + room_->TraverseHumanList + ( + [p, killer, deader] (Human* hum) -> bool + { + if (hum != killer) { + hum->GetFrameData().voices_.push_back(p); + } + return true; + }); } break; case InGameVoiceNotifyObject_e::kKillerTeam: { - + room_->TraverseHumanList + ( + [p, killer, deader] (Human* hum) -> bool + { + if (hum->GetTeam() == killer->GetTeam()) { + hum->GetFrameData().voices_.push_back(p); + } + return true; + }); } break; case InGameVoiceNotifyObject_e::kNoKillerTeam: { - + room_->TraverseHumanList + ( + [p, killer, deader] (Human* hum) -> bool + { + if (hum->GetTeam() != killer->GetTeam()) { + hum->GetFrameData().voices_.push_back(p); + } + return true; + }); } break; case InGameVoiceNotifyObject_e::kDead: { - + deader->GetFrameData().voices_.push_back(p); } break; case InGameVoiceNotifyObject_e::kNoDead: { - + room_->TraverseHumanList + ( + [p, killer, deader] (Human* hum) -> bool + { + if (hum != deader) { + hum->GetFrameData().voices_.push_back(p); + } + return true; + }); } break; case InGameVoiceNotifyObject_e::kDeadTeam: { - + room_->TraverseHumanList + ( + [p, killer, deader] (Human* hum) -> bool + { + if (hum->GetTeam() == deader->GetTeam()) { + hum->GetFrameData().voices_.push_back(p); + } + return true; + }); } break; case InGameVoiceNotifyObject_e::kNoDeadTeam: { - + room_->TraverseHumanList + ( + [p, killer, deader] (Human* hum) -> bool + { + if (hum->GetTeam() != deader->GetTeam()) { + hum->GetFrameData().voices_.push_back(p); + } + return true; + }); } break; case InGameVoiceNotifyObject_e::kTeammateExcludeDead: { - + room_->TraverseHumanList + ( + [p, killer, deader] (Human* hum) -> bool + { + if (hum->GetTeam() == deader->GetTeam() && + hum != deader) { + hum->GetFrameData().voices_.push_back(p); + } + return true; + }); } break; - default: { }