From c51608c77087d415e0202fd05b37fb09b2db1d34 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 7 Apr 2021 17:31:39 +0200 Subject: [PATCH] Initial commit --- init.lua | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mod.conf | 1 + 2 files changed, 79 insertions(+) create mode 100644 init.lua create mode 100644 mod.conf diff --git a/init.lua b/init.lua new file mode 100644 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 index 0000000..dccb0da --- /dev/null +++ b/mod.conf @@ -0,0 +1 @@ +name = attacking_nodes -- 2.44.0