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)) {
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) {

View File

@ -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;
}
}

View File

@ -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)

View File

@ -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);