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