And so it begins...

This commit is contained in:
Signal 2025-11-09 16:29:33 -05:00
commit 1b8091e26b
55 changed files with 962 additions and 0 deletions

8
game.conf Normal file
View file

@ -0,0 +1,8 @@
name = artifact_one
title = Artifact
description = TBD
allowed_mapgens = singlenode
disallowed_mapgens = v5, v7, flat, fractal, valleys, carpathian, v6
min_minetest_version = 5.10
disabled_settings = !enable_damage, creative_mode, enable_server
author = Signal

View file

@ -0,0 +1,40 @@
-- "I'll stop calling it Minetest when it stops being one."
minetest = core
artifact = {
debug = true
}
-- For brevity.
function include(file)
dofile(minetest.get_modpath(minetest.get_current_modname()).."/"..file)
end
function enum(cases)
local out = {}
local i = 0
for _, x in ipairs(cases) do
out[x] = i
i = i +1
end
return out
end
say = minetest.chat_send_all
minetest.register_lbm{
name = ":artifact:on_load",
nodenames = {"group:call_on_load"},
action = function(pos, node)
minetest.registered_nodes[node.name].on_load(pos)
end
}
if artifact.debug then
minetest.register_chatcommand("chest", {
func = function(name, args)
minetest.registered_chatcommands.giveme.func(name, "chest_with_everything:chest")
end
})
end

View file

@ -0,0 +1 @@
name = artifact_base

View file

@ -0,0 +1,35 @@
local ns = artifact
function ns.apply_key(m)
m.object:set_properties {
textures = {"artifact_key.png"},
visual_size = vector.new(1,1,1) *0.88,
eye_height = 1.6
}
m.eye_height = 1.6
end
function ns.apply_vix(m)
m.object:set_properties {
textures = {"artifact_vix.png"},
visual_size = vector.new(1,1,1) *0.8,
eye_height = 1.5
}
m.eye_height = 1.5
end
function ns.swap_character(m)
if m.character == "vix" then
m:set_character("key")
ns.apply_key(m)
else
m:set_character("vix")
ns.apply_vix(m)
end
end
include "key.lua"
include "vix.lua"

View file

@ -0,0 +1,3 @@
local ns = artifact

View file

@ -0,0 +1,2 @@
name = artifact_characters
depends = artifact_story

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 755 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 753 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5 KiB

View file

View file

View file

@ -0,0 +1,2 @@
name = artifact_hud
depends = artifact_base

Binary file not shown.

After

Width:  |  Height:  |  Size: 277 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 B

View file

@ -0,0 +1,14 @@
local function make_lever_entity(pos)
end
artifact.register_node("lever", {
drawtype = "airlike",
paramtype = "light",
sunlight_propagates = true,
paramtype2 = "facedir",
on_construct = function(pos)
end
})

View file

@ -0,0 +1,30 @@
minetest.register_entity(":display", {
initial_properties = {
pointable = false,
static_save = false
},
on_activate = function(e)
e.object:set_armor_groups{immortal = 1}
end
})
minetest.register_entity(":test", {
initial_properties = {
visual = "sprite",
textures = {"blank.png"},
use_texture_alpha = true,
static_save = false
},
on_rightclick = function(e, p)
artifact.players[p:get_player_name()].interacting_with = e
end,
on_hover = function() say "!" end,
on_interact = function(e, m)
end
})
include "basics.lua"

View file

@ -0,0 +1,2 @@
name = artifact_mechanisms
depends = artifact_characters

View file

@ -0,0 +1,235 @@
local ns = artifact
ns.players = {}
local db = minetest.get_mod_storage()
Player = setmetatable({
new = function(p)
local m = setmetatable({
object = p
}, {__index = Player})
m.name = p:get_player_name()
m.meta = p:get_meta()
m.character = m.meta:get("character") or "key"
m.inv = p:get_inventory()
m.inv:set_stack("main", 1, ItemStack("input"))
-- Generic black sky, since the whole game takes place underground.
p:set_sky{
type = "basic",
base_color = "#000",
clouds = false
}
p:set_sun{visible = false}
p:set_moon{visible = false}
p:set_stars{visible = false}
p:set_properties {
visual = "mesh",
mesh = "artifact_character.gltf",
shaded = false
}
if m.character == "vix" then
artifact.apply_vix(m)
else
artifact.apply_key(m)
end
p:hud_set_flags {
healthbar = false,
breathbar = false,
hotbar = artifact.debug,
minimap = false,
basic_debug = false
}
m:create_hud()
m:set_hotbar_size(8)
m.ctl = p:get_player_control()
return m
end,
tick = function(m)
local time = minetest.get_us_time()
local p = m.object
local pos = p:get_pos()
local dir = p:get_look_dir()
m.pos = pos
m.pos.y = m.pos.y +m.eye_height
local pointed_found = nil
m.pointed_node = nil
for x in minetest.raycast(m.pos, m.pos +(dir *5)) do
if x and x.type == "object" then
local e = x.ref:get_luaentity()
-- Ignore players.
if e then
local names_match = m.pointed_obj and (m.pointed_obj._name or m.pointed_obj.name) == (e._name or e.name)
if m.pointed_obj and not names_match then
if m.pointed_obj.on_unhover then
m.pointed_obj:on_unhover(m)
end
if m.pointed_obj.on_interact and m.interaction_marker then
m.interaction_marker:remove()
m.interaction_marker = nil
end
end
if (m.pointed_obj and not names_match and e.on_hover) or not m.pointed_obj then
if e.on_hover then
e:on_hover(m)
end
if e.on_interact then
if m.interaction_marker then m.interaction_marker:remove() end
m.interaction_marker = minetest.add_entity(e.object:get_pos(), "display")
m.interaction_marker:set_properties {
visual = "sprite",
textures = {"artifact_rmb.png"}
}
end
pointed_found = true
m.pointed_obj = e
break
elseif m.pointed_obj and names_match then
pointed_found = true
break
end
end
elseif x and x.type == "node" then
m.pointed_node = x
end
end
if not pointed_found and m.pointed_obj then
if m.pointed_obj.on_unhover then
m.pointed_obj:on_unhover(m)
end
if m.pointed_obj.on_interact and m.interaction_marker then
m.interaction_marker:remove()
m.interaction_marker = nil
end
m.pointed_obj = nil
end
local ctl = m.object:get_player_control()
if ctl.place and not m.ctl.place and m.pointed_obj and m.pointed_obj.on_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()
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"}
}
end
end
elseif not ctl.place and m.ctl.place and m.interaction_start then
m.interacting_with = nil
m.interaction_start = nil
end
m.ctl = ctl
end,
set_character = function(m, to)
m.character = to
m.meta:set_string("character", to)
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
end,
set_hotbar_size = function(m, slots)
local p = m.object
p:hud_set_hotbar_itemcount(slots)
local list = ""
for i = 0, slots do
list = list..":"..(21*i)..",0=artifact_hotbar_bg.png"
end
p:hud_set_hotbar_image("[combine:"..(21 *slots +1).."x22"..list)
p:hud_set_hotbar_selected_image("artifact_hotbar_selected_bg.png")
end,
}, {
__call = function(_, ...)
return Player.new(...)
end
})
artifact.register_craftitem("input", {
inventory_image = "artifact_rmb_100.png",
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
artifact.swap_character(m)
end
return s
end
})
minetest.register_globalstep(function()
for _, m in pairs(artifact.players) do
m:tick()
end
end)
minetest.register_on_joinplayer(function(p)
artifact.players[p:get_player_name()] = Player(p)
if artifact.debug then
-- Make sure we don't have to `/grantme` a million times while testing.
minetest.registered_chatcommands.grantme.func(p:get_player_name(), "all")
end
end)

View file

@ -0,0 +1,2 @@
name = artifact_player
depends = artifact_characters

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 B

View file

@ -0,0 +1,32 @@
artifact.story = {
states = enum { -- We use an enum for this so that we can use relational operators to determine if the current state is before or after a target state.
"loading", -- For mapgen
"init", -- For the opening cutscene
"pre_vix", -- The player doesn't have Vix yet
"main", -- The main game state. Progress is managed by checkpoints here.
"end", -- The game is over.
}
}
local ns = artifact.story
local db = minetest.get_mod_storage()
local state = db:get_int("state") -- Defaults to zero, i.e. "loading".
function ns.set_state(to)
state = to
db:set_int("state", state)
end
function ns.get_state()
return state
end
function ns.before_state(target)
end
minetest.register_globalstep(function()
if state == "init" then
end
end)

View file

@ -0,0 +1,2 @@
name = artifact_story
depends = artifact_base

View file

@ -0,0 +1,156 @@
artifact.registered_nodes = {}
function artifact.register_node(name, def)
artifact.registered_nodes[name] = def
def._name = name
if not name:find ":" then
name = "artifact:"..name
end
if artifact.debug then
if not def.groups then def.groups = {} end
def.groups.dig_immediate = 3
end
minetest.register_node(":"..name, def)
if name ~= def._name then
minetest.register_alias(def._name, name)
end
end
function artifact.register_craftitem(name, def)
def._name = name
if not name:find ":" then
name = "artifact:"..name
end
minetest.register_craftitem(":"..name, def)
if name ~= def._name then
minetest.register_alias(def._name, name)
end
end
local function rep(tx, size)
local out = "[combine:"..(size *16).."x"..(size *16)
for x = 0, size -1 do
for y = 0, size -1 do
out = out..":"..(x *16)..","..(y *16).."="..tx
end
end
return out
end
artifact.register_node("stone", {
tiles = {"artifact_stone.png"}
})
artifact.register_node("stone_bricks", {
tiles = {"artifact_stone_bricks.png"}
})
artifact.register_node("stone_bricks_small", {
tiles = {"artifact_stone_bricks_small.png"}
})
artifact.register_node("stone_tile", {
tiles = {"artifact_stone_tile.png"}
})
artifact.register_node("stone_tile_small", {
tiles = {"artifact_stone_tile_small.png"}
})
artifact.register_node("vines", {
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
-0.5, -0.5, 0.48,
0.5, 0.5, 0.48
}
},
walkable = false,
selection_box = {
type = "fixed",
fixed = {
-0.5, -0.5, 0.5,
0.5, 0.5, 0.45
}
},
paramtype = "light",
paramtype2 = "facedir",
tiles = {"artifact_vines.png"},
use_texture_alpha = true
})
artifact.register_node("leaves", {
drawtype = "allfaces",
-- paramtype = "light",
tiles = {"artifact_leaves.png"},
use_texture_alpha = true
})
artifact.register_node("wood_planks", {
tiles = {"artifact_wood_planks.png"}
})
artifact.register_node("ladder_wood", {
drawtype = "mesh",
mesh = "artifact_ladder.obj",
paramtype = "light",
paramtype2 = "facedir",
tiles = {"artifact_ladder_wood.png"},
walkable = false,
climbable = true
})
artifact.register_node("lamp_gold", {
drawtype = "mesh",
mesh = "artifact_lamp.obj",
tiles = {"artifact_lamp_gold.png"},
light_source = 8,
paramtype = "light",
sunlight_propagates = true
})
artifact.register_node("lamp_red", {
drawtype = "mesh",
mesh = "artifact_lamp.obj",
tiles = {"artifact_lamp_red.png"},
light_source = 6,
paramtype = "light",
sunlight_propagates = true
})
artifact.register_node("lamp_blue", {
drawtype = "mesh",
mesh = "artifact_lamp.obj",
tiles = {"artifact_lamp_blue.png"},
light_source = 10,
paramtype = "light",
sunlight_propagates = true
})
artifact.register_node("light", {
tiles = {"artifact_light.png"},
paramtype = "light",
light_source = 14
})
minetest.override_item("air", {
sunlight_propagates = false,
light_source = 2
})
minetest.register_mapgen_script(minetest.get_modpath(minetest.get_current_modname()).."/mapgen.lua")
minetest.register_decoration {
deco_type = "simple",
decoration = "lamp_gold",
place_on = "stone",
fill_ratio = 0.02,
}

View file

@ -0,0 +1,21 @@
local vm_data = {}
local c_stone = minetest.get_content_id("artifact:stone")
minetest.register_on_generated(function(vm, minp, maxp)
local min, max = vm:get_emerged_area()
local va = VoxelArea(min, max)
vm:get_data(vm_data)
if max.y < 0 then
for i in va:iterp(minp, maxp) do
vm_data[i] = c_stone
end
end
vm:set_data(vm_data)
minetest.generate_decorations(vm)
vm:calc_lighting()
end)

View file

@ -0,0 +1,2 @@
name = artifact_world
depends = artifact_base

View file

@ -0,0 +1,279 @@
# Made in Blockbench 4.12.5
mtllib artifact_ladder.mtl
o cube
v -0.375 0.5 0.5
v -0.375 0.5 0.375
v -0.375 -0.5 0.5
v -0.375 -0.5 0.375
v -0.5 0.5 0.375
v -0.5 0.5 0.5
v -0.5 -0.5 0.375
v -0.5 -0.5 0.5
vt 0 1
vt 0.0625 1
vt 0.0625 0.5
vt 0 0.5
vt 0.0625 1
vt 0.125 1
vt 0.125 0.5
vt 0.0625 0.5
vt 0.125 1
vt 0.1875 1
vt 0.1875 0.5
vt 0.125 0.5
vt 0.1875 1
vt 0.25 1
vt 0.25 0.5
vt 0.1875 0.5
vt 0.0625 0.3125
vt 0 0.3125
vt 0 0.375
vt 0.0625 0.375
vt 0.125 0.375
vt 0.0625 0.375
vt 0.0625 0.3125
vt 0.125 0.3125
vn 0 0 -1
vn 1 0 0
vn 0 0 1
vn -1 0 0
vn 0 1 0
vn 0 -1 0
usemtl m_310b69c6-0a1e-9e32-b7a6-66ecfa2bc972
f 4/4/1 7/3/1 5/2/1 2/1/1
f 3/8/2 4/7/2 2/6/2 1/5/2
f 8/12/3 3/11/3 1/10/3 6/9/3
f 7/16/4 8/15/4 6/14/4 5/13/4
f 6/20/5 1/19/5 2/18/5 5/17/5
f 7/24/6 4/23/6 3/22/6 8/21/6
o cube
v 0.5 0.5 0.5
v 0.5 0.5 0.375
v 0.5 -0.5 0.5
v 0.5 -0.5 0.375
v 0.375 0.5 0.375
v 0.375 0.5 0.5
v 0.375 -0.5 0.375
v 0.375 -0.5 0.5
vt 0.25 1
vt 0.3125 1
vt 0.3125 0.5
vt 0.25 0.5
vt 0.3125 1
vt 0.375 1
vt 0.375 0.5
vt 0.3125 0.5
vt 0.375 1
vt 0.4375 1
vt 0.4375 0.5
vt 0.375 0.5
vt 0.4375 1
vt 0.5 1
vt 0.5 0.5
vt 0.4375 0.5
vt 0.1875 0.3125
vt 0.125 0.3125
vt 0.125 0.375
vt 0.1875 0.375
vt 0.25 0.375
vt 0.1875 0.375
vt 0.1875 0.3125
vt 0.25 0.3125
vn 0 0 -1
vn 1 0 0
vn 0 0 1
vn -1 0 0
vn 0 1 0
vn 0 -1 0
usemtl m_310b69c6-0a1e-9e32-b7a6-66ecfa2bc972
f 12/28/7 15/27/7 13/26/7 10/25/7
f 11/32/8 12/31/8 10/30/8 9/29/8
f 16/36/9 11/35/9 9/34/9 14/33/9
f 15/40/10 16/39/10 14/38/10 13/37/10
f 14/44/11 9/43/11 10/42/11 13/41/11
f 15/48/12 12/47/12 11/46/12 16/45/12
o cube
v 0.375 -0.3125 0.5
v 0.375 -0.3125 0.4375
v 0.375 -0.4375 0.5
v 0.375 -0.4375 0.4375
v -0.375 -0.3125 0.4375
v -0.375 -0.3125 0.5
v -0.375 -0.4375 0.4375
v -0.375 -0.4375 0.5
vt 0 0.5
vt 0.375 0.5
vt 0.375 0.4375
vt 0 0.4375
vt 0.25 0.375
vt 0.28125 0.375
vt 0.28125 0.3125
vt 0.25 0.3125
vt 0.5 1
vt 0.875 1
vt 0.875 0.9375
vt 0.5 0.9375
vt 0.28125 0.375
vt 0.3125 0.375
vt 0.3125 0.3125
vt 0.28125 0.3125
vt 0.875 0.59375
vt 0.5 0.59375
vt 0.5 0.625
vt 0.875 0.625
vt 0.875 0.59375
vt 0.5 0.59375
vt 0.5 0.5625
vt 0.875 0.5625
vn 0 0 -1
vn 1 0 0
vn 0 0 1
vn -1 0 0
vn 0 1 0
vn 0 -1 0
usemtl m_310b69c6-0a1e-9e32-b7a6-66ecfa2bc972
f 20/52/13 23/51/13 21/50/13 18/49/13
f 19/56/14 20/55/14 18/54/14 17/53/14
f 24/60/15 19/59/15 17/58/15 22/57/15
f 23/64/16 24/63/16 22/62/16 21/61/16
f 22/68/17 17/67/17 18/66/17 21/65/17
f 23/72/18 20/71/18 19/70/18 24/69/18
o cube
v 0.375 -0.0625 0.5
v 0.375 -0.0625 0.4375
v 0.375 -0.1875 0.5
v 0.375 -0.1875 0.4375
v -0.375 -0.0625 0.4375
v -0.375 -0.0625 0.5
v -0.375 -0.1875 0.4375
v -0.375 -0.1875 0.5
vt 0.5 0.9375
vt 0.875 0.9375
vt 0.875 0.875
vt 0.5 0.875
vt 0.3125 0.375
vt 0.34375 0.375
vt 0.34375 0.3125
vt 0.3125 0.3125
vt 0.5 0.875
vt 0.875 0.875
vt 0.875 0.8125
vt 0.5 0.8125
vt 0.34375 0.375
vt 0.375 0.375
vt 0.375 0.3125
vt 0.34375 0.3125
vt 0.875 0.53125
vt 0.5 0.53125
vt 0.5 0.5625
vt 0.875 0.5625
vt 0.875 0.53125
vt 0.5 0.53125
vt 0.5 0.5
vt 0.875 0.5
vn 0 0 -1
vn 1 0 0
vn 0 0 1
vn -1 0 0
vn 0 1 0
vn 0 -1 0
usemtl m_310b69c6-0a1e-9e32-b7a6-66ecfa2bc972
f 28/76/19 31/75/19 29/74/19 26/73/19
f 27/80/20 28/79/20 26/78/20 25/77/20
f 32/84/21 27/83/21 25/82/21 30/81/21
f 31/88/22 32/87/22 30/86/22 29/85/22
f 30/92/23 25/91/23 26/90/23 29/89/23
f 31/96/24 28/95/24 27/94/24 32/93/24
o cube
v 0.375 0.1875 0.5
v 0.375 0.1875 0.4375
v 0.375 0.0625 0.5
v 0.375 0.0625 0.4375
v -0.375 0.1875 0.4375
v -0.375 0.1875 0.5
v -0.375 0.0625 0.4375
v -0.375 0.0625 0.5
vt 0.5 0.8125
vt 0.875 0.8125
vt 0.875 0.75
vt 0.5 0.75
vt 0.375 0.375
vt 0.40625 0.375
vt 0.40625 0.3125
vt 0.375 0.3125
vt 0.5 0.75
vt 0.875 0.75
vt 0.875 0.6875
vt 0.5 0.6875
vt 0.40625 0.375
vt 0.4375 0.375
vt 0.4375 0.3125
vt 0.40625 0.3125
vt 0.375 0.40625
vt 0 0.40625
vt 0 0.4375
vt 0.375 0.4375
vt 0.75 0.4375
vt 0.375 0.4375
vt 0.375 0.40625
vt 0.75 0.40625
vn 0 0 -1
vn 1 0 0
vn 0 0 1
vn -1 0 0
vn 0 1 0
vn 0 -1 0
usemtl m_310b69c6-0a1e-9e32-b7a6-66ecfa2bc972
f 36/100/25 39/99/25 37/98/25 34/97/25
f 35/104/26 36/103/26 34/102/26 33/101/26
f 40/108/27 35/107/27 33/106/27 38/105/27
f 39/112/28 40/111/28 38/110/28 37/109/28
f 38/116/29 33/115/29 34/114/29 37/113/29
f 39/120/30 36/119/30 35/118/30 40/117/30
o cube
v 0.375 0.4375 0.5
v 0.375 0.4375 0.4375
v 0.375 0.3125 0.5
v 0.375 0.3125 0.4375
v -0.375 0.4375 0.4375
v -0.375 0.4375 0.5
v -0.375 0.3125 0.4375
v -0.375 0.3125 0.5
vt 0.5 0.6875
vt 0.875 0.6875
vt 0.875 0.625
vt 0.5 0.625
vt 0.4375 0.375
vt 0.46875 0.375
vt 0.46875 0.3125
vt 0.4375 0.3125
vt 0.375 0.5
vt 0.75 0.5
vt 0.75 0.4375
vt 0.375 0.4375
vt 0.46875 0.375
vt 0.5 0.375
vt 0.5 0.3125
vt 0.46875 0.3125
vt 0.375 0.375
vt 0 0.375
vt 0 0.40625
vt 0.375 0.40625
vt 0.75 0.40625
vt 0.375 0.40625
vt 0.375 0.375
vt 0.75 0.375
vn 0 0 -1
vn 1 0 0
vn 0 0 1
vn -1 0 0
vn 0 1 0
vn 0 -1 0
usemtl m_310b69c6-0a1e-9e32-b7a6-66ecfa2bc972
f 44/124/31 47/123/31 45/122/31 42/121/31
f 43/128/32 44/127/32 42/126/32 41/125/32
f 48/132/33 43/131/33 41/130/33 46/129/33
f 47/136/34 48/135/34 46/134/34 45/133/34
f 46/140/35 41/139/35 42/138/35 45/137/35
f 47/144/36 44/143/36 43/142/36 48/141/36

View file

@ -0,0 +1,95 @@
# Made in Blockbench 4.12.5
mtllib model.mtl
o cube
v 0.125 0.25 0.125
v 0.125 0.25 -0.125
v 0.125 0 0.125
v 0.125 0 -0.125
v -0.125 0.25 -0.125
v -0.125 0.25 0.125
v -0.125 0 -0.125
v -0.125 0 0.125
vt 0 1
vt 0.25 1
vt 0.25 0.75
vt 0 0.75
vt 0 0.75
vt 0.25 0.75
vt 0.25 0.5
vt 0 0.5
vt 0.25 1
vt 0.5 1
vt 0.5 0.75
vt 0.25 0.75
vt 0.25 0.75
vt 0.5 0.75
vt 0.5 0.5
vt 0.25 0.5
vt 0.25 0.25
vt 0 0.25
vt 0 0.5
vt 0.25 0.5
vt 0.75 1
vt 0.5 1
vt 0.5 0.75
vt 0.75 0.75
vn 0 0 -1
vn 1 0 0
vn 0 0 1
vn -1 0 0
vn 0 1 0
vn 0 -1 0
usemtl m_949d48e1-8451-d0f6-823c-d3fa01af52b1
f 4/4/1 7/3/1 5/2/1 2/1/1
f 3/8/2 4/7/2 2/6/2 1/5/2
f 8/12/3 3/11/3 1/10/3 6/9/3
f 7/16/4 8/15/4 6/14/4 5/13/4
f 6/20/5 1/19/5 2/18/5 5/17/5
f 7/24/6 4/23/6 3/22/6 8/21/6
o cube
v 0.0625 0 0.0625
v 0.0625 0 -0.0625
v 0.0625 -0.5 0.0625
v 0.0625 -0.5 -0.0625
v -0.0625 0 -0.0625
v -0.0625 0 0.0625
v -0.0625 -0.5 -0.0625
v -0.0625 -0.5 0.0625
vt 0.25 0.5
vt 0.375 0.5
vt 0.375 0
vt 0.25 0
vt 0.5 0.75
vt 0.625 0.75
vt 0.625 0.25
vt 0.5 0.25
vt 0.375 0.5
vt 0.5 0.5
vt 0.5 0
vt 0.375 0
vt 0.625 0.75
vt 0.75 0.75
vt 0.75 0.25
vt 0.625 0.25
vt 0.125 0.125
vt 0 0.125
vt 0 0.25
vt 0.125 0.25
vt 0.875 1
vt 0.75 1
vt 0.75 0.875
vt 0.875 0.875
vn 0 0 -1
vn 1 0 0
vn 0 0 1
vn -1 0 0
vn 0 1 0
vn 0 -1 0
usemtl m_949d48e1-8451-d0f6-823c-d3fa01af52b1
f 12/28/7 15/27/7 13/26/7 10/25/7
f 11/32/8 12/31/8 10/30/8 9/29/8
f 16/36/9 11/35/9 9/34/9 14/33/9
f 15/40/10 16/39/10 14/38/10 13/37/10
f 14/44/11 9/43/11 10/42/11 13/41/11
f 15/48/12 12/47/12 11/46/12 16/45/12

Binary file not shown.

After

Width:  |  Height:  |  Size: 276 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 266 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 301 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 277 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 444 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 322 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 418 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 292 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 B