1
0
mirror of https://gitlab.com/echoes91/spears.git synced 2025-02-02 02:20:17 +01:00

Version 3.2.0

This commit is contained in:
Andrea 2024-12-27 11:33:07 +01:00
parent 2335f45b71
commit fcfd6f64d7
8 changed files with 120 additions and 99 deletions

View File

@ -1,3 +1,8 @@
Version 3.2.0
- Moving from minetest. to core. API calls for future-proof newcomers-friendly maintenance.
- Properly manage default settings values in defaults.lua
- Addied full_punch_interval parameter to settings
Update 3.1.2 Update 3.1.2
- Fix initial loading with fallback values for logging and Esperanto translations tweaks. - Fix initial loading with fallback values for logging and Esperanto translations tweaks.

View File

@ -1,30 +1,32 @@
=== SPEARS for MINETEST by Echoes91 === === SPEARS for LUANTI by Echoes91 ===
This mod adds spears to Minetest. This mod adds spears to Luanti (formerly to Minetest).
How to download: How to download:
If you have this file, you probably know. If you have this file, you probably know.
If you're reading from gitlab.com, you already know. If you're reading from gitlab.com, you already know.
But in doubt, https://gitlab.com/echoes91/spears/-/archive/master/spears-master.zip
Forum topic: Forum topic:
https://forum.minetest.net/viewtopic.php?f=11&t=13367 https://forum.luanti.org/viewtopic.php?t=13367
How to install: How to install:
Minetest content DB is the way! Content DB is the way!
http://wiki.minetest.com/wiki/Installing_Mods https://wiki.luanti.org/Mods#Installation
How to use the mod: How to use the mod:
Craft a spear with | | | (material) | Craft a spear with | | | material |
| | stick | | | | stick | |
| stick | | |, | stick | | |
works also mirrored. 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 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 fight, but are slower and weaker than swords.
Spears can be used to dig, but are slower and weaker and pickaxes. 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. 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 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). 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 you can count them. This mod contains the word "spear" more than 100 times, if you want to know the exact number there must be a sed script for that.
If you feel clever, throw a spear right above you and look at it to see what happens. 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. You can even throw a spear down to your foes from above, it's even easier to hit!
Someone once reported to have hit its own foot but it takes practice to do that. Someone once reported to have hit its own foot but it takes practice to do that.

View File

@ -1,30 +1,52 @@
-- Seems like defaults in settingtypes.txt are not taken by default -- Seems like defaults in settingtypes.txt are not taken by default, let's default them
--if minetest.settings:get("spears_throw_speed") == nil then if core.settings:get("spears_throw_speed") == nil then
-- minetest.settings:set("spears_throw_speed", 13) core.settings:set("spears_throw_speed", 13)
--end end
--[[ if minetest.settings:get("spears_drag_coeff") == nil then if core.settings:get("spears_drag_coeff") == nil then
minetest.settings:set("spears_drag_coeff", 0.1) core.settings:set("spears_drag_coeff", 0.1)
end ]] end
-- if minetest.settings:get("spears_node_cracky_limit") == nil then if core.settings:get("spears_node_cracky_limit") == nil then
-- minetest.settings:set("spears_node_cracky_limit", 3) core.settings:set("spears_node_cracky_limit", 3)
-- end end
if core.settings:get("spears_full_punch_interval") == nil then
core.settings:set("spears_full_punch_interval", 1.5)
end
-- DISABLE_STONE_SPEAR = false if core.settings:get("spears_enable_stone_spear") == nil then
-- DISABLE_STEEL_SPEAR = false core.settings:set_bool("spears_enable_stone_spear", true)
-- DISABLE_COPPER_SPEAR = false end
-- DISABLE_BRONZE_SPEAR = false
-- DISABLE_DIAMOND_SPEAR = false if core.get_modpath("pigiron") then
-- DISABLE_OBSIDIAN_SPEAR = false if core.settings:get("spears_enable_iron_spear") == nil then
-- DISABLE_GOLD_SPEAR = false core.settings:set_bool("spears_enable_iron_spear", true)
-- DISABLE_IRON_SPEAR = false end
-- SPEARS_THROW_SPEED = 13 else
-- SPEARS_V_ZERO = {x = 0, y = 0, z = 0} core.settings:set_bool("spears_enable_iron_spear", false)
-- SPEARS_DRAG_COEFF = 0.1 end
-- SPEARS_NODE_UNKNOWN = nil
-- SPEARS_NODE_THROUGH = 0 if core.settings:get("spears_enable_steel_spear") == nil then
-- SPEARS_NODE_STICKY = 1 core.settings:set_bool("spears_enable_steel_spear", true)
-- SPEARS_NODE_CRACKY = 2 end
-- SPEARS_NODE_CRACKY_LIMIT = 3
if core.settings:get("spears_enable_copper_spear") == nil then
core.settings:set_bool("spears_enable_copper_spear", true)
end
if core.settings:get("spears_enable_bronze_spear") == nil then
core.settings:set_bool("spears_enable_bronze_spear", true)
end
if core.settings:get("spears_enable_obsidian_spear") == nil then
core.settings:set_bool("spears_enable_obsidian_spear", true)
end
if core.settings:get("spears_enable_diamond_spear") == nil then
core.settings:set_bool("spears_enable_diamond_spear", true)
end
if core.settings:get("spears_enable_gold_spear") == nil then
core.settings:set_bool("spears_enable_gold_spear", true)
end

View File

@ -11,31 +11,28 @@ function spears_throw (itemstack, player, pointed_thing)
local pointed_a = pointed_thing.above local pointed_a = pointed_thing.above
local pointed_b = pointed_thing.under local pointed_b = pointed_thing.under
if pointed_thing.type == "node" and vector.distance(pointed_a, throw_pos) < 1 then -- Stick into node 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 node = core.get_node(pointed_b)
local check_node = spears_check_node(node.name) local check_node = spears_check_node(node.name)
if check_node == nil then if check_node == nil then
return false return false
elseif check_node == 'cracky' then elseif check_node == 'cracky' then
minetest.sound_play("default_metal_footstep", {pos = pointed_a}, true) core.sound_play("default_metal_footstep", {pos = pointed_a}, true)
return false return false
elseif check_node == 'sticky' then elseif check_node == 'sticky' then
local spear_object = minetest.add_entity(vector.divide(vector.add(vector.multiply(pointed_a, 2), pointed_b), 3), spear) local spear_object = core.add_entity(vector.divide(vector.add(vector.multiply(pointed_a, 2), pointed_b), 3), spear)
spear_object:set_rotation(rotation) spear_object:set_rotation(rotation)
spear_object:get_luaentity()._wear = wear spear_object:get_luaentity()._wear = wear
spear_object:get_luaentity()._stickpos = pointed_b spear_object:get_luaentity()._stickpos = pointed_b
minetest.sound_play("default_place_node", {pos = pointed_a}, true) core.sound_play("default_place_node", {pos = pointed_a}, true)
return false return false
end end
else -- Throw else -- Throw
local throw_speed = tonumber(minetest.settings:get("spears_throw_speed") or 13) local throw_speed = tonumber(core.settings:get("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 player_vel = player:get_velocity()
local spear_object = minetest.add_entity(throw_pos, spear) local spear_object = core.add_entity(throw_pos, spear)
spear_object:set_velocity(vector.add(player_vel, vector.multiply(direction, throw_speed))) spear_object:set_velocity(vector.add(player_vel, vector.multiply(direction, throw_speed)))
spear_object:set_rotation(rotation) spear_object:set_rotation(rotation)
minetest.sound_play("spears_throw", {pos = player_pos}, true) core.sound_play("spears_throw", {pos = player_pos}, true)
spear_object:get_luaentity()._wear = wear spear_object:get_luaentity()._wear = wear
spear_object:get_luaentity()._stickpos = nil spear_object:get_luaentity()._stickpos = nil
spear_object:get_luaentity()._owner = player:get_luaentity() spear_object:get_luaentity()._owner = player:get_luaentity()
@ -78,60 +75,60 @@ function spears_set_entity(spear_type, base_damage, toughness)
local velocity = self.object:get_velocity() local velocity = self.object:get_velocity()
local speed = vector.length(velocity) local speed = vector.length(velocity)
if self._stickpos ~= nil then -- Spear is stuck if self._stickpos ~= nil then -- Spear is stuck
local node = minetest.get_node(self._stickpos) local node = core.get_node(self._stickpos)
local check_node = spears_check_node(node.name) local check_node = spears_check_node(node.name)
if check_node ~= 'sticky' then -- Fall when node is removed if check_node ~= 'sticky' then -- Fall when node is removed
self.object:remove() self.object:remove()
minetest.add_item(pos, {name='spears:spear_' .. spear_type, wear = wear}) core.add_item(pos, {name='spears:spear_' .. spear_type, wear = wear})
return false return false
end end
else -- Spear is flying else -- Spear is flying
local direction = vector.normalize(velocity) local direction = vector.normalize(velocity)
local yaw = minetest.dir_to_yaw(direction) local yaw = core.dir_to_yaw(direction)
local pitch = math.acos(velocity.y/speed) - math.pi/3 local pitch = math.acos(velocity.y/speed) - math.pi/3
local spearhead_pos = vector.add(pos, vector.multiply(direction, 0.5)) local spearhead_pos = vector.add(pos, vector.multiply(direction, 0.5))
self.object:set_rotation({x = 0, y = yaw + math.pi/2, z = pitch}) self.object:set_rotation({x = 0, y = yaw + math.pi/2, z = pitch})
-- Hit a target? -- Hit a target?
local objects_in_radius = minetest.get_objects_inside_radius(spearhead_pos, 1) local objects_in_radius = core.get_objects_inside_radius(spearhead_pos, 1)
for _,object in ipairs(objects_in_radius) do for _,object in ipairs(objects_in_radius) do
if spears_check_target(self, object, spearhead_pos) and object:get_armor_groups().fleshy then if spears_check_target(self, object, spearhead_pos) and object:get_armor_groups().fleshy then
local damage = (speed + base_damage)^1.15 - 20 local damage = (speed + base_damage)^1.15 - 20
object:punch(self.object, 1.0, {full_punch_interval = 1.0, damage_groups = {fleshy=damage},}, direction) object:punch(self.object, 1.0, {full_punch_interval = 1.0, damage_groups = {fleshy=damage},}, direction)
self.object:remove() self.object:remove()
minetest.sound_play("spears_hit", {pos = pos}, true) core.sound_play("spears_hit", {pos = pos}, true)
wear = spears_wear(wear, toughness) wear = spears_wear(wear, toughness)
minetest.add_item(pos, {name='spears:spear_' .. spear_type, wear = wear}) core.add_item(pos, {name='spears:spear_' .. spear_type, wear = wear})
return true return true
end end
end end
-- Hit a node? -- Hit a node?
local node = minetest.get_node(spearhead_pos) local node = core.get_node(spearhead_pos)
local check_node = spears_check_node(node.name) local check_node = spears_check_node(node.name)
if check_node == nil then if check_node == nil then
self.object:remove() self.object:remove()
minetest.add_item(pos, {name='spears:spear_' .. spear_type, wear = wear}) core.add_item(pos, {name='spears:spear_' .. spear_type, wear = wear})
elseif check_node ~= 'through' then elseif check_node ~= 'through' then
wear = spears_wear(wear, toughness) wear = spears_wear(wear, toughness)
if wear >= 65535 then if wear >= 65535 then
minetest.sound_play("default_tool_breaks", {pos = pos}, true) core.sound_play("default_tool_breaks", {pos = pos}, true)
self.object:remove() self.object:remove()
minetest.add_item(pos, {name='defaut:stick'}) core.add_item(pos, {name='defaut:stick'})
return false return false
elseif check_node == 'cracky' then elseif check_node == 'cracky' then
minetest.sound_play("default_metal_footstep", {pos = pos}, true) core.sound_play("default_metal_footstep", {pos = pos}, true)
self.object:remove() self.object:remove()
minetest.add_item(pos, {name='spears:spear_' .. spear_type, wear = wear}) core.add_item(pos, {name='spears:spear_' .. spear_type, wear = wear})
return false return false
elseif check_node == 'sticky' then elseif check_node == 'sticky' then
self.object:set_acceleration({x = 0, y = 0, z = 0}) self.object:set_acceleration({x = 0, y = 0, z = 0})
self.object:set_velocity({x = 0, y = 0, z = 0}) self.object:set_velocity({x = 0, y = 0, z = 0})
minetest.sound_play("default_place_node", {pos = pos}, true) core.sound_play("default_place_node", {pos = pos}, true)
self._stickpos = spearhead_pos self._stickpos = spearhead_pos
self._wear = wear self._wear = wear
end end
else -- Get drag else -- Get drag
local viscosity = minetest.registered_nodes[node.name].liquid_viscosity local viscosity = core.registered_nodes[node.name].liquid_viscosity
local drag_coeff = tonumber(minetest.settings:get("spears_drag_coeff") or 0.1) local drag_coeff = tonumber(core.settings:get("spears_drag_coeff"))
local drag = math.max(viscosity, drag_coeff) local drag = math.max(viscosity, drag_coeff)
local acceleration = vector.multiply(velocity, -drag) local acceleration = vector.multiply(velocity, -drag)
acceleration.y = acceleration.y - 10 * ((7 - drag) / 7) acceleration.y = acceleration.y - 10 * ((7 - drag) / 7)
@ -144,8 +141,8 @@ function spears_set_entity(spear_type, base_damage, toughness)
end end
function spears_check_node(node_name) function spears_check_node(node_name)
local node = minetest.registered_nodes[node_name] local node = core.registered_nodes[node_name]
local cracky_limit = tonumber(minetest.settings:get("spears_node_cracky_limit") or 3) local cracky_limit = tonumber(core.settings:get("spears_node_cracky_limit"))
if node == nil then if node == nil then
return nil return nil
elseif node.groups.cracky ~= nil and node.groups.cracky < cracky_limit then elseif node.groups.cracky ~= nil and node.groups.cracky < cracky_limit then
@ -158,7 +155,7 @@ function spears_check_node(node_name)
end end
function spears_wear(initial_wear, toughness) function spears_wear(initial_wear, toughness)
if not minetest.settings:get_bool("creative_mode") then if not core.settings:get_bool("creative_mode") then
local wear = initial_wear + 65535/toughness local wear = initial_wear + 65535/toughness
return wear return wear
else else

View File

@ -1,14 +1,7 @@
-- dofile(minetest.get_modpath("spears").."/defaults.lua") -- Welcome to spears mod
-- local input = io.open(minetest.get_modpath("spears").."/spears.conf", "r") dofile(core.get_modpath("spears").."/defaults.lua")
-- if input then dofile(core.get_modpath("spears").."/functions.lua")
-- dofile(minetest.get_modpath("spears").."/spears.conf") dofile(core.get_modpath("spears").."/tools.lua")
-- input:close()
-- input = nil
-- end
dofile(minetest.get_modpath("spears").."/functions.lua") core.log("action", "[MOD] Spears loaded with throwing speed " .. (core.settings:get("spears_throw_speed")) .. " and drag coeff. " .. (core.settings:get("spears_drag_coeff")))
dofile(minetest.get_modpath("spears").."/tools.lua")
minetest.log("action", "[MOD] Spears loaded with throwing speed " .. (minetest.settings:get("spears_throw_speed") or 13) .. " and drag coeff. " .. (minetest.settings:get("spears_drag_coeff") or 0.1))

View File

@ -1,8 +1,7 @@
name = spears name = spears
depends = default depends = default
optional_depends = pigiron optional_depends = pigiron
description = Add spears to Minetest, versatile weapons that can be thrown description = Add spears to Luanti, versatile weapons that can be thrown
author = Echoes91 author = Echoes91
title = Spears title = Spears
min_minetest_version = 5.4 min_minetest_version = 5.4

View File

@ -7,6 +7,9 @@ spears_drag_coeff (Drag coefficient for spears in air) float 0.1
# Crackyness limit to stick a spear into a node instead of bouncing # Crackyness limit to stick a spear into a node instead of bouncing
spears_node_cracky_limit (Cracky node level limit to stick a spear) int 3 spears_node_cracky_limit (Cracky node level limit to stick a spear) int 3
# When used as melee weapon, the spear will do full damage if this time is spent between punches.
spears_full_punch_interval (When used as melee weapon, the spear will do full damage if this time is spent between punches.) float 1.5
spears_enable_stone_spear (Stone spear enabled) bool true spears_enable_stone_spear (Stone spear enabled) bool true
spears_enable_iron_spear (Iron spear enabled, requires pigiron mod) bool false spears_enable_iron_spear (Iron spear enabled, requires pigiron mod) bool false
spears_enable_steel_spear (Steel spear enabled) bool true spears_enable_steel_spear (Steel spear enabled) bool true

View File

@ -1,28 +1,28 @@
local S = minetest.get_translator("spears") local S = core.get_translator("spears")
function spears_register_spear(spear_type, desc, base_damage, toughness, material) function spears_register_spear(spear_type, desc, base_damage, toughness, material)
minetest.register_tool("spears:spear_" .. spear_type, { core.register_tool("spears:spear_" .. spear_type, {
description = desc, description = desc,
wield_image = "spears_spear_" .. spear_type .. ".png^[transform4", wield_image = "spears_spear_" .. spear_type .. ".png^[transform4",
inventory_image = "spears_spear_" .. spear_type .. ".png", inventory_image = "spears_spear_" .. spear_type .. ".png",
wield_scale= {x = 1.5, y = 1.5, z = 1.5}, wield_scale= {x = 1.5, y = 1.5, z = 1.5},
on_secondary_use = function(itemstack, user, pointed_thing) on_secondary_use = function(itemstack, user, pointed_thing)
spears_throw(itemstack, user, pointed_thing) spears_throw(itemstack, user, pointed_thing)
if not minetest.settings:get_bool("creative_mode") then if not core.settings:get_bool("creative_mode") then
itemstack:take_item() itemstack:take_item()
end end
return itemstack return itemstack
end, end,
on_place = function(itemstack, user, pointed_thing) on_place = function(itemstack, user, pointed_thing)
spears_throw(itemstack, user, pointed_thing) spears_throw(itemstack, user, pointed_thing)
if not minetest.settings:get_bool("creative_mode") then if not core.settings:get_bool("creative_mode") then
itemstack:take_item() itemstack:take_item()
end end
return itemstack return itemstack
end, end,
tool_capabilities = { tool_capabilities = {
full_punch_interval = 1.5, full_punch_interval = core.settings:get("spears_full_punch_interval"),
max_drop_level=1, max_drop_level=1,
groupcaps={ groupcaps={
cracky = {times={[3]=2}, uses=toughness, maxlevel=1}, cracky = {times={[3]=2}, uses=toughness, maxlevel=1},
@ -35,9 +35,9 @@ function spears_register_spear(spear_type, desc, base_damage, toughness, materia
local SPEAR_ENTITY = spears_set_entity(spear_type, base_damage, toughness) local SPEAR_ENTITY = spears_set_entity(spear_type, base_damage, toughness)
minetest.register_entity("spears:spear_" .. spear_type .. "_entity", SPEAR_ENTITY) core.register_entity("spears:spear_" .. spear_type .. "_entity", SPEAR_ENTITY)
minetest.register_craft({ core.register_craft({
output = 'spears:spear_' .. spear_type, output = 'spears:spear_' .. spear_type,
recipe = { recipe = {
{"", "", material}, {"", "", material},
@ -46,7 +46,7 @@ function spears_register_spear(spear_type, desc, base_damage, toughness, materia
} }
}) })
minetest.register_craft({ core.register_craft({
output = 'spears:spear_' .. spear_type, output = 'spears:spear_' .. spear_type,
recipe = { recipe = {
{material, "", ""}, {material, "", ""},
@ -56,43 +56,43 @@ function spears_register_spear(spear_type, desc, base_damage, toughness, materia
}) })
end end
if minetest.settings:get_bool('spears_enable_stone_spear') then if core.settings:get_bool('spears_enable_stone_spear') then
spears_register_spear('stone', S('Stone Spear'), 4, 20, 'group:stone') spears_register_spear('stone', S('Stone Spear'), 4, 20, 'group:stone')
end end
if minetest.get_modpath("pigiron") then if core.get_modpath("pigiron") then
if minetest.settings:get_bool('spears_enable_iron_spear') then if core.settings:get_bool('spears_enable_iron_spear') then
spears_register_spear('iron', S('Iron Spear'), 5.5, 30, 'pigiron:iron_ingot') spears_register_spear('iron', S('Iron Spear'), 5.5, 30, 'pigiron:iron_ingot')
end end
if minetest.settings:get_bool('spears_enable_steel_spear') then if core.settings:get_bool('spears_enable_steel_spear') then
spears_register_spear('steel', S('Steel Spear'), 6, 35, 'default:steel_ingot') spears_register_spear('steel', S('Steel Spear'), 6, 35, 'default:steel_ingot')
end end
if minetest.settings:get_bool('spears_enable_copper_spear') then if core.settings:get_bool('spears_enable_copper_spear') then
spears_register_spear('copper', S('Copper Spear'), 4.8, 30, 'default:copper_ingot') spears_register_spear('copper', S('Copper Spear'), 4.8, 30, 'default:copper_ingot')
end end
if minetest.settings:get_bool('spears_enable_bronze_spear') then if core.settings:get_bool('spears_enable_bronze_spear') then
spears_register_spear('bronze', S('Bronze Spear'), 5.5, 35, 'default:bronze_ingot') spears_register_spear('bronze', S('Bronze Spear'), 5.5, 35, 'default:bronze_ingot')
end end
else else
if minetest.settings:get_bool('spears_enable_steel_spear') then if core.settings:get_bool('spears_enable_steel_spear') then
spears_register_spear('steel', S('Steel Spear'), 6, 30, 'default:steel_ingot') spears_register_spear('steel', S('Steel Spear'), 6, 30, 'default:steel_ingot')
end end
if minetest.settings:get_bool('spears_enable_copper_spear') then if core.settings:get_bool('spears_enable_copper_spear') then
spears_register_spear('copper', S('Copper Spear'), 5, 30, 'default:copper_ingot') spears_register_spear('copper', S('Copper Spear'), 5, 30, 'default:copper_ingot')
end end
if minetest.settings:get_bool('spears_enable_bronze_spear') then if core.settings:get_bool('spears_enable_bronze_spear') then
spears_register_spear('bronze', S('Bronze Spear'), 6, 35, 'default:bronze_ingot') spears_register_spear('bronze', S('Bronze Spear'), 6, 35, 'default:bronze_ingot')
end end
end end
if minetest.settings:get_bool('spears_enable_obsidian_spear') then if core.settings:get_bool('spears_enable_obsidian_spear') then
spears_register_spear('obsidian', S('Obsidian Spear'), 8, 30, 'default:obsidian') spears_register_spear('obsidian', S('Obsidian Spear'), 8, 30, 'default:obsidian')
end end
if minetest.settings:get_bool('spears_enable_diamond_spear') then if core.settings:get_bool('spears_enable_diamond_spear') then
spears_register_spear('diamond', S('Diamond Spear'), 8, 40, 'default:diamond') spears_register_spear('diamond', S('Diamond Spear'), 8, 40, 'default:diamond')
end end
if minetest.settings:get_bool('spears_enable_gold_spear') then if core.settings:get_bool('spears_enable_gold_spear') then
spears_register_spear('gold', S('Golden Spear'), 5, 40, 'default:gold_ingot') spears_register_spear('gold', S('Golden Spear'), 5, 40, 'default:gold_ingot')
end end