mirror of
https://github.com/sys4-fr/server-nalc.git
synced 2024-11-11 12:50:41 +01:00
Added mana and changed position in hotbar
This commit is contained in:
parent
de4a8b2409
commit
1e3cb323c4
120
mods/mana/API.md
Normal file
120
mods/mana/API.md
Normal file
|
@ -0,0 +1,120 @@
|
||||||
|
API documentation for Mana 1.0.1
|
||||||
|
================================
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
The API of the Mana mod allows you to set and receive
|
||||||
|
the current and maxiumum mana reserves of a player,
|
||||||
|
and to subtract and add mana.
|
||||||
|
|
||||||
|
## The basic rules
|
||||||
|
For integrity reasons, this mod will ensure that the following assumptions
|
||||||
|
are true at all times for all players:
|
||||||
|
|
||||||
|
* Current and maximum mana can never be smaller than 0
|
||||||
|
* The current value must not be greater than the maximum value
|
||||||
|
* Only integer numbers are permitted for mana values
|
||||||
|
|
||||||
|
It should be not possible to break these rules using this API alone.
|
||||||
|
If you somehow manage to break one ofthe rules, please report a bug.
|
||||||
|
|
||||||
|
If a real number is used as input for a value, it will be rounded
|
||||||
|
(“round up half” rule).
|
||||||
|
|
||||||
|
## Functions
|
||||||
|
Of not specified otherwise, all functions return `nil`.
|
||||||
|
`playername` always refers to the name of a player, as string.
|
||||||
|
`value` always refers to a number and for most functions it must always be equal to or greater than 0.
|
||||||
|
|
||||||
|
|
||||||
|
### `mana.set(playername, value)`
|
||||||
|
Sets the mana reserve of the specified player to `value`.
|
||||||
|
If `value` is smaller than 0, the mana will be set to 0.
|
||||||
|
If `value` is greater than the maximum, the mana will be set to the maximum.
|
||||||
|
|
||||||
|
|
||||||
|
### `mana.setmax(playername, value)`
|
||||||
|
Sets the maximum of the player to `value`.
|
||||||
|
|
||||||
|
If the new maximum would become smaller than the current value,
|
||||||
|
the current value will automatically be set to
|
||||||
|
the new maximum.
|
||||||
|
|
||||||
|
### `mana.setregen(playername, value)`
|
||||||
|
Sets the mana regeneration per mana tick of the player to `value`.
|
||||||
|
Negative values are not permitted.
|
||||||
|
The length of one “mana tick” is specified as the server-wide setting
|
||||||
|
`mana_default_regen` in seconds.
|
||||||
|
|
||||||
|
|
||||||
|
### `mana.get(playername)`
|
||||||
|
Returns the current mana of the specified player as number.
|
||||||
|
|
||||||
|
|
||||||
|
### `mana.getmax(playername)`
|
||||||
|
Returns the current maximum mana of the specified player as number.
|
||||||
|
|
||||||
|
|
||||||
|
### `mana.getregen(playername)`
|
||||||
|
Returns the current mana regneration per mana tick of the specified
|
||||||
|
player as number.
|
||||||
|
The length of one “mana tick” is specified as the server-wide setting
|
||||||
|
`mana_default_regen` in seconds.
|
||||||
|
|
||||||
|
|
||||||
|
### `mana.add(playername, value)`
|
||||||
|
Adds the specified non-negative amount of mana to the player, but only
|
||||||
|
if the sum would not be greater than the maximum,
|
||||||
|
|
||||||
|
#### Return value
|
||||||
|
* `true` on success, all mana has been added
|
||||||
|
* `false` on failure, no mana has been added
|
||||||
|
|
||||||
|
|
||||||
|
### `mana.subtract(playername, value)`
|
||||||
|
Subtracts the specified non-negative amount of mana from the player,
|
||||||
|
but only if the player has sufficient mana reservers.
|
||||||
|
|
||||||
|
#### Return value
|
||||||
|
* `true` on success, all mana has been subtracted
|
||||||
|
* `false` on failure, no mana has been subtraceed
|
||||||
|
|
||||||
|
|
||||||
|
### `mana.add_up_to(playername, value)`
|
||||||
|
Adds the specified non-negative amount of mana to the player, but it will
|
||||||
|
be capped at the maximum.
|
||||||
|
|
||||||
|
#### Return value
|
||||||
|
* `true, excess` on success, where `excess` is the amount of Mana which could not be added because it would have exceeded the maximum. `excess` equals `0` if all mana has been added
|
||||||
|
* `false` on failure (mana could not be added)
|
||||||
|
|
||||||
|
|
||||||
|
### `mana.subtract_up_to(playername, value)`
|
||||||
|
Subtracts the specified non-negative amount of mana from the player,
|
||||||
|
but if the difference is smaller than 0, the mana will be set to 0.
|
||||||
|
|
||||||
|
#### Return value
|
||||||
|
* `true, missing` on success, where `missing` is the amount of Mana which could not be subtracted because it would have exceeded 0. `missing` equals `0` if all mana has been subtracted
|
||||||
|
* `false` on failure (mana could not be subtracted)
|
||||||
|
|
||||||
|
|
||||||
|
## Appendix
|
||||||
|
### General recommendations
|
||||||
|
If you want your mod to be portable, it is recommended that you balance your mod in such a way that it assumes
|
||||||
|
that every player starts with the following default mana values:
|
||||||
|
|
||||||
|
* Max. mana: 200
|
||||||
|
* Mana regeneration: 1 mana every 0.2 seconds
|
||||||
|
|
||||||
|
Also assume that the max. mana never changes.
|
||||||
|
This should (hopefully) ensure that multiple independent mana-using mods are more or less balanced when using
|
||||||
|
the default settings.
|
||||||
|
|
||||||
|
Also, to make life easier for subgame makers, define custom minetest.conf settings for your mod in order to
|
||||||
|
overwrite the mana costs (and other relevant values) used by your mod. That way, subgame makers only have to edit
|
||||||
|
minetest.conf, and not your mod.
|
||||||
|
|
||||||
|
You do not have to bother about default values if you want to directly integrate your mod in a subgame and do
|
||||||
|
not plan to release the mod independently.
|
||||||
|
|
||||||
|
The best way to reliable balance the mana values used by several mods is to create a standalone subgame. It is
|
||||||
|
highly recommended that you tweak the mana values of the mods to fit the subgame's needs.
|
51
mods/mana/README.txt
Normal file
51
mods/mana/README.txt
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
Mana mod [mana]
|
||||||
|
===============
|
||||||
|
Version: 1.0.1
|
||||||
|
Note: This mod uses semantic versioning, as defined by version 2.0.0 of the SemVer standard.
|
||||||
|
See: <http://semver.org/>
|
||||||
|
|
||||||
|
Description
|
||||||
|
===========
|
||||||
|
This mod adds basic support for mana to Minetest.
|
||||||
|
|
||||||
|
Each player will have an additional attribute: Mana. To be precise:
|
||||||
|
|
||||||
|
- Current mana reserves: How much mana the player currently has
|
||||||
|
- Maximum possible mana: How much mana the player can have at maximum
|
||||||
|
- Mana regeneration amont: How much mana will be generated each “mana tick” (default 0.2 seconds)
|
||||||
|
|
||||||
|
By default, each player spawns with 0/200 mana, and regenerates 1 mana per fifth of a second. All
|
||||||
|
these values can be configured with the server settings (`minetest.conf`) and it is highly advised to do
|
||||||
|
so if you plan to integrate this mod into a subgame.
|
||||||
|
|
||||||
|
The mana regeneration rate (the “mana tick”) is a global setting and is *not* configured on a
|
||||||
|
per-player basis.
|
||||||
|
|
||||||
|
The mod provides a simple API to set, get, add and subtract the mana (and maximum) mana of any player, and
|
||||||
|
for setting the regeneration amount. Note that this mod itself does *not* change the gameplay in a meaningful
|
||||||
|
way. You should install other mods which use the Mana mod as a dependency.
|
||||||
|
|
||||||
|
The API documentation is in the file API.md.
|
||||||
|
|
||||||
|
If the mod “HUD bars” [hudbars] is installed, a blue bar will be added to the HUD showing the player's mana reserves.
|
||||||
|
It currently only works with version 0.3.0 of this mod.
|
||||||
|
|
||||||
|
Otherwise, the mana is just shown as text.
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
=============
|
||||||
|
|
||||||
|
This mod can be configured with minetest.conf! The following settings are accepted:
|
||||||
|
|
||||||
|
* `mana_default_max`: Initial max. mana given to new players. Default: `200`. This value must be non-negative.
|
||||||
|
* `mana_default_regen`: Initial regenerated mana per “mana tick”. Default: `1`. This value must be non-negative.
|
||||||
|
* `mana_regen_timer`: The length of a “mana tick” in seconds. Each player will get his/her mana increased by the current
|
||||||
|
regen value per mana tick. Default: `0.2`. This value must be positive, also try to avoid very small values
|
||||||
|
as those could probably stress your machine a lot.
|
||||||
|
|
||||||
|
|
||||||
|
License information
|
||||||
|
===================
|
||||||
|
* textures/mana_icon.png: CC-BY by Buch <http://opengameart.org/users/Buch>.
|
||||||
|
* textures/mana_bar.png: WTFPL by Wuzzy.
|
||||||
|
* Everything else: WTFPL.
|
1
mods/mana/depends.txt
Normal file
1
mods/mana/depends.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
hudbars?
|
1
mods/mana/description.txt
Normal file
1
mods/mana/description.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Adds a mana attribute to players, can be used as energy source for magical items, etc.
|
308
mods/mana/init.lua
Normal file
308
mods/mana/init.lua
Normal file
|
@ -0,0 +1,308 @@
|
||||||
|
--[[
|
||||||
|
Mana 1.0.1
|
||||||
|
This mod adds mana to players, a special attribute
|
||||||
|
|
||||||
|
License: WTFPL
|
||||||
|
]]
|
||||||
|
|
||||||
|
--[===[
|
||||||
|
Initialization
|
||||||
|
]===]
|
||||||
|
|
||||||
|
mana = {}
|
||||||
|
mana.playerlist = {}
|
||||||
|
|
||||||
|
mana.settings = {}
|
||||||
|
mana.settings.default_max = 200
|
||||||
|
mana.settings.default_regen = 1
|
||||||
|
mana.settings.regen_timer = 0.2
|
||||||
|
|
||||||
|
do
|
||||||
|
local default_max = tonumber(minetest.setting_get("mana_default_max"))
|
||||||
|
if default_max ~= nil then
|
||||||
|
mana.settings.default_max = default_max
|
||||||
|
end
|
||||||
|
|
||||||
|
local default_regen = tonumber(minetest.setting_get("mana_default_regen"))
|
||||||
|
if default_regen ~= nil then
|
||||||
|
mana.settings.default_regen = default_regen
|
||||||
|
end
|
||||||
|
|
||||||
|
local regen_timer = tonumber(minetest.setting_get("mana_regen_timer"))
|
||||||
|
if regen_timer ~= nil then
|
||||||
|
mana.settings.regen_timer = regen_timer
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
--[===[
|
||||||
|
API functions
|
||||||
|
]===]
|
||||||
|
|
||||||
|
function mana.set(playername, value)
|
||||||
|
if value < 0 then
|
||||||
|
minetest.log("info", "[mana] Warning: mana.set was called with negative value!")
|
||||||
|
value = 0
|
||||||
|
end
|
||||||
|
value = mana.round(value)
|
||||||
|
if value > mana.playerlist[playername].maxmana then
|
||||||
|
value = mana.playerlist[playername].maxmana
|
||||||
|
end
|
||||||
|
if mana.playerlist[playername].mana ~= value then
|
||||||
|
mana.playerlist[playername].mana = value
|
||||||
|
mana.hud_update(playername)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function mana.setmax(playername, value)
|
||||||
|
if value < 0 then
|
||||||
|
value = 0
|
||||||
|
minetest.log("info", "[mana] Warning: mana.setmax was called with negative value!")
|
||||||
|
end
|
||||||
|
value = mana.round(value)
|
||||||
|
if mana.playerlist[playername].maxmana ~= value then
|
||||||
|
mana.playerlist[playername].maxmana = value
|
||||||
|
if(mana.playerlist[playername].mana > value) then
|
||||||
|
mana.playerlist[playername].mana = value
|
||||||
|
end
|
||||||
|
mana.hud_update(playername)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function mana.setregen(playername, value)
|
||||||
|
if value < 0 then
|
||||||
|
value = 0
|
||||||
|
minetest.log("info", "[mana] Warning: mana.setregen was called with negative value!")
|
||||||
|
end
|
||||||
|
value = mana.round(value)
|
||||||
|
mana.playerlist[playername].regen = value
|
||||||
|
end
|
||||||
|
|
||||||
|
function mana.get(playername)
|
||||||
|
return mana.playerlist[playername].mana
|
||||||
|
end
|
||||||
|
|
||||||
|
function mana.getmax(playername)
|
||||||
|
return mana.playerlist[playername].maxmana
|
||||||
|
end
|
||||||
|
|
||||||
|
function mana.getregen(playername)
|
||||||
|
return mana.playerlist[playername].regen
|
||||||
|
end
|
||||||
|
|
||||||
|
function mana.add_up_to(playername, value)
|
||||||
|
local t = mana.playerlist[playername]
|
||||||
|
value = mana.round(value)
|
||||||
|
if(t ~= nil and value >= 0) then
|
||||||
|
local excess
|
||||||
|
if((t.mana + value) > t.maxmana) then
|
||||||
|
excess = (t.mana + value) - t.maxmana
|
||||||
|
t.mana = t.maxmana
|
||||||
|
else
|
||||||
|
excess = 0
|
||||||
|
t.mana = t.mana + value
|
||||||
|
end
|
||||||
|
mana.hud_update(playername)
|
||||||
|
return true, excess
|
||||||
|
else
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function mana.add(playername, value)
|
||||||
|
local t = mana.playerlist[playername]
|
||||||
|
value = mana.round(value)
|
||||||
|
if(t ~= nil and ((t.mana + value) <= t.maxmana) and value >= 0) then
|
||||||
|
t.mana = t.mana + value
|
||||||
|
mana.hud_update(playername)
|
||||||
|
return true
|
||||||
|
else
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function mana.subtract(playername, value)
|
||||||
|
local t = mana.playerlist[playername]
|
||||||
|
value = mana.round(value)
|
||||||
|
if(t ~= nil and t.mana >= value and value >= 0) then
|
||||||
|
t.mana = t.mana -value
|
||||||
|
mana.hud_update(playername)
|
||||||
|
return true
|
||||||
|
else
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function mana.subtract_up_to(playername, value)
|
||||||
|
local t = mana.playerlist[playername]
|
||||||
|
value = mana.round(value)
|
||||||
|
if(t ~= nil and value >= 0) then
|
||||||
|
local missing
|
||||||
|
if((t.mana - value) < 0) then
|
||||||
|
missing = math.abs(t.mana - value)
|
||||||
|
t.mana = 0
|
||||||
|
else
|
||||||
|
missing = 0
|
||||||
|
t.mana = t.mana - value
|
||||||
|
end
|
||||||
|
mana.hud_update(playername)
|
||||||
|
return true, missing
|
||||||
|
else
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--[===[
|
||||||
|
File handling, loading data, saving data, setting up stuff for players.
|
||||||
|
]===]
|
||||||
|
|
||||||
|
|
||||||
|
-- Load the playerlist from a previous session, if available.
|
||||||
|
do
|
||||||
|
local filepath = minetest.get_worldpath().."/mana.mt"
|
||||||
|
local file = io.open(filepath, "r")
|
||||||
|
if file then
|
||||||
|
minetest.log("action", "[mana] mana.mt opened.")
|
||||||
|
local string = file:read()
|
||||||
|
io.close(file)
|
||||||
|
if(string ~= nil) then
|
||||||
|
local savetable = minetest.deserialize(string)
|
||||||
|
mana.playerlist = savetable.playerlist
|
||||||
|
minetest.debug("[mana] mana.mt successfully read.")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function mana.save_to_file()
|
||||||
|
local savetable = {}
|
||||||
|
savetable.playerlist = mana.playerlist
|
||||||
|
|
||||||
|
local savestring = minetest.serialize(savetable)
|
||||||
|
|
||||||
|
local filepath = minetest.get_worldpath().."/mana.mt"
|
||||||
|
local file = io.open(filepath, "w")
|
||||||
|
if file then
|
||||||
|
file:write(savestring)
|
||||||
|
io.close(file)
|
||||||
|
minetest.log("action", "[mana] Wrote mana data into "..filepath..".")
|
||||||
|
else
|
||||||
|
minetest.log("error", "[mana] Failed to write mana data into "..filepath..".")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
minetest.register_on_respawnplayer(function(player)
|
||||||
|
local playername = player:get_player_name()
|
||||||
|
mana.set(playername, 0)
|
||||||
|
mana.hud_update(playername)
|
||||||
|
end)
|
||||||
|
|
||||||
|
|
||||||
|
minetest.register_on_leaveplayer(function(player)
|
||||||
|
local playername = player:get_player_name()
|
||||||
|
mana.hud_remove(playername)
|
||||||
|
mana.playerlist[playername] = nil
|
||||||
|
end)
|
||||||
|
|
||||||
|
minetest.register_on_shutdown(function()
|
||||||
|
minetest.log("action", "[mana] Server shuts down. Rescuing data into mana.mt")
|
||||||
|
mana.save_to_file()
|
||||||
|
end)
|
||||||
|
|
||||||
|
minetest.register_on_joinplayer(function(player)
|
||||||
|
local playername = player:get_player_name()
|
||||||
|
|
||||||
|
if mana.playerlist[playername] == nil then
|
||||||
|
mana.playerlist[playername] = {}
|
||||||
|
mana.playerlist[playername].mana = 0
|
||||||
|
mana.playerlist[playername].maxmana = mana.settings.default_max
|
||||||
|
mana.playerlist[playername].regen = mana.settings.default_regen
|
||||||
|
end
|
||||||
|
|
||||||
|
if minetest.get_modpath("hudbars") ~= nil then
|
||||||
|
hb.init_hudbar(player, "mana", mana.get(playername), mana.getmax(playername))
|
||||||
|
else
|
||||||
|
mana.hud_add(playername)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
|
||||||
|
--[===[
|
||||||
|
Mana regeneration
|
||||||
|
]===]
|
||||||
|
|
||||||
|
mana.regen_timer = 0
|
||||||
|
|
||||||
|
minetest.register_globalstep(function(dtime)
|
||||||
|
mana.regen_timer = mana.regen_timer + dtime
|
||||||
|
if mana.regen_timer >= mana.settings.regen_timer then
|
||||||
|
local factor = math.floor(mana.regen_timer / mana.settings.regen_timer)
|
||||||
|
local players = minetest.get_connected_players()
|
||||||
|
for i=1, #players do
|
||||||
|
local name = players[i]:get_player_name()
|
||||||
|
if mana.playerlist[name] ~= nil then
|
||||||
|
if players[i]:get_hp() > 0 then
|
||||||
|
mana.add_up_to(name, mana.playerlist[name].regen * factor)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
mana.regen_timer = mana.regen_timer % mana.settings.regen_timer
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
--[===[
|
||||||
|
HUD functions
|
||||||
|
]===]
|
||||||
|
|
||||||
|
if minetest.get_modpath("hudbars") ~= nil then
|
||||||
|
hb.register_hudbar("mana", 0xFFFFFF, "Mana", { bar = "mana_bar.png", icon = "mana_icon.png" }, 0, mana.settings.default_max, false)
|
||||||
|
|
||||||
|
function mana.hud_update(playername)
|
||||||
|
local player = minetest.get_player_by_name(playername)
|
||||||
|
if player ~= nil then
|
||||||
|
hb.change_hudbar(player, "mana", mana.get(playername), mana.getmax(playername))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
function mana.manastring(playername)
|
||||||
|
return string.format("Mana: %d/%d", mana.get(playername), mana.getmax(playername))
|
||||||
|
end
|
||||||
|
|
||||||
|
function mana.hud_add(playername)
|
||||||
|
local player = minetest.get_player_by_name(playername)
|
||||||
|
local id = player:hud_add({
|
||||||
|
hud_elem_type = "text",
|
||||||
|
position = { x = 0.5, y=0.9 },
|
||||||
|
text = mana.manastring(playername),
|
||||||
|
scale = { x = 0, y = 0 },
|
||||||
|
alignment = { x = 6.96, y = -14},
|
||||||
|
direction = 1,
|
||||||
|
number = 0xFFFFFF,
|
||||||
|
offset = { x = -200, y = 15}
|
||||||
|
})
|
||||||
|
mana.playerlist[playername].hudid = id
|
||||||
|
return id
|
||||||
|
end
|
||||||
|
|
||||||
|
function mana.hud_update(playername)
|
||||||
|
local player = minetest.get_player_by_name(playername)
|
||||||
|
player:hud_change(mana.playerlist[playername].hudid, "number", mana.get(playername))
|
||||||
|
end
|
||||||
|
|
||||||
|
function mana.hud_remove(playername)
|
||||||
|
local player = minetest.get_player_by_name(playername)
|
||||||
|
player:hud_remove(mana.playerlist[playername].hudid)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--[===[
|
||||||
|
Helper functions
|
||||||
|
]===]
|
||||||
|
mana.round = function(x)
|
||||||
|
return math.ceil(math.floor(x+0.5))
|
||||||
|
end
|
BIN
mods/mana/textures/mana_bar.png
Normal file
BIN
mods/mana/textures/mana_bar.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 80 B |
BIN
mods/mana/textures/mana_icon.png
Normal file
BIN
mods/mana/textures/mana_icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.9 KiB |
|
@ -57,7 +57,6 @@ load_mod_mesecons = true
|
||||||
load_mod_mesecons_alias = true
|
load_mod_mesecons_alias = true
|
||||||
load_mod_mesecons_button = true
|
load_mod_mesecons_button = true
|
||||||
load_mod_mesecons_commandblock = true
|
load_mod_mesecons_commandblock = true
|
||||||
load_mod_mesecons_compatibility = true
|
|
||||||
load_mod_mesecons_delayer = true
|
load_mod_mesecons_delayer = true
|
||||||
load_mod_mesecons_extrawires = true
|
load_mod_mesecons_extrawires = true
|
||||||
load_mod_mesecons_hydroturbine = true
|
load_mod_mesecons_hydroturbine = true
|
||||||
|
|
Loading…
Reference in New Issue
Block a user