From: sapier Date: Sun, 15 Jan 2012 21:41:10 +0000 (+0100) Subject: added player link support X-Git-Tag: sapier-20120115^0 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=c17133d80a82a0f357214858ece0cc55744771a6;p=oweals%2Fminetest.git added player link support --- diff --git a/src/content_cao_player.cpp b/src/content_cao_player.cpp index d5b15c261..a920cc139 100644 --- a/src/content_cao_player.cpp +++ b/src/content_cao_player.cpp @@ -18,12 +18,13 @@ with this program; if not, write to the Free Software Foundation, Inc., */ #include "content_cao.h" +#include "clientlinkableobject.h" /* PlayerCAO */ -class PlayerCAO : public ClientActiveObject +class PlayerCAO : public ClientActiveObject, public ClientLinkableObject { private: core::aabbox3d m_selection_box; @@ -212,8 +213,10 @@ public: void step(float dtime, ClientEnvironment *env) { - pos_translator.translate(dtime); - updateNodePos(); + if(!isLinked()) { + pos_translator.translate(dtime); + updateNodePos(); + } if(m_damage_visual_timer > 0){ m_damage_visual_timer -= dtime; @@ -252,6 +255,11 @@ public: m_damage_visual_timer = 0.5; updateTextures("^[brighten"); } + else if (handleLinkUnlinkMessages(cmd,&is,this->m_env)) + { + //Link unlink already done in handleLinkUnlinkMessages! + } + } void updateTextures(const std::string &mod) @@ -277,6 +285,27 @@ public: } } } + void setPosition(v3f toset, float dtime){ + if (isLinked()) { + this->m_position = toset + this->m_linkOffset; + pos_translator.update(this->m_position,false); + updateNodePos(); + + if(m_is_local_player) { + m_local_player->setPosition(this->m_position); + } + } + else { + errorstream<<"Got linked position update but not linked"<< std::endl; + } + } + + void updateLinkState(bool value) { + if(m_is_local_player) { + m_local_player->Link(value); + } + } + inline v3f getPosition() { return m_position; } diff --git a/src/environment.cpp b/src/environment.cpp index a3d0950f0..9a99a1110 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -1890,6 +1890,7 @@ void ClientEnvironment::step(float dtime) Get the speed the player is going */ bool is_climbing = lplayer->is_climbing; + bool linked = lplayer->m_linked; f32 player_speed = lplayer->getSpeed().getLength(); @@ -1918,96 +1919,98 @@ void ClientEnvironment::step(float dtime) /* Stuff that has a maximum time increment */ + //TODO at this position possibly a better solution is required! + if (!linked) { + u32 loopcount = 0; + do + { + loopcount++; - u32 loopcount = 0; - do - { - loopcount++; + f32 dtime_part; + if(dtime_downcount > dtime_max_increment) + { + dtime_part = dtime_max_increment; + dtime_downcount -= dtime_part; + } + else + { + dtime_part = dtime_downcount; + /* + Setting this to 0 (no -=dtime_part) disables an infinite loop + when dtime_part is so small that dtime_downcount -= dtime_part + does nothing + */ + dtime_downcount = 0; + } - f32 dtime_part; - if(dtime_downcount > dtime_max_increment) - { - dtime_part = dtime_max_increment; - dtime_downcount -= dtime_part; - } - else - { - dtime_part = dtime_downcount; /* - Setting this to 0 (no -=dtime_part) disables an infinite loop - when dtime_part is so small that dtime_downcount -= dtime_part - does nothing + Handle local player */ - dtime_downcount = 0; - } - - /* - Handle local player - */ - - { - v3f lplayerpos = lplayer->getPosition(); - // Apply physics - if(free_move == false && is_climbing == false) { - // Gravity - v3f speed = lplayer->getSpeed(); - if(lplayer->swimming_up == false) - speed.Y -= 9.81 * BS * dtime_part * 2; + v3f lplayerpos = lplayer->getPosition(); - // Water resistance - if(lplayer->in_water_stable || lplayer->in_water) + // Apply physics + if(free_move == false && is_climbing == false) { - f32 max_down = 2.0*BS; - if(speed.Y < -max_down) speed.Y = -max_down; + // Gravity + v3f speed = lplayer->getSpeed(); + if(lplayer->swimming_up == false) + speed.Y -= 9.81 * BS * dtime_part * 2; - f32 max = 2.5*BS; - if(speed.getLength() > max) + // Water resistance + if(lplayer->in_water_stable || lplayer->in_water) { - speed = speed / speed.getLength() * max; + f32 max_down = 2.0*BS; + if(speed.Y < -max_down) speed.Y = -max_down; + + f32 max = 2.5*BS; + if(speed.getLength() > max) + { + speed = speed / speed.getLength() * max; + } } + + lplayer->setSpeed(speed); } - lplayer->setSpeed(speed); + /* + Move the lplayer. + This also does collision detection. + */ + lplayer->move(dtime_part, *m_map, position_max_increment, + &player_collisions); } - - /* - Move the lplayer. - This also does collision detection. - */ - lplayer->move(dtime_part, *m_map, position_max_increment, - &player_collisions); } - } - while(dtime_downcount > 0.001); + while(dtime_downcount > 0.001); + + //std::cout<<"Looped "<::Iterator - i = player_collisions.begin(); - i != player_collisions.end(); i++) - { - CollisionInfo &info = *i; - if(info.t == COLLISION_FALL) + for(core::list::Iterator + i = player_collisions.begin(); + i != player_collisions.end(); i++) { - //f32 tolerance = BS*10; // 2 without damage - f32 tolerance = BS*12; // 3 without damage - f32 factor = 1; - if(info.speed > tolerance) + CollisionInfo &info = *i; + if(info.t == COLLISION_FALL) { - f32 damage_f = (info.speed - tolerance)/BS*factor; - u16 damage = (u16)(damage_f+0.5); - if(lplayer->hp > damage) - lplayer->hp -= damage; - else - lplayer->hp = 0; - - ClientEnvEvent event; - event.type = CEE_PLAYER_DAMAGE; - event.player_damage.amount = damage; - event.player_damage.send_to_server = true; - m_client_event_queue.push_back(event); + //f32 tolerance = BS*10; // 2 without damage + f32 tolerance = BS*12; // 3 without damage + f32 factor = 1; + if(info.speed > tolerance) + { + f32 damage_f = (info.speed - tolerance)/BS*factor; + u16 damage = (u16)(damage_f+0.5); + if(lplayer->hp > damage) + lplayer->hp -= damage; + else + lplayer->hp = 0; + + ClientEnvEvent event; + event.type = CEE_PLAYER_DAMAGE; + event.player_damage.amount = damage; + event.player_damage.send_to_server = true; + m_client_event_queue.push_back(event); + } } } } diff --git a/src/player.cpp b/src/player.cpp index 963f67c28..56b7fb4d4 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -183,7 +183,8 @@ void Player::deSerialize(std::istream &is) LocalPlayer::LocalPlayer(IGameDef *gamedef): Player(gamedef), m_sneak_node(32767,32767,32767), - m_sneak_node_exists(false) + m_sneak_node_exists(false), + m_linked(false) { // Initialize hp to 0, so that no hearts will be shown if server // doesn't support health points diff --git a/src/player.h b/src/player.h index 1c9dde7e0..5091cf6c8 100644 --- a/src/player.h +++ b/src/player.h @@ -251,6 +251,13 @@ public: PlayerControl control; + + inline void Link(bool value) { + m_linked = value; + } + + bool m_linked; + private: // This is used for determining the sneaking range v3s16 m_sneak_node; diff --git a/src/serverremoteplayer.cpp b/src/serverremoteplayer.cpp index 1681900e0..d34131849 100644 --- a/src/serverremoteplayer.cpp +++ b/src/serverremoteplayer.cpp @@ -101,13 +101,17 @@ void ServerRemotePlayer::step(float dtime, bool send_recommended) if(send_recommended == false) return; + if(isLinked()) + return; + + if(m_position_not_sent) { m_position_not_sent = false; std::ostringstream os(std::ios::binary); // command (0 = update position) - writeU8(os, 0); + writeU8(os,AO_Message_type::SetPosition ); // pos writeV3F1000(os, getPosition()); // yaw @@ -173,7 +177,7 @@ void ServerRemotePlayer::punch(ServerActiveObject *puncher, { std::ostringstream os(std::ios::binary); // command (1 = punched) - writeU8(os, 1); + writeU8(os, AO_Message_type::Punched); // damage writeS16(os, hitprop.hp); // create message and add to list @@ -323,4 +327,24 @@ s16 ServerRemotePlayer::getHP() return hp; } +bool ServerRemotePlayer::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(), true, os.str()); + m_messages_out.push_back(aom); + return true; +} + +bool ServerRemotePlayer::sendUnlinkMsg() { + std::ostringstream os(std::ios::binary); + writeU8(os, AO_Message_type::UnLink); + // create message and add to list + ActiveObjectMessage aom(getId(), true, os.str()); + m_messages_out.push_back(aom); + return true; +} diff --git a/src/serverremoteplayer.h b/src/serverremoteplayer.h index bdc3bba20..e942c28ea 100644 --- a/src/serverremoteplayer.h +++ b/src/serverremoteplayer.h @@ -22,13 +22,14 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "player.h" #include "serverobject.h" +#include "serverlinkableobject.h" #include "content_object.h" // Object type IDs /* Player on the server */ -class ServerRemotePlayer : public Player, public ServerActiveObject +class ServerRemotePlayer : public Player, public ServerActiveObject, public ServerLinkableObject { public: ServerRemotePlayer(ServerEnvironment *env); @@ -97,6 +98,9 @@ public: // Incremented by step(), read and reset by Server float m_time_from_last_punch; + bool sendLinkMsg(ServerActiveObject* parent,v3f offset); + bool sendUnlinkMsg(); + private: bool m_position_not_sent; };