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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159<# Blender v2.79 (sub 0) OBJ File: 'schild.blend' # www.blender.org o Cube v 0.104941 1.055075 -0.255309 v 0.107281 1.055075 -0.282055 v 0.122199 1.055075 -0.234742 v 0.127848 1.055075 -0.299313 v 0.148945 1.055075 -0.232402 v 0.154594 1.055075 -0.296973 v 0.169512 1.055075 -0.249660 v 0.171852 1.055075 -0.276406 v 0.171852 1.055075 -0.276406 v 0.169512 1.055075 -0.249660 v 0.154594 1.055075 -0.296973 v 0.148945 1.055075 -0.232402 v 0.107281 1.055075 -0.282055 v 0.122199 1.055075 -0.234742 v 0.127848 1.055075 -0.299313 v 0.104941 1.055075 -0.255309 v 0.138397 -0.698893 -0.265857 v 0.040676 0.860365 -0.369062 v 0.278987 0.860365 -0.245006 v 0.040676 1.249784 -0.369062 v 0.278987 1.249784 -0.245006 v 0.033444 0.860365 -0.355168 v 0.033444 1.249784 -0.355168 v 0.271754 1.249784 -0.231112 v 0.271754 0.860365 -0.231112 v 0.107281 -0.499729 -0.282055 v 0.104941 -0.499729 -0.255309 v 0.122199 -0.499729 -0.234741 v 0.148946 -0.499729 -0.232402 v 0.169513 -0.499729 -0.249659 v 0.171853 -0.499729 -0.276406 v 0.154595 -0.499729 -0.296973 v 0.127848 -0.499729 -0.299313 vt 0.372863 0.578719 vt 0.372317 0.613951 vt 0.371666 0.613734 vt 0.372221 0.578991 vt 0.315877 0.640082 vt 0.292344 0.614764 vt 0.292986 0.614492 vt 0.316131 0.639438 vt 0.315346 0.553400 vt 0.349331 0.553400 vt 0.349077 0.554044 vt 0.315664 0.554020 vt 0.349861 0.640082 vt 0.349543 0.639462 vt 0.292889 0.579531 vt 0.293541 0.579748 vt 0.444102 0.636706 vt 0.409596 0.636706 vt 0.385196 0.612306 vt 0.385196 0.577799 vt 0.409596 0.553400 vt 0.444102 0.553400 vt 0.468502 0.577800 vt 0.468502 0.612306 vt 0.037160 1.987962 vt 0.036793 0.000397 vt 0.071486 0.000384 vt 0.071853 1.987948 vt 0.677908 0.520935 vt 0.657776 0.520935 vt 0.657776 0.020439 vt 0.677907 0.020439 vt 0.312476 0.541067 vt 0.312476 0.520935 vt 0.657776 0.541067 vt 0.312475 0.020439 vt 0.657776 0.000307 vt 0.312475 0.000307 vt 0.292344 0.020439 vt 0.292344 0.520935 vt 0.002468 1.987974 vt 0.002100 0.000409 vt 0.106546 1.987936 vt 0.106179 0.000371 vt 0.140872 0.000358 vt 0.141239 1.987923 vt 0.245318 1.987885 vt 0.244951 0.000319 vt 0.279643 0.000307 vt 0.280011 1.987871 vt 0.175932 1.987910 vt 0.175565 0.000345 vt 0.210258 0.000332 vt 0.210625 1.987897 vt 0.832979 0.004636 vt 0.832979 0.997197 vt 0.148195 0.997197 vt 0.148195 0.004637 vn 0.0000 0.0000 1.0000 vn 0.0000 1.0000 -0.0000 vn 0.6428 0.0000 0.7660 vn 0.8870 0.0000 0.4617 vn -0.4617 -0.0000 0.8870 vn 0.0000 -1.0000 -0.0000 vn -0.8870 -0.0000 -0.4617 vn -0.0872 0.0000 0.9962 vn 0.7660 0.0000 -0.6428 vn 0.9962 0.0000 0.0872 vn -0.7660 -0.0000 0.6428 vn -0.6428 -0.0000 -0.7660 vn -0.9962 -0.0000 -0.0872 vn 0.0872 -0.0000 -0.9962 vn 0.4617 0.0000 -0.8870 g Cube_Cube_Material s off f 8/1/1 6/2/1 11/3/1 9/4/1 f 2/5/1 16/6/1 1/7/1 13/8/1 f 12/9/1 10/10/1 7/11/1 5/12/1 f 6/2/1 4/13/1 15/14/1 11/3/1 f 16/6/1 14/15/1 3/16/1 1/7/1 f 10/10/1 8/1/1 9/4/1 7/11/1 f 4/17/2 2/18/2 16/19/2 14/20/2 12/21/2 10/22/2 8/23/2 6/24/2 f 5/25/3 29/26/3 30/27/3 7/28/3 f 4/13/1 2/5/1 13/8/1 15/14/1 f 21/29/4 24/30/4 25/31/4 19/32/4 f 20/33/2 23/34/2 24/30/2 21/35/2 f 22/36/5 25/31/5 24/30/5 23/34/5 f 19/37/6 25/31/6 22/36/6 18/38/6 f 18/39/7 22/36/7 23/34/7 20/40/7 f 14/15/1 12/9/1 5/12/1 3/16/1 f 3/41/8 28/42/8 29/26/8 5/25/8 f 9/43/9 31/44/9 32/45/9 11/46/9 f 7/28/10 30/27/10 31/44/10 9/43/10 f 1/47/11 27/48/11 28/49/11 3/50/-- Minetest: builtin/misc.lua -- -- Misc. API functions -- function core.check_player_privs(name, ...) if core.is_player(name) then name = name:get_player_name() elseif type(name) ~= "string" then error("core.check_player_privs expects a player or playername as " .. "argument.", 2) end local requested_privs = {...} local player_privs = core.get_player_privs(name) local missing_privileges = {} if type(requested_privs[1]) == "table" then -- We were provided with a table like { privA = true, privB = true }. for priv, value in pairs(requested_privs[1]) do if value and not player_privs[priv] then missing_privileges[#missing_privileges + 1] = priv end end else -- Only a list, we can process it directly. for key, priv in pairs(requested_privs) do if not player_privs[priv] then missing_privileges[#missing_privileges + 1] = priv end end end if #missing_privileges > 0 then return false, missing_privileges end return true, "" end function core.send_join_message(player_name) if not core.is_singleplayer() then core.chat_send_all("*** " .. player_name .. " joined the game.") end end function core.send_leave_message(player_name, timed_out) local announcement = "*** " .. player_name .. " left the game." if timed_out then announcement = announcement .. " (timed out)" end core.chat_send_all(announcement) end core.register_on_joinplayer(function(player) local player_name = player:get_player_name() if not core.is_singleplayer() then local status = core.get_server_status(player_name, true) if status and status ~= "" then core.chat_send_player(player_name, status) end end core.send_join_message(player_name) end) core.register_on_leaveplayer(function(player, timed_out) local player_name = player:get_player_name() core.send_leave_message(player_name, timed_out) end) function core.is_player(player) -- a table being a player is also supported because it quacks sufficiently -- like a player if it has the is_player function local t = type(player) return (t == "userdata" or t == "table") and type(player.is_player) == "function" and player:is_player() end function core.player_exists(name) return core.get_auth_handler().get_auth(name) ~= nil end -- Returns two position vectors representing a box of `radius` in each -- direction centered around the player corresponding to `player_name` function core.get_player_radius_area(player_name, radius) local player = core.get_player_by_name(player_name) if player == nil then return nil end local p1 = player:get_pos() local p2 = p1 if radius then p1 = vector.subtract(p1, radius) p2 = vector.add(p2, radius) end return p1, p2 end function core.hash_node_position(pos) return (pos.z + 32768) * 65536 * 65536 + (pos.y + 32768) * 65536 + pos.x + 32768 end function core.get_position_from_hash(hash) local pos = {} pos.x = (hash % 65536) - 32768 hash = math.floor(hash / 65536) pos.y = (hash % 65536) - 32768 hash = math.floor(hash / 65536) pos.z = (hash % 65536) - 32768 return pos end function core.get_item_group(name, group) if not core.registered_items[name] or not core.registered_items[name].groups[group] then return 0 end return core.registered_items[name].groups[group] end function core.get_node_group(name, group) core.log("deprecated", "Deprecated usage of get_node_group, use get_item_group instead") return core.get_item_group(name, group) end function core.setting_get_pos(name) local value = core.settings:get(name) if not value then return nil end return core.string_to_pos(value) end -- To be overriden by protection mods function core.is_protected(pos, name) return false end function core.record_protection_violation(pos, name) for _, func in pairs(core.registered_on_protection_violation) do func(pos, name) end end -- Checks if specified volume intersects a protected volume function core.is_area_protected(minp, maxp, player_name, interval) -- 'interval' is the largest allowed interval for the 3D lattice of checks. -- Compute the optimal float step 'd' for each axis so that all corners and -- borders are checked. 'd' will be smaller or equal to 'interval'. -- Subtracting 1e-4 ensures that the max co-ordinate will be reached by the -- for loop (which might otherwise not be the case due to rounding errors). -- Default to 4 interval = interval or 4 local d = {} for _, c in pairs({"x", "y", "z"}) do if minp[c] > maxp[c] then -- Repair positions: 'minp' > 'maxp' local tmp = maxp[c] maxp[c] = minp[c] minp[c] = tmp end if maxp[c] > minp[c] then d[c] = (maxp[c] - minp[c]) / math.ceil((maxp[c] - minp[c]) / interval) - 1e-4 else d[c] = 1 -- Any value larger than 0 to avoid division by zero end end for zf = minp.z, maxp.z, d.z do local z = math.floor(zf + 0.5) for yf = minp.y, maxp.y, d.y do local y = math.floor(yf + 0.5) for xf = minp.x, maxp.x, d.x do local x = math.floor(xf + 0.5) local pos = {x = x, y = y, z = z} if core.is_protected(pos, player_name) then return pos end end end end return false end local raillike_ids = {} local raillike_cur_id = 0 function core.raillike_group(name) local id = raillike_ids[name] if not id then raillike_cur_id = raillike_cur_id + 1 raillike_ids[name] = raillike_cur_id id = raillike_cur_id end return id end -- HTTP callback interface function core.http_add_fetch(httpenv) httpenv.fetch = function(req, callback) local handle = httpenv.fetch_async(req) local function update_http_status() local res = httpenv.fetch_async_get(handle) if res.completed then callback(res) else core.after(0, update_http_status) end end core.after(0, update_http_status) end return httpenv end function core.close_formspec(player_name, formname) return core.show_formspec(player_name, formname, "") end function core.cancel_shutdown_requests() core.request_shutdown("", false, -1) end