VoxeLibre/mods/ENTITIES/mobs_mc/iron_golem.lua

224 lines
5.8 KiB
Lua
Raw Permalink Normal View History

2017-07-05 03:15:46 +02:00
--MCmobs v0.4
--maikerumine
--made for MC like Survival game
--License for code WTFPL and otherwise stated in readmes
local S = minetest.get_translator("mobs_mc")
2023-09-13 07:21:19 +02:00
local allow_nav_hacks = minetest.settings:get_bool("mcl_mob_allow_nav_hacks ",false)
2017-07-05 03:15:46 +02:00
--###################
--################### IRON GOLEM
--###################
2023-09-10 13:33:37 +02:00
local walk_dist = 40
local tele_dist = 80
2017-07-05 03:15:46 +02:00
mcl_mobs.register_mob("mobs_mc:iron_golem", {
2021-04-25 17:30:15 +02:00
description = S("Iron Golem"),
2017-07-05 03:15:46 +02:00
type = "npc",
2020-04-11 02:46:03 +02:00
spawn_class = "passive",
passive = false,
2017-07-05 03:15:46 +02:00
hp_min = 100,
2021-05-23 15:10:20 +02:00
hp_max = 100,
2019-10-02 18:31:16 +02:00
breath_max = -1,
2017-07-05 03:15:46 +02:00
collisionbox = {-0.7, -0.01, -0.7, 0.7, 2.69, 0.7},
visual = "mesh",
mesh = "mobs_mc_iron_golem.b3d",
2022-10-07 04:02:22 +02:00
head_swivel = "head.control",
bone_eye_height = 3.38,
2022-10-07 04:08:47 +02:00
curiosity = 10,
2017-07-05 03:15:46 +02:00
textures = {
{"mobs_mc_iron_golem.png"},
},
visual_size = {x=3, y=3},
makes_footstep_sound = true,
-- TODO: sounds
2017-07-05 03:15:46 +02:00
view_range = 16,
stepheight = 1.1,
owner = "",
order = "follow",
floats = 0,
walk_velocity = 0.6,
run_velocity = 1.2,
-- Approximation
damage = 14,
knock_back = false,
2017-07-26 00:26:18 +02:00
reach = 3,
2023-01-13 23:35:50 +01:00
group_attack = { "mobs_mc:villager" },
2017-07-05 03:15:46 +02:00
attacks_monsters = true,
attack_type = "dogfight",
_got_poppy = false,
pick_up = {"mcl_flowers:poppy"},
on_pick_up = function(self,n)
local it = ItemStack(n.itemstring)
if it:get_name() == "mcl_flowers:poppy" then
if not self._got_poppy then
self._got_poppy=true
it:take_item(1)
end
end
return it
end,
replace_what = {"mcl_flowers:poppy"},
replace_with = {"air"},
on_replace = function(self, pos, oldnode, newnode)
if not self.got_poppy and oldnode.name == "mcl_flowers:poppy" then
self._got_poppy=true
return
end
return false
end,
2017-07-05 03:15:46 +02:00
drops = {
2022-05-25 23:25:15 +02:00
{name = "mcl_core:iron_ingot",
2017-07-05 03:15:46 +02:00
chance = 1,
min = 3,
max = 5,},
2022-05-25 23:25:15 +02:00
{name = "mcl_flowers:poppy",
2017-07-05 03:15:46 +02:00
chance = 1,
min = 0,
max = 2,},
},
fall_damage = 0,
animation = {
stand_speed = 15, walk_speed = 15, run_speed = 25, punch_speed = 15,
stand_start = 0, stand_end = 0,
walk_start = 0, walk_end = 40,
run_start = 40, run_end = 80,
punch_start = 80, punch_end = 90,
2017-07-05 03:15:46 +02:00
},
jump = true,
2023-09-10 13:33:37 +02:00
do_custom = function(self, dtime)
self.home_timer = (self.home_timer or 0) + dtime
if self.home_timer > 10 then
self.home_timer = 0
2023-09-11 07:18:39 +02:00
if self._home and self.state ~= "attack" then
2023-09-10 13:33:37 +02:00
local dist = vector.distance(self._home,self.object:get_pos())
2023-09-13 07:21:19 +02:00
if allow_nav_hacks and dist >= tele_dist then
2023-09-10 13:33:37 +02:00
self.object:set_pos(self._home)
self.state = "stand"
self.order = "follow"
elseif dist >= walk_dist then
self:gopath(self._home, function(self)
self.state = "stand"
self.order = "follow"
end)
end
end
end
end,
2017-07-05 03:15:46 +02:00
})
-- spawn eggs
mcl_mobs.register_egg("mobs_mc:iron_golem", S("Iron Golem"), "#3b3b3b", "#f57223", 0)
2017-07-05 03:15:46 +02:00
--[[ This is to be called when a pumpkin or jack'o lantern has been placed. Recommended: In the on_construct function of the node.
This summons an iron golen if placing the pumpkin created an iron golem summon pattern:
.P.
III
.I.
P = Pumpkin or jack'o lantern
I = Iron block
. = Air
]]
2022-05-25 23:25:15 +02:00
function mobs_mc.check_iron_golem_summon(pos)
2017-07-05 03:15:46 +02:00
local checks = {
-- These are the possible placement patterns, with offset from the pumpkin block.
-- These tables include the positions of the iron blocks (1-4) and air blocks (5-8)
-- 4th element is used to determine spawn position.
-- If a 9th element is present, that one is used for the spawn position instead.
-- Standing (x axis)
{
{x=-1, y=-1, z=0}, {x=1, y=-1, z=0}, {x=0, y=-1, z=0}, {x=0, y=-2, z=0}, -- iron blocks
{x=-1, y=0, z=0}, {x=1, y=0, z=0}, {x=-1, y=-2, z=0}, {x=1, y=-2, z=0}, -- air
},
-- Upside down standing (x axis)
{
{x=-1, y=1, z=0}, {x=1, y=1, z=0}, {x=0, y=1, z=0}, {x=0, y=2, z=0},
{x=-1, y=0, z=0}, {x=1, y=0, z=0}, {x=-1, y=2, z=0}, {x=1, y=2, z=0},
{x=0, y=0, z=0}, -- Different offset for upside down pattern
},
-- Standing (z axis)
{
{x=0, y=-1, z=-1}, {x=0, y=-1, z=1}, {x=0, y=-1, z=0}, {x=0, y=-2, z=0},
{x=0, y=0, z=-1}, {x=0, y=0, z=1}, {x=0, y=-2, z=-1}, {x=0, y=-2, z=1},
},
-- Upside down standing (z axis)
{
{x=0, y=1, z=-1}, {x=0, y=1, z=1}, {x=0, y=1, z=0}, {x=0, y=2, z=0},
{x=0, y=0, z=-1}, {x=0, y=0, z=1}, {x=0, y=2, z=-1}, {x=0, y=2, z=1},
{x=0, y=0, z=0},
},
-- Lying
{
{x=-1, y=0, z=-1}, {x=0, y=0, z=-1}, {x=1, y=0, z=-1}, {x=0, y=0, z=-2},
{x=-1, y=0, z=0}, {x=1, y=0, z=0}, {x=-1, y=0, z=-2}, {x=1, y=0, z=-2},
},
{
{x=-1, y=0, z=1}, {x=0, y=0, z=1}, {x=1, y=0, z=1}, {x=0, y=0, z=2},
{x=-1, y=0, z=0}, {x=1, y=0, z=0}, {x=-1, y=0, z=2}, {x=1, y=0, z=2},
},
{
{x=-1, y=0, z=-1}, {x=-1, y=0, z=0}, {x=-1, y=0, z=1}, {x=-2, y=0, z=0},
{x=0, y=0, z=-1}, {x=0, y=0, z=1}, {x=-2, y=0, z=-1}, {x=-2, y=0, z=1},
},
{
{x=1, y=0, z=-1}, {x=1, y=0, z=0}, {x=1, y=0, z=1}, {x=2, y=0, z=0},
{x=0, y=0, z=-1}, {x=0, y=0, z=1}, {x=2, y=0, z=-1}, {x=2, y=0, z=1},
},
}
for c=1, #checks do
-- Check all possible patterns
local ok = true
-- Check iron block nodes
for i=1, 4 do
local cpos = vector.add(pos, checks[c][i])
local node = minetest.get_node(cpos)
2022-05-25 23:25:15 +02:00
if node.name ~= "mcl_core:ironblock" then
2017-07-05 03:15:46 +02:00
ok = false
break
end
end
-- Check air nodes
for a=5, 8 do
local cpos = vector.add(pos, checks[c][a])
local node = minetest.get_node(cpos)
if node.name ~= "air" then
ok = false
break
end
end
-- Pattern found!
if ok then
-- Remove the nodes
minetest.remove_node(pos)
core.check_for_falling(pos)
2017-07-05 03:15:46 +02:00
for i=1, 4 do
local cpos = vector.add(pos, checks[c][i])
minetest.remove_node(cpos)
core.check_for_falling(cpos)
2017-07-05 03:15:46 +02:00
end
-- Summon iron golem
local place
if checks[c][9] then
place = vector.add(pos, checks[c][9])
else
place = vector.add(pos, checks[c][4])
end
place.y = place.y - 0.5
minetest.add_entity(place, "mobs_mc:iron_golem")
break
end
end
end
mcl_mobs:non_spawn_specific("mobs_mc:iron_golem","overworld",0,minetest.LIGHT_MAX+1)