1
0
mirror of https://github.com/sys4-fr/server-nalc.git synced 2024-12-26 10:40:37 +01:00
server-nalc/mods/pclasses/nodes.lua
LeMagnesium 743507564f Updated pclasses
- 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
2015-08-20 17:18:57 +02:00

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