Add the intro cutscene, a start to the map, and various other things.
|
|
@ -2,6 +2,9 @@
|
|||
minetest = core
|
||||
|
||||
artifact = {
|
||||
-- This toggles a lot of things, including whether initialization takes place,
|
||||
-- whether nodes can be pointed, and whether the player is permitted to
|
||||
-- bypass certain restrictions imposed by the story.
|
||||
debug = true
|
||||
}
|
||||
|
||||
|
|
@ -47,19 +50,38 @@ end
|
|||
|
||||
-- HACK: Lookup table for getting a rotation from a
|
||||
-- facedir (because Minetest doesn't have any way
|
||||
-- to get this)
|
||||
-- to get this information normally)
|
||||
local facedir_rotations = {
|
||||
-- +Y
|
||||
[0] = vector.new(0,0,0),
|
||||
[1] = vector.new(0, math.pi *1.5, 0),
|
||||
[2] = vector.new(0, math.pi, 0),
|
||||
[3] = vector.new(0, math.pi *0.5, 0),
|
||||
|
||||
[0] = vector.new(0, 0, 0),
|
||||
[1] = vector.new(0, math.pi * 1.5, 0),
|
||||
[2] = vector.new(0, math.pi * 1.0, 0),
|
||||
[3] = vector.new(0, math.pi * 0.5, 0),
|
||||
-- +Z
|
||||
[4] = vector.new(math.pi *1.5, 0, 0),
|
||||
[5] = vector.new(math.pi *1.5, math.pi *1.5, 0),
|
||||
[6] = vector.new(math.pi *1.5, math.pi, 0),
|
||||
[7] = vector.new(math.pi *1.5, math.pi *0.5, 0),
|
||||
[4] = vector.new(math.pi * 1.5, 0, 0),
|
||||
[5] = vector.new(0, math.pi * 1.5, math.pi * 1.5),
|
||||
[6] = vector.new(math.pi * 0.5, math.pi * 1.0, 0),
|
||||
[7] = vector.new(0, math.pi * 0.5, math.pi * 0.5),
|
||||
-- -Z
|
||||
[8] = vector.new(math.pi * 0.5, 0, 0),
|
||||
[9] = vector.new(0, math.pi * 1.5, math.pi * 0.5),
|
||||
[10] = vector.new(math.pi * 1.5, math.pi * 1.0, 0),
|
||||
[11] = vector.new(0, math.pi * 0.5, math.pi * 1.5),
|
||||
-- +X
|
||||
[12] = vector.new(0, 0, math.pi * 0.5),
|
||||
[13] = vector.new(math.pi * 1.5, math.pi * 1.5, 0),
|
||||
[14] = vector.new(0, math.pi * 1.0, math.pi * 1.5),
|
||||
[15] = vector.new(math.pi * 0.5, math.pi * 0.5, 0),
|
||||
-- -X
|
||||
[16] = vector.new(0, 0, math.pi * 1.5),
|
||||
[17] = vector.new(math.pi * 0.5, math.pi * 1.5, 0),
|
||||
[18] = vector.new(0, math.pi * 1.0, math.pi * 0.5),
|
||||
[19] = vector.new(math.pi * 1.5, math.pi * 0.5, 0),
|
||||
-- -Y
|
||||
[20] = vector.new(0, 0, math.pi * 1.0),
|
||||
[21] = vector.new(0, math.pi * 0.5, math.pi * 1.0),
|
||||
[22] = vector.new(0, math.pi * 1.0, math.pi * 1.0),
|
||||
[23] = vector.new(0, math.pi * 1.5, math.pi * 1.0),
|
||||
}
|
||||
function artifact.facedir_to_rotation(facedir)
|
||||
return facedir_rotations[facedir] or minetest.facedir_to_dir(facedir):dir_to_rotation()
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
|
||||
local ns = artifact
|
||||
|
||||
local db = minetest.get_mod_storage()
|
||||
|
||||
function ns.apply_key(m)
|
||||
m.object:set_properties {
|
||||
textures = {"artifact_key.png"},
|
||||
|
|
@ -10,6 +12,17 @@ function ns.apply_key(m)
|
|||
m.eye_height = 1.6
|
||||
-- Switch hand appearance.
|
||||
m.inv:set_stack("main", 1, ItemStack("input_"..m.character))
|
||||
if m.healthbar then
|
||||
m.object:hud_change(m.healthbar, "text", "artifact_heart.png")
|
||||
end
|
||||
m.blackrod = minetest.add_entity(m.object:get_pos(), "display")
|
||||
m.blackrod:set_properties {
|
||||
visual = "mesh",
|
||||
mesh = "artifact_blackrod.obj",
|
||||
textures = {"artifact_blackrod.png"},
|
||||
visual_size = vector.new(1,1,1) *10
|
||||
}
|
||||
m.blackrod:set_attach(m.object, "RightArm", vector.new(0.25, -5.5, 0), vector.new(90,0,0))
|
||||
end
|
||||
|
||||
function ns.apply_vix(m)
|
||||
|
|
@ -21,19 +34,135 @@ function ns.apply_vix(m)
|
|||
m.eye_height = 1.5
|
||||
-- Switch hand appearance.
|
||||
m.inv:set_stack("main", 1, ItemStack("input_"..m.character))
|
||||
m.object:hud_change(m.healthbar, "text", "artifact_heart_vix.png")
|
||||
if m.blackrod then
|
||||
m.blackrod:remove()
|
||||
m.blackrod = nil
|
||||
end
|
||||
end
|
||||
|
||||
function ns.swap_character(m)
|
||||
if m.character == "vix" then
|
||||
artifact.sidekick.character = "vix"
|
||||
m:set_character("key")
|
||||
ns.apply_key(m)
|
||||
else
|
||||
artifact.sidekick.character = "key"
|
||||
m:set_character("vix")
|
||||
ns.apply_vix(m)
|
||||
end
|
||||
|
||||
if artifact.sidekick.ref then
|
||||
-- `m.pos` includes eye_height, and we don't want that here.
|
||||
local pos = m.object:get_pos()
|
||||
local yaw = m.yaw
|
||||
local pitch = m.pitch
|
||||
m.object:set_pos(artifact.sidekick.ref.object:get_pos())
|
||||
m.object:set_look_horizontal(artifact.sidekick.yaw)
|
||||
m.object:set_look_vertical(artifact.sidekick.pitch)
|
||||
artifact.sidekick.ref.object:set_pos(pos)
|
||||
artifact.sidekick.ref.object:set_yaw(yaw)
|
||||
artifact.sidekick.ref.object:set_bone_override("Head", m.object:get_bone_override("Head"))
|
||||
artifact.sidekick.ref.object:set_bone_override("root", m.object:get_bone_override("root"))
|
||||
artifact.sidekick.pos = pos
|
||||
artifact.sidekick.yaw = yaw
|
||||
artifact.sidekick.pitch = pitch
|
||||
|
||||
local e = artifact.sidekick.ref
|
||||
if artifact.sidekick.character == "vix" then
|
||||
artifact.sidekick.ref.object:set_properties {
|
||||
textures = {"artifact_vix.png"},
|
||||
visual_size = vector.new(1,1,1) *0.8
|
||||
}
|
||||
if e.blackrod then
|
||||
e.blackrod:remove()
|
||||
end
|
||||
else
|
||||
e.object:set_properties {
|
||||
textures = {"artifact_key.png"},
|
||||
visual_size = vector.new(1,1,1) *0.88
|
||||
}
|
||||
e.blackrod = minetest.add_entity(e.object:get_pos(), "display")
|
||||
e.blackrod:set_properties {
|
||||
visual = "mesh",
|
||||
mesh = "artifact_blackrod.obj",
|
||||
textures = {"artifact_blackrod.png"},
|
||||
visual_size = vector.new(1,1,1) *10
|
||||
}
|
||||
e.blackrod:set_attach(e.object, "RightArm", vector.new(0.25, -5.5, 0), vector.new(90,0,0))
|
||||
end
|
||||
end
|
||||
artifact.sidekick.save()
|
||||
end
|
||||
|
||||
|
||||
|
||||
include "key.lua"
|
||||
include "vix.lua"
|
||||
|
||||
artifact.sidekick = setmetatable(minetest.deserialize(db:get("sidekick") or "return nil") or {
|
||||
pos = vector.zero(),
|
||||
pitch = 0,
|
||||
yaw = 0,
|
||||
character = "vix",
|
||||
}, {
|
||||
__index = {
|
||||
save = function()
|
||||
local ref = artifact.sidekick.ref
|
||||
-- Temporarily erase the entity so we can serialize properly.
|
||||
artifact.sidekick.ref = nil
|
||||
db:set_string("sidekick", minetest.serialize(artifact.sidekick))
|
||||
artifact.sidekick.ref = ref
|
||||
end
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_entity(":artifact:sidekick", {
|
||||
initial_properties = {
|
||||
visual = "mesh",
|
||||
mesh = "artifact_character.gltf",
|
||||
textures = {"artifact_key.png"},
|
||||
physical = true,
|
||||
collisionbox = {
|
||||
-0.3, 0,-0.3,
|
||||
0.3, 1.77, 0.3
|
||||
}
|
||||
},
|
||||
_interact_marker_offset = function() return vector.new(0, 1.1,0) end,
|
||||
_interact_time = 0.4,
|
||||
on_activate = function(e, data)
|
||||
if data then
|
||||
extend(e, minetest.deserialize(data) or {})
|
||||
end
|
||||
if artifact.sidekick.character == "vix" then
|
||||
e.object:set_properties {
|
||||
textures = {"artifact_key.png"},
|
||||
visual_size = vector.new(1,1,1) *0.88
|
||||
}
|
||||
end
|
||||
-- Gravity.
|
||||
e.object:set_acceleration(vector.new(0,-9.81,0))
|
||||
-- Make quite sure that we only ever have one of these.
|
||||
-- Remove this one because the first one we spawned is _probably_ the
|
||||
-- right one (e.g. if someone got unloaded, then loaded again after
|
||||
-- a replacement was spawned).
|
||||
if artifact.sidekick.ref then
|
||||
e.object:remove()
|
||||
return
|
||||
else
|
||||
artifact.sidekick.ref = e
|
||||
end
|
||||
end,
|
||||
on_deactivate = function(e)
|
||||
artifact.sidekick.ref = nil
|
||||
end,
|
||||
get_staticdata = function(e)
|
||||
return minetest.serialize{
|
||||
cahracter = e.character
|
||||
}
|
||||
end,
|
||||
on_interact = function(e, m)
|
||||
ns.swap_character(m)
|
||||
end
|
||||
})
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +1,6 @@
|
|||
|
||||
local ns = artifact
|
||||
|
||||
|
||||
function ns.do_whack(m)
|
||||
|
||||
end
|
||||
|
|
@ -1,2 +1,2 @@
|
|||
name = artifact_characters
|
||||
depends = artifact_story
|
||||
depends = artifact_base
|
||||
49
mods/artifact_characters/models/artifact_blackrod.obj
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
# Made in Blockbench 4.12.5
|
||||
mtllib artifact_blackrod.mtl
|
||||
|
||||
o cube
|
||||
v 0.03125000000000003 1 0.03125
|
||||
v 0.03125000000000003 1 -0.03125
|
||||
v 0.03125000000000003 -0.75 0.03125
|
||||
v 0.03125000000000003 -0.75 -0.03125
|
||||
v -0.03125 1 -0.03125
|
||||
v -0.03125 1 0.03125
|
||||
v -0.03125 -0.75 -0.03125
|
||||
v -0.03125 -0.75 0.03125
|
||||
vt 0 1
|
||||
vt 0.03125 1
|
||||
vt 0.03125 0.125
|
||||
vt 0 0.125
|
||||
vt 0.03125 1
|
||||
vt 0.0625 1
|
||||
vt 0.0625 0.125
|
||||
vt 0.03125 0.125
|
||||
vt 0.0625 1
|
||||
vt 0.09375 1
|
||||
vt 0.09375 0.125
|
||||
vt 0.0625 0.125
|
||||
vt 0.09375 1
|
||||
vt 0.125 1
|
||||
vt 0.125 0.125
|
||||
vt 0.09375 0.125
|
||||
vt 0.15625 0.96875
|
||||
vt 0.125 0.96875
|
||||
vt 0.125 1
|
||||
vt 0.15625 1
|
||||
vt 0.15625 0.96875
|
||||
vt 0.125 0.96875
|
||||
vt 0.125 0.9375
|
||||
vt 0.15625 0.9375
|
||||
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_99dd5155-5cc9-5980-76ce-3093fe3734a6
|
||||
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
|
||||
BIN
mods/artifact_characters/textures/artifact_blackrod.png
Normal file
|
After Width: | Height: | Size: 133 B |
|
|
@ -0,0 +1,99 @@
|
|||
local ns = artifact
|
||||
|
||||
minetest.register_entity(":artifact:burst", {
|
||||
initial_properties = {
|
||||
visual = "sprite",
|
||||
textures = {"blank.png"},
|
||||
pointable = false,
|
||||
physical = true,
|
||||
collide_with_objects = false,
|
||||
collisionbox = {
|
||||
-0.2, -0.2, -0.2,
|
||||
0.2, 0.2, 0.2
|
||||
},
|
||||
static_save = false,
|
||||
},
|
||||
on_activate = function(e, rot)
|
||||
e.object:set_armor_groups{immortal = 1}
|
||||
end,
|
||||
on_deactivate = function(e)
|
||||
for _, x in ipairs(e._particles) do
|
||||
minetest.delete_particlespawner(x)
|
||||
end
|
||||
end,
|
||||
on_step = function(e, dtime, movement)
|
||||
if movement.collides then
|
||||
minetest.add_particlespawner {
|
||||
pos = e.object:get_pos(),
|
||||
radius = 0.1,
|
||||
texture = {
|
||||
name = "artifact_light.png",
|
||||
alpha_tween = {1, 0}
|
||||
},
|
||||
glow = 8,
|
||||
size_tween = {
|
||||
{min = 2, max = 3},
|
||||
{min = 4, max = 5}
|
||||
},
|
||||
attract = {
|
||||
kind = "point",
|
||||
strength = {
|
||||
min = -50,
|
||||
max = -20,
|
||||
},
|
||||
origin = e.object:get_pos()
|
||||
},
|
||||
amount = 25,
|
||||
exptime = 0.5,
|
||||
drag = 1,
|
||||
time = 0.1,
|
||||
}
|
||||
e.object:remove()
|
||||
end
|
||||
end,
|
||||
impulse = function(e, vel)
|
||||
-- The documentation said that `vel` is relative to the parent entity...
|
||||
-- I guess the documentation is wrong?
|
||||
local rot = vel:normalize():dir_to_rotation()
|
||||
local min, max = vector.sort(vector.new(-1,-1,-1):rotate(rot), vector.new(1,1,0):rotate(rot))
|
||||
e._particles = {
|
||||
-- Tail
|
||||
minetest.add_particlespawner {
|
||||
attached = e.object,
|
||||
pos = {
|
||||
min = vector.new(-1,-1,-1) *0.2,
|
||||
max = vector.new(1,1,1) *0.2
|
||||
},
|
||||
vel = {
|
||||
min = min,
|
||||
max = max
|
||||
},
|
||||
texture = {
|
||||
name = "artifact_light.png",
|
||||
alpha_tween = {1, 0}
|
||||
},
|
||||
size = 0.4,
|
||||
glow = 10,
|
||||
amount = 450,
|
||||
time = 0
|
||||
},
|
||||
-- Head
|
||||
minetest.add_particlespawner {
|
||||
attached = e.object,
|
||||
pos = vector.zero(),
|
||||
vel = vel,
|
||||
texture = "[fill:16x16:0,0:#fff",
|
||||
size = 3,
|
||||
glow = 14,
|
||||
amount = 150,
|
||||
time = 0,
|
||||
exptime = 0.1
|
||||
}
|
||||
}
|
||||
e.object:set_velocity(vel)
|
||||
end
|
||||
})
|
||||
|
||||
function ns.do_shoot(m)
|
||||
minetest.add_entity(m.pos +m.dir, "artifact:burst", tostring(m.yaw)):get_luaentity():impulse(m.dir *30)
|
||||
end
|
||||
2
mods/artifact_help/mod.conf
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
name = artifact_help
|
||||
depends = artifact_hud
|
||||
|
|
@ -50,7 +50,7 @@ local function interpolate(ref, target, t, x1, y1, x2, y2)
|
|||
local eased_t = bezier_ease(t, x1 or 0, y1 or 0, x2 or 1, y2 or 1)
|
||||
return ref + (target - ref) * eased_t
|
||||
end
|
||||
|
||||
artifact.interpolate = interpolate
|
||||
|
||||
function ns.register_hud_type(def)
|
||||
ns.hud_types[def.name] = setmetatable(def, {__index = ns.Element})
|
||||
|
|
@ -184,7 +184,7 @@ minetest.register_globalstep(function(dtime)
|
|||
end)
|
||||
|
||||
function ns.color_to_number(color)
|
||||
return tonumber(string.format("0x%.2x%.2x%.2x%.2x", color.r, color.g, color.b, color.a))
|
||||
return tonumber(string.format("0x%.2x%.2x%.2x", color.r, color.g, color.b))
|
||||
end
|
||||
|
||||
ns.register_hud_type {
|
||||
|
|
@ -193,12 +193,14 @@ ns.register_hud_type {
|
|||
field_types = {
|
||||
offset = "vec2",
|
||||
pos = "vec2",
|
||||
size = "vec2",
|
||||
color = "color"
|
||||
},
|
||||
defaults = {
|
||||
dir = 0,
|
||||
align = {x=0, y=0},
|
||||
offset = {x=0, y=0},
|
||||
size = {x=1, y=1},
|
||||
color = {r = 0xff, g = 0xff, b = 0xff, a = 0xff}
|
||||
},
|
||||
add = function(e, m)
|
||||
|
|
@ -209,6 +211,7 @@ ns.register_hud_type {
|
|||
alignment = e.align,
|
||||
offset = e.offset,
|
||||
scale = {x=100, y=100},
|
||||
size = e.size,
|
||||
text = e.text,
|
||||
number = ns.color_to_number(e.color)
|
||||
}
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 169 B After Width: | Height: | Size: 167 B |
|
|
@ -77,6 +77,20 @@ artifact.register_node("lever", {
|
|||
paramtype = "light",
|
||||
sunlight_propagates = true,
|
||||
paramtype2 = "facedir",
|
||||
collision_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
-3/16, -0.5, -4/16,
|
||||
3/16, -3/16, 4/16
|
||||
}
|
||||
},
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
-3/16, -0.5, -4/16,
|
||||
3/16, -3/16, 4/16
|
||||
}
|
||||
},
|
||||
pointable = false,
|
||||
on_construct = function(pos)
|
||||
local m = minetest.get_meta(pos)
|
||||
|
|
|
|||
|
|
@ -44,9 +44,6 @@ minetest.register_entity(":artifact:door", {
|
|||
e.rotation.y = e.rotation.y +math.pi
|
||||
e:rotate(e.rotation)
|
||||
end
|
||||
if e._locked then
|
||||
e._no_interact = true
|
||||
end
|
||||
e._name = ""..math.random()
|
||||
local nm = minetest.get_meta(e.object:get_pos())
|
||||
if (node.name:find "_open") and not e._open then
|
||||
|
|
@ -54,6 +51,12 @@ minetest.register_entity(":artifact:door", {
|
|||
elseif not (node.name:find "_open") and e._open then
|
||||
e:close(true)
|
||||
end
|
||||
if nm:get_string("locked") == "true" then
|
||||
e._locked = true
|
||||
end
|
||||
if e._locked then
|
||||
e._no_interact = true
|
||||
end
|
||||
doors[e.object:get_pos():round():to_string()] = e
|
||||
end,
|
||||
on_deactivate = function(e)
|
||||
|
|
|
|||
0
mods/artifact_mechanisms/fields.lua
Normal file
|
|
@ -1,6 +1,8 @@
|
|||
|
||||
minetest.register_entity(":display", {
|
||||
initial_properties = {
|
||||
visual = "sprite",
|
||||
textures = {"blank.png"},
|
||||
pointable = false,
|
||||
static_save = false
|
||||
},
|
||||
|
|
@ -30,6 +32,7 @@ end
|
|||
|
||||
include "basics.lua"
|
||||
include "doors.lua"
|
||||
include "large_doors.lua"
|
||||
include "chest.lua"
|
||||
|
||||
|
||||
|
|
@ -58,28 +61,35 @@ function artifact.load_schematic(dst, path, rot)
|
|||
end
|
||||
end
|
||||
|
||||
|
||||
minetest.register_entity(":test", {
|
||||
initial_properties = {
|
||||
static_save = false,
|
||||
visual = "mesh",
|
||||
mesh = "artifact_character.gltf",
|
||||
},
|
||||
on_activate = function(e)
|
||||
-- e.object:set_bone_override("root", {
|
||||
-- position = {vec = vector.new(15,15,15)}
|
||||
-- })
|
||||
end,
|
||||
on_rightclick = function(e, p)
|
||||
local v = vector.new(0, p:get_properties().eye_height *10, 0)
|
||||
p:set_eye_offset(v,v,v)
|
||||
p:set_attach(e.object, "Head")
|
||||
end,
|
||||
on_punch = function(e, p)
|
||||
p:set_detach()
|
||||
function artifact.get_schem_size(path)
|
||||
local f = io.open(path..".mts", "rb")
|
||||
|
||||
local function read_u16(file)
|
||||
local data = file:read(2)
|
||||
if not data or #data < 2 then return nil end
|
||||
local a, b = data:byte(1, 2)
|
||||
return a + b
|
||||
end
|
||||
local magic = f:read(4)
|
||||
if magic ~= "MTSM" then
|
||||
f:close()
|
||||
error("Not a valid .mts file (missing` MTSM` header).")
|
||||
end
|
||||
})
|
||||
|
||||
local version = read_u16(f)
|
||||
if not version or version > 4 then
|
||||
f:close()
|
||||
error("Unsupported .mts version: "..tostring(version))
|
||||
end
|
||||
|
||||
local size_x = read_u16(f)
|
||||
local size_y = read_u16(f)
|
||||
local size_z = read_u16(f)
|
||||
|
||||
f:close()
|
||||
|
||||
return vector.new(size_x, size_y, size_z)
|
||||
end
|
||||
|
||||
if artifact.debug then
|
||||
|
||||
|
|
@ -103,6 +113,32 @@ if artifact.debug then
|
|||
}
|
||||
},
|
||||
})
|
||||
minetest.override_item("testtools:remover", {
|
||||
pointabilities = {
|
||||
nodes = {
|
||||
-- This gets added to everything in debug mode.
|
||||
["group:dig_immediate"] = true,
|
||||
air = false,
|
||||
},
|
||||
objects = {
|
||||
-- The display entities should all be immortal.
|
||||
["group:immortal"] = false
|
||||
}
|
||||
},
|
||||
})
|
||||
minetest.override_item("testtools:node_meta_editor", {
|
||||
pointabilities = {
|
||||
nodes = {
|
||||
-- This gets added to everything in debug mode.
|
||||
["group:dig_immediate"] = true,
|
||||
air = false,
|
||||
},
|
||||
objects = {
|
||||
-- The display entities should all be immortal.
|
||||
["group:immortal"] = false
|
||||
}
|
||||
},
|
||||
})
|
||||
minetest.override_item("testtools:param2tool", {
|
||||
pointabilities = {
|
||||
nodes = {
|
||||
|
|
|
|||
0
mods/artifact_mechanisms/large_doors.lua
Normal file
|
|
@ -36,27 +36,68 @@ Player = setmetatable({
|
|||
shaded = false
|
||||
}
|
||||
|
||||
p:hud_set_flags {
|
||||
healthbar = false,
|
||||
breathbar = false,
|
||||
hotbar = artifact.debug,
|
||||
minimap = false,
|
||||
basic_debug = artifact.debug,
|
||||
crosshair = false, -- It gets set to true once we can play.
|
||||
wielditem = false, -- Ditto.
|
||||
chat = false, -- We provide our own implementation of the chat HUD.
|
||||
}
|
||||
|
||||
-- The following exists to make sure that whatever physics
|
||||
-- settings the server may have set are transparently ignored.
|
||||
local defaults = {
|
||||
speed_walk = 4,
|
||||
speed_crouch = 1.35,
|
||||
speed_fast = 20,
|
||||
speed_climb = 3,
|
||||
speed_jump = 6.5,
|
||||
gravity = 9.81,
|
||||
liquid_fluidity = 1,
|
||||
liquid_fluidity_smooth = 0.5,
|
||||
liquid_sink = 10,
|
||||
acceleration_default = 3,
|
||||
acceleration_air = 2,
|
||||
acceleration_fast = 10,
|
||||
}
|
||||
|
||||
local override = {
|
||||
speed = 1,
|
||||
sneak = true,
|
||||
sneak_glitch = false,
|
||||
new_move = true,
|
||||
}
|
||||
|
||||
for key, def_value in pairs(defaults) do
|
||||
local setting_name = "movement_"..key
|
||||
local current = tonumber(minetest.settings:get(setting_name)) or def_value
|
||||
override[key] = def_value /current
|
||||
end
|
||||
|
||||
p:set_physics_override(override)
|
||||
|
||||
-- No unreasonable FOV settings here.
|
||||
p:set_fov(72)
|
||||
|
||||
m.hud = {}
|
||||
m.poi = {}
|
||||
m.chat = {}
|
||||
|
||||
if not artifact.debug then
|
||||
p:set_inventory_formspec ""
|
||||
end
|
||||
|
||||
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,
|
||||
chat = false, -- We provide our own implementation of the chat HUD.
|
||||
}
|
||||
|
||||
m.hud = {}
|
||||
m.poi = {}
|
||||
m.chat = {}
|
||||
m:create_hud()
|
||||
|
||||
m:set_hotbar_size(8)
|
||||
-- Let us build in debug mode, but ensure we always wield the hand item otherwise.
|
||||
m:set_hotbar_size(artifact.debug and 8 or 1)
|
||||
|
||||
m.ctl = p:get_player_control()
|
||||
|
||||
|
|
@ -74,6 +115,11 @@ Player = setmetatable({
|
|||
m.pos = pos
|
||||
m.pos.y = m.pos.y +m.eye_height
|
||||
|
||||
local state = artifact.story.get_state()
|
||||
|
||||
-- Sleep if we are not yet ready for the player to do things.
|
||||
if not artifact.debug and state <= artifact.story.states.init then return end
|
||||
|
||||
-- MARK: Pointing callbacks
|
||||
|
||||
local pointed_found = nil
|
||||
|
|
@ -221,7 +267,8 @@ Player = setmetatable({
|
|||
|
||||
-- MARK: Radial menu handling
|
||||
|
||||
if ctl.place and not m.ctl.place and wi:get_name():find "artifact:input" and (not m.pointed_obj or m.pointed_obj._no_interact) then
|
||||
-- This should only work once we have Vix, since we can't use it without her.
|
||||
if state >= artifact.story.states.main and ctl.place and not m.ctl.place and wi:get_name():find "artifact:input" and (not m.pointed_obj or m.pointed_obj._no_interact) then
|
||||
artifact.show_radial_menu(m, {
|
||||
name = "construct",
|
||||
"test",
|
||||
|
|
@ -288,26 +335,33 @@ Player = setmetatable({
|
|||
end
|
||||
end
|
||||
|
||||
-- MARK: Health regen
|
||||
|
||||
if m.next_regen and time -m.next_regen >= 0 then
|
||||
m.object:set_hp(m.object:get_hp() +1)
|
||||
end
|
||||
|
||||
m.ctl = ctl
|
||||
m.yaw = yaw
|
||||
m.pitch = pitch
|
||||
m.dir = dir
|
||||
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)
|
||||
add_health_bar = function(m)
|
||||
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},
|
||||
offset = {x=-27 *5,y=artifact.debug and -96 or -40},
|
||||
scale = {x=4,y=4},
|
||||
alignment = {x=-1, y=-1},
|
||||
size = {x=27,y=27},
|
||||
text = "artifact_heart_vix.png",
|
||||
text = m.character == "vix" and "artifact_heart_vix.png" or "artifact_heart.png",
|
||||
text2 = "artifact_heart_bg.png",
|
||||
number = 20
|
||||
number = 20,
|
||||
item = 20,
|
||||
}
|
||||
end,
|
||||
set_hotbar_size = function(m, slots)
|
||||
|
|
@ -326,6 +380,21 @@ Player = setmetatable({
|
|||
end
|
||||
})
|
||||
|
||||
-- Mirror the player's HP in our custom HUD.
|
||||
-- (We need a custom HUD so that we can change its appearance dynamically.)
|
||||
minetest.register_on_player_hpchange(function(p, delta)
|
||||
local m = artifact.players[p:get_player_name()]
|
||||
local hp = p:get_hp() +delta
|
||||
if m.healthbar then
|
||||
p:hud_change(m.healthbar, "number", hp)
|
||||
end
|
||||
if hp < 20 then
|
||||
m.next_regen = minetest.get_us_time() +5000000
|
||||
else
|
||||
m.next_regen = nil
|
||||
end
|
||||
end)
|
||||
|
||||
local _hand = minetest.registered_items[""]
|
||||
|
||||
function artifact.register_input(name)
|
||||
|
|
@ -347,10 +416,18 @@ function artifact.register_input(name)
|
|||
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
|
||||
if artifact.debug or artifact.story.get_state() > artifact.story.states.pre_vix then
|
||||
artifact.swap_character(m)
|
||||
end
|
||||
return s
|
||||
end,
|
||||
on_use = function(s, p)
|
||||
local m = artifact.players[p:get_player_name()]
|
||||
if m.character == "vix" then
|
||||
artifact.do_shoot(m)
|
||||
else
|
||||
artifact.do_whack(m)
|
||||
end
|
||||
end
|
||||
})
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,19 +1,49 @@
|
|||
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
|
||||
"loading", -- Mapgen is not yet complete.
|
||||
"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.
|
||||
},
|
||||
poi = {
|
||||
initial_cutscene = {
|
||||
start_pos = vector.new(0, 0, 0),
|
||||
end_pos = vector.new(0,0,0)
|
||||
}
|
||||
}
|
||||
}
|
||||
local ns = artifact.story
|
||||
local db = minetest.get_mod_storage()
|
||||
|
||||
local state = db:get_int("state") -- Defaults to zero, i.e. "loading".
|
||||
artifact.origin = vector.from_string(db:get("origin") or "(0,0,0)")
|
||||
|
||||
function ns.set_state(to)
|
||||
if artifact.debug then state = ns.states.main end
|
||||
|
||||
function ns.enter_init_state()
|
||||
ns.play_intro_cutscene()
|
||||
end
|
||||
|
||||
|
||||
function ns.enter_pre_vix_state()
|
||||
for _, m in pairs(artifact.players) do
|
||||
m:add_health_bar()
|
||||
m.object:hud_set_flags {
|
||||
crosshair = true,
|
||||
wielditem = true,
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
function ns.enter_state(to)
|
||||
state = to
|
||||
minetest.log("State changed to "..to..".")
|
||||
if state == ns.states.init then
|
||||
ns.enter_init_state()
|
||||
elseif state == ns.states.pre_vix then
|
||||
ns.enter_pre_vix_state()
|
||||
end
|
||||
db:set_int("state", state)
|
||||
end
|
||||
|
||||
|
|
@ -21,12 +51,330 @@ function ns.get_state()
|
|||
return state
|
||||
end
|
||||
|
||||
function ns.before_state(target)
|
||||
|
||||
-- Used for marking the start position in schematics.
|
||||
-- Disappears when not in debug mode.
|
||||
artifact.register_node("start_pos", {
|
||||
drawtype = not artifact.debug and "airlike" or nil,
|
||||
paramtype = "light",
|
||||
walkable = artifact.debug or false,
|
||||
pointable = artifact.debug or false,
|
||||
tiles = {artifact.debug and "artifact_start_pos.png" or "blank.png"}
|
||||
})
|
||||
|
||||
function artifact.look_at(m, pos, pos2)
|
||||
local rot = (pos2 and pos or m.object:get_pos()):direction(pos2 or pos):dir_to_rotation()
|
||||
m.object:set_look_horizontal(rot.y)
|
||||
-- Pitch seems to be flipped on the player?
|
||||
m.object:set_look_vertical(-rot.x)
|
||||
end
|
||||
|
||||
minetest.register_globalstep(function()
|
||||
if state == "init" then
|
||||
|
||||
|
||||
minetest.register_chatcommand("splash", {
|
||||
func = function(name)
|
||||
local m = artifact.players[name]
|
||||
minetest.show_formspec(m.name, "artifact:lock_camera", [[
|
||||
formspec_version[10]
|
||||
size[32,18]
|
||||
padding[0,0]
|
||||
bgcolor[#000]
|
||||
animated_image[0,0;32,18;;artifact_splash.png;60;100;;]
|
||||
]])
|
||||
end
|
||||
})
|
||||
|
||||
-- Play the opening cutscene.
|
||||
function ns.play_intro_cutscene()
|
||||
ns.camera = minetest.add_entity(artifact.origin:offset(0,-0.75,0), "display")
|
||||
ns.scene = minetest.add_entity(artifact.origin:offset(-2.25,-0.5,7 -1/16), "display")
|
||||
ns.scene:set_properties {
|
||||
visual = "mesh",
|
||||
mesh = "artifact_cutscene_a.gltf",
|
||||
textures = {"artifact_key.png", "artifact_statue.png"}
|
||||
}
|
||||
ns.scene:set_animation({x=0,y=25}, 1, 0.1, false)
|
||||
for _, m in pairs(artifact.players) do
|
||||
m.object:set_attach(ns.camera)
|
||||
minetest.show_formspec(m.name, "artifact:lock_camera", [[
|
||||
formspec_version[10]
|
||||
size[32,18]
|
||||
padding[0,0]
|
||||
allow_close[false]
|
||||
bgcolor[#0000]
|
||||
]])
|
||||
m.object:set_look_vertical(0)
|
||||
m.object:set_look_horizontal(0)
|
||||
end
|
||||
-- Begin mess.
|
||||
minetest.after(17, function()
|
||||
for x = -1, 1 do
|
||||
for z = -1, 1 do
|
||||
minetest.remove_node(artifact.origin:offset(x, -1, z -5))
|
||||
minetest.add_particlespawner {
|
||||
pos = {
|
||||
min = artifact.origin:offset(x -0.5, -1, z -5 -0.5),
|
||||
max = artifact.origin:offset(x +0.5, -0.5, z -5 +0.5)
|
||||
},
|
||||
vel = {
|
||||
min = vector.new(-1, 0, -1) *1.5,
|
||||
max = vector.new(1, 2, 1) *1.5
|
||||
},
|
||||
acc = vector.new(0,-9.81,0),
|
||||
collisiondetection = true,
|
||||
amount = 50,
|
||||
node = {name = "artifact:stone_tile_brown"},
|
||||
time = 0.1
|
||||
}
|
||||
end
|
||||
end
|
||||
end)
|
||||
minetest.after(3.5, function()
|
||||
-- Slowly move back as Key walks forward.
|
||||
ns.camera:set_acceleration(vector.new(0,0,-0.5))
|
||||
minetest.after(1, function()
|
||||
-- Decelerate before switching angles, for smoothness.
|
||||
ns.camera:set_acceleration(vector.new(0,0,0.3))
|
||||
end)
|
||||
minetest.after(2, function()
|
||||
ns.camera:set_acceleration(vector.zero())
|
||||
ns.camera:set_velocity(vector.zero())
|
||||
ns.camera:set_pos(artifact.origin:offset(-5, 3, -4))
|
||||
for _, m in pairs(artifact.players) do
|
||||
artifact.look_at(m, ns.camera:get_pos(), artifact.origin:offset(0,0,1))
|
||||
end
|
||||
local time = minetest.get_us_time()
|
||||
-- Pan to follow Key as he moves toward the pedestal.
|
||||
local function interpolate()
|
||||
local fac = (minetest.get_us_time() -time) /4000000
|
||||
local offset = artifact.interpolate(1, 4, fac)
|
||||
for _, m in pairs(artifact.players) do
|
||||
artifact.look_at(m, ns.camera:get_pos(), artifact.origin:offset(0,0,-offset))
|
||||
end
|
||||
-- Do a globalstep callback the lazy way.
|
||||
if fac < 1 then minetest.after(0, interpolate) end
|
||||
end
|
||||
minetest.after(0, interpolate)
|
||||
minetest.after(4, function()
|
||||
-- Dramatically move backward as Key stares at the statue.
|
||||
ns.camera:set_pos(artifact.origin:offset(-0.2, -0.5, -9))
|
||||
ns.camera:set_velocity(vector.new(0,0,-0.5))
|
||||
for _, m in pairs(artifact.players) do
|
||||
m.object:set_look_vertical(0)
|
||||
m.object:set_look_horizontal(0)
|
||||
end
|
||||
minetest.after(6, function()
|
||||
-- Cut back to where we were before, so we get a good view of Key falling in the hole.
|
||||
ns.camera:set_pos(artifact.origin:offset(-5, 3, -4))
|
||||
ns.camera:set_velocity(vector.new(0,0,0))
|
||||
for _, m in pairs(artifact.players) do
|
||||
artifact.look_at(m, ns.camera:get_pos(), artifact.origin:offset(0,0,-4))
|
||||
end
|
||||
minetest.after(3, function()
|
||||
-- Show epic splash animation while Key finishes falling down the hole.
|
||||
for _, m in pairs(artifact.players) do
|
||||
artifact.hud_add(m, {
|
||||
type = "image",
|
||||
name = "background",
|
||||
pos = {x=0.5,y=0.5},
|
||||
scale = {x=1000,y=1000},
|
||||
image = "[fill:16x16:0,0:#000",
|
||||
opacity = 0
|
||||
})
|
||||
m.hud.background:animate {
|
||||
opacity = {
|
||||
value = 256,
|
||||
duration = 0.3
|
||||
}
|
||||
}
|
||||
end
|
||||
minetest.after(0.3, function()
|
||||
for _, m in pairs(artifact.players) do
|
||||
minetest.show_formspec(m.name, "artifact:lock_camera", [[
|
||||
formspec_version[10]
|
||||
size[32,18]
|
||||
padding[0,0]
|
||||
allow_close[false]
|
||||
bgcolor[#0000]
|
||||
animated_image[0,0;32,18;;artifact_splash.png;60;100;;]
|
||||
]])
|
||||
end
|
||||
end)
|
||||
minetest.after(6.3, function()
|
||||
for _, m in pairs(artifact.players) do
|
||||
minetest.show_formspec(m.name, "artifact:lock_camera", [[
|
||||
formspec_version[10]
|
||||
size[32,18]
|
||||
padding[0,0]
|
||||
allow_close[false]
|
||||
bgcolor[#0000]
|
||||
]])
|
||||
m.hud.background:animate {
|
||||
opacity = {
|
||||
value = 0,
|
||||
duration = 0.3
|
||||
}
|
||||
}
|
||||
m.hud.background.remove_after = 0.3
|
||||
end
|
||||
ns.camera:set_pos(artifact.origin:offset(-1, -73, -6))
|
||||
ns.camera:set_velocity(vector.new(0,0,0))
|
||||
for _, m in pairs(artifact.players) do
|
||||
artifact.look_at(m, ns.camera:get_pos(), artifact.origin:offset(1, -74, -3))
|
||||
end
|
||||
ns.scene:remove()
|
||||
ns.scene = minetest.add_entity(artifact.origin:offset(-1, -73.5, -6), "display")
|
||||
ns.scene:set_properties {
|
||||
visual = "mesh",
|
||||
mesh = "artifact_cutscene_b.gltf",
|
||||
textures = {"artifact_key.png", "artifact_blackrod.png"}
|
||||
}
|
||||
minetest.after(0.3, function()
|
||||
artifact.push_chat_message("Ow.", "Key", "artifact_key_splash_low.png")
|
||||
minetest.after(1, function()
|
||||
ns.scene:set_animation({x=0,y=25}, 1, 0.1, false)
|
||||
end)
|
||||
minetest.after(9, function()
|
||||
artifact.push_chat_message("Interesting...", "Key", "artifact_key_splash_low.png")
|
||||
end)
|
||||
minetest.after(13, function()
|
||||
ns.scene:remove()
|
||||
for _, m in pairs(artifact.players) do
|
||||
m.object:set_detach()
|
||||
minetest.close_formspec(m.name, "artifact:lock_camera")
|
||||
m.object:set_pos(artifact.origin:offset(0, -73.5, -4))
|
||||
artifact.look_at(m, ns.camera:get_pos(), artifact.origin:offset(0, -73.5, -8))
|
||||
end
|
||||
ns.enter_state(ns.states.pre_vix)
|
||||
minetest.after(3, function()
|
||||
artifact.push_chat_message("Interesting...", "Key", "artifact_key_splash_low.png")
|
||||
end)
|
||||
end)
|
||||
end)
|
||||
end)
|
||||
end)
|
||||
end)
|
||||
end)
|
||||
end)
|
||||
end)
|
||||
-- End mess.
|
||||
end
|
||||
|
||||
-- Do mapgen. This isn't technically story-related, but it's here
|
||||
-- anyway because we only need to do it for state == "loading"
|
||||
-- and it's the only mapgen we do.
|
||||
function ns.load_map()
|
||||
-- Notify the player that we must mapgen first.
|
||||
for _, m in pairs(artifact.players) do
|
||||
artifact.hud_add(m, {
|
||||
type = "image",
|
||||
name = "loading_map_bg",
|
||||
pos = {x=0.5,y=0.5},
|
||||
scale = {x=1000,y=1000}, -- Cover the whole window without having to get the window size.
|
||||
image = "[fill:16x16:0,0:#000"
|
||||
})
|
||||
artifact.hud_add(m, {
|
||||
type = "text",
|
||||
name = "loading_map",
|
||||
text = "Loading map...",
|
||||
pos = {x=0.5,y=0.5},
|
||||
size = {x=3,y=0},
|
||||
color = minetest.colorspec_to_table("#000")
|
||||
})
|
||||
m.hud.loading_map:animate {
|
||||
color = {
|
||||
value = minetest.colorspec_to_table("#888"),
|
||||
duration = 0.3,
|
||||
}
|
||||
}
|
||||
end
|
||||
-- Make sure the loading HUD fades in first.
|
||||
minetest.after(0.3, function()
|
||||
-- Emerge the area so we have something to write to.
|
||||
-- This is one of the relatively few cases where the
|
||||
-- Promise API is actually more than a little helpful,
|
||||
-- because we can simply 'yield' until the emerge is
|
||||
-- completely finished in a semi-clean way.
|
||||
Promise(function(r)
|
||||
minetest.emerge_area(vector.new(-1,-1,-1) *100, vector.new(1, 1, 1) *100, function(bpos, action, remaining) if remaining == 0 then r() end end)
|
||||
end).after(function()
|
||||
for _, m in pairs(artifact.players) do
|
||||
m.hud.loading_map:animate {
|
||||
color = {
|
||||
value = minetest.colorspec_to_table("#000"),
|
||||
duration = 0.3,
|
||||
}
|
||||
}
|
||||
end
|
||||
-- The mapgen code is here, but the actual world schematic should live in artifact_world.
|
||||
local path = minetest.get_modpath("artifact_world").."/schems/map"
|
||||
local pos1 = vector.new(-5,-7,-5)
|
||||
local pos2 = pos1 +artifact.get_schem_size(path)
|
||||
artifact.load_schematic(pos1, path)
|
||||
-- Wait a bit to make quite sure that the schematic is in place (and allow the HUD to fade out).
|
||||
minetest.after(0.3, function()
|
||||
local nodes = minetest.find_nodes_in_area(pos1, pos2, "start_pos")
|
||||
-- If we can't find a start marker, fall back to the global origin.
|
||||
local start = nodes[1] or vector.zero()
|
||||
artifact.origin = start
|
||||
db:set_string("origin", start:to_string())
|
||||
for _, m in pairs(artifact.players) do
|
||||
m.hud.loading_map:remove(m)
|
||||
m.hud.loading_map_bg:animate {
|
||||
opacity = {
|
||||
value = 0,
|
||||
duration = 0.3
|
||||
}
|
||||
}
|
||||
m.hud.loading_map_bg.remove_after = 0.3
|
||||
m.object:set_pos(start)
|
||||
end
|
||||
ns.enter_state(artifact.story.states.init)
|
||||
end)
|
||||
end)
|
||||
end)
|
||||
end
|
||||
|
||||
include "objectives.lua"
|
||||
|
||||
local started = false
|
||||
minetest.register_on_joinplayer(function(p)
|
||||
local m = artifact.players[p:get_player_name()]
|
||||
-- Only add the HUD etc. if the player is actually in the game.
|
||||
if state == ns.states.init then
|
||||
m.object:set_attach(ns.camera)
|
||||
minetest.show_formspec(m.name, "artifact:lock_camera", [[
|
||||
formspec_version[10]
|
||||
allow_close[false]
|
||||
bgcolor[#0000]
|
||||
]])
|
||||
elseif state > ns.states.init then
|
||||
m:add_health_bar()
|
||||
m.object:hud_set_flags {
|
||||
crosshair = true,
|
||||
wielditem = true
|
||||
}
|
||||
end
|
||||
-- So we only call this when the _first_ player joins.
|
||||
-- Sure, we're technically a singleplayer game, but,
|
||||
-- as they say, better to have it and not need it than
|
||||
-- need it and not have it.
|
||||
if not started then
|
||||
started = true
|
||||
if state == ns.states.loading then
|
||||
ns.load_map()
|
||||
elseif state == "init" then
|
||||
ns.play_intro_cutscene()
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
|
||||
if artifact.debug then
|
||||
minetest.register_chatcommand("map", {
|
||||
func = function()
|
||||
local path = minetest.get_modpath("artifact_world").."/schems/map"
|
||||
local pos1 = vector.new(-5,-7,-5)
|
||||
artifact.load_schematic(pos1, path)
|
||||
end
|
||||
})
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -1,2 +1,2 @@
|
|||
name = artifact_story
|
||||
depends = artifact_base
|
||||
depends = artifact_player
|
||||
1
mods/artifact_story/models/artifact_cutscene_a.gltf
Normal file
1
mods/artifact_story/models/artifact_cutscene_b.gltf
Normal file
15
mods/artifact_story/objectives.lua
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
local ns = artifact
|
||||
|
||||
ns.objectives = {}
|
||||
|
||||
function ns.establish_objective()
|
||||
|
||||
end
|
||||
|
||||
function ns.complete_objective()
|
||||
|
||||
end
|
||||
|
||||
function ns.update_objective()
|
||||
|
||||
end
|
||||
BIN
mods/artifact_story/textures/artifact_splash.jpeg
Normal file
|
After Width: | Height: | Size: 146 KiB |
BIN
mods/artifact_story/textures/artifact_splash.mp4
Normal file
BIN
mods/artifact_story/textures/artifact_splash.png
Normal file
|
After Width: | Height: | Size: 4.7 MiB |
BIN
mods/artifact_story/textures/artifact_splash_2.jpeg
Normal file
|
After Width: | Height: | Size: 150 KiB |
BIN
mods/artifact_story/textures/artifact_splash_2.mp4
Normal file
BIN
mods/artifact_story/textures/artifact_splash_3.jpeg
Normal file
|
After Width: | Height: | Size: 147 KiB |
BIN
mods/artifact_story/textures/artifact_start_pos.png
Normal file
|
After Width: | Height: | Size: 307 B |
BIN
mods/artifact_story/textures/artifact_statue.png
Normal file
|
After Width: | Height: | Size: 364 B |
|
|
@ -7,8 +7,9 @@ function artifact.register_node(name, def)
|
|||
if not name:find ":" then
|
||||
name = "artifact:"..name
|
||||
end
|
||||
-- We might need to add groups below.
|
||||
if not def.groups then def.groups = {} end
|
||||
if artifact.debug then
|
||||
if not def.groups then def.groups = {} end
|
||||
def.groups.dig_immediate = 3
|
||||
end
|
||||
if def._variants then
|
||||
|
|
@ -99,6 +100,49 @@ local function rep(tx, size)
|
|||
return out
|
||||
end
|
||||
|
||||
|
||||
-- These nodes are only used for the intro cutscene.
|
||||
|
||||
artifact.register_node("stone_brown", {
|
||||
tiles = {{name = "artifact_stone_brown.png", align_style = "world"}},
|
||||
_variants = {"stair", "slab"}
|
||||
})
|
||||
|
||||
artifact.register_node("stone_tile_brown", {
|
||||
tiles = {{name = "artifact_stone_tile_brown.png", align_style = "world"}},
|
||||
_variants = {"stair", "slab"}
|
||||
})
|
||||
|
||||
artifact.register_node("stone_bricks_brown", {
|
||||
tiles = {{name = "artifact_stone_bricks_brown.png", align_style = "world"}},
|
||||
_variants = {"stair", "slab"}
|
||||
})
|
||||
|
||||
artifact.register_node("torch", {
|
||||
drawtype = "mesh",
|
||||
paramtype2 = "facedir",
|
||||
mesh = "artifact_torch.obj",
|
||||
tiles = {"artifact_torch.png"},
|
||||
use_texture_alpha = "clip",
|
||||
light_source = 10,
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true
|
||||
})
|
||||
|
||||
artifact.register_node("torch_standing", {
|
||||
drawtype = "mesh",
|
||||
paramtype2 = "facedir",
|
||||
mesh = "artifact_torch_standing.obj",
|
||||
tiles = {"artifact_torch.png"},
|
||||
use_texture_alpha = "clip",
|
||||
light_source = 10,
|
||||
paramtype = "light",
|
||||
sunlight_propagates = true
|
||||
})
|
||||
|
||||
-- End ad-hoc nodes.
|
||||
|
||||
|
||||
artifact.register_node("stone", {
|
||||
tiles = {{name = "artifact_stone.png", align_style = "world"}},
|
||||
_variants = {"stair", "slab"}
|
||||
|
|
@ -132,6 +176,70 @@ artifact.register_node("stone_tile_small", {
|
|||
_variants = {"stair", "slab"},
|
||||
})
|
||||
|
||||
-- Why does making this texture a tile animation darken it!?
|
||||
artifact.register_node("water", {
|
||||
tiles = {{name = "artifact_water_source.png^[opacity:150", animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 6}}},
|
||||
drawtype = "liquid",
|
||||
use_texture_alpha = "blend",
|
||||
paramtype = "light",
|
||||
walkable = false,
|
||||
pointable = artifact.debug,
|
||||
liquid_move_physics = true,
|
||||
post_effect_color = "#2d5a7c55",
|
||||
|
||||
liquidtype = "source",
|
||||
-- Minetest pro tip: Do not try to use aliases for these.
|
||||
liquid_alternative_source = "artifact:water",
|
||||
liquid_alternative_flowing = "artifact:water_flowing",
|
||||
liquid_viscosity = 1,
|
||||
liquid_range = 5,
|
||||
})
|
||||
|
||||
artifact.register_node("water_flowing", {
|
||||
tiles = {{name = "artifact_water_flowing.png^[opacity:150", animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 0.5}}},
|
||||
special_tiles = {
|
||||
{name = "artifact_water_flowing.png^[opacity:150", animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 0.5}},
|
||||
{name = "artifact_water_flowing.png^[opacity:150", animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 0.5}}
|
||||
},
|
||||
drawtype = "flowingliquid",
|
||||
use_texture_alpha = "blend",
|
||||
paramtype = "light",
|
||||
paramtype2 = "flowingliquid",
|
||||
walkable = false,
|
||||
pointable = artifact.debug,
|
||||
buildable_to = true,
|
||||
liquid_move_physics = true,
|
||||
post_effect_color = "#2d5a7c55",
|
||||
drop = "",
|
||||
|
||||
liquidtype = "flowing",
|
||||
liquid_alternative_source = "artifact:water",
|
||||
liquid_alternative_flowing = "artifact:water_flowing",
|
||||
liquid_viscosity = 1,
|
||||
liquid_range = 5,
|
||||
})
|
||||
|
||||
-- Minetest doesn't properly handle having a custom nodebox on a liquid source, so we do this the hacky way.
|
||||
artifact.register_node("water_static", {
|
||||
tiles = {{name = "artifact_water_source.png^[opacity:150", animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 6}}},
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "leveled",
|
||||
fixed = {
|
||||
-0.5, -0.5, -0.5,
|
||||
0.5, 6/16, 0.5
|
||||
}
|
||||
},
|
||||
use_texture_alpha = "blend",
|
||||
paramtype = "light",
|
||||
paramtype2 = "leveled",
|
||||
place_param2 = 60,
|
||||
walkable = false,
|
||||
pointable = artifact.debug,
|
||||
liquid_move_physics = true,
|
||||
post_effect_color = "#2d5a7c55",
|
||||
})
|
||||
|
||||
|
||||
artifact.register_node("vines", {
|
||||
drawtype = "nodebox",
|
||||
|
|
@ -249,12 +357,12 @@ artifact.register_node("light", {
|
|||
-- Make darkness the default.
|
||||
minetest.override_item("air", {
|
||||
sunlight_propagates = false,
|
||||
light_source = 2
|
||||
light_source = 2 -- But not _too_ much darkness...
|
||||
})
|
||||
|
||||
if artifact.debug then
|
||||
|
||||
minetest.register_mapgen_script(minetest.get_modpath(minetest.get_current_modname()).."/mapgen.lua")
|
||||
minetest.register_mapgen_script(minetest.get_modpath(minetest.get_current_modname()).."/mapgen_debug.lua")
|
||||
|
||||
minetest.register_decoration {
|
||||
deco_type = "simple",
|
||||
|
|
@ -262,5 +370,6 @@ if artifact.debug then
|
|||
place_on = "stone",
|
||||
fill_ratio = 0.02,
|
||||
}
|
||||
|
||||
else
|
||||
minetest.register_mapgen_script(minetest.get_modpath(minetest.get_current_modname()).."/mapgen.lua")
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,33 +1,20 @@
|
|||
|
||||
local vm_data = {}
|
||||
|
||||
local c_stone = minetest.get_content_id("artifact:stone")
|
||||
local c_chest = minetest.get_content_id("chest_with_everything:chest")
|
||||
|
||||
-- Singlenode, but the single node is stone.
|
||||
-- (Note that this is just the base mapgen; the world itself will
|
||||
-- be loaded from a schematic on init.)
|
||||
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 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
|
||||
for i in va:iterp(minp, maxp) do
|
||||
vm_data[i] = c_stone
|
||||
end
|
||||
|
||||
vm:set_data(vm_data)
|
||||
minetest.generate_decorations(vm)
|
||||
vm:calc_lighting()
|
||||
end)
|
||||
|
|
|
|||
33
mods/artifact_world/mapgen_debug.lua
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
|
||||
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()
|
||||
local va = VoxelArea(min, max)
|
||||
|
||||
vm:get_data(vm_data)
|
||||
|
||||
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)
|
||||
minetest.generate_decorations(vm)
|
||||
vm:calc_lighting()
|
||||
end)
|
||||
187
mods/artifact_world/models/artifact_torch.obj
Normal file
|
|
@ -0,0 +1,187 @@
|
|||
# Made in Blockbench 4.12.5
|
||||
mtllib artifact_torch.mtl
|
||||
|
||||
o cube
|
||||
v 0.4111417354376907 0.1185501736953839 0.0625
|
||||
v 0.4111417354376907 0.1185501736953839 -0.0625
|
||||
v 0.613156753728018 -0.2695170658200881 0.0625
|
||||
v 0.613156753728018 -0.2695170658200881 -0.0625
|
||||
v 0.300265381290413 0.06083159704100469 -0.0625
|
||||
v 0.300265381290413 0.06083159704100469 0.0625
|
||||
v 0.5022803995807403 -0.32723564247446735 -0.0625
|
||||
v 0.5022803995807403 -0.32723564247446735 0.0625
|
||||
vt 0.25 0.6875
|
||||
vt 0.3125 0.6875
|
||||
vt 0.3125 0.46875
|
||||
vt 0.25 0.46875
|
||||
vt 0.3125 0.6875
|
||||
vt 0.375 0.6875
|
||||
vt 0.375 0.46875
|
||||
vt 0.3125 0.46875
|
||||
vt 0.375 1
|
||||
vt 0.4375 1
|
||||
vt 0.4375 0.78125
|
||||
vt 0.375 0.78125
|
||||
vt 0.375 0.78125
|
||||
vt 0.4375 0.78125
|
||||
vt 0.4375 0.5625
|
||||
vt 0.375 0.5625
|
||||
vt 0.0625 0.5
|
||||
vt 0 0.5
|
||||
vt 0 0.5625
|
||||
vt 0.0625 0.5625
|
||||
vt 0.5 1
|
||||
vt 0.4375 1
|
||||
vt 0.4375 0.9375
|
||||
vt 0.5 0.9375
|
||||
vn 0 0 -1
|
||||
vn 0.8870108331782217 0.4617486132350339 0
|
||||
vn 0 0 1
|
||||
vn -0.8870108331782217 -0.4617486132350339 0
|
||||
vn -0.4617486132350339 0.8870108331782217 0
|
||||
vn 0.4617486132350339 -0.8870108331782217 0
|
||||
usemtl m_e3e69eb0-b6c9-b9c2-690f-4d510df185b2
|
||||
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.43772062418414 0.2028476390962124 0.125
|
||||
v 0.43772062418414 0.2028476390962124 -0.125
|
||||
v 0.46657991251132963 0.14740946202257355 0.125
|
||||
v 0.46657991251132963 0.14740946202257355 -0.125
|
||||
v 0.21596791588958458 0.08741048578745392 -0.125
|
||||
v 0.21596791588958458 0.08741048578745392 0.125
|
||||
v 0.24482720421677417 0.03197230871381507 -0.125
|
||||
v 0.24482720421677417 0.03197230871381507 0.125
|
||||
vt 0.0625 0.5625
|
||||
vt 0.1875 0.5625
|
||||
vt 0.1875 0.53125
|
||||
vt 0.0625 0.53125
|
||||
vt 0.4375 0.9375
|
||||
vt 0.5625 0.9375
|
||||
vt 0.5625 0.90625
|
||||
vt 0.4375 0.90625
|
||||
vt 0.4375 0.90625
|
||||
vt 0.5625 0.90625
|
||||
vt 0.5625 0.875
|
||||
vt 0.4375 0.875
|
||||
vt 0.4375 0.875
|
||||
vt 0.5625 0.875
|
||||
vt 0.5625 0.84375
|
||||
vt 0.4375 0.84375
|
||||
vt 0.125 0.5625
|
||||
vt 0 0.5625
|
||||
vt 0 0.6875
|
||||
vt 0.125 0.6875
|
||||
vt 0.25 0.6875
|
||||
vt 0.125 0.6875
|
||||
vt 0.125 0.5625
|
||||
vt 0.25 0.5625
|
||||
vn 0 0 -1
|
||||
vn 0.8870108331782217 0.4617486132350339 0
|
||||
vn 0 0 1
|
||||
vn -0.8870108331782217 -0.4617486132350339 0
|
||||
vn -0.4617486132350339 0.8870108331782217 0
|
||||
vn 0.4617486132350339 -0.8870108331782217 0
|
||||
usemtl m_e3e69eb0-b6c9-b9c2-690f-4d510df185b2
|
||||
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.3001499612370861 0.4835397432391481 0.1325825214724777
|
||||
v 0.3001499612370861 0.4835397432391481 0.1325825214724777
|
||||
v 0.44444640287303405 0.20634885787095372 0.13258252147247768
|
||||
v 0.44444640287303405 0.20634885787095372 0.13258252147247768
|
||||
v 0.06494569556474239 0.3611001523809069 -0.13258252147247748
|
||||
v 0.06494569556474239 0.3611001523809069 -0.13258252147247748
|
||||
v 0.20924213720069035 0.08390926701271256 -0.1325825214724775
|
||||
v 0.20924213720069035 0.08390926701271256 -0.1325825214724775
|
||||
vt 0 1
|
||||
vt 0.1875 1
|
||||
vt 0.1875 0.84375
|
||||
vt 0 0.84375
|
||||
vt 0 1
|
||||
vt 0 1
|
||||
vt 0 0.84375
|
||||
vt 0 0.84375
|
||||
vt 0 0.84375
|
||||
vt 0.1875 0.84375
|
||||
vt 0.1875 0.6875
|
||||
vt 0 0.6875
|
||||
vt 0 1
|
||||
vt 0 1
|
||||
vt 0 0.84375
|
||||
vt 0 0.84375
|
||||
vt 0.1875 1
|
||||
vt 0 1
|
||||
vt 0 1
|
||||
vt 0.1875 1
|
||||
vt 0.1875 1
|
||||
vt 0 1
|
||||
vt 0 1
|
||||
vt 0.1875 1
|
||||
vn 0.6272113751262501 0.32650557562197663 -0.7071067811865476
|
||||
vn 0.6272113751262504 0.32650557562197663 0.7071067811865475
|
||||
vn -0.6272113751262501 -0.32650557562197663 0.7071067811865476
|
||||
vn -0.6272113751262504 -0.32650557562197663 -0.7071067811865475
|
||||
vn -0.4617486132350336 0.887010833178222 0
|
||||
vn 0.4617486132350336 -0.887010833178222 0
|
||||
usemtl m_e3e69eb0-b6c9-b9c2-690f-4d510df185b2
|
||||
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.06494569556474178 0.36110015238090654 0.13258252147247745
|
||||
v 0.06494569556474178 0.36110015238090654 0.13258252147247745
|
||||
v 0.20924213720069024 0.08390926701271237 0.13258252147247768
|
||||
v 0.20924213720069024 0.08390926701271237 0.13258252147247768
|
||||
v 0.3001499612370855 0.4835397432391479 -0.13258252147247773
|
||||
v 0.3001499612370855 0.4835397432391479 -0.13258252147247773
|
||||
v 0.44444640287303394 0.20634885787095378 -0.1325825214724775
|
||||
v 0.44444640287303394 0.20634885787095378 -0.1325825214724775
|
||||
vt 0.1875 1
|
||||
vt 0.375 1
|
||||
vt 0.375 0.84375
|
||||
vt 0.1875 0.84375
|
||||
vt 0 1
|
||||
vt 0 1
|
||||
vt 0 0.84375
|
||||
vt 0 0.84375
|
||||
vt 0.1875 0.84375
|
||||
vt 0.375 0.84375
|
||||
vt 0.375 0.6875
|
||||
vt 0.1875 0.6875
|
||||
vt 0 1
|
||||
vt 0 1
|
||||
vt 0 0.84375
|
||||
vt 0 0.84375
|
||||
vt 0.1875 1
|
||||
vt 0 1
|
||||
vt 0 1
|
||||
vt 0.1875 1
|
||||
vt 0.1875 1
|
||||
vt 0 1
|
||||
vt 0 1
|
||||
vt 0.1875 1
|
||||
vn 0.6272113751262494 0.3265055756219781 0.7071067811865478
|
||||
vn -0.6272113751262501 -0.32650557562197735 0.7071067811865475
|
||||
vn -0.6272113751262494 -0.3265055756219781 -0.7071067811865478
|
||||
vn 0.6272113751262501 0.32650557562197735 -0.7071067811865475
|
||||
vn -0.4617486132350349 0.8870108331782214 -8.049116928532382e-16
|
||||
vn 0.4617486132350349 -0.8870108331782214 8.049116928532382e-16
|
||||
usemtl m_e3e69eb0-b6c9-b9c2-690f-4d510df185b2
|
||||
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
|
||||
BIN
mods/artifact_world/models/artifact_torch.png
Normal file
|
After Width: | Height: | Size: 413 B |
4
mods/artifact_world/models/artifact_torch_standing.mtl
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
# Made in Blockbench 4.12.5
|
||||
newmtl m_e3e69eb0-b6c9-b9c2-690f-4d510df185b2
|
||||
map_Kd artifact_torch.png
|
||||
newmtl none
|
||||
187
mods/artifact_world/models/artifact_torch_standing.obj
Normal file
|
|
@ -0,0 +1,187 @@
|
|||
# Made in Blockbench 4.12.5
|
||||
mtllib artifact_torch_standing.mtl
|
||||
|
||||
o cube
|
||||
v 0.13013507308001968 0.3059361621615665 0.1325825214724777
|
||||
v 0.13013507308001968 0.3059361621615665 0.1325825214724777
|
||||
v 0.13013507308001954 -0.006563837838433541 0.13258252147247768
|
||||
v 0.13013507308001954 -0.006563837838433541 0.13258252147247768
|
||||
v -0.13502996986493548 0.3059361621615666 -0.13258252147247745
|
||||
v -0.13502996986493548 0.3059361621615666 -0.13258252147247745
|
||||
v -0.13502996986493562 -0.006563837838433416 -0.13258252147247748
|
||||
v -0.13502996986493562 -0.006563837838433416 -0.13258252147247748
|
||||
vt 0 1
|
||||
vt 0.1875 1
|
||||
vt 0.1875 0.84375
|
||||
vt 0 0.84375
|
||||
vt 0 1
|
||||
vt 0 1
|
||||
vt 0 0.84375
|
||||
vt 0 0.84375
|
||||
vt 0 0.84375
|
||||
vt 0.1875 0.84375
|
||||
vt 0.1875 0.6875
|
||||
vt 0 0.6875
|
||||
vt 0 1
|
||||
vt 0 1
|
||||
vt 0 0.84375
|
||||
vt 0 0.84375
|
||||
vt 0.1875 1
|
||||
vt 0 1
|
||||
vt 0 1
|
||||
vt 0.1875 1
|
||||
vt 0.1875 1
|
||||
vt 0 1
|
||||
vt 0 1
|
||||
vt 0.1875 1
|
||||
vn 0.7071067811865476 -2.355138688025663e-16 -0.7071067811865476
|
||||
vn 0.7071067811865476 -3.9252311467094373e-16 0.7071067811865475
|
||||
vn -0.7071067811865476 2.355138688025663e-16 0.7071067811865476
|
||||
vn -0.7071067811865476 3.9252311467094373e-16 -0.7071067811865475
|
||||
vn 4.710277376051325e-16 1 0
|
||||
vn -4.710277376051325e-16 -1 0
|
||||
usemtl m_e3e69eb0-b6c9-b9c2-690f-4d510df185b2
|
||||
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.06005255160754197 -0.0690638378384335 0.0625
|
||||
v 0.06005255160754197 -0.0690638378384335 -0.0625
|
||||
v 0.06005255160754197 -0.5065638378384335 0.0625
|
||||
v 0.06005255160754197 -0.5065638378384335 -0.0625
|
||||
v -0.06494744839245803 -0.0690638378384335 -0.0625
|
||||
v -0.06494744839245803 -0.0690638378384335 0.0625
|
||||
v -0.06494744839245803 -0.5065638378384335 -0.0625
|
||||
v -0.06494744839245803 -0.5065638378384335 0.0625
|
||||
vt 0.25 0.6875
|
||||
vt 0.3125 0.6875
|
||||
vt 0.3125 0.46875
|
||||
vt 0.25 0.46875
|
||||
vt 0.3125 0.6875
|
||||
vt 0.375 0.6875
|
||||
vt 0.375 0.46875
|
||||
vt 0.3125 0.46875
|
||||
vt 0.375 1
|
||||
vt 0.4375 1
|
||||
vt 0.4375 0.78125
|
||||
vt 0.375 0.78125
|
||||
vt 0.375 0.78125
|
||||
vt 0.4375 0.78125
|
||||
vt 0.4375 0.5625
|
||||
vt 0.375 0.5625
|
||||
vt 0.0625 0.5
|
||||
vt 0 0.5
|
||||
vt 0 0.5625
|
||||
vt 0.0625 0.5625
|
||||
vt 0.5 1
|
||||
vt 0.4375 1
|
||||
vt 0.4375 0.9375
|
||||
vt 0.5 0.9375
|
||||
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_e3e69eb0-b6c9-b9c2-690f-4d510df185b2
|
||||
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.12255255160754197 -0.006563837838433506 0.125
|
||||
v 0.12255255160754197 -0.006563837838433506 -0.125
|
||||
v 0.12255255160754197 -0.0690638378384335 0.125
|
||||
v 0.12255255160754197 -0.0690638378384335 -0.125
|
||||
v -0.12744744839245803 -0.006563837838433506 -0.125
|
||||
v -0.12744744839245803 -0.006563837838433506 0.125
|
||||
v -0.12744744839245803 -0.0690638378384335 -0.125
|
||||
v -0.12744744839245803 -0.0690638378384335 0.125
|
||||
vt 0.0625 0.5625
|
||||
vt 0.1875 0.5625
|
||||
vt 0.1875 0.53125
|
||||
vt 0.0625 0.53125
|
||||
vt 0.4375 0.9375
|
||||
vt 0.5625 0.9375
|
||||
vt 0.5625 0.90625
|
||||
vt 0.4375 0.90625
|
||||
vt 0.4375 0.90625
|
||||
vt 0.5625 0.90625
|
||||
vt 0.5625 0.875
|
||||
vt 0.4375 0.875
|
||||
vt 0.4375 0.875
|
||||
vt 0.5625 0.875
|
||||
vt 0.5625 0.84375
|
||||
vt 0.4375 0.84375
|
||||
vt 0.125 0.5625
|
||||
vt 0 0.5625
|
||||
vt 0 0.6875
|
||||
vt 0.125 0.6875
|
||||
vt 0.25 0.6875
|
||||
vt 0.125 0.6875
|
||||
vt 0.125 0.5625
|
||||
vt 0.25 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_e3e69eb0-b6c9-b9c2-690f-4d510df185b2
|
||||
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.1350299698649363 0.3059361621615665 0.13258252147247745
|
||||
v -0.1350299698649363 0.3059361621615665 0.13258252147247745
|
||||
v -0.1350299698649359 -0.00656383783843351 0.13258252147247768
|
||||
v -0.1350299698649359 -0.00656383783843351 0.13258252147247768
|
||||
v 0.13013507308001904 0.3059361621615666 -0.1325825214724777
|
||||
v 0.13013507308001904 0.3059361621615666 -0.1325825214724777
|
||||
v 0.13013507308001943 -0.006563837838433447 -0.13258252147247748
|
||||
v 0.13013507308001943 -0.006563837838433447 -0.13258252147247748
|
||||
vt 0.1875 1
|
||||
vt 0.375 1
|
||||
vt 0.375 0.84375
|
||||
vt 0.1875 0.84375
|
||||
vt 0 1
|
||||
vt 0 1
|
||||
vt 0 0.84375
|
||||
vt 0 0.84375
|
||||
vt 0.1875 0.84375
|
||||
vt 0.375 0.84375
|
||||
vt 0.375 0.6875
|
||||
vt 0.1875 0.6875
|
||||
vt 0 1
|
||||
vt 0 1
|
||||
vt 0 0.84375
|
||||
vt 0 0.84375
|
||||
vt 0.1875 1
|
||||
vt 0 1
|
||||
vt 0 1
|
||||
vt 0.1875 1
|
||||
vt 0.1875 1
|
||||
vt 0 1
|
||||
vt 0 1
|
||||
vt 0.1875 1
|
||||
vn 0.7071067811865475 1.3738309013483032e-15 0.7071067811865478
|
||||
vn -0.7071067811865478 -3.532708032038497e-16 0.7071067811865475
|
||||
vn -0.7071067811865475 -1.3738309013483032e-15 -0.7071067811865478
|
||||
vn 0.7071067811865478 3.532708032038497e-16 -0.7071067811865475
|
||||
vn -1.099064721078642e-15 1 -8.635508522760762e-16
|
||||
vn 1.099064721078642e-15 -1 8.635508522760762e-16
|
||||
usemtl m_e3e69eb0-b6c9-b9c2-690f-4d510df185b2
|
||||
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
|
||||
1
mods/artifact_world/schems/map.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
{"(45, 21, 52)":{"fields":null,"inventory":null}}
|
||||
BIN
mods/artifact_world/schems/map.mts
Normal file
BIN
mods/artifact_world/textures/artifact_stone_bricks_brown.png
Normal file
|
After Width: | Height: | Size: 320 B |
BIN
mods/artifact_world/textures/artifact_stone_brown.png
Normal file
|
After Width: | Height: | Size: 278 B |
BIN
mods/artifact_world/textures/artifact_stone_tile_brown.png
Normal file
|
After Width: | Height: | Size: 304 B |
BIN
mods/artifact_world/textures/artifact_torch.png
Normal file
|
After Width: | Height: | Size: 413 B |
BIN
mods/artifact_world/textures/artifact_water_flowing.png
Normal file
|
After Width: | Height: | Size: 528 B |
BIN
mods/artifact_world/textures/artifact_water_source.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |