This commit is contained in:
Lean Rada 2015-01-25 22:19:49 +08:00
parent 35dc377191
commit 4cf28830d6
3 changed files with 90 additions and 61 deletions

View File

@ -86,7 +86,8 @@ function mobs.default_prototype:on_punch(puncher, time_from_last_punch, tool_cap
end end
dir.y = dir.y + 1 dir.y = dir.y + 1
local knockback = vector.multiply(vector.normalize(dir), 10 / (1 + self.mass)) local m = self.mass or 1
local knockback = vector.multiply(vector.normalize(dir), 10 / (1 + m))
self.object:setvelocity(vector.add(self.object:getvelocity(), knockback)) self.object:setvelocity(vector.add(self.object:getvelocity(), knockback))
self.pause_timer = 0.3 self.pause_timer = 0.3
@ -307,9 +308,17 @@ function mobs.move_method:ground(dtime, destination)
local sx = self.collisionbox[4] - self.collisionbox[1] local sx = self.collisionbox[4] - self.collisionbox[1]
local sz = self.collisionbox[6] - self.collisionbox[3] local sz = self.collisionbox[6] - self.collisionbox[3]
local r = math.sqrt(sx*sx + sz*sz)/2 + 0.5 local r = math.sqrt(sx*sx + sz*sz)/2 + 0.5
local node = minetest.get_node_or_nil(vector.add(p, vector.multiply(dir, r))) local fronts = {
if not node or minetest.registered_nodes[node.name].walkable then {x = dir.x * r, y = 0, z = dir.z * r},
jump = true {x = dir.x + dir.z * r, y = 0, z = dir.z + dir.x * r},
{x = dir.x - dir.z * r, y = 0, z = dir.z - dir.x * r},
}
for _,f in ipairs(fronts) do
local node = minetest.get_node_or_nil(vector.add(p, f))
if not node or minetest.registered_nodes[node.name].walkable then
jump = true
break
end
end end
end end

View File

@ -1,6 +1,8 @@
local function place_goo(pos, origin) local function place_goo(pos, life)
if not origin then if life == nil then
origin = pos life = 1
elseif life <= 0 then
return false
end end
local node = minetest.get_node_or_nil(pos) local node = minetest.get_node_or_nil(pos)
@ -9,8 +11,9 @@ local function place_goo(pos, origin)
end end
if node.name == "defense:goo" then if node.name == "defense:goo" then
-- minetest.place_node(pos, {name="defense:goo_block"}) minetest.dig_node(pos)
-- minetest.get_meta(pos):set_string("origin", minetest.pos_to_string(origin)) minetest.set_node(pos, {name="defense:goo_block"})
minetest.get_meta(pos):set_int("life", life)
return true return true
else else
local dirs = { local dirs = {
@ -33,8 +36,8 @@ local function place_goo(pos, origin)
if dir then if dir then
local facedir = minetest.dir_to_facedir(dir, true) local facedir = minetest.dir_to_facedir(dir, true)
if minetest.registered_nodes[node.name].buildable_to then if minetest.registered_nodes[node.name].buildable_to then
-- minetest.set_node(pos, {name="defense:goo", param2=facedir}) minetest.set_node(pos, {name="defense:goo", param2=facedir})
-- minetest.get_meta(pos):set_string("origin", minetest.pos_to_string(origin)) minetest.get_meta(pos):set_int("life", life)
return true return true
end end
end end
@ -43,47 +46,76 @@ local function place_goo(pos, origin)
return false return false
end end
local function spread_goo(pos, origin) local function goo_consume(pos, life)
if origin and vector.distance(pos, origin) > 2 then local node = minetest.get_node_or_nil(pos)
return if not node or node.name == "air" then
return false
end end
local neighbors = {
{x = 1, y = 0, z = 0},
{x =-1, y = 0, z = 0},
{x = 0, y = 1, z = 0},
{x = 0, y =-1, z = 0},
{x = 0, y = 0, z = 1},
{x = 0, y = 0, z =-1},
}
local count = 0
for _,n in ipairs(neighbors) do
local neighbor = minetest.get_node_or_nil(vector.add(pos, n))
if neighbor and minetest.get_item_group(neighbor.name, "caustic_goo") > 0 then
count = count + 1
end
end
if count >= math.random(2,5) then
minetest.dig_node(pos)
minetest.set_node(pos, {name="defense:goo_block"})
minetest.get_meta(pos):set_int("life", life)
end
end
local function spread_goo(pos)
local node = minetest.get_node_or_nil(pos) local node = minetest.get_node_or_nil(pos)
if node then if node then
local dirs = { local life = minetest.get_meta(pos):get_int("life") or 0
{x = 1, y = 0, z = 0}, if life > 1 then
{x =-1, y = 0, z = 0}, minetest.get_meta(pos):set_int("life", life - 1)
{x = 0, y = 1, z = 0},
{x = 0, y =-1, z = 0}, local dirs = {
{x = 0, y = 0, z = 1}, {x = 1, y = 0, z = 0},
{x = 0, y = 0, z =-1}, {x =-1, y = 0, z = 0},
} {x = 0, y = 1, z = 0},
if node.name == "defense:goo" then {x = 0, y =-1, z = 0},
local dir = minetest.facedir_to_dir(node.param2) {x = 0, y = 0, z = 1},
{x = 0, y = 0, z =-1},
}
local dir = nil
if node.name == "defense:goo" then
dir = minetest.facedir_to_dir(node.param2)
else
dir = dirs[4]
end
goo_consume(vector.add(pos, dir), life - 1)
for _,d in ipairs(dirs) do for _,d in ipairs(dirs) do
local dot_product = d.x * dir.x + d.y * dir.y + d.z * dir.z local dot_product = d.x * dir.x + d.y * dir.y + d.z * dir.z
if dot_product == 0 then if dot_product == 0 then
if math.random() < 0.25 then if math.random() < 0.25 then
local npos = vector.add(pos, d) local npos = vector.add(pos, d)
if not place_goo(vector.add(npos, dir), origin) then if not place_goo(vector.add(npos, dir), life - 1) then
if not place_goo(npos, origin) then if not place_goo(npos, life - 1) then
place_goo(vector.subtract(npos, dir), origin) place_goo(vector.subtract(npos, dir), life - 1)
end end
end end
end end
end end
end end
else
for _,d in ipairs(dirs) do
if math.random() < 0.17 then
local npos = vector.add(pos, d)
minetest.dig_node(npos)
place_goo(npos, origin)
end
end
end end
if math.random() < 0.1 then if life <= 1 and math.random() < 0.2 then
minetest.dig_node(pos) minetest.dig_node(pos)
end end
end end
@ -184,7 +216,7 @@ minetest.register_entity("defense:gooball", {
space = vector.add(space, back) space = vector.add(space, back)
bnode = minetest.get_node_or_nil(space) bnode = minetest.get_node_or_nil(space)
until not bnode or bnode.name == "air" until not bnode or bnode.name == "air"
place_goo(space) place_goo(space, 12)
self.object:remove() self.object:remove()
end end
end, end,
@ -211,24 +243,18 @@ minetest.register_node("defense:goo", {
liquid_alternative_source = "defense:goo", liquid_alternative_source = "defense:goo",
liquid_renewable = false, liquid_renewable = false,
liquid_range = 0, liquid_range = 0,
groups = {caustic_goo=1, crumbly=3, dig_immediate=3, liquid=3, disable_jump=1}, groups = {caustic_goo=1, crumbly=3, dig_immediate=3, liquid=3, attached_node=1, disable_jump=1},
drop = "", drop = "",
walkable = false, walkable = false,
buildable_to = false, buildable_to = false,
damage_per_second = 1, damage_per_second = 1,
on_construct = function(pos) on_construct = function(pos)
minetest.get_node_timer(pos):start(1 + math.random() * 9) minetest.get_node_timer(pos):start(1 + math.random() * 4)
local meta = minetest.get_meta(pos)
local origin = meta:get_string("origin")
if not origin then
meta:set_string("origin", minetest.pos_to_string(pos))
end
end, end,
on_timer = function(pos, elapsed) on_timer = function(pos, elapsed)
local meta = minetest.get_meta(pos) spread_goo(pos)
spread_goo(pos, minetest.string_to_pos(meta:get_string("origin")))
return true return true
end, end,
}) })
@ -240,7 +266,7 @@ minetest.register_node("defense:goo_block", {
name="defense_goo.png", name="defense_goo.png",
animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=0.7} animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=0.7}
}}, }},
drawtype = "glasslike", drawtype = "allfaces",
paramtype = "light", paramtype = "light",
liquid_viscosity = 8, liquid_viscosity = 8,
liquidtype = "source", liquidtype = "source",
@ -249,24 +275,18 @@ minetest.register_node("defense:goo_block", {
liquid_renewable = false, liquid_renewable = false,
liquid_range = 0, liquid_range = 0,
post_effect_color = {r=100, g=240, b=0, a=240}, post_effect_color = {r=100, g=240, b=0, a=240},
groups = {caustic_goo=1, crumbly=3, dig_immediate=3, liquid=3, disable_jump=1}, groups = {caustic_goo=1, crumbly=3, dig_immediate=3, liquid=3, falling_node=1, disable_jump=1},
drop = "", drop = "",
walkable = false, walkable = false,
buildable_to = false, buildable_to = false,
damage_per_second = 1, damage_per_second = 1,
on_construct = function(pos) on_construct = function(pos)
minetest.get_node_timer(pos):start(1 + math.random() * 15) minetest.get_node_timer(pos):start(0.5 + math.random() * 2)
local meta = minetest.get_meta(pos)
local origin = meta:get_string("origin")
if not origin then
meta:set_string("origin", minetest.pos_to_string(pos))
end
end, end,
on_timer = function(pos, elapsed) on_timer = function(pos, elapsed)
local meta = minetest.get_meta(pos) spread_goo(pos)
spread_goo(pos, minetest.string_to_pos(meta:get_string("origin")))
return true return true
end, end,
}) })

View File

@ -129,12 +129,12 @@ defense.mobs.register_mob("defense:sarangay", {
crash_entities = function(self, pos, radius, maxweight) crash_entities = function(self, pos, radius, maxweight)
local myv = self.object:getvelocity() local myv = self.object:getvelocity()
for _,o in pairs(minetest.get_objects_inside_radius(pos, radius)) do for _,o in ipairs(minetest.get_objects_inside_radius(pos, radius)) do
if o ~= self.object then if o ~= self.object then
o:punch(self.object, 1.0, { -- o:punch(self.object, 1.0, {
full_punch_interval=1.0, -- full_punch_interval=1.0,
damage_groups = {fleshy=1} -- damage_groups = {fleshy=1}
}, nil) -- }, nil)
local e = o:get_luaentity() local e = o:get_luaentity()
if e then if e then