From e62e83495541ba834e1fc4be155184287e8bf9fd Mon Sep 17 00:00:00 2001 From: Elkien3 Date: Tue, 3 Dec 2019 10:08:16 -0600 Subject: [PATCH] initial commit --- init.lua | 170 ++++++++++++++++++++++++++++++++++++++++++++++++++++ license.txt | 25 ++++++++ 2 files changed, 195 insertions(+) create mode 100644 init.lua create mode 100644 license.txt diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..10ec14d --- /dev/null +++ b/init.lua @@ -0,0 +1,170 @@ +local share_bones_time = tonumber(minetest.settings:get("share_bones_time")) or 1200 + +local function serializeContents(contents) + if not contents then return "" end + + local tabs = {} + for i, stack in ipairs(contents) do + tabs[i] = stack and stack:to_table() or "" + end + + return minetest.serialize(tabs) +end + +local function deserializeContents(data) + if not data or data == "" then return nil end + local tabs = minetest.deserialize(data) + if not tabs or type(tabs) ~= "table" then return nil end + + local contents = {} + for i, tab in ipairs(tabs) do + contents[i] = ItemStack(tab) + end + + return contents +end + +minetest.register_entity("bones_entity:entity", { + hp_max = 1, + physical = false, + weight = 5, + collisionbox = {-0.3, -1, -0.3, 0.3, -.4, 0.3}, + visual = "mesh", + mesh = "character.b3d", + textures = {"invisible.png"}, + is_visible = true, + makes_footstep_sound = false, + automatic_rotate = false, + on_activate = function(self, staticdata, dtime_s) + if not self.owner then + local deserialized = minetest.deserialize(staticdata) + if deserialized then + self.inv = deserializeContents(deserialized.inv) + if deserialized.owner then + self.owner = deserialized.owner + end + if deserialized.expiretime then + self.time = deserialized.expiretime + if self.time < os.time() then + self.object:set_properties({infotext = self.owner.."'s old bones"}) + else + self.object:set_properties({infotext = self.owner.."'s fresh bones"}) + minetest.after(self.time-os.time(), function(self) + self.object:set_properties({infotext = self.owner.."'s old bones"}) + end, self) + end + end + local inv = minetest.create_detached_inventory("bones_"..self.owner, {}) + inv:set_size("main", 8 * 6) + inv:set_list("main",self.inv) + if inv:is_empty("main") then + self.object:remove() + end + end + self.object:set_armor_groups({immortal = 1}) + if deserialized.mesh and deserialized.textures and deserialized.yaw then + self.mesh = deserialized.mesh + self.textures = deserialized.textures + self.yaw = deserialized.yaw + self.object:set_properties({mesh = deserialized.mesh, textures = deserialized.textures}) + self.object:set_yaw(deserialized.yaw) + self.object:set_animation({x=162,y=167}, 1) + end + end + end, + get_staticdata = function(self) + return minetest.serialize({owner = self.owner, expiretime = self.time, mesh = self.mesh, textures = self.textures, yaw = self.yaw, inv = serializeContents(self.inv)}) + end, + on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir) + local name = puncher:get_player_name() + if name ~= self.owner and self.time > os.time() and not minetest.check_player_privs(name, "protection_bypass") then return end + + local player_inv = puncher:get_inventory() + local has_space = true + local inv = minetest.create_detached_inventory("bones_"..self.owner, {}) + inv:set_size("main", 8 * 6) + inv:set_list("main",self.inv) + --The MIT License (MIT) (Following 12 lines) + --Copyright (C) 2012-2016 PilzAdam + --Copyright (C) 2012-2016 Various Minetest developers and contributors + for i = 1, inv:get_size("main") do + local stk = inv:get_stack("main", i) + if player_inv:room_for_item("main", stk) then + inv:set_stack("main", i, nil) + player_inv:add_item("main", stk) + else + has_space = false + break + end + end + -- remove bones if player emptied them + if has_space then + self.object:remove() + else + self.inv = inv:get_list("main") + end + end, + on_rightclick = function(self, clicker) + local name = clicker:get_player_name() + local inventory = minetest.create_detached_inventory("bones_"..name, { + allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) + return 0 + end, + allow_put = function(inv, listname, index, stack, player) + return 0 + end, + allow_take = function(inv, listname, index, stack, player) + local name = player:get_player_name() + if name == self.owner or self.time < os.time() or minetest.check_player_privs(name, "protection_bypass") then + return stack:get_count() + end + return 0 + end, + on_take = function(inv, listname, index, stack, player) + self.inv = inv:get_list("main") + if inv:is_empty("main") then + self.object:remove() + end + end, + }) + inventory:set_size("main", 48) + local templist = table.copy(self.inv) + inventory:set_list("main", templist) + local formspec = + "size[12,9]".. + "list[detached:bones_"..name..";main;0,0;12,4;]".. + "list[current_player;main;2,5;8,4;]" + minetest.show_formspec(name, "bones_inv", formspec) + end +}) +minetest.register_on_dieplayer(function(player) + local pos = player:get_pos() + local player_inv = player:get_inventory() + if player_inv:is_empty("main") and + player_inv:is_empty("craft") then + return + end + local inv = minetest.create_detached_inventory("bones_"..player:get_player_name(), {}) + --The MIT License (MIT) (Following 14 lines) + --Copyright (C) 2012-2016 PilzAdam + --Copyright (C) 2012-2016 Various Minetest developers and contributors + inv:set_size("main", 8 * 6) + inv:set_list("main", player_inv:get_list("main")) + + for i = 1, player_inv:get_size("craft") do + local stack = player_inv:get_stack("craft", i) + if inv:room_for_item("main", stack) then + inv:add_item("main", stack) + else + --drop if no space left + drop(pos, stack) + end + end + pos.y = pos.y + 1 + local props = player:get_properties() + local yaw = player:get_look_horizontal() + local e = minetest.add_entity(pos, "bones_entity:entity", minetest.serialize({owner = player:get_player_name(), expiretime = os.time() + share_bones_time, mesh = props.mesh, textures = props.textures, yaw = yaw, inv = serializeContents(inv:get_list("main"))})) + + player_inv:set_list("main", {}) + player_inv:set_list("craft", {}) +end) \ No newline at end of file diff --git a/license.txt b/license.txt new file mode 100644 index 0000000..8a69013 --- /dev/null +++ b/license.txt @@ -0,0 +1,25 @@ +---------------------- + +The MIT License (MIT) +Copyright (C) 2019 Elkien3 +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2012-2016 Various Minetest developers and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT \ No newline at end of file