From 8f98a7fa2d867d9d911d44eacc8bb240df3733b3 Mon Sep 17 00:00:00 2001 From: Signal Date: Tue, 11 Nov 2025 01:29:41 -0500 Subject: [PATCH] Add chests, doors, and levers, and improve progressive interaction. --- .../textures/artifact_radial_cursor.png | Bin 162 -> 172 bytes mods/artifact_mechanisms/basics.lua | 88 +++++++- mods/artifact_mechanisms/chest.lua | 182 ++++++++++++++++ mods/artifact_mechanisms/doors.lua | 197 ++++++++++++++++++ mods/artifact_mechanisms/init.lua | 20 +- .../models/artifact_animator.gltf | 1 + .../models/artifact_chest.gltf | 1 + .../models/artifact_door.gltf | 1 + .../models/artifact_lever.gltf | 1 + .../textures/artifact_cancel.png | Bin 0 -> 247 bytes .../textures/artifact_chest_wood.png | Bin 0 -> 1651 bytes .../textures/artifact_door_iron.png | Bin 0 -> 972 bytes .../textures/artifact_door_wood.png | Bin 0 -> 996 bytes .../textures/artifact_lever_wood.png | Bin 0 -> 432 bytes mods/artifact_player/init.lua | 176 ++++++++++------ mods/artifact_world/init.lua | 118 +++++++++-- mods/artifact_world/mapgen.lua | 14 +- .../textures/artifact_glass.png | Bin 0 -> 181 bytes 18 files changed, 692 insertions(+), 107 deletions(-) create mode 100644 mods/artifact_mechanisms/chest.lua create mode 100644 mods/artifact_mechanisms/doors.lua create mode 100644 mods/artifact_mechanisms/models/artifact_animator.gltf create mode 100644 mods/artifact_mechanisms/models/artifact_chest.gltf create mode 100644 mods/artifact_mechanisms/models/artifact_door.gltf create mode 100644 mods/artifact_mechanisms/models/artifact_lever.gltf create mode 100644 mods/artifact_mechanisms/textures/artifact_cancel.png create mode 100644 mods/artifact_mechanisms/textures/artifact_chest_wood.png create mode 100644 mods/artifact_mechanisms/textures/artifact_door_iron.png create mode 100644 mods/artifact_mechanisms/textures/artifact_door_wood.png create mode 100644 mods/artifact_mechanisms/textures/artifact_lever_wood.png create mode 100644 mods/artifact_world/textures/artifact_glass.png diff --git a/mods/artifact_hud/textures/artifact_radial_cursor.png b/mods/artifact_hud/textures/artifact_radial_cursor.png index cf731b142b4bb6e375fc8937c0bbed7613b2b552..a4a638167a897aab263026369cd38871bc9c140f 100644 GIT binary patch delta 130 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 literal 0 HcmV?d00001 diff --git a/mods/artifact_mechanisms/textures/artifact_door_iron.png b/mods/artifact_mechanisms/textures/artifact_door_iron.png new file mode 100644 index 0000000000000000000000000000000000000000..f8a8da0791b3e5fe44babdb261d75db23959bedd GIT binary patch literal 972 zcmV;-12g=IP)Px&hDk(0RCt{2nXzu$Fc60Ss0t{=h9q=Rfuci;K0rJ54FY87<8{lHAzP6kL-GQ7 zkD@|{Ivs4HgEX~6bnJ;HDanm}LZlBcU{R;j@kkzzr=zp8vp;B1O2J26*R5+?w(Gu6 zmgKIku8zD9?2#A%(ll)uM@A{7ptXil%Cu>%Tk-_S+Pcy-H6141Tvy0Zhag5{e4gj1 zstT*s3ILF08ImM{*4kWyjUHVSo6QDFDbv2$YyiOMrEAi=Uay^c4o&20R7xR967NIy z{Uk|(BiVIdk}U`D^;uO_>t4tyJ{hjVjuT@bQc9t&>n%ff>AX+2s;Vu=@>nBDjHbh@ z)yg|U+)yrKchrvVE`4QLw)72g>^_Ll>;m*7LWa3I7Mk8%m+M`Um>7`fxrxZWsmYf` zpZ^@vnPnOBJbwz?p9JSFz^Uun852U#8XsfOvoSFMf$d6bZDja;+bK#ZlSjBZ&$myy zKg6;7z{~)bA!KZtrmYMv1j*4Fcf}IvPIEe!0Fh-`udJ=F+*pVK;Pk@}ES5h30H+_1 zadD?mRh3y1GVhd_ec@}z{TB5RQdtGAHLzs-Sb`rhp9Sd8?d`3|6qIK2Ghp%#=zSV|u1tOg z%npz?K$_VB(gsK~J3!h1X=VpV8z9Z>0BHlHnY;tyvDD_InEVWw9UyIhG?RD0ToIBs uK$_VB(gsK~J3!h1Y35W|+5l-L?|{GSx(ET%0oODD0000Px&o=HSORCt{2TES}EFc5u_CE}PI3jK8yLMesxPA@cDSe9&W!tR*Z@3fL-X=bFEc^dD@yVtKC&_JsKIXJ&&$a(s8pvh zqil*&X7?w;p4FgrfX?V|0io9M?CSmg4&u_7G42P*nz1Wm*xuPcXileSN99 z&Q5h$Zwd%8z!)7OaxP$Tw;1!AgXS#DX$8b&7T|Dxn~Vv4ARnJ%(2LQ;02fkQDlo0@ zUC96Zd2AG|3f$h-exFiat0K4qxy(L>Jp{s8^xk#+p4u_H>qB6X4Kqx|5^1G5Mmyt< z33elUY8)}YsUsN!xX)`<3^K#cqz&^UcZqqxl%N6N{hOBnfb(;Mk6+ezi#Wb9}zIg7+@O2x%r5uESiAIFdgFsSL7@%N!aiM^?&GqiT-pV~G#|R8^V1 z^V8arX)$>n-Z$zGF4AO$oUtX{pk;v6PQ=VFMU6T2<^3sEIVBQ=F?WIIj&K(!619n; z-5Rr-DT>Wwg!GBfW2-Wp`0&dSf%|u@@UUY1@+5^$^q~?NKN0c$ol+b1TkAS0lUIcL zN?_83k-ft&DZz;omAxNRu zKfeF^E&EReA}QKw1E4EC!GkKpKkyqy>=1 z>`%aA0BHfFF?$0n6(MN>q_G%4S^#M*29Op&8VePc7C;)aH^6`JZx6tl SRB@L80000Px$YDq*vR9J=Wl(9;~Kp4mWDG52v(SnPvYM;WXkD;?TO2JKc@d3K!37XX>P!Pn; z%~dzu61eCc3Dlu{$MsH#B-c8a9~9Ci>G%8Y|J?=i*<`_a1OO1C0swrxf8lUEM7+%a z0P0if--W2KySD`ZFyA{qzYEZUkS;E6-oO~c^kk@SQehIKqEwg!yAYP5)_-UsL`s8y2%;95 0.1 + if moving then + m.moving = true + if ctl.aux1 and ctl.up then + if p:get_animation().y ~= 2 then p:set_animation({x=1, y=2}, 1.5, 0.2, true) end + p:set_physics_override{ + speed = 1.5 + } + else + if p:get_animation().y ~= 1 then p:set_animation({x=0, y=1}, 1.5, 0.2, true) end + p:set_physics_override{ + speed = 1 + } + end + else + m.moving = false + if p:get_animation().y ~= 0 then p:set_animation({x=0, y=0}) end + end + + if not m.rot then m.rot = 0 end + if moving then + local fac = 0 + if ctl.left then fac = 30 elseif ctl.right then fac = -30 end + m.rot = yaw +math.rad(fac) + elseif math.abs(yaw -m.rot) > math.rad(40) then + m.rot = m.rot +(yaw -(m.yaw or 0)) + end + m.rot = m.rot %(math.pi *2) + + p:set_bone_override("Head", { + rotation = {vec = vector.new(math.min(math.max(pitch, math.rad(-60)), math.rad(60)),-(yaw -m.rot),0), interpolation = 0.1, absolute = true} + }) + + p:set_bone_override("root", { + rotation = {vec = vector.new(0,yaw -m.rot,0), interpolation = 0.1, absolute = true} + }) + + -- MARK: Progressive interaction + + if ctl.place and m.ctl.place and m.pointed_obj and m.pointed_obj.on_interact and not m.pointed_obj._no_interact then if not m.interaction_start then m.interaction_start = time --- m.interaction_marker = minetest.add_entity(m.pointed_obj, "display") --- m.interaction_marker:set_properties { --- visual = "sprite", --- textures = {"rgt_interact_progress_0.png"} --- } else - if time -m.interaction_start > 1100000 then - m.interaction_marker:remove() + local duration = (m.pointed_obj._interact_time or 1) *1000000 + local progress = (time -m.interaction_start) /duration + if progress > 1.1 then m.pointed_obj:on_interact(m) - elseif time -m.interaction_start > 1000000 then - m.interaction_marker:set_properties { - textures = {"artifact_rmb_100.png"} - } - elseif time -m.interaction_start > 750000 then - m.interaction_marker:set_properties { - textures = {"artifact_rmb_75.png"} - } - elseif time -m.interaction_start > 500000 then - m.interaction_marker:set_properties { - textures = {"artifact_rmb_50.png"} - } - elseif time -m.interaction_start > 250000 then - m.interaction_marker:set_properties { - textures = {"artifact_rmb_25.png"} - } + m.interaction_start = nil + m.object:hud_remove(m.interaction_marker) + m.interaction_marker = nil + elseif progress > 1 then + m.object:hud_change(m.interaction_marker, "text", "artifact_rmb_100.png") + elseif progress > 0.75 then + m.object:hud_change(m.interaction_marker, "text", "artifact_rmb_75.png") + elseif progress > 0.5 then + m.object:hud_change(m.interaction_marker, "text", "artifact_rmb_50.png") + elseif progress > 0.25 then + m.object:hud_change(m.interaction_marker, "text", "artifact_rmb_25.png") end end - elseif not ctl.place and m.ctl.place and m.interaction_start then - m.interacting_with = nil + elseif not ctl.place and m.interaction_start and (not m.pointed_obj or not m.pointed_obj._no_interact) then m.interaction_start = nil + if m.interaction_marker then + m.object:hud_change(m.interaction_marker, "text", "artifact_rmb.png") + end end local wi = p:get_wielded_item() m.wielded_item = wi + -- MARK: Radial menu handling + if ctl.place and not m.ctl.place and wi:get_name() == "artifact:input" then artifact.show_radial_menu(m, { name = "construct", @@ -239,37 +296,17 @@ Player = setmetatable({ end, -- Initialize the player's primary HUD display based on saved state. create_hud = function(m) - -- If called post-init, make sure we delete the previous HUD. - -- This is useful when we want to recreate the HUD in response - -- to an event, like freeing Vix. --- if m.hud then --- for _, x in pairs(m.hud) do --- if type(x) == "table" then --- for _, y in pairs(x) do --- m.object:hud_remove(y) --- end --- else --- m.object:hud_remove(x) --- end --- end --- end --- m.hud = { --- key_health = m.object:hud_add { --- type = "statbar", --- position = {x=0.5,y=1}, --- offset = {x=-27 *5,y=artifact.debug and -96 or -30}, --- scale = {x=4,y=4}, --- alignment = {x=-1, y=-1}, --- size = {x=27,y=27}, --- text = "artifact_heart_vix.png", --- text2 = "artifact_heart_bg.png", --- number = 20 --- } --- } --- --- if artifact.debug or artifact.story.states[artifact.story.get_state()] >= artifact.story.states.main then --- --- end + m.healthbar = m.object:hud_add { + type = "statbar", + position = {x=0.5,y=1}, + offset = {x=-27 *5,y=artifact.debug and -96 or -30}, + scale = {x=4,y=4}, + alignment = {x=-1, y=-1}, + size = {x=27,y=27}, + text = "artifact_heart_vix.png", + text2 = "artifact_heart_bg.png", + number = 20 + } end, set_hotbar_size = function(m, slots) local p = m.object @@ -289,6 +326,7 @@ Player = setmetatable({ artifact.register_craftitem("input", { inventory_image = "artifact_rmb_100.png", + range = 0, on_drop = function(s, p, pos) local m = artifact.players[p:get_player_name()] if artifact.debug or artifat.story.state > artifact.story.states.pre_vix then @@ -313,3 +351,7 @@ minetest.register_on_joinplayer(function(p) minetest.registered_chatcommands.grantme.func(p:get_player_name(), "all") end end) + +minetest.register_on_leaveplayer(function(p) + artifact.players[p:get_player_name()] = nil +end) diff --git a/mods/artifact_world/init.lua b/mods/artifact_world/init.lua index 1488442..faebeb5 100644 --- a/mods/artifact_world/init.lua +++ b/mods/artifact_world/init.lua @@ -11,6 +11,15 @@ function artifact.register_node(name, def) if not def.groups then def.groups = {} end def.groups.dig_immediate = 3 end + if def._variants then + for _, x in ipairs(def._variants) do + if x == "slab" then + artifact.register_slab(def) + elseif x == "stair" then + artifact.register_stair(def) + end + end + end minetest.register_node(":"..name, def) if name ~= def._name then minetest.register_alias(def._name, name) @@ -28,6 +37,58 @@ function artifact.register_craftitem(name, def) end end +function artifact.register_slab(def) + def = table.copy(def) + def._variants = nil + + artifact.register_node(def._name.."_slab", extend(def, { + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5} + }, + paramtype = "light", + paramtype2 = "facedir" + })) +end + +function artifact.register_stair(def) + def = table.copy(def) + def._variants = nil + + def.groups[def._name.."_stair"] = 1 + + artifact.register_node(def._name.."_stair", extend(table.copy(def), { + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {{-0.5, -0.5, -0.5, 0.5, 0, 0.5}, {-0.5, -0.5, 0, 0.5, 0.5, 0.5}} + }, + paramtype = "light", + paramtype2 = "facedir" + })) + + artifact.register_node(def._name.."_stair_inner", extend(table.copy(def), { + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {{-0.5, -0.5, -0.5, 0.5, 0, 0.5}, {-0.5, -0.5, 0, 0.5, 0.5, 0.5}, {-0.5, -0.5, -0.5, 0, 0.5, 0.5}} + }, + paramtype = "light", + paramtype2 = "facedir" + })) + + artifact.register_node(def._name.."_stair_outer", extend(def, { + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {{-0.5, -0.5, -0.5, 0.5, 0, 0.5}, {-0.5, 0, 0.5, 0, 0.5, 0}} + }, + paramtype = "light", + paramtype2 = "facedir" + })) +end + local function rep(tx, size) local out = "[combine:"..(size *16).."x"..(size *16) for x = 0, size -1 do @@ -39,29 +100,36 @@ local function rep(tx, size) end artifact.register_node("stone", { - tiles = {"artifact_stone.png"} + tiles = {{name = "artifact_stone.png", align_style = "world"}}, + _variants = {"stair", "slab"} }) artifact.register_node("stone_mossy", { - tiles = {{name = rep("artifact_stone.png", 4).."^artifact_moss.png", align_style = "world", scale = 4}} + tiles = {{name = rep("artifact_stone.png", 4).."^artifact_moss.png", align_style = "world", scale = 4}}, + _variants = {"stair", "slab"}, }) artifact.register_node("stone_bricks", { - tiles = {"artifact_stone_bricks.png"} + tiles = {{name = "artifact_stone_bricks.png", align_style = "world"}}, + _variants = {"stair", "slab"}, }) artifact.register_node("stone_bricks_mossy", { - tiles = {{name = rep("artifact_stone_bricks.png", 4).."^artifact_moss_bricks.png", align_style = "world", scale = 4}} + tiles = {{name = rep("artifact_stone_bricks.png", 4).."^artifact_moss_bricks.png", align_style = "world", scale = 4}}, + _variants = {"stair", "slab"}, }) artifact.register_node("stone_bricks_small", { - tiles = {"artifact_stone_bricks_small.png"} + tiles = {{name = "artifact_stone_bricks_small.png", align_style = "world"}}, + _variants = {"stair", "slab"}, }) artifact.register_node("stone_tile", { - tiles = {"artifact_stone_tile.png"} + tiles = {{name = "artifact_stone_tile.png", align_style = "world"}}, + _variants = {"stair", "slab"}, }) artifact.register_node("stone_tile_small", { - tiles = {"artifact_stone_tile_small.png"} + tiles = {{name = "artifact_stone_tile_small.png", align_style = "world"}}, + _variants = {"stair", "slab"}, }) @@ -85,7 +153,7 @@ artifact.register_node("vines", { paramtype = "light", paramtype2 = "facedir", tiles = {"artifact_vines.png"}, - use_texture_alpha = true + use_texture_alpha = "clip" }) artifact.register_node("vines_dry", { drawtype = "nodebox", @@ -107,25 +175,26 @@ artifact.register_node("vines_dry", { paramtype = "light", paramtype2 = "facedir", tiles = {"artifact_vines_dry.png"}, - use_texture_alpha = true + use_texture_alpha = "clip" }) artifact.register_node("leaves", { drawtype = "allfaces", -- paramtype = "light", tiles = {"artifact_leaves.png"}, - use_texture_alpha = true + use_texture_alpha = "clip" }) artifact.register_node("leaves_dry", { drawtype = "allfaces", -- paramtype = "light", tiles = {"artifact_leaves_dry.png"}, - use_texture_alpha = true + use_texture_alpha = "clip" }) artifact.register_node("wood_planks", { - tiles = {"artifact_wood_planks.png"} + tiles = {{name = "artifact_wood_planks.png", align_style = "world"}}, + _variants = {"stair", "slab"}, }) artifact.register_node("ladder_wood", { @@ -139,6 +208,13 @@ artifact.register_node("ladder_wood", { }) +artifact.register_node("glass", { + drawtype = "glasslike", + use_texture_alpha = "clip", + tiles = {"artifact_glass.png"}, + _variants = {"stair", "slab"}, +}) + local function register_lamp(color, brightness) artifact.register_node("lamp_"..color, { @@ -176,11 +252,15 @@ minetest.override_item("air", { light_source = 2 }) -minetest.register_mapgen_script(minetest.get_modpath(minetest.get_current_modname()).."/mapgen.lua") +if artifact.debug then -minetest.register_decoration { - deco_type = "simple", - decoration = "lamp_gold", - place_on = "stone", - fill_ratio = 0.02, -} + minetest.register_mapgen_script(minetest.get_modpath(minetest.get_current_modname()).."/mapgen.lua") + + minetest.register_decoration { + deco_type = "simple", + decoration = "lamp_blue", + place_on = "stone", + fill_ratio = 0.02, + } + +end diff --git a/mods/artifact_world/mapgen.lua b/mods/artifact_world/mapgen.lua index 5b0e266..7c526cc 100644 --- a/mods/artifact_world/mapgen.lua +++ b/mods/artifact_world/mapgen.lua @@ -2,6 +2,7 @@ local vm_data = {} local c_stone = minetest.get_content_id("artifact:stone") +local c_chest = minetest.get_content_id("chest_with_everything:chest") minetest.register_on_generated(function(vm, minp, maxp) local min, max = vm:get_emerged_area() @@ -9,10 +10,21 @@ minetest.register_on_generated(function(vm, minp, maxp) vm:get_data(vm_data) - if max.y < 0 then + if maxp.y < 0 then for i in va:iterp(minp, maxp) do vm_data[i] = c_stone end + elseif maxp.y < 50 then + for x = min.x, max.x do + for z = min.z, max.z do + for y = min.y, -1 do + vm_data[va:index(x, y, z)] = c_stone + end + if x == 0 and z == 2 then + vm_data[va:index(x, 0, z)] = c_chest + end + end + end end vm:set_data(vm_data) diff --git a/mods/artifact_world/textures/artifact_glass.png b/mods/artifact_world/textures/artifact_glass.png new file mode 100644 index 0000000000000000000000000000000000000000..9ab7cd4f4457928f703e0c9e54eb270dae72305b GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|@;zM~Lo9ml zPTtLXz<|T${JNXq^iR$rG-GN89ZJ6T-G@yGywoE*F(4f literal 0 HcmV?d00001