From 9a085fc04fa9b110d309fb2abe4b21bf95a5c5fc Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 27 Sep 2022 11:10:19 +0800 Subject: [PATCH] 1 --- server/gameserver/bullet.cc | 13 +++++--- server/gameserver/bullet.h | 3 +- server/gameserver/creature.cc | 13 +++++--- server/gameserver/creature.h | 6 ++-- server/gameserver/player.cc | 60 +++++++++++++++++++---------------- 5 files changed, 53 insertions(+), 42 deletions(-) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 5f1193b1..9ad4b0c8 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -50,11 +50,7 @@ void Bullet::Initialize() void Bullet::Update(int delta_time) { - if (trace_target_id) { - ClearBuffList(); - room->RemoveObjectLater(this); - later_removed_ = true; - } else { + if (!trace_target_id) { MapServiceUpdate(); ++updated_times_; } @@ -831,3 +827,10 @@ void Bullet::ProcFlyHook(Entity* target) &sender.Get()->xtimer_attacher.timer_list_ ); } + +void Bullet::ForceRemove() +{ + ClearBuffList(); + room->RemoveObjectLater(this); + later_removed_ = true; +} diff --git a/server/gameserver/bullet.h b/server/gameserver/bullet.h index 3963543d..ba7c3ffe 100644 --- a/server/gameserver/bullet.h +++ b/server/gameserver/bullet.h @@ -43,13 +43,14 @@ class Bullet : public MoveableEntity float GetExplosionRange(); bool IsCurrWeapon(); bool IsPreBattleBullet(); + void ForceRemove(); + void OnHit(std::set& objects); protected: Bullet(); private: - void OnHit(std::set& objects); void ProcBomb(); void ProcSmokeBomb(); void ProcFragBomb(int delay_time); diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index ce5271bb..3b1c57fd 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -113,12 +113,10 @@ static void InternalCreateBullet(BulletInfo& bullet_info) Entity* target = c->room->GetEntityByUniId(bullet_info.trace_target_uniid); if (target->IsCreature(c->room)) { bullet->trace_target_id = bullet_info.trace_target_uniid; - float finaly_dmg = ((Creature*)target)->GetBattleContext()->CalcDmg((Creature*)target, bullet); c->AddTraceBullet( bullet_uniid, bullet_info.trace_target_uniid, - bullet_info.weapon_meta->i->id(), - finaly_dmg + bullet_info.weapon_meta->i->id() ); } } @@ -3574,9 +3572,9 @@ void Creature::AutoNavigation(a8::Vec2 target_pos, float speed) } -void Creature::AddTraceBullet(int bullet_uniid, int target_uniid, int gun_id, float dmg) +void Creature::AddTraceBullet(int bullet_uniid, int target_uniid, int gun_id) { - trace_bullet_hash_[bullet_uniid] = std::make_tuple(target_uniid, gun_id, dmg); + trace_bullet_hash_[bullet_uniid] = std::make_tuple(target_uniid, gun_id); room->xtimer.AddDeadLineTimerAndAttach ( SERVER_FRAME_RATE * 10, @@ -3587,6 +3585,11 @@ void Creature::AddTraceBullet(int bullet_uniid, int target_uniid, int gun_id, fl { Creature* c = (Creature*)param.sender.GetUserData(); c->trace_bullet_hash_.erase(param.param1); + Entity* entity = c->room->GetEntityByUniId(param.param1); + if (entity && entity->GetEntityType() == ET_Bullet) { + Bullet* bullet = (Bullet*)bullet; + bullet->ForceRemove(); + } }, &xtimer_attacher.timer_list_); } diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index 6804b829..6ae7d8ea 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -276,7 +276,7 @@ class Creature : public MoveableEntity float GetAttrRate(int attr_id); void RecalcDtoAttr(); void AutoNavigation(a8::Vec2 target_pos, float speed); - void AddTraceBullet(int bullet_uniid, int target_uniid, int gun_id, float dmg); + void AddTraceBullet(int bullet_uniid, int target_uniid, int gun_id); protected: virtual void OnBuffRemove(Buff& buff); @@ -322,8 +322,8 @@ protected: long long last_follow_move_frameno_ = 0; int follow_target_last_chg_move_dir_times_ = -1; xtimer_list* follow_target_timer_ = nullptr; - //target_uniid, gun_id, dmg - std::map> trace_bullet_hash_; + //target_uniid, gun_id + std::map> trace_bullet_hash_; private: CreatureWeakPtr weak_ptr_; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index c41f0d2f..cb840a5b 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -1116,34 +1116,38 @@ void Player::_CMRequestBulletDmg(f8::MsgHdr& hdr, const cs::CMRequestBulletDmg& } auto& tuple = itr->second; - Entity* entity = room->GetEntityByUniId(std::get<0>(tuple)); - if (entity && entity->IsCreature(room) && entity != this) { - Creature* c = (Creature*)entity; - float dmg = std::get<2>(tuple); - if (msg.strengthen_wall_uniid()) { - dmg *= 2; - } - bool shield = false; - if (dmg > 0.00001f) { - if (msg.shield_hit()) { - Buff* hold_shield_buff = c->GetBuffByEffectId(kBET_HoldShield); - if (hold_shield_buff) { - c->shield_hp_ = std::max(0.0f, c->shield_hp_ - dmg); - room->frame_event.AddPropChg(c->GetWeakPtrRef(), - kPropShieldHp, - c->shield_max_hp_, - c->shield_hp_); - if (c->shield_hp_ <= 0) { - c->RemoveBuffByUniId(hold_shield_buff->buff_uniid); - } - shield = true; - } + Entity* bullet_entity = room->GetEntityByUniId(msg.bullet_uniid()); + if (bullet_entity && bullet_entity->GetEntityType() == ET_Bullet) { + Bullet* bullet = (Bullet*)bullet_entity; + Entity* entity = room->GetEntityByUniId(msg.target_uniid()); + if (entity && entity->IsCreature(room) && entity != this && !entity->IsDead(room)) { + Creature* c = (Creature*)entity; + float dmg = c->GetBattleContext()->CalcDmg(c, bullet); + if (msg.strengthen_wall_uniid()) { + dmg *= 2; } - if (!shield) { - DecHP(dmg, - GetUniId(), - GetName(), - std::get<1>(tuple)); + bool shield = false; + if (dmg > 0.00001f) { + if (msg.shield_hit()) { + Buff* hold_shield_buff = c->GetBuffByEffectId(kBET_HoldShield); + if (hold_shield_buff) { + c->shield_hp_ = std::max(0.0f, c->shield_hp_ - dmg); + room->frame_event.AddPropChg(c->GetWeakPtrRef(), + kPropShieldHp, + c->shield_max_hp_, + c->shield_hp_); + if (c->shield_hp_ <= 0) { + c->RemoveBuffByUniId(hold_shield_buff->buff_uniid); + } + shield = true; + } + } + if (!shield) { + DecHP(dmg, + GetUniId(), + GetName(), + std::get<1>(tuple)); + } } } } @@ -1308,7 +1312,7 @@ void Player::AsyncRequestWatchWar(bool send_rsp_msg) target->StartRefreshViewTimer(); } else { respmsg.set_error_code(1); - respmsg.set_error_msg("无法观战"); + respmsg.set_error_msg("no watch war"); hum->SendNotifyMsg(respmsg); } };