diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 626300c..2db0cfa 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -21,7 +21,7 @@ Bullet::~Bullet() void Bullet::Initialize() { - Entity::Initialize(); + MoveableEntity::Initialize(); RecalcSelfCollider(); } diff --git a/server/gameserver/entity.h b/server/gameserver/entity.h index ccb5c9d..1a05728 100644 --- a/server/gameserver/entity.h +++ b/server/gameserver/entity.h @@ -31,7 +31,6 @@ class Entity Entity(); virtual ~Entity(); virtual void Initialize(); - virtual void Update(int delta_time) {}; virtual void FillMFObjectPart(Room* room, cs::MFObjectPart* part_data) {}; virtual void FillMFObjectFull(Room* room, cs::MFObjectFull* full_data) {}; virtual float GetSpeed() { return 1.0f;}; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index e89043f..14035e5 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -68,7 +68,7 @@ Human::~Human() void Human::Initialize() { - Entity::Initialize(); + MoveableEntity::Initialize(); skill_xtimer_attacher_.xtimer = &room->xtimer; RecalcSelfCollider(); volume_ = meta->volume; diff --git a/server/gameserver/loot.cc b/server/gameserver/loot.cc index c57ef01..1d0ce18 100644 --- a/server/gameserver/loot.cc +++ b/server/gameserver/loot.cc @@ -21,7 +21,7 @@ Loot::~Loot() void Loot::Initialize() { - Entity::Initialize(); + RoomEntity::Initialize(); RecalcSelfCollider(); } diff --git a/server/gameserver/moveableentity.h b/server/gameserver/moveableentity.h index b6562c5..b464332 100644 --- a/server/gameserver/moveableentity.h +++ b/server/gameserver/moveableentity.h @@ -6,5 +6,5 @@ class MoveableEntity : public RoomEntity { public: int updated_times = 0; - + virtual void Update(int delta_time) {}; }; diff --git a/server/gameserver/obstacle.h b/server/gameserver/obstacle.h index 40aa8b1..fe9a918 100644 --- a/server/gameserver/obstacle.h +++ b/server/gameserver/obstacle.h @@ -27,7 +27,7 @@ class Obstacle : public Entity Obstacle(); virtual ~Obstacle() override; virtual void Initialize() override; - void RecalcSelfCollider(); + virtual void RecalcSelfCollider(); virtual void FillMFObjectPart(Room* room, cs::MFObjectPart* part_data) override; virtual void FillMFObjectFull(Room* room, cs::MFObjectFull* full_data) override; virtual void GetAabbBox(AabbCollider& aabb_box) override; @@ -49,7 +49,7 @@ class Obstacle : public Entity void SetHealth(Room* room, float value); void Die(Room* room); -private: +protected: CircleCollider* self_collider_ = nullptr; AabbCollider* self_collider2_ = nullptr; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 49214b4..6e97b4e 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -16,6 +16,7 @@ #include "bullet.h" #include "collider.h" #include "obstacle.h" +#include "roomobstacle.h" #include "building.h" #include "loot.h" #include "roommgr.h" @@ -367,12 +368,12 @@ void Room::DropItem(a8::Vec2 pos, int item_id, int item_count, int item_lv) } } -Obstacle* Room::CreateObstacle(int id, float x, float y) +RoomObstacle* Room::CreateObstacle(int id, float x, float y) { - Obstacle* entity = InternalCreateObstacle(id, x, y, - [] (Obstacle*) - { - }); + RoomObstacle* entity = InternalCreateObstacle(id, x, y, + [] (Obstacle*) + { + }); assert(entity); if (entity) { entity->BroadcastFullState(this); @@ -1159,13 +1160,14 @@ void Room::AirDrop(int appear_time, int box_id) } } -Obstacle* Room::InternalCreateObstacle(int id, float x, float y, - std::function on_precreate) +RoomObstacle* Room::InternalCreateObstacle(int id, float x, float y, + std::function on_precreate) { MetaData::MapThing* thing = MetaMgr::Instance()->GetMapThing(id); if (thing) { - Obstacle* entity = new Obstacle(); + RoomObstacle* entity = new RoomObstacle(); entity->meta = thing; + entity->room = this; entity->entity_uniid = AllocUniid(); entity->SetPos(a8::Vec2(x, y)); entity->Initialize(); diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 1a0beec..719474c 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -28,6 +28,7 @@ class Entity; class RoomEntity; class MoveableEntity; class Obstacle; +class RoomObstacle; class Bullet; class Human; class Player; @@ -128,9 +129,9 @@ private: void AirDrop(int appear_time, int box_id); void ShuaPlane(); int NewTeam(); - Obstacle* CreateObstacle(int id, float x, float y); - Obstacle* InternalCreateObstacle(int id, float x, float y, - std::function on_precreate); + RoomObstacle* CreateObstacle(int id, float x, float y); + RoomObstacle* InternalCreateObstacle(int id, float x, float y, + std::function on_precreate); void AddObjectLater(RoomEntity* entity); void OnGameOver(); void RandRemoveAndroid(); diff --git a/server/gameserver/roomentity.cc b/server/gameserver/roomentity.cc index e69de29..723205e 100644 --- a/server/gameserver/roomentity.cc +++ b/server/gameserver/roomentity.cc @@ -0,0 +1,10 @@ +#include "precompile.h" + +#include "roomentity.h" +#include "room.h" + +void RoomEntity::Initialize() +{ + Entity::Initialize(); + xtimer_attacher.xtimer = &room->xtimer; +} diff --git a/server/gameserver/roomentity.h b/server/gameserver/roomentity.h index 897e860..980a7be 100644 --- a/server/gameserver/roomentity.h +++ b/server/gameserver/roomentity.h @@ -8,4 +8,5 @@ class RoomEntity : public Entity Room* room = nullptr; a8::XTimerAttacher xtimer_attacher; + virtual void Initialize() override; }; diff --git a/server/gameserver/roomobstacle.cc b/server/gameserver/roomobstacle.cc new file mode 100644 index 0000000..b54c630 --- /dev/null +++ b/server/gameserver/roomobstacle.cc @@ -0,0 +1,60 @@ +#include "precompile.h" + +#include "metamgr.h" +#include "room.h" +#include "collider.h" +#include "building.h" +#include "human.h" +#include "app.h" +#include "typeconvert.h" +#include "bullet.h" +#include "mapservice.h" +#include "roomobstacle.h" + +RoomObstacle::RoomObstacle():Obstacle() +{ + +} + +RoomObstacle::~RoomObstacle() +{ + +} + +void RoomObstacle::Initialize() +{ + Obstacle::Initialize(); + xtimer_attacher.xtimer = &room->xtimer; +} + +void RoomObstacle::RecalcSelfCollider() +{ + if (meta->i->attack_type() != 2){ + switch (meta->i->type()) { + case 1: + { + if (!self_collider_) { + self_collider_ = new CircleCollider(); + self_collider_->owner = this; + AddCollider(self_collider_); + } + self_collider_->pos = a8::Vec2(); + self_collider_->rad = meta->i->height() / 2.0; + permanent_map_service->AddCollider(self_collider_); + } + break; + case 2: + { + if (!self_collider2_) { + self_collider2_ = new AabbCollider(); + self_collider2_->owner = this; + AddCollider(self_collider2_); + } + self_collider2_->_min = a8::Vec2(meta->i->width() / -2.0f, meta->i->height() / -2.0f); + self_collider2_->_max = a8::Vec2(meta->i->width() / 2.0f, meta->i->height() / 2.0f); + permanent_map_service->AddCollider(self_collider2_); + } + break; + } + } +} diff --git a/server/gameserver/roomobstacle.h b/server/gameserver/roomobstacle.h new file mode 100644 index 0000000..25bf704 --- /dev/null +++ b/server/gameserver/roomobstacle.h @@ -0,0 +1,16 @@ +#pragma once + +#include "obstacle.h" + +class RoomObstacle : public Obstacle +{ + public: + Room* room = nullptr; + a8::XTimerAttacher xtimer_attacher; + + RoomObstacle(); + virtual ~RoomObstacle() override; + virtual void Initialize() override; + virtual void RecalcSelfCollider() override; + +};