diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 6eb6498..62b8e04 100644 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -512,3 +512,4 @@ const long long SPEC_MAP_OBJECT_FLAGS = A8_DEFINE_RANGE_BIT(long long, kCollider const float DEFAULT_FLY_DISTANCE = 5.0f; +const int MAP_BLOCK_START_ID = 1000000000; diff --git a/server/gameserver/constant_export.h b/server/gameserver/constant_export.h index 71cfe37..24beb56 100644 --- a/server/gameserver/constant_export.h +++ b/server/gameserver/constant_export.h @@ -106,7 +106,7 @@ enum EntityType_e ET_Bullet = 20, - //ET_Android = 30, + ET_MapBlock = 28, ET_Dummy = 29, ET_Unuse = 30, ET_MAX diff --git a/server/gameserver/dummyentity.cc b/server/gameserver/dummyentity.cc index 11bc9fc..97210fb 100644 --- a/server/gameserver/dummyentity.cc +++ b/server/gameserver/dummyentity.cc @@ -44,3 +44,70 @@ void DummyEntity::Initialize() } } } + +void DummyEntity::ScatterObstacle(MapInstance* map_instance) +{ + if (blocks) { + for (auto& obj : *blocks) { + switch (obj.shape()) { + case 1: + { + } + break; + case 2: + { + } + break; + default: + { + } + break; + } + } + } +} +#pragma once + +class Entity; +class Human; +class Bullet; +class Room; +class Creature; + +class GridCell +{ +public: + + GridCell(); + void ClearRoomData(Room* room); + + void TraverseHumanList(std::function func, + int room_idx, + bool& stop); + void TraverseCreatures(std::function& func, + int room_idx, + bool& stop); + + void AddCreature(Creature* c); + void RemoveCreature(Creature* c); + bool CreatureExists(Creature* c); + void AddBullet(Bullet* bullet); + void RemoveBullet(Bullet* bullet); + void AddPermanentEntity(Entity* entity); + void AddRoomEntity(Room* room, Entity* entity); + void RemoveRoomEntity(Room* room, Entity* entity); + bool EntityExists(Room* room, Entity* Entity); + void TraverseLayer0EntityList(std::function& func, + bool& stop); + void TraverseLayer1EntityList(std::function& func, + int room_idx, + bool& stop); + void TraverseAllLayerEntityList(std::function& func, + int room_idx, + bool& stop); + +private: + std::vector> entitys_; + std::vector> bullets_; + std::vector> creatures_; +}; diff --git a/server/gameserver/dummyentity.h b/server/gameserver/dummyentity.h index 170b622..6966868 100644 --- a/server/gameserver/dummyentity.h +++ b/server/gameserver/dummyentity.h @@ -7,6 +7,7 @@ namespace metatable class MapBlockJson; } +class MapInstance; class DummyEntity : public Entity { public: @@ -14,4 +15,5 @@ class DummyEntity : public Entity std::list* blocks = nullptr; virtual void Initialize() override; + void ScatterObstacle(MapInstance* map_instance); }; diff --git a/server/gameserver/mapblock.cc b/server/gameserver/mapblock.cc new file mode 100644 index 0000000..bfa9ead --- /dev/null +++ b/server/gameserver/mapblock.cc @@ -0,0 +1,78 @@ +#include "precompile.h" + +#include "mapblock.h" + +MapBlock::MapBlock() +{ + +} + +MapBlock::~MapBlock() +{ + +} + +void MapBlock::Initialize() +{ + +} + +void MapBlock::RecalcSelfCollider() +{ + +} + +void MapBlock::FillMFObjectPart(Room* room, Human* hum, cs::MFObjectPart* part_data) +{ + +} + +void MapBlock::FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data) +{ + +} + +void MapBlock::GetAabbBox(AabbCollider& aabb_box) +{ + +} + +void MapBlock::GetCircleBox(CircleCollider& circle_box) +{ + +} + +bool MapBlock::IsDead(Room* room) +{ + return false; +} + +long long MapBlock::GetDeadFrameNo(Room* room) +{ + return 0; +} + +void MapBlock::OnPreCollision(Room* room) +{ + +} + +void MapBlock::OnBulletHit(Bullet* bullet) +{ + +} + +void MapBlock::OnExplosionHit(Explosion* explosion) +{ + +} + +bool MapBlock::Attackable(Room* room) +{ + return false; +} + +bool MapBlock::ReceiveExplosionDmg(Explosion* explosion) +{ + return false; +} diff --git a/server/gameserver/mapblock.h b/server/gameserver/mapblock.h new file mode 100644 index 0000000..eacfa48 --- /dev/null +++ b/server/gameserver/mapblock.h @@ -0,0 +1,42 @@ +#pragma once + +#include "entity.h" + +namespace MetaData +{ + struct MapThing; +} + +class Room; +class CircleCollider; +class AabbCollider; +class MapBlock : public Entity +{ + public: + MetaData::MapThing* meta = nullptr; + MapService* permanent_map_service = nullptr; + + virtual ~MapBlock() override; + virtual void Initialize() override; + virtual void RecalcSelfCollider(); + virtual void FillMFObjectPart(Room* room, Human* hum, cs::MFObjectPart* part_data) override; + virtual void FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data) override; + virtual void GetAabbBox(AabbCollider& aabb_box) override; + virtual void GetCircleBox(CircleCollider& circle_box) override; + virtual bool IsDead(Room* room) override; + virtual long long GetDeadFrameNo(Room* room) override; + virtual void OnPreCollision(Room* room) override; + virtual void OnBulletHit(Bullet* bullet) override; + virtual void OnExplosionHit(Explosion* explosion) override; + virtual bool Attackable(Room* room) override; + virtual bool ReceiveExplosionDmg(Explosion* explosion) override; + +protected: + MapBlock(); + +protected: + CircleCollider* self_collider_ = nullptr; + AabbCollider* self_collider2_ = nullptr; + + friend class EntityFactory; +}; diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index 443af9e..3668028 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -273,6 +273,8 @@ void MapInstance::CreateBlock() dummy->Initialize(); uniid_hash_[dummy->GetUniId()] = dummy; grid_service_->AddPermanentEntity(dummy); + + dummy->ScatterObstacle(this); } void MapInstance::CreateMapObject(MetaData::MapTplThing& thing_tpl)