2020-05-20 16:33:08 +08:00

86 lines
2.1 KiB
C++

#pragma once
#include "gridservice.h"
namespace cs
{
class MFObjectPart;
class MFObjectFull;
}
class Room;
class Obstacle;
class ColliderComponent;
class AabbCollider;
class CircleCollider;
class MapService;
class Entity
{
public:
int entity_uniid = 0;
EntityType_e entity_type = ET_None;
EntitySubType_e entity_subtype = EST_None;
bool is_permanent = false;
MapService* permanent_map_service = nullptr;
int grid_id = 0;
std::set<GridCell*> grid_list;
Entity* last_collision_door = nullptr;
Entity();
virtual ~Entity();
virtual void Initialize();
virtual void FillMFObjectPart(Room* room, cs::MFObjectPart* part_data) {};
virtual void FillMFObjectFull(Room* room, cs::MFObjectFull* full_data) {};
virtual float GetSpeed() { return 1.0f;};
virtual void GetAabbBox(AabbCollider& aabb_box);
virtual void GetCircleBox(CircleCollider& circle_box);
virtual bool IsDead(Room* room) { return false;};
virtual long long GetDeadFrameNo(Room* room) { return 0;};
virtual void OnPreCollision(Room* room) {};
bool TestCollision(Room* room, Entity* b);
bool TestCollision(Room* room, ColliderComponent* b);
bool TestCollisionEx(Room* room, const a8::Vec2& aabb_pos, AabbCollider& aabb_box);
void BroadcastFullState(Room* room);
void BroadcastDeleteState(Room* room);
void AddCollider(ColliderComponent* collider);
a8::Vec2 GetPos() { return pos_; };
bool IsPermanent();
void SetPos(a8::Vec2 pos)
{
#if 0
if (room && entity_subtype == EST_Player) {
if (room->frame_no > SERVER_FRAME_RATE * 35) {
if (pos.Distance(pos_) > 500) {
abort();
}
}
}
#endif
pos_ = pos;
}
float GetX()
{
return pos_.x;
}
float GetY()
{
return pos_.y;
}
void SetX(float x)
{
pos_.x = x;
}
void SetY(float y)
{
pos_.y = y;
}
private:
a8::Vec2 pos_;
std::list<ColliderComponent*> colliders;
void ClearColliders();
};