1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 -- p_mesecon_iface.lua -- Mesecons interface by overriding the switch if minetest.get_modpath("mesecons_switch") == nil then return end minetest.override_item("mesecons_switch:mesecon_switch_off", { groups = { dig_immediate=2, save_in_at_nodedb=1, }, on_rightclick = function (pos, node) advtrains.ndb.swap_node(pos, {name="mesecons_switch:mesecon_switch_on", param2=node.param2}) mesecon.receptor_on(pos) minetest.sound_play("mesecons_switch", {pos=pos}) end, advtrains = { getstate = "off", setstate = function(pos, node, newstate) if newstate=="on" then advtrains.ndb.swap_node(pos, {name="mesecons_switch:mesecon_switch_on", param2=node.param2}) if advtrains but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "pointedthing.h" #include "serialize.h" #include "exceptions.h" #include <sstream> PointedThing::PointedThing(const v3s16 &under, const v3s16 &above, const v3s16 &real_under, const v3f &point, const v3s16 &normal, u16 box_id, f32 distSq): type(POINTEDTHING_NODE), node_undersurface(under), node_abovesurface(above), node_real_undersurface(real_under), intersection_point(point), intersection_normal(normal), box_id(box_id), distanceSq(distSq) {} PointedThing::PointedThing(s16 id, const v3f &point, const v3s16 &normal, f32 distSq) : type(POINTEDTHING_OBJECT), object_id(id), intersection_point(point), intersection_normal(normal), distanceSq(distSq) {} std::string PointedThing::dump() const { std::ostringstream os(std::ios::binary); switch (type) { case POINTEDTHING_NOTHING: os << "[nothing]"; break; case POINTEDTHING_NODE: { const v3s16 &u = node_undersurface; const v3s16 &a = node_abovesurface; os << "[node under=" << u.X << "," << u.Y << "," << u.Z << " above=" << a.X << "," << a.Y << "," << a.Z << "]"; } break; case POINTEDTHING_OBJECT: os << "[object " << object_id << "]"; break; default: os << "[unknown PointedThing]"; } return os.str(); } void PointedThing::serialize(std::ostream &os) const { writeU8(os, 0); // version writeU8(os, (u8)type); switch (type) { case POINTEDTHING_NOTHING: break; case POINTEDTHING_NODE: writeV3S16(os, node_undersurface); writeV3S16(os, node_abovesurface); break; case POINTEDTHING_OBJECT: writeS16(os, object_id); break; } } void PointedThing::deSerialize(std::istream &is) { int version = readU8(is); if (version != 0) throw SerializationError( "unsupported PointedThing version"); type = (PointedThingType) readU8(is); switch (type) { case POINTEDTHING_NOTHING: break; case POINTEDTHING_NODE: node_undersurface = readV3S16(is); node_abovesurface = readV3S16(is); break; case POINTEDTHING_OBJECT: object_id = readS16(is); break; default: throw SerializationError("unsupported PointedThingType"); } } bool PointedThing::operator==(const PointedThing &pt2) const { if (type != pt2.type) { return false; } if (type == POINTEDTHING_NODE) { if ((node_undersurface != pt2.node_undersurface) || (node_abovesurface != pt2.node_abovesurface) || (node_real_undersurface != pt2.node_real_undersurface)) return false; } else if (type == POINTEDTHING_OBJECT) { if (object_id != pt2.object_id) return false; } return true; } bool PointedThing::operator!=(const PointedThing &pt2) const { return !(*this == pt2); }