This commit is contained in:
aozhiwei 2021-06-22 12:53:14 +00:00
parent 6527baab03
commit ff2d2b2e9d
4 changed files with 49 additions and 49 deletions

View File

@ -158,7 +158,7 @@ bool Hero::IsCollisionInMapService()
!obstacle->CanThroughable(this)) { !obstacle->CanThroughable(this)) {
if (last_collision_door_ != collider->owner) { if (last_collision_door_ != collider->owner) {
OptResult opt_result = kOptPass; OptResult opt_result = kOptPass;
obstacle->OnCollisionTrigger(this, opt_result); obstacle->OnCollisionTrigger(this, collider, opt_result);
if (opt_result == kOptContinue) { if (opt_result == kOptContinue) {
continue; continue;
} else if (opt_result == kOptBreak) { } else if (opt_result == kOptBreak) {

View File

@ -510,68 +510,30 @@ bool Human::IsCollisionInMapService()
case ET_Obstacle: case ET_Obstacle:
{ {
Obstacle* obstacle = (Obstacle*)collider->owner; 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_Aabb && aabb_box.Intersect(collider)) ||
(collider->type == CT_Circle && self_collider_->Intersect((ColliderComponent*)collider)) (collider->type == CT_Circle && self_collider_->Intersect(collider))
) && )
!obstacle->CanThroughable(this)) { ) {
if (last_collision_door_ != collider->owner) { if (last_collision_door_ != collider->owner) {
OptResult opt_result = kOptPass; OptResult opt_result = kOptPass;
obstacle->OnCollisionTrigger(this, opt_result); obstacle->OnCollisionTrigger(this, collider, opt_result);
if (opt_result == kOptContinue) { if (opt_result == kOptContinue) {
continue; continue;
} else if (opt_result == kOptBreak) { } else if (opt_result == kOptBreak) {
return true; 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; break;
case ET_Building: case ET_Building:
{ {
#if 1
if ( if (
( (collider->type == CT_Aabb && aabb_box.Intersect(collider)) ||
(collider->type == CT_Aabb && aabb_box.Intersect((ColliderComponent*)collider)) || (collider->type == CT_Circle && self_collider_->Intersect(collider))
(collider->type == CT_Circle && self_collider_->Intersect((ColliderComponent*)collider))
)
) { ) {
#else
if (!collider->owner->dead && TestCollision((ColliderComponent*)collider)) {
#endif
if (last_collision_door_ != collider->owner) { if (last_collision_door_ != collider->owner) {
Global::last_collider = collider; Global::last_collider = collider;
return true; return true;
@ -580,6 +542,8 @@ bool Human::IsCollisionInMapService()
} }
break; break;
default: default:
{
}
break; break;
} }
} }

View File

@ -577,6 +577,9 @@ void Obstacle::OnExplosionHit(Explosion* e)
bool Obstacle::CanThroughable(Creature* c) bool Obstacle::CanThroughable(Creature* c)
{ {
if (IsDead(c->room)) {
return true;
}
switch (meta->i->collision_hit()) { switch (meta->i->collision_hit()) {
case kCollisionHitPass: case kCollisionHitPass:
{ {
@ -664,7 +667,7 @@ bool Obstacle::DoInteraction(Human* sender)
return false; return false;
} }
void Obstacle::OnCollisionTrigger(Creature* c, OptResult& opt_result) void Obstacle::OnCollisionTrigger(Creature* c, ColliderComponent* collider, OptResult& opt_result)
{ {
opt_result = kOptPass; opt_result = kOptPass;
switch (meta->i->thing_type()) { switch (meta->i->thing_type()) {
@ -697,6 +700,39 @@ void Obstacle::OnCollisionTrigger(Creature* c, OptResult& opt_result)
} }
break; 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) void Obstacle::DoHideHouseInteraction(Human* sender)

View File

@ -48,7 +48,7 @@ class Obstacle : public Entity
virtual bool CanThroughable(Creature* c); virtual bool CanThroughable(Creature* c);
virtual bool CanThroughable(Bullet* bullet); virtual bool CanThroughable(Bullet* bullet);
virtual bool DoInteraction(Human* sender); 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 CanSeeMe(Human* hum);
virtual bool ReceiveExplosionDmg(Explosion* explosion) override; virtual bool ReceiveExplosionDmg(Explosion* explosion) override;
void SetDoorInfo(Building* building, int door_id_x); void SetDoorInfo(Building* building, int door_id_x);