1
This commit is contained in:
parent
6527baab03
commit
ff2d2b2e9d
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user