From 479496516638cb6f436e302aee00d6d6797f9bcc Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Tue, 29 Mar 2016 20:19:13 +1100 Subject: [PATCH] The rabbit is moving on it's own --- client/scenes/world.cpp | 3 ++ rsc/scripts/setup_server.lua | 40 ++++++++++++++++++++++- server/creatures/creature_api.cpp | 15 +++++++++ server/creatures/creature_data.cpp | 10 +++++- server/creatures/creature_data.hpp | 5 +++ server/creatures/creature_manager.cpp | 2 +- server/creatures/creature_manager.hpp | 2 +- server/creatures/creature_manager_api.cpp | 6 +++- 8 files changed, 78 insertions(+), 5 deletions(-) diff --git a/client/scenes/world.cpp b/client/scenes/world.cpp index 758abe9..a31d75e 100644 --- a/client/scenes/world.cpp +++ b/client/scenes/world.cpp @@ -779,6 +779,7 @@ void World::hCharacterMovement(CharacterPacket* const argPacket) { //------------------------- void World::hCreatureUpdate(CreaturePacket* const argPacket) { + std::cout << "hCreatureUpdate" << std::endl; //TODO: (1) Authentication //check that this character exists @@ -868,6 +869,8 @@ void World::hQueryCreatureExists(CreaturePacket* const argPacket) { } void World::hCreatureMovement(CreaturePacket* const argPacket) { + std::cout << "hCreatureMovement" << std::endl; + //ignore if this creature doesn't exist std::map::iterator creatureIt = creatureMap.find(argPacket->creatureIndex); if (creatureIt == creatureMap.end()) { diff --git a/rsc/scripts/setup_server.lua b/rsc/scripts/setup_server.lua index be50f71..8390155 100644 --- a/rsc/scripts/setup_server.lua +++ b/rsc/scripts/setup_server.lua @@ -38,11 +38,49 @@ doorUtility = require("door_utility") creatureAPI = require("creature") creatureManagerAPI = require("creature_manager") +--testing creature tags +local function bunnySquare(creature) + --return value + local ret = 0 + + --these tags are strings + local direction = creatureAPI.GetTag(creature, "direction") + local timestamp = creatureAPI.GetTag(creature, "timestamp") + + --has this creature been set up yet? + if string.len(direction) == 0 then + direction = "south" + timestamp = tostring(os.time()) + creatureAPI.SetMotion(creature, 0, 1) + end + + + + --is it time to change direction? + if os.time() - tonumber(timestamp) > 3 then +-- print("changing directions") + + if string.match("south", direction) then + direction = "north" + creatureAPI.SetMotion(creature, 0, -1) + else + direction = "south" + creatureAPI.SetMotion(creature, 0, 1) + end + timestamp = tostring(os.time()) + ret = 1 + end + + creatureAPI.SetTag(creature, "direction", direction) + creatureAPI.SetTag(creature, "timestamp", timestamp) + return ret +end + --test the room hooks roomManagerAPI.SetOnCreate(function(room, index) print("", "Creating room: ", roomAPI.GetName(room), index) - creatureManagerAPI.Create(roomAPI.GetCreatureMgr(room), "anibunny.png", function() --[[]] end) + creatureManagerAPI.Create(roomAPI.GetCreatureMgr(room), "anibunny.png", bunnySquare) roomAPI.SetOnTick(room, function(room) roomAPI.ForEachCharacter(room, function(character) diff --git a/server/creatures/creature_api.cpp b/server/creatures/creature_api.cpp index 649dff4..67b3f91 100644 --- a/server/creatures/creature_api.cpp +++ b/server/creatures/creature_api.cpp @@ -52,11 +52,26 @@ static int getScript(lua_State* L) { return 1; } +//TODO: autogen docs +static int setTag(lua_State* L) { + CreatureData* creature = static_cast(lua_touserdata(L, 1)); + creature->SetTag(lua_tostring(L, 2), lua_tostring(L, 3)); + return 0; +} + +static int getTag(lua_State* L) { + CreatureData* creature = static_cast(lua_touserdata(L, 1)); + lua_pushstring(L, creature->GetTag(lua_tostring(L, 2)).c_str()); + return 1; +} + static const luaL_Reg creatureLib[] = { {"SetAvatar", setAvatar}, {"GetAvatar", getAvatar}, {"SetScript", setScript}, {"GetScript", getScript}, + {"SetTag", setTag}, + {"GetTag", getTag}, {nullptr, nullptr} }; diff --git a/server/creatures/creature_data.cpp b/server/creatures/creature_data.cpp index 58fc81a..94e2e92 100644 --- a/server/creatures/creature_data.cpp +++ b/server/creatures/creature_data.cpp @@ -52,7 +52,7 @@ int CreatureData::Update(lua_State* L) { ret += lua_tonumber(L, -1); } - ret += Entity::Update(); + Entity::Update(); return ret; } @@ -75,4 +75,12 @@ int CreatureData::SetScriptReference(int i) { int CreatureData::GetScriptReference() { return scriptRef; +} + +std::string CreatureData::SetTag(std::string key, std::string value) { + return tags[key] = value; +} + +std::string CreatureData::GetTag(std::string key) { + return tags[key]; } \ No newline at end of file diff --git a/server/creatures/creature_data.hpp b/server/creatures/creature_data.hpp index cf4efae..bde476f 100644 --- a/server/creatures/creature_data.hpp +++ b/server/creatures/creature_data.hpp @@ -25,6 +25,7 @@ #include "lua.hpp" +#include #include /* DOCS: Creature attributes, read more @@ -49,9 +50,13 @@ public: int SetScriptReference(int); int GetScriptReference(); + std::string SetTag(std::string key, std::string value); + std::string GetTag(std::string key); + private: friend class CreatureManager; std::string avatar; int scriptRef = LUA_NOREF; + std::map tags; }; diff --git a/server/creatures/creature_manager.cpp b/server/creatures/creature_manager.cpp index 1235419..63eca5c 100644 --- a/server/creatures/creature_manager.cpp +++ b/server/creatures/creature_manager.cpp @@ -30,7 +30,7 @@ CreatureManager::~CreatureManager() { } //arg: a list of creatures to be updated in the clients -int CreatureManager::Update(std::list>* creatureList) { +void CreatureManager::Update(std::list>* creatureList) { int ret; for (auto& it : elementMap) { ret = it.second.Update(lua); diff --git a/server/creatures/creature_manager.hpp b/server/creatures/creature_manager.hpp index 3c60f1b..b24da16 100644 --- a/server/creatures/creature_manager.hpp +++ b/server/creatures/creature_manager.hpp @@ -37,7 +37,7 @@ public: ~CreatureManager(); //common public methods - int Update(std::list>* creatureList); + void Update(std::list>* creatureList); int Create(std::string avatar, int scriptRef); void Unload(int uid); diff --git a/server/creatures/creature_manager_api.cpp b/server/creatures/creature_manager_api.cpp index cad8dc0..cc9c803 100644 --- a/server/creatures/creature_manager_api.cpp +++ b/server/creatures/creature_manager_api.cpp @@ -25,8 +25,12 @@ //args: mgr, avatar, script static int create(lua_State* L) { + //register the function at the top of the stack + lua_pushinteger(L, luaL_ref(L, LUA_REGISTRYINDEX)); + + //create the actual creature CreatureManager* mgr = static_cast(lua_touserdata(L, 1)); - int index = mgr->Create(lua_tostring(L, 2), lua_tointeger(L, 3)); + int index = mgr->Create(lua_tostring(L, 2), lua_tointeger(L, 3)); //3 should be the unique reference within LUA_REGISTRYINDEX CreatureData* creature = mgr->Get(index); lua_pushlightuserdata(L, static_cast(creature)); lua_pushinteger(L, index);