2019-10-31 13:46:26 +01:00

306 lines
5.9 KiB
Lua
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

--[[
Mobs Ghost Redo - Adds ghosts.
Copyright © 2018, 2019 Hamlet <hamlatmesehub@riseup.net> and contributors.
Licensed under the EUPL, Version 1.2 or as soon they will be
approved by the European Commission subsequent versions of the
EUPL (the "Licence");
You may not use this work except in compliance with the Licence.
You may obtain a copy of the Licence at:
https://joinup.ec.europa.eu/software/page/eupl
https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32017D0863
Unless required by applicable law or agreed to in writing,
software distributed under the Licence is distributed on an
"AS IS" basis,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied.
See the Licence for the specific language governing permissions
and limitations under the Licence.
--]]
-- Used for localization
local S = minetest.get_translator("mobs_ghost_redo")
--
-- General variables
--
local ghost_daytime_check = minetest.settings:get_bool("mobs_ghost_redo_daytime_check")
local ghost_bones_only = minetest.settings:get_bool("mobs_ghost_redo_bones_only")
local ghost_difficulty = minetest.settings:get_bool("mobs_ghost_redo_difficulty")
if (ghost_daytime_check == nil) then
ghost_daytime_check = false
end
if (ghost_bones_only == nil) then
ghost_bones_only = false
end
if (ghost_difficulty == nil) then
ghost_difficulty = false
end
local SPAWNING_NODES = {}
local SPAWNING_CHANCE = 0
if (ghost_bones_only == true) then
SPAWNING_NODES = {"bones:bones", "mobs_humans:human_bones"}
SPAWNING_CHANCE = 7
ACTIVE_OBJECTS = 1
else
SPAWNING_NODES = {
"group:cracky",
"group:stone",
"group:crumbly",
"group:sand",
"group:snowy",
}
SPAWNING_CHANCE = 7500
ACTIVE_OBJECTS = 2
end
--
-- Functions
--
local function day_or_night()
local daytime = false
local time = minetest.get_timeofday() * 24000
if (time >= 4700) and (time <= 19250) then
daytime = true
else
daytime = false
end
return daytime
end
local function random_mesh()
local mesh = ""
local number = math.random(1, 2)
if (number == 1) then
mesh = "mobs_ghost_redo_ghost_1.b3d"
elseif (number == 2) then
mesh = "mobs_ghost_redo_ghost_2.b3d"
end
return mesh
end
--
-- Entity definition
--
mobs:register_mob("mobs_ghost_redo:ghost", {
type = "monster",
hp_min = 10,
hp_max = 20,
armor = 100,
walk_velocity = 1,
run_velocity = 4,
walk_chance = 25,
fly = true,
view_range = 15,
reach = 4,
damage = 4,
water_damage = 0,
lava_damage = 0,
light_damage = 2,
suffocation = false,
attack_animals = true,
group_attack = true,
attack_type = "dogfight",
blood_amount = 0,
makes_footstep_sound = false,
sounds = {
random = "mobs_ghost_redo_ghost_1",
war_cry = "mobs_ghost_redo_ghost_2",
attack = "mobs_ghost_redo_ghost_2",
damage = "mobs_ghost_redo_ghost_hit",
death = "mobs_ghost_redo_ghost_death",
},
drops = {
{name = "default:gold_lump", chance = 100, min = 1, max = 5}
},
visual = "mesh",
visual_size = {x = 1, y = 1},
collisionbox = {-0.3, -0.5, -0.3, 0.3, 1.5, 0.3},
textures = {"mobs_ghost_redo_ghost.png"},
mesh = "mobs_ghost_redo_ghost_1.b3d",
animation = {
stand_start = 0,
stand_end = 80,
stand_speed = 15,
walk_start = 102,
walk_end = 122,
walk_speed = 12,
run_start = 102,
run_end = 122,
run_speed = 10,
fly_start = 102,
fly_end = 122,
fly_speed = 12,
punch_start = 102,
punch_end = 122,
punch_speed = 25,
die_start = 81,
die_end = 101,
die_speed = 28,
die_loop = false,
},
on_spawn = function(self, pos)
if (ghost_difficulty == true) then
self.health = math.random(20, 30)
self.immune_to = {
{"all"},
{"default:sword_steel", 6},
{"default:sword_bronze", 6},
{"default:sword_mese", 7},
{"mobs_others:sword_obsidian", 7},
{"default:sword_diamond", 8},
{"moreores:sword_silver", 12},
{"moreores:sword_mithril", 9}
}
end
self.spawned = true
self.mesh = random_mesh()
self.counter = 0
self.object:set_properties({
health = self.health,
immune_to = self.immune_to,
spawned = self.spawned,
mesh = self.mesh,
counter = self.counter,
physical = false,
collide_with_objects = false
})
return true
end,
do_custom = function(self, dtime)
if (ghost_daytime_check == true) then
if (self.light_damage ~= 0) then
self.light_damage = 0
self.object:set_properties({
light_damage = self.light_damage
})
end
if (self.spawned == true) then
local daytime = day_or_night()
if (daytime == true) then
self.object:remove()
else
self.spawned = false
self.object:set_properties({
spawned = self.spawned
})
end
else
if (self.counter < 15.0) then
self.counter = self.counter + dtime
self.object:set_properties({
counter = self.counter
})
else
local daytime = day_or_night()
if (daytime == true) then
self.object:remove()
else
self.counter = 0
self.object:set_properties({
counter = self.counter
})
end
end
end
else
if (self.light_damage ~= 2) then
self.light_damage = 2
self.object:set_properties({
light_damage = self.light_damage
})
end
end
end
})
--
-- Ghost's spawn
--
mobs:spawn({name = "mobs_ghost_redo:ghost",
nodes = SPAWNING_NODES,
neighbors = {"air"},
max_light = 4,
min_light = 0,
interval = 60,
chance = SPAWNING_CHANCE,
active_object_count = ACTIVE_OBJECTS,
min_height = -30912,
max_height = 31000,
day_toggle = false
})
--
-- Ghost's egg
--
mobs:register_egg("mobs_ghost_redo:ghost", S("Ghost Spawner"),
"mobs_ghost_redo_egg_ghost.png", 0, false)
--
-- Alias
--
mobs:alias_mob("mobs:ghost", "mobs_ghost_redo:ghost")
--
-- Minetest engine debug logging
--
if (minetest.settings:get("debug_log_level") == nil)
or (minetest.settings:get("debug_log_level") == "action")
or (minetest.settings:get("debug_log_level") == "info")
or (minetest.settings:get("debug_log_level") == "verbose")
then
minetest.log("action", "[Mod] Mobs Ghost Redo [v0.7.0] loaded.")
end