initial commit
This commit is contained in:
parent
a9c873eafe
commit
e62e834955
170
init.lua
Normal file
170
init.lua
Normal file
@ -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)
|
25
license.txt
Normal file
25
license.txt
Normal file
@ -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
|
Loading…
x
Reference in New Issue
Block a user