]> git.lizzy.rs Git - attacking_nodes.git/commitdiff
Initial commit
authorElias Fleckenstein <eliasfleckenstein@web.de>
Wed, 7 Apr 2021 15:31:39 +0000 (17:31 +0200)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Wed, 7 Apr 2021 15:31:39 +0000 (17:31 +0200)
init.lua [new file with mode: 0644]
mod.conf [new file with mode: 0644]

diff --git a/init.lua b/init.lua
new file mode 100644 (file)
index 0000000..5eb9208
--- /dev/null
+++ b/init.lua
@@ -0,0 +1,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)
diff --git a/mod.conf b/mod.conf
new file mode 100644 (file)
index 0000000..dccb0da
--- /dev/null
+++ b/mod.conf
@@ -0,0 +1 @@
+name = attacking_nodes