X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fnodedef.cpp;h=f5324908d7ffbc65456b65d3d7a3d6fb8a5b5c36;hb=68f9263a24a345435d2310ab559ce8a811ef0427;hp=eb176316600887b210752d376eaa5ee613e4c98a;hpb=3face01a202040e4feff3b0936b4aa89c051c98d;p=dragonfireclient.git diff --git a/src/nodedef.cpp b/src/nodedef.cpp index eb1763166..f5324908d 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -21,9 +21,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "itemdef.h" #ifndef SERVER -#include "mesh.h" -#include "shader.h" -#include "client.h" +#include "client/mesh.h" +#include "client/shader.h" +#include "client/client.h" #include "client/renderingengine.h" #include "client/tile.h" #include @@ -74,7 +74,7 @@ void NodeBox::reset() void NodeBox::serialize(std::ostream &os, u16 protocol_version) const { // Protocol >= 36 - int version = 5; + const u8 version = 6; writeU8(os, version); switch (type) { @@ -84,19 +84,19 @@ void NodeBox::serialize(std::ostream &os, u16 protocol_version) const writeU16(os, fixed.size()); for (const aabb3f &nodebox : fixed) { - writeV3F1000(os, nodebox.MinEdge); - writeV3F1000(os, nodebox.MaxEdge); + writeV3F32(os, nodebox.MinEdge); + writeV3F32(os, nodebox.MaxEdge); } break; case NODEBOX_WALLMOUNTED: writeU8(os, type); - writeV3F1000(os, wall_top.MinEdge); - writeV3F1000(os, wall_top.MaxEdge); - writeV3F1000(os, wall_bottom.MinEdge); - writeV3F1000(os, wall_bottom.MaxEdge); - writeV3F1000(os, wall_side.MinEdge); - writeV3F1000(os, wall_side.MaxEdge); + writeV3F32(os, wall_top.MinEdge); + writeV3F32(os, wall_top.MaxEdge); + writeV3F32(os, wall_bottom.MinEdge); + writeV3F32(os, wall_bottom.MaxEdge); + writeV3F32(os, wall_side.MinEdge); + writeV3F32(os, wall_side.MaxEdge); break; case NODEBOX_CONNECTED: writeU8(os, type); @@ -104,8 +104,8 @@ void NodeBox::serialize(std::ostream &os, u16 protocol_version) const #define WRITEBOX(box) \ writeU16(os, (box).size()); \ for (const aabb3f &i: (box)) { \ - writeV3F1000(os, i.MinEdge); \ - writeV3F1000(os, i.MaxEdge); \ + writeV3F32(os, i.MinEdge); \ + writeV3F32(os, i.MaxEdge); \ }; WRITEBOX(fixed); @@ -133,7 +133,7 @@ void NodeBox::serialize(std::ostream &os, u16 protocol_version) const void NodeBox::deSerialize(std::istream &is) { int version = readU8(is); - if (version < 4) + if (version < 6) throw SerializationError("unsupported NodeBox version"); reset(); @@ -146,19 +146,19 @@ void NodeBox::deSerialize(std::istream &is) while(fixed_count--) { aabb3f box; - box.MinEdge = readV3F1000(is); - box.MaxEdge = readV3F1000(is); + box.MinEdge = readV3F32(is); + box.MaxEdge = readV3F32(is); fixed.push_back(box); } } else if(type == NODEBOX_WALLMOUNTED) { - wall_top.MinEdge = readV3F1000(is); - wall_top.MaxEdge = readV3F1000(is); - wall_bottom.MinEdge = readV3F1000(is); - wall_bottom.MaxEdge = readV3F1000(is); - wall_side.MinEdge = readV3F1000(is); - wall_side.MaxEdge = readV3F1000(is); + wall_top.MinEdge = readV3F32(is); + wall_top.MaxEdge = readV3F32(is); + wall_bottom.MinEdge = readV3F32(is); + wall_bottom.MaxEdge = readV3F32(is); + wall_side.MinEdge = readV3F32(is); + wall_side.MaxEdge = readV3F32(is); } else if (type == NODEBOX_CONNECTED) { @@ -166,8 +166,8 @@ void NodeBox::deSerialize(std::istream &is) count = readU16(is); \ (box).reserve(count); \ while (count--) { \ - v3f min = readV3F1000(is); \ - v3f max = readV3F1000(is); \ + v3f min = readV3F32(is); \ + v3f max = readV3F32(is); \ (box).emplace_back(min, max); }; } u16 count; @@ -179,16 +179,14 @@ void NodeBox::deSerialize(std::istream &is) READBOXES(connect_left); READBOXES(connect_back); READBOXES(connect_right); - if (version >= 5) { - READBOXES(disconnected_top); - READBOXES(disconnected_bottom); - READBOXES(disconnected_front); - READBOXES(disconnected_left); - READBOXES(disconnected_back); - READBOXES(disconnected_right); - READBOXES(disconnected); - READBOXES(disconnected_sides); - } + READBOXES(disconnected_top); + READBOXES(disconnected_bottom); + READBOXES(disconnected_front); + READBOXES(disconnected_left); + READBOXES(disconnected_back); + READBOXES(disconnected_right); + READBOXES(disconnected); + READBOXES(disconnected_sides); } } @@ -264,26 +262,6 @@ void TileDef::deSerialize(std::istream &is, u8 contentfeatures_version, align_style = ALIGN_STYLE_NODE; } - -/* - SimpleSoundSpec serialization -*/ - -static void serializeSimpleSoundSpec(const SimpleSoundSpec &ss, - std::ostream &os, u8 version) -{ - os<getBool("connected_glass"); @@ -345,7 +323,7 @@ void ContentFeatures::reset() Cached stuff */ #ifndef SERVER - solidness = 2; + solidness = 0; visual_solidness = 0; backface_culling = true; @@ -419,8 +397,7 @@ void ContentFeatures::reset() void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const { - // protocol_version >= 36 - u8 version = 12; + const u8 version = CONTENTFEATURES_VERSION; writeU8(os, version); // general @@ -436,7 +413,7 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const // visual writeU8(os, drawtype); os << serializeString(mesh); - writeF1000(os, visual_scale); + writeF32(os, visual_scale); writeU8(os, 6); for (const TileDef &td : tiledef) td.serialize(os, protocol_version); @@ -456,10 +433,7 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const writeU16(os, connects_to_ids.size()); for (u16 connects_to_id : connects_to_ids) writeU16(os, connects_to_id); - writeU8(os, post_effect_color.getAlpha()); - writeU8(os, post_effect_color.getRed()); - writeU8(os, post_effect_color.getGreen()); - writeU8(os, post_effect_color.getBlue()); + writeARGB8(os, post_effect_color); writeU8(os, leveled); // lighting @@ -495,9 +469,9 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const collision_box.serialize(os, protocol_version); // sound - serializeSimpleSoundSpec(sound_footstep, os, version); - serializeSimpleSoundSpec(sound_dig, os, version); - serializeSimpleSoundSpec(sound_dug, os, version); + sound_footstep.serialize(os, version); + sound_dig.serialize(os, version); + sound_dug.serialize(os, version); // legacy writeU8(os, legacy_facedir_simple); @@ -524,8 +498,8 @@ void ContentFeatures::correctAlpha(TileDef *tiles, int length) void ContentFeatures::deSerialize(std::istream &is) { // version detection - int version = readU8(is); - if (version < 12) + const u8 version = readU8(is); + if (version < CONTENTFEATURES_VERSION) throw SerializationError("unsupported ContentFeatures version"); // general @@ -543,7 +517,7 @@ void ContentFeatures::deSerialize(std::istream &is) // visual drawtype = (enum NodeDrawType) readU8(is); mesh = deSerializeString(is); - visual_scale = readF1000(is); + visual_scale = readF32(is); if (readU8(is) != 6) throw SerializationError("unsupported tile count"); for (TileDef &td : tiledef) @@ -565,10 +539,7 @@ void ContentFeatures::deSerialize(std::istream &is) connects_to_ids.clear(); for (u16 i = 0; i < connects_to_size; i++) connects_to_ids.push_back(readU16(is)); - post_effect_color.setAlpha(readU8(is)); - post_effect_color.setRed(readU8(is)); - post_effect_color.setGreen(readU8(is)); - post_effect_color.setBlue(readU8(is)); + post_effect_color = readARGB8(is); leveled = readU8(is); // lighting-related @@ -605,9 +576,9 @@ void ContentFeatures::deSerialize(std::istream &is) collision_box.deSerialize(is); // sounds - deSerializeSimpleSoundSpec(sound_footstep, is, version); - deSerializeSimpleSoundSpec(sound_dig, is, version); - deSerializeSimpleSoundSpec(sound_dug, is, version); + sound_footstep.deSerialize(is, version); + sound_dig.deSerialize(is, version); + sound_dug.deSerialize(is, version); // read legacy properties legacy_facedir_simple = readU8(is); @@ -734,6 +705,8 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc tdef[j] = tiledef[j]; if (tdef[j].name.empty()) tdef[j].name = "unknown_node.png"; + if (g_settings->getBool("xray") && tdef[j].name == g_settings->get("xray_texture")) + drawtype = NDT_AIRLIKE; } // also the overlay tiles TileDef tdef_overlay[6]; @@ -827,6 +800,8 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc material_type = TILE_MATERIAL_WAVING_PLANTS; else if (waving == 2) material_type = TILE_MATERIAL_WAVING_LEAVES; + else if (waving == 3) + material_type = TILE_MATERIAL_WAVING_LIQUID_BASIC; break; case NDT_TORCHLIKE: case NDT_SIGNLIKE: @@ -844,8 +819,14 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc correctAlpha(tdef, 6); correctAlpha(tdef_overlay, 6); correctAlpha(tdef_spec, CF_SPECIAL_COUNT); - material_type = (alpha == 255) ? - TILE_MATERIAL_LIQUID_OPAQUE : TILE_MATERIAL_LIQUID_TRANSPARENT; + + if (waving == 3) { + material_type = (alpha == 255) ? TILE_MATERIAL_WAVING_LIQUID_OPAQUE : + TILE_MATERIAL_WAVING_LIQUID_TRANSPARENT; + } else { + material_type = (alpha == 255) ? TILE_MATERIAL_LIQUID_OPAQUE : + TILE_MATERIAL_LIQUID_TRANSPARENT; + } } u32 tile_shader = shdsrc->getShader("nodes_shader", material_type, drawtype); @@ -1223,20 +1204,34 @@ inline void NodeDefManager::fixSelectionBoxIntUnion() } +void NodeDefManager::eraseIdFromGroups(content_t id) +{ + // For all groups in m_group_to_items... + for (auto iter_groups = m_group_to_items.begin(); + iter_groups != m_group_to_items.end();) { + // Get the group items vector. + std::vector &items = iter_groups->second; + + // Remove any occurence of the id in the group items vector. + items.erase(std::remove(items.begin(), items.end(), id), items.end()); + + // If group is empty, erase its vector from the map. + if (items.empty()) + iter_groups = m_group_to_items.erase(iter_groups); + else + ++iter_groups; + } +} + + // IWritableNodeDefManager content_t NodeDefManager::set(const std::string &name, const ContentFeatures &def) { // Pre-conditions assert(name != ""); + assert(name != "ignore"); assert(name == def.name); - // Don't allow redefining ignore (but allow air and unknown) - if (name == "ignore") { - warningstream << "NodeDefManager: Ignoring " - "CONTENT_IGNORE redefinition"<>::iterator iter_groups = - m_group_to_items.begin(); iter_groups != m_group_to_items.end();) { - std::vector &items = iter_groups->second; - items.erase(std::remove(items.begin(), items.end(), id), items.end()); - - // Check if group is empty - if (items.empty()) - m_group_to_items.erase(iter_groups++); - else - ++iter_groups; - } + eraseIdFromGroups(id); } @@ -1327,8 +1316,11 @@ void NodeDefManager::applyTextureOverrides(const std::string &override_filepath) int line_c = 0; while (std::getline(infile, line)) { line_c++; - if (trim(line).empty()) + // Also trim '\r' on DOS-style files + line = trim(line); + if (line.empty()) continue; + std::vector splitted = str_split(line, ' '); if (splitted.size() != 3) { errorstream << override_filepath @@ -1621,7 +1613,7 @@ void NodeResolver::nodeResolveInternal() bool NodeResolver::getIdFromNrBacklog(content_t *result_out, - const std::string &node_alt, content_t c_fallback) + const std::string &node_alt, content_t c_fallback, bool error_on_fallback) { if (m_nodenames_idx == m_nodenames.size()) { *result_out = c_fallback; @@ -1639,8 +1631,9 @@ bool NodeResolver::getIdFromNrBacklog(content_t *result_out, } if (!success) { - errorstream << "NodeResolver: failed to resolve node name '" << name - << "'." << std::endl; + if (error_on_fallback) + errorstream << "NodeResolver: failed to resolve node name '" << name + << "'." << std::endl; c = c_fallback; }