From a0ed9921215fd0f736f4ad8a04b7973f97ee88f0 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sun, 16 Mar 2025 18:38:12 +0100 Subject: [PATCH 1/3] Update player_api model registration Ensures correct eye position and collision box. Values taken from the player_api 'character.b3d' model. --- init.lua | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/init.lua b/init.lua index 836f2bc..a6c9375 100644 --- a/init.lua +++ b/init.lua @@ -72,6 +72,7 @@ minetest.register_on_shutdown(function() end end) +-- See also: 3d_armor/init.lua player_api.register_model("skinsdb_3d_armor_character_5.b3d", { animation_speed = 30, textures = { @@ -82,16 +83,21 @@ player_api.register_model("skinsdb_3d_armor_character_5.b3d", { }, animations = { stand = {x=0, y=79}, - lay = {x=162, y=166}, + lay = {x=162, y=166, eye_height = 0.3, override_local = true, + collisionbox = {-0.6, 0.0, -0.6, 0.6, 0.3, 0.6}}, walk = {x=168, y=187}, mine = {x=189, y=198}, walk_mine = {x=200, y=219}, - sit = {x=81, y=160}, + sit = {x=81, y=160, eye_height = 0.8, override_local = true, + collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.0, 0.3}}, -- compatibility w/ the emote mod wave = {x = 192, y = 196, override_local = true}, point = {x = 196, y = 196, override_local = true}, freeze = {x = 205, y = 205, override_local = true}, }, + collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3}, + -- stepheight: use default + eye_height = 1.47, }) -- Register default character.png if not part of this mod From 247bcdd05835886f307944cfa8c8ba1c9599df4b Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sun, 16 Mar 2025 18:49:40 +0100 Subject: [PATCH 2/3] Fix client-side out-of-bounds '[combine' warnings --- skin_meta_api.lua | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/skin_meta_api.lua b/skin_meta_api.lua index 1ce04ed..915ab2a 100644 --- a/skin_meta_api.lua +++ b/skin_meta_api.lua @@ -109,7 +109,7 @@ function skin_class:get_preview() --Right Leg skin = skin .. "([combine:16x32:0,0=" .. player_skin .. "^[mask:skindb_mask_rleg.png)^" - -- 64x skins have non-mirrored arms and legs + -- 64x64 skins have non-mirrored arms and legs local left_arm local left_leg @@ -126,17 +126,21 @@ function skin_class:get_preview() --Left Leg skin = skin .. left_leg - -- Add overlays for 64x skins. these wont appear if skin is 32x because it will be cropped out - --Chest Overlay - skin = skin .. "([combine:16x32:-16,-28=" .. player_skin .. "^[mask:skindb_mask_chest.png)^" - --Right Arm Overlay - skin = skin .. "([combine:16x32:-44,-28=" .. player_skin .. "^[mask:skindb_mask_rarm.png)^" - --Right Leg Overlay - skin = skin .. "([combine:16x32:0,-16=" .. player_skin .. "^[mask:skindb_mask_rleg.png)^" - --Left Arm Overlay - skin = skin .. "([combine:16x32:-40,-44=" .. player_skin .. "^[mask:(skindb_mask_rarm.png^[transformFX))^" - --Left Leg Overlay - skin = skin .. "([combine:16x32:4,-32=" .. player_skin .. "^[mask:(skindb_mask_rleg.png^[transformFX))" + if self:get_meta("format") == "1.8" then + -- Add overlays for 64x64 skins. This check is needed to avoid + -- client-side out-of-bounds "[combine" warnings. + + --Chest Overlay + skin = skin .. "([combine:16x32:-16,-28=" .. player_skin .. "^[mask:skindb_mask_chest.png)^" + --Right Arm Overlay + skin = skin .. "([combine:16x32:-44,-28=" .. player_skin .. "^[mask:skindb_mask_rarm.png)^" + --Right Leg Overlay + skin = skin .. "([combine:16x32:0,-16=" .. player_skin .. "^[mask:skindb_mask_rleg.png)^" + --Left Arm Overlay + skin = skin .. "([combine:16x32:-40,-44=" .. player_skin .. "^[mask:(skindb_mask_rarm.png^[transformFX))^" + --Left Leg Overlay + skin = skin .. "([combine:16x32:4,-32=" .. player_skin .. "^[mask:(skindb_mask_rleg.png^[transformFX))" + end -- Full Preview skin = "(((" .. skin .. ")^[resize:64x128)^[mask:skindb_transform.png)" From bc69b03d0b8447a582ca38e9eebb8565d2b07f29 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sat, 29 Mar 2025 10:58:31 +0100 Subject: [PATCH 3/3] Update hand overrides to v5.12.0-dev changes Luanti commit e037873 changed how the tool range and caps are taken into account. Hence, skin hands now overwrite the long-range hand (`""`) provided by the creative mod. We want to preserve the tool range and capabilities, thus this commit. --- mod.conf | 2 +- skin_meta_api.lua | 46 +++++++++++++++++++++++++++++++++++++--------- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/mod.conf b/mod.conf index 38a62c3..a8ac47d 100644 --- a/mod.conf +++ b/mod.conf @@ -1,5 +1,5 @@ name = skinsdb description = Player skin mod, supporting unified_inventory, sfinv and smart_inventory depends = player_api -optional_depends = unified_inventory,3d_armor,clothing,sfinv,hand_monoid +optional_depends = unified_inventory, 3d_armor, clothing, creative, sfinv, hand_monoid min_minetest_version = 5.4.0 diff --git a/skin_meta_api.lua b/skin_meta_api.lua index 915ab2a..cbab18a 100644 --- a/skin_meta_api.lua +++ b/skin_meta_api.lua @@ -49,23 +49,25 @@ function skin_class:set_texture(value) self._texture = value end +--- Retrieves the character texture function skin_class:get_texture() return self._texture end +--- Assigns an existing hand item (/node) name to this skin function skin_class:set_hand(hand) self._hand = hand end +function skin_class:get_hand() + return self._hand +end + +--- Registers a new hand item based on the skin meta local ALPHA_CLIP = minetest.features.use_texture_alpha_string_modes and "clip" or true function skin_class:set_hand_from_texture() local hand = core.get_current_modname()..':'..self._texture:gsub('[%p%c%s]', '') local hand_def = {} - for k,v in pairs(minetest.registered_items[""]) do - if k ~= "mod_origin" and k ~= "type" and k ~= "wield_image" then - hand_def[k] = v - end - end hand_def.tiles = {self:get_texture()} hand_def.visual_scale = 1 hand_def.wield_scale = {x=1,y=1,z=1} @@ -77,13 +79,39 @@ function skin_class:set_hand_from_texture() hand_def.mesh = "skinsdb_hand_18.b3d" end hand_def.use_texture_alpha = ALPHA_CLIP - minetest.register_node(hand, hand_def) + + core.register_node(hand, table.copy(hand_def)) + + self._hand_def = hand_def -- for wieldhand overrides self:set_hand(hand) end -function skin_class:get_hand() - return self._hand -end +-- creative (and other mods?) may overwrite the wieldhand very late. +-- Grab the most recent definition and use them as default for our skin hands. +core.register_on_mods_loaded(function() + local default_hand_def = {} + for k, v in pairs(core.registered_items[""]) do + if k ~= "mod_origin" + and k ~= "name" + and k ~= "type" + and k ~= "wield_image" + and string.sub(k, 1, 1) ~= "_" then + default_hand_def[k] = v + end + end + for _, meta in pairs(skins.meta) do + local def = core.registered_nodes[meta._hand] + if def then + local new_def = table.copy(default_hand_def) + -- Overwrite the hand with our fields from `set_hand_from_texture` + for k, v in pairs(meta._hand_def) do + new_def[k] = v + end + core.override_item(meta._hand, new_def) + end + meta._hand_def = nil -- no longer needed, free up RAM + end +end) function skin_class:set_preview(value) self._preview = value