diff --git a/depends.txt b/depends.txt index e0041ce..4ad96d5 100644 --- a/depends.txt +++ b/depends.txt @@ -1,2 +1 @@ default -3d_armor? \ No newline at end of file diff --git a/init.lua b/init.lua index 9d95c8d..8eeaeaa 100644 --- a/init.lua +++ b/init.lua @@ -1,4 +1,22 @@ -local model = minetest.get_modpath("3d_armor") and "armor" or "normal" +-- Version of player model. +-- default_character_v1: +-- minetest_game before 25 nov 2016 +-- 3d_armor before 27 nov 2016 (overrides model from minetest_game) +-- default_character_v2: +-- minetest_game after 25 nov 2016 +-- 3d_armor after 27 nov 2016 (overrides model from minetest_game) + +local valid_player_model_versions = { + default_character_v1 = true, + default_character_v2 = true, +} + +local player_model_version = minetest.setting_get("player_model_version") +if not player_model_version or player_model_version == "" then + player_model_version = "default_character_v2" +elseif not valid_player_model_versions[player_model_version] then + error("Invalid value for player_model_version in minetest.conf: " .. player_model_version) +end -- Localize to avoid table lookups local vector_new = vector.new @@ -25,49 +43,52 @@ local LLEG = "Leg_Left" local RLEG = "Leg_Right" local bone_positions = { - normal = { + default_character_v1 = { [BODY] = vector_new(0, -3.5, 0), - [HEAD] = vector_new(0, 6.5, 0), - [CAPE] = vector_new(0, 6.5, 1.5), - [LARM] = vector_new(-3.9, 6.5, 0), - [RARM] = vector_new(3.9, 6.5, 0), + [HEAD] = vector_new(0, 6.75, 0), + [CAPE] = vector_new(0, 6.75, 1.1), + [LARM] = vector_new(2, 6.75, 0), + [RARM] = vector_new(-2, 6.75, 0), [LLEG] = vector_new(-1, 0, 0), [RLEG] = vector_new(1, 0, 0) }, - armor = { + default_character_v2 = { [BODY] = vector_new(0, -3.5, 0), [HEAD] = vector_new(0, 6.75, 0), - [CAPE] = vector_new(0, 6.75, 1.5), - [LARM] = vector_new(2, 6.5, 0), - [RARM] = vector_new(-2, 6.5, 0), + [CAPE] = vector_new(0, 6.75, 1.2), + [LARM] = vector_new(3, 5.75, 0), + [RARM] = vector_new(-3, 5.75, 0), [LLEG] = vector_new(1, 0, 0), [RLEG] = vector_new(-1, 0, 0) } } local bone_rotations = { - normal = { + default_character_v1 = { [BODY] = vector_new(0, 0, 0), [HEAD] = vector_new(0, 0, 0), - [CAPE] = vector_new(0, 0, 180), - [LARM] = vector_new(180, 0, 7.5), - [RARM] = vector_new(180, 0, -7.5), + [CAPE] = vector_new(180, 0, 0), + [LARM] = vector_new(180, 0, 9), + [RARM] = vector_new(180, 0, -9), [LLEG] = vector_new(0, 0, 0), [RLEG] = vector_new(0, 0, 0) }, - armor = { + default_character_v2 = { [BODY] = vector_new(0, 0, 0), [HEAD] = vector_new(0, 0, 0), - [CAPE] = vector_new(180, 0, 180), - [LARM] = vector_new(180, 0, 9), - [RARM] = vector_new(180, 0, -9), + [CAPE] = vector_new(0, 0, 0), + [LARM] = vector_new(0, 0, 0), + [RARM] = vector_new(0, 0, 0), [LLEG] = vector_new(0, 0, 0), [RLEG] = vector_new(0, 0, 0) } } -local bone_rotation = bone_rotations[model] -local bone_position = bone_positions[model] +local bone_rotation = bone_rotations[player_model_version] +local bone_position = bone_positions[player_model_version] +if not bone_rotation or not bone_position then + error("Internal error: invalid player_model_version: " .. player_model_version) +end local bone_rotation_cache = {} @@ -109,7 +130,7 @@ local animations = { [WALK] = function(player) local swing = math_sin(step * 4 * animation_speed[player]) - rotate(player, CAPE, swing * 30 + 35) + rotate(player, CAPE, swing * -30 - 35) rotate(player, LARM, swing * -40) rotate(player, RARM, swing * 40) rotate(player, LLEG, swing * 40) @@ -123,9 +144,9 @@ local animations = { local swing = math_sin(step * 4 * speed) local hand_swing = math_sin(step * 8 * speed) - rotate(player, CAPE, swing * 5 + 10) + rotate(player, CAPE, swing * -5 - 10) rotate(player, LARM) - rotate(player, RARM, hand_swing * 20 + 80 + pitch) + rotate(player, RARM, hand_swing * 20 + 80 + pitch, hand_swing * 5 - 3, 10) rotate(player, LLEG) rotate(player, RLEG) end, @@ -137,9 +158,9 @@ local animations = { local swing = math_sin(step * 4 * speed) local hand_swing = math_sin(step * 8 * speed) - rotate(player, CAPE, swing * 30 + 35) + rotate(player, CAPE, swing * -30 - 35) rotate(player, LARM, swing * -40) - rotate(player, RARM, hand_swing * 20 + 80 + pitch) + rotate(player, RARM, hand_swing * 20 + 80 + pitch, hand_swing * 5 - 3, 10) rotate(player, LLEG, swing * 40) rotate(player, RLEG, swing * -40) end, diff --git a/readme.md b/readme.md index bf95d0e..395d687 100644 --- a/readme.md +++ b/readme.md @@ -5,4 +5,19 @@ The head only turns up and down relative to the body, except it turns slightly t Works in multiplayer, I tested it on a local server. +Configuration +------------- + +This mod supports 2 versions of the player model: +- The old version: v1 (before nov. 2016) +- The new version: v2 (after nov. 2016) +(see also init.lua) + +As there is no automatic way to determine which version is used, this must be manually configured in `init.lua`. + +Symptoms of having configured the incorrect player model: +- In rest, arms are raised up, and are either detached from the body, or are too close to the body +- Cape (if visible) points upward + + Created by Rui914, this document was written by sloantothebone. diff --git a/settingtypes.txt b/settingtypes.txt new file mode 100644 index 0000000..19912bb --- /dev/null +++ b/settingtypes.txt @@ -0,0 +1,14 @@ +# Version of player model. +# Some fixes and improvements were made to the default player model (character.b3d) +# end of november 2016. These changes affect the way body parts are attached and +# positioned. For correct results, the version of the player model must be known. +# +# Player models known / supported by this mod: +# . -- default_character_v1; used in: +# . -- minetest_game before 25 nov 2016 +# . -- 3d_armor before 27 nov 2016 (overrides model from minetest_game) +# . -- default_character_v2; used in: +# . -- minetest_game after 25 nov 2016 +# . -- 3d_armor after 27 nov 2016 (overrides model from minetest_game) +player_model_version (Version of player model) enum default_character_v2 default_character_v1,default_character_v2 +