306 lines
5.9 KiB
Lua
Executable File
306 lines
5.9 KiB
Lua
Executable File
--[[
|
||
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
|