^ Adds items to the list of items to be given
+Players API
+-----------
+
+The player API can register player models and update the player's appearence
+
+* `player_api.register_model(name, def)`
+ * Register a new model to be used by players
+ * name: model filename such as "character.x", "foo.b3d", etc.
+ * def: See [#Model definition]
+ * saved to player_api.registered_models
+
+* `player_api.registered_player_models[name]`
+ * Get a model's definition
+ * see [#Model definition]
+
+* `player_api.set_model(player, model_name)`
+ * Change a player's model
+ * `player`: PlayerRef
+ * `model_name`: model registered with player_api.register_model()
+
+* `player_api.set_animation(player, anim_name [, speed])`
+ * Applies an animation to a player
+ * anim_name: name of the animation.
+ * speed: frames per second. If nil, default from the model is used
+
+* `player_api.set_textures(player, textures)`
+ * Sets player textures
+ * `player`: PlayerRef
+ * `textures`: array of textures, If `textures` is nil, the default textures from the model def are used
+
+* `player_api.get_animation(player)`
+ * Returns a table containing fields `model`, `textures` and `animation`.
+ * Any of the fields of the returned table may be nil.
+ * player: PlayerRef
+
+### Model Definition
+
+ {
+ animation_speed = 30, -- Default animation speed, in FPS.
+ textures = {"character.png", }, -- Default array of textures.
+ visual_size = {x = 1, y = 1}, -- Used to scale the model.
+ animations = {
+ -- <anim_name> = {x = <start_frame>, y = <end_frame>},
+ foo = {x = 0, y = 19},
+ bar = {x = 20, y = 39},
+ -- ...
+ },
+ }
+
+
TNT API
-----------
+-------
`tnt.register_tnt(definition)`
* Get the inactive furnace formspec using the defined GUI elements
-Player API
-----------
-
-The player API can register player models and update the player's appearence
-
-`default.player_register_model(name, def)`
-
- * Register a new model to be used by players.
- * name: model filename such as "character.x", "foo.b3d", etc.
- * def: See [#Model definition]
-
-`default.registered_player_models[name]`
-
- * Get a model's definition
- * see [#Model definition]
-
-`default.player_set_model(player, model_name)`
-
- * Change a player's model
- * `player`: PlayerRef
- * `model_name`: model registered with player_register_model()
-
-`default.player_set_animation(player, anim_name [, speed])`
-
- * Applies an animation to a player
- * anim_name: name of the animation.
- * speed: frames per second. If nil, default from the model is used
-
-`default.player_set_textures(player, textures)`
-
- * Sets player textures
- * `player`: PlayerRef
- * `textures`: array of textures, If `textures` is nil, the default textures from the model def are used
-
-default.player_get_animation(player)
-
- * Returns a table containing fields `model`, `textures` and `animation`.
- * Any of the fields of the returned table may be nil.
- * player: PlayerRef
-
-### Model Definition
-
- {
- animation_speed = 30, -- Default animation speed, in FPS.
- textures = {"character.png", }, -- Default array of textures.
- visual_size = {x = 1, y = 1}, -- Used to scale the model.
- animations = {
- -- <anim_name> = {x = <start_frame>, y = <end_frame>},
- foo = {x = 0, y = 19},
- bar = {x = 20, y = 39},
- -- ...
- },
- }
-
Leafdecay
---------
default_mineral_copper.png
default_glass_detail.png
-MirceaKitsune (CC BY-SA 3.0):
- character.x
-
-Jordach (CC BY-SA 3.0):
- character.png
-
PilzAdam (CC BY-SA 3.0):
default_jungleleaves.png
default_junglesapling.png
- http://www.freesound.org/people/kingsamas/sounds/135576/ CC-BY-3.0
- http://www.freesound.org/people/bulbastre/sounds/126887/ CC-BY-3.0
- http://www.freesound.org/people/Yoyodaman234/sounds/183541/ CC0
-
--- /dev/null
+player_api?
dofile(default_path.."/craftitems.lua")
dofile(default_path.."/crafting.lua")
dofile(default_path.."/mapgen.lua")
-dofile(default_path.."/player.lua")
dofile(default_path.."/aliases.lua")
dofile(default_path.."/legacy.lua")
-- Formspecs
default.gui_suvival_form = default.gui_survival_form
+
+-- Players
+if minetest.get_modpath("player_api") then
+ default.registered_player_models = player_api.registered_models
+ default.player_register_model = player_api.register_model
+ default.player_attached = player_api.player_attached
+ default.player_get_animation = player_api.get_animation
+ default.player_set_model = player_api.set_model
+ default.player_set_textures = player_api.set_textures
+ default.player_set_animation = player_api.set_animation
+end
+++ /dev/null
--- Minetest 0.4 mod: player
--- See README.txt for licensing and other information.
-
--- Player animation blending
--- Note: This is currently broken due to a bug in Irrlicht, leave at 0
-local animation_blend = 0
-
-default.registered_player_models = { }
-
--- Local for speed.
-local models = default.registered_player_models
-
-function default.player_register_model(name, def)
- models[name] = def
-end
-
--- Default player appearance
-default.player_register_model("character.b3d", {
- animation_speed = 30,
- textures = {"character.png", },
- animations = {
- -- Standard animations.
- stand = { x= 0, y= 79, },
- lay = { x=162, y=166, },
- walk = { x=168, y=187, },
- mine = { x=189, y=198, },
- walk_mine = { x=200, y=219, },
- sit = { x= 81, y=160, },
- },
-})
-
--- Player stats and animations
-local player_model = {}
-local player_textures = {}
-local player_anim = {}
-local player_sneak = {}
-default.player_attached = {}
-
-function default.player_get_animation(player)
- local name = player:get_player_name()
- return {
- model = player_model[name],
- textures = player_textures[name],
- animation = player_anim[name],
- }
-end
-
--- Called when a player's appearance needs to be updated
-function default.player_set_model(player, model_name)
- local name = player:get_player_name()
- local model = models[model_name]
- if model then
- if player_model[name] == model_name then
- return
- end
- player:set_properties({
- mesh = model_name,
- textures = player_textures[name] or model.textures,
- visual = "mesh",
- visual_size = model.visual_size or {x=1, y=1},
- })
- default.player_set_animation(player, "stand")
- else
- player:set_properties({
- textures = { "player.png", "player_back.png", },
- visual = "upright_sprite",
- })
- end
- player_model[name] = model_name
-end
-
-function default.player_set_textures(player, textures)
- local name = player:get_player_name()
- player_textures[name] = textures
- player:set_properties({textures = textures,})
-end
-
-function default.player_set_animation(player, anim_name, speed)
- local name = player:get_player_name()
- if player_anim[name] == anim_name then
- return
- end
- local model = player_model[name] and models[player_model[name]]
- if not (model and model.animations[anim_name]) then
- return
- end
- local anim = model.animations[anim_name]
- player_anim[name] = anim_name
- player:set_animation(anim, speed or model.animation_speed, animation_blend)
-end
-
--- Update appearance when the player joins
-minetest.register_on_joinplayer(function(player)
- default.player_attached[player:get_player_name()] = false
- default.player_set_model(player, "character.b3d")
- player:set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, 30)
-
- player:hud_set_hotbar_image("gui_hotbar.png")
- player:hud_set_hotbar_selected_image("gui_hotbar_selected.png")
-end)
-
-minetest.register_on_leaveplayer(function(player)
- local name = player:get_player_name()
- player_model[name] = nil
- player_anim[name] = nil
- player_textures[name] = nil
-end)
-
--- Localize for better performance.
-local player_set_animation = default.player_set_animation
-local player_attached = default.player_attached
-
--- Check each player and apply animations
-minetest.register_globalstep(function(dtime)
- for _, player in pairs(minetest.get_connected_players()) do
- local name = player:get_player_name()
- local model_name = player_model[name]
- local model = model_name and models[model_name]
- if model and not player_attached[name] then
- local controls = player:get_player_control()
- local walking = false
- local animation_speed_mod = model.animation_speed or 30
-
- -- Determine if the player is walking
- if controls.up or controls.down or controls.left or controls.right then
- walking = true
- end
-
- -- Determine if the player is sneaking, and reduce animation speed if so
- if controls.sneak then
- animation_speed_mod = animation_speed_mod / 2
- end
-
- -- Apply animations based on what the player is doing
- if player:get_hp() == 0 then
- player_set_animation(player, "lay")
- elseif walking then
- if player_sneak[name] ~= controls.sneak then
- player_anim[name] = nil
- player_sneak[name] = controls.sneak
- end
- if controls.LMB then
- player_set_animation(player, "walk_mine", animation_speed_mod)
- else
- player_set_animation(player, "walk", animation_speed_mod)
- end
- elseif controls.LMB then
- player_set_animation(player, "mine")
- else
- player_set_animation(player, "stand", animation_speed_mod)
- end
- end
- end
-end)
--- /dev/null
+Minetest Game mod: player_api
+============================
+See license.txt for license information.
+
+Provides an API to allow multiple mods to set player models and textures.
+Also sets the default model, texture, and player flags.
+
+Authors of source code
+----------------------
+Originally by celeron55, Perttu Ahola <celeron55@gmail.com> (LGPL 2.1)
+Various Minetest developers and contributors (LGPL 2.1)
+
+Authors of media (textures, models and sounds)
+----------------------------------------------
+
+MirceaKitsune (CC BY-SA 3.0):
+ character.x
+
+Jordach (CC BY-SA 3.0):
+ character.png
--- /dev/null
+-- Minetest 0.4 mod: player
+-- See README.txt for licensing and other information.
+
+player_api = {}
+
+-- Player animation blending
+-- Note: This is currently broken due to a bug in Irrlicht, leave at 0
+local animation_blend = 0
+
+player_api.registered_models = { }
+
+-- Local for speed.
+local models = player_api.registered_models
+
+function player_api.register_model(name, def)
+ models[name] = def
+end
+
+-- Player stats and animations
+local player_model = {}
+local player_textures = {}
+local player_anim = {}
+local player_sneak = {}
+player_api.player_attached = {}
+
+function player_api.get_animation(player)
+ local name = player:get_player_name()
+ return {
+ model = player_model[name],
+ textures = player_textures[name],
+ animation = player_anim[name],
+ }
+end
+
+-- Called when a player's appearance needs to be updated
+function player_api.set_model(player, model_name)
+ local name = player:get_player_name()
+ local model = models[model_name]
+ if model then
+ if player_model[name] == model_name then
+ return
+ end
+ player:set_properties({
+ mesh = model_name,
+ textures = player_textures[name] or model.textures,
+ visual = "mesh",
+ visual_size = model.visual_size or {x=1, y=1},
+ })
+ player_api.set_animation(player, "stand")
+ else
+ player:set_properties({
+ textures = { "player.png", "player_back.png", },
+ visual = "upright_sprite",
+ })
+ end
+ player_model[name] = model_name
+end
+
+function player_api.set_textures(player, textures)
+ local name = player:get_player_name()
+ player_textures[name] = textures
+ player:set_properties({textures = textures,})
+end
+
+function player_api.set_animation(player, anim_name, speed)
+ local name = player:get_player_name()
+ if player_anim[name] == anim_name then
+ return
+ end
+ local model = player_model[name] and models[player_model[name]]
+ if not (model and model.animations[anim_name]) then
+ return
+ end
+ local anim = model.animations[anim_name]
+ player_anim[name] = anim_name
+ player:set_animation(anim, speed or model.animation_speed, animation_blend)
+end
+
+minetest.register_on_leaveplayer(function(player)
+ local name = player:get_player_name()
+ player_model[name] = nil
+ player_anim[name] = nil
+ player_textures[name] = nil
+end)
+
+-- Localize for better performance.
+local player_set_animation = player_api.set_animation
+local player_attached = player_api.player_attached
+
+-- Check each player and apply animations
+minetest.register_globalstep(function(dtime)
+ for _, player in pairs(minetest.get_connected_players()) do
+ local name = player:get_player_name()
+ local model_name = player_model[name]
+ local model = model_name and models[model_name]
+ if model and not player_attached[name] then
+ local controls = player:get_player_control()
+ local walking = false
+ local animation_speed_mod = model.animation_speed or 30
+
+ -- Determine if the player is walking
+ if controls.up or controls.down or controls.left or controls.right then
+ walking = true
+ end
+
+ -- Determine if the player is sneaking, and reduce animation speed if so
+ if controls.sneak then
+ animation_speed_mod = animation_speed_mod / 2
+ end
+
+ -- Apply animations based on what the player is doing
+ if player:get_hp() == 0 then
+ player_set_animation(player, "lay")
+ elseif walking then
+ if player_sneak[name] ~= controls.sneak then
+ player_anim[name] = nil
+ player_sneak[name] = controls.sneak
+ end
+ if controls.LMB then
+ player_set_animation(player, "walk_mine", animation_speed_mod)
+ else
+ player_set_animation(player, "walk", animation_speed_mod)
+ end
+ elseif controls.LMB then
+ player_set_animation(player, "mine")
+ else
+ player_set_animation(player, "stand", animation_speed_mod)
+ end
+ end
+ end
+end)
--- /dev/null
+dofile(minetest.get_modpath("player_api") .. "/api.lua")
+
+-- Default player appearance
+player_api.register_model("character.b3d", {
+ animation_speed = 30,
+ textures = {"character.png", },
+ animations = {
+ -- Standard animations.
+ stand = { x= 0, y= 79, },
+ lay = { x=162, y=166, },
+ walk = { x=168, y=187, },
+ mine = { x=189, y=198, },
+ walk_mine = { x=200, y=219, },
+ sit = { x= 81, y=160, },
+ },
+})
+
+-- Update appearance when the player joins
+minetest.register_on_joinplayer(function(player)
+ player_api.player_attached[player:get_player_name()] = false
+ player_api.set_model(player, "character.b3d")
+ player:set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, 30)
+
+ player:hud_set_hotbar_image("gui_hotbar.png")
+ player:hud_set_hotbar_selected_image("gui_hotbar_selected.png")
+end)