From 00df587bf71741f1a8d25c60b50e570ecb74d277 Mon Sep 17 00:00:00 2001 From: HimbeerserverDE Date: Wed, 27 Jan 2021 20:11:02 +0100 Subject: [PATCH] Add flame enchantment --- mods/ENTITIES/mcl_burning/engine.lua | 12 +++++++++--- mods/ITEMS/mcl_bows/arrow.lua | 10 ++++++++++ mods/ITEMS/mcl_bows/bow.lua | 3 +++ mods/ITEMS/mcl_enchanting/enchantments.lua | 5 ++--- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/mods/ENTITIES/mcl_burning/engine.lua b/mods/ENTITIES/mcl_burning/engine.lua index 9e14915714..57890dd2f8 100644 --- a/mods/ENTITIES/mcl_burning/engine.lua +++ b/mods/ENTITIES/mcl_burning/engine.lua @@ -37,15 +37,21 @@ function mcl_burning.is_affected_by_rain(obj) return mcl_weather.get_weather() == "rain" and mcl_weather.is_outdoor(obj:get_pos()) end -function mcl_burning.get_collisionbox(obj) +function mcl_burning.get_collisionbox(obj, smaller) local box = obj:get_properties().collisionbox - return vector.new(box[1], box[2], box[3]), vector.new(box[4], box[5], box[6]) + local minp, maxp = vector.new(box[1], box[2], box[3]), vector.new(box[4], box[5], box[6]) + if smaller then + local s_vec = vector.new(0.1, 0.1, 0.1) + minp = vector.add(minp, s_vec) + maxp = vector.subtract(maxp, s_vec) + end + return minp, maxp end function mcl_burning.get_touching_nodes(obj, nodenames) local pos = obj:get_pos() local box = obj:get_properties().collisionbox - local minp, maxp = mcl_burning.get_collisionbox(obj) + local minp, maxp = mcl_burning.get_collisionbox(obj, true) local nodes = minetest.find_nodes_in_area(vector.add(pos, minp), vector.add(pos, maxp), nodenames) return nodes end diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index bc95fdb4fe..c89a22c1ae 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -83,6 +83,7 @@ local ARROW_ENTITY={ textures = {"mcl_bows:arrow_box"}, collisionbox = {-0.19, -0.125, -0.19, 0.19, 0.125, 0.19}, collide_with_objects = false, + _fire_damage_resistant = true, _lastpos={}, _startpos=nil, @@ -105,6 +106,7 @@ local spawn_item = function(self, pos) item:set_velocity({x=0, y=0, z=0}) item:set_yaw(self.object:get_yaw()) end + mcl_burning.extinguish(self.object) self.object:remove() end @@ -131,6 +133,8 @@ local damage_particles = function(pos, is_critical) end ARROW_ENTITY.on_step = function(self, dtime) + mcl_burning.tick(self.object, dtime) + local pos = self.object:get_pos() local dpos = table.copy(pos) -- digital pos dpos = vector.round(dpos) @@ -140,6 +144,7 @@ ARROW_ENTITY.on_step = function(self, dtime) self._stucktimer = self._stucktimer + dtime self._stuckrechecktimer = self._stuckrechecktimer + dtime if self._stucktimer > ARROW_TIMEOUT then + mcl_burning.extinguish(self.object) self.object:remove() return end @@ -171,6 +176,7 @@ ARROW_ENTITY.on_step = function(self, dtime) }, true) end end + mcl_burning.extinguish(self.object) self.object:remove() return end @@ -232,6 +238,7 @@ ARROW_ENTITY.on_step = function(self, dtime) local def = minetest.registered_nodes[nn] if (not def) or def.walkable then -- There's a node in the way. Delete arrow without damage + mcl_burning.extinguish(self.object) self.object:remove() return end @@ -244,6 +251,7 @@ ARROW_ENTITY.on_step = function(self, dtime) armor.last_damage_types[obj:get_player_name()] = "projectile" end damage_particles(self.object:get_pos(), self._is_critical) + mcl_burning.set_on_fire(obj, 4) obj:punch(self.object, 1.0, { full_punch_interval=1.0, damage_groups={fleshy=self._damage}, @@ -271,6 +279,7 @@ ARROW_ENTITY.on_step = function(self, dtime) end minetest.sound_play({name="mcl_bows_hit_other", gain=0.3}, {pos=self.object:get_pos(), max_hear_distance=16}, true) end + mcl_burning.extinguish(self.object) self.object:remove() return end @@ -403,6 +412,7 @@ ARROW_ENTITY.on_activate = function(self, staticdata, dtime_s) -- If yes, delete it. self._stucktimer = minetest.get_gametime() - data.stuckstarttime if self._stucktimer > ARROW_TIMEOUT then + mcl_burning.extinguish(self.object) self.object:remove() return end diff --git a/mods/ITEMS/mcl_bows/bow.lua b/mods/ITEMS/mcl_bows/bow.lua index 0f65469e7f..573af298f7 100644 --- a/mods/ITEMS/mcl_bows/bow.lua +++ b/mods/ITEMS/mcl_bows/bow.lua @@ -50,6 +50,9 @@ mcl_bows.shoot_arrow = function(arrow_item, pos, dir, yaw, shooter, power, damag if enchantments.punch then knockback = enchantments.punch * 3 end + if enchantments.flame then + mcl_burning.set_on_fire(obj, math.huge) + end end obj:set_velocity({x=dir.x*power, y=dir.y*power, z=dir.z*power}) obj:set_acceleration({x=0, y=-GRAVITY, z=0}) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 7d05bd3d17..75969f516c 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -240,8 +240,7 @@ mcl_enchanting.enchantments.fire_protection = { inv_tool_tab = false, } --- requires missing MineClone2 feature ---[[mcl_enchanting.enchantments.flame = { +mcl_enchanting.enchantments.flame = { name = S("Flame"), max_level = 1, primary = {bow = true}, @@ -257,7 +256,7 @@ mcl_enchanting.enchantments.fire_protection = { power_range_table = {{20, 50}}, inv_combat_tab = true, inv_tool_tab = false, -}]]-- +} -- implemented in mcl_item_entity mcl_enchanting.enchantments.fortune = {