diff --git a/src/environment.cpp b/src/environment.cpp index b7f2756..70138cb 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -3974,8 +3974,12 @@ void ClientEnvironment::step(float dtime) v3f pf = lplayer->getPosition(); v3s16 pp = floatToInt(pf, BS); - s16 coldzone = 60; - bool possible_cold = (pp.Y > coldzone && pp.Y < 1024); + uint32_t time = getTimeOfDay(); + uint16_t season = getSeason(); + uint8_t biome = BIOME_UNKNOWN; + MapBlock *block = m_map->getBlockNoCreateNoEx(getNodeBlockPos(pp)); + if (block) + biome = block->getBiome(); v3f ps[7] = { v3f(0, BS*-0.1, 0), @@ -4018,6 +4022,7 @@ void ClientEnvironment::step(float dtime) break; case CONTENT_FIRE: case CONTENT_FIRE_SHORTTERM: + case CONTENT_CAMPFIRE: t = DAMAGE_FIRE; break; case CONTENT_TNT: @@ -4047,13 +4052,117 @@ void ClientEnvironment::step(float dtime) } } - // cold zone - if (possible_cold) { + switch (biome) { + case BIOME_JUNGLE: + if (season == ENV_SEASON_WINTER && time > 4000 && time < 8000) { std::vector search; search.push_back(CONTENT_FIRE); + search.push_back(CONTENT_CAMPFIRE); if (!searchNear(pp,v3s16(-4,-2,-4),v3s16(5,5,5),search,NULL)) damageLocalPlayer(PLAYER_ALL,DAMAGE_COLD,5); } + break; + case BIOME_OCEAN: + if (season == ENV_SEASON_WINTER) { + std::vector search; + search.push_back(CONTENT_FIRE); + search.push_back(CONTENT_CAMPFIRE); + if (!searchNear(pp,v3s16(-4,-2,-4),v3s16(5,5,5),search,NULL)) + damageLocalPlayer(PLAYER_ALL,DAMAGE_COLD,5); + } + break; + case BIOME_DESERT: + break; + case BIOME_PLAINS: + if (season == ENV_SEASON_WINTER && (time < 6000 || time > 18000)) { + std::vector search; + search.push_back(CONTENT_FIRE); + search.push_back(CONTENT_CAMPFIRE); + if (!searchNear(pp,v3s16(-4,-2,-4),v3s16(5,5,5),search,NULL)) + damageLocalPlayer(PLAYER_ALL,DAMAGE_COLD,5); + } + break; + case BIOME_FOREST: + if (season == ENV_SEASON_WINTER) { + std::vector search; + search.push_back(CONTENT_FIRE); + search.push_back(CONTENT_CAMPFIRE); + if (!searchNear(pp,v3s16(-4,-2,-4),v3s16(5,5,5),search,NULL)) + damageLocalPlayer(PLAYER_ALL,DAMAGE_COLD,5); + } + break; + case BIOME_SKY: + case BIOME_SNOWCAP: + { + std::vector search; + search.push_back(CONTENT_FIRE); + search.push_back(CONTENT_CAMPFIRE); + if (!searchNear(pp,v3s16(-4,-2,-4),v3s16(5,5,5),search,NULL)) + damageLocalPlayer(PLAYER_ALL,DAMAGE_COLD,5); + } + break; + case BIOME_LAKE: + if ( + season == ENV_SEASON_WINTER + || ( + season == ENV_SEASON_AUTUMN + && (time < 6000 || time > 18000) + ) || ( + season == ENV_SEASON_SPRING + && time > 4000 + && time < 8000 + ) + ) { + std::vector search; + search.push_back(CONTENT_FIRE); + search.push_back(CONTENT_CAMPFIRE); + if (!searchNear(pp,v3s16(-4,-2,-4),v3s16(5,5,5),search,NULL)) + damageLocalPlayer(PLAYER_ALL,DAMAGE_COLD,5); + } + break; + case BIOME_BEACH: + if (season == ENV_SEASON_WINTER) { + std::vector search; + search.push_back(CONTENT_FIRE); + search.push_back(CONTENT_CAMPFIRE); + if (!searchNear(pp,v3s16(-4,-2,-4),v3s16(5,5,5),search,NULL)) + damageLocalPlayer(PLAYER_ALL,DAMAGE_COLD,5); + } + break; + case BIOME_SPACE: + break; + case BIOME_THEDEEP: + if (lplayer->shadow_timer >= 5.0) { + /* this means it takes 5 seconds to start taking damage, then damage every second after that */ + lplayer->shadow_timer -= 2.0; + damageLocalPlayer(PLAYER_ALL,DAMAGE_SHADOW,5); + } + if (lplayer->light < 8) { + lplayer->shadow_timer += 1.0; + }else{ + lplayer->shadow_timer = 0.0; + } + break; + case BIOME_WASTELANDS: + { + std::vector search; + search.push_back(CONTENT_LIFE_SUPPORT); + if (!searchNear(pp,v3s16(-4,-2,-4),v3s16(5,5,5),search,NULL)) + damageLocalPlayer(PLAYER_ALL,DAMAGE_POISON,5); + } + break; + case BIOME_UNKNOWN: + case BIOME_WOODLANDS: + if (season == ENV_SEASON_WINTER) { + std::vector search; + search.push_back(CONTENT_FIRE); + search.push_back(CONTENT_CAMPFIRE); + if (!searchNear(pp,v3s16(-4,-2,-4),v3s16(5,5,5),search,NULL)) + damageLocalPlayer(PLAYER_ALL,DAMAGE_COLD,5); + } + default: + break; + } } if (m_hunger_interval.step(dtime,5.0)) { diff --git a/src/hud.cpp b/src/hud.cpp index 1015c24..43e4f56 100644 --- a/src/hud.cpp +++ b/src/hud.cpp @@ -671,7 +671,8 @@ void hud_draw( gettext("Fire"), gettext("TNT"), gettext("Steam"), - gettext("Poison") + gettext("Poison"), + gettext("Shadows") }; std::wstring t = narrow_to_wide(damage_types[damage_type]); diff --git a/src/mapblock_mesh.cpp b/src/mapblock_mesh.cpp index 041b053..6e2c8de 100644 --- a/src/mapblock_mesh.cpp +++ b/src/mapblock_mesh.cpp @@ -483,6 +483,10 @@ void MapBlockMesh::animate(float time) for (std::map::iterator it = m_animation_data.begin(); it != m_animation_data.end(); ++it) { + // Make sure we don't cause an overflow + if (it->first >= m_mesh->getMeshBufferCount()) + return; + const TileSpec &tile = it->second.tile; // Figure out current frame @@ -496,10 +500,6 @@ void MapBlockMesh::animate(float time) m_animation_data[it->first].frame = frame; - // Make sure we don't cause an overflow. Can get removed in future if no problems occuring - if (it->first >= m_mesh->getMeshBufferCount()) - return; - scene::IMeshBuffer *buf = m_mesh->getMeshBuffer(it->first); // Create new texture name from original diff --git a/src/player.cpp b/src/player.cpp index ac63f75..58d1f1f 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -854,6 +854,7 @@ LocalPlayer::LocalPlayer(): last_speed(v3f(0,0,0)), last_pitch(0), last_yaw(0), + shadow_timer(0.0), m_sneak_node(32767,32767,32767), m_sneak_node_exists(false), m_can_use_energy(true), diff --git a/src/player.h b/src/player.h index ced66ab..6415093 100644 --- a/src/player.h +++ b/src/player.h @@ -92,6 +92,7 @@ #define DAMAGE_TNT 0x0C #define DAMAGE_STEAM 0x0D #define DAMAGE_POISON 0x0E +#define DAMAGE_SHADOW 0x0F class Map; @@ -368,6 +369,7 @@ public: case DAMAGE_COLD: v += content_clothesitem_features(i->getContent())->warmth; break; + case DAMAGE_POISON: case DAMAGE_SPACE: v += content_clothesitem_features(i->getContent())->vacuum; break; @@ -662,6 +664,7 @@ public: v3f last_speed; float last_pitch; float last_yaw; + float shadow_timer; private: // This is used for determining the sneaking range