Changes
parent
f642c22bfb
commit
98ec06bb84
155
init.lua
155
init.lua
|
@ -1,11 +1,31 @@
|
|||
|
||||
-- Zombie by BlockMen
|
||||
natspawner = {}
|
||||
|
||||
local spawners = {}
|
||||
spawner_count = 0
|
||||
|
||||
local node_to_spawner_map = {
|
||||
["default:stone"] = {name = "stone_spawner", textures = {"default_stone.png^[cracko:1:2", "default_stone.png", {name = "default_stone.png"}}},
|
||||
["default:sand"] = {name = "sand_spawner", textures = {"default_sand.png^[cracko:1:2", "default_sand.png", {name = "default_sand.png"}}},
|
||||
["default:desert_sand"] = {name = "desert_sand_spawner", textures = {"default_desert_sand.png^[cracko:1:2", "default_desert_sand.png", {name = "default_desert_sand.png"}}},
|
||||
["default:ice"] = {name = "ice_spawner", textures = {"default_ice.png^[cracko:1:2", "default_ice.png", {name = "default_ice.png"}}},
|
||||
["default:snowblock"] = {name = "snowblock_spawner", textures = {"default_snow.png^[cracko:1:2", "default_snow.png", {name = "default_snow.png"}}},
|
||||
["default:dirt_with_grass"] = {name = "dirt_with_grass_spawner", textures = {"default_grass.png^[cracko:1:2", "default_dirt.png", {name = "default_dirt.png^default_grass_side.png"}}},
|
||||
["default:dirt_with_dry_grass"] = {name = "dirt_with_dry_grass_spawner", textures = {"default_dry_grass.png^[cracko:1:2", "default_dirt.png", {name = "default_dirt.png^default_dry_grass_side.png"}}},
|
||||
["default:dirt_with_snow"] = {name = "dirt_with_snow_spawner", textures = {"default_snow.png^[cracko:1:2", "default_dirt.png", {name = "default_dirt.png^default_snow_side.png"}}},
|
||||
["default:dirt_with_rainforest_litter"] = {name = "dirt_with_rainforest_litter_spawner", textures = {"default_coniferous_litter.png^[cracko:1:2", "default_dirt.png", {name = "default_dirt.png^default_rainforest_litter_side.png"}}},
|
||||
["default:dirt_with_coniferous_litter"] = {name = "dirt_with_coniferous_litter_spawner", textures = {"default_rainforest_litter.png^[cracko:1:2", "default_dirt.png", {name = "default_dirt.png^default_coniferous_litter_side.png"}}},
|
||||
["default:permafrost"] = {name = "permafrost_spawner", textures = {"default_permafrost.png^[cracko:1:2", "default_permafrost.png", {name = "default_permafrost.png"}}},
|
||||
["default:permafrost_with_stones"] = {name = "permafrost_with_stones_spawner", textures = {"default_permafrost.png^default_stones.png^[cracko:1:2", "default_permafrost.png", {name = "default_permafrost.png"}}},
|
||||
["default:permafrost_with_moss"] = {name = "permafrost_with_moss_spawner", textures = {"default_moss.png^[cracko:1:2", "default_permafrost.png", {name = "default_permafrost.png^default_moss_side.png"}}}
|
||||
}
|
||||
|
||||
mobs:register_mob("natspawner:zombie", {
|
||||
type = "monster",
|
||||
passive = false,
|
||||
attack_type = "dogfight",
|
||||
damage = 4,
|
||||
reach = 2,
|
||||
hp_min = 12,
|
||||
hp_max = 35,
|
||||
armor = 150,
|
||||
|
@ -46,9 +66,11 @@ mobs:register_mob("natspawner:zombie", {
|
|||
minetest.log(dump(self))
|
||||
end,
|
||||
on_die = function(self, pos)
|
||||
local meta = minetest.get_meta(self.spawn.pos)
|
||||
meta:set_int("entity_killed_count", meta:get_int("entity_killed_count") + 1)
|
||||
if self.variation then meta:set_int("spawned_variation_count", 0) end
|
||||
if self.spawn and self.spawn.pos then
|
||||
local meta = minetest.get_meta(self.spawn.pos)
|
||||
meta:set_int("entity_killed_count", meta:get_int("entity_killed_count") + 1)
|
||||
if self.variation then meta:set_int("spawned_variation_count", 0) end
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
|
@ -73,14 +95,17 @@ local min_kill_count = 5
|
|||
local max_kill_count = 10
|
||||
local min_deactivation_time = 5
|
||||
local max_deactivation_time = 5
|
||||
local spawner_textures = {"wool_red.png"}
|
||||
local spawn_on_dig = true
|
||||
|
||||
local function spawn(pos, entity_name, force)
|
||||
local function spawn(pos, force)
|
||||
-- Check for players nearby
|
||||
local objects = minetest.get_objects_inside_radius(pos, min_player_distance)
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
local interval = math.random(min_spawn_interval, max_spawn_interval)
|
||||
|
||||
local meta = minetest.get_meta(pos)
|
||||
local entity_name = meta:get_string("entity_name")
|
||||
--local entity_spawn_count = meta:get_int("entity_spawn_count")
|
||||
|
||||
local entity_count = 0
|
||||
for _,object in pairs(objects) do
|
||||
|
@ -99,9 +124,6 @@ local function spawn(pos, entity_name, force)
|
|||
end
|
||||
end
|
||||
|
||||
local meta = minetest.get_meta(pos)
|
||||
local entity_spawn_count = meta:get_int("entity_spawn_count")
|
||||
|
||||
-- Check for amount nearby
|
||||
if force or (entity_count <= max_mob_count) then
|
||||
-- Spawn
|
||||
|
@ -134,7 +156,7 @@ local function spawn(pos, entity_name, force)
|
|||
entity:get_luaentity().old_health = hp
|
||||
-- Damage
|
||||
entity:get_luaentity().damage = math.random(10, 20)
|
||||
entity:get_luaentity().range = 6
|
||||
entity:get_luaentity().reach = 4
|
||||
-- Armor
|
||||
entity:set_armor_groups({immortal = 1, fleshy = math.random(300, 350)})
|
||||
entity:get_luaentity().knock_back = false
|
||||
|
@ -159,41 +181,55 @@ local function spawn(pos, entity_name, force)
|
|||
timer:start(interval)
|
||||
end
|
||||
|
||||
minetest.register_node("natspawner:zombie_spawner", {
|
||||
description = "Zombie Spawner",
|
||||
drop = "natspawner:zombie_spawner",
|
||||
tiles = {"wool_red.png"},
|
||||
groups = {crumbly=2, soil = 2},
|
||||
sounds = default.node_sound_sand_defaults(),
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_int("entity_spawn_count", 0)
|
||||
meta:set_int("entity_killed_count", 0)
|
||||
meta:set_int("spawned_variation_count", 0)
|
||||
meta:set_int("next_deactivation_count", math.random(min_kill_count, max_kill_count))
|
||||
meta:set_int("next_deactivation_time", math.random(min_deactivation_time, max_deactivation_time))
|
||||
local function register_spawner(spawner_name, entity_name, replacement_nodes)
|
||||
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
timer:start(min_spawn_interval)
|
||||
end,
|
||||
on_timer = function(pos)
|
||||
spawn(pos, "natspawner:zombie")
|
||||
end,
|
||||
on_dig = function(pos, node, digger)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local entity_killed_count = meta:get_int("entity_killed_count")
|
||||
local next_deactivation_count = meta:get_int("next_deactivation_count")
|
||||
if (entity_killed_count < next_deactivation_count) then
|
||||
if spawn_on_dig then
|
||||
spawn(pos, "natspawner:zombie", true)
|
||||
spawners[spawner_name] = replacement_nodes
|
||||
spawner_count = spawner_count + 1
|
||||
|
||||
-- Register all spawners
|
||||
for _,val in pairs(replacement_nodes) do
|
||||
|
||||
minetest.register_node("natspawner:"..spawner_name..val.name, {
|
||||
description = "Spawner",
|
||||
drop = "natspawner:"..spawner_name.."_"..val.name,
|
||||
tiles = val.textures,
|
||||
groups = {crumbly=2, soil = 2},
|
||||
sounds = default.node_sound_sand_defaults(),
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("entity_name", entity_name)
|
||||
meta:set_int("entity_spawn_count", 0)
|
||||
meta:set_int("entity_killed_count", 0)
|
||||
meta:set_int("spawned_variation_count", 0)
|
||||
meta:set_int("next_deactivation_count", math.random(min_kill_count, max_kill_count))
|
||||
meta:set_int("next_deactivation_time", math.random(min_deactivation_time, max_deactivation_time))
|
||||
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
timer:start(min_spawn_interval)
|
||||
end,
|
||||
on_timer = function(pos)
|
||||
spawn(pos)
|
||||
end,
|
||||
on_dig = function(pos, node, digger)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local entity_killed_count = meta:get_int("entity_killed_count")
|
||||
local next_deactivation_count = meta:get_int("next_deactivation_count")
|
||||
if (entity_killed_count < next_deactivation_count) then
|
||||
if spawn_on_dig then
|
||||
spawn(pos, true)
|
||||
end
|
||||
minetest.chat_send_player(digger:get_player_name(), "You have killed "..entity_killed_count.." enemies!")
|
||||
return false
|
||||
else
|
||||
minetest.node_dig(pos, node, digger)
|
||||
end
|
||||
end
|
||||
minetest.chat_send_player(digger:get_player_name(), "You have killed "..entity_killed_count.." enemies!")
|
||||
return false
|
||||
else
|
||||
minetest.node_dig(pos, node, digger)
|
||||
end
|
||||
})
|
||||
|
||||
end
|
||||
})
|
||||
end
|
||||
|
||||
register_spawner("zombie", "natspawner:zombie", node_to_spawner_map)
|
||||
|
||||
local perl1 = {SEED1 = 9130, OCTA1 = 3, PERS1 = 0.5, SCAL1 = 250} -- Values should match minetest mapgen V6 desert noise.
|
||||
|
||||
|
@ -219,8 +255,8 @@ end
|
|||
|
||||
minetest.register_on_generated(function(minp, maxp, seed)
|
||||
|
||||
-- Chance check
|
||||
if math.random(0,10) > 7 then return end
|
||||
-- No spawners registered
|
||||
if spawner_count == 0 then return end
|
||||
|
||||
if maxp.y < 0 then return end
|
||||
math.randomseed(seed)
|
||||
|
@ -233,7 +269,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||
local mpos = {x=math.random(minp.x,maxp.x), y=math.random(minp.y,maxp.y), z=math.random(minp.z,maxp.z)}
|
||||
|
||||
local p2 = minetest.find_node_near(mpos, 25, {"default:dirt_with_grass", "default:dirt_with_snow"})
|
||||
while p2 == nil and cnt < 5 do
|
||||
while p2 == nil and cnt < 10 do
|
||||
cnt = cnt+1
|
||||
mpos = {x=math.random(minp.x,maxp.x), y=math.random(minp.y,maxp.y), z=math.random(minp.z,maxp.z)}
|
||||
p2 = minetest.find_node_near(mpos, 25, {"default:dirt_with_grass", "default:dirt_with_snow"})
|
||||
|
@ -247,16 +283,29 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||
-- and if node 16 blocks above is air
|
||||
minetest.log("Checking pos to spawn: "..minetest.pos_to_string(p2))
|
||||
local next_node_above = minetest.get_node_or_nil({x=p2.x, y=p2.y+1, z=p2.z})
|
||||
minetest.log("FOund next node above: "..dump(next_node_above))
|
||||
local next_mapblock_above = minetest.get_node_or_nil({x=p2.x, y=p2.y+16, z=p2.z})
|
||||
minetest.log("Found next node above mapblock: "..dump(next_mapblock_above))
|
||||
|
||||
if next_node_above and next_node_above.name and next_node_above.name == "air" and
|
||||
next_mapblock_above and next_mapblock_above.name and next_mapblock_above.name == "air" then
|
||||
|
||||
-- Create spawner
|
||||
minetest.after(0.8, function(pos)
|
||||
minetest.log("Creating advanced spawner at "..minetest.pos_to_string(pos))
|
||||
minetest.set_node(pos, {name="natspawner:zombie_spawner"})
|
||||
end, p2)
|
||||
|
||||
next_mapblock_above and next_mapblock_above.name and next_mapblock_above.name == "air" then
|
||||
|
||||
-- Choose a spawner
|
||||
for i = 1, spawner_count do
|
||||
local spawner_name = next(spawners)
|
||||
local node_map = spawners[spawner_name]
|
||||
minetest.log("Spawner:")
|
||||
minetest.log(dump(node_map))
|
||||
local chance = math.random(1, spawner_count)
|
||||
if chance == i then
|
||||
-- Create spawner
|
||||
minetest.after(0.8, function(pos)
|
||||
minetest.log("Creating advanced spawner at "..minetest.pos_to_string(pos))
|
||||
local node_to_replace = minetest.get_node(pos)
|
||||
minetest.set_node(pos, {name="natspawner:"..spawner_name..node_map[node_to_replace.name].name})
|
||||
end, p2)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- local opos1 = {x=p2.x+22,y=p2.y-1,z=p2.z+22}
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 195 B |
Binary file not shown.
After Width: | Height: | Size: 348 B |
Loading…
Reference in New Issue