diff --git a/data/textures/mineral_gold.png b/data/textures/mineral_gold.png index 065ee02..5286664 100644 Binary files a/data/textures/mineral_gold.png and b/data/textures/mineral_gold.png differ diff --git a/data/textures/mineral_iron.png b/data/textures/mineral_iron.png index 95a4ac0..30f6457 100644 Binary files a/data/textures/mineral_iron.png and b/data/textures/mineral_iron.png differ diff --git a/data/textures/oerkki_dust_space.png b/data/textures/oerkki_dust_space.png new file mode 100644 index 0000000..1176ff4 Binary files /dev/null and b/data/textures/oerkki_dust_space.png differ diff --git a/data/textures/spacerock.png b/data/textures/spacerock.png new file mode 100644 index 0000000..3bca6f1 Binary files /dev/null and b/data/textures/spacerock.png differ diff --git a/src/content_clothesitem.cpp b/src/content_clothesitem.cpp index d6282d3..e9a19c9 100644 --- a/src/content_clothesitem.cpp +++ b/src/content_clothesitem.cpp @@ -54,7 +54,7 @@ void content_clothesitem_init() f->type = CT_PANTS; f->armour = 0.10; f->warmth = 0.20; - f->vacuum = 0.30; + f->vacuum = 1.0; f->durability = 20; { u16 r[9] = { @@ -76,7 +76,7 @@ void content_clothesitem_init() f->type = CT_JACKET; f->armour = 0.10; f->warmth = 0.20; - f->vacuum = 0.30; + f->vacuum = 1.0; f->durability = 20; { u16 r[9] = { @@ -98,7 +98,7 @@ void content_clothesitem_init() f->type = CT_HAT; f->armour = 0.05; f->warmth = 0.15; - f->vacuum = 0.20; + f->vacuum = 1.0; f->suffocate = 1.0; f->durability = 20; crafting::setHelmetRecipe(CONTENT_CRAFTITEM_CANVAS_SHEET,i); @@ -114,7 +114,7 @@ void content_clothesitem_init() f->type = CT_BOOTS; f->armour = 0.05; f->warmth = 0.20; - f->vacuum = 0.20; + f->vacuum = 1.0; f->durability = 20; crafting::setBootsRecipe(CONTENT_CRAFTITEM_CANVAS_SHEET,i); lists::add("craftguide",i); diff --git a/src/content_craftitem.cpp b/src/content_craftitem.cpp index 4001fbb..6f4aac0 100644 --- a/src/content_craftitem.cpp +++ b/src/content_craftitem.cpp @@ -1564,4 +1564,22 @@ void content_craftitem_init() f->name = "salt_dust"; f->description = wgettext("Salt"); lists::add("creative",i); + + i = CONTENT_CRAFTITEM_OERKKI_DUST_SPACE; + f = &g_content_craftitem_features[i]; + f->content = CONTENT_CRAFTITEM_OERKKI_DUST_SPACE; + f->texture = "oerkki_dust_space.png"; + f->name = "oerkki_dust_space"; + f->description = wgettext("Space Dust"); + f->drop_count = 1; + f->teleports = PLAYERFLAG_JUMP; // teleports player up 1500 + { + u16 r[9] = { + CONTENT_IGNORE, CONTENT_CRAFTITEM_OERKKI_DUST, CONTENT_IGNORE, + CONTENT_CRAFTITEM_OERKKI_DUST, CONTENT_CRAFTITEM_MITHRILDUST, CONTENT_CRAFTITEM_OERKKI_DUST, + CONTENT_IGNORE, CONTENT_CRAFTITEM_OERKKI_DUST, CONTENT_IGNORE + }; + crafting::setRecipe(r,CONTENT_CRAFTITEM_OERKKI_DUST_SPACE,1); + } + lists::add("creative",i); } diff --git a/src/content_craftitem.h b/src/content_craftitem.h index e3fe5a8..001b0eb 100644 --- a/src/content_craftitem.h +++ b/src/content_craftitem.h @@ -235,5 +235,6 @@ CraftItemFeatures & content_craftitem_features(std::string subname); #define CONTENT_CRAFTITEM_SAPPHIRE (CONTENT_CRAFTITEM_MASK | 0x85) #define CONTENT_CRAFTITEM_SUNSTONE (CONTENT_CRAFTITEM_MASK | 0x86) #define CONTENT_CRAFTITEM_SALT (CONTENT_CRAFTITEM_MASK | 0x87) +#define CONTENT_CRAFTITEM_OERKKI_DUST_SPACE (CONTENT_CRAFTITEM_MASK | 0x88) #endif diff --git a/src/content_mapnode.cpp b/src/content_mapnode.cpp index 3970781..dc21d17 100644 --- a/src/content_mapnode.cpp +++ b/src/content_mapnode.cpp @@ -251,6 +251,21 @@ void content_mapnode_init(bool repeat) lists::add("cooking",i); lists::add("decrafting",i); + i = CONTENT_SPACEROCK; + f = &content_features(i); + f->description = wgettext("Space Rock"); + f->setAllTextures("spacerock.png"); + f->setInventoryTextureCube("spacerock.png", "spacerock.png", "spacerock.png"); + f->param_type = CPT_MINERAL; + f->draw_type = CDT_CUBELIKE; + f->is_ground_content = true; + f->often_contains_mineral = true; + f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1"; + f->type = CMT_STONE; + f->hardness = 1.1; + if (invisible_stone) + f->solidness = 0; // For debugging, hides regular stone + i = CONTENT_MARBLE; f = &content_features(i); f->description = wgettext("Marble"); diff --git a/src/content_mapnode.h b/src/content_mapnode.h index 8f2e9d5..d41c2e7 100644 --- a/src/content_mapnode.h +++ b/src/content_mapnode.h @@ -58,7 +58,7 @@ MapNode mapnode_translate_to_internal(MapNode n_from, u8 version); #define CONTENT_WATERSOURCE 0x009 #define CONTENT_FORGE_FIRE 0x00A #define CONTENT_MARBLE 0x00B -// FREE 0x00C +#define CONTENT_SPACEROCK 0x00C #define CONTENT_SAFE 0x00D #define CONTENT_SIGN_WALL 0x00E #define CONTENT_CHEST 0x00F diff --git a/src/environment.cpp b/src/environment.cpp index 54d0047..c501c19 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -2597,6 +2597,7 @@ void ServerEnvironment::step(float dtime) std::vector search; bool found = false; search.push_back(CONTENT_WATER); + search.push_back(CONTENT_VACUUM); search.push_back(CONTENT_WATERSOURCE); if (p.Y > 60 && p.Y < 1024) { found = true; diff --git a/src/game.cpp b/src/game.cpp index fd807e1..488ce2c 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -1863,7 +1863,8 @@ void the_game( float time_brightness = (float)decode_light((daynight_ratio * LIGHT_SUN) / 1000) / 255.0; float direct_brightness = 0; bool sunlight_seen = false; - if (free_move) { + bool in_space = (client.getLocalPlayer()->getPosition().Y>(1024*BS)); + if (in_space || free_move) { direct_brightness = time_brightness; sunlight_seen = true; }else{ @@ -1895,7 +1896,7 @@ void the_game( float moon_phase = client.getEnv().getMoonPhase(); - sky->update(time_of_day_smooth, moon_phase, time_brightness, direct_brightness, sunlight_seen); + sky->update(time_of_day_smooth, moon_phase, time_brightness, direct_brightness, sunlight_seen, in_space); video::SColor bgcolor = sky->getBgColor(); video::SColor skycolor = sky->getSkyColor(); diff --git a/src/mapgen.cpp b/src/mapgen.cpp index 0d297c1..8c4879d 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -1170,10 +1170,27 @@ double tree_amount_2d(uint64_t seed, v2s16 p) 0.5+(float)p.X/125, 0.5+(float)p.Y/125, seed+2, 4, 0.66); double zeroval = -0.39; - if(noise < zeroval) + if (noise < zeroval) return 0; - else - return 0.04 * (noise-zeroval) / (1.0-zeroval); + + return 0.04 * (noise-zeroval) / (1.0-zeroval); +} + +// used in space +double debris_amount_2d(uint64_t seed, v2s16 p) +{ + double noise = noise2d_perlin( + 0.5+(float)p.X/125, + 0.5+(float)p.Y/125, + seed+2, + 4, + 0.7 + ); + double zeroval = -0.41; + if (noise < zeroval) + return 0; + + return 0.037 * (noise-zeroval) / (1.0-zeroval); } double surface_humidity_2d(uint64_t seed, v2s16 p) @@ -1327,11 +1344,159 @@ bool get_have_sand(uint64_t seed, v2s16 p2d) return (sandnoise > -0.15); } +void make_space(BlockMakeData *data) +{ + v3s16 blockpos = data->blockpos; + + ManualMapVoxelManipulator &vmanip = *(data->vmanip); + // Area of center block + v3s16 node_min = blockpos*MAP_BLOCKSIZE; + v3s16 node_max = (blockpos+v3s16(1,1,1))*MAP_BLOCKSIZE-v3s16(1,1,1); + // Full allocated area + v3s16 full_node_min = (blockpos-1)*MAP_BLOCKSIZE; + // Area of a block + double block_area_nodes = MAP_BLOCKSIZE*MAP_BLOCKSIZE; + + v2s16 p2d_center(node_min.X+MAP_BLOCKSIZE/2, node_min.Z+MAP_BLOCKSIZE/2); + u32 blockseed = (u32)(data->seed%0x100000000ULL) + full_node_min.Z*38134234 + full_node_min.Y*42123 + full_node_min.X*23; + + for (s16 x=node_min.X; x<=node_max.X; x++) + for (s16 z=node_min.Z; z<=node_max.Z; z++) { + // Node position + v2s16 p2d(x,z); + { + // Use fast index incrementing + v3s16 em = vmanip.m_area.getExtent(); + u32 i = vmanip.m_area.index(v3s16(p2d.X, node_min.Y, p2d.Y)); + for (s16 y=node_min.Y; y<=node_max.Y; y++) { + vmanip.m_data[i] = MapNode(CONTENT_VACUUM); + data->vmanip->m_area.add_y(em, i, 1); + } + } + } + + u32 debris_amount = block_area_nodes*debris_amount_2d(blockseed,p2d_center); + + if (debris_amount < 10) + return; + + NoiseBuffer noisebuf_mineral; + { + v3f minpos_f(node_min.X, node_min.Y, node_min.Z); + v3f maxpos_f(node_max.X, node_max.Y, node_max.Z); + + + // Sample length + v3f sl(2.5, 2.5, 2.5); + noisebuf_mineral.create( + get_ground_wetness_params(data->seed), + minpos_f.X, minpos_f.Y, minpos_f.Z, + maxpos_f.X, maxpos_f.Y+5, maxpos_f.Z, + sl.X, sl.Y, sl.Z + ); + } + + { + PseudoRandom debrisrandom(blockseed); + u32 count = debris_amount/6; + for (u32 i=0; i 0.4) { + new_content = MapNode(CONTENT_SPACEROCK, MINERAL_SILVER); + }else if (mineral_noise > 0.3) { + new_content = MapNode(CONTENT_SPACEROCK, MINERAL_QUARTZ); + }else if (mineral_noise > 0.2) { + new_content = MapNode(CONTENT_SPACEROCK, MINERAL_COPPER); + }else if (mineral_noise > 0.1) { + new_content = MapNode(CONTENT_SPACEROCK, MINERAL_TIN); + }else if (mineral_noise > 0.0) { + new_content = MapNode(CONTENT_SPACEROCK, MINERAL_GOLD); + } + + u32 vi = vmanip.m_area.index(v3s16(x,y,z)); + if (vmanip.m_data[vi].getContent() == CONTENT_VACUUM) + vmanip.m_data[vi] = new_content; + } + } + + if (debris_amount < 13) + return; + + { + v3s16 pos = node_min+(MAP_BLOCKSIZE/2); + u16 comet_size = debris_amount-11; + if (comet_size > 5) + comet_size = 5; + s16 comet_min = -comet_size; + s16 comet_max = comet_size; + MapNode new_content(CONTENT_SPACEROCK); + + float mineral_noise = noisebuf_mineral.get(pos.X,pos.Y,pos.Z); + + if (mineral_noise < -0.5) { + new_content = MapNode(CONTENT_LAVASOURCE); + }else if (mineral_noise < -0.3) { + new_content = MapNode(CONTENT_ICE); + }else if (mineral_noise < -0.1) { + new_content = MapNode(CONTENT_STEEL); + }else if (mineral_noise > 0.4) { + new_content = MapNode(CONTENT_SILVER); + }else if (mineral_noise > 0.3) { + new_content = MapNode(CONTENT_MITHRIL_BLOCK); + }else if (mineral_noise > 0.2) { + new_content = MapNode(CONTENT_COPPER); + }else if (mineral_noise > 0.1) { + new_content = MapNode(CONTENT_TIN); + }else if (mineral_noise > 0.0) { + new_content = MapNode(CONTENT_GOLD); + } + + for (s16 x=comet_min; x<=comet_max; x++) { + for (s16 y=comet_min; y<=comet_max; y++) { + for (s16 z=comet_min; z<=comet_max; z++) { + int edge = 0; + if (x == comet_min || x == comet_max) + edge++; + if (y == comet_min || y == comet_max) + edge++; + if (z == comet_min || z == comet_max) + edge++; + + if (edge > 1) + continue; + u32 vi = vmanip.m_area.index(pos+v3s16(x,y,z)); + if (vmanip.m_data[vi].getContent() != CONTENT_VACUUM) + continue; + if (edge) { + vmanip.m_data[vi] = MapNode(CONTENT_SPACEROCK); + continue; + } + vmanip.m_data[vi] = new_content; + } + } + } + } +} + void make_block(BlockMakeData *data) { if (data->no_op) return; + if ((data->blockpos.Y*MAP_BLOCKSIZE) > 1200) { + make_space(data); + return; + } + v3s16 blockpos = data->blockpos; ManualMapVoxelManipulator &vmanip = *(data->vmanip); diff --git a/src/player.cpp b/src/player.cpp index b46f63e..a886be0 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -341,6 +341,9 @@ bool Player::getHome(s8 i, v3f &h) return false; h = m_flag[i]; return true; + }else if (i == PLAYERFLAG_JUMP) { + h = m_position+intToFloat(v3s16(0,1500,0),BS); + return true; } return false; } diff --git a/src/player.h b/src/player.h index 6a13257..ee1b435 100644 --- a/src/player.h +++ b/src/player.h @@ -65,6 +65,7 @@ #define PLAYERFLAG_YELLOW 6 #define PLAYERFLAG_BLACK 7 #define PLAYERFLAG_COUNT 8 +#define PLAYERFLAG_JUMP PLAYERFLAG_COUNT #define PLAYER_FEET 0x01 #define PLAYER_LLEG 0x02 @@ -332,7 +333,7 @@ public: continue; break; case PLAYER_TORSO: - if (j != 1) + if (j != 1 && j != 2) continue; break; case PLAYER_HANDS: diff --git a/src/sky.cpp b/src/sky.cpp index 0936641..6f0109b 100644 --- a/src/sky.cpp +++ b/src/sky.cpp @@ -42,6 +42,7 @@ Sky::Sky(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id): m_cloud_brightness(0.5), m_moon_phase(0.0), m_moon_phase_pending(0.0), + m_space(false), m_bgcolor_bright_f(1,1,1,1), m_skycolor_bright_f(1,0,0,0), m_cloudcolor_bright_f(1,1,1,1) @@ -193,17 +194,22 @@ void Sky::render() m_moon_phase = m_moon_phase_pending; } + float f = 0.0; // Stars - float starbrightness = MYMAX( - 0, - MYMIN( - 1, - (0.285 - fabs( - wicked_time_of_day < 0.5 ? wicked_time_of_day : (1.0 - wicked_time_of_day) - )) * 10 - ) - ); - float f = starbrightness*120; + if (m_space) { + f = 120.0; + }else{ + float starbrightness = MYMAX( + 0, + MYMIN( + 1, + (0.285 - fabs( + wicked_time_of_day < 0.5 ? wicked_time_of_day : (1.0 - wicked_time_of_day) + )) * 10 + ) + ); + f = starbrightness*120; + } if (f >= m_skycolor.getBlue()) { driver->setMaterial(m_materials[1]); video::SColor starcolor(255, f,f,f); @@ -234,7 +240,8 @@ void Sky::update( float moon_phase, float time_brightness, float direct_brightness, - bool sunlight_seen + bool sunlight_seen, + bool in_space ) { // Stabilize initial brightness and color values by flooding updates @@ -242,7 +249,7 @@ void Sky::update( m_first_update = false; m_moon_phase = moon_phase; for (u32 i=0; i<100; i++) { - update(time_of_day, moon_phase, time_brightness, direct_brightness, sunlight_seen); + update(time_of_day, moon_phase, time_brightness, direct_brightness, sunlight_seen, in_space); } return; } @@ -252,7 +259,9 @@ void Sky::update( m_time_brightness = time_brightness; m_sunlight_seen = sunlight_seen; - bool is_dawn = (time_brightness >= 0.20 && time_brightness < 0.50); + m_space = in_space; + + bool is_dawn = (!in_space && time_brightness >= 0.20 && time_brightness < 0.50); video::SColorf bgcolor_bright_normal_f(170./255,200./255,230./255, 1.0); video::SColorf bgcolor_bright_indoor_f(100./255,100./255,100./255, 1.0); @@ -264,7 +273,9 @@ void Sky::update( video::SColorf cloudcolor_bright_normal_f = video::SColor(255, 240,240,255); video::SColorf cloudcolor_bright_dawn_f(1.0, 0.7, 0.5, 1.0); - if (sunlight_seen) { + if (in_space) { + m_brightness = 0.02; + }else if (sunlight_seen) { if (fabs(time_brightness - m_brightness) < 0.2) { m_brightness = m_brightness * 0.95 + time_brightness * 0.05; }else{ @@ -276,7 +287,7 @@ void Sky::update( m_brightness = m_brightness * 0.98 + direct_brightness * 0.02; } - m_clouds_visible = true; + m_clouds_visible = !in_space; float color_change_fraction = 0.98; if (sunlight_seen) { if (is_dawn) { diff --git a/src/sky.h b/src/sky.h index bb1532c..4e81a08 100644 --- a/src/sky.h +++ b/src/sky.h @@ -54,7 +54,7 @@ public: virtual u32 getMaterialCount() const { return SKY_MATERIAL_COUNT; } - void update(float time_of_day, float moon_phase, float time_brightness, float direct_brightness, bool sunlight_seen); + void update(float time_of_day, float moon_phase, float time_brightness, float direct_brightness, bool sunlight_seen, bool in_space); float getBrightness(){ return m_brightness; } video::SColor getBgColor(){ return m_bgcolor; } @@ -76,6 +76,7 @@ private: bool m_clouds_visible; float m_moon_phase; float m_moon_phase_pending; + bool m_space; video::SColorf m_bgcolor_bright_f; video::SColorf m_skycolor_bright_f; video::SColorf m_cloudcolor_bright_f;