1
0
mirror of https://github.com/sys4-fr/server-nalc.git synced 2025-04-15 08:50:25 +02:00

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
This commit is contained in:
LeMagnesium 2015-08-20 17:11:46 +02:00
parent 837e25bc13
commit 743507564f
11 changed files with 120 additions and 55 deletions

View File

@ -11,7 +11,8 @@ pclasses.api.register_class("admin", {
minetest.chat_send_player(pname, "Hello admin.") minetest.chat_send_player(pname, "Hello admin.")
end, end,
switch_params = { switch_params = {
color = {r = 255, g = 00, b = 224} color = {r = 255, g = 00, b = 224},
holo_item = "maptools:pick_admin"
} }
}) })
@ -19,6 +20,6 @@ pclasses.api.reserve_item("admin", "3d_armor:helmet_admin")
pclasses.api.reserve_item("admin", "3d_armor:chestplate_admin") pclasses.api.reserve_item("admin", "3d_armor:chestplate_admin")
pclasses.api.reserve_item("admin", "3d_armor:leggings_admin") pclasses.api.reserve_item("admin", "3d_armor:leggings_admin")
pclasses.api.reserve_item("admin", "3d_armor:boots_admin") pclasses.api.reserve_item("admin", "3d_armor:boots_admin")
pclasses.api.reserve_item("admin", "shields:shields_admin") pclasses.api.reserve_item("admin", "shields:shield_admin")
pclasses.api.reserve_item("admin", "maptools:pick_admin") pclasses.api.reserve_item("admin", "maptools:pick_admin")
pclasses.api.reserve_item("admin", "maptools:pick_admin_with_drops") pclasses.api.reserve_item("admin", "maptools:pick_admin_with_drops")

View File

@ -23,7 +23,8 @@ pclasses.api.register_class("hunter", {
end, end,
switch_params = { switch_params = {
color = {r = 30, g = 170, b = 00}, color = {r = 30, g = 170, b = 00},
tile = "default_wood.png" tile = "default_wood.png",
holo_item = "throwing:bow_minotaur_horn_improved"
} }
}) })

View File

@ -3,3 +3,4 @@ local path = minetest.get_modpath("mff_pclasses")
dofile(path .. "/warrior.lua") dofile(path .. "/warrior.lua")
dofile(path .. "/hunter.lua") dofile(path .. "/hunter.lua")
dofile(path .. "/admin.lua") dofile(path .. "/admin.lua")
dofile(path .. "/wizard.lua")

View File

@ -11,14 +11,15 @@ pclasses.api.register_class("warrior", {
minetest.sound_play("pclasses_full_warrior") minetest.sound_play("pclasses_full_warrior")
minetest.chat_send_player(pname, "You are now a warrior") minetest.chat_send_player(pname, "You are now a warrior")
sprint.set_maxstamina(pname, 20) sprint.set_maxstamina(pname, 20)
minetest.log("action", "[PClasses] Player " .. pname .. " become a warrior") minetest.log("action", "[PClasses] Player " .. pname .. " becomes a warrior")
end, end,
on_unassigned = function(pname) on_unassigned = function(pname)
sprint.set_default_maxstamina(pname) sprint.set_default_maxstamina(pname)
end, end,
switch_params = { switch_params = {
color = {r = 06, g = 06, b = 30}, color = {r = 06, g = 06, b = 30},
tile = "default_steel_block.png" tile = "default_steel_block.png",
holo_item = "default:dungeon_master_s_blood_sword"
} }
}) })

View File

@ -0,0 +1,22 @@
------------------
-- Wizard class --
------------------
--
-- No Issue Yet
--
pclasses.api.register_class("wizard", {
on_assigned = function(pname)
-- minetest.sound_play("pclasses_full_wizard")
minetest.chat_send_player(pname, "You are now a wizard.")
-- Add specs here
minetest.log("action", "[PClasses] Player " .. pname .. " becomes a wizard")
end,
switch_params = {
color = {r = 230, g = 230, b = 0},
holo_item = "default:book"
}
})
-- Reserved items here

View File

@ -15,39 +15,42 @@ Yet another class mod for Minetest.
### pclasses.api ### pclasses.api
- All functions used to declare, get, set classes - All functions used to declare, get, set classes
### pclasses.api.util
- Some utility functions
### pclasses.conf
- Some configuration values
### pclasses.classes ### pclasses.classes
- All classes and their specs - All classes and their specs
### pclasses.datas ### pclasses.data
- Miscellaneous datas - Miscellaneous data
#### pclasses.datas.players #### pclasses.data.players
- List of all players' class. Index is player's name and value is the class's name - List of all players' class. Index is player's name and value is the class's name
#### pclasses.datas.hud_ids #### pclasses.data.hud_ids
- Surely useful in the future with a hypothetical hud to show current class - Surely useful in the future with a hypothetical hud to show current class
# Functions # Functions
### pclasses.api.create_class_id ### pclasses.api.register_class
- Arguments : None - Arguments : cname, def
- Indicates the next free id/index in the classes' table - Registers a class and its specifications
- Def is a definition table that can contain many functions/values :
- `on_assigned` which is a function, receiving as argument the player name
- `on_unassigned` which is a function, receiving as argument the player name
- `switch_params`, which is a table, containing parameters for the switch pedestal :
- `holo_item` is mandatory. It's the itemstring of the item to be put over the pedestal
- `color` is optional. Default is white. It's a RGB table.
- `tile` is optional. Default is none. It's a string of the texture to be applied over the pedestal
### pclasses.api.id_for_class ### pclasses.register_class_switch
- Arguments : cname (class' name) - Arguments : cname, params
- Returns the id/index corresponding the class in the classes' table - Used internally to create switch pedestals
- Returns 0 if not found, nil if no name given - `params` is the `def` table given to `pclasses.api.register_class`, documented above
### pclasses.api.register_class(cname)
- Argument : cname
- Registers a class in the classes' table
- Pretty useless at the moment
- Returns class' id or nil if any error
### pclasses.api.get_class_by_id
- Argument : id
- Return the class' specs (table) corresponding an id or nil when not found
### pclasses.api.get_class_by_name ### pclasses.api.get_class_by_name
- Argument : cname - Argument : cname
@ -64,4 +67,27 @@ Yet another class mod for Minetest.
### pclasses.api.set_player_class ### pclasses.api.set_player_class
- Arguments : pname, cname - Arguments : pname, cname
- Assign a player the cname class - Assign a player the cname class
- Returns true if achieved, false if not
### pclasses.api.util.does_wear_full_armor
- Arguments : pname, material, noshield
- Returns true if player `pname` is wearing the full armor made out of `material`
- `noshield` must be true when the full armor has no shield
### pclasses.api.util.can_have_item
- Arguments : pname, itemname
- Returns true if player `pname` can have items `itemstring` in his main inventory, according to his class
### pclasses.api.reserve_item
- Arguments : cname, itemstring
- Adds an entry in the reserved items' table. Players will need to belong to class `cname` in order to have items `itemstring` in their main inventory
- Note : You can reserve the same item for two classes, any player of either of both can then have the item
### pclasses.api.create_graveyard_inventory
- Argument : player
- Creates a detached inventory dedicated to 'dead' items (confiscated reserved items)
- Used internally, should not be used outside of pclasses
### pclasses.api.vacuum_graveyard
- Argument : player
- Check all of `player`'s graveyard inventory to get them back items they obtained to right to have

View File

@ -6,6 +6,7 @@ pclasses.api.register_class("adventurer", {
switch_params = { switch_params = {
color = { r = 142, g = 64, b = 00}, color = { r = 142, g = 64, b = 00},
tile = "wool_white.png", tile = "wool_white.png",
holo_item = "unified_inventory:bag_large"
}, },
on_assigned = function(pname) on_assigned = function(pname)
minetest.chat_send_player(pname, "You are now an adventurer") minetest.chat_send_player(pname, "You are now an adventurer")

View File

@ -116,27 +116,41 @@ end
-- Determination and reserved items tick -- -- Determination and reserved items tick --
------------------------------------------- -------------------------------------------
local function tick() local function vacuum_inventory(name, inv, invname)
for id, ref in ipairs(minetest.get_connected_players()) do local ref = minetest.get_player_by_name(name)
local name = ref:get_player_name() for i = 1, inv:get_size(invname) do
local inv = minetest.get_inventory({type="player", name = name}) local stack = inv:get_stack(invname, i)
for i = 1, inv:get_size("main") do if pclasses.data.reserved_items[stack:get_name()] then
local stack = inv:get_stack("main", i) if not pclasses.api.util.can_have_item(name, stack:get_name()) then
if pclasses.data.reserved_items[stack:get_name()] then inv:set_stack(invname, i, "")
if not pclasses.api.util.can_have_item(name, stack:get_name()) then local grave_inv = pclasses.api.create_graveyard_inventory(ref)
inv:set_stack("main", i, "") if grave_inv and grave_inv:room_for_item("graveyard", stack) then
local grave_inv = pclasses.api.create_graveyard_inventory(ref) grave_inv:add_item("graveyard", stack)
if grave_inv and grave_inv:room_for_item("graveyard", stack) then inv:add_item("graveyard", stack)
grave_inv:add_item("graveyard", stack) -- ^ Because add_item doesn't trigger on_put, nonsense
inv:add_item("graveyard", stack) else
-- ^ Because add_item doesn't trigger on_put, nonsense minetest.add_item(ref:getpos(), stack)
else
minetest.add_item(ref:getpos(), stack)
end
end end
end end
end end
end end
end
local function tick()
for id, ref in ipairs(minetest.get_connected_players()) do
local name = ref:get_player_name()
local armor_inv = minetest.get_inventory({type = "detached", name = name .. "_armor"})
local inv = ref:get_inventory()
vacuum_inventory(name, inv, "main")
vacuum_inventory(name, inv, "armor")
-- Hack the hack
for i = 1, armor_inv:get_size("armor") do
armor_inv:set_stack("armor", i, inv:get_stack("armor", i))
end
armor:set_player_armor(ref)
armor:update_inventory(ref)
end
minetest.after(2, tick) minetest.after(2, tick)
end end

View File

@ -18,6 +18,7 @@ pclasses.conf.default_class = "adventurer"
pclasses.conf.save_interval = 3 * 60 pclasses.conf.save_interval = 3 * 60
pclasses.conf.datafile = minetest.get_worldpath() .. "/pclasses" pclasses.conf.datafile = minetest.get_worldpath() .. "/pclasses"
pclasses.conf.gravefile = minetest.get_worldpath() .. "/graveyards" pclasses.conf.gravefile = minetest.get_worldpath() .. "/graveyards"
-- Classes -- Classes
pclasses.classes = {} pclasses.classes = {}

View File

@ -5,8 +5,12 @@
-- Inventory for 'dead' items -- Inventory for 'dead' items
pclasses.api.create_graveyard_inventory = function(player) pclasses.api.create_graveyard_inventory = function(player)
local pname = player:get_player_name() local pname = player:get_player_name()
local grave_inv = minetest.get_inventory({type = "detached", name = pname .. "_graveyard"})
if grave_inv then
return grave_inv
end
local player_inv = minetest.get_inventory({type = "player", name = pname}) local player_inv = minetest.get_inventory({type = "player", name = pname})
local grave_inv = minetest.create_detached_inventory(pname .. "_graveyard", { grave_inv = minetest.create_detached_inventory(pname .. "_graveyard", {
on_take = function(inv, listname, index, stack, player) on_take = function(inv, listname, index, stack, player)
player_inv:set_stack(listname, index, nil) player_inv:set_stack(listname, index, nil)
end, end,
@ -64,7 +68,7 @@ function pclasses.api.vacuum_graveyard(player)
if player_inv:room_for_item("main", stack) then if player_inv:room_for_item("main", stack) then
player_inv:add_item("main", stack) player_inv:add_item("main", stack)
else else
minetest.add_item(pos, stack) minetest.add_item(player:getpos(), stack)
end end
end end
end end

View File

@ -61,18 +61,11 @@ minetest.register_entity("pclasses:item", {
end, end,
}) })
local classes_items = {
["hunter"] = "throwing:bow_minotaur_horn_improved",
["warrior"] = "default:dungeon_master_s_blood_sword",
["admin"] = "maptools:pick_admin",
["adventurer"] = "unified_inventory:bag_large",
["wizard"] = "default:book"
}
function pclasses.register_class_switch(cname, params) function pclasses.register_class_switch(cname, params)
local color = params.color or { r = 255, g = 255, b = 255 } 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 txtcolor = string.format("#%02x%02x%02x", color.r, color.g, color.b)
local overlay = "pclasses_class_switch_orb_overlay.png" local overlay = "pclasses_class_switch_orb_overlay.png"
local holo_item = params.holo_item or "default:diamond"
minetest.register_node(":pclasses:class_switch_" .. cname, { minetest.register_node(":pclasses:class_switch_" .. cname, {
description = "Class switch orb (" .. cname .. ")", description = "Class switch orb (" .. cname .. ")",
tiles = {(params.tile or overlay) .. "^[colorize:" .. txtcolor .. ":200"}, tiles = {(params.tile or overlay) .. "^[colorize:" .. txtcolor .. ":200"},
@ -101,7 +94,7 @@ function pclasses.register_class_switch(cname, params)
local obj = minetest.add_entity(pos, "pclasses:item") local obj = minetest.add_entity(pos, "pclasses:item")
if obj then if obj then
obj:get_luaentity():set_item(classes_items[cname]) obj:get_luaentity():set_item(holo_item)
obj:get_luaentity():set_class(cname) obj:get_luaentity():set_class(cname)
end end
pos.y = pos.y - 1 pos.y = pos.y - 1
@ -119,7 +112,7 @@ function pclasses.register_class_switch(cname, params)
local obj = minetest.add_entity(pos, "pclasses:item") local obj = minetest.add_entity(pos, "pclasses:item")
if obj then if obj then
obj:get_luaentity():set_item(classes_items[cname]) obj:get_luaentity():set_item(holo_item)
obj:get_luaentity():set_class(cname) obj:get_luaentity():set_class(cname)
end end
return true return true