diff --git a/server/gameserver/buff/bufffactory.cc b/server/gameserver/buff/bufffactory.cc index 30e80708..e94f29f4 100644 --- a/server/gameserver/buff/bufffactory.cc +++ b/server/gameserver/buff/bufffactory.cc @@ -44,6 +44,7 @@ #include "buff/vertigo.h" #include "buff/cond_add.h" #include "buff/distance_dmg_addition.h" +#include "buff/downed.h" #include "mt/Buff.h" @@ -128,6 +129,8 @@ std::shared_ptr BuffFactory::MakeBuff(const mt::Buff* buff_meta) return std::make_shared(); case kBET_CondAdd: return std::make_shared(); + case kBET_Down: + return std::make_shared(); default: return std::make_shared(); } diff --git a/server/gameserver/buff/downed.cc b/server/gameserver/buff/downed.cc new file mode 100644 index 00000000..72905890 --- /dev/null +++ b/server/gameserver/buff/downed.cc @@ -0,0 +1,27 @@ +#include "precompile.h" + +#include "buff/downed.h" + +#include "creature.h" +#include "human.h" +#include "room.h" + +#include "mt/Buff.h" + +void DownedBuff::Activate() +{ + if (!owner->room->IsDestorying() && !owner->room->IsGameOver()) { + if (owner->IsHuman()) { + owner->AsHuman()->SendViewerUiMemberUpdate({owner->GetUniId()}); + } + } +} + +void DownedBuff::Deactivate() +{ + if (!owner->room->IsDestorying() && !owner->room->IsGameOver()) { + if (owner->IsHuman()) { + owner->AsHuman()->SendViewerUiMemberUpdate({owner->GetUniId()}); + } + } +} diff --git a/server/gameserver/buff/downed.h b/server/gameserver/buff/downed.h new file mode 100644 index 00000000..37935415 --- /dev/null +++ b/server/gameserver/buff/downed.h @@ -0,0 +1,12 @@ +#pragma once + +#include "buff.h" + +class DownedBuff : public Buff +{ + public: + + virtual void Activate() override; + virtual void Deactivate() override; + +}; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 214d8d5b..67eb907b 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3535,6 +3535,7 @@ void Human::InternalBeKill(int killer_id, const std::string& killer_name, int we } } } + SendViewerUiMemberUpdate({GetUniId(), killer_id, real_killer_id}); } int Human::GetTeamMode() diff --git a/server/gameserver/pbutils.cc b/server/gameserver/pbutils.cc index 0aa17244..056ae148 100644 --- a/server/gameserver/pbutils.cc +++ b/server/gameserver/pbutils.cc @@ -1720,27 +1720,6 @@ void Human::SendUIUpdate() notifymsg.set_boss_state(room->pve_data.boss_state); } if (room->IsMobaModeRoom()) { -#if 0 - if (GetTeam()->GetTeamId() == room->GetMobaTeamA()->GetTeamId()) { - if (room->GetMobaTeamA()) { - notifymsg.set_a_team_id(room->GetMobaTeamB()->GetTeamId()); - notifymsg.set_a_kill_count(room->GetMobaTeamB()->GetKillCount()); - } - if (room->GetMobaTeamB()) { - notifymsg.set_b_team_id(room->GetMobaTeamA()->GetTeamId()); - notifymsg.set_b_kill_count(room->GetMobaTeamA()->GetKillCount()); - } - } else { - if (room->GetMobaTeamA()) { - notifymsg.set_a_team_id(room->GetMobaTeamA()->GetTeamId()); - notifymsg.set_a_kill_count(room->GetMobaTeamA()->GetKillCount()); - } - if (room->GetMobaTeamB()) { - notifymsg.set_b_team_id(room->GetMobaTeamB()->GetTeamId()); - notifymsg.set_b_kill_count(room->GetMobaTeamB()->GetKillCount()); - } - } -#else if (room->GetMobaTeamA()) { notifymsg.set_a_team_id(room->GetMobaTeamA()->GetTeamId()); notifymsg.set_a_kill_count(room->GetMobaTeamA()->GetKillCount()); @@ -1749,8 +1728,7 @@ void Human::SendUIUpdate() notifymsg.set_b_team_id(room->GetMobaTeamB()->GetTeamId()); notifymsg.set_b_kill_count(room->GetMobaTeamB()->GetKillCount()); } -#endif -#ifdef MYDEBUG1 +#ifdef MYDEBUG a8::XPrintf("zzzzzzzzzzzzz self_team_id:%d data:%s\n", { GetTeam()->GetTeamId(), @@ -2279,33 +2257,40 @@ void Human::SendViewerUiNotify() return true; }); #ifdef MYDEBUG - a8::XPrintf("SMViewerUiNotify %s", {f8::PbToJson(&msg)}); + a8::XPrintf("SMViewerUiNotify %d %s\n", {socket_handle, f8::PbToJson(&msg)}); #endif SendNotifyMsg(msg); } void Human::SendViewerUiMemberUpdate(std::vector member_ids) { - if (!IsOb()) { - return; - } - cs::SMViewerUiMemberUpdate msg; - for (int id : member_ids) { - Player* hum = room->GetPlayerByUniId(id); - if (hum) { - auto m = msg.add_members(); - m->set_team_id(hum->GetTeam()->GetTeamId()); - m->set_member_uniid(hum->GetUniId()); - m->set_name(hum->GetName()); - m->set_avatar_url(hum->avatar_url); - m->set_hero_id(hum->meta->id()); - m->set_head_frame(hum->head_frame); - m->set_kills(hum->stats->kills); - m->set_dead(hum->dead); - m->set_downed(hum->downed); + if (room->GetRoomOb()->HasOb()) { + cs::SMViewerUiMemberUpdate msg; + for (int id : member_ids) { + Human* hum = room->GetHumanByUniId(id); + if (hum) { + auto m = msg.add_members(); + m->set_team_id(hum->GetTeam()->GetTeamId()); + m->set_member_uniid(hum->GetUniId()); + m->set_name(hum->GetName()); + m->set_avatar_url(hum->avatar_url); + m->set_hero_id(hum->meta->id()); + m->set_head_frame(hum->head_frame); + m->set_kills(hum->stats->kills); + m->set_dead(hum->dead); + m->set_downed(hum->downed); + } } + room->GetRoomOb()->TraverseOb + ( + [&msg] (Player* ele_hum) -> bool + { +#ifdef MYDEBUG + a8::XPrintf("SMViewerUiMemberNotify %d %s\n", {ele_hum->socket_handle, f8::PbToJson(&msg)}); +#endif + ele_hum->SendNotifyMsg(msg); + }); } - SendNotifyMsg(msg); } void GGListener::SendError(int sockhandle, unsigned int seqid, diff --git a/server/gameserver/roomob.h b/server/gameserver/roomob.h index a492b050..e48d6365 100644 --- a/server/gameserver/roomob.h +++ b/server/gameserver/roomob.h @@ -15,6 +15,7 @@ class RoomOb : public std::enable_shared_from_this Player* GetByAccountId(const std::string& account_id); void AddOb(Player* hum); void TraverseOb(std::function cb); + bool HasOb() { return !id_hash_.empty(); } private: Room* room_ = nullptr;