Separate player code into new mod
authorrubenwardy <rubenwardy@gmail.com>
Wed, 26 Jul 2017 18:38:11 +0000 (19:38 +0100)
committerparamat <mat.gregory@virginmedia.com>
Tue, 1 Aug 2017 02:57:29 +0000 (03:57 +0100)
25 files changed:
game_api.txt
mods/default/README.txt
mods/default/depends.txt [new file with mode: 0644]
mods/default/init.lua
mods/default/legacy.lua
mods/default/models/character.b3d [deleted file]
mods/default/models/character.blend [deleted file]
mods/default/models/character.png [deleted file]
mods/default/player.lua [deleted file]
mods/default/sounds/player_damage.ogg [deleted file]
mods/default/textures/gui_hotbar.png [deleted file]
mods/default/textures/gui_hotbar_selected.png [deleted file]
mods/default/textures/player.png [deleted file]
mods/default/textures/player_back.png [deleted file]
mods/player_api/README.txt [new file with mode: 0644]
mods/player_api/api.lua [new file with mode: 0644]
mods/player_api/init.lua [new file with mode: 0644]
mods/player_api/models/character.b3d [new file with mode: 0644]
mods/player_api/models/character.blend [new file with mode: 0644]
mods/player_api/models/character.png [new file with mode: 0644]
mods/player_api/sounds/player_damage.ogg [new file with mode: 0644]
mods/player_api/textures/gui_hotbar.png [new file with mode: 0644]
mods/player_api/textures/gui_hotbar_selected.png [new file with mode: 0644]
mods/player_api/textures/player.png [new file with mode: 0644]
mods/player_api/textures/player_back.png [new file with mode: 0644]

index d5d09e92d6af8b1cc4258dca1046ddc7e52ef833..4e200fbcef7e50c69630c41aef3ffbcbd42e92ed 100644 (file)
@@ -284,8 +284,58 @@ Give Initial Stuff API
 ^ 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)`
 
@@ -634,60 +684,6 @@ GUI and formspecs
  * 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
 ---------
 
index 8af65a9c5b8c9e9aa8bfa24df08ac1f3461643bc..1a3446a68533f00f4fe17e6361cd343bbf72e961 100644 (file)
@@ -54,12 +54,6 @@ Calinou (CC BY-SA 3.0):
   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
@@ -297,4 +291,3 @@ Chests sounds added by sofar, derived of several files mixed together:
     - 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
-
diff --git a/mods/default/depends.txt b/mods/default/depends.txt
new file mode 100644 (file)
index 0000000..e1c3818
--- /dev/null
@@ -0,0 +1 @@
+player_api?
index 7b5f62f39c4c8e2c9c6853165615687aaf7707fc..2d5a9bd2e5b341756afc77ddef250c76048e006c 100644 (file)
@@ -47,6 +47,5 @@ dofile(default_path.."/item_entity.lua")
 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")
index a8c8ad56d0b2c4e145c46a4e557ce7f16f5e34c0..37f03212dd6f894587f26679fa50603c2dd5136b 100644 (file)
@@ -23,3 +23,14 @@ LIGHT_MAX = default.LIGHT_MAX
 
 -- 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
diff --git a/mods/default/models/character.b3d b/mods/default/models/character.b3d
deleted file mode 100644 (file)
index fb693bc..0000000
Binary files a/mods/default/models/character.b3d and /dev/null differ
diff --git a/mods/default/models/character.blend b/mods/default/models/character.blend
deleted file mode 100644 (file)
index be40608..0000000
Binary files a/mods/default/models/character.blend and /dev/null differ
diff --git a/mods/default/models/character.png b/mods/default/models/character.png
deleted file mode 100644 (file)
index 0502178..0000000
Binary files a/mods/default/models/character.png and /dev/null differ
diff --git a/mods/default/player.lua b/mods/default/player.lua
deleted file mode 100644 (file)
index 0a2078d..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
--- 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)
diff --git a/mods/default/sounds/player_damage.ogg b/mods/default/sounds/player_damage.ogg
deleted file mode 100644 (file)
index 7888087..0000000
Binary files a/mods/default/sounds/player_damage.ogg and /dev/null differ
diff --git a/mods/default/textures/gui_hotbar.png b/mods/default/textures/gui_hotbar.png
deleted file mode 100644 (file)
index 73fb3ca..0000000
Binary files a/mods/default/textures/gui_hotbar.png and /dev/null differ
diff --git a/mods/default/textures/gui_hotbar_selected.png b/mods/default/textures/gui_hotbar_selected.png
deleted file mode 100644 (file)
index 40bafe6..0000000
Binary files a/mods/default/textures/gui_hotbar_selected.png and /dev/null differ
diff --git a/mods/default/textures/player.png b/mods/default/textures/player.png
deleted file mode 100644 (file)
index 6d61c43..0000000
Binary files a/mods/default/textures/player.png and /dev/null differ
diff --git a/mods/default/textures/player_back.png b/mods/default/textures/player_back.png
deleted file mode 100644 (file)
index 5e9ef05..0000000
Binary files a/mods/default/textures/player_back.png and /dev/null differ
diff --git a/mods/player_api/README.txt b/mods/player_api/README.txt
new file mode 100644 (file)
index 0000000..1f28ad9
--- /dev/null
@@ -0,0 +1,20 @@
+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
diff --git a/mods/player_api/api.lua b/mods/player_api/api.lua
new file mode 100644 (file)
index 0000000..9dd33ee
--- /dev/null
@@ -0,0 +1,131 @@
+-- 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)
diff --git a/mods/player_api/init.lua b/mods/player_api/init.lua
new file mode 100644 (file)
index 0000000..9484647
--- /dev/null
@@ -0,0 +1,26 @@
+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)
diff --git a/mods/player_api/models/character.b3d b/mods/player_api/models/character.b3d
new file mode 100644 (file)
index 0000000..fb693bc
Binary files /dev/null and b/mods/player_api/models/character.b3d differ
diff --git a/mods/player_api/models/character.blend b/mods/player_api/models/character.blend
new file mode 100644 (file)
index 0000000..be40608
Binary files /dev/null and b/mods/player_api/models/character.blend differ
diff --git a/mods/player_api/models/character.png b/mods/player_api/models/character.png
new file mode 100644 (file)
index 0000000..0502178
Binary files /dev/null and b/mods/player_api/models/character.png differ
diff --git a/mods/player_api/sounds/player_damage.ogg b/mods/player_api/sounds/player_damage.ogg
new file mode 100644 (file)
index 0000000..7888087
Binary files /dev/null and b/mods/player_api/sounds/player_damage.ogg differ
diff --git a/mods/player_api/textures/gui_hotbar.png b/mods/player_api/textures/gui_hotbar.png
new file mode 100644 (file)
index 0000000..73fb3ca
Binary files /dev/null and b/mods/player_api/textures/gui_hotbar.png differ
diff --git a/mods/player_api/textures/gui_hotbar_selected.png b/mods/player_api/textures/gui_hotbar_selected.png
new file mode 100644 (file)
index 0000000..40bafe6
Binary files /dev/null and b/mods/player_api/textures/gui_hotbar_selected.png differ
diff --git a/mods/player_api/textures/player.png b/mods/player_api/textures/player.png
new file mode 100644 (file)
index 0000000..6d61c43
Binary files /dev/null and b/mods/player_api/textures/player.png differ
diff --git a/mods/player_api/textures/player_back.png b/mods/player_api/textures/player_back.png
new file mode 100644 (file)
index 0000000..5e9ef05
Binary files /dev/null and b/mods/player_api/textures/player_back.png differ