From decc77e21c5d82d1c4fa65c0e1359820ef74c494 Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Mon, 9 Mar 2015 09:04:12 +1100 Subject: [PATCH] Implemented entity.GetType() in lua This will only work for userdata decented from the Entity base class. Using something else results in undefined behavior. --- rsc/scripts/setup_server.lua | 12 ++++++++---- server/characters/character_data.cpp | 4 ++++ server/characters/character_data.hpp | 4 ++-- server/entities/entity.cpp | 8 ++++++++ server/entities/entity.hpp | 13 +++++++++---- server/entities/entity_api.cpp | 7 +++++++ server/monsters/monster_data.cpp | 4 ++++ server/monsters/monster_data.hpp | 6 ++++-- 8 files changed, 46 insertions(+), 12 deletions(-) diff --git a/rsc/scripts/setup_server.lua b/rsc/scripts/setup_server.lua index b056fa4..83db60b 100644 --- a/rsc/scripts/setup_server.lua +++ b/rsc/scripts/setup_server.lua @@ -43,13 +43,17 @@ function createTrigger(handle, room, x, y, script) end characterAPI = require("character") +entityAPI = require("entity") networkAPI = require("network") --simple teleporter -createTrigger("trigger 1", overworld, 0, 0, function(character) - local x, y = characterAPI.GetOrigin(character) - characterAPI.SetOrigin(character, x, y + 128) - networkAPI.PumpCharacterUpdate(character) +createTrigger("trigger 1", overworld, 0, 0, function(entity) + if entityAPI.GetType(entity) ~= "character" then + return + end + local x, y = characterAPI.GetOrigin(entity) + characterAPI.SetOrigin(entity, x, y + 128) + networkAPI.PumpCharacterUpdate(entity) end) print("Finished the lua script") diff --git a/server/characters/character_data.cpp b/server/characters/character_data.cpp index c0549d6..3d9d728 100644 --- a/server/characters/character_data.cpp +++ b/server/characters/character_data.cpp @@ -21,6 +21,10 @@ */ #include "character_data.hpp" +CharacterData::CharacterData(): Entity("character") { + //EMPTY +} + int CharacterData::GetOwner() { return owner; } diff --git a/server/characters/character_data.hpp b/server/characters/character_data.hpp index 6c02134..c61a489 100644 --- a/server/characters/character_data.hpp +++ b/server/characters/character_data.hpp @@ -32,7 +32,7 @@ class CharacterData: public Entity { public: - CharacterData() = default; + CharacterData(); ~CharacterData() = default; //database stuff @@ -43,7 +43,7 @@ public: private: friend class CharacterManager; - int owner; + int owner = -1; std::string handle; std::string avatar; }; diff --git a/server/entities/entity.cpp b/server/entities/entity.cpp index b77ea57..dd3249d 100644 --- a/server/entities/entity.cpp +++ b/server/entities/entity.cpp @@ -21,6 +21,10 @@ */ #include "entity.hpp" +Entity::Entity(const char* _type): type(_type) { + //EMPTY +} + void Entity::Update() { origin += motion; } @@ -55,4 +59,8 @@ Vector2 Entity::GetMotion() const { BoundingBox Entity::GetBounds() const { return bounds; +} + +const char* Entity::GetType() const { + return type; } \ No newline at end of file diff --git a/server/entities/entity.hpp b/server/entities/entity.hpp index 70b0ea8..623a912 100644 --- a/server/entities/entity.hpp +++ b/server/entities/entity.hpp @@ -25,6 +25,8 @@ #include "bounding_box.hpp" #include "vector2.hpp" +#include + //The base class for all objects in the world class Entity { public: @@ -41,14 +43,17 @@ public: Vector2 GetMotion() const; BoundingBox GetBounds() const; + const char* GetType() const; + protected: - Entity() = default; + Entity(const char*); virtual ~Entity() = default; int roomIndex = -1; - Vector2 origin; - Vector2 motion; - BoundingBox bounds; + Vector2 origin = {0, 0}; + Vector2 motion = {0, 0}; + BoundingBox bounds = {0, 0, 0, 0}; + const char* type; }; #endif \ No newline at end of file diff --git a/server/entities/entity_api.cpp b/server/entities/entity_api.cpp index 584df5c..30daaea 100644 --- a/server/entities/entity_api.cpp +++ b/server/entities/entity_api.cpp @@ -82,6 +82,12 @@ static int getBounds(lua_State* L) { return 4; } +static int getType(lua_State* L) { + Entity* entity = static_cast(lua_touserdata(L, 1)); + lua_pushstring(L, entity->GetType()); + return 1; +} + static const luaL_Reg entityLib[] = { {"SetRoomIndex", setRoomIndex}, {"SetOrigin", setOrigin}, @@ -91,6 +97,7 @@ static const luaL_Reg entityLib[] = { {"GetOrigin", getOrigin}, {"GetMotion", getMotion}, {"GetBounds", getBounds}, + {"GetType", getType}, {nullptr, nullptr} }; diff --git a/server/monsters/monster_data.cpp b/server/monsters/monster_data.cpp index 22f5252..8a29f12 100644 --- a/server/monsters/monster_data.cpp +++ b/server/monsters/monster_data.cpp @@ -21,6 +21,10 @@ */ #include "monster_data.hpp" +MonsterData::MonsterData(): Entity("monster") { + //EMPTY +} + std::string MonsterData::SetAvatar(std::string s) { return avatar = s; } diff --git a/server/monsters/monster_data.hpp b/server/monsters/monster_data.hpp index f02723b..44a5300 100644 --- a/server/monsters/monster_data.hpp +++ b/server/monsters/monster_data.hpp @@ -24,11 +24,13 @@ #include "entity.hpp" +#include "lua.hpp" + #include class MonsterData: public Entity { public: - MonsterData() = default; + MonsterData(); ~MonsterData() = default; std::string SetAvatar(std::string); @@ -41,7 +43,7 @@ private: friend class MonsterManager; std::string avatar; - int scriptRef; + int scriptRef = LUA_NOREF; }; #endif \ No newline at end of file