First tests
authorNovatux <nathanael.courant@laposte.net>
Thu, 2 Jan 2014 10:00:42 +0000 (11:00 +0100)
committerNovatux <nathanael.courant@laposte.net>
Sat, 18 Jan 2014 12:29:06 +0000 (13:29 +0100)
technic/machines/other/frames.lua

index 9ee25da61d48dd48925b6aa184ad31175e3c48f1..cfb0050f70cef963716b7ec850cf676e49d9946a 100644 (file)
@@ -12,34 +12,34 @@ local function get_face(pos,ppos,pvect)
                local t=(-0.5-ppos.x)/pvect.x
                local y_int=ppos.y+t*pvect.y
                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
                local t=(0.5-ppos.x)/pvect.x
                local y_int=ppos.y+t*pvect.y
                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
        if pvect.y>0 then
                local t=(-0.5-ppos.y)/pvect.y
                local x_int=ppos.x+t*pvect.x
                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
                local t=(0.5-ppos.y)/pvect.y
                local x_int=ppos.x+t*pvect.x
                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
        if pvect.z>0 then
                local t=(-0.5-ppos.z)/pvect.z
                local x_int=ppos.x+t*pvect.x
                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
                local t=(0.5-ppos.z)/pvect.z
                local x_int=ppos.x+t*pvect.x
                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
 
@@ -238,7 +238,18 @@ local nodeboxes= {
                        end
                        node.name=nodename
                        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
@@ -248,8 +259,132 @@ 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
 local function connected(pos,c,adj)