bows/init.lua

130 lines
3.7 KiB
Lua

-- Mode by UjEdwin
bows={
pvp=minetest.setting_getbool("enable_pvp"),
creative=minetest.setting_getbool("creative_mode"),
mesecons=minetest.get_modpath("mesecons"),
registed_arrows={},
registed_bows={},
}
minetest.register_craft({
type = "fuel",
recipe = "group:bow",
burntime = 3,
})
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.on_hit_object = def.on_hit_object or bows.nothing
def.on_hit_node = def.on_hit_node or bows.on_hit_node
def.on_hit_sound= def.on_hit_sound or "default_dig_dig_immediate"
def.on_step = def.on_step or bows.nothing
bows.registed_arrows[def.name]=def
minetest.register_craftitem("bows:".. name, {
description = def.description or name,
inventory_image = def.texture or "bows_arrow_wooden.png",
groups = {arrow=1}
})
if def.craft then
def.craft_count= def.craft_count or 4
minetest.register_craft({
output = def.name .." " .. def.craft_count,
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
bows.registed_bows[def.replace]=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,stick=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,stick=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 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(), "arrow")==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 bows.creative==false 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.registed_arrows[meta.arrow]) then
return itemstack
end
local name=itemstack:get_name()
local replace=bows.registed_bows[name].name
local ar=bows.registed_bows[name].uses
local wear=bows.registed_bows[name].uses
local level=19 + bows.registed_bows[name].level
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:getpos()
local dir = user:get_look_dir()
local e = minetest.env:add_entity({x=pos.x,y=pos.y+1.5,z=pos.z}, "bows:arrow")
e:setvelocity({x=dir.x*level, y=dir.y*level, z=dir.z*level})
e:setacceleration({x=dir.x*-3, y=-10, z=dir.z*-3})
e:setyaw(user:get_look_yaw()+math.pi)
if bows.creative==false then
itemstack:add_wear(65535/wear)
end
minetest.sound_play("bows_shoot", {pos=pos})
return itemstack
end
dofile(minetest.get_modpath("bows") .. "/arrow.lua")
dofile(minetest.get_modpath("bows") .. "/items_functions.lua")
dofile(minetest.get_modpath("bows") .. "/items.lua")