aozhiwei dab0a0d303 1
2021-06-22 09:40:19 +00:00

106 lines
3.2 KiB
C++

#pragma once
#include "entity.h"
namespace MetaData
{
struct MapThing;
struct Building;
}
namespace metatable
{
class DoorObjJson;
}
class Room;
class Creature;
class Human;
class Building;
class CircleCollider;
class AabbCollider;
class Bullet;
class RoomObstacle;
class Obstacle : public Entity
{
public:
MetaData::MapThing* meta = nullptr;
MapService* permanent_map_service = nullptr;
bool is_permanent = false;
int collider_tag = 0;
int collider_param1 = 0;
int collider_param2 = 0;
virtual ~Obstacle() 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 IsTerminatorAirDropBox(Room* room) { return false; }
virtual bool CanThroughable(Creature* c);
virtual bool CanThroughable(Bullet* bullet);
virtual bool DoInteraction(Human* sender);
virtual void OnCollisionTrigger(Creature* c, OptResult& opt_result);
virtual bool CanSeeMe(Human* hum);
virtual bool ReceiveExplosionDmg(Explosion* explosion) override;
void SetDoorInfo(Building* building, int door_id_x);
bool IsDoor();
DoorState_e GetDoorState(Room* room);
void SetDoorState(Room* room, DoorState_e state);
void SetBuilding(Building* building);
Building* GetBuilding();
const metatable::DoorObjJson* GetDoorState0();
const metatable::DoorObjJson* GetDoorState1();
void IncDoorOpenTimes(Room* room);
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, a8::Vec2>* GetInteractionData(Human* sender);
void AddObstacleBuff(Creature* c);
void ClearObstacleBuff(Creature* c);
bool IsHalfWallCollider();
protected:
CircleCollider* self_collider_ = nullptr;
AabbCollider* self_collider2_ = nullptr;
bool is_door_ = false;
int door_id_ = 0;
const metatable::DoorObjJson* door_state0_ = nullptr;
const metatable::DoorObjJson* door_state1_ = nullptr;
int door_house_uniid_ = 0;
Building* building_ = nullptr;
float health_ = 0.0f;
bool dead_ = false;
long long dead_frameno_ = 0;
int team_id_ = 0;
int master_id_ = 0;
friend class EntityFactory;
};