From 6ba0c3cd3d4a0d172bb4b4a54eef2febcb9116b1 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 13 May 2020 15:18:53 +0800 Subject: [PATCH] 1 --- server/gameserver/bullet.cc | 9 ++++-- server/gameserver/human.cc | 16 ++++++++++ server/gameserver/human.h | 4 ++- server/gameserver/player.cc | 58 ++++++++++++++++++++++++++++--------- server/gameserver/player.h | 2 ++ 5 files changed, 72 insertions(+), 17 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index b4d1a75..8208238 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -51,7 +51,8 @@ void Bullet::OnHit(std::set& objects) return; } Human* hum = (Human*)target; - if (hum->HasBuffEffect(kBET_Invincible)) { + if (hum->HasBuffEffect(kBET_Invincible) || + hum->HasBuffEffect(kBET_LordMode)) { continue; } #if 1 @@ -61,12 +62,14 @@ void Bullet::OnHit(std::set& objects) (hum->team_id == 0 || player->team_id != hum->team_id)) { #endif #if 1 - float dmg = gun_meta->i->atk() * (1 + player->atk_add); + float dmg = gun_meta->i->atk() * (1 + hum->GetBuffAttrRate(kHAT_Atk)) + + hum->GetBuffAttrAbs(kHAT_Atk); #else float dmg = gun_meta->i->atk() * (1 + player->buff.damage_add + player->atk_add); #endif #if 1 - float def = hum->ability.def; + float def = hum->ability.def * (1 + hum->GetBuffAttrRate(kHAT_Def)) + + hum->GetBuffAttrAbs(kHAT_Def); #else float def = hum->def + hum->buff.def_add; #endif diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index c8fa2e1..ac503c4 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -2915,6 +2915,22 @@ void Human::DecItem(int item_id, int item_num) } } +float Human::GetBuffAttrAbs(int attr_type) +{ + if (IsValidHumanAttr(attr_type)) { + return buff_attr_abs_[attr_type]; + } + return 0; +} + +float Human::GetBuffAttrRate(int attr_type) +{ + if (IsValidHumanAttr(attr_type)) { + return buff_attr_rate_[attr_type]; + } + return 0; +} + void Human::RecalcBuffAttr() { buff_attr_abs_ = {}; diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 6d7accd..50d2ada 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -134,6 +134,7 @@ class Human : public Entity a8::Vec2 skill_target_pos; float skill_param1 = 0; bool playing_skill = false; + xtimer_list* ad_timer_ = nullptr; Human(); virtual ~Human() override; @@ -243,6 +244,8 @@ class Human : public Entity int GetItemNum(int item_id); void AddItem(int item_id, int item_num); void DecItem(int item_id, int item_num); + float GetBuffAttrAbs(int attr_id); + float GetBuffAttrRate(int attr_id); protected: void _UpdateMove(int speed); @@ -307,7 +310,6 @@ protected: HumanCar car_; MetaData::Skill* skill_meta_ = nullptr; - xtimer_list* ad_timer_ = nullptr; private: CircleCollider* self_collider_ = nullptr; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index bd218ee..7156e2c 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -1228,6 +1228,10 @@ void Player::_CMAdStart(f8::MsgHdr& hdr, const cs::CMAdStart& msg) if (GetBuffByEffectId(kBET_AdPlaying)) { return; } + if (ad_timer_) { + room->xtimer.DeleteTimer(ad_timer_); + ad_timer_ = nullptr; + } MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(ADPLAY_BUFFID); if (buff_meta) { AddBuff(buff_meta, 1); @@ -1238,12 +1242,14 @@ void Player::_CMAdStart(f8::MsgHdr& hdr, const cs::CMAdStart& msg) .SetSender(this), [] (const a8::XParams& param) { - + Player* hum = (Player*)param.sender.GetUserData(); + hum->InternalAdCancel(); }, - &xtimer_attacher.timer_list, + &xtimer_attacher.timer_list_, [] (const a8::XParams& param) { - + Human* hum = (Human*)param.sender.GetUserData(); + hum->ad_timer_ = nullptr; } ); } @@ -1251,19 +1257,45 @@ void Player::_CMAdStart(f8::MsgHdr& hdr, const cs::CMAdStart& msg) void Player::_CMAdCancel(f8::MsgHdr& hdr, const cs::CMAdCancel& msg) { - if (GetBuffByEffectId(kBET_LordMode)) { - return; - } - if (GetBuffByEffectId(kBET_AdPlaying)) { - RemoveBuffByEffectId(kBET_AdPlaying); - if (ad_timer_) { - room->xtimer.DeleteTimer(ad_timer_); - ad_timer_ = nullptr; - } - } + InternalAdCancel(); } void Player::_CMAdEnd(f8::MsgHdr& hdr, const cs::CMAdEnd& msg) +{ + if (GetBuffByEffectId(kBET_LordMode)) { + return; + } + if (GetBuffByEffectId(kBET_AdPlaying)) { + MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(ADPLAY_BUFFID); + if (buff_meta) { + MetaData::Buff* lord_buff_meta = nullptr; + if (msg.param() == 1) { + lord_buff_meta = MetaMgr::Instance()->GetBuff(buff_meta->param1); + } else if (msg.param() == 2) { + lord_buff_meta = MetaMgr::Instance()->GetBuff(buff_meta->param2); + } + if (lord_buff_meta) { + AddBuff(lord_buff_meta, 1); + std::vector strings; + a8::Split(lord_buff_meta->i->buff_param1(), strings, ':'); + for (auto& str : strings) { + int buff_id = a8::XValue(str); + MetaData::Buff* ext_buff_meta = MetaMgr::Instance()->GetBuff(buff_id); + if (ext_buff_meta) { + AddBuff(ext_buff_meta, 1); + } + } + } + } + RemoveBuffByEffectId(kBET_AdPlaying); + if (ad_timer_) { + room->xtimer.DeleteTimer(ad_timer_); + ad_timer_ = nullptr; + } + } +} + +void Player::InternalAdCancel() { if (GetBuffByEffectId(kBET_LordMode)) { return; diff --git a/server/gameserver/player.h b/server/gameserver/player.h index 0501d98..db29c3f 100644 --- a/server/gameserver/player.h +++ b/server/gameserver/player.h @@ -99,4 +99,6 @@ class Player : public Human void _CMAdCancel(f8::MsgHdr& hdr, const cs::CMAdCancel& msg); void _CMAdEnd(f8::MsgHdr& hdr, const cs::CMAdEnd& msg); +private: + void InternalAdCancel(); };