forked from minetest-mods/technic
First tests
This commit is contained in:
parent
6d31965b36
commit
5aa229d454
|
@ -9,34 +9,34 @@ local function get_face(pos,ppos,pvect)
|
||||||
local t=(-0.5-ppos.x)/pvect.x
|
local t=(-0.5-ppos.x)/pvect.x
|
||||||
local y_int=ppos.y+t*pvect.y
|
local y_int=ppos.y+t*pvect.y
|
||||||
local z_int=ppos.z+t*pvect.z
|
local z_int=ppos.z+t*pvect.z
|
||||||
if y_int>-0.4 and y_int<0.4 and z_int>-0.4 and z_int<0.4 then return 1 end
|
if y_int>-0.45 and y_int<0.45 and z_int>-0.45 and z_int<0.45 then return 1 end
|
||||||
elseif pvect.x<0 then
|
elseif pvect.x<0 then
|
||||||
local t=(0.5-ppos.x)/pvect.x
|
local t=(0.5-ppos.x)/pvect.x
|
||||||
local y_int=ppos.y+t*pvect.y
|
local y_int=ppos.y+t*pvect.y
|
||||||
local z_int=ppos.z+t*pvect.z
|
local z_int=ppos.z+t*pvect.z
|
||||||
if y_int>-0.4 and y_int<0.4 and z_int>-0.4 and z_int<0.4 then return 2 end
|
if y_int>-0.45 and y_int<0.45 and z_int>-0.45 and z_int<0.45 then return 2 end
|
||||||
end
|
end
|
||||||
if pvect.y>0 then
|
if pvect.y>0 then
|
||||||
local t=(-0.5-ppos.y)/pvect.y
|
local t=(-0.5-ppos.y)/pvect.y
|
||||||
local x_int=ppos.x+t*pvect.x
|
local x_int=ppos.x+t*pvect.x
|
||||||
local z_int=ppos.z+t*pvect.z
|
local z_int=ppos.z+t*pvect.z
|
||||||
if x_int>-0.4 and x_int<0.4 and z_int>-0.4 and z_int<0.4 then return 3 end
|
if x_int>-0.45 and x_int<0.45 and z_int>-0.45 and z_int<0.45 then return 3 end
|
||||||
elseif pvect.y<0 then
|
elseif pvect.y<0 then
|
||||||
local t=(0.5-ppos.y)/pvect.y
|
local t=(0.5-ppos.y)/pvect.y
|
||||||
local x_int=ppos.x+t*pvect.x
|
local x_int=ppos.x+t*pvect.x
|
||||||
local z_int=ppos.z+t*pvect.z
|
local z_int=ppos.z+t*pvect.z
|
||||||
if x_int>-0.4 and x_int<0.4 and z_int>-0.4 and z_int<0.4 then return 4 end
|
if x_int>-0.45 and x_int<0.45 and z_int>-0.45 and z_int<0.45 then return 4 end
|
||||||
end
|
end
|
||||||
if pvect.z>0 then
|
if pvect.z>0 then
|
||||||
local t=(-0.5-ppos.z)/pvect.z
|
local t=(-0.5-ppos.z)/pvect.z
|
||||||
local x_int=ppos.x+t*pvect.x
|
local x_int=ppos.x+t*pvect.x
|
||||||
local y_int=ppos.y+t*pvect.y
|
local y_int=ppos.y+t*pvect.y
|
||||||
if x_int>-0.4 and x_int<0.4 and y_int>-0.4 and y_int<0.4 then return 5 end
|
if x_int>-0.45 and x_int<0.45 and y_int>-0.45 and y_int<0.45 then return 5 end
|
||||||
elseif pvect.z<0 then
|
elseif pvect.z<0 then
|
||||||
local t=(0.5-ppos.z)/pvect.z
|
local t=(0.5-ppos.z)/pvect.z
|
||||||
local x_int=ppos.x+t*pvect.x
|
local x_int=ppos.x+t*pvect.x
|
||||||
local y_int=ppos.y+t*pvect.y
|
local y_int=ppos.y+t*pvect.y
|
||||||
if x_int>-0.4 and x_int<0.4 and y_int>-0.4 and y_int<0.4 then return 6 end
|
if x_int>-0.45 and x_int<0.45 and y_int>-0.45 and y_int<0.45 then return 6 end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -235,7 +235,18 @@ local nodeboxes= {
|
||||||
end
|
end
|
||||||
node.name=nodename
|
node.name=nodename
|
||||||
minetest.env:set_node(pos,node)
|
minetest.env:set_node(pos,node)
|
||||||
end
|
end,
|
||||||
|
on_place = function(itemstack, placer, pointed_thing)
|
||||||
|
local pos = pointed_thing.above
|
||||||
|
if pos == nil then return end
|
||||||
|
local node = minetest.get_node(pos)
|
||||||
|
if node.name ~= "air" then
|
||||||
|
obj = minetest.add_entity(pos, "technic:frame_entity")
|
||||||
|
obj:get_luaentity():set_node({name=itemstack:get_name()})
|
||||||
|
else
|
||||||
|
minetest.set_node(pos, {name = itemstack:get_name()})
|
||||||
|
end
|
||||||
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
end
|
end
|
||||||
|
@ -245,8 +256,132 @@ end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
minetest.register_entity("technic:frame_entity", {
|
||||||
|
initial_properties = {
|
||||||
|
physical = true,
|
||||||
|
collide_with_objects = false,
|
||||||
|
collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
|
||||||
|
visual = "wielditem",
|
||||||
|
textures = {},
|
||||||
|
visual_size = {x=0.667, y=0.667},
|
||||||
|
},
|
||||||
|
|
||||||
|
node = {},
|
||||||
|
|
||||||
|
set_node = function(self, node)
|
||||||
|
self.node = node
|
||||||
|
local stack = ItemStack(node.name)
|
||||||
|
local itemtable = stack:to_table()
|
||||||
|
local itemname = nil
|
||||||
|
if itemtable then
|
||||||
|
itemname = stack:to_table().name
|
||||||
|
end
|
||||||
|
local item_texture = nil
|
||||||
|
local item_type = ""
|
||||||
|
if minetest.registered_items[itemname] then
|
||||||
|
item_texture = minetest.registered_items[itemname].inventory_image
|
||||||
|
item_type = minetest.registered_items[itemname].type
|
||||||
|
end
|
||||||
|
prop = {
|
||||||
|
is_visible = true,
|
||||||
|
textures = {node.name},
|
||||||
|
}
|
||||||
|
self.object:set_properties(prop)
|
||||||
|
end,
|
||||||
|
|
||||||
|
get_staticdata = function(self)
|
||||||
|
return self.node.name
|
||||||
|
end,
|
||||||
|
|
||||||
|
on_activate = function(self, staticdata)
|
||||||
|
self.object:set_armor_groups({immortal=1})
|
||||||
|
self:set_node({name=staticdata})
|
||||||
|
end,
|
||||||
|
|
||||||
|
dig = function(self)
|
||||||
|
minetest.handle_node_drops(self.object:getpos(), {ItemStack("technic:frame_111111")}, self.last_puncher)
|
||||||
|
self.object:remove()
|
||||||
|
end,
|
||||||
|
|
||||||
|
on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir)
|
||||||
|
local pos = self.object:getpos()
|
||||||
|
if self.damage_object == nil then
|
||||||
|
self.damage_object = minetest.add_entity(pos, "technic:damage_entity")
|
||||||
|
self.damage_object:get_luaentity().remaining_time = 0.25
|
||||||
|
self.damage_object:get_luaentity().frame_object = self
|
||||||
|
self.damage_object:get_luaentity().texture_index = 0
|
||||||
|
self.damage_object:get_luaentity().texture_change_time = 0.15
|
||||||
|
else
|
||||||
|
self.damage_object:get_luaentity().remaining_time = 0.25
|
||||||
|
end
|
||||||
|
self.last_puncher = puncher
|
||||||
|
local ppos = puncher:getpos()
|
||||||
|
local pvect = puncher:get_look_dir()
|
||||||
|
local pface = get_face(pos,ppos,pvect)
|
||||||
|
if pface == nil then return end
|
||||||
|
local nodename = self.node.name
|
||||||
|
local newstate = tostring(1-tonumber(string.sub(nodename, -7+pface, -7+pface)))
|
||||||
|
if pface <= 5 then
|
||||||
|
nodename = string.sub(nodename, 1, -7+pface-1)..newstate..string.sub(nodename, -7+pface+1)
|
||||||
|
else
|
||||||
|
nodename = string.sub(nodename, 1, -2)..newstate
|
||||||
|
end
|
||||||
|
self.node.name = nodename
|
||||||
|
self:set_node(self.node)
|
||||||
|
end,
|
||||||
|
|
||||||
|
on_rightclick = function(self, clicker)
|
||||||
|
local pos = self.object:getpos()
|
||||||
|
local ppos = clicker:getpos()
|
||||||
|
local pvect = clicker:get_look_dir()
|
||||||
|
local pface = get_face(pos, ppos, pvect)
|
||||||
|
if pface == nil then return end
|
||||||
|
local pos_under = {x = math.floor(pos.x+0.5), y = math.floor(pos.y+0.5), z = math.floor(pos.z+0.5)}
|
||||||
|
local pos_above = {x = pos_under.x, y = pos_under.y, z = pos_under.z}
|
||||||
|
local index = ({"x", "y", "z"})[math.floor((pface+1)/2)]
|
||||||
|
pos_above[index] = pos_above[index] + 2*((pface+1)%2) - 1
|
||||||
|
local pointed_thing = {type = "node", under = pos_under, above = pos_above}
|
||||||
|
local itemstack = clicker:get_wielded_item()
|
||||||
|
local itemdef = minetest.registered_items[itemstack:get_name()]
|
||||||
|
if itemdef ~= nil then
|
||||||
|
itemdef.on_place(itemstack, clicker, pointed_thing)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
local crack = "crack_anylength.png^[verticalframe:5:0"
|
||||||
|
minetest.register_entity("technic:damage_entity", {
|
||||||
|
initial_properties = {
|
||||||
|
visual = "cube",
|
||||||
|
visual_size = {x=1.01, y=1.01},
|
||||||
|
textures = {crack, crack, crack, crack, crack, crack},
|
||||||
|
collisionbox = {0, 0, 0, 0, 0, 0},
|
||||||
|
physical = false,
|
||||||
|
},
|
||||||
|
on_step = function(self, dtime)
|
||||||
|
if self.remaining_time == nil then
|
||||||
|
self.object:remove()
|
||||||
|
self.frame_object.damage_object = nil
|
||||||
|
end
|
||||||
|
self.remaining_time = self.remaining_time - dtime
|
||||||
|
if self.remaining_time < 0 then
|
||||||
|
self.object:remove()
|
||||||
|
self.frame_object.damage_object = nil
|
||||||
|
end
|
||||||
|
self.texture_change_time = self.texture_change_time - dtime
|
||||||
|
if self.texture_change_time < 0 then
|
||||||
|
self.texture_change_time = self.texture_change_time + 0.15
|
||||||
|
self.texture_index = self.texture_index + 1
|
||||||
|
if self.texture_index == 5 then
|
||||||
|
self.object:remove()
|
||||||
|
self.frame_object.damage_object = nil
|
||||||
|
self.frame_object:dig()
|
||||||
|
end
|
||||||
|
local ct = "crack_anylength.png^[verticalframe:5:"..self.texture_index
|
||||||
|
self.object:set_properties({textures = {ct, ct, ct, ct, ct, ct}})
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
-- Frame motor
|
-- Frame motor
|
||||||
local function connected(pos,c,adj)
|
local function connected(pos,c,adj)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user