From 01803f1290e76bbf7728f1725f65d82ffd765a10 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 19 Aug 2021 05:35:08 +0000 Subject: [PATCH] =?UTF-8?q?=E7=88=86=E7=82=B8=E6=88=98=E5=89=8D=E6=97=A0?= =?UTF-8?q?=E4=BC=A4=E5=AE=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/explosion.cc | 7 +++++++ server/gameserver/explosion.h | 2 ++ server/gameserver/hero.cc | 13 +++++++++++++ server/gameserver/human.cc | 13 +++++++++++++ server/gameserver/obstacle.cc | 4 ++++ 5 files changed, 39 insertions(+) diff --git a/server/gameserver/explosion.cc b/server/gameserver/explosion.cc index 7f181c0..ae259d0 100644 --- a/server/gameserver/explosion.cc +++ b/server/gameserver/explosion.cc @@ -24,6 +24,7 @@ void Explosion::IndifferenceAttack(Room* room, dmg_ = dmg; center_ = center; special_damage_type_ = special_damage_type; + create_frameno_ = room_->GetFrameNo(); InternalAttack(); } @@ -45,6 +46,7 @@ void Explosion::EnemyAndObstacleAttack(CreatureWeakPtr& sender, dmg_ = dmg; center_ = center; special_damage_type_ = special_damage_type; + create_frameno_ = room_->GetFrameNo(); InternalAttack(); } @@ -122,3 +124,8 @@ void Explosion::InternalAttack() target->OnExplosionHit(this); } } + +bool Explosion::IsPreBattleExplosion() +{ + return create_frameno_ <= room_->GetBattleStartFrameNo(); +} diff --git a/server/gameserver/explosion.h b/server/gameserver/explosion.h index 4856975..80a8bd6 100644 --- a/server/gameserver/explosion.h +++ b/server/gameserver/explosion.h @@ -12,6 +12,7 @@ class Explosion CreatureWeakPtr GetSender() { return sender_; }; float GetDmg() { return dmg_; }; long long GetSpecialDamageType() { return special_damage_type_; }; + bool IsPreBattleExplosion(); void IndifferenceAttack(Room* room, const a8::Vec2& center, @@ -37,4 +38,5 @@ class Explosion float dmg_ = 0; a8::Vec2 center_; long long special_damage_type_ = 0; + long long create_frameno_ = 0; }; diff --git a/server/gameserver/hero.cc b/server/gameserver/hero.cc index 9632348..5f0449b 100644 --- a/server/gameserver/hero.cc +++ b/server/gameserver/hero.cc @@ -86,6 +86,14 @@ void Hero::OnExplosionHit(Explosion* e) if (dead) { return; } + if (e->IsPreBattleExplosion()) { + return; + } + if (HasBuffEffect(kBET_Jump) || + HasBuffEffect(kBET_Fly)) { + return; + } + RemoveBuffByEffectId(kBET_PeaceMode); float dmg = e->GetDmg(); float def = GetDef() * (1 + GetAbility()->GetAttrRate(kHAT_Def)) + @@ -118,6 +126,11 @@ void Hero::OnBulletHit(Bullet* bullet) if (IsInvincible()) { return; } + if (HasBuffEffect(kBET_Jump) || + HasBuffEffect(kBET_Fly)) { + return; + } + RemoveBuffByEffectId(kBET_PeaceMode); if (!IsDead(room) && (bullet->IsBomb() || bullet->sender.Get()->team_id != team_id)) { float dmg = bullet->GetAtk(); diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index f9842f4..d4810d1 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3602,6 +3602,11 @@ void Human::OnBulletHit(Bullet* bullet) bullet->sender.Get()->GetRace() == GetRace()) { return; } + if (HasBuffEffect(kBET_Jump) || + HasBuffEffect(kBET_Fly)) { + return; + } + RemoveBuffByEffectId(kBET_PeaceMode); if (!dead && (bullet->IsBomb() || bullet->sender.Get()->team_id != team_id)) { float old_hp = GetHP(); @@ -3658,6 +3663,14 @@ void Human::OnExplosionHit(Explosion* e) if (dead) { return; } + if (e->IsPreBattleExplosion()) { + return; + } + if (HasBuffEffect(kBET_Jump) || + HasBuffEffect(kBET_Fly)) { + return; + } + RemoveBuffByEffectId(kBET_PeaceMode); float dmg = e->GetDmg(); float def = GetDef() * (1 + GetAbility()->GetAttrRate(kHAT_Def)) + diff --git a/server/gameserver/obstacle.cc b/server/gameserver/obstacle.cc index 99a8655..826d6e2 100644 --- a/server/gameserver/obstacle.cc +++ b/server/gameserver/obstacle.cc @@ -475,6 +475,7 @@ void Obstacle::OnBulletHit(Bullet* bullet) if (bullet->IsPreBattleBullet()) { return; } + if (!IsDead(bullet->room) && !IsTerminatorAirDropBox(bullet->room)) { if (meta->receive_special_damage_type != 0 && @@ -556,6 +557,9 @@ void Obstacle::OnExplosionHit(Explosion* e) ((e->GetSpecialDamageType() & meta->receive_special_damage_type) == 0)) { return; } + if (e->IsPreBattleExplosion()) { + return; + } float dmg = e->GetDmg(); float def = 0;