From af322405454191846507b91251d655c2b0aa864b Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Thu, 1 Dec 2011 23:33:48 +0200 Subject: Players are more like objects + related stuff --- src/player.cpp | 272 ++++++++++++++++++++++++++------------------------------- 1 file changed, 125 insertions(+), 147 deletions(-) (limited to 'src/player.cpp') diff --git a/src/player.cpp b/src/player.cpp index 937ca9a3f..882566896 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -31,6 +31,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "environment.h" #include "gamedef.h" #include "content_sao.h" +#include "tooldef.h" +#include "materials.h" Player::Player(IGameDef *gamedef): touching_ground(false), @@ -188,7 +190,9 @@ ServerRemotePlayer::ServerRemotePlayer(ServerEnvironment *env): m_additional_items(), m_inventory_not_sent(false), m_hp_not_sent(false), - m_sao(NULL) + m_respawn_active(false), + m_is_in_environment(false), + m_position_not_sent(false) { } ServerRemotePlayer::ServerRemotePlayer(ServerEnvironment *env, v3f pos_, u16 peer_id_, @@ -197,7 +201,8 @@ ServerRemotePlayer::ServerRemotePlayer(ServerEnvironment *env, v3f pos_, u16 pee ServerActiveObject(env, pos_), m_inventory_not_sent(false), m_hp_not_sent(false), - m_sao(NULL) + m_is_in_environment(false), + m_position_not_sent(false) { setPosition(pos_); peer_id = peer_id_; @@ -206,39 +211,136 @@ ServerRemotePlayer::ServerRemotePlayer(ServerEnvironment *env, v3f pos_, u16 pee ServerRemotePlayer::~ServerRemotePlayer() { clearAddToInventoryLater(); - if(m_sao) - m_sao->setPlayer(NULL); } void ServerRemotePlayer::setPosition(const v3f &position) { Player::setPosition(position); ServerActiveObject::setBasePosition(position); - if(m_sao) - m_sao->positionUpdated(); + m_position_not_sent = true; } -void ServerRemotePlayer::setSAO(PlayerSAO *sao) +InventoryItem* ServerRemotePlayer::getWieldedItem() { - infostream<<"ServerRemotePlayer \""<getItem(m_selected_item); + return NULL; } -PlayerSAO* ServerRemotePlayer::getSAO() +/* ServerActiveObject interface */ + +void ServerRemotePlayer::addedToEnvironment() { - return m_sao; + assert(!m_is_in_environment); + m_is_in_environment = true; } -/* ServerActiveObject interface */ +void ServerRemotePlayer::removingFromEnvironment() +{ + assert(m_is_in_environment); + m_is_in_environment = false; +} -InventoryItem* ServerRemotePlayer::getWieldedItem() +void ServerRemotePlayer::step(float dtime, bool send_recommended) { - InventoryList *list = inventory.getList("main"); - if (list) - return list->getItem(m_selected_item); - return NULL; + if(send_recommended == false) + return; + + if(m_position_not_sent) + { + m_position_not_sent = false; + + std::ostringstream os(std::ios::binary); + // command (0 = update position) + writeU8(os, 0); + // pos + writeV3F1000(os, getPosition()); + // yaw + writeF1000(os, getYaw()); + // create message and add to list + ActiveObjectMessage aom(getId(), false, os.str()); + m_messages_out.push_back(aom); + } +} + +std::string ServerRemotePlayer::getClientInitializationData() +{ + std::ostringstream os(std::ios::binary); + // version + writeU8(os, 0); + // name + os<getWieldDiggingProperties(&tp); + + HittingProperties hitprop = getHittingProperties(&mp, &tp, + time_from_last_punch); + + infostream<<"1. getHP()="<getDiggingProperties(titem->getToolName()); } + void ServerRemotePlayer::damageWieldedItem(u16 amount) { infostream<<"Damaging "<getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false); - buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true); - //buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; - buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF; - // Add to mesh - mesh->addMeshBuffer(buf); - buf->drop(); - } - { // Back - scene::IMeshBuffer *buf = new scene::SMeshBuffer(); - video::SColor c(255,255,255,255); - video::S3DVertex vertices[4] = - { - video::S3DVertex(BS/2,0,0, 0,0,0, c, 1,1), - video::S3DVertex(-BS/2,0,0, 0,0,0, c, 0,1), - video::S3DVertex(-BS/2,BS*2,0, 0,0,0, c, 0,0), - video::S3DVertex(BS/2,BS*2,0, 0,0,0, c, 1,0), - }; - u16 indices[] = {0,1,2,2,3,0}; - buf->append(vertices, 4, indices, 6); - // Set material - buf->getMaterial().setFlag(video::EMF_LIGHTING, false); - //buf->getMaterial().setFlag(video::EMF_BACK_FACE_CULLING, false); - buf->getMaterial().setTexture(0, driver->getTexture(getTexturePath("player_back.png").c_str())); - buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false); - buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true); - buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF; - // Add to mesh - mesh->addMeshBuffer(buf); - buf->drop(); - } - m_node = mgr->addMeshSceneNode(mesh, this); - mesh->drop(); - m_node->setPosition(v3f(0,0,0)); - } -} - -RemotePlayer::~RemotePlayer() -{ - if(SceneManager != NULL) - ISceneNode::remove(); -} - -void RemotePlayer::updateName(const char *name) -{ - Player::updateName(name); - if(m_text != NULL) - { - wchar_t wname[PLAYERNAME_SIZE]; - mbstowcs(wname, m_name, strlen(m_name)+1); - m_text->setText(wname); - } -} - -void RemotePlayer::move(f32 dtime, Map &map, f32 pos_max_d) -{ - m_pos_animation_time_counter += dtime; - m_pos_animation_counter += dtime; - v3f movevector = m_position - m_oldpos; - f32 moveratio; - if(m_pos_animation_time < 0.001) - moveratio = 1.0; - else - moveratio = m_pos_animation_counter / m_pos_animation_time; - if(moveratio > 1.5) - moveratio = 1.5; - m_showpos = m_oldpos + movevector * moveratio; - - ISceneNode::setPosition(m_showpos); -} -#endif - -#endif - #ifndef SERVER /* LocalPlayer -- cgit v1.2.3