隐藏点Ok
This commit is contained in:
parent
8438d583af
commit
2b8d8d1993
@ -331,6 +331,9 @@ enum ObstacleType_e
|
||||
kObstacleMine = 2,
|
||||
kObstacleTrap = 3,
|
||||
kObstaclePosionGas = 4,
|
||||
kObstacleSpring = 5,
|
||||
kObstacleHideHouse = 6,
|
||||
kObstacleGully = 7,
|
||||
};
|
||||
|
||||
const char* const PROJ_NAME_FMT = "game%d_gameserver";
|
||||
|
@ -584,3 +584,36 @@ bool Obstacle::CanThroughable(Bullet* bullet)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Obstacle::DoInteraction(Human* sender)
|
||||
{
|
||||
if (IsDoor()) {
|
||||
if (GetDoorState(sender->room) == DoorStateClose) {
|
||||
SetDoorState(sender->room, DoorStateOpen);
|
||||
float x = GetBuilding()->GetX() + GetDoorState1()->x() - GetBuilding()->meta->i->tilewidth() / 2.0;
|
||||
float y = GetBuilding()->GetY() + GetDoorState1()->y() - GetBuilding()->meta->i->tileheight() / 2.0;
|
||||
SetPos(a8::Vec2(x, y));
|
||||
} else {
|
||||
SetDoorState(sender->room, DoorStateClose);
|
||||
float x = GetBuilding()->GetX() + GetDoorState0()->x() - GetBuilding()->meta->i->tilewidth() / 2.0;
|
||||
float y = GetBuilding()->GetY() + GetDoorState0()->y() - GetBuilding()->meta->i->tileheight() / 2.0;
|
||||
SetPos(a8::Vec2(x, y));
|
||||
}
|
||||
IncDoorOpenTimes(sender->room);
|
||||
RecalcSelfCollider();
|
||||
sender->room->TraverseHumanList
|
||||
(a8::XParams(),
|
||||
[this] (Human* hum, a8::XParams& param) -> bool
|
||||
{
|
||||
hum->AddToNewObjects(this);
|
||||
if (TestCollision(hum->room, hum)) {
|
||||
hum->SetLastCollisionDoor(this);
|
||||
} else if (hum->GetLastCollisionDoor() == this) {
|
||||
hum->SetLastCollisionDoor(nullptr);
|
||||
}
|
||||
return true;
|
||||
});
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -44,6 +44,7 @@ class Obstacle : public Entity
|
||||
virtual bool IsTerminatorAirDropBox(Room* room) { return false; }
|
||||
virtual bool CanThroughable(Creature* c);
|
||||
virtual bool CanThroughable(Bullet* bullet);
|
||||
virtual bool DoInteraction(Human* sender);
|
||||
void Explosion(Bullet* bullet);
|
||||
void SetDoorInfo(Building* building, int door_id_x);
|
||||
bool IsDoor();
|
||||
|
@ -478,32 +478,7 @@ void Player::ProcInteraction()
|
||||
|
||||
void Player::ObstacleInteraction(Obstacle* entity)
|
||||
{
|
||||
if (entity->IsDoor()) {
|
||||
if (entity->GetDoorState(room) == DoorStateClose) {
|
||||
entity->SetDoorState(room, DoorStateOpen);
|
||||
float x = entity->GetBuilding()->GetX() + entity->GetDoorState1()->x() - entity->GetBuilding()->meta->i->tilewidth() / 2.0;
|
||||
float y = entity->GetBuilding()->GetY() + entity->GetDoorState1()->y() - entity->GetBuilding()->meta->i->tileheight() / 2.0;
|
||||
entity->SetPos(a8::Vec2(x, y));
|
||||
} else {
|
||||
entity->SetDoorState(room, DoorStateClose);
|
||||
float x = entity->GetBuilding()->GetX() + entity->GetDoorState0()->x() - entity->GetBuilding()->meta->i->tilewidth() / 2.0;
|
||||
float y = entity->GetBuilding()->GetY() + entity->GetDoorState0()->y() - entity->GetBuilding()->meta->i->tileheight() / 2.0;
|
||||
entity->SetPos(a8::Vec2(x, y));
|
||||
}
|
||||
entity->IncDoorOpenTimes(room);
|
||||
entity->RecalcSelfCollider();
|
||||
room->TraverseHumanList(a8::XParams(),
|
||||
[entity] (Human* hum, a8::XParams& param) -> bool
|
||||
{
|
||||
hum->AddToNewObjects(entity);
|
||||
if (entity->TestCollision(hum->room, hum)) {
|
||||
hum->SetLastCollisionDoor(entity);
|
||||
} else if (hum->GetLastCollisionDoor() == entity) {
|
||||
hum->SetLastCollisionDoor(nullptr);
|
||||
}
|
||||
return true;
|
||||
});
|
||||
}
|
||||
entity->DoInteraction(this);
|
||||
}
|
||||
|
||||
void Player::LootInteraction(Loot* entity)
|
||||
|
@ -349,7 +349,24 @@ void RoomObstacle::Active()
|
||||
ActivePosionGas();
|
||||
}
|
||||
break;
|
||||
case kObstacleSpring:
|
||||
{
|
||||
ActiveSpring();
|
||||
}
|
||||
break;
|
||||
case kObstacleHideHouse:
|
||||
{
|
||||
ActiveHideHouse();
|
||||
}
|
||||
break;
|
||||
case kObstacleGully:
|
||||
{
|
||||
ActiveGully();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -473,3 +490,71 @@ bool RoomObstacle::CanThroughable(Creature* c)
|
||||
return temp_through_;
|
||||
}
|
||||
}
|
||||
|
||||
void RoomObstacle::ActiveSpring()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void RoomObstacle::ActiveHideHouse()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void RoomObstacle::ActiveGully()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
bool RoomObstacle::DoInteraction(Human* sender)
|
||||
{
|
||||
if (Obstacle::DoInteraction(sender)) {
|
||||
return true;
|
||||
}
|
||||
switch (meta->i->thing_type()) {
|
||||
case kObstacleHideHouse:
|
||||
{
|
||||
DoHideHouseInteraction(sender);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
}
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void RoomObstacle::DoHideHouseInteraction(Human* sender)
|
||||
{
|
||||
auto p = GetInteractionData(sender);
|
||||
if (p) {
|
||||
sender->SetPos(std::get<1>(*p));
|
||||
ClearObstacleBuff(sender);
|
||||
} else {
|
||||
sender->SetPos(GetPos());
|
||||
AddObstacleBuff(sender);
|
||||
interaction_humans_[sender->GetUniId()] = std::make_tuple
|
||||
(room->GetFrameNo(), sender->GetPos());
|
||||
}
|
||||
}
|
||||
|
||||
std::tuple<long long, a8::Vec2>* RoomObstacle::GetInteractionData(Human* sender)
|
||||
{
|
||||
auto itr = interaction_humans_.find(sender->GetUniId());
|
||||
return itr != interaction_humans_.end() ? &itr->second : nullptr;
|
||||
}
|
||||
|
||||
void RoomObstacle::AddObstacleBuff(Creature* c)
|
||||
{
|
||||
for (int buff_id : meta->buff_list) {
|
||||
c->TryAddBuff(c, buff_id);
|
||||
}
|
||||
}
|
||||
|
||||
void RoomObstacle::ClearObstacleBuff(Creature* c)
|
||||
{
|
||||
for (int buff_id : meta->buff_list) {
|
||||
c->RemoveBuffById(buff_id);
|
||||
}
|
||||
}
|
||||
|
@ -18,6 +18,7 @@ class RoomObstacle : public Obstacle
|
||||
virtual void RecalcSelfCollider() override;
|
||||
virtual bool IsTerminatorAirDropBox(Room* room) override { return is_terminator_airdrop_box; }
|
||||
virtual bool CanThroughable(Creature* c) override;
|
||||
virtual bool DoInteraction(Human* sender) override;
|
||||
void ActiveTimerFunc();
|
||||
void UpdateTimerFunc();
|
||||
void Active();
|
||||
@ -31,12 +32,22 @@ private:
|
||||
void ActiveMine();
|
||||
void ActiveTrap();
|
||||
void ActivePosionGas();
|
||||
void ActiveSpring();
|
||||
void ActiveHideHouse();
|
||||
void ActiveGully();
|
||||
|
||||
void DoHideHouseInteraction(Human* sender);
|
||||
|
||||
std::tuple<long long, a8::Vec2>* GetInteractionData(Human* sender);
|
||||
void AddObstacleBuff(Creature* c);
|
||||
void ClearObstacleBuff(Creature* c);
|
||||
|
||||
protected:
|
||||
bool temp_through_ = false;
|
||||
std::set<GridCell*>* grid_list_ = nullptr;
|
||||
int explosion_times_ = 0;
|
||||
bool detached_ = false;
|
||||
std::map<int, std::tuple<long long, a8::Vec2>> interaction_humans_;
|
||||
|
||||
RoomObstacle();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user