From ff2d2b2e9db5480c1e624f066f57c51b4193a0bf Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Tue, 22 Jun 2021 12:53:14 +0000 Subject: [PATCH] 1 --- server/gameserver/hero.cc | 2 +- server/gameserver/human.cc | 56 +++++++---------------------------- server/gameserver/obstacle.cc | 38 +++++++++++++++++++++++- server/gameserver/obstacle.h | 2 +- 4 files changed, 49 insertions(+), 49 deletions(-) diff --git a/server/gameserver/hero.cc b/server/gameserver/hero.cc index 30afa18..0846879 100644 --- a/server/gameserver/hero.cc +++ b/server/gameserver/hero.cc @@ -158,7 +158,7 @@ bool Hero::IsCollisionInMapService() !obstacle->CanThroughable(this)) { if (last_collision_door_ != collider->owner) { OptResult opt_result = kOptPass; - obstacle->OnCollisionTrigger(this, opt_result); + obstacle->OnCollisionTrigger(this, collider, opt_result); if (opt_result == kOptContinue) { continue; } else if (opt_result == kOptBreak) { diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index a06d6ba..867feeb 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -510,68 +510,30 @@ bool Human::IsCollisionInMapService() case ET_Obstacle: { Obstacle* obstacle = (Obstacle*)collider->owner; - if (!obstacle->IsDead(room) && + if (!obstacle->CanThroughable(this) && ( - (collider->type == CT_Aabb && aabb_box.Intersect((ColliderComponent*)collider)) || - (collider->type == CT_Circle && self_collider_->Intersect((ColliderComponent*)collider)) - ) && - !obstacle->CanThroughable(this)) { + (collider->type == CT_Aabb && aabb_box.Intersect(collider)) || + (collider->type == CT_Circle && self_collider_->Intersect(collider)) + ) + ) { if (last_collision_door_ != collider->owner) { OptResult opt_result = kOptPass; - obstacle->OnCollisionTrigger(this, opt_result); + obstacle->OnCollisionTrigger(this, collider, opt_result); if (opt_result == kOptContinue) { continue; } else if (opt_result == kOptBreak) { return true; } - if (!obstacle->IsDead(room) && - #if 0 - obstacle->Attackable(this) && - #endif - obstacle->meta->i->drop() != 0 && - obstacle->IsTouchInteraction() && - room->GetGasData().gas_mode != GasInactive && - (!obstacle->IsTerminatorAirDropBox(room) || GetRace() == kHumanRace) - ) { - obstacle->Die(room); - if (obstacle->IsDead(room)) { - #if 0 - if (obstacle->meta->i->damage_dia() > 0.01f && - obstacle->meta->i->damage() > 0.01f) { - obstacle->Explosion(this); - } - #endif - DropItems(obstacle); - } - obstacle->BroadcastFullState(room); - if (obstacle->IsTerminatorAirDropBox(room) && - GetRace() == kHumanRace && - !HasBuffEffect(kBET_Terminator)) { - MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(TERMINATOR_BUFF_ID); - if (buff_meta) { - AddBuff(this, buff_meta, 1); - } - } - } else { - Global::last_collider = collider; - return true; - } } } } break; case ET_Building: { -#if 1 if ( - ( - (collider->type == CT_Aabb && aabb_box.Intersect((ColliderComponent*)collider)) || - (collider->type == CT_Circle && self_collider_->Intersect((ColliderComponent*)collider)) - ) + (collider->type == CT_Aabb && aabb_box.Intersect(collider)) || + (collider->type == CT_Circle && self_collider_->Intersect(collider)) ) { -#else - if (!collider->owner->dead && TestCollision((ColliderComponent*)collider)) { -#endif if (last_collision_door_ != collider->owner) { Global::last_collider = collider; return true; @@ -580,6 +542,8 @@ bool Human::IsCollisionInMapService() } break; default: + { + } break; } } diff --git a/server/gameserver/obstacle.cc b/server/gameserver/obstacle.cc index 26a96f9..e6a0e1f 100644 --- a/server/gameserver/obstacle.cc +++ b/server/gameserver/obstacle.cc @@ -577,6 +577,9 @@ void Obstacle::OnExplosionHit(Explosion* e) bool Obstacle::CanThroughable(Creature* c) { + if (IsDead(c->room)) { + return true; + } switch (meta->i->collision_hit()) { case kCollisionHitPass: { @@ -664,7 +667,7 @@ bool Obstacle::DoInteraction(Human* sender) return false; } -void Obstacle::OnCollisionTrigger(Creature* c, OptResult& opt_result) +void Obstacle::OnCollisionTrigger(Creature* c, ColliderComponent* collider, OptResult& opt_result) { opt_result = kOptPass; switch (meta->i->thing_type()) { @@ -697,6 +700,39 @@ void Obstacle::OnCollisionTrigger(Creature* c, OptResult& opt_result) } break; } + #if 0 + Global::last_collider = collider; + #endif +#if 0 + if (!obstacle->IsDead(room) && +#if 0 + obstacle->Attackable(this) && +#endif + obstacle->meta->i->drop() != 0 && + obstacle->IsTouchInteraction() && + room->GetGasData().gas_mode != GasInactive && + (!obstacle->IsTerminatorAirDropBox(room) || GetRace() == kHumanRace) + ) { + obstacle->Die(room); + if (obstacle->IsDead(room)) { +#if 0 + if (obstacle->meta->i->damage_dia() > 0.01f && + obstacle->meta->i->damage() > 0.01f) { + obstacle->Explosion(this); + } +#endif + DropItems(obstacle); + } + obstacle->BroadcastFullState(room); + if (obstacle->IsTerminatorAirDropBox(room) && + GetRace() == kHumanRace && + !HasBuffEffect(kBET_Terminator)) { + MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(TERMINATOR_BUFF_ID); + if (buff_meta) { + AddBuff(this, buff_meta, 1); + } + } +#endif } void Obstacle::DoHideHouseInteraction(Human* sender) diff --git a/server/gameserver/obstacle.h b/server/gameserver/obstacle.h index c5474f2..6e01fa5 100644 --- a/server/gameserver/obstacle.h +++ b/server/gameserver/obstacle.h @@ -48,7 +48,7 @@ class Obstacle : public Entity virtual bool CanThroughable(Creature* c); virtual bool CanThroughable(Bullet* bullet); virtual bool DoInteraction(Human* sender); - virtual void OnCollisionTrigger(Creature* c, OptResult& opt_result); + virtual void OnCollisionTrigger(Creature* c, ColliderComponent* collider, OptResult& opt_result); virtual bool CanSeeMe(Human* hum); virtual bool ReceiveExplosionDmg(Explosion* explosion) override; void SetDoorInfo(Building* building, int door_id_x);