mirror of
https://github.com/sys4-fr/server-nalc.git
synced 2024-11-14 06:20:32 +01:00
743507564f
- Moved the holographic item's name as a field in switch_params (pclasses.api.register_class) - Added wizard class' skeleton for later - Fixed a few bugs in nodes, inventory and api - Splitted tick function to bury items in two - Items from 3d_armor's armor inventory are also affected by inventory vacuuming (from tick function). The player's static armor inventory is first cleared, then copied to the detached one, then armor updates everything else (rendering, model, etc) - Fixed itemname of admin shield to reserve it properly - Return graveyard inventory if it already exists. Do not create it every two seconds
131 lines
3.9 KiB
Lua
Executable File
131 lines
3.9 KiB
Lua
Executable File
minetest.register_entity("pclasses:item", {
|
|
initial_properties = {
|
|
hp_max = 1,
|
|
physical = false,
|
|
collisionbox = {-0.17,-0.17,-0.17, 0.17,0.17,0.17},
|
|
visual = "sprite",
|
|
visual_size = {x=0.5, y=0.5},
|
|
textures = {""},
|
|
spritediv = {x=1, y=1},
|
|
initial_sprite_basepos = {x=0, y=0},
|
|
is_visible = false,
|
|
},
|
|
itemname = '',
|
|
class = '',
|
|
set_class = function(self, class)
|
|
self.class = class
|
|
end,
|
|
set_item = function(self, itemstring)
|
|
self.itemname = itemstring
|
|
local itemname = itemstring
|
|
local item_texture = nil
|
|
local item_type = ""
|
|
if minetest.registered_items[itemname] then
|
|
item_texture = minetest.registered_items[itemname].inventory_image
|
|
item_type = minetest.registered_items[itemname].type
|
|
end
|
|
local prop = {
|
|
is_visible = true,
|
|
visual = "sprite",
|
|
textures = {"unknown_item.png"}
|
|
}
|
|
if item_texture and item_texture ~= "" then
|
|
prop.visual = "sprite"
|
|
prop.textures = {item_texture}
|
|
prop.visual_size = {x=0.50, y=0.50}
|
|
else
|
|
prop.visual = "wielditem"
|
|
prop.textures = {itemname}
|
|
prop.visual_size = {x=0.25, y=0.25}
|
|
prop.automatic_rotate = math.pi * 0.10
|
|
end
|
|
self.object:set_properties(prop)
|
|
end,
|
|
on_rightclick = function(self, clicker)
|
|
pclasses.api.set_player_class(clicker:get_player_name(), self.class)
|
|
end,
|
|
on_activate = function(self, staticdata)
|
|
local tab = minetest.deserialize(staticdata)
|
|
if tab then
|
|
self.itemname = tab.itemname
|
|
self.class = tab.class
|
|
else
|
|
self.itemname = staticdata:split("|")[1]
|
|
self.class = staticdata:split("|")[2]
|
|
end
|
|
self.object:set_armor_groups({immortal=1})
|
|
self:set_item(self.itemname)
|
|
end,
|
|
get_staticdata = function(self)
|
|
return minetest.serialize({itemname = self.itemname, class = self.class})
|
|
end,
|
|
})
|
|
|
|
function pclasses.register_class_switch(cname, params)
|
|
local color = params.color or { r = 255, g = 255, b = 255 }
|
|
local txtcolor = string.format("#%02x%02x%02x", color.r, color.g, color.b)
|
|
local overlay = "pclasses_class_switch_orb_overlay.png"
|
|
local holo_item = params.holo_item or "default:diamond"
|
|
minetest.register_node(":pclasses:class_switch_" .. cname, {
|
|
description = "Class switch orb (" .. cname .. ")",
|
|
tiles = {(params.tile or overlay) .. "^[colorize:" .. txtcolor .. ":200"},
|
|
drawtype = "nodebox",
|
|
node_box = { type = "fixed", fixed = {
|
|
{-7/16, -8/16, -7/16, 7/16, -7/16, 7/16}, -- bottom plate
|
|
{-6/16, -7/16, -6/16, 6/16, -6/16, 6/16}, -- bottom plate (upper)
|
|
{-0.25, -6/16, -0.25, 0.25, 11/16, 0.25}, -- pillar
|
|
{-7/16, 11/16, -7/16, 7/16, 12/16, 7/16}, -- top plate
|
|
}},
|
|
can_dig = function(pos, player) return minetest.get_player_privs(player:get_player_name()).server == true end,
|
|
sunlight_propagates = true,
|
|
light_source = 10,
|
|
sounds = default.node_sound_glass_defaults(),
|
|
groups = {unbreakable = 1},
|
|
after_place_node = function(pos)
|
|
pos.y = pos.y + 1
|
|
|
|
-- Clean remaining entities
|
|
for _,ref in pairs(minetest.get_objects_inside_radius(pos, 1)) do
|
|
local e = ref:get_luaentity()
|
|
if e and e.name == "pclasses:item" then
|
|
ref:remove()
|
|
end
|
|
end
|
|
|
|
local obj = minetest.add_entity(pos, "pclasses:item")
|
|
if obj then
|
|
obj:get_luaentity():set_item(holo_item)
|
|
obj:get_luaentity():set_class(cname)
|
|
end
|
|
pos.y = pos.y - 1
|
|
local timer = minetest.get_node_timer(pos)
|
|
timer:start(3)
|
|
end,
|
|
on_timer = function(pos)
|
|
pos.y = pos.y + 1
|
|
for _,ref in pairs(minetest.get_objects_inside_radius(pos, 1)) do
|
|
local e = ref:get_luaentity()
|
|
if e and e.name == "pclasses:item" then
|
|
return true
|
|
end
|
|
end
|
|
|
|
local obj = minetest.add_entity(pos, "pclasses:item")
|
|
if obj then
|
|
obj:get_luaentity():set_item(holo_item)
|
|
obj:get_luaentity():set_class(cname)
|
|
end
|
|
return true
|
|
end,
|
|
on_destruct = function(pos)
|
|
pos.y = pos.y + 1
|
|
for _,ref in pairs(minetest.get_objects_inside_radius(pos, 1)) do
|
|
local e = ref:get_luaentity()
|
|
if e and e.name == "pclasses:item" then
|
|
ref:remove()
|
|
end
|
|
end
|
|
end,
|
|
})
|
|
end
|