]> git.lizzy.rs Git - attacking_nodes.git/blob - init.lua
Update to new MCL2 API
[attacking_nodes.git] / init.lua
1 local fnode = minetest.registered_entities["__builtin:falling_node"]
2 local attacknode = table.copy(fnode)
3
4 attacknode.initial_properties.collide_with_objects = false
5
6 function attacknode:update_node()
7         local def = minetest.registered_nodes[self.node.name]
8         self.description = def and minetest.strip_colors(def.description or ""):split("\n")[1] or self.node.name
9         self.hp_max = math.floor((def and def._mcl_hardness or 1) * 15)
10         self.object:set_hp(self.hp_max)
11         self.object:set_properties{nametag = self.description, hp_max = self.hp_max}
12 end
13
14 function attacknode:set_node(node, meta)
15         fnode.set_node(self, node, meta)
16
17         self:update_node()
18 end
19
20 function attacknode:on_activate(staticdata)
21         fnode.on_activate(self, staticdata)
22
23         self.object:set_armor_groups({fleshy = 100})
24         self.object:set_acceleration({x = 0, y = 0, z = 0})
25
26         self:update_node()
27 end
28
29 function attacknode:on_step(dtime)
30         self.health = self.object:get_hp()
31         mcl_bossbars.update_boss(self.object, self.description, "yellow")
32         local pos = self.object:get_pos()
33
34         if not self.attack_timer then
35                 self.attack_timer = 0.5
36         end
37
38         if self.attack_timer <= 0 then
39                 for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 1.0)) do
40                         if obj:is_player() then
41                                 self.attack_timer = 0.5
42                                 mcl_death_messages.player_damage(obj, obj:get_player_name() .. " was slain by " .. self.description .. ".")
43                                 obj:punch(self.object, 0.5, {full_punch_interval = 0.5, damage_groups = {fleshy = 5}}, vector.direction(pos, obj:get_pos()))
44                                 break
45                         end
46                 end
47         else
48                 self.attack_timer = self.attack_timer - dtime
49         end
50
51         if self.target then
52                 local target_pos = self.target:get_pos()
53                 if self.target:get_hp() <= 0 or vector.distance(pos, target_pos) > 48 then
54                         self.target = nil
55                 else
56                         self.object:set_velocity(vector.multiply(vector.direction(pos, target_pos), 3))
57                 end
58         else
59                 for _, obj in ipairs(minetest.get_objects_inside_radius(pos, 48)) do
60                         if obj:is_player() then
61                                 self.target = obj
62                                 break
63                         end
64                 end
65         end
66 end
67
68 function attacknode:on_death(killer)
69         local pos = vector.round(self.object:get_pos())
70         minetest.set_node(pos, self.node)
71         minetest.handle_node_drops(pos, minetest.get_node_drops(self.node, killer:get_wielded_item():get_name()), killer)
72         minetest.remove_node(pos)
73 end
74
75 minetest.register_entity("attacking_nodes:node", attacknode)
76
77 minetest.register_on_punchnode(function(pos, node)
78         minetest.add_entity(pos, "attacking_nodes:node"):get_luaentity():set_node(node, minetest.get_meta(pos))
79         minetest.after(0.1, minetest.remove_node, pos)
80 end)