minetest-mod-nssm/nssm_spears.lua
2023-04-26 07:16:33 +01:00

364 lines
8.1 KiB
Lua

-- functions
local function spears_shot(itemstack, player)
local spear = itemstack:get_name() .. '_entity'
local playerpos = player:get_pos()
local obj = minetest.add_entity({
x = playerpos.x,
y = playerpos.y + 1.5,
z = playerpos.z
}, spear)
local dir = player:get_look_dir()
if spear == "nssm:spear_of_peace_entity" then
sp = 32
gravity = 9.8
else
sp = 16
gravity = 9.8
end
local dr = .3
obj:set_velocity({x = dir.x * sp, y = dir.y * sp, z = dir.z * sp})
obj:set_acceleration({x = -dir.x * dr, y = -gravity, z = -dir.z * dr})
obj:set_yaw(player:get_look_yaw() + math.pi)
obj:get_luaentity().wear = itemstack:get_wear()
minetest.sound_play("spears_sound", {pos = playerpos}, true)
return true
end
local function spears_set_entity(kind, eq, toughness)
local SPEAR_ENTITY = {
physical = false,
timer = 0,
visual = "wielditem",
visual_size = {x = 0.15, y = 0.1},
textures = {"nssm:spear_" .. kind},
lastpos={},
collisionbox = {0,0,0,0,0,0},
on_punch = function(self, puncher)
if puncher then
if puncher:is_player() then
local stack = {
name = "nssm:spear_" .. kind,
wear = self.wear + 65535 / toughness
}
local inv = puncher:get_inventory()
if inv:room_for_item("main", stack) then
inv:add_item("main", stack)
self.object:remove()
end
end
end
end
}
SPEAR_ENTITY.on_step = function(self, dtime)
self.timer=self.timer + dtime
local pos = self.object:get_pos()
local node = minetest.get_node(pos)
if not self.wear then
self.object:remove()
return
end
if self.lastpos.x~=nil then
if node.name ~= "air"
and not (string.find(node.name, "grass")
and not string.find(node.name, "dirt"))
and not string.find(node.name, "flowers:")
and not string.find(node.name, "farming:") then
self.object:remove()
if self.wear + 65535 / toughness < 65535 then
minetest.add_item(self.lastpos, {
name = "nssm:spear_" .. kind,
wear = self.wear + 65535 / toughness
})
end
elseif self.timer > 0.2 then
local objs = minetest.get_objects_inside_radius({
x = pos.x, y = pos.y, z = pos.z}, 1)
for k, obj in pairs(objs) do
if obj:get_luaentity() ~= nil then
if obj:get_luaentity().name ~= "nssm:spear_" .. kind .. "_entity"
and obj:get_luaentity().name ~= "__builtin:item" then
local speed = vector.length(self.object:get_velocity())
local damage = (speed + eq) ^ 1.12 - 20
obj:punch(self.object, 1.0, {
full_punch_interval = 1.0,
damage_groups={fleshy = damage}
}, nil)
self.object:remove()
if self.wear + 65535 / toughness < 65535 then
minetest.add_item(self.lastpos, {
name = "nssm:spear_" .. kind,
wear = self.wear + 65535 / toughness
})
end
end
break -- only harm first entity hit
end
end
end
end
self.lastpos={x = pos.x, y = pos.y, z = pos.z}
end
return SPEAR_ENTITY
end
-- Tools
local function spears_register_spear(kind, desc, eq, toughness, material)
minetest.register_tool("nssm:spear_" .. kind, {
description = desc .. " Spear",
wield_image = "spear_" .. kind .. ".png",
inventory_image = "spear_" .. kind .. ".png^[transform4",
wield_scale= {x = 2, y = 1, z = 1},
on_drop = function(itemstack, user, pointed_thing)
spears_shot(itemstack, user)
if not minetest.setting_getbool("creative_mode") then
itemstack:take_item()
end
return itemstack
end,
on_place = function(itemstack, user, pointed_thing)
minetest.add_item(pointed_thing.above, itemstack)
if not minetest.setting_getbool("creative_mode") then
itemstack:take_item()
end
return itemstack
end,
tool_capabilities = {
full_punch_interval = 1.3,
max_drop_level = 1,
groupcaps = {
snappy = {times = {[3]=0.2, [2]=0.2, [1]=0.2},
uses = toughness, maxlevel = 1},
},
damage_groups = {fleshy = eq}
}
})
local SPEAR_ENTITY = spears_set_entity(kind, eq, toughness)
minetest.register_entity("nssm:spear_" .. kind .. "_entity", SPEAR_ENTITY)
minetest.register_craft({
output = "nssm:spear_" .. kind,
recipe = {
{"group:wood", "group:wood", material}
}
})
minetest.register_craft({
output = "nssm:spear_" .. kind,
recipe = {
{material, "group:wood", "group:wood"}
}
})
end
spears_register_spear("ant", "Ant", 6, 25, "nssm:ant_mandible")
spears_register_spear("mantis", "Mantis", 6, 10, "nssm:mantis_claw")
spears_register_spear("manticore", "Manticore", 8, 8, "nssm:manticore_spine")
spears_register_spear("ice_tooth", "Ice Tooth", 16, 200, "nssm:ice_tooth")
spears_register_spear("little_ice_tooth", "Little Ice Tooth", 7, 10, "nssm:little_ice_tooth")
spears_register_spear("duck_beak", "Duck Beak", 5, 6, "nssm:duck_beak")
spears_register_spear("felucco_horn", "Felucco Horn", 7, 9, "nssm:felucco_horn")
-- Spear of peace
minetest.register_tool("nssm:spear_of_peace", {
description = "Spear of Peace",
wield_image = "spear_of_peace.png",
inventory_image = "spear_of_peace.png^[transform4",
wield_scale= {x = 4, y = 2, z = 2},
on_drop = function(itemstack, user, pointed_thing)
spears_shot(itemstack, user)
if not minetest.setting_getbool("creative_mode") then
itemstack:take_item()
end
return itemstack
end,
on_place = function(itemstack, user, pointed_thing)
minetest.add_item(pointed_thing.above, itemstack)
if not minetest.setting_getbool("creative_mode") then
itemstack:take_item()
end
return itemstack
end,
tool_capabilities = {
full_punch_interval = 0.7,
max_drop_level = 1,
groupcaps = {
snappy = {times = {[3]=0.2, [2]=0.2, [1]=0.2}, uses = 500, maxlevel = 1}
},
damage_groups = {fleshy = 18}
}
})
local function spears_set_sentity(kind, eq, toughness)
local SUPERSPEAR_ENTITY = {
physical = false,
timer = 0,
visual = "wielditem",
visual_size = {x = 0.15, y = 0.1},
textures = {"nssm:spear_" .. kind},
lastpos={},
collisionbox = {0,0,0,0,0,0},
on_punch = function(self, puncher)
if puncher then
if puncher:is_player() then
local stack = {
name = "nssm:spear_" .. kind,
wear = self.wear + 65535 / toughness
}
local inv = puncher:get_inventory()
if inv:room_for_item("main", stack) then
inv:add_item("main", stack)
self.object:remove()
end
end
end
end
}
SUPERSPEAR_ENTITY.on_step = function(self, dtime)
self.timer=self.timer+dtime
local pos = self.object:get_pos()
local node = minetest.get_node(pos)
if not self.wear then
self.object:remove()
return
end
if self.lastpos.x ~= nil then
if node.name ~= "air"
and not (string.find(node.name, "grass")
and not string.find(node.name, "dirt"))
and not string.find(node.name, "flowers:")
and not string.find(node.name, "farming:") then
self.object:remove()
if self.wear + 65535 / toughness < 65535 then
minetest.add_item(self.lastpos, {
name = "nssm:spear_" .. kind,
wear = self.wear + 65535 / toughness
})
end
elseif self.timer > 0.2 then
local objs = minetest.get_objects_inside_radius({
x = pos.x, y = pos.y, z = pos.z}, 1)
for k, obj in pairs(objs) do
if obj:get_luaentity() ~= nil then
if obj:get_luaentity().name ~= "nssm:spear_" .. kind .. "_entity"
and obj:get_luaentity().name ~= "__builtin:item" then
local speed = vector.length(self.object:get_velocity())
local damage = (speed + eq) ^ 1.12 - 20
obj:punch(self.object, 1.0, {
full_punch_interval = 1.0,
damage_groups={fleshy = damage}
}, nil)
self.object:remove()
if self.wear + 65535 / toughness < 65535 then
minetest.add_item(self.lastpos, {
name = "nssm:spear_" .. kind,
wear = self.wear + 65535 / toughness
})
end
end
end
end
end
end
self.lastpos = {x = pos.x, y = pos.y, z = pos.z}
end
return SUPERSPEAR_ENTITY
end
SUPERSPEAR_ENTITY = spears_set_sentity("of_peace", 30, 300)
minetest.register_entity("nssm:spear_of_peace_entity", SUPERSPEAR_ENTITY)
minetest.register_craft({
output = "nssm:spear_of_peace",
recipe = {
{"nssm:wrathful_moranga", "group:wood", "group:wood"}
}
})