From a523aff8269f65b4f57f7756bde5a3398bf3b8c2 Mon Sep 17 00:00:00 2001 From: echoes91 Date: Wed, 28 Sep 2022 23:44:35 +0200 Subject: [PATCH 1/8] Update 2.3 --- CHANGELOG | 5 +++++ README | 2 +- defaults.lua | 1 + depends.txt | 1 - functions.lua | 12 ++++++------ init.lua | 5 +++-- mod.conf | 7 +++++++ spears.conf.example | 3 ++- tools.lua | 12 ++++++++---- 9 files changed, 33 insertions(+), 15 deletions(-) delete mode 100644 depends.txt create mode 100644 mod.conf diff --git a/CHANGELOG b/CHANGELOG index 4bc3040..ed3c853 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,8 @@ +Version 2.3: +- Updated to Minetest 5.6.0 API +- Changed receipts to avoid being confused with arrows +- Various cleansing and fixes + Version 2.2: - "Hit detection" based on spearhead position - Spears go through buildable_to nodes (snow) diff --git a/README b/README index 9c02ecf..a927120 100644 --- a/README +++ b/README @@ -19,7 +19,7 @@ Spears can be used to dig, but are slower and weaker and pickaxes. If you miss the target it's your fault, the spear is fine. You can grab a spear on the fly (or maybe wait until it falls?). You can stick a spear into a block, but if you remove the block then the spear falls (obviously). -This mod contains the word "spear" more than 100 times, if you want the exact number count them yourself. +This mod contains the word "spear" more than 100 times, if you want the exact number you can count them. If you feel clever, throw a spear right above you and look at it to see what happens. You can even throw a spear from above down to your foes, it's even easier to hit. Someone once reported to have hit its own foot but it takes practice to do that. diff --git a/defaults.lua b/defaults.lua index 62bf9bd..59e6bae 100644 --- a/defaults.lua +++ b/defaults.lua @@ -4,3 +4,4 @@ DISABLE_COPPER_SPEAR = false DISABLE_BRONZE_SPEAR = false DISABLE_DIAMOND_SPEAR = false DISABLE_OBSIDIAN_SPEAR = false +DISABLE_GOLD_SPEAR = false diff --git a/depends.txt b/depends.txt deleted file mode 100644 index 4ad96d5..0000000 --- a/depends.txt +++ /dev/null @@ -1 +0,0 @@ -default diff --git a/functions.lua b/functions.lua index 28be11b..1b9d33f 100644 --- a/functions.lua +++ b/functions.lua @@ -7,7 +7,7 @@ function spears_throw (itemstack, player, pointed_thing) local pitch = player:get_look_vertical() local yaw = player:get_look_horizontal() local rotation = vector.new(0, yaw + math.pi/2, pitch + math.pi/6) - -- Plant into node + -- Stick into node if pointed_thing.type == "node" then local node = minetest.get_node(pointed_thing.under) if minetest.registered_nodes[node.name].walkable and vector.distance(pointed_thing.above, throw_pos) < 1 then @@ -23,7 +23,7 @@ function spears_throw (itemstack, player, pointed_thing) while vector.distance(player_pos, throw_pos) < 1.2 do throw_pos = vector.add(throw_pos, vector.multiply(direction, 0.1)) end - local player_vel = player:get_player_velocity() + local player_vel = player:get_velocity() local spear_object = minetest.add_entity(throw_pos, spear) spear_object:set_velocity(vector.add(player_vel, vector.multiply(direction, throw_speed))) spear_object:set_rotation(rotation) @@ -63,6 +63,7 @@ function spears_set_entity(spear_type, base_damage, toughness) self.object:remove() return end + local pos = self.object:get_pos() local velocity = self.object:get_velocity() local speed = vector.length(velocity) -- Spear is stuck ? @@ -72,21 +73,20 @@ function spears_set_entity(spear_type, base_damage, toughness) if node_cracky and node_cracky < 3 then minetest.sound_play("default_metal_footstep", {pos = pos}, true) self.object:remove() - minetest.add_item(self.object:get_pos(), {name='spears:spear_' .. spear_type, wear = self._wear}) + minetest.add_item(pos, {name='spears:spear_' .. spear_type, wear = self._wear}) elseif not self._node_walkable then - minetest.sound_play("default_place_node", {pos = throw_pos}, true) + minetest.sound_play("default_place_node", {pos = pos}, true) end self._node_walkable = minetest.registered_nodes[node.name].walkable if not node or not self._node_walkable then -- Fall when node is removed self.object:remove() - minetest.add_item(self.object:get_pos(), {name='spears:spear_' .. spear_type, wear = self._wear}) + minetest.add_item(pos, {name='spears:spear_' .. spear_type, wear = self._wear}) return end else -- Spear is flying local direction = vector.normalize(velocity) local yaw = minetest.dir_to_yaw(direction) local pitch = math.acos(velocity.y/speed) - math.pi/3 - local pos = self.object:get_pos() local spearhead_pos = vector.add(pos, vector.multiply(direction, 0.5)) local node = minetest.get_node(spearhead_pos) self.object:set_rotation({x = 0, y = yaw + math.pi/2, z = pitch}) diff --git a/init.lua b/init.lua index 3a45772..eca9a05 100644 --- a/init.lua +++ b/init.lua @@ -11,7 +11,8 @@ dofile(minetest.get_modpath("spears").."/functions.lua") dofile(minetest.get_modpath("spears").."/tools.lua") +local log_mods = minetest.settings:get_bool("log_mods") -if minetest.setting_get("log_mods") then - minetest.log("action", "spears loaded") +if minetest.settings:get_bool("log_mods") then + minetest.log("action", "[MOD] Spears loaded") end diff --git a/mod.conf b/mod.conf new file mode 100644 index 0000000..4923e2a --- /dev/null +++ b/mod.conf @@ -0,0 +1,7 @@ +name = spears +depends = default +description = Add spears to Minetest, versatile weapons that can be thrown +release = 2.3 +author = Echoes91 +title = Spears + diff --git a/spears.conf.example b/spears.conf.example index 241ce08..a9bed2d 100644 --- a/spears.conf.example +++ b/spears.conf.example @@ -3,4 +3,5 @@ DISABLE_STEEL_SPEAR = true DISABLE_COPPER_SPEAR = true DISABLE_BRONZE_SPEAR = true DISABLE_DIAMOND_SPEAR = true -DISABLE_OBSIDIAN_SPEAR = true \ No newline at end of file +DISABLE_OBSIDIAN_SPEAR = true +DISABLE_GOLD_SPEAR = true diff --git a/tools.lua b/tools.lua index 49b5af4..6cd33a7 100644 --- a/tools.lua +++ b/tools.lua @@ -7,14 +7,14 @@ function spears_register_spear(spear_type, desc, base_damage, toughness, materia wield_scale= {x = 1.5, y = 1.5, z = 1.5}, on_secondary_use = function(itemstack, user, pointed_thing) spears_throw(itemstack, user, pointed_thing) - if not minetest.setting_getbool("creative_mode") then + if not minetest.settings:get_bool("creative_mode") then itemstack:take_item() end return itemstack end, on_place = function(itemstack, user, pointed_thing) spears_throw(itemstack, user, pointed_thing) - if not minetest.setting_getbool("creative_mode") then + if not minetest.settings:get_bool("creative_mode") then itemstack:take_item() end return itemstack @@ -38,14 +38,18 @@ function spears_register_spear(spear_type, desc, base_damage, toughness, materia minetest.register_craft({ output = 'spears:spear_' .. spear_type, recipe = { - {'group:stick', 'group:stick', material}, + {"", "", material}, + {"", "group:stick", ""}, + {"group:stick", "", ""} } }) minetest.register_craft({ output = 'spears:spear_' .. spear_type, recipe = { - {material, 'group:stick', 'group:stick'}, + {material, "", ""}, + {"", "group:stick", ""}, + {"", "", "group:stick"} } }) end From 2cfbd68b48b981f0c26b5d03d38f552a5a3c735b Mon Sep 17 00:00:00 2001 From: echoes91 Date: Wed, 28 Sep 2022 23:50:27 +0200 Subject: [PATCH 2/8] Update 2.3 --- README | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README b/README index a927120..1f42b23 100644 --- a/README +++ b/README @@ -12,7 +12,10 @@ How to install: http://wiki.minetest.com/wiki/Installing_Mods How to use the mod: -Craft a spear with | stick | stick | (material) |, works also mirrored. +Craft a spear with | | | (material) | + | | stick | | + | stick | | |, +works also mirrored. Spears can be thrown using right mouse button, they either hurt someone or stick where they land on; damage depends on speed and material, flight trajectory is ballistic with (unrealistic) drag. Spears can be used to fight, but are slower and weaker than swords. Spears can be used to dig, but are slower and weaker and pickaxes. From 5b5e6a2774792bae875a6b69ede2fc4234477731 Mon Sep 17 00:00:00 2001 From: Echoes Date: Thu, 29 Sep 2022 12:06:36 +0000 Subject: [PATCH 3/8] Update mod.conf --- mod.conf | 1 - 1 file changed, 1 deletion(-) diff --git a/mod.conf b/mod.conf index 4923e2a..fe67fe1 100644 --- a/mod.conf +++ b/mod.conf @@ -1,7 +1,6 @@ name = spears depends = default description = Add spears to Minetest, versatile weapons that can be thrown -release = 2.3 author = Echoes91 title = Spears From f2e49d11cbf9ea0b7e3a058a147fd765f8fccb83 Mon Sep 17 00:00:00 2001 From: Echoes Date: Thu, 29 Sep 2022 12:10:04 +0000 Subject: [PATCH 4/8] Update mod.conf --- mod.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/mod.conf b/mod.conf index fe67fe1..10590e7 100644 --- a/mod.conf +++ b/mod.conf @@ -3,4 +3,5 @@ depends = default description = Add spears to Minetest, versatile weapons that can be thrown author = Echoes91 title = Spears +min_minetest_version = 5.4 From 8dad57e2a6b15db22addf4716f7db0807149cbdf Mon Sep 17 00:00:00 2001 From: echoes91 Date: Wed, 12 Oct 2022 23:20:51 +0200 Subject: [PATCH 5/8] Version 2.4 --- defaults.lua | 8 +++ functions.lua | 142 +++++++++++++++++++++++++++----------------- spears.conf.example | 1 + 3 files changed, 98 insertions(+), 53 deletions(-) diff --git a/defaults.lua b/defaults.lua index 59e6bae..7dfa340 100644 --- a/defaults.lua +++ b/defaults.lua @@ -5,3 +5,11 @@ DISABLE_BRONZE_SPEAR = false DISABLE_DIAMOND_SPEAR = false DISABLE_OBSIDIAN_SPEAR = false DISABLE_GOLD_SPEAR = false +SPEARS_THROW_SPEED = 13 +SPEARS_V_ZERO = {x = 0, y = 0, z = 0} +SPEARS_DRAG_COEFF = 0.1 +SPEARS_NODE_UNKNOWN = nil +SPEARS_NODE_THROUGH = 0 +SPEARS_NODE_STICKY = 1 +SPEARS_NODE_CRACKY = 2 +SPEARS_NODE_CRACKY_LIMIT = 3 diff --git a/functions.lua b/functions.lua index 1b9d33f..9f23bd1 100644 --- a/functions.lua +++ b/functions.lua @@ -7,30 +7,39 @@ function spears_throw (itemstack, player, pointed_thing) local pitch = player:get_look_vertical() local yaw = player:get_look_horizontal() local rotation = vector.new(0, yaw + math.pi/2, pitch + math.pi/6) - -- Stick into node - if pointed_thing.type == "node" then - local node = minetest.get_node(pointed_thing.under) - if minetest.registered_nodes[node.name].walkable and vector.distance(pointed_thing.above, throw_pos) < 1 then - local spear_object = minetest.add_entity(vector.divide(vector.add(vector.multiply(pointed_thing.above, 2), pointed_thing.under), 3), spear) + local wear = itemstack:get_wear() + local pointed_a = pointed_thing.above + local pointed_b = pointed_thing.under + if pointed_thing.type == "node" and vector.distance(pointed_a, throw_pos) < 1 then -- Stick into node + local node = minetest.get_node(pointed_b) + local check_node = spears_check_node(node.name) + if check_node == SPEARS_NODE_UNKNOWN then + return false + elseif check_node == SPEARS_NODE_CRACKY then + minetest.sound_play("default_metal_footstep", {pos = pointed_a}, true) + return false + elseif check_node == SPEARS_NODE_STICKY then + local spear_object = minetest.add_entity(vector.divide(vector.add(vector.multiply(pointed_a, 2), pointed_b), 3), spear) spear_object:set_rotation(rotation) - spear_object:get_luaentity()._wear = itemstack:get_wear() - spear_object:get_luaentity()._stickpos = pointed_thing.under - return + spear_object:get_luaentity()._wear = wear + spear_object:get_luaentity()._stickpos = pointed_b + minetest.sound_play("default_place_node", {pos = pointed_a}, true) + return false end + else -- Avoid hitting yourself and throw + local throw_speed = SPEARS_THROW_SPEED + while vector.distance(player_pos, throw_pos) < 1.2 do + throw_pos = vector.add(throw_pos, vector.multiply(direction, 0.1)) + end + local player_vel = player:get_velocity() + local spear_object = minetest.add_entity(throw_pos, spear) + spear_object:set_velocity(vector.add(player_vel, vector.multiply(direction, throw_speed))) + spear_object:set_rotation(rotation) + minetest.sound_play("spears_throw", {pos = player_pos}, true) + spear_object:get_luaentity()._wear = wear + spear_object:get_luaentity()._stickpos = nil + return true end - -- Avoid hitting yourself and throw - local throw_speed = 12 - while vector.distance(player_pos, throw_pos) < 1.2 do - throw_pos = vector.add(throw_pos, vector.multiply(direction, 0.1)) - end - local player_vel = player:get_velocity() - local spear_object = minetest.add_entity(throw_pos, spear) - spear_object:set_velocity(vector.add(player_vel, vector.multiply(direction, throw_speed))) - spear_object:set_rotation(rotation) - minetest.sound_play("spears_throw", {pos = player_pos}, true) - spear_object:get_luaentity()._wear = itemstack:get_wear() - spear_object:get_luaentity()._stickpos = nil - return true end function spears_set_entity(spear_type, base_damage, toughness) @@ -59,36 +68,27 @@ function spears_set_entity(spear_type, base_damage, toughness) end, on_step = function(self, dtime) - if not self._wear then + local wear = self._wear + if wear == nil then self.object:remove() - return + return false end local pos = self.object:get_pos() local velocity = self.object:get_velocity() local speed = vector.length(velocity) - -- Spear is stuck ? - if self._stickpos then + if self._stickpos ~= nil then -- Spear is stuck local node = minetest.get_node(self._stickpos) - local node_cracky = minetest.registered_nodes[node.name].groups.cracky - if node_cracky and node_cracky < 3 then - minetest.sound_play("default_metal_footstep", {pos = pos}, true) + local check_node = spears_check_node(node.name) + if check_node ~= SPEARS_NODE_STICKY then -- Fall when node is removed self.object:remove() - minetest.add_item(pos, {name='spears:spear_' .. spear_type, wear = self._wear}) - elseif not self._node_walkable then - minetest.sound_play("default_place_node", {pos = pos}, true) - end - self._node_walkable = minetest.registered_nodes[node.name].walkable - if not node or not self._node_walkable then -- Fall when node is removed - self.object:remove() - minetest.add_item(pos, {name='spears:spear_' .. spear_type, wear = self._wear}) - return + minetest.add_item(pos, {name='spears:spear_' .. spear_type, wear = wear}) + return false end else -- Spear is flying local direction = vector.normalize(velocity) local yaw = minetest.dir_to_yaw(direction) local pitch = math.acos(velocity.y/speed) - math.pi/3 local spearhead_pos = vector.add(pos, vector.multiply(direction, 0.5)) - local node = minetest.get_node(spearhead_pos) self.object:set_rotation({x = 0, y = yaw + math.pi/2, z = pitch}) -- Hit someone? local objects_in_radius = minetest.get_objects_inside_radius(spearhead_pos, 0.6) @@ -98,26 +98,39 @@ function spears_set_entity(spear_type, base_damage, toughness) object:punch(self.object, 1.0, {full_punch_interval = 1.0, damage_groups = {fleshy=damage},}, direction) self.object:remove() minetest.sound_play("spears_hit", {pos = pos}, true) - minetest.add_item(pos, {name='spears:spear_' .. spear_type, wear = self._wear + 65535/toughness}) - return + wear = spears_wear(wear, toughness) + minetest.add_item(pos, {name='spears:spear_' .. spear_type, wear = wear}) + return true end end - -- Hit a node? - if node and minetest.registered_nodes[node.name].walkable - and not minetest.registered_nodes[node.name].buildable_to - and not (minetest.registered_nodes[node.name].groups.slab and spearhead_pos.y % 1 < 0.5) - then -- Stick - self.object:set_acceleration({x = 0, y = 0, z = 0}) - self.object:set_velocity({x = 0, y = 0, z = 0}) - self._wear = self._wear + 65535/toughness - if self._wear >= 65535 then + -- Hit a node? + local node = minetest.get_node(spearhead_pos) + local check_node = spears_check_node(node.name) + if check_node == SPEARS_NODE_UNKNOWN then + self.object:remove() + minetest.add_item(pos, {name='spears:spear_' .. spear_type, wear = wear}) + elseif check_node ~= SPEARS_NODE_THROUGH then + wear = spears_wear(wear, toughness) + if wear >= 65535 then minetest.sound_play("default_tool_breaks", {pos = pos}, true) self.object:remove() - return + minetest.add_item(pos, {name='defaut:stick'}) + return false + elseif check_node == SPEARS_NODE_CRACKY then + minetest.sound_play("default_metal_footstep", {pos = pos}, true) + self.object:remove() + minetest.add_item(pos, {name='spears:spear_' .. spear_type, wear = wear}) + return false + elseif check_node == SPEARS_NODE_STICKY then + self.object:set_acceleration(SPEARS_V_ZERO) + self.object:set_velocity(SPEARS_V_ZERO) + minetest.sound_play("default_place_node", {pos = pos}, true) + self._stickpos = spearhead_pos + self._wear = wear end - self._stickpos = spearhead_pos - else -- Get drag - local drag = math.max(minetest.registered_nodes[node.name].liquid_viscosity, 0.1) + else -- Get drag + local viscosity = minetest.registered_nodes[node.name].liquid_viscosity + local drag = math.max(viscosity, SPEARS_DRAG_COEFF) local acceleration = vector.multiply(velocity, -drag) acceleration.y = acceleration.y - 10 * ((7 - drag) / 7) self.object:set_acceleration(acceleration) @@ -127,3 +140,26 @@ function spears_set_entity(spear_type, base_damage, toughness) } return SPEAR_ENTITY end + +function spears_check_node(node_name) + local node = minetest.registered_nodes[node_name] + if node == nil then + return SPEARS_NODE_UNKNOWN + elseif node.groups.cracky ~= nil and node.groups.cracky < SPEARS_NODE_CRACKY_LIMIT then + return SPEARS_NODE_CRACKY + elseif node.walkable and not node.buildable then + return SPEARS_NODE_STICKY + else + return SPEARS_NODE_THROUGH + end +end + +function spears_wear(initial_wear, toughness) + if not minetest.settings:get_bool("creative_mode") then + local wear = initial_wear + 65535/toughness + return wear + else + local wear = initial_wear + return wear + end +end diff --git a/spears.conf.example b/spears.conf.example index a9bed2d..a92a86d 100644 --- a/spears.conf.example +++ b/spears.conf.example @@ -5,3 +5,4 @@ DISABLE_BRONZE_SPEAR = true DISABLE_DIAMOND_SPEAR = true DISABLE_OBSIDIAN_SPEAR = true DISABLE_GOLD_SPEAR = true +SPEARS_THROW_SPEED = 13 From 4083fd61814cb5fa9a1f55948ef504d506be1f51 Mon Sep 17 00:00:00 2001 From: echoes91 Date: Wed, 12 Oct 2022 23:51:07 +0200 Subject: [PATCH 6/8] Version 2.4 - Add pigiron --- defaults.lua | 1 + tools.lua | 32 +++++++++++++++++++++++--------- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/defaults.lua b/defaults.lua index 7dfa340..7b9edaa 100644 --- a/defaults.lua +++ b/defaults.lua @@ -5,6 +5,7 @@ DISABLE_BRONZE_SPEAR = false DISABLE_DIAMOND_SPEAR = false DISABLE_OBSIDIAN_SPEAR = false DISABLE_GOLD_SPEAR = false +DISABLE_IRON_SPEAR = false SPEARS_THROW_SPEED = 13 SPEARS_V_ZERO = {x = 0, y = 0, z = 0} SPEARS_DRAG_COEFF = 0.1 diff --git a/tools.lua b/tools.lua index 6cd33a7..2793408 100644 --- a/tools.lua +++ b/tools.lua @@ -58,17 +58,31 @@ if not DISABLE_STONE_SPEAR then spears_register_spear('stone', 'Stone', 4, 20, 'group:stone') end -if not DISABLE_STEEL_SPEAR then - spears_register_spear('steel', 'Steel', 6, 30, 'default:steel_ingot') +if minetest.get_modpath("pigiron") then + if not DISABLE_IRON_SPEAR then + spears_register_spear('iron', 'Iron', 5.5, 30, 'pigiron:iron_ingot') + end + if not DISABLE_STEEL_SPEAR then + spears_register_spear('steel', 'Steel', 6, 35, 'default:steel_ingot') + end + if not DISABLE_COPPER_SPEAR then + spears_register_spear('copper', 'Copper', 4.8, 30, 'default:copper_ingot') + end + if not DISABLE_BRONZE_SPEAR then + spears_register_spear('bronze', 'Bronze', 5.5, 35, 'default:bronze_ingot') + end +else + if not DISABLE_STEEL_SPEAR then + spears_register_spear('steel', 'Steel', 6, 30, 'default:steel_ingot') + end + if not DISABLE_COPPER_SPEAR then + spears_register_spear('copper', 'Copper', 5, 30, 'default:copper_ingot') + end + if not DISABLE_BRONZE_SPEAR then + spears_register_spear('bronze', 'Bronze', 6, 35, 'default:bronze_ingot') + end end -if not DISABLE_COPPER_SPEAR then - spears_register_spear('copper', 'Copper', 5, 35, 'default:copper_ingot') -end - -if not DISABLE_BRONZE_SPEAR then - spears_register_spear('bronze', 'Bronze', 6, 35, 'default:bronze_ingot') -end if not DISABLE_OBSIDIAN_SPEAR then spears_register_spear('obsidian', 'Obsidian', 8, 30, 'default:obsidian') From dca8c3ea26246eb78de0125abd0d3e3a39615f0e Mon Sep 17 00:00:00 2001 From: echoes91 Date: Wed, 12 Oct 2022 23:52:34 +0200 Subject: [PATCH 7/8] Version 2.4 - Add pigiron --- textures/spears_spear_iron.png | Bin 0 -> 223 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 textures/spears_spear_iron.png diff --git a/textures/spears_spear_iron.png b/textures/spears_spear_iron.png new file mode 100644 index 0000000000000000000000000000000000000000..659bcda88a4ae87f5cb32d51e5f3b9bb5bd7f7bf GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf0k6jo?*q zHEv^ElI3RDAak~W`NY*T2Y_Hpp{MlCS&|YG5;ID8Wh6s-Y)@VSNiZ-Z&Z_yjK*R1V P(1i@1u6{1-oD!M<$R1Vx literal 0 HcmV?d00001 From 5ac99ff83512aaa6c45751863f7f5311ed0ac913 Mon Sep 17 00:00:00 2001 From: Echoes Date: Wed, 12 Oct 2022 21:58:41 +0000 Subject: [PATCH 8/8] Version 2.4 --- CHANGELOG | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index ed3c853..1a53d7c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +Version 2.4: +- Functions rewrite, fixed many vector/variable declarations and unknown node handling +- Added pigiron support + Version 2.3: - Updated to Minetest 5.6.0 API - Changed receipts to avoid being confused with arrows