108 lines
3.6 KiB
C++
108 lines
3.6 KiB
C++
#pragma once
|
|
|
|
#include "weakptr.h"
|
|
|
|
namespace cs
|
|
{
|
|
class MFObjectPart;
|
|
class MFObjectFull;
|
|
}
|
|
|
|
#pragma pack(1)
|
|
struct ObjectSyncFlags
|
|
{
|
|
unsigned char flags = 0;
|
|
int last_sync_frameno = 0;
|
|
};
|
|
#pragma pack()
|
|
|
|
class Room;
|
|
class ColliderComponent;
|
|
class AabbCollider;
|
|
class CircleCollider;
|
|
class Human;
|
|
class Bullet;
|
|
class Explosion;
|
|
class Entity
|
|
{
|
|
public:
|
|
long long delete_frameno = 0;
|
|
|
|
Entity();
|
|
virtual ~Entity();
|
|
virtual void Initialize();
|
|
virtual void FillMFObjectPart(Room* room, Human* hum, cs::MFObjectPart* part_data) {};
|
|
virtual void FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data) {};
|
|
virtual float GetSpeed() { return 1.0f;};
|
|
virtual void GetAabbBox(AabbCollider& aabb_box);
|
|
virtual void GetHitAabbBox(AabbCollider& aabb_box) { GetAabbBox(aabb_box);};
|
|
virtual float GetRadius() { return 0;};
|
|
virtual float GetHitRadius() { return GetRadius();};
|
|
virtual void GetCircleBox(CircleCollider& circle_box);
|
|
virtual bool IsDead(Room* room) { return false;};
|
|
virtual bool IsCreature(Room* room) { return false;};
|
|
virtual long long GetDeadFrameNo(Room* room) { return 0;};
|
|
virtual void OnPreCollision(Room* room) {};
|
|
virtual void RecalcSelfCollider() {};
|
|
virtual void OnBulletHit(Bullet* bullet) {};
|
|
virtual void OnExplosionHit(Explosion* explosion) {};
|
|
virtual void OnAddToTargetPartObject(Entity* target) {};
|
|
virtual void OnRemoveFromTargetPartObject(Entity* target) {};
|
|
virtual void OnBattleStart(Room* room) {};
|
|
virtual bool CanSeeMe(Human* hum) { return true; };
|
|
virtual bool Attackable(Room* room) { return false; };
|
|
virtual bool ReceiveExplosionDmg(Explosion* explosion) { return false; };
|
|
virtual std::string GetName() { return "";};
|
|
int GetUniId() const { return uniid_; }
|
|
EntityType_e GetEntityType() const { return entity_type_; }
|
|
EntitySubType_e GetEntitySubType() const { return entity_subtype_; }
|
|
virtual bool IsEntityType(EntityType_e type) const { return type == entity_type_;}
|
|
virtual bool IsEntitySubType(EntitySubType_e subtype) const
|
|
{ return subtype == entity_subtype_;}
|
|
int GetGridId() const { return grid_id_; }
|
|
bool TestCollision(Room* room, Entity* b);
|
|
ColliderComponent* TestCollisionAndGetCollider(Room* room, Entity* b);
|
|
bool TestCollision(Room* room, ColliderComponent* b);
|
|
ColliderComponent* TestCollisionAndGetCollider(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 RemoveFromAroundPlayers(Room* room);
|
|
void AddEntityCollider(ColliderComponent* collider);
|
|
a8::Vec2 GetPos() { return pos_; };
|
|
void SetPos(a8::Vec2 pos) { 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; }
|
|
EntityWeakPtrChunk* GetEntityWeakPtrChunk() { return &entity_weak_ptr_chunk_; };
|
|
EntityWeakPtr AllocEntityWeakPtr();
|
|
EntityWeakPtr& GetEntityWeakPtrRef();
|
|
bool IsClientCached(Human* hum);
|
|
bool CanClientCache(Human* hum);
|
|
|
|
protected:
|
|
void AddClientCache(Human* hum);
|
|
|
|
private:
|
|
void ClearColliders();
|
|
void SetGridId(int grid_id) { grid_id_ = grid_id; }
|
|
|
|
protected:
|
|
std::list<ColliderComponent*> colliders_;
|
|
|
|
private:
|
|
int uniid_ = 0;
|
|
EntityType_e entity_type_ = ET_None;
|
|
EntitySubType_e entity_subtype_ = EST_None;
|
|
|
|
EntityWeakPtr entity_weak_ptr_;
|
|
EntityWeakPtrChunk entity_weak_ptr_chunk_;
|
|
|
|
a8::Vec2 pos_;
|
|
int grid_id_ = 0;
|
|
|
|
friend class EntityFactory;
|
|
friend class GridService;
|
|
};
|