404 lines
9.0 KiB
Lua
404 lines
9.0 KiB
Lua
--[[
|
||
|
||
Mobs Skeletons - Adds skeletons.
|
||
Copyright © 2021 Hamlet 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.
|
||
|
||
--]]
|
||
|
||
---
|
||
--- Variables
|
||
---
|
||
|
||
-- Global mod's namespace
|
||
mobs_skeletons = {}
|
||
|
||
-- Used for localization
|
||
local S = minetest.get_translator('mobs_skeletons')
|
||
|
||
-- Setting to enable direct sunlight only death of skeletons
|
||
local sunlight = minetest.settings:get_bool('mobs_skeletons.sunlight_kill') == true
|
||
local light_damage_min = sunlight and 15 or (default.LIGHT_MAX / 2)
|
||
local light_damage_max = sunlight and 15 or (default.LIGHT_MAX + 1)
|
||
|
||
-- Sounds
|
||
local sounds = {
|
||
random = 'mobs_skeletons_skeleton_random',
|
||
attack = 'mobs_skeletons_slash_attack',
|
||
damage = 'mobs_skeletons_skeleton_hurt',
|
||
death = 'mobs_skeletons_skeleton_death'
|
||
}
|
||
|
||
---
|
||
--- Functions
|
||
---
|
||
|
||
-- Used to calculate the damage per second
|
||
mobs_skeletons.fn_DamagePerSecond = function(self)
|
||
|
||
-- direct sunlight returns full damage
|
||
if sunlight then
|
||
return 7
|
||
end
|
||
|
||
-- Constants
|
||
local i_SECONDS_PER_DAY = 86400
|
||
local i_SECONDS_PER_5_MINUTES = 300
|
||
|
||
local i_hitPoints = self.health
|
||
local i_timeSpeed = tonumber(minetest.settings:get('i_timeSpeed')) or 72
|
||
|
||
if i_timeSpeed == 0 then
|
||
i_timeSpeed = 1
|
||
end
|
||
|
||
local i_inGameDayLength = i_SECONDS_PER_DAY / i_timeSpeed
|
||
local i_fiveInGameMinutes =
|
||
(i_inGameDayLength * i_SECONDS_PER_5_MINUTES) / i_SECONDS_PER_DAY
|
||
|
||
local i_damagePerSecond = i_hitPoints / i_fiveInGameMinutes
|
||
|
||
return i_damagePerSecond
|
||
end
|
||
|
||
|
||
---
|
||
--- Arrow
|
||
---
|
||
|
||
-- Arrow item
|
||
minetest.register_craftitem('mobs_skeletons:arrow', {
|
||
description = S('Skeleton Arrow'),
|
||
inventory_image = 'mobs_skeletons_arrow.png',
|
||
groups = {not_in_creative_inventory = 1}
|
||
})
|
||
|
||
-- Arrow entity
|
||
mobs:register_arrow('mobs_skeletons:arrow', {
|
||
visual = 'wielditem',
|
||
visual_size = {x = 0.25, y = 0.25},
|
||
textures = {'mobs_skeletons:arrow'},
|
||
velocity = 35,
|
||
rotate = 0,
|
||
drop = false,
|
||
|
||
hit_player = function(self, player)
|
||
local pos = self.object:get_pos()
|
||
local damage = 6
|
||
player:punch(self.object, 1.0, {
|
||
full_punch_interval = 1.0,
|
||
damage_groups = {fleshy = damage},
|
||
}, nil)
|
||
end,
|
||
|
||
hit_mob = function(self, player)
|
||
local pos = self.object:get_pos()
|
||
local damage = 6
|
||
player:punch(self.object, 1.0, {
|
||
full_punch_interval = 1.0,
|
||
damage_groups = {fleshy = damage},
|
||
}, nil)
|
||
end,
|
||
|
||
hit_node = function(self, pos, node)
|
||
self.object:remove()
|
||
end
|
||
})
|
||
|
||
---
|
||
--- Skeleton Entities
|
||
---
|
||
|
||
mobs:register_mob('mobs_skeletons:skeleton', {
|
||
type = 'monster',
|
||
hp_min = (minetest.PLAYER_MAX_HP_DEFAULT - 10),
|
||
hp_max = (minetest.PLAYER_MAX_HP_DEFAULT + 10),
|
||
walk_velocity = 4,
|
||
run_velocity = 5.2,
|
||
stand_chance = 50,
|
||
walk_chance = 50,
|
||
jump = true,
|
||
jump_height = 1.1,
|
||
stepheight = 1.1,
|
||
pushable = true,
|
||
view_range = 16,
|
||
damage = 7,
|
||
knock_back = true,
|
||
fear_height = 6,
|
||
fall_damage = true,
|
||
lava_damage = 9999,
|
||
light_damage = 1,
|
||
light_damage_min = light_damage_min,
|
||
light_damage_max = light_damage_max,
|
||
suffocation = 0,
|
||
floats = 0,
|
||
reach = 4,
|
||
attack_chance = 1,
|
||
attack_animals = true,
|
||
attack_npcs = true,
|
||
attack_players = true,
|
||
group_attack = true,
|
||
attack_type = 'dogfight',
|
||
blood_amount = 0,
|
||
pathfinding = 1,
|
||
makes_footstep_sound = true,
|
||
sounds = sounds,
|
||
visual = 'mesh',
|
||
visual_size = {x = 2.7, y = 2.7},
|
||
collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3},
|
||
selectionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3},
|
||
textures = {
|
||
'default_tool_steelsword.png',
|
||
'mobs_skeletons_skeleton.png'
|
||
},
|
||
mesh = 'mobs_skeletons_skeleton.b3d',
|
||
animation = {
|
||
stand_start = 0,
|
||
stand_end = 40,
|
||
stand_speed = 15,
|
||
walk_start = 40,
|
||
walk_end = 60,
|
||
walk_speed = 15,
|
||
run_start = 40,
|
||
run_end = 60,
|
||
run_speed = 30,
|
||
shoot_start = 70,
|
||
shoot_end = 90,
|
||
punch_start = 110,
|
||
punch_end = 130,
|
||
punch_speed = 25,
|
||
die_start = 160,
|
||
die_end = 170,
|
||
die_speed = 15,
|
||
die_loop = false,
|
||
},
|
||
drops = {
|
||
{name = 'bonemeal:bone', chance = 3, min = 1, max = 2}
|
||
},
|
||
|
||
on_spawn = function(self)
|
||
self.light_damage = mobs_skeletons.fn_DamagePerSecond(self)
|
||
end
|
||
})
|
||
|
||
mobs:register_mob('mobs_skeletons:skeleton_archer', {
|
||
type = 'monster',
|
||
hp_min = (minetest.PLAYER_MAX_HP_DEFAULT - 10),
|
||
hp_max = (minetest.PLAYER_MAX_HP_DEFAULT + 10),
|
||
walk_velocity = 4,
|
||
run_velocity = 5.2,
|
||
stand_chance = 50,
|
||
walk_chance = 50,
|
||
jump = true,
|
||
jump_height = 1.1,
|
||
stepheight = 1.1,
|
||
pushable = true,
|
||
view_range = 16,
|
||
damage = 2,
|
||
knock_back = true,
|
||
fear_height = 6,
|
||
fall_damage = true,
|
||
lava_damage = 9999,
|
||
light_damage = 1,
|
||
light_damage_min = light_damage_min,
|
||
light_damage_max = light_damage_max,
|
||
suffocation = 0,
|
||
floats = 0,
|
||
reach = 4,
|
||
attack_chance = 1,
|
||
attack_animals = true,
|
||
attack_npcs = true,
|
||
attack_players = true,
|
||
group_attack = true,
|
||
attack_type = 'shoot',
|
||
arrow = 'mobs_skeletons:arrow',
|
||
shoot_interval = 1.5,
|
||
shoot_offset = 1.0,
|
||
blood_amount = 0,
|
||
pathfinding = 1,
|
||
makes_footstep_sound = true,
|
||
sounds = sounds,
|
||
visual = 'mesh',
|
||
visual_size = {x = 2.7, y = 2.7},
|
||
collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3},
|
||
selectionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3},
|
||
textures = {
|
||
'mobs_skeleton_bow.png',
|
||
'mobs_skeletons_skeleton_archer.png'
|
||
},
|
||
mesh = 'mobs_skeletons_skeleton_archer.b3d',
|
||
animation = {
|
||
stand_speed = 15,
|
||
stand_start = 0,
|
||
stand_end = 40,
|
||
walk_speed = 15,
|
||
walk_start = 40,
|
||
walk_end = 60,
|
||
run_speed = 30,
|
||
shoot_start = 70,
|
||
shoot_end = 90,
|
||
die_start = 160,
|
||
die_end = 170,
|
||
die_speed = 15,
|
||
die_loop = false,
|
||
},
|
||
drops = {
|
||
{name = 'bonemeal:bone', chance = 3, min = 1, max = 2}
|
||
},
|
||
|
||
on_spawn = function(self)
|
||
self.light_damage = mobs_skeletons.fn_DamagePerSecond(self)
|
||
end
|
||
})
|
||
|
||
mobs:register_mob('mobs_skeletons:skeleton_archer_dark', {
|
||
type = 'monster',
|
||
hp_min = (minetest.PLAYER_MAX_HP_DEFAULT - 10),
|
||
hp_max = (minetest.PLAYER_MAX_HP_DEFAULT + 10),
|
||
walk_velocity = 4,
|
||
run_velocity = 5.2,
|
||
stand_chance = 50,
|
||
walk_chance = 50,
|
||
jump = true,
|
||
jump_height = 1.1,
|
||
stepheight = 1.1,
|
||
pushable = true,
|
||
view_range = 16,
|
||
damage = 2,
|
||
knock_back = true,
|
||
fear_height = 6,
|
||
fall_damage = true,
|
||
lava_damage = 9999,
|
||
light_damage = 1,
|
||
light_damage_min = light_damage_min,
|
||
light_damage_max = light_damage_max,
|
||
suffocation = 0,
|
||
floats = 0,
|
||
reach = 4,
|
||
attack_chance = 1,
|
||
attack_animals = true,
|
||
attack_npcs = true,
|
||
attack_players = true,
|
||
group_attack = true,
|
||
attack_type = 'shoot',
|
||
arrow = 'mobs_skeletons:arrow',
|
||
shoot_interval = 1.5,
|
||
shoot_offset = 1.0,
|
||
blood_amount = 0,
|
||
pathfinding = 1,
|
||
makes_footstep_sound = true,
|
||
sounds = sounds,
|
||
visual = 'mesh',
|
||
visual_size = {x = 2.7, y = 2.7},
|
||
collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3},
|
||
selectionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3},
|
||
textures = {
|
||
'mobs_skeleton_bow.png',
|
||
'mobs_skeletons_skeleton_archer_dark.png',
|
||
'mobs_skeletons_skeleton_archer_dark_overlay.png'
|
||
},
|
||
mesh = 'mobs_skeletons_skeleton_archer_dark.b3d',
|
||
animation = {
|
||
stand_speed = 15,
|
||
stand_start = 0,
|
||
stand_end = 40,
|
||
walk_speed = 15,
|
||
walk_start = 40,
|
||
walk_end = 60,
|
||
run_speed = 30,
|
||
shoot_start = 70,
|
||
shoot_end = 90,
|
||
die_start = 160,
|
||
die_end = 170,
|
||
die_speed = 15,
|
||
die_loop = false,
|
||
},
|
||
drops = {
|
||
{name = 'bonemeal:bone', chance = 3, min = 1, max = 2}
|
||
},
|
||
|
||
on_spawn = function(self)
|
||
self.light_damage = mobs_skeletons.fn_DamagePerSecond(self)
|
||
end
|
||
})
|
||
|
||
|
||
---
|
||
--- Skeletons spawning
|
||
---
|
||
|
||
mobs:spawn({
|
||
name = 'mobs_skeletons:skeleton',
|
||
nodes = {'group:crumbly', 'group:cracky'},
|
||
neighbors = 'air',
|
||
chance = 7000,
|
||
active_object_count = 2,
|
||
min_height = -31000,
|
||
max_height = 31000,
|
||
day_toggle = false
|
||
})
|
||
|
||
mobs:spawn({
|
||
name = 'mobs_skeletons:skeleton_archer',
|
||
nodes = {'group:crumbly', 'group:cracky'},
|
||
neighbors = 'air',
|
||
chance = 7000,
|
||
active_object_count = 2,
|
||
min_height = -31000,
|
||
max_height = 31000,
|
||
day_toggle = false
|
||
})
|
||
|
||
mobs:spawn({
|
||
name = 'mobs_skeletons:skeleton_archer_dark',
|
||
nodes = {'group:crumbly', 'group:cracky'},
|
||
neighbors = 'air',
|
||
chance = 7000,
|
||
active_object_count = 2,
|
||
min_height = -31000,
|
||
max_height = 31000,
|
||
day_toggle = false
|
||
})
|
||
|
||
|
||
---
|
||
--- Spawn Eggs
|
||
---
|
||
|
||
mobs:register_egg('mobs_skeletons:skeleton', S('Skeleton'),
|
||
'mobs_skeletons_skeleton_egg.png')
|
||
|
||
mobs:register_egg('mobs_skeletons:skeleton_archer', S('Skeleton Archer'),
|
||
'mobs_skeletons_skeleton_archer_egg.png')
|
||
|
||
mobs:register_egg('mobs_skeletons:skeleton_archer_dark', S('Dark Skeleton Archer'),
|
||
'mobs_skeletons_skeleton_archer_dark_egg.png')
|
||
|
||
|
||
---
|
||
--- Aliases
|
||
---
|
||
|
||
mobs:alias_mob('mobs:skeleton', 'mobs_skeletons:skeleton')
|
||
mobs:alias_mob('mobs:skeleton_archer', 'mobs_skeletons:skeleton_archer')
|
||
mobs:alias_mob('mobs:dark_skeleton_archer', 'mobs_skeletons:skeleton_archer_dark')
|
||
|
||
|
||
print("[MOD] Mobs Skeletons loaded")
|