148 lines
4.7 KiB
Lua
148 lines
4.7 KiB
Lua
-- Bows Mod by UjEdwin
|
|
|
|
bows = {
|
|
pvp = minetest.settings:get_bool('enable_pvp'),
|
|
registered_arrows = {},
|
|
registered_bows = {},
|
|
}
|
|
|
|
local creative_mode_cache = minetest.settings:get_bool('creative_mode')
|
|
|
|
function bows.is_creative(name)
|
|
return creative_mode_cache or minetest.check_player_privs(name, {creative = true})
|
|
end
|
|
|
|
bows.register_arrow = function(name, def)
|
|
if name == nil
|
|
or name == '' then
|
|
return false
|
|
end
|
|
def.damage = def.damage or 0
|
|
def.name = 'bows:' .. name
|
|
def.level = def.level or 1
|
|
def.disp_entity = def.displayed_entity or def.name
|
|
def.on_hit_object = def.on_hit_object
|
|
def.on_hit_node = def.on_hit_node
|
|
def.speed = def.speed or 0
|
|
def.on_hit_sound = def.on_hit_sound or 'default_dig_dig_immediate'
|
|
bows.registered_arrows[def.name] = def
|
|
if def.type == 'bolt' then
|
|
minetest.register_craftitem(':bows:' .. name, {
|
|
description = def.description or name,
|
|
inventory_image = def.texture or 'bows_arrow_wooden.png',
|
|
groups = {bolt = 1},
|
|
drop_chance = def.drop_chance
|
|
})
|
|
else
|
|
minetest.register_craftitem(':bows:' .. name, {
|
|
description = def.description or name,
|
|
inventory_image = def.texture or 'bows_arrow_wooden.png',
|
|
groups = {arrow = 1},
|
|
drop_chance = def.drop_chance
|
|
})
|
|
end
|
|
if def.craft then
|
|
minetest.register_craft({
|
|
output = def.name ..' ' .. (def.craft_count or 1),
|
|
recipe = def.craft
|
|
})
|
|
end
|
|
end
|
|
|
|
bows.register_bow = function(name, def)
|
|
if name == nil
|
|
or name == '' then
|
|
return false
|
|
end
|
|
def.replace = 'bows:' .. name .. '_loaded'
|
|
def.name = 'bows:' .. name
|
|
def.uses = def.uses - 1 or 49
|
|
def.ammo = def.ammo or 'arrow'
|
|
bows.registered_bows[def.replace] = def
|
|
bows.registered_bows[def.name] = def
|
|
minetest.register_tool(':' .. def.name, {
|
|
description = def.description or name,
|
|
inventory_image = def.texture or 'bows_bow.png',
|
|
on_use = bows.load,
|
|
groups = {bow = 1},
|
|
})
|
|
minetest.register_tool(':' .. def.replace, {
|
|
description = def.description or name,
|
|
inventory_image = def.texture_loaded or 'bows_bow_loaded.png',
|
|
on_use = bows.shoot,
|
|
groups = {bow = 1, not_in_creative_inventory = 1},
|
|
})
|
|
if def.craft then
|
|
minetest.register_craft({output = def.name,recipe = def.craft})
|
|
end
|
|
end
|
|
|
|
bows.load = function(itemstack, user, pointed_thing)
|
|
local name = itemstack:get_name()
|
|
local ammo = bows.registered_bows[name].ammo
|
|
local inv = user:get_inventory()
|
|
local index = user:get_wield_index() - 1
|
|
local arrow = inv:get_stack('main', index)
|
|
if minetest.get_item_group(arrow:get_name(), ammo) == 0 then
|
|
return itemstack
|
|
end
|
|
local item = itemstack:to_table()
|
|
local meta = minetest.deserialize(item.metadata)
|
|
meta = {arrow = arrow:get_name()}
|
|
item.metadata = minetest.serialize(meta)
|
|
item.name = item.name .. '_loaded'
|
|
itemstack:replace(item)
|
|
if not bows.is_creative(user:get_player_name()) then
|
|
inv:set_stack('main', index,
|
|
ItemStack(arrow:get_name() .. ' ' .. (arrow:get_count() - 1)))
|
|
end
|
|
return itemstack
|
|
end
|
|
|
|
bows.shoot = function(itemstack, user, pointed_thing)
|
|
local item = itemstack:to_table()
|
|
local meta = minetest.deserialize(item.metadata)
|
|
if (not (meta and meta.arrow))
|
|
or (not bows.registered_arrows[meta.arrow]) then
|
|
return itemstack
|
|
end
|
|
local name = itemstack:get_name()
|
|
local replace = bows.registered_bows[name].name
|
|
local ar = bows.registered_bows[name].uses
|
|
local wear = bows.registered_bows[name].uses
|
|
local arrow_speed = bows.registered_arrows[meta.arrow].speed
|
|
local level = bows.registered_bows[name].level + arrow_speed
|
|
bows.tmp = {}
|
|
bows.tmp.arrow = meta.arrow
|
|
bows.tmp.user = user
|
|
bows.tmp.name = meta.arrow
|
|
item.arrow = ''
|
|
item.metadata = minetest.serialize(meta)
|
|
item.name = replace
|
|
itemstack:replace(item)
|
|
local pos = user:get_pos()
|
|
local dir = user:get_look_dir()
|
|
local e = minetest.add_entity({
|
|
x = pos.x,
|
|
y = pos.y + 1.5,
|
|
z = pos.z
|
|
}, 'bows:arrow')
|
|
e:set_velocity({x = dir.x * level, y = dir.y * level, z = dir.z * level})
|
|
e:set_acceleration({x = dir.x * -3, y = -4, z = dir.z * -3})
|
|
e:set_yaw(user:get_look_horizontal() - math.pi/2)
|
|
if not bows.is_creative(user:get_player_name()) then
|
|
itemstack:add_wear(65535 / wear)
|
|
end
|
|
minetest.sound_play('bows_shoot', {pos = pos})
|
|
return itemstack
|
|
end
|
|
|
|
local path = minetest.get_modpath('bows')
|
|
|
|
dofile(path .. '/arrow.lua')
|
|
dofile(path .. '/bows.lua')
|
|
dofile(path .. '/crossbows.lua')
|
|
|
|
minetest.register_alias('castle_weapons:crossbow', 'bows:crossbow')
|
|
minetest.register_alias('castle_weapons:crossbow_bolt', 'bows:bolt_3')
|