From 62f0bd32a0b4b1c64f1e4620edf6bb94a4ed0294 Mon Sep 17 00:00:00 2001 From: Sokomine Date: Sun, 15 Sep 2013 21:49:05 +0200 Subject: [PATCH] first commit --- README.md | 6 ++ init.lua | 152 +++++++++++++++++++++++++++++++++++++ textures/marker_marker.png | Bin 0 -> 2956 bytes 3 files changed, 158 insertions(+) create mode 100644 README.md create mode 100644 init.lua create mode 100644 textures/marker_marker.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..97b5d29 --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +Markers + +When you place a marker, it will tell you the distance to the last marker +you placed. +If you have already two markers placed and place a third one, the first marker +placed will disappear (if possible, that is, if the area is loaded). diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..e789415 --- /dev/null +++ b/init.lua @@ -0,0 +1,152 @@ + +marker = {} + +-- can store two positions for each player +marker.positions = {} + + +marker.marker_placed = function( pos, placer, itemstack ) + + if( not( pos ) or not( placer )) then + return; + end + + local meta = minetest.env:get_meta( pos ); + local name = placer:get_player_name(); + + meta:set_string( 'infotext', 'Marker at '..minetest.pos_to_string( pos )..' (placed by '..tostring( name )..'). Right-click to update.'); + meta:set_string( 'owner', name ); + + local txt = ''; + + if( not( marker.positions[ name ] )) then + marker.positions[ name ] = {}; + marker.positions[ name ][ 1 ] = pos; + marker.positions[ name ][ 2 ] = pos; -- make sure the table has always two entries + marker.positions[ name ][ 3 ] = 1; -- one marker set + + minetest.chat_send_player( name, 'First marker set to position '..minetest.pos_to_string( marker.positions[ name ][ 1 ] ).. + '. Please place a second marker to define an area.'); + else + -- remove the node at the old position if possible; if not, it will just sit there until someone digs it + + -- if two nodes have been set already, remove the old one if possible + if( marker.positions[ name ][ 3 ] > 1 ) then + + local old_node = minetest.env:get_node( marker.positions[ name ][ 1 ] ); + -- is that node loaded and does it contain a marker? If so, remove the old one + if( old_node and old_node.name ~= 'ignore' and old_node.name == 'marker:marker' ) then + -- actually remove the old marker + minetest.env:set_node( marker.positions[ name ][ 1 ], {name='air'} ); + -- return the old marker to the players inventory + placer:get_inventory():add_item("main", "marker:marker 1"); + minetest.chat_send_player( name, 'Removing now obsolete old marker at '..minetest.pos_to_string( marker.positions[ name ][ 1 ] )..'.'); + else + minetest.chat_send_player( name, 'Warning: Your old marker at '..minetest.pos_to_string( marker.positions[ name ][ 1 ] ).. + ' is now obsolete. It could not be removed automaticly. Please do so manually!'); + end + end + + marker.positions[ name ][ 1 ] = marker.positions[ name ][ 2 ]; + marker.positions[ name ][ 2 ] = pos; + marker.positions[ name ][ 3 ] = 2; -- both markers set + end + + local area = (math.abs( marker.positions[ name ][ 1 ].x - marker.positions[ name ][ 2 ].x )+1) + * (math.abs( marker.positions[ name ][ 1 ].z - marker.positions[ name ][ 2 ].z )+1); + local volume = area * (math.abs( marker.positions[ name ][ 1 ].y - marker.positions[ name ][ 2 ].y )+1); + + minetest.chat_send_player( name, 'Markers set to '..minetest.pos_to_string( marker.positions[ name ][ 1 ] )..' and '.. + minetest.pos_to_string( marker.positions[ name ][ 2 ] )..'. Distance: '.. + ' x: '..tostring( math.abs(marker.positions[ name ][ 2 ].x - marker.positions[ name ][ 1 ].x)).. + ', y: '..tostring( math.abs(marker.positions[ name ][ 2 ].y - marker.positions[ name ][ 1 ].y)).. + ', z: '..tostring( math.abs(marker.positions[ name ][ 2 ].z - marker.positions[ name ][ 1 ].z)).. + '. Area covered: '..tostring( area )..' m^2. Volume covered: '..tostring( volume )..' m^3.'); + +end + + + +marker.marker_dig = function(pos,player) + + if( not( pos ) or not( player )) then + return true; + end + + local meta = minetest.env:get_meta( pos ); + local owner = meta:get_string( 'owner' ); + -- can the marker be removed? + if( not( owner ) + or owner=='' + or not( marker.positions[ owner ] ) + or ( owner == player:get_player_name() + and ( marker.positions[ owner ][ 1 ].x ~= pos.x + or marker.positions[ owner ][ 1 ].y ~= pos.y + or marker.positions[ owner ][ 1 ].z ~= pos.z ) + and ( marker.positions[ owner ][ 2 ].x ~= pos.x + or marker.positions[ owner ][ 2 ].y ~= pos.y + or marker.positions[ owner ][ 2 ].z ~= pos.z ))) then + + minetest.chat_send_player( player:get_player_name(), 'Thank you for cleaning up this leftover marker!'); + return true; + + -- marker owned by someone else and still in use + elseif( owner ~= player:get_player_name() ) then + + minetest.chat_send_player( player:get_player_name(), 'Sorry, this marker is still in use by '..tostring( owner )..'.'); + return false; + + -- the marker marked pos1 + elseif ( marker.positions[ owner ][ 1 ].x == pos.x + and marker.positions[ owner ][ 1 ].y == pos.y + and marker.positions[ owner ][ 1 ].z == pos.z ) then + + + -- if this was already the last marker + if( marker.positions[ owner ][ 3 ] == 1 ) then + marker.positions[ owner ] = nil; + minetest.chat_send_player( owner, 'Removed your last marker.'); + else + marker.positions[ owner ][ 1 ] = marker.positions[ owner ][ 2 ]; + marker.positions[ owner ][ 3 ] = 1; -- only one marker left + minetest.chat_send_player( owner, 'Your remaining marker is at '..minetest.pos_to_string( marker.positions[ owner ][ 1 ] )..'.'); + end + return true; + + -- the marker marked pos2 + elseif ( marker.positions[ owner ][ 2 ].x == pos.x + and marker.positions[ owner ][ 2 ].y == pos.y + and marker.positions[ owner ][ 2 ].z == pos.z ) then + + + -- if this was already the last marker + if( marker.positions[ owner ][ 3 ] == 1 ) then + marker.positions[ owner ] = nil; + minetest.chat_send_player( 'Removed your last marker.'); + else + marker.positions[ owner ][ 2 ] = marker.positions[ owner ][ 1 ]; + marker.positions[ owner ][ 3 ] = 1; -- only one marker left + minetest.chat_send_player( owner, 'Your remaining marker is at '..minetest.pos_to_string( marker.positions[ owner ][ 1 ] )..'.'); + end + return true; + + end +end + + +minetest.register_node("marker:marker", { + description = "Marker", + tiles = {"marker_marker.png"}, + groups = {snappy=2,choppy=2,dig_immediate=3}, + light_source = 15, + + after_place_node = function(pos, placer, itemstack) + marker.marker_placed( pos, placer, itemstack ); + end, + + -- the node is digged immediately, so we may as well do all the work in can_dig (any wrong digs are not that critical) + can_dig = function(pos,player) + return marker.marker_dig( pos, player ); + end +}) + diff --git a/textures/marker_marker.png b/textures/marker_marker.png new file mode 100644 index 0000000000000000000000000000000000000000..26359823aaebb4aa45d0513efc9665cbabf4e2bd GIT binary patch literal 2956 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