From c0a628978b865ad3ad2b55723bf8f046c23ce52a Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 9 Jul 2021 09:13:34 +0000 Subject: [PATCH] 1 --- server/gameserver/ability.cc | 19 +++++++++++++++++++ server/gameserver/ability.h | 6 ++++++ server/gameserver/creature.cc | 3 +++ server/gameserver/human.cc | 2 ++ server/gameserver/player.cc | 5 +++++ 5 files changed, 35 insertions(+) diff --git a/server/gameserver/ability.cc b/server/gameserver/ability.cc index 16f5a13..1692beb 100644 --- a/server/gameserver/ability.cc +++ b/server/gameserver/ability.cc @@ -63,6 +63,7 @@ void Ability::Clear() { buff_attr_abs_ = {}; buff_attr_rate_ = {}; + buff_attr_flag_ = {}; } float* Ability::GetBuffAttrAbsPtr(int attr_id) @@ -70,6 +71,7 @@ float* Ability::GetBuffAttrAbsPtr(int attr_id) if (!IsValidHumanAttr(attr_id)) { return nullptr; } + buff_attr_flag_[attr_id] = 1; return &buff_attr_abs_[attr_id]; } @@ -78,5 +80,22 @@ float* Ability::GetBuffAttrRatePtr(int attr_id) if (!IsValidHumanAttr(attr_id)) { return nullptr; } + buff_attr_flag_[attr_id] = 1; return &buff_attr_rate_[attr_id]; } + +void Ability::FillMFAttrAdditionList(Room* room, Human* hum, + ::google::protobuf::RepeatedPtrField<::cs::MFAttrAddition>* pb_attr_list) +{ + for (int attr_id = 0; attr_id < kHAT_End; ++attr_id) { + if (!(attr_id == 12 || attr_id == 33)) { + continue; + } + if (buff_attr_flag_[attr_id]) { + auto pb_attr = pb_attr_list->Add(); + pb_attr->set_attr_id(attr_id); + pb_attr->set_abs_val(buff_attr_abs_[attr_id]); + pb_attr->set_rate_val(buff_attr_rate_[attr_id]); + } + } +} diff --git a/server/gameserver/ability.h b/server/gameserver/ability.h index 730bac9..b1e56fb 100644 --- a/server/gameserver/ability.h +++ b/server/gameserver/ability.h @@ -1,7 +1,10 @@ #pragma once +#include "cs_proto.pb.h" #include "weakptr.h" +class Room; +class Human; class Ability { public: @@ -14,8 +17,11 @@ class Ability float GetBuffAttrRate(int attr_id); float* GetBuffAttrAbsPtr(int attr_id); float* GetBuffAttrRatePtr(int attr_id); + void FillMFAttrAdditionList(Room* room, Human* hum, + ::google::protobuf::RepeatedPtrField<::cs::MFAttrAddition>* pb_attr_list); private: std::array buff_attr_abs_ = {}; std::array buff_attr_rate_ = {}; + std::array buff_attr_flag_ = {}; }; diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 124590d..c5a38bb 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -436,6 +436,9 @@ void Creature::RecalcBuffAttr() SetHP(GetMaxHP()); GetTrigger()->HpChg(); } + if (IsHuman()) { + need_sync_active_player = true; + } } void Creature::OnBuffRemove(Buff& buff) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 80fb5b3..c6f0f3b 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -168,6 +168,7 @@ void Human::FillMFObjectLess(Room* room, Human* hum, cs::MFPlayerFull* full_data p->set_shoot_offset_x(shoot_offset.x); p->set_shoot_offset_y(shoot_offset.y); GetCurrWeapon()->ToPB(p->mutable_weapon()); + GetAbility()->FillMFAttrAdditionList(room, this, p->mutable_attr_addition()); } void Human::FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data) @@ -1282,6 +1283,7 @@ void Human::FillMFActivePlayerData(cs::MFActivePlayerData* player_data) FillSkillList(player_data->mutable_skill_list()); player_data->set_shoot_offset_x(shoot_offset.x); player_data->set_shoot_offset_y(shoot_offset.y); + GetAbility()->FillMFAttrAdditionList(room, this, player_data->mutable_attr_addition()); } void Human::FillMFGasData(cs::MFGasData* gas_data) diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 6331af9..4ccbf2a 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -1213,6 +1213,11 @@ void Player::_CMExecCommand(f8::MsgHdr& hdr, const cs::CMExecCommand& msg) if (buff_meta) { MustBeAddBuff(this, buff_id); } + } else if (cmd == "getattr" && cmds.size() >= 2) { + int attr_id = a8::XValue(cmds[1]); + float abs_val = GetAbility()->GetAttrAbs(attr_id); + float rate_val = GetAbility()->GetAttrRate(attr_id); + SendDebugMsg(a8::Format("attr_id:%d abs_val:%f rate_val:%f", {attr_id, abs_val, rate_val})); } }