mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2024-11-23 22:17:31 +00:00
123 lines
2.5 KiB
C
123 lines
2.5 KiB
C
|
#pragma once
|
||
|
|
||
|
#include "dLua.h"
|
||
|
|
||
|
#include "Entity.h"
|
||
|
|
||
|
class LuaScript;
|
||
|
|
||
|
/**
|
||
|
* A struct for wrapping an Entity in Lua.
|
||
|
*/
|
||
|
struct lEntity {
|
||
|
static void RegisterClass(LuaScript* script);
|
||
|
|
||
|
LWOOBJID id;
|
||
|
|
||
|
lEntity() : id(LWOOBJID_EMPTY) {}
|
||
|
|
||
|
lEntity(LWOOBJID id) : id(id) {}
|
||
|
|
||
|
lEntity(Entity* entity);
|
||
|
|
||
|
/**
|
||
|
* Checks if this entity is valid.
|
||
|
*/
|
||
|
bool IsValid() const;
|
||
|
|
||
|
/**
|
||
|
* Get the entity's ID.
|
||
|
*/
|
||
|
LWOOBJID GetID() const;
|
||
|
|
||
|
/**
|
||
|
* Get the entity's lot.
|
||
|
*/
|
||
|
LOT GetLOT() const;
|
||
|
|
||
|
/**
|
||
|
* Get the entity's position.
|
||
|
*/
|
||
|
NiPoint3 GetPosition() const;
|
||
|
|
||
|
/**
|
||
|
* Get the entity's rotation.
|
||
|
*/
|
||
|
NiQuaternion GetRotation() const;
|
||
|
|
||
|
/**
|
||
|
* Set the entit's position.
|
||
|
*/
|
||
|
void SetPosition(const NiPoint3& pos);
|
||
|
|
||
|
/**
|
||
|
* Set the entity's rotation.
|
||
|
*/
|
||
|
void SetRotation(const NiQuaternion& rot);
|
||
|
|
||
|
/**
|
||
|
* Set a variable in the entity's data table.
|
||
|
*/
|
||
|
void SetVar(const std::string& key, sol::object value);
|
||
|
|
||
|
/**
|
||
|
* Get a variable from the entity's data table.
|
||
|
*/
|
||
|
sol::object GetVar(LuaScript* script, const std::string& key);
|
||
|
|
||
|
/**
|
||
|
* Smash this entity.
|
||
|
*/
|
||
|
void Smash(sol::object smasher);
|
||
|
|
||
|
/**
|
||
|
* Add a timer.
|
||
|
*/
|
||
|
void AddTimer(const std::string& name, float seconds);
|
||
|
|
||
|
/**
|
||
|
* Load a LUA script and attach it to this entity.
|
||
|
*/
|
||
|
void LoadScript(const std::string& name);
|
||
|
|
||
|
/**
|
||
|
* Serialize this entity.
|
||
|
*/
|
||
|
void Serialize();
|
||
|
|
||
|
Entity* GetEntity() const;
|
||
|
|
||
|
Entity* GetEntityOrThrow() const;
|
||
|
|
||
|
Entity* operator->() const;
|
||
|
|
||
|
/**
|
||
|
* Assets that this entity has a specific component.
|
||
|
*/
|
||
|
template <typename T>
|
||
|
void AssertComponent() {
|
||
|
if (!GetEntity()->HasComponent(T::ComponentType)) {
|
||
|
throw std::runtime_error("Entity does not have component " + std::to_string(T::ComponentType));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Assets that an entity has a specific component.
|
||
|
*/
|
||
|
template <typename T>
|
||
|
static inline void AssertComponent(lEntity entity) {
|
||
|
if (!entity->HasComponent(T::ComponentType)) {
|
||
|
throw std::runtime_error("Entity does not have component " + std::to_string(T::ComponentType));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Utility for getting a component, asserting it exists
|
||
|
*/
|
||
|
template <typename T>
|
||
|
static inline T* GetComponent(lEntity entity) {
|
||
|
entity.AssertComponent<T>();
|
||
|
return entity->GetComponent<T>();
|
||
|
}
|
||
|
};
|