From 2b8d8d1993b9856438c2ccb0dcd120ee7f34e5ea Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 11 Jun 2021 11:52:00 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9A=90=E8=97=8F=E7=82=B9Ok?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/constant.h | 3 ++ server/gameserver/obstacle.cc | 33 ++++++++++++ server/gameserver/obstacle.h | 1 + server/gameserver/player.cc | 27 +--------- server/gameserver/roomobstacle.cc | 85 +++++++++++++++++++++++++++++++ server/gameserver/roomobstacle.h | 11 ++++ 6 files changed, 134 insertions(+), 26 deletions(-) diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 0d80cce..a5743fc 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -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"; diff --git a/server/gameserver/obstacle.cc b/server/gameserver/obstacle.cc index 0bc6b99..11da54d 100644 --- a/server/gameserver/obstacle.cc +++ b/server/gameserver/obstacle.cc @@ -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; +} diff --git a/server/gameserver/obstacle.h b/server/gameserver/obstacle.h index 1738033..088c93d 100644 --- a/server/gameserver/obstacle.h +++ b/server/gameserver/obstacle.h @@ -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(); diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index c5d6f85..f4e879e 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -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) diff --git a/server/gameserver/roomobstacle.cc b/server/gameserver/roomobstacle.cc index e57e331..bac37d6 100644 --- a/server/gameserver/roomobstacle.cc +++ b/server/gameserver/roomobstacle.cc @@ -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* 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); + } +} diff --git a/server/gameserver/roomobstacle.h b/server/gameserver/roomobstacle.h index d4d0971..f51f213 100644 --- a/server/gameserver/roomobstacle.h +++ b/server/gameserver/roomobstacle.h @@ -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* GetInteractionData(Human* sender); + void AddObstacleBuff(Creature* c); + void ClearObstacleBuff(Creature* c); protected: bool temp_through_ = false; std::set* grid_list_ = nullptr; int explosion_times_ = 0; bool detached_ = false; + std::map> interaction_humans_; RoomObstacle();