From 0f2157f5f50f608d31788b713b7e326fb97cd5b4 Mon Sep 17 00:00:00 2001 From: Hector Franqui Date: Fri, 24 May 2019 15:17:01 -0400 Subject: [PATCH] Add ice zombie and sand zombie (WIP) --- api.lua | 500 ++++++++++++++++++++++++++++ init.lua | 522 +----------------------------- mobs.lua | 381 ++++++++++++++++++++++ sounds/mobs_zombie_ice_hit.1.ogg | Bin 0 -> 7094 bytes sounds/mobs_zombie_ice_hit.2.ogg | Bin 0 -> 16058 bytes sounds/mobs_zombie_sand_hit.1.ogg | Bin 0 -> 6929 bytes sounds/mobs_zombie_sand_hit.2.ogg | Bin 0 -> 9228 bytes sounds/mobs_zombie_sand_hit.3.ogg | Bin 0 -> 11897 bytes textures/freezing_ice.png | Bin 0 -> 2198 bytes 9 files changed, 884 insertions(+), 519 deletions(-) create mode 100644 api.lua create mode 100644 mobs.lua create mode 100644 sounds/mobs_zombie_ice_hit.1.ogg create mode 100644 sounds/mobs_zombie_ice_hit.2.ogg create mode 100644 sounds/mobs_zombie_sand_hit.1.ogg create mode 100644 sounds/mobs_zombie_sand_hit.2.ogg create mode 100644 sounds/mobs_zombie_sand_hit.3.ogg create mode 100644 textures/freezing_ice.png diff --git a/api.lua b/api.lua new file mode 100644 index 0000000..2100245 --- /dev/null +++ b/api.lua @@ -0,0 +1,500 @@ + +local spawners = {} +spawner_count = 0 + +natspawner.on_mob_die = function(self, pos) + 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", meta:get_int("spawned_variation_count") - 1) + end + end +end + +local function spawn(pos, force) + + local meta = minetest.get_meta(pos) + local spawner_name = meta:get_string("spawner_name") + + if spawner_name then + local spawner = spawners[spawner_name] + local replacement_node_name = meta:get_string("replaced_node_name") + + local timer = minetest.get_node_timer(pos) + local interval = math.random(spawner.min_spawn_interval, spawner.max_spawn_interval) + + if replacement_node_name and replacement_node_name ~= "" then + + -- Check if variations are forced + local force_variation = false + --minetest.log("Spawner data: "..dump(spawners[spawner_name].replacement_nodes[replacement_node_name])) + if spawners[spawner_name].replacement_nodes[replacement_node_name].variations_only == true then + force_variation = true + end + + -- Entity names for which we are going to search + local search_names = {} + local variation_names = {} + local raw_var_names = spawners[spawner_name].replacement_nodes[replacement_node_name].variations + if raw_var_names then + for name,_ in pairs(raw_var_names) do + variation_names[#variation_names + 1] = name + end + end + -- If variations are forced, only take the variation names + if force_variation == true then + search_names = variation_names + else + search_names = spawners[spawner_name].entities.all_entity_names + end + + -- Search for nearby players and entities + local objects = minetest.get_objects_inside_radius(pos, 10) + local entity_count = 0 + for _,object in pairs(objects) do + if object then + if object:is_player() and not force then + minetest.log("Player too close") + -- Re-schedule + timer:start(interval) + minetest.log("Next spawning scheduled in "..interval.." seconds") + return + elseif object:get_luaentity() + and object:get_luaentity().entity_name then + + -- Check if the found entity has the name of one the entities + -- that this spawner cares about + for i = 1, #search_names do + if object:get_luaentity().entity_name == search_names[i] then + entity_count = entity_count + 1 + break + end + end + + end + end + end + + -- Create a list of names we are to spawn + local spawn_names = {} + if force_variation then + spawn_names = variation_names + elseif #variation_names > 0 then + spawn_names[#spawn_names + 1] = spawners[spawner_name].entities.default + for i = 1, #variation_names do + spawn_names[#spawn_names + 1] = variation_names[i] + end + else + spawn_names[#spawn_names + 1] = spawners[spawner_name].entities.default + end + + -- Choose an entity name. + local is_variation = false + + if force_variation == true then + entity_name = spawn_names[math.random(1, #spawn_names)] + --minetest.log("New entity name: "..dump(entity_name)) + is_variation = true + minetest.log("Spawning variation "..entity_name.." (forced)") + else + local variation_chance = math.random(1, 10) + if variation_chance > 7 then + entity_name = spawn_names[math.random(1, #spawn_names)] + -- Increase variation count + meta:set_int("spawned_variation_count", meta:get_int("spawned_variation_count") + 1) + is_variation = true + minetest.log("Spawned variation count: "..meta:get_int("spawned_variation_count")) + minetest.log("Spawning variation "..entity_name.." (not forced)") + else + entity_name = spawners[spawner_name].entities.default + end + end + + -- Validation: enforce entity max spawn count + local max_mob_count = spawner.max_mob_count + + if force_variation then + --minetest.log("Entity name: "..dump(entity_name)) + --minetest.log("Mob data: "..dump(spawners[spawner_name] +-- .replacement_nodes[replacement_node_name] +-- .variations[entity_name])) + max_mob_count = spawners[spawner_name] + .replacement_nodes[replacement_node_name] + .variations[entity_name] + .max_count or spawner.max_mob_count + entity_count = meta:get_int("spawned_variation_count") + end + + minetest.log("Entity count: "..dump(entity_count)) + minetest.log("Max mob count: "..dump(max_mob_count)) + --minetest.log("Force: "..dump(force)) + + if force or (entity_count <= max_mob_count) then + + -- Spawn + local spawn_pos = {x=pos.x + math.random(0, spawner.spawn_radius), y=pos.y+3, z=pos.z + math.random(0, spawner.spawn_radius)} + -- Check spawn position - if not air, then spawn just above the spawner + local spawn_node = minetest.get_node_or_nil(spawn_pos) + if spawn_node and spawn_node.name ~= "air" then + spawn_pos = pos + end + + minetest.log("Spawning "..entity_name.." at pos "..minetest.pos_to_string(spawn_pos)) + local entity = minetest.add_entity(spawn_pos, entity_name) + if entity then + entity:get_luaentity().entity_name = entity_name + entity:get_luaentity().spawn = { + pos = pos + } + + if is_variation == true then + entity:get_luaentity().variation = true + end + end + minetest.log("Next spawning scheduled in "..interval.." seconds") + else + minetest.log("Max spawn limit reached") + -- Re-calulate interval using deactivation times + interval = math.random(spawner.min_deactivation_time, spawner.max_deactivation_time) + minetest.log("Deactivating spawner for "..interval.." seconds") + end + end + + -- Re-schedule + timer:start(interval) + end +end + +natspawner.register_spawner = function(spawner_name, def) + + spawners[spawner_name] = { + entities = def.entities, + replacement_nodes = def.node_replacement_map, + min_player_distance = def.min_player_distance or 10, + max_spawn_interval = def.max_spawn_interval or 300, --300 + min_spawn_interval = def.min_spawn_interval or 120, --120 + spawn_radius = def.spawn_radius or 15, + min_kill_count = def.min_kill_count or 20, + max_kill_count = def.max_kill_count or 35, + min_deactivation_time = def.min_deactivation_time or 60, + max_deactivation_time = def.max_deactivation_time or 120, + max_mob_count = def.max_mob_count or 15, + spawn_on_dig = def.spawn_on_dig + } + + -- Process all names + local all_names = {} + all_names[#all_names + 1] = def.entities.default + for i = 1, #def.entities.others do + all_names[#all_names + 1] = def.entities.others[i] + end + spawners[spawner_name].entities.all_entity_names = all_names + + spawner_count = spawner_count + 1 + + -- Register all spawners + for _,val in pairs(def.node_replacement_map) do + + minetest.register_node("natspawner:"..spawner_name..val.name, { + description = "Spawner", + drop = "natspawner:"..spawner_name.."_"..val.name, + tiles = val.tiles, + groups = {crumbly=2, soil = 2}, + sounds = default.node_sound_sand_defaults(), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("spawner_name", spawner_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("max_variation_count", + math.random(def.min_variation_count or 0, def.max_variation_count or 0)) + meta:set_int("next_deactivation_count", + math.random(def.min_kill_count, def.max_kill_count)) + meta:set_int("next_deactivation_time", + math.random(def.min_deactivation_time, def.max_deactivation_time)) + + local timer = minetest.get_node_timer(pos) + timer:start(def.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 def.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 + }) + + end +end + +natspawner.register_spawner("zombie", { + entities = { + default = "natspawner:zombie", + others = { + "natspawner:giant_zombie", + "natspawner:ice_zombie", + "natspawner:sand_zombie", + "natspawner:sand_zombie_small" + }, + }, + node_replacement_map = { + ["default:stone"] = { + name = "stone_spawner", + tiles = {"default_stone.png^[cracko:1:2", "default_stone.png", {name = "default_stone.png"}} + }, + ["default:sand"] = { + name = "sand_spawner", + tiles = {"default_sand.png^[cracko:1:2", "default_sand.png", {name = "default_sand.png"}}, + variations = { + ["natspawner:sand_zombie"] = {}, + ["natspawner:sand_zombie_small"] = { + max_count = 5 + } + }, + variations_only = true + }, + ["default:desert_sand"] = { + name = "desert_sand_spawner", + tiles = {"default_desert_sand.png^[cracko:1:2", "default_desert_sand.png", {name = "default_desert_sand.png"}}, + variations = { + ["natspawner:sand_zombie"] = {}, + ["natspawner:sand_zombie_small"] = { + max_count = 5 + } + }, + variations_only = true + }, + ["default:ice"] = { + name = "ice_spawner", + tiles = {"default_ice.png^[cracko:1:2", "default_ice.png", {name = "default_ice.png"}}, + variations = { + ["natspawner:ice_zombie"] = { + max_count = 15, + min_count = 10 + } + }, + variations_only = true + }, + ["default:snowblock"] = { + name = "snowblock_spawner", + tiles = {"default_snow.png^[cracko:1:2", "default_snow.png", {name = "default_snow.png"}}, + variations = { + ["natspawner:ice_zombie"] = { + max_count = 15, + min_count = 10 + } + }, + variations_only = true + }, + ["default:dirt_with_grass"] = { + name = "dirt_with_grass_spawner", + tiles = {"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", + tiles = {"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", + tiles = {"default_snow.png^[cracko:1:2", "default_dirt.png", {name = "default_dirt.png^default_snow_side.png"}}, + variations = { + ["natspawner:ice_zombie"] = { + max_count = 15, + min_count = 10 + } + }, + variations_only = true + }, + ["default:dirt_with_rainforest_litter"] = { + name = "dirt_with_rainforest_litter_spawner", + tiles = {"default_rainforest_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", + tiles = {"default_coniferous_litter.png^[cracko:1:2", "default_dirt.png", {name = "default_dirt.png^default_coniferous_litter_side.png"}} + }, + ["default:permafrost"] = { + name = "permafrost_spawner", + tiles = {"default_permafrost.png^[cracko:1:2", "default_permafrost.png", {name = "default_permafrost.png"}}, + variations = { + ["natspawner:ice_zombie"] = {} + } + }, + ["default:permafrost_with_stones"] = { + name = "permafrost_with_stones_spawner", + tiles = {"default_permafrost.png^default_stones.png^[cracko:1:2", "default_permafrost.png", {name = "default_permafrost.png"}}, + variations = { + ["natspawner:ice_zombie"] = {} + } + }, + ["default:permafrost_with_moss"] = { + name = "permafrost_with_moss_spawner", + tiles = {"default_moss.png^[cracko:1:2", "default_permafrost.png", {name = "default_permafrost.png^default_moss_side.png"}}, + variations = { + ["natspawner:ice_zombie"] = {} + } + } + }, + min_player_distance = 5, --20 + max_mob_count = 5, --15 + max_spawn_interval = 10, --300 + min_spawn_interval = 5, --120 + spawn_radius = 5, + min_kill_count = 5, + max_kill_count = 10, + min_deactivation_time = 5, + max_deactivation_time = 5, + spawn_on_dig = true +}) + +local perl1 = {SEED1 = 9130, OCTA1 = 3, PERS1 = 0.5, SCAL1 = 250} -- Values should match minetest mapgen V6 desert noise. + +local function hlp_fnct(pos, name) + local n = minetest.get_node_or_nil(pos) + if n and n.name and n.name == name then + return true + else + return false + end +end +local function ground(pos, old) + local p2 = pos + while hlp_fnct(p2, "air") do + p2.y = p2.y -1 + end + if p2.y < old.y then + return p2 + else + return old + end +end + +local function is_air_or_buildable(node) + return node + and node.name + and (node.name == "air" + or minetest.registered_nodes[node.name].buildable_to == true) +end + +minetest.register_on_generated(function(minp, maxp, seed) + + -- No spawners registered + if spawner_count == 0 then return end + + if maxp.y < 0 then return end + math.randomseed(seed) + local cnt = 0 + + local perlin1 = minetest.env:get_perlin(perl1.SEED1, perl1.OCTA1, perl1.PERS1, perl1.SCAL1) + local noise1 = perlin1:get2d({x=minp.x,y=minp.y})--,z=minp.z}) + + if noise1 > 0.25 or noise1 < -0.26 then + 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", + "default:dirt_with_coniferous_litter", + "default:permafrost", + "default:permafrost_with_moss", + "default:permafrost_with_stones", + "default:sand", + "default:desert_sand" + }) + 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", + "default:dirt_with_coniferous_litter", + "default:permafrost", + "default:permafrost_with_moss", + "default:permafrost_with_stones", + "default:sand", + "default:desert_sand" + }) + end + if p2 == nil then return end + if p2.y < 0 then return end + + local off = 0 + + -- Simpler finding routine - check if node immediately above is air, + -- 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 is_air_or_buildable(next_node_above) and is_air_or_buildable(next_mapblock_above) then + + -- Choose a spawner + for i = 1, spawner_count do + local spawner_name = next(spawners) + local chance = math.random(1, spawner_count) + + if chance == i then + -- Create spawner + minetest.after(0.8, function(spawner_name, pos) + local node_map = spawners[spawner_name].replacement_nodes + local node_to_replace = minetest.get_node(pos) + if node_map[node_to_replace.name] then + minetest.log("Replacing "..node_to_replace.name.." with "..spawner_name) + minetest.log("Creating advanced spawner at "..minetest.pos_to_string(pos)) + minetest.set_node(pos, {name="natspawner:"..spawner_name..node_map[node_to_replace.name].name}) + local meta = minetest.get_meta(pos) + meta:set_string("replaced_node_name", node_to_replace.name) + else + minetest.log("Unable to find replacement for node '"..dump(node_to_replace.name).."'") + end + end, spawner_name, p2) + end + end + end + + -- local opos1 = {x=p2.x+22,y=p2.y-1,z=p2.z+22} + -- local opos2 = {x=p2.x+22,y=p2.y-1,z=p2.z} + -- local opos3 = {x=p2.x,y=p2.y-1,z=p2.z+22} + -- local opos1_n = minetest.get_node_or_nil(opos1) + -- local opos2_n = minetest.get_node_or_nil(opos2) + -- local opos3_n = minetest.get_node_or_nil(opos3) + -- if opos1_n and opos1_n.name and opos1_n.name == "air" then + -- p2 = ground(opos1, p2) + -- end + -- if opos2_n and opos2_n.name and opos2_n.name == "air" then + -- p2 = ground(opos2, p2) + -- end + -- if opos3_n and opos3_n.name and opos3_n.name == "air" then + -- p2 = ground(opos3, p2) + -- end + -- p2.y = p2.y - 3 + -- if p2.y < 0 then p2.y = 0 end + --if minetest.find_node_near(p2, 25, {"default:water_source"}) ~= nil or minetest.find_node_near(p2, 22, {"default:dirt_with_grass"}) ~= nil or minetest.find_node_near(p2, 52, {"default:sandstonebrick"}) ~= nil then return end + + --minetest.after(0.8,make,p2) + end +end) + + + + +mobs:register_egg("natspawner:zombie", "Zombie", "zombie_head.png", 0) + +minetest.register_craftitem("natspawner:rotten_flesh", { + description = "Rotten Flesh", + inventory_image = "mobs_rotten_flesh.png", + on_use = minetest.item_eat(-5), +}) diff --git a/init.lua b/init.lua index 76cd2bf..3f096b7 100644 --- a/init.lua +++ b/init.lua @@ -1,523 +1,7 @@ natspawner = {} -local spawners = {} -spawner_count = 0 +local path = minetest.get_modpath("natspawner") -mobs:register_mob("natspawner:zombie", { - type = "monster", - passive = false, - attack_type = "dogfight", - damage = 4, - reach = 2, - hp_min = 12, - hp_max = 35, - armor = 150, - collisionbox = {-0.25, -1, -0.3, 0.25, 0.75, 0.3}, - visual = "mesh", - mesh = "creatures_mob.x", - textures = { - {"mobs_zombie.png"}, - }, - visual_size = {x=1, y=1}, - makes_footstep_sound = true, - sounds = { - random = "mobs_zombie.1", - damage = "mobs_zombie_hit", - attack = "mobs_zombie.3", - death = "mobs_zombie_death", - }, - walk_velocity = 0.5, - run_velocity = 1.75, - jump = true, - floats = 0, - view_range = 12, - drops = { - {name = "zombie:rotten_flesh", - chance = 2, min = 3, max = 5,}, - }, - water_damage = 0, - lava_damage = 1, - light_damage = 0, - animation = { - speed_normal = 10, speed_run = 15, - stand_start = 0, stand_end = 79, - walk_start = 168, walk_end = 188, - run_start = 168, run_end = 188, --- punch_start = 168, punch_end = 188, - }, - on_rightclick = function(self, clicker) - minetest.log(dump(self)) - end, - on_die = function(self, pos) - 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", meta:get_int("spawned_variation_count") - 1) - end - end - end -}) - -local function spawn(pos, force) - - local meta = minetest.get_meta(pos) - local spawner_name = meta:get_string("spawner_name") - - if spawner_name then - local spawner = spawners[spawner_name] - local replacement_node_name = meta:get_string("replaced_node_name") - - local timer = minetest.get_node_timer(pos) - local interval = math.random(spawner.min_spawn_interval, spawner.max_spawn_interval) - - -- Check for players nearby - local objects = minetest.get_objects_inside_radius(pos, 25) - - --local entity_spawn_count = meta:get_int("entity_spawn_count") - - local entity_count = 0 - for _,object in pairs(objects) do - if object then - if object:is_player() and not force then - minetest.log("Player too close") - -- Re-schedule - timer:start(interval) - minetest.log("Next spawning scheduled in "..interval.." seconds") - return - elseif object:get_luaentity() - and object:get_luaentity().entity_name - and object:get_luaentity().entity_name == spawner.entity_name then - entity_count = entity_count + 1 - end - end - end - - if replacement_node_name and replacement_node_name ~= "" then - local max_mob_count = spawner.max_mob_count - -- Force variations only - local force_variation = false - minetest.log("Spawner data: "..dump(spawners[spawner_name].replacement_nodes[replacement_node_name])) - if spawners[spawner_name].replacement_nodes[replacement_node_name].variations_only == true then - force_variation = true - end - - if force_variation - and spawners[spawner_name].replacement_nodes[replacement_node_name].max_count then - max_mob_count = spawners[spawner_name].replacement_nodes[replacement_node_name].max_count - minetest.log("The max count: "..dump(max_mob_count)) - entity_count = meta:get_int("spawned_variation_count") - end - - minetest.log("Entity count: "..dump(entity_count)) - minetest.log("Max mob count: "..dump(max_mob_count)) - minetest.log("Force: "..dump(force)) - - -- Check for amount nearby - if force or (entity_count <= max_mob_count) then - -- Spawn - local spawn_pos = {x=pos.x + math.random(0, spawner.spawn_radius), y=pos.y+3, z=pos.z + math.random(0, spawner.spawn_radius)} - -- Check spawn position - if not air, then spawn just above the spawner - local spawn_node = minetest.get_node_or_nil(spawn_pos) - if spawn_node and spawn_node.name ~= "air" then - spawn_pos = pos - end - minetest.log("Spawning "..spawner.entity_name.." at pos "..minetest.pos_to_string(spawn_pos)) - local entity = minetest.add_entity(spawn_pos, spawner.entity_name) - if entity then - entity:get_luaentity().entity_name = spawner.entity_name - entity:get_luaentity().spawn = { - pos = pos - } - - local max_variation_count = meta:get_int("max_variation_count") - local spawned_variation_count = meta:get_int("spawned_variation_count") - - -- Spawn a variation with 30% chance - local variation_chance = math.random(1, 10) - local variations = spawners[spawner_name].replacement_nodes[replacement_node_name].variations - - minetest.log("") - - if (variations - and spawned_variation_count < max_variation_count - and variation_chance > 7) or force_variation == true then - - -- Choose a variation - local index = math.random(1, #variations) - if spawners[spawner_name].variations.data[variations[index]] ~= nil then - local registered_variation = spawners[spawner_name].variations.data[variations[index]] - - minetest.log("Spawning variation "..dump(variations[index])) - - entity:get_luaentity().variation = true - -- Velocity - if registered_variation.walk_velocity then - entity:get_luaentity().walk_velocity = - registered_variation.walk_velocity - end - - if registered_variation.run_velocity then - entity:get_luaentity().run_velocity = - registered_variation.run_velocity - end - - -- View range - if registered_variation.view_range then - entity:get_luaentity().view_range = - registered_variation.view_range - end - - -- HP - if registered_variation.hp_min and registered_variation.hp_max then - local hp = - math.random(registered_variation.hp_min, registered_variation.hp_max) - entity:get_luaentity().hp_max = hp - entity:get_luaentity().health = hp - entity:get_luaentity().old_health = hp - end - - -- Damage - if registered_variation.damage then - entity:get_luaentity().damage = registered_variation.damage - end - - if registered_variation.reach then - entity:get_luaentity().reach = registered_variation.reach - end - - -- Armor - if registered_variation.armor then - entity:set_armor_groups({immortal = 1, fleshy = registered_variation.armor}) - end - - if registered_variation.knock_back then - entity:get_luaentity().knock_back = registered_variation.knock_back - end - - if registered_variation.visual_size then - -- Size properties - entity:set_properties({ - visual_size = registered_variation.visual_size, - collisionbox = registered_variation.collisionbox, - stepheight = registered_variation.stepheight - }) - end - - -- Textures - if registered_variation.textures then - entity:set_properties({ - textures = registered_variation.textures - }) - end - - -- Increase variation count - meta:set_int("spawned_variation_count", meta:get_int("spawned_variation_count") + 1) - end - end - end - minetest.log("Spawned variation count: "..meta:get_int("spawned_variation_count")) - minetest.log("Next spawning scheduled in "..interval.." seconds") - - else - minetest.log("Max spawn limit reached") - -- Re-calulate interval using deactivation times - interval = math.random(spawner.min_deactivation_time, spawner.max_deactivation_time) - minetest.log("Deactivating spawner for "..interval.." seconds") - end - end - - -- Re-schedule - timer:start(interval) - end -end - -natspawner.register_spawner = function(spawner_name, def) - - spawners[spawner_name] = { - entity_name = def.entity_name, - variations = { - data = def.entity_variations - }, - replacement_nodes = def.node_replacement_map, - min_player_distance = def.min_player_distance or 10, - max_spawn_interval = def.max_spawn_interval or 300, --300 - min_spawn_interval = def.min_spawn_interval or 120, --120 - spawn_radius = def.spawn_radius or 15, - min_kill_count = def.min_kill_count or 20, - max_kill_count = def.max_kill_count or 35, - min_deactivation_time = def.min_deactivation_time or 60, - max_deactivation_time = def.max_deactivation_time or 120, - max_mob_count = def.max_mob_count or 15, - spawn_on_dig = def.spawn_on_dig - } - spawner_count = spawner_count + 1 - - -- Register all spawners - for _,val in pairs(def.node_replacement_map) do - - minetest.register_node("natspawner:"..spawner_name..val.name, { - description = "Spawner", - drop = "natspawner:"..spawner_name.."_"..val.name, - tiles = val.tiles, - groups = {crumbly=2, soil = 2}, - sounds = default.node_sound_sand_defaults(), - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("spawner_name", spawner_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("max_variation_count", - math.random(def.min_variation_count or 0, def.max_variation_count or 0)) - meta:set_int("next_deactivation_count", - math.random(def.min_kill_count, def.max_kill_count)) - meta:set_int("next_deactivation_time", - math.random(def.min_deactivation_time, def.max_deactivation_time)) - - local timer = minetest.get_node_timer(pos) - timer:start(def.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 def.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 - }) - - end -end - -natspawner.register_spawner("zombie", { - entity_name = "natspawner:zombie", - entity_variations = { - ["giant_zombie"] = - { - visual_size = {x=2.75, y=2.5, z=2.75}, - collisionbox = {-0.63, -2.5, -0.75, 0.63, 1.88, 0.75}, - stepheight = 2, - walk_velocity = 1.5, - run_velocity = 3, - view_range = 20, - hp_min = 215, - hp_max = 315, - damage = 12, - reach = 4, - armor = 325, - knock_back = false, - }, - ["ice_zombie"] = { - textures = {"mobs_zombie_ice.png"} - }, - ["sand_zombie_small"] = { - textures = {"mobs_zombie_sand.png"}, - visual_size = {x=0.5, y=0.5, z=0.5}, - } - }, - node_replacement_map = { - ["default:stone"] = { - name = "stone_spawner", - tiles = {"default_stone.png^[cracko:1:2", "default_stone.png", {name = "default_stone.png"}} - }, - ["default:sand"] = { - name = "sand_spawner", - tiles = {"default_sand.png^[cracko:1:2", "default_sand.png", {name = "default_sand.png"}}, - variations = {"sand_zombie_small"} - }, - ["default:desert_sand"] = { - name = "desert_sand_spawner", - tiles = {"default_desert_sand.png^[cracko:1:2", "default_desert_sand.png", {name = "default_desert_sand.png"}} - }, - ["default:ice"] = { - name = "ice_spawner", - tiles = {"default_ice.png^[cracko:1:2", "default_ice.png", {name = "default_ice.png"}}, - variations = {"ice_zombie"}, - variations_only = true, - max_count = 15, - min_count = 10 - }, - ["default:snowblock"] = { - name = "snowblock_spawner", - tiles = {"default_snow.png^[cracko:1:2", "default_snow.png", {name = "default_snow.png"}}, - variations = {"ice_zombie"}, - variations_only = true, - max_count = 15, - min_count = 10 - }, - ["default:dirt_with_grass"] = {name = "dirt_with_grass_spawner", tiles = {"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", tiles = {"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", - tiles = {"default_snow.png^[cracko:1:2", "default_dirt.png", {name = "default_dirt.png^default_snow_side.png"}}, - variations = {"ice_zombie"}, - variations_only = true, - max_count = 15, - min_count = 10 - }, - ["default:dirt_with_rainforest_litter"] = {name = "dirt_with_rainforest_litter_spawner", tiles = {"default_rainforest_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", tiles = {"default_coniferous_litter.png^[cracko:1:2", "default_dirt.png", {name = "default_dirt.png^default_coniferous_litter_side.png"}}}, - ["default:permafrost"] = {name = "permafrost_spawner", tiles = {"default_permafrost.png^[cracko:1:2", "default_permafrost.png", {name = "default_permafrost.png"}}}, - ["default:permafrost_with_stones"] = {name = "permafrost_with_stones_spawner", tiles = {"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", tiles = {"default_moss.png^[cracko:1:2", "default_permafrost.png", {name = "default_permafrost.png^default_moss_side.png"}}} - }, - min_player_distance = 5, --20 - max_mob_count = 5, --15 - max_spawn_interval = 10, --300 - min_spawn_interval = 5, --120 - spawn_radius = 5, - min_kill_count = 5, - max_kill_count = 10, - min_deactivation_time = 5, - max_deactivation_time = 5, - spawn_on_dig = true -}) - -local perl1 = {SEED1 = 9130, OCTA1 = 3, PERS1 = 0.5, SCAL1 = 250} -- Values should match minetest mapgen V6 desert noise. - -local function hlp_fnct(pos, name) - local n = minetest.get_node_or_nil(pos) - if n and n.name and n.name == name then - return true - else - return false - end -end -local function ground(pos, old) - local p2 = pos - while hlp_fnct(p2, "air") do - p2.y = p2.y -1 - end - if p2.y < old.y then - return p2 - else - return old - end -end - -local function is_air_or_buildable(node) - return node - and node.name - and (node.name == "air" - or minetest.registered_nodes[node.name].buildable_to == true) -end - -minetest.register_on_generated(function(minp, maxp, seed) - - -- No spawners registered - if spawner_count == 0 then return end - - if maxp.y < 0 then return end - math.randomseed(seed) - local cnt = 0 - - local perlin1 = minetest.env:get_perlin(perl1.SEED1, perl1.OCTA1, perl1.PERS1, perl1.SCAL1) - local noise1 = perlin1:get2d({x=minp.x,y=minp.y})--,z=minp.z}) - - if noise1 > 0.25 or noise1 < -0.26 then - 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", - "default:dirt_with_coniferous_litter", - "default:permafrost", - "default:permafrost_with_moss", - "default:permafrost_with_stones", - "default:sand", - "default:desert_sand" - }) - 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", - "default:dirt_with_coniferous_litter", - "default:permafrost", - "default:permafrost_with_moss", - "default:permafrost_with_stones", - "default:sand", - "default:desert_sand" - }) - end - if p2 == nil then return end - if p2.y < 0 then return end - - local off = 0 - - -- Simpler finding routine - check if node immediately above is air, - -- 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 is_air_or_buildable(next_node_above) and is_air_or_buildable(next_mapblock_above) then - - -- Choose a spawner - for i = 1, spawner_count do - local spawner_name = next(spawners) - local chance = math.random(1, spawner_count) - - if chance == i then - -- Create spawner - minetest.after(0.8, function(spawner_name, pos) - local node_map = spawners[spawner_name].replacement_nodes - minetest.log("Creating advanced spawner at "..minetest.pos_to_string(pos)) - local node_to_replace = minetest.get_node(pos) - minetest.log("Replacing "..node_to_replace.name.." with "..spawner_name) - minetest.set_node(pos, {name="natspawner:"..spawner_name..node_map[node_to_replace.name].name}) - local meta = minetest.get_meta(pos) - meta:set_string("replaced_node_name", node_to_replace.name) - end, spawner_name, p2) - end - end - end - - -- local opos1 = {x=p2.x+22,y=p2.y-1,z=p2.z+22} - -- local opos2 = {x=p2.x+22,y=p2.y-1,z=p2.z} - -- local opos3 = {x=p2.x,y=p2.y-1,z=p2.z+22} - -- local opos1_n = minetest.get_node_or_nil(opos1) - -- local opos2_n = minetest.get_node_or_nil(opos2) - -- local opos3_n = minetest.get_node_or_nil(opos3) - -- if opos1_n and opos1_n.name and opos1_n.name == "air" then - -- p2 = ground(opos1, p2) - -- end - -- if opos2_n and opos2_n.name and opos2_n.name == "air" then - -- p2 = ground(opos2, p2) - -- end - -- if opos3_n and opos3_n.name and opos3_n.name == "air" then - -- p2 = ground(opos3, p2) - -- end - -- p2.y = p2.y - 3 - -- if p2.y < 0 then p2.y = 0 end - --if minetest.find_node_near(p2, 25, {"default:water_source"}) ~= nil or minetest.find_node_near(p2, 22, {"default:dirt_with_grass"}) ~= nil or minetest.find_node_near(p2, 52, {"default:sandstonebrick"}) ~= nil then return end - - --minetest.after(0.8,make,p2) - end -end) - - - - -mobs:register_egg("natspawner:zombie", "Zombie", "zombie_head.png", 0) - -minetest.register_craftitem("natspawner:rotten_flesh", { - description = "Rotten Flesh", - inventory_image = "mobs_rotten_flesh.png", - on_use = minetest.item_eat(-5), -}) +dofile(path .. "/api.lua") +dofile(path .. "/mobs.lua") diff --git a/mobs.lua b/mobs.lua new file mode 100644 index 0000000..f0f51a9 --- /dev/null +++ b/mobs.lua @@ -0,0 +1,381 @@ +-- Entity registrations + +local function normal_attack(self, to_attack) + --set_animation(self, "punch") + +-- local p2 = to_attack +-- local s2 = self.object:get_pos() + +-- p2.y = p2.y + .5 +-- s2.y = s2.y + .5 + + --local line = minetest.line_of_sight(p2, s2) + --minetest.log(dump(line)) + +--r, pos = minetest.line_of_sight(p2, s2, stepsize) + --if line_of_sight(self, p2, s2) == true then + + -- play attack sound + --mob_sound(self, self.sounds.attack) + + -- punch player (or what player is attached to) + local attached = self.attack:get_attach() + if attached then + self.attack = attached + end + self.attack:punch(self.object, 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = self.damage} + }, nil) + --end + +end + +-- Default zombie +mobs:register_mob("natspawner:zombie", { + type = "monster", + passive = false, + attack_type = "dogfight", + damage = 4, + reach = 2, + hp_min = 12, + hp_max = 35, + armor = 150, + collisionbox = {-0.25, -1, -0.3, 0.25, 0.75, 0.3}, + visual = "mesh", + mesh = "creatures_mob.x", + textures = { + {"mobs_zombie.png"}, + }, + visual_size = {x=1, y=1}, + makes_footstep_sound = true, + sounds = { + random = "mobs_zombie.1", + damage = "mobs_zombie_hit", + attack = "mobs_zombie.3", + death = "mobs_zombie_death", + }, + walk_velocity = 0.5, + run_velocity = 1.75, + jump = true, + floats = 0, + view_range = 12, + drops = { + {name = "zombie:rotten_flesh", + chance = 2, min = 3, max = 5,}, + }, + water_damage = 0, + lava_damage = 1, + light_damage = 0, + animation = { + speed_normal = 10, speed_run = 15, + stand_start = 0, stand_end = 79, + walk_start = 168, walk_end = 188, + run_start = 168, run_end = 188, +-- punch_start = 168, punch_end = 188, + }, + on_rightclick = function(self, clicker) + minetest.log(dump(self)) + end, + on_die = natspawner.on_mob_die +}) + +mobs:register_mob("natspawner:giant_zombie", { + type = "monster", + passive = false, + attack_type = "dogfight", + damage = 4, + reach = 2, + hp_min = 12, + hp_max = 35, + armor = 150, + collisionbox = {-0.625, -2.5, -2.8, 0.625, 1.875, 2.8}, + visual = "mesh", + mesh = "creatures_mob.x", + textures = { + {"mobs_zombie.png"}, + }, + visual_size = {x=2.5, y=2.5, z=2.5}, + makes_footstep_sound = true, + sounds = { + random = "mobs_zombie.1", + damage = "mobs_zombie_hit", + attack = "mobs_zombie.3", + death = "mobs_zombie_death", + }, + walk_velocity = 0.5, + run_velocity = 1.75, + jump = true, + floats = 0, + view_range = 12, + drops = { + {name = "zombie:rotten_flesh", + chance = 2, min = 3, max = 5,}, + }, + water_damage = 0, + lava_damage = 1, + light_damage = 0, + animation = { + speed_normal = 10, speed_run = 15, + stand_start = 0, stand_end = 79, + walk_start = 168, walk_end = 188, + run_start = 168, run_end = 188, +-- punch_start = 168, punch_end = 188, + }, + on_rightclick = function(self, clicker) + minetest.log(dump(self)) + end, + on_die = natspawner.on_mob_die +}) + +mobs:register_mob("natspawner:ice_zombie", { + type = "monster", + passive = false, + attack_type = "dogfight", + damage = 4, + reach = 2, + hp_min = 12, + hp_max = 35, + armor = 150, + collisionbox = {-0.25, -1, -0.3, 0.25, 0.75, 0.3}, + visual = "mesh", + mesh = "creatures_mob.x", + textures = { + {"mobs_zombie_ice.png"}, + }, + visual_size = {x=1, y=1}, + makes_footstep_sound = true, + sounds = { + random = "mobs_zombie.1", + damage = "mobs_zombie_ice_hit", + attack = "mobs_zombie.3", + death = "mobs_zombie_death", + }, + walk_velocity = 0.5, + run_velocity = 1.75, + jump = true, + floats = 0, + view_range = 12, + drops = { + {name = "zombie:rotten_flesh", + chance = 2, min = 3, max = 5,}, + }, + water_damage = 0, + lava_damage = 1, + light_damage = 0, + animation = { + speed_normal = 10, speed_run = 15, + stand_start = 0, stand_end = 79, + walk_start = 168, walk_end = 188, + run_start = 168, run_end = 188, +-- punch_start = 168, punch_end = 188, + }, + blood_amount = 4, + blood_texture = "default_ice.png", + after_activate = function(self) + self.ice_attack_timer = 0 + end, + on_rightclick = function(self, clicker) + minetest.log(dump(self)) + end, + on_die = natspawner.on_mob_die, + custom_attack = function(self, to_attack) + + self.ice_attack_timer = self.ice_attack_timer + 1 + + if self.ice_attack_timer >= 5 then + self.ice_attack_timer = 0 + local chance = math.random(1, 5) + if chance > 3 then + -- TODO: Add particle effects + minetest.log("Ice") + minetest.set_node(to_attack, {name="natspawner:freezing_ice"}) + minetest.set_node({x=to_attack.x, y=to_attack.y+1, z=to_attack.z}, {name="natspawner:freezing_ice"}) + -- Remove node + minetest.after(math.random(1,2), function(pos) + minetest.sound_play("default_break_glass") + minetest.set_node(to_attack, {name="air"}) + minetest.set_node({x=to_attack.x, y=to_attack.y+1, z=to_attack.z}, {name="air"}) + end, to_attack) + end + end + + normal_attack(self, to_attack) + end +}) + +mobs:register_mob("natspawner:sand_zombie_small", { + type = "monster", + passive = false, + attack_type = "dogfight", + damage = 6, + reach = 2, + hp_min = 12, + hp_max = 35, + armor = 100, + collisionbox = {-0.1625, -0.65, -0.195, 0.1625, 0.4875, 0.195}, + visual = "mesh", + mesh = "creatures_mob.x", + textures = { + {"mobs_zombie_sand.png"}, + }, + visual_size = {x=0.675, y=0.65, z=0.675}, + makes_footstep_sound = true, + sounds = { + random = "mobs_zombie", + damage = "mobs_zombie_sand_hit", + attack = "mobs_zombie", + death = "mobs_zombie_death", + }, + walk_velocity = 1.5, + run_velocity = 3, + jump = true, + floats = 0, + view_range = 12, + drops = { + {name = "zombie:rotten_flesh", + chance = 2, min = 3, max = 5,}, + }, + water_damage = 0, + lava_damage = 1, + light_damage = 0, + animation = { + speed_normal = 10, speed_run = 15, + stand_start = 0, stand_end = 79, + walk_start = 168, walk_end = 188, + run_start = 168, run_end = 188, +-- punch_start = 168, punch_end = 188, + }, + blood_amount = 7, + blood_texture = "default_sand.png", + on_rightclick = function(self, clicker) + minetest.log(dump(self)) + end, + on_die = natspawner.on_mob_die +}) + +mobs:register_mob("natspawner:sand_zombie", { + type = "monster", + passive = false, + attack_type = "dogfight", + damage = 4, + reach = 2, + hp_min = 12, + hp_max = 35, + armor = 150, + collisionbox = {-0.25, -1, -0.3, 0.25, 0.75, 0.3}, + visual = "mesh", + mesh = "creatures_mob.x", + textures = { + {"mobs_zombie_sand.png"}, + }, + visual_size = {x=1, y=1}, + makes_footstep_sound = true, + sounds = { + random = "mobs_zombie", + damage = "mobs_zombie_sand_hit",--"mobs_zombie_hit", + attack = "mobs_zombie", + death = "mobs_zombie_death", + }, + walk_velocity = 0.5, + run_velocity = 1.75, + jump = true, + floats = 0, + view_range = 12, + drops = { + {name = "zombie:rotten_flesh", + chance = 2, min = 3, max = 5,}, + }, + water_damage = 0, + lava_damage = 1, + light_damage = 0, + animation = { + speed_normal = 10, speed_run = 15, + stand_start = 0, stand_end = 79, + walk_start = 168, walk_end = 188, + run_start = 168, run_end = 188, +-- punch_start = 168, punch_end = 188, + }, + blood_amount = 7, + blood_texture = "default_sand.png", + on_rightclick = function(self, clicker) + minetest.log(dump(self)) + end, + on_die = function(self, pos) + + -- TODO: Add particle effects + --minetest.add_particle_spawner() + local positions = {} + for x = -1, 1 do + for z = -1, 1 do + local chance = math.random(1, 2) + if (chance > 1) then + minetest.set_node({x=pos.x + x, y=pos.y-1, z=pos.z + z}, {name="natspawner:evil_sand"}) + positions[#positions + 1] = {x=pos.x + x, y = pos.y-1, z=pos.z + z} + end + end + end + + minetest.after(1, function(positions) + for i = 1, #positions do + local chance = math.random(1, 10) + if (chance > 5) then + minetest.add_entity({x=positions[i].x, y=positions[i].y+1, z=positions[i].z}, "natspawner:sand_zombie_small") + end + end + --minetest.add_entity({x=pos.x - 1, y=pos.y, z=pos.z}, "natspawner:sand_zombie_small") + end, positions) + + -- Spawner callback + natspawner.on_mob_die(self, pos) + end +}) + +-- Nodes +minetest.register_node("natspawner:freezing_ice", { + description = "Freezing Ice", + drawtype = "glasslike", + tiles = {"freezing_ice.png"}, + paramtype = "light", + walkable = false, + pointable = true, + diggable = true, + buildable_to = false, + drop = "", + drowning = 1, + liquid_renewable = false, + liquidtype = "source", + use_textrure_alpha = true, + liquid_range= 0, + liquid_alternative_flowing = "natspawner:freezing_ice", + liquid_alternative_source = "natspawner:freezing_ice", + liquid_viscosity = 30, + post_effect_color = {a = 103, r = 30, g = 60, b = 90}, + groups = {cracky = 3, cools_lava = 1, slippery = 3, flammable=2, liquid=1, not_in_creative_inventory=1}, +}) + +minetest.register_node("natspawner:evil_sand", { + description = "Evil Sand", + tiles = {"default_sand.png"}, + inventory_image = "default_snowball.png", + wield_image = "default_snowball.png", + paramtype = "light", + buildable_to = true, + floodable = true, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -7 / 16, 0.5}, + }, + }, + groups = {crumbly = 3, falling_node = 1, sand = 1}, + sounds = default.node_sound_sand_defaults(), + damage_per_second = 2 +}) diff --git a/sounds/mobs_zombie_ice_hit.1.ogg b/sounds/mobs_zombie_ice_hit.1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..191287a330b5df91982dc109bb75f4fb2a5085f1 GIT binary patch literal 7094 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