From 14a64000ea3d3b289d0e430fd59e6f91836e5ca3 Mon Sep 17 00:00:00 2001 From: sapier Date: Sun, 15 Jan 2012 22:22:07 +0100 Subject: [PATCH] add support for entity linking --- src/content_cao_lua.cpp | 78 ++++++++++++++++++++++++++--------------- src/content_sao_lua.cpp | 21 +++++++++++ src/content_sao_lua.h | 4 ++- 3 files changed, 74 insertions(+), 29 deletions(-) diff --git a/src/content_cao_lua.cpp b/src/content_cao_lua.cpp index afb98c2ea..ed5ecf9c0 100644 --- a/src/content_cao_lua.cpp +++ b/src/content_cao_lua.cpp @@ -19,8 +19,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include "content_cao.h" #include "luaentity_common.h" +#include "clientlinkableobject.h" -class LuaEntityCAO : public ClientActiveObject +class LuaEntityCAO : public ClientActiveObject, public ClientLinkableObject { private: core::aabbox3d m_selection_box; @@ -223,35 +224,40 @@ public: void step(float dtime, ClientEnvironment *env) { - if(m_prop->physical){ - core::aabbox3d box = m_prop->collisionbox; - box.MinEdge *= BS; - box.MaxEdge *= BS; - collisionMoveResult moveresult; - f32 pos_max_d = BS*0.25; // Distance per iteration - v3f p_pos = m_position; - v3f p_velocity = m_velocity; - IGameDef *gamedef = env->getGameDef(); - moveresult = collisionMovePrecise(&env->getMap(), gamedef, - pos_max_d, box, dtime, p_pos, p_velocity); - // Apply results - m_position = p_pos; - m_velocity = p_velocity; - - bool is_end_position = moveresult.collides; - pos_translator.update(m_position, is_end_position, dtime); - pos_translator.translate(dtime); - updateNodePos(); - - m_velocity += dtime * m_acceleration; - } else { - m_position += dtime * m_velocity + 0.5 * dtime * dtime * m_acceleration; - m_velocity += dtime * m_acceleration; - pos_translator.update(m_position, pos_translator.aim_is_end, pos_translator.anim_time); - pos_translator.translate(dtime); - updateNodePos(); + //if liked movement is handled by parent entity + if(!this->isLinked()) { + if(m_prop->physical){ + core::aabbox3d box = m_prop->collisionbox; + box.MinEdge *= BS; + box.MaxEdge *= BS; + collisionMoveResult moveresult; + f32 pos_max_d = BS*0.25; // Distance per iteration + v3f p_pos = m_position; + v3f p_velocity = m_velocity; + IGameDef *gamedef = env->getGameDef(); + moveresult = collisionMovePrecise(&env->getMap(), gamedef, + pos_max_d, box, dtime, p_pos, p_velocity); + // Apply results + m_position = p_pos; + m_velocity = p_velocity; + + bool is_end_position = moveresult.collides; + pos_translator.update(m_position, is_end_position, dtime); + pos_translator.translate(dtime); + updateNodePos(); + + m_velocity += dtime * m_acceleration; + } else { + m_position += dtime * m_velocity + 0.5 * dtime * dtime * m_acceleration; + m_velocity += dtime * m_acceleration; + pos_translator.update(m_position, pos_translator.aim_is_end, pos_translator.anim_time); + pos_translator.translate(dtime); + updateNodePos(); + } } + stepLinkedObjects(this->m_position,dtime); + m_anim_timer += dtime; if(m_anim_timer >= m_anim_framelength){ m_anim_timer -= m_anim_framelength; @@ -397,7 +403,23 @@ public: updateTexturePos(); } + else if (handleLinkUnlinkMessages(cmd,&is,this->m_env)) + { + //Link unlink already done in handleLinkUnlinkMessages! + } + } + + void setPosition(v3f toset, float dtime){ + if (this->isLinked()) { + this->m_position = toset + this->m_linkOffset; + + pos_translator.update(m_position, pos_translator.aim_is_end, pos_translator.anim_time); + pos_translator.translate(dtime); + updateNodePos(); + } } + + void updateLinkState(bool value) {} }; // Prototype diff --git a/src/content_sao_lua.cpp b/src/content_sao_lua.cpp index 6092d613b..0d89c5551 100644 --- a/src/content_sao_lua.cpp +++ b/src/content_sao_lua.cpp @@ -319,5 +319,26 @@ void LuaEntitySAO::sendPosition(bool do_interpolate, bool is_movement_end) m_messages_out.push_back(aom); } +bool LuaEntitySAO::sendLinkMsg(ServerActiveObject* parent,v3f offset) { + std::ostringstream os(std::ios::binary); + writeU8(os, AO_Message_type::Link); + // parameters + writeU16(os, parent->getId()); + writeV3F1000(os, offset); + // create message and add to list + ActiveObjectMessage aom(getId(), false, os.str()); + m_messages_out.push_back(aom); + return true; +} + +bool LuaEntitySAO::sendUnlinkMsg() { + std::ostringstream os(std::ios::binary); + writeU8(os, AO_Message_type::UnLink); + // create message and add to list + ActiveObjectMessage aom(getId(), false, os.str()); + m_messages_out.push_back(aom); + return true; +} + // Prototype LuaEntitySAO proto_LuaEntitySAO(NULL, v3f(0,0,0), "_prototype", ""); diff --git a/src/content_sao_lua.h b/src/content_sao_lua.h index b0f23ff49..035e52123 100644 --- a/src/content_sao_lua.h +++ b/src/content_sao_lua.h @@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "scriptapi.h" #include "luaentity_common.h" -class LuaEntitySAO : public ServerActiveObject +class LuaEntitySAO : public ServerActiveObject, public ServerLinkableObject { public: LuaEntitySAO(ServerEnvironment *env, v3f pos, @@ -55,6 +55,8 @@ public: void setSprite(v2s16 p, int num_frames, float framelength, bool select_horiz_by_yawpitch); std::string getName(); + bool sendLinkMsg(ServerActiveObject* parent,v3f offset); + bool sendUnlinkMsg(); private: void sendPosition(bool do_interpolate, bool is_movement_end); -- 2.25.1