-- 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")