aozhiwei 1ba97eabe0 1
2023-04-03 10:08:51 +08:00

71 lines
2.1 KiB
C++

#pragma once
#include "entity.h"
class Room;
class Creature;
class Human;
class Bullet;
class RoomObstacle;
class MapService;
class Obstacle : public Entity
{
public:
const mt::MapThing* meta = nullptr;
MapService* permanent_map_service = nullptr;
bool is_permanent = false;
float scale = 1.0f;
int dead_reason = 0;
virtual ~Obstacle() override;
virtual void Initialize() override;
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 bool IsDead(Room* room) override;
virtual long long GetDeadFrameNo(Room* room) override;
virtual void OnBulletHit(IBullet* bullet) override;
virtual void OnExplosionHit(Explosion* explosion) override;
virtual bool Attackable(Room* room) override;
virtual bool CanThroughable(Creature* c);
virtual bool CanThroughable(IBullet* bullet);
virtual bool DoInteraction(Human* sender);
virtual bool CanSeeMe(Human* hum);
virtual bool ReceiveExplosionDmg(Explosion* explosion) override;
virtual void SetRotate(float rotate);
float GetRotate() { return rotate_; }
float GetHealth(Room* room);
void SetHealth(Room* room, float value);
virtual void Die(Room* room);
int GetTeamId(Room* room);
void SetTeamId(Room* room, int team_id);
int GetMasterId(Room* room);
void SetMasterId(Room* room, int master_id);
bool IsPermanent();
bool Throughable();
bool IsTouchInteraction();
bool IsOpenInteraction();
bool IsRoomObstacle();
RoomObstacle* AsRoomObstacle();
protected:
Obstacle();
void DoHideHouseInteraction(Human* sender);
std::tuple<long long, glm::vec3>* GetInteractionData(Human* sender);
void AddObstacleBuff(Creature* c);
void ClearObstacleBuff(Creature* c);
void ProcDieExplosion(Room* room);
protected:
float health_ = 0.0f;
bool dead_ = false;
long long dead_frameno_ = 0;
int team_id_ = 0;
int master_id_ = 0;
float rotate_ = 0;
friend class EntityFactory;
friend class PBUtils;
};