#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 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 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 static inline T* GetComponent(lEntity entity) { entity.AssertComponent(); return entity->GetComponent(); } };