summaryrefslogtreecommitdiff
path: root/init.lua
blob: 5eb9208e6289c38ff6b940cf30a6d9e533ace876 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
local fnode = minetest.registered_entities["__builtin:falling_node"]
local attacknode = table.copy(fnode)

attacknode.initial_properties.collide_with_objects = false

function attacknode:update_node()
	local def = minetest.registered_nodes[self.node.name]
	self.description = def and minetest.strip_colors(def.description or ""):split("\n")[1] or self.node.name
	self.hp_max = math.floor((def and def._mcl_hardness or 1) * 15)
	self.object:set_hp(self.hp_max)
	self.object:set_properties{nametag = self.description}
end

function attacknode:set_node(node, meta)
	fnode.set_node(self, node, meta)
	self:update_node()
end

function attacknode:on_activate(staticdata)
	fnode.on_activate(self, staticdata)

	self.object:set_armor_groups({fleshy = 100})
	self.object:set_acceleration({x = 0, y = 0, z = 0})
	self:update_node()
end

function attacknode:on_step(dtime)
	self.health = self.object:get_hp()
	mcl_bossbars.update_boss(self, self.description, "yellow")
	local pos = self.object:get_pos()

	if not self.attack_timer then
		self.attack_timer = 0.5
	end

	if self.attack_timer <= 0 then
		for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 1.0)) do
			if obj:is_player() then
				self.attack_timer = 0.5
				mcl_death_messages.player_damage(obj, obj:get_player_name() .. " was slain by " .. self.description .. ".")
				obj:punch(self.object, 0.5, {full_punch_interval = 0.5, damage_groups = {fleshy = 5}}, vector.direction(pos, obj:get_pos()))
				break
			end
		end
	else
		self.attack_timer = self.attack_timer - dtime
	end

	if self.target then
		local target_pos = self.target:get_pos()
		if self.target:get_hp() <= 0 or vector.distance(pos, target_pos) > 48 then
			self.target = nil
		else
			self.object:set_velocity(vector.multiply(vector.direction(pos, target_pos), 3))
		end
	else
		for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 48)) do
			if obj:is_player() then
				self.target = obj
				break
			end
		end
	end
end

function attacknode:on_death(killer)
	local pos = vector.round(self.object:get_pos())
	minetest.set_node(pos, self.node)
	minetest.handle_node_drops(pos, minetest.get_node_drops(self.node, killer:get_wielded_item():get_name()), killer)
	minetest.remove_node(pos)
end

minetest.register_entity("attacking_nodes:node", attacknode)

minetest.register_on_punchnode(function(pos, node)
	minetest.add_entity(pos, "attacking_nodes:node"):get_luaentity():set_node(node, minetest.get_meta(pos))
	minetest.after(0.1, minetest.remove_node, pos)
end)