VoxeLibre/mods/ITEMS/mcl_potions/tipped_arrow.lua
2024-11-16 19:46:39 -06:00

100 lines
3.6 KiB
Lua

local S = minetest.get_translator(minetest.get_current_modname())
local math = math
local YAW_OFFSET = -math.pi/2
local function arrow_image(colorstring, opacity)
if not opacity then
opacity = 127
end
return {"mcl_bows_arrow.png^(mcl_bows_arrow_overlay.png^[colorize:"..colorstring..":"..tostring(opacity)..")"}
end
local how_to_shoot = minetest.registered_items["mcl_bows:arrow"]._doc_items_usagehelp
local arrow_longdesc = minetest.registered_items["mcl_bows:arrow"]._doc_items_longdesc or ""
local arrow_tt = minetest.registered_items["mcl_bows:arrow"]._tt_help or ""
function mcl_potions.register_arrow(name, desc, color, def)
local longdesc = def._longdesc or ""
local tt = def._tt or ""
local groups = {ammo=1, ammo_bow=1, brewitem=1, _mcl_potion=1}
if def.nocreative then groups.not_in_creative_inventory = 1 end
local arrow_item = "mcl_potions:"..name.."_arrow"
minetest.register_craftitem(arrow_item, {
description = desc,
_tt_help = arrow_tt .. "\n" .. tt,
_dynamic_tt = def._dynamic_tt,
_doc_items_longdesc = arrow_longdesc .. "\n" ..
S("This particular arrow is tipped and will give an effect when it hits a player or mob.") .. "\n" ..
longdesc,
_doc_items_usagehelp = how_to_shoot,
_effect_list = def._effect_list,
uses_level = def.uses_level,
has_potent = def.has_potent,
has_plus = def.has_plus,
_default_potent_level = def._default_potent_level,
_default_extend_level = def._default_extend_level,
inventory_image = "mcl_bows_arrow_inv.png^(mcl_potions_arrow_inv.png^[colorize:"..color..":100)",
groups = groups,
_on_dispense = function(itemstack, dispenserpos, droppos, dropnode, dropdir)
-- Shoot arrow
local shootpos = vector.add(dispenserpos, vector.multiply(dropdir, 0.51))
local yaw = math.atan2(dropdir.z, dropdir.x) + YAW_OFFSET
mcl_bows.shoot_arrow(itemstack:get_name(), shootpos, dropdir, yaw, nil, 19, 3)
end,
_arrow_image = arrow_image(color, 100),
_on_collide_with_entity = function(self, pos, obj)
local potency = self._potency or 0
local plus = self._plus or 0
if def._effect_list then
for name, details in pairs(def._effect_list) do
local ef_level = details.level
if details.uses_level then
ef_level = details.level + details.level_scaling * potency
end
local dur = details.dur
if details.dur_variable then
dur = details.dur * math.pow(mcl_potions.PLUS_FACTOR, plus)
if potency>0 and details.uses_level then
dur = dur / math.pow(mcl_potions.POTENT_FACTOR, potency)
end
end
dur = dur * mcl_potions.SPLASH_FACTOR
if details.effect_stacks then
ef_level = ef_level + mcl_potions.get_effect_level(obj, name)
end
mcl_potions.give_effect_by_level(name, obj, ef_level, dur)
end
end
if def.custom_effect then def.custom_effect(obj, potency+1, plus) end
end,
})
-- Entity for older-style arrows
local arrow_entity = table.copy(mcl_bows.arrow_entity)
arrow_entity.on_activate = function(self, staticdata, dtime_s)
mcl_bows.arrow_entity.on_activate(self, staticdata, dtime_s)
self._arrow_item = arrow_item
end
vl_projectile.register("mcl_potions:"..name.."_arrow_entity", arrow_entity)
if minetest.get_modpath("mcl_bows") then
minetest.register_craft({
output = "mcl_potions:"..name.."_arrow 8",
recipe = {
{"mcl_bows:arrow","mcl_bows:arrow","mcl_bows:arrow"},
{"mcl_bows:arrow","mcl_potions:"..name.."_lingering","mcl_bows:arrow"},
{"mcl_bows:arrow","mcl_bows:arrow","mcl_bows:arrow"}
}
})
end
if minetest.get_modpath("doc_identifier") then
doc.sub.identifier.register_object("mcl_bows:arrow_entity", "craftitems", "mcl_bows:arrow")
end
end