mirror of
https://git.minetest.land/MineClone2/MineClone2.git
synced 2024-12-13 13:13:15 +01:00
101 lines
3.6 KiB
Lua
101 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
|