X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fcontent_cao.cpp;h=e97e3a1beae912712c507fde32cda4bc38089fb9;hb=4feea0ac6845ea025e8784f63f48e567d1d24c22;hp=5e5cb38ae7bbb3578e9f15ad55a9777d6708d707;hpb=6d0ea26c2d62c3774ff384cf1bfc2a3372b49a3b;p=dragonfireclient.git diff --git a/src/content_cao.cpp b/src/content_cao.cpp index 5e5cb38ae..e97e3a1be 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -50,7 +50,7 @@ struct ToolCapabilities; #define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" -core::map ClientActiveObject::m_types; +std::map ClientActiveObject::m_types; /* SmoothTranslator @@ -174,6 +174,7 @@ class TestCAO : public ClientActiveObject void processMessage(const std::string &data); + bool getCollisionBox(aabb3f *toset) { return false; } private: scene::IMeshSceneNode *m_node; v3f m_position; @@ -222,7 +223,7 @@ void TestCAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc, // Set material buf->getMaterial().setFlag(video::EMF_LIGHTING, false); buf->getMaterial().setFlag(video::EMF_BACK_FACE_CULLING, false); - buf->getMaterial().setTexture(0, tsrc->getTextureRaw("rat.png")); + buf->getMaterial().setTexture(0, tsrc->getTexture("rat.png")); buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false); buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true); buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; @@ -329,6 +330,7 @@ class ItemCAO : public ClientActiveObject std::string infoText() {return m_infotext;} + bool getCollisionBox(aabb3f *toset) { return false; } private: core::aabbox3d m_selection_box; scene::IMeshSceneNode *m_node; @@ -391,7 +393,7 @@ void ItemCAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc, buf->getMaterial().setFlag(video::EMF_LIGHTING, false); buf->getMaterial().setFlag(video::EMF_BACK_FACE_CULLING, false); // Initialize with a generated placeholder texture - buf->getMaterial().setTexture(0, tsrc->getTextureRaw("")); + buf->getMaterial().setTexture(0, tsrc->getTexture("")); buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false); buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true); buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; @@ -643,6 +645,26 @@ class GenericCAO : public ClientActiveObject ClientActiveObject::registerType(getType(), create); } + bool getCollisionBox(aabb3f *toset) { + if (m_prop.physical) { + aabb3f retval; + //update collision box + toset->MinEdge = m_prop.collisionbox.MinEdge * BS; + toset->MaxEdge = m_prop.collisionbox.MaxEdge * BS; + + toset->MinEdge += m_position; + toset->MaxEdge += m_position; + + return true; + } + + return false; + } + + bool collideWithObjects() { + return m_prop.collideWithObjects; + } + void initialize(const std::string &data) { infostream<<"GenericCAO: Got init data"<isLocal()){ m_is_local_player = true; } + m_env->addPlayerName(m_name.c_str()); } } ~GenericCAO() { + if(m_is_player){ + m_env->removePlayerName(m_name.c_str()); + } } static ClientActiveObject* create(IGameDef *gamedef, ClientEnvironment *env) @@ -842,7 +868,7 @@ class GenericCAO : public ClientActiveObject m_spritenode = smgr->addBillboardSceneNode( NULL, v2f(1, 1), v3f(0,0,0), -1); m_spritenode->setMaterialTexture(0, - tsrc->getTextureRaw("unknown_block.png")); + tsrc->getTexture("unknown_node.png")); m_spritenode->setMaterialFlag(video::EMF_LIGHTING, false); m_spritenode->setMaterialFlag(video::EMF_BILINEAR_FILTER, false); m_spritenode->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF); @@ -1111,6 +1137,7 @@ class GenericCAO : public ClientActiveObject { LocalPlayer *player = m_env->getLocalPlayer(); player->overridePosition = getParent()->getPosition(); + m_env->getLocalPlayer()->parent = getParent(); } } else @@ -1123,14 +1150,13 @@ class GenericCAO : public ClientActiveObject box.MaxEdge *= BS; collisionMoveResult moveresult; f32 pos_max_d = BS*0.125; // Distance per iteration - f32 stepheight = 0; v3f p_pos = m_position; v3f p_velocity = m_velocity; v3f p_acceleration = m_acceleration; - IGameDef *gamedef = env->getGameDef(); - moveresult = collisionMoveSimple(&env->getMap(), gamedef, - pos_max_d, box, stepheight, dtime, - p_pos, p_velocity, p_acceleration); + moveresult = collisionMoveSimple(env,env->getGameDef(), + pos_max_d, box, m_prop.stepheight, dtime, + p_pos, p_velocity, p_acceleration, + this, m_prop.collideWithObjects); // Apply results m_position = p_pos; m_velocity = p_velocity; @@ -1184,6 +1210,12 @@ class GenericCAO : public ClientActiveObject m_yaw += dtime * m_prop.automatic_rotate * 180 / M_PI; updateNodePos(); } + + if (getParent() == NULL && m_prop.automatic_face_movement_dir && + (fabs(m_velocity.Z) > 0.001 || fabs(m_velocity.X) > 0.001)){ + m_yaw = atan2(m_velocity.Z,m_velocity.X) * 180 / M_PI + m_prop.automatic_face_movement_dir_offset; + updateNodePos(); + } } void updateTexturePos() @@ -1246,12 +1278,12 @@ class GenericCAO : public ClientActiveObject { if(m_prop.visual == "sprite") { - std::string texturestring = "unknown_block.png"; + std::string texturestring = "unknown_node.png"; if(m_prop.textures.size() >= 1) texturestring = m_prop.textures[0]; texturestring += mod; m_spritenode->setMaterialTexture(0, - tsrc->getTextureRaw(texturestring)); + tsrc->getTexture(texturestring)); // This allows setting per-material colors. However, until a real lighting // system is added, the code below will have no effect. Once MineTest @@ -1278,7 +1310,7 @@ class GenericCAO : public ClientActiveObject if(texturestring == "") continue; // Empty texture string means don't modify that material texturestring += mod; - video::ITexture* texture = tsrc->getTextureRaw(texturestring); + video::ITexture* texture = tsrc->getTexture(texturestring); if(!texture) { errorstream<<"GenericCAO::updateTextures(): Could not load texture "<setMaterialTexture(i, texture); video::SMaterial& material = m_animated_meshnode->getMaterial(i); + material.TextureLayer[0].Texture = texture; material.setFlag(video::EMF_LIGHTING, false); material.setFlag(video::EMF_BILINEAR_FILTER, false); @@ -1312,24 +1344,19 @@ class GenericCAO : public ClientActiveObject { for (u32 i = 0; i < 6; ++i) { - std::string texturestring = "unknown_block.png"; + std::string texturestring = "unknown_node.png"; if(m_prop.textures.size() > i) texturestring = m_prop.textures[i]; texturestring += mod; - AtlasPointer ap = tsrc->getTexture(texturestring); - // Get the tile texture and atlas transformation - video::ITexture* atlas = ap.atlas; - v2f pos = ap.pos; - v2f size = ap.size; // Set material flags and texture video::SMaterial& material = m_meshnode->getMaterial(i); material.setFlag(video::EMF_LIGHTING, false); material.setFlag(video::EMF_BILINEAR_FILTER, false); - material.setTexture(0, atlas); - material.getTextureMatrix(0).setTextureTranslate(pos.X, pos.Y); - material.getTextureMatrix(0).setTextureScale(size.X, size.Y); + material.setTexture(0, + tsrc->getTexture(texturestring)); + material.getTextureMatrix(0).makeIdentity(); // This allows setting per-material colors. However, until a real lighting // system is added, the code below will have no effect. Once MineTest @@ -1356,7 +1383,7 @@ class GenericCAO : public ClientActiveObject tname += mod; scene::IMeshBuffer *buf = mesh->getMeshBuffer(0); buf->getMaterial().setTexture(0, - tsrc->getTextureRaw(tname)); + tsrc->getTexture(tname)); // This allows setting per-material colors. However, until a real lighting // system is added, the code below will have no effect. Once MineTest @@ -1381,7 +1408,7 @@ class GenericCAO : public ClientActiveObject tname += mod; scene::IMeshBuffer *buf = mesh->getMeshBuffer(1); buf->getMaterial().setTexture(0, - tsrc->getTextureRaw(tname)); + tsrc->getTexture(tname)); // This allows setting per-material colors. However, until a real lighting // system is added, the code below will have no effect. Once MineTest @@ -1661,6 +1688,19 @@ class GenericCAO : public ClientActiveObject updateTexturePos(); } + else if(cmd == GENERIC_CMD_SET_PHYSICS_OVERRIDE) + { + float override_speed = readF1000(is); + float override_jump = readF1000(is); + float override_gravity = readF1000(is); + if(m_is_local_player) + { + LocalPlayer *player = m_env->getLocalPlayer(); + player->physics_override_speed = override_speed; + player->physics_override_jump = override_jump; + player->physics_override_gravity = override_gravity; + } + } else if(cmd == GENERIC_CMD_SET_ANIMATION) { m_animation_range = readV2F1000(is); @@ -1700,8 +1740,29 @@ class GenericCAO : public ClientActiveObject { /*s16 damage =*/ readS16(is); s16 result_hp = readS16(is); - + + // Use this instead of the send damage to not interfere with prediction + s16 damage = m_hp - result_hp; + m_hp = result_hp; + + if (damage > 0) { + if (m_hp <= 0) { + // TODO: Execute defined fast response + // As there is no definition, make a smoke puff + ClientSimpleObject *simple = createSmokePuff( + m_smgr, m_env, m_position, + m_prop.visual_size * BS); + m_env->addSimpleObject(simple); + } else { + // TODO: Execute defined fast response + // Flashing shall suffice as there is no definition + m_reset_textures_timer = 0.05; + if(damage >= 2) + m_reset_textures_timer += 0.05 * damage; + updateTextures("^[brighten"); + } + } } else if(cmd == GENERIC_CMD_UPDATE_ARMOR_GROUPS) {