diff --git a/api.lua b/api.lua index 2100245..1cd6a25 100644 --- a/api.lua +++ b/api.lua @@ -6,8 +6,8 @@ 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) + if self.variation then + meta:set_int("spawned_variation_count", meta:get_int("spawned_variation_count") - 1) end end end @@ -16,23 +16,23 @@ 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 = {} @@ -48,7 +48,7 @@ local function spawn(pos, force) 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 @@ -60,9 +60,9 @@ local function spawn(pos, force) timer:start(interval) minetest.log("Next spawning scheduled in "..interval.." seconds") return - elseif object:get_luaentity() + 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 @@ -71,11 +71,11 @@ local function spawn(pos, force) break end end - + end end end - + -- Create a list of names we are to spawn local spawn_names = {} if force_variation then @@ -88,10 +88,10 @@ local function spawn(pos, force) 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)) @@ -110,10 +110,10 @@ local function spawn(pos, force) 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] @@ -125,21 +125,24 @@ local function spawn(pos, force) .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)} + 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 @@ -147,7 +150,7 @@ local function spawn(pos, force) entity:get_luaentity().spawn = { pos = pos } - + if is_variation == true then entity:get_luaentity().variation = true end @@ -160,7 +163,7 @@ local function spawn(pos, force) minetest.log("Deactivating spawner for "..interval.." seconds") end end - + -- Re-schedule timer:start(interval) end @@ -182,7 +185,7 @@ natspawner.register_spawner = function(spawner_name, def) 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 @@ -190,12 +193,12 @@ natspawner.register_spawner = function(spawner_name, def) 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, @@ -208,11 +211,11 @@ natspawner.register_spawner = function(spawner_name, def) 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", + 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", + meta:set_int("next_deactivation_count", math.random(def.min_kill_count, def.max_kill_count)) - meta:set_int("next_deactivation_time", + meta:set_int("next_deactivation_time", math.random(def.min_deactivation_time, def.max_deactivation_time)) local timer = minetest.get_node_timer(pos) @@ -236,7 +239,7 @@ natspawner.register_spawner = function(spawner_name, def) end end }) - + end end @@ -252,14 +255,14 @@ natspawner.register_spawner("zombie", { }, node_replacement_map = { ["default:stone"] = { - name = "stone_spawner", + 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"}}, + name = "sand_spawner", + tiles = {"default_sand.png^[cracko:1:2", "default_sand.png", {name = "default_sand.png"}}, variations = { - ["natspawner:sand_zombie"] = {}, + ["natspawner:sand_zombie"] = {}, ["natspawner:sand_zombie_small"] = { max_count = 5 } @@ -267,10 +270,10 @@ natspawner.register_spawner("zombie", { variations_only = true }, ["default:desert_sand"] = { - name = "desert_sand_spawner", + 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"] = {}, ["natspawner:sand_zombie_small"] = { max_count = 5 } @@ -278,7 +281,7 @@ natspawner.register_spawner("zombie", { variations_only = true }, ["default:ice"] = { - name = "ice_spawner", + name = "ice_spawner", tiles = {"default_ice.png^[cracko:1:2", "default_ice.png", {name = "default_ice.png"}}, variations = { ["natspawner:ice_zombie"] = { @@ -289,7 +292,7 @@ natspawner.register_spawner("zombie", { variations_only = true }, ["default:snowblock"] = { - name = "snowblock_spawner", + name = "snowblock_spawner", tiles = {"default_snow.png^[cracko:1:2", "default_snow.png", {name = "default_snow.png"}}, variations = { ["natspawner:ice_zombie"] = { @@ -300,14 +303,21 @@ natspawner.register_spawner("zombie", { 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"}}}, + name = "dirt_with_grass_spawner", + tiles = {"default_grass.png^[cracko:1:2", "default_dirt.png", {name = "default_dirt.png^default_grass_side.png"}}, + variations = { + ["natspawner:giant_zombie"] = { + max_count = 1 + } + } + }, ["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"}}}, + 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"}}, + 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, @@ -317,29 +327,34 @@ natspawner.register_spawner("zombie", { 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"}} + 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"}}, + variations = { + ["natspawner:giant_zombie"] = { + max_count = 1 + } + } }, ["default:dirt_with_coniferous_litter"] = { - name = "dirt_with_coniferous_litter_spawner", + 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", + 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", + 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", + 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"] = {} @@ -381,10 +396,10 @@ local function ground(pos, old) 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) + 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) @@ -403,9 +418,10 @@ 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_grass", "default:dirt_with_snow", "default:dirt_with_coniferous_litter", + "default:dirt_with_rainforest_litter", "default:permafrost", "default:permafrost_with_moss", "default:permafrost_with_stones", @@ -419,6 +435,7 @@ minetest.register_on_generated(function(minp, maxp, seed) "default:dirt_with_grass", "default:dirt_with_snow", "default:dirt_with_coniferous_litter", + "default:dirt_with_rainforest_litter", "default:permafrost", "default:permafrost_with_moss", "default:permafrost_with_stones", @@ -438,14 +455,14 @@ minetest.register_on_generated(function(minp, maxp, seed) 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) @@ -461,7 +478,7 @@ minetest.register_on_generated(function(minp, maxp, seed) minetest.log("Unable to find replacement for node '"..dump(node_to_replace.name).."'") end end, spawner_name, p2) - end + end end end diff --git a/mobs.lua b/mobs.lua index f0f51a9..90e0c45 100644 --- a/mobs.lua +++ b/mobs.lua @@ -1,5 +1,33 @@ -- Entity registrations +local function ice_breaking_effect(pos) + minetest.add_particlespawner({ + amount = math.random(15, 25), + + time = 0.5, + -- Lifespan of spawner in seconds. + -- If time is 0 spawner has infinite lifespan and spawns the `amount` on + -- a per-second basis. + minpos = {x=pos.x-1, y=pos.y+1, z=pos.z-1}, + maxpos = {x=pos.x+1, y=pos.y+1, z=pos.z+1}, + minvel = {x = -2.5, y = -2.5, z = -2.5}, + maxvel = {x = 2.5, y = 2.5, z = 2.5}, + + + -- minpos = {x=pos.x-1, y=pos.x-1, z=pos.x-1}, + -- maxpos = {x=pos.x+1, y=pos.x+1, z=pos.x+1}, + -- minvel = {x=0, y=0, z=0}, + -- maxvel = {x=0, y=0, z=0}, + minacc = {x=0, y=-10, z=0}, + maxacc = {x=0, y=-10, z=0}, + minexptime = 0.5, + maxexptime = 1, + minsize = 0.5, + maxsize = 1, + texture = "frozen_ice.png" + }) +end + local function normal_attack(self, to_attack) --set_animation(self, "punch") @@ -11,7 +39,7 @@ local function normal_attack(self, to_attack) --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 @@ -146,9 +174,9 @@ mobs:register_mob("natspawner:ice_zombie", { visual_size = {x=1, y=1}, makes_footstep_sound = true, sounds = { - random = "mobs_zombie.1", + random = "mobs_zombie", damage = "mobs_zombie_ice_hit", - attack = "mobs_zombie.3", + attack = "mobs_zombie", death = "mobs_zombie_death", }, walk_velocity = 0.5, @@ -180,10 +208,10 @@ mobs:register_mob("natspawner:ice_zombie", { 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 + + if self.ice_attack_timer >= 3 then self.ice_attack_timer = 0 local chance = math.random(1, 5) if chance > 3 then @@ -193,13 +221,16 @@ mobs:register_mob("natspawner:ice_zombie", { 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) + local pos_above = {x=pos.x, y=pos.y+1, z=pos.z} 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"}) + ice_breaking_effect(pos) + ice_breaking_effect(pos_above) + minetest.set_node(pos, {name="air"}) + minetest.set_node(pos_above, {name="air"}) end, to_attack) end end - + normal_attack(self, to_attack) end }) @@ -283,8 +314,7 @@ mobs:register_mob("natspawner:sand_zombie", { floats = 0, view_range = 12, drops = { - {name = "zombie:rotten_flesh", - chance = 2, min = 3, max = 5,}, + {name = "zombie:rotten_flesh", chance = 2, min = 3, max = 5}, }, water_damage = 0, lava_damage = 1, @@ -302,7 +332,7 @@ mobs:register_mob("natspawner:sand_zombie", { minetest.log(dump(self)) end, on_die = function(self, pos) - + -- TODO: Add particle effects --minetest.add_particle_spawner() local positions = {} @@ -315,7 +345,7 @@ mobs:register_mob("natspawner:sand_zombie", { end end end - + minetest.after(1, function(positions) for i = 1, #positions do local chance = math.random(1, 10) @@ -325,18 +355,25 @@ mobs:register_mob("natspawner:sand_zombie", { 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", + tiles = {"frozen_ice.png"}, + groups = {cracky = 3, cools_lava = 1, slippery = 3, flammable = 2, liquid = 1}, + use_texture_alpha = true, + sunlight_propagates = true, drawtype = "glasslike", - tiles = {"freezing_ice.png"}, paramtype = "light", + sounds = default.node_sound_glass_defaults(), walkable = false, pointable = true, diggable = true, @@ -345,13 +382,12 @@ minetest.register_node("natspawner:freezing_ice", { 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}, + post_effect_color = {a = 128, 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", { diff --git a/sounds/mobs_zombie_ice_hit.2.ogg b/sounds/mobs_zombie_ice_hit.2.ogg deleted file mode 100644 index b6cc9e8..0000000 Binary files a/sounds/mobs_zombie_ice_hit.2.ogg and /dev/null differ diff --git a/sounds/mobs_zombie_ice_hit.1.ogg b/sounds/mobs_zombie_ice_hit.ogg similarity index 100% rename from sounds/mobs_zombie_ice_hit.1.ogg rename to sounds/mobs_zombie_ice_hit.ogg diff --git a/textures/freezing_ice.png b/textures/freezing_ice.png deleted file mode 100644 index 366a303..0000000 Binary files a/textures/freezing_ice.png and /dev/null differ diff --git a/textures/frozen_ice.png b/textures/frozen_ice.png new file mode 100644 index 0000000..5d2e5d3 Binary files /dev/null and b/textures/frozen_ice.png differ