aboutsummaryrefslogtreecommitdiff
Commit message (Expand)AuthorAge
...
* - Clear colors when reading property info.Rob Blanckaert2017-12-25
* Fix error if setting menu_last_game is not a valid gamenOOb31672017-12-22
* Fix undefined behaviour on getting pointer to data in empty vectornOOb31672017-12-22
* Fix wrong scrolling (#6809)Vitaliy2017-12-21
* Vector functions: Fix vector.direction() function, improve documentation (#6801)Paramat2017-12-21
* Allow 'default' parameter in 'settings:get_bool' functionJordan Irwin2017-12-17
* Adjust default console heightEzhh2017-12-17
* Give subgames the ability to disallow specific mapgens (#6792)Ezhh2017-12-16
* Fix items turning black (#6780)Vitaliy2017-12-16
* Change Normal Map setting to be less ambigousTre2017-12-16
* Zoom: Add 'disabled by game or mod' messageparamat2017-12-14
* Minimap messages: Improve 'disabled by server' messageparamat2017-12-14
* Add callback to preserve node metadata as item metadataashtrayoz2017-12-14
* Chat: Remove prompt history duplicates (#6762)SmallJoker2017-12-14
* directiontables: Fix MSVC compiler error (#6785)adrido2017-12-14
* Update light decoding table size (#6696)Vitaliy2017-12-12
* Builtin: Fix handle_node_drops crash with nil diggerSmallJoker2017-12-12
* CSM fixes: load mods after flavours & add flavour to block mod loading (#6738)Loïc Blot2017-12-11
* Lua_api.txt: Fix a spelling errorashtrayoz2017-12-10
* F5 debug info: Add colons, use lowercase except for FPS and RTTThomasMonroe3142017-12-10
* Damage: Remove damage ignore timerSmallJoker2017-12-10
* Use std::vector instead of dynamic C-Array (#6744)adrido2017-12-10
* Pointed thing to face pos: Use 'eye height' object property (#6754)Paramat2017-12-09
* Add an active object step time budget #6721Lars Hofhansl2017-12-06
* Add coloured logs (#4549)you2017-12-06
* Auth handler: Player deletion & Iterator (#6741)sfan52017-12-06
* Ensure no item stack is being held before crafting (#4779)Luis Cáceres2017-12-06
* Use Irrlicht's mesh cache for animated meshes.Lars Hofhansl2017-12-04
* Zoom: Set zoom FOV per-player using a player object propertyparamat2017-12-04
* Android: Update build system for ndk-r15xstujones112017-12-04
* Document extended meaning of active_object_send_range_blocks setting.Lars Hofhansl2017-12-03
* Optionally extend the active object in a players camera direction.Lars Hofhansl2017-12-03
* Shut down mapgen threads before other shutdown tasks (#6689)raymoo2017-12-03
* Update documentation regarding authentication handler and related functionssfan52017-12-01
* Make core.auth_table private and structure builtin/auth.luasfan52017-12-01
* Lua_api.txt: Remove MT version, fix spelling and clean upezhh2017-12-01
* CAO/SAO: Nicer velocity-controlled, interpolated rotation property:SmallJoker2017-12-01
* Turn off verbose info message introduced accidentally with ae9b1aaLars Hofhansl2017-11-29
* Fix spelling mistakes in client_lua_api.txtBluebird2017-11-29
* Client lua api documentation: .md -> .txtparamat2017-11-28
* Fix lua_api.txt indentation issuesezhh2017-11-28
* Fix documentation formatting for on_death callbackEzhh2017-11-28
* F5 Debug info: More compact, return to 2 linesparamat2017-11-27
* Hint at problematic code when logging deprecated callssfan52017-11-27
* Light curve: Add and tune mid boost gaussianparamat2017-11-27
* Improve documentation for player:set_attribute()Ezhh2017-11-25
* Fix misspellingsgituser21942017-11-24
* Inventory: Restrict access from too far awaySmallJoker2017-11-24
* Clearobjects: Send progress messages to terminal using actionstreamparamat2017-11-24
* core.rotate_node: Run callbacks like with any regular placed node (#6648)SmallJoker2017-11-21
t; // For ser_ver_supported /* MapNode */ // Create directly from a nodename // If name is unknown, sets CONTENT_IGNORE MapNode::MapNode(INodeDefManager *ndef, const std::string &name, u8 a_param1, u8 a_param2) { content_t id = CONTENT_IGNORE; ndef->getId(name, id); param1 = a_param1; param2 = a_param2; // Set content (param0 and (param2&0xf0)) after other params // because this needs to override part of param2 setContent(id); } void MapNode::setLight(enum LightBank bank, u8 a_light, INodeDefManager *nodemgr) { // If node doesn't contain light data, ignore this if(nodemgr->get(*this).param_type != CPT_LIGHT) return; if(bank == LIGHTBANK_DAY) { param1 &= 0xf0; param1 |= a_light & 0x0f; } else if(bank == LIGHTBANK_NIGHT) { param1 &= 0x0f; param1 |= (a_light & 0x0f)<<4; } else assert(0); } u8 MapNode::getLight(enum LightBank bank, INodeDefManager *nodemgr) const { // Select the brightest of [light source, propagated light] const ContentFeatures &f = nodemgr->get(*this); u8 light = 0; if(f.param_type == CPT_LIGHT) { if(bank == LIGHTBANK_DAY) light = param1 & 0x0f; else if(bank == LIGHTBANK_NIGHT) light = (param1>>4)&0x0f; else assert(0); } if(f.light_source > light) light = f.light_source; return light; } bool MapNode::getLightBanks(u8 &lightday, u8 &lightnight, INodeDefManager *nodemgr) const { // Select the brightest of [light source, propagated light] const ContentFeatures &f = nodemgr->get(*this); if(f.param_type == CPT_LIGHT) { lightday = param1 & 0x0f; lightnight = (param1>>4)&0x0f; } else { lightday = 0; lightnight = 0; } if(f.light_source > lightday) lightday = f.light_source; if(f.light_source > lightnight) lightnight = f.light_source; return f.param_type == CPT_LIGHT || f.light_source != 0; } u8 MapNode::getFaceDir(INodeDefManager *nodemgr) const { const ContentFeatures &f = nodemgr->get(*this); if(f.param_type_2 == CPT2_FACEDIR) return getParam2() & 0x03; return 0; } u8 MapNode::getWallMounted(INodeDefManager *nodemgr) const { const ContentFeatures &f = nodemgr->get(*this); if(f.param_type_2 == CPT2_WALLMOUNTED) return getParam2() & 0x07; return 0; } v3s16 MapNode::getWallMountedDir(INodeDefManager *nodemgr) const { switch(getWallMounted(nodemgr)) { case 0: default: return v3s16(0,1,0); case 1: return v3s16(0,-1,0); case 2: return v3s16(1,0,0); case 3: return v3s16(-1,0,0); case 4: return v3s16(0,0,1); case 5: return v3s16(0,0,-1); } } u32 MapNode::serializedLength(u8 version) { if(!ser_ver_supported(version)) throw VersionMismatchException("ERROR: MapNode format not supported"); if(version == 0) return 1; else if(version <= 9) return 2; else return 3; } void MapNode::serialize(u8 *dest, u8 version) { if(!ser_ver_supported(version)) throw VersionMismatchException("ERROR: MapNode format not supported"); if(version <= 21) { serialize_pre22(dest, version); return; } writeU8(dest+0, param0); writeU8(dest+1, param1); writeU8(dest+2, param2); } void MapNode::deSerialize(u8 *source, u8 version) { if(!ser_ver_supported(version)) throw VersionMismatchException("ERROR: MapNode format not supported"); if(version <= 21) { deSerialize_pre22(source, version); return; } param0 = readU8(source+0); param1 = readU8(source+1); param2 = readU8(source+2); } void MapNode::serializeBulk(std::ostream &os, int version, const MapNode *nodes, u32 nodecount, u8 content_width, u8 params_width, bool compressed) { if(!ser_ver_supported(version)) throw VersionMismatchException("ERROR: MapNode format not supported"); assert(version >= 22); assert(content_width == 1); assert(params_width == 2); SharedBuffer<u8> databuf(nodecount * (content_width + params_width)); // Serialize content if(content_width == 1) { for(u32 i=0; i<nodecount; i++) writeU8(&databuf[i], nodes[i].param0); } /* If param0 is extended to two bytes, use something like this: */ /*else if(content_width == 2) { for(u32 i=0; i<nodecount; i++) writeU16(&databuf[i*2], nodes[i].param0); }*/ // Serialize param1 u32 start1 = content_width * nodecount; for(u32 i=0; i<nodecount; i++) writeU8(&databuf[start1 + i], nodes[i].param1); // Serialize param2 u32 start2 = (content_width + 1) * nodecount; for(u32 i=0; i<nodecount; i++) writeU8(&databuf[start2 + i], nodes[i].param2); /* Compress data to output stream */ if(compressed) { compressZlib(databuf, os); } else { os.write((const char*) &databuf[0], databuf.getSize()); } } // Deserialize bulk node data void MapNode::deSerializeBulk(std::istream &is, int version, MapNode *nodes, u32 nodecount, u8 content_width, u8 params_width, bool compressed) { if(!ser_ver_supported(version)) throw VersionMismatchException("ERROR: MapNode format not supported"); assert(version >= 22); assert(content_width == 1); assert(params_width == 2); // Uncompress or read data u32 len = nodecount * (content_width + params_width); SharedBuffer<u8> databuf(len); if(compressed) { std::ostringstream os(std::ios_base::binary); decompressZlib(is, os); std::string s = os.str(); if(s.size() != len) throw SerializationError("deSerializeBulkNodes: " "decompress resulted in invalid size"); memcpy(&databuf[0], s.c_str(), len); } else { is.read((char*) &databuf[0], len); if(is.eof() || is.fail()) throw SerializationError("deSerializeBulkNodes: " "failed to read bulk node data"); } // Deserialize content if(content_width == 1) { for(u32 i=0; i<nodecount; i++) nodes[i].param0 = readU8(&databuf[i]); } /* If param0 is extended to two bytes, use something like this: */ /*else if(content_width == 2) { for(u32 i=0; i<nodecount; i++) nodes[i].param0 = readU16(&databuf[i*2]); }*/ // Deserialize param1 u32 start1 = content_width * nodecount; for(u32 i=0; i<nodecount; i++) nodes[i].param1 = readU8(&databuf[start1 + i]); // Deserialize param2 u32 start2 = (content_width + 1) * nodecount; for(u32 i=0; i<nodecount; i++) nodes[i].param2 = readU8(&databuf[start2 + i]); } /* Legacy serialization */ void MapNode::serialize_pre22(u8 *dest, u8 version) { // Translate to wanted version MapNode n_foreign = mapnode_translate_from_internal(*this, version); u8 actual_param0 = n_foreign.param0; // Convert special values from new version to old if(version <= 18) { // In these versions, CONTENT_IGNORE and CONTENT_AIR // are 255 and 254 if(actual_param0 == CONTENT_IGNORE) actual_param0 = 255; else if(actual_param0 == CONTENT_AIR) actual_param0 = 254; } if(version == 0) { dest[0] = actual_param0; } else if(version <= 9) { dest[0] = actual_param0; dest[1] = n_foreign.param1; } else { dest[0] = actual_param0; dest[1] = n_foreign.param1; dest[2] = n_foreign.param2; } } void MapNode::deSerialize_pre22(u8 *source, u8 version) { if(version <= 1) { param0 = source[0]; } else if(version <= 9) { param0 = source[0]; param1 = source[1]; } else { param0 = source[0]; param1 = source[1]; param2 = source[2]; } // Convert special values from old version to new if(version <= 19) { // In these versions, CONTENT_IGNORE and CONTENT_AIR // are 255 and 254 // Version 19 is fucked up with sometimes the old values and sometimes not if(param0 == 255) param0 = CONTENT_IGNORE; else if(param0 == 254) param0 = CONTENT_AIR; } // Translate to our known version *this = mapnode_translate_to_internal(*this, version); }